Orderaddons/amazons3addon/src/Models/DigitalOceanStorage.php000064400000003552147600374260017166 0ustar00config['bucket'] . $this->config['storage_folder']; } /** * Get documentation links * * @return array> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Spaces Object Storage', 'duplicator-pro'), 'url' => 'https://docs.digitalocean.com/products/spaces/', ], [ 'label' => __('Spaces API', 'duplicator-pro'), 'url' => 'https://docs.digitalocean.com/reference/api/spaces-api/', ], ]; } } addons/amazons3addon/src/Models/AmazonS3Storage.php000064400000036404147600374260016300 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge( $config, [ 'access_key' => '', 'bucket' => '', 'region' => '', 'endpoint' => '', 'secret_key' => '', 'storage_class' => 'STANDARD', 'ACL_full_control' => true, ] ); return $config; } /** * Return the field label * * @param string $field Field name * * @return string */ public static function getFieldLabel($field) { switch ($field) { case 'accessKey': return __('Access Key', 'duplicator-pro'); case 'secretKey': return __('Secret Key', 'duplicator-pro'); case 'region': return __('Region', 'duplicator-pro'); case 'endpoint': return __('Endpoint', 'duplicator-pro'); case 'bucket': return __('Bucket', 'duplicator-pro'); case 'aclFullControl': return __('Additional Settings', 'duplicator-pro'); default: throw new Exception("Unknown field: $field"); } } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'storage_folder' => $this->s3_storage_folder, 'max_packages' => $this->s3_max_files, 'access_key' => $this->s3_access_key, 'bucket' => $this->s3_bucket, 'region' => $this->s3_region, 'endpoint' => $this->s3_endpoint, 'secret_key' => $this->s3_secret_key, 'storage_class' => $this->s3_storage_class, 'ACL_full_control' => $this->s3_ACL_full_control, ]; // reset old values $this->s3_storage_folder = ''; $this->s3_max_files = 10; $this->s3_access_key = ''; $this->s3_bucket = ''; $this->s3_provider = 'amazon'; $this->s3_region = ''; $this->s3_endpoint = ''; $this->s3_secret_key = ''; $this->s3_storage_class = 'STANDARD'; $this->s3_ACL_full_control = true; } } /** * Return the storage type * * @return int */ public static function getSType() { return 4; } /** * Returns the storage type icon. * * @return string Returns the icon */ public static function getStypeIcon() { return '' . esc_attr(static::getStypeName()) . ''; } /** * Returns the storage type icon url. * * @return string The icon url */ protected static function getIconUrl() { return DUPLICATOR_PRO_IMG_URL . '/aws.svg'; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('Amazon S3', 'duplicator-pro'); } /** * Get priority, used to sort storages. * 100 is neutral value, 0 is the highest priority * * @return int */ public static function getPriority() { return 150; } /** * Get storage location string * * @return string */ public function getLocationString() { $params = [ 'region' => $this->config['region'], 'bucket' => $this->config['bucket'], 'prefix' => $this->getStorageFolder(), ]; return 'https://console.aws.amazon.com/s3/home' . '?' . http_build_query($params); } /** * Returns an html anchor tag of location * * @return string Returns an html anchor tag with the storage location as a hyperlink. * * @example * OneDrive Example return * https://1drv.ms/f/sAFrQtasdrewasyghg */ public function getHtmlLocationLink() { return '' . esc_html($this->getLocationLabel()) . ''; } /** * Returns the storage location label. * * @return string The storage location label */ protected function getLocationLabel() { return 's3://' . $this->config['bucket'] . $this->getStorageFolder(); } /** * Check if storage is supported * * @return bool */ public static function isSupported() { return SnapUtil::isCurlEnabled(true, true); } /** * Get supported notice, displayed if storage isn't supported * * @return string html string or empty if storage is supported */ public static function getNotSupportedNotice() { if (static::isSupported()) { return ''; } if (!SnapUtil::isCurlEnabled()) { $result = sprintf( __( "The Storage %s requires the PHP cURL extension and related functions to be enabled.", 'duplicator-pro' ), static::getStypeName() ); } elseif (!SnapUtil::isCurlEnabled(true, true)) { $result = sprintf( __( "The Storage %s requires 'curl_multi_' type functions to be enabled. One or more are disabled on your server.", 'duplicator-pro' ), static::getStypeName() ); } else { $result = sprintf( __( 'The Storage %s is not supported on this server.', 'duplicator-pro' ), static::getStypeName() ); } return esc_html($result); } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->getAdapter()->isValid(); } /** * Render form config fields * * @param bool $echo Echo or return * * @return string */ public function renderConfigFields($echo = true) { return TplMng::getInstance()->render( 'amazons3addon/configs/amazon_s3', [ 'storage' => $this, 'maxPackages' => $this->config['max_packages'], 'storageFolder' => $this->config['storage_folder'], 'accessKey' => $this->config['access_key'], 'bucket' => $this->config['bucket'], 'region' => $this->config['region'], 'endpoint' => $this->config['endpoint'], 'secretKey' => $this->config['secret_key'], 'storageClass' => $this->config['storage_class'], 'aclFullControl' => $this->config['ACL_full_control'], 'regionOptions' => self::regionOptions(), ], $echo ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 's3_max_files', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('_s3_storage_folder'); $this->config['access_key'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_access_key'); $secretKey = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_secret_key'); if (strlen($secretKey) > 0) { $this->config['secret_key'] = $secretKey; } $this->config['region'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_region'); $this->config['storage_class'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_storage_class'); $this->config['bucket'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_bucket'); $message = sprintf( __('Storage Updated.', 'duplicator-pro'), $this->config['server'], $this->getStorageFolder() ); return true; } /** * Get full s3 client * * @return S3StorageAdapter */ protected function getAdapter() { if ($this->adapter !== null) { return $this->adapter; } $global = DUP_PRO_Global_Entity::getInstance(); $this->adapter = new S3StorageAdapter( $this->config['access_key'], $this->config['secret_key'], $this->config['region'], $this->config['bucket'], $this->config['storage_folder'], $this->config['endpoint'], $this->config['storage_class'], $global->ipv4_only, !$global->ssl_disableverify, ($global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH), $this->config['ACL_full_control'] ); return $this->adapter; } /** * Returns value => label pairs for region drop-down options for S3 Amazon Direct storage type * * @return string[] */ protected static function regionOptions() { return array( "us-east-1" => __("US East (N. Virginia)", 'duplicator-pro'), "us-east-2" => __("US East (Ohio)", 'duplicator-pro'), "us-west-1" => __("US West (N. California)", 'duplicator-pro'), "us-west-2" => __("US West (Oregon)", 'duplicator-pro'), "af-south-1" => __("Africa (Cape Town)", 'duplicator-pro'), "ap-east-1" => __("Asia Pacific (Hong Kong)", 'duplicator-pro'), "ap-south-1" => __("Asia Pacific (Mumbai)", 'duplicator-pro'), "ap-northeast-1" => __("Asia Pacific (Tokyo)", 'duplicator-pro'), "ap-northeast-2" => __("Asia Pacific (Seoul)", 'duplicator-pro'), "ap-northeast-3" => __("Asia Pacific (Osaka)", 'duplicator-pro'), "ap-southeast-1" => __("Asia Pacific (Singapore)", 'duplicator-pro'), "ap-southeast-2" => __("Asia Pacific (Sydney)", 'duplicator-pro'), "ap-southeast-3" => __("Asia Pacific (Jakarta)", 'duplicator-pro'), "ca-central-1" => __("Canada (Central)", 'duplicator-pro'), "cn-north-1" => __("China (Beijing)", 'duplicator-pro'), "cn-northwest-1" => __("China (Ningxia)", 'duplicator-pro'), "eu-central-1" => __("EU (Frankfurt)", 'duplicator-pro'), "eu-west-1" => __("EU (Ireland)", 'duplicator-pro'), "eu-west-2" => __("EU (London)", 'duplicator-pro'), "eu-west-3" => __("EU (Paris)", 'duplicator-pro'), "eu-south-1" => __("Europe (Milan)", 'duplicator-pro'), "eu-north-1" => __("Europe (Stockholm)", 'duplicator-pro'), "me-south-1" => __("Middle East (Bahrain)", 'duplicator-pro'), "sa-east-1" => __("South America (Sao Paulo)", 'duplicator-pro'), ); } /** * Register storage type * * @return void */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } $dGlobal->save(); }); } /** * Get upload chunk size in bytes * * @return int bytes */ public function getUploadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('s3_upload_part_size_in_kb', self::DEFAULT_UPLOAD_CHUNK_SIZE_IN_KB) * 1024; } /** * Get download chunk size in bytes * * @return int bytes */ public function getDownloadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('s3_download_part_size_in_kb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_KB) * 1024; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { $global = DUP_PRO_Global_Entity::getInstance(); return (int) ($global->php_max_worker_time_in_sec <= 0 ? 0 : $global->php_max_worker_time_in_sec * SECONDS_IN_MICROSECONDS); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return [ 's3_upload_part_size_in_kb' => 6000, 's3_download_part_size_in_kb' => 10 * 1024, ]; } /** * @return void */ public static function renderGlobalOptions() { if (static::class !== self::class) { return; } $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'amazons3addon/configs/global_options', [ 'uploadPartSizeInKb' => $dGlobal->getVal('s3_upload_part_size_in_kb', self::DEFAULT_UPLOAD_CHUNK_SIZE_IN_KB), 'downloadPartSizeInKb' => $dGlobal->getVal('s3_download_part_size_in_kb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_KB), ] ); } /** * Purge old multipart uploads * * @return void */ public function purgeMultipartUpload() { $this->getAdapter()->abortMultipartUploads(2); } } addons/amazons3addon/src/Models/AmazonS3CompatibleStorage.php000064400000015043147600374260020274 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge($config, ['ACL_full_control' => false]); return $config; } /** * Return the storage type * * @return int */ public static function getSType() { return 8; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('Amazon S3 Compatible', 'duplicator-pro'); } /** * Returns an html anchor tag of location or a string * * @return string Returns an html anchor tag with the storage location as a hyperlink or just a plain string */ public function getHtmlLocationLink() { if (preg_match('/^http(s)?:\\/\\//i', $this->getLocationString())) { return '' . esc_html($this->getLocationLabel()) . ''; } else { return '' . esc_html($this->getLocationString()) . ''; } } /** * Get storage location string * * @return string */ public function getLocationString() { return '/' . $this->config['bucket'] . $this->getStorageFolder(); } /** * Returns the storage location label. * * @return string The storage location label */ protected function getLocationLabel() { return '/' . $this->config['bucket'] . $this->getStorageFolder(); } /** * Returns a list of S3 compatible providers * * @return string[] */ public static function getCompatibleProviders() { return array( 'Aruba', 'Cloudian', 'Cloudn', 'Connectria', 'Constant', 'Exoscal', 'Eucalyptus', 'Nifty', 'Nimbula', 'Minio', ); } /** * Get priority, used to sort storages. * 100 is neutral value, 0 is the highest priority * * @return int */ public static function getPriority() { return 160; } /** * Render form config fields * * @param bool $echo Echo or return * * @return string */ public function renderConfigFields($echo = true) { return TplMng::getInstance()->render( 'amazons3addon/configs/all_s3_compatible', [ 'storage' => $this, 'maxPackages' => $this->config['max_packages'], 'storageFolder' => $this->config['storage_folder'], 'accessKey' => $this->config['access_key'], 'bucket' => $this->config['bucket'], 'region' => $this->config['region'], 'endpoint' => $this->config['endpoint'], 'secretKey' => $this->config['secret_key'], 'storageClass' => $this->config['storage_class'], 'aclFullControl' => $this->config['ACL_full_control'], 'isAutofillEndpoint' => $this->isAutofillEndpoint(), 'isAutofillRegion' => $this->isAutofillRegion(), 'isAclSupported' => $this->isACLSupported(), 'aclDescription' => $this->getACLDescription(), 'documentationLinks' => $this->getDocumentationLinks(), ], $echo ); } /** * Get documentation links * * @return array> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('S3 Compatibility API', 'duplicator-pro'), 'url' => 'https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html', ], ]; } /** * Return true if the endpoint is generated automatically * * @return bool */ protected function isAutofillEndpoint() { return false; } /** * Return true if the region is generated automatically * * @return bool */ protected function isAutofillRegion() { return false; } /** * Return true if the ACL is supported * * @return bool */ protected function isACLSupported() { return true; } /** * Get ACL description * * @return string */ protected function getACLDescription() { return __( "This option only works if the storage provider supports the 'bucket-owner-full-control' object-level canned ACL.", 'duplicator-pro' ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['endpoint'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 's3_endpoint'); $this->config['ACL_full_control'] = $this->isACLSupported() ? SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, 's3_ACL_full_control') : false; return true; } /** * Register storage type * * @return void */ public static function registerType() { parent::registerType(); if (self::class === static::class) { // only add filter for current storage and not inherited add_filter('duplicator_pro_storage_type_class', function ($class, $type, $data) { if ($type == AmazonS3Storage::getSType()) { $isLegacy = (!isset($data['legacyEntity']) || $data['legacyEntity'] === true); $provider = (isset($data['s3_provider']) ? $data['s3_provider'] : ''); if ($isLegacy && $provider == 'other') { $class = __CLASS__; } } return $class; }, 10, 3); } } } addons/amazons3addon/src/Models/BackblazeStorage.php000064400000007063147600374260016522 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config['ACL_full_control'] = false; return $config; } /** * Return the storage type * * @return int */ public static function getSType() { return 9; } /** * Get storage location string * * @return string */ public function getLocationString() { return 'https://secure.backblaze.com/b2_buckets.htm'; } /** * Returns the storage location label. * * @return string The storage location label */ protected function getLocationLabel() { return __('Bucket List', 'duplicator-pro'); } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('Backblaze B2', 'duplicator-pro'); } /** * Get priority, used to sort storages. * 100 is neutral value, 0 is the highest priority * * @return int */ public static function getPriority() { return 200; } /** * Returns the storage type icon url. * * @return string The icon url */ protected static function getIconUrl() { return DUPLICATOR_PRO_IMG_URL . '/backblaze.svg'; } /** * Get documentation links * * @return array> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Overview', 'duplicator-pro'), 'url' => 'https://www.backblaze.com/b2/docs/', ], [ 'label' => __('S3 Compatible API', 'duplicator-pro'), 'url' => 'https://www.backblze.com/b2/docs/s3_compatible_api.html', ], ]; } /** * Return the field label * * @param string $field Field name * * @return string */ public static function getFieldLabel($field) { switch ($field) { case 'accessKey': return __('Key ID', 'duplicator-pro'); case 'secretKey': return __('Application Key', 'duplicator-pro'); } return parent::getFieldLabel($field); } /** * Return true if ACL is supported * * @return bool */ protected function isACLSupported() { return false; } /** * Return true if the region is generated automatically * * @return bool */ public function isAutofillRegion() { return true; } /** * Register storage type * * @return void */ public static function registerType() { parent::registerType(); add_filter('duplicator_pro_storage_type_class', function ($class, $type, $data) { if ($type == AmazonS3Storage::getSType()) { $isLegacy = (!isset($data['legacyEntity']) || $data['legacyEntity'] === true); $provider = (isset($data['s3_provider']) ? $data['s3_provider'] : ''); if ($isLegacy && $provider == 'backblaze') { $class = __CLASS__; } } return $class; }, 10, 3); } } addons/amazons3addon/src/Models/CloudflareStorage.php000064400000003456147600374260016726 0ustar00> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Overview', 'duplicator-pro'), 'url' => 'https://developers.cloudflare.com/r2/', ], [ 'label' => __('S3 Compatible API', 'duplicator-pro'), 'url' => 'https://developers.cloudflare.com/r2/api/s3/api/', ], ]; } } addons/amazons3addon/src/Models/S3StorageAdapter.php000064400000076101147600374260016431 0ustar00accessKey = $accessKey; $this->secretKey = $secretKey; $this->region = $region; $this->bucket = $bucket; $this->root = SnapIO::trailingslashit($root); $this->endpoint = $endpoint; $this->storageClass = $storageClass; $this->ipv4 = $ipv4; $this->sslVerify = $sslVerify; $this->sslCert = $sslCert; $this->aclFullControl = $aclFullControl; $this->initClient(); } /** * Destructor * * @return void */ public function __destruct() { if (is_resource($this->sourceFileHandle)) { fclose($this->sourceFileHandle); } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } } /** * Initialize the client on creation. * * @param string $errorMsg The error message if client is invalid. * * @return void */ public function initClient(&$errorMsg = '') { if ($this->isConnectionInfoValid($errorMsg) === false) { return; } if ($this->sslVerify === false) { $verify = false; } elseif (strlen($this->sslCert) === 0) { $verify = true; } else { $verify = $this->sslCert; } $args = [ 'use_aws_shared_config_files' => false, 'suppress_php_deprecation_warning' => true, 'version' => '2006-03-01', 'region' => $this->region, 'signature_version' => 'v4', 'credentials' => [ 'key' => $this->accessKey, 'secret' => $this->secretKey, ], 'http' => ['verify' => $verify], ]; if (strlen($this->endpoint) > 0) { if (strpos($this->endpoint, 'http') !== 0) { $this->endpoint = 'https://' . $this->endpoint; } $args['endpoint'] = $this->endpoint; } if ($this->ipv4) { $args['http_handler'] = new GuzzleHandler( new Client([ 'curl' => [CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4], ]) ); } $this->client = new S3Client($args); //This is needed to make sure the isValid tests run correctly $this->createDir('/'); } /** * Initialize the storage on creation. * * @param string $errorMsg The error message if storage is invalid. * * @return bool true on success or false on failure. */ public function initialize(&$errorMsg = '') { if (!$this->isConnectionInfoValid()) { $errorMsg = 'Invalid connection info'; return false; } if (!$this->isDir('/') && !$this->createDir('/')) { $errorMsg = 'Unable to create root directory'; return false; } return true; } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { return $this->delete('/', true); } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { return $this->isConnectionInfoValid($errorMsg) !== false && $this->isDir('/') !== false; } /** * Return true if the connection info is valid. * * @param string $errorMsg The error message if connection info is invalid. * * @return bool */ private function isConnectionInfoValid(&$errorMsg = '') { if (strlen($this->accessKey) === 0) { $errorMsg = __('Access key is empty', 'duplicator-pro'); return false; } if (strlen($this->secretKey) === 0) { $errorMsg = __('Secret key is empty', 'duplicator-pro'); return false; } if (strlen($this->region) === 0) { $errorMsg = __('Region is empty', 'duplicator-pro'); return false; } if (strlen($this->bucket) === 0) { $errorMsg = __('Bucket is empty', 'duplicator-pro'); return false; } if (strlen($this->root) === 0) { $errorMsg = __('Root path is empty', 'duplicator-pro'); return false; } return true; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The directory path. * * @return bool true on success or false on failure. */ protected function realCreateDir($path) { if ($this->isFile($path)) { return false; } return true; } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCreateFile($path, $content) { try { if ($this->isFile($path)) { $this->delete($path); } $args = [ 'Bucket' => $this->bucket, 'Key' => $this->getFullPath($path), 'Body' => $content, 'StorageClass' => $this->storageClass, ]; if ($this->aclFullControl) { $args['ACL'] = 'bucket-owner-full-control'; } $this->getClient()->putObject($args)->toArray(); return strlen($content); } catch (Exception $e) { return false; } } /** * Delete reletative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ protected function realDelete($path, $recursive = false) { if ($this->isFile($path)) { return $this->deleteFile($path); } if ($this->isDirEmpty($path)) { return true; } elseif (!$recursive) { return false; } $children = $this->getAllChildFiles($path); foreach (array_chunk($children, 1000) as $chunk) { try { $this->getClient()->deleteObjects( [ 'Bucket' => $this->bucket, 'Delete' => [ 'Objects' => array_map( function ($item) { return ['Key' => $item]; }, $chunk ), ], ] ); } catch (Exception $e) { return false; } } return true; } /** * Deletes file at path. * * @param string $path The path to the file to delete. * * @return bool true on success or false on failure. */ private function deleteFile($path) { if (($path = $this->getFullPath($path)) === false) { return false; } try { $this->getClient()->deleteObject( [ 'Bucket' => $this->bucket, 'Key' => $path, ] ); return true; } catch (Exception $e) { return false; } } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { try { $result = $this->getClient()->getObject( [ 'Bucket' => $this->bucket, 'Key' => $this->getFullPath($path), ] ); return $result->get('Body'); } catch (Exception $e) { return false; } } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ protected function realMove($oldPath, $newPath) { try { $this->getClient()->copyObject( [ 'Bucket' => $this->bucket, 'Key' => $this->getFullPath($newPath), 'CopySource' => $this->bucket . '/' . $this->getFullPath($oldPath), ] ); return $this->delete($oldPath); } catch (Exception $e) { return false; } } /** * Get path info. * * @param string $path Relative storage path, if empty, return root path info. * * @return StoragePathInfo|false The path info or false if path is invalid. */ protected function getRealPathInfo($path) { $info = new StoragePathInfo(); $info->path = $path; if (($fileInfo = $this->getFileInfo($path)) !== false) { $info->exists = true; $info->isDir = false; $info->size = $fileInfo['ContentLength']; $info->modified = $fileInfo['LastModified']->getTimestamp(); $info->created = $info->modified; } if ($this->remoteDirExists($path)) { $info->exists = true; $info->isDir = true; } return $info; } /** * Get path info. * * @param string $path Relative storage path, if empty, return root path info. * * @return array|false The path info or false if path is invalid. */ private function getFileInfo($path) { try { $result = $this->getClient()->headObject( [ 'Bucket' => $this->bucket, 'Key' => $this->getFullPath($path), ] ); return $result->toArray(); } catch (Exception $e) { return false; } } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { $path = SnapIO::untrailingslashit(ltrim($path, '/\\')); $dirPath = SnapIO::trailingslashit($this->getFullPath($path, true)); $contents = $this->getDirContents($path); //add cached dirs to contents if ($folders) { $contents = array_unique( array_merge( $contents, array_map( function ($item) { return SnapIO::trailingslashit($this->getFullPath($item)); }, $this->getCachedChilds($path, true, false, false) ) ) ); } $result = []; foreach ($contents as $key => $item) { $basename = basename($item); if ($files && substr($item, -1) !== '/') { $result[] = $basename; } if ($folders && substr($item, -1) === '/') { $result[] = $basename; } } return $result; } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { $contents = $this->scanDir($path); $regexFilters = []; $normalFilters = []; foreach ($filters as $filter) { if (preg_match('/^\/.*\/$/', $filter) === 1) { $regexFilters[] = $filter; } else { $normalFilters[] = $filter; } } foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Returns true if the specified path is empty. * * @param string $path The path to check. * * @return bool */ private function remoteDirExists($path) { try { $result = $this->getClient()->listObjects( [ 'Bucket' => $this->bucket, 'Prefix' => SnapIO::trailingslashit($this->getFullPath($path, true)), 'Delimiter' => '/', 'MaxKeys' => 1, ] )->toArray(); } catch (Exception $e) { return false; } return (isset($result['Contents']) && count($result['Contents']) > 0) || (isset($result['CommonPrefixes']) && count($result['CommonPrefixes']) > 0); } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $startTime = microtime(true); if (!is_file($sourceFile)) { return false; } if (($fullPath = $this->getFullPath($storageFile)) == false) { return false; } if ($offset === 0) { if ($this->isFile($storageFile) && $this->delete($storageFile) === false) { return false; } if ($timeout === 0 && $length < 0 || filesize($sourceFile) <= $length) { if (($content = file_get_contents($sourceFile)) === false) { return false; } return $this->createFile($storageFile, $content); } if (($extraData['UploadId'] = $this->getUplaodId($storageFile)) === false) { return false; } } elseif (!isset($extraData['UploadId']) || $extraData['UploadId'] === false) { //the upload ID must exist if it's not the first chunk return false; } $partNumber = isset($extraData['Parts']) ? count($extraData['Parts']) + 1 : 1; if (($sourceFileHandle = $this->getSourceFileHandle($sourceFile)) === false) { return false; } $bytesWritten = 0; $length = $length > 0 ? $length : self::DEFAULT_CHUNK_SIZE; do { if ( @fseek($sourceFileHandle, $offset) === -1 || ($content = @fread($sourceFileHandle, $length)) === false ) { return false; } try { $result = $this->getClient()->uploadPart( [ 'Bucket' => $this->bucket, 'Key' => $fullPath, 'UploadId' => $extraData['UploadId'], 'PartNumber' => $partNumber, 'Body' => $content, ] )->toArray(); } catch (Exception $e) { return false; } if (!isset($result['ETag'])) { return false; } $extraData['Parts'][] = [ 'ETag' => $result['ETag'], 'PartNumber' => $partNumber, ]; if ($timeout === 0) { $bytesWritten = $length; break; } $bytesWritten += strlen($content); $offset += $length; $partNumber++; /** * Force garbage collection to avoid memory leaks. But on S3 SDK version 3.278.3 * * @todo Remove this when the S3 SDK is fixed */ gc_collect_cycles(); } while ($timeout !== 0 && self::getElapsedTime($startTime) < $timeout && !feof($sourceFileHandle)); //finished upload if (feof($sourceFileHandle)) { try { $this->getClient()->completeMultipartUpload( [ 'Bucket' => $this->bucket, 'Key' => $fullPath, 'UploadId' => $extraData['UploadId'], 'MultipartUpload' => [ 'Parts' => $extraData['Parts'], ], ] ); } catch (Exception $e) { return false; } } return $bytesWritten; } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $startTime = microtime(true); if (($fullPath = $this->getFullPath($storageFile)) === false) { return false; } if (wp_mkdir_p(dirname($destFile)) == false) { return false; } if (@is_file($destFile) && $offset === 0 && !@unlink($destFile)) { return false; } if (!$this->isFile($storageFile)) { return false; } if ($timeout === 0 && $offset === 0 && $length < 0) { if (($content = $this->getFileContent($storageFile)) === false) { return false; } return @file_put_contents($destFile, $content); } if (($handle = $this->getDestFileHandle($destFile)) === false) { return false; } $fileInfo = $this->getPathInfo($storageFile); $bytesWritten = 0; $length = $length > 0 ? $length : self::DEFAULT_CHUNK_SIZE; do { try { $result = $this->getClient()->getObject( [ 'Bucket' => $this->bucket, 'Key' => $fullPath, 'Range' => 'bytes=' . $offset . '-' . ($length > 0 ? ($offset + $length - 1) : ''), ] ); } catch (Exception $e) { return false; } if (($content = $result->get('Body')) === false) { return false; } if ( @ftruncate($handle, $offset) === false || @fseek($handle, $offset) === -1 || @fwrite($handle, $content) === false ) { return false; } if ($timeout === 0) { return $length; } $bytesWritten += strlen($content); $offset += $length; } while ($timeout !== 0 && self::getElapsedTime($startTime) < $timeout && $offset < $fileInfo->size); return $bytesWritten; } /** * Get the keys of all files and folders in the specified path. * * @param string $path The path to scan. * * @return string[] The keys of all files and folders in the specified path. */ private function getDirContents($path) { $keys = []; $fullPath = SnapIO::trailingslashit($this->getFullPath($path, true)); do { try { $result = $this->getClient()->listObjects( [ 'Bucket' => $this->bucket, 'Prefix' => $fullPath, 'Delimiter' => '/', ] )->toArray(); } catch (Exception $e) { return []; } if (isset($result['Contents'])) { $keys = array_merge( $keys, array_map( function ($item) { return $item['Key']; }, $result['Contents'] ) ); } if (isset($result['CommonPrefixes'])) { $keys = array_merge( $keys, array_map( function ($item) { return $item['Prefix']; }, $result['CommonPrefixes'] ) ); } } while ($result['IsTruncated']); return $keys; } /** * Returns the keys of child files of all levels of the specified path. * * @param string $path The path to scan. * * @return string[] The keys of child files of all levels of the specified path. */ private function getAllChildFiles($path) { $keys = []; $fullPath = SnapIO::trailingslashit($this->getFullPath($path, true)); do { try { $result = $this->getClient()->listObjects( [ 'Bucket' => $this->bucket, 'Prefix' => $fullPath, ] )->toArray(); } catch (Exception $e) { return []; } if (!isset($result['Contents'])) { break; } $keys = array_merge( $keys, array_map( function ($item) { return $item['Key']; }, $result['Contents'] ) ); } while ($result['IsTruncated']); return $keys; } /** * Get the client. * * @return S3Client */ private function getClient() { return $this->client; } /** * Gets the upload ID for a multipart upload. From cache if exists. * * @param string $storageFile Storage destination path * * @return string|false The upload ID or false on failure. */ private function getUplaodId($storageFile) { try { $result = $this->getClient()->createMultipartUpload( [ 'Bucket' => $this->bucket, 'Key' => $this->getFullPath($storageFile), 'StorageClass' => $this->storageClass, ] )->toArray(); } catch (Exception $e) { return false; } if (!isset($result['UploadId'])) { return false; } return $result['UploadId']; } /** * Abort all multipart uploads older than age. * * @param int $age The age in days. Default to 2. * * @return bool true on success or false on failure. */ public function abortMultipartUploads($age = 2) { try { $result = $this->getClient()->listMultipartUploads( [ 'Bucket' => $this->bucket, 'Prefix' => $this->root, 'Delimiter' => '/', ] )->toArray(); if (!isset($result['Uploads'])) { return true; } foreach ($result['Uploads'] as $upload) { if (($upload['Initiated']->getTimestamp() + $age * 24 * 3600) > time()) { continue; } $this->getClient()->abortMultipartUpload( [ 'Bucket' => $this->bucket, 'Key' => $upload['Key'], 'UploadId' => $upload['UploadId'], ] ); } return true; } catch (Exception $e) { return false; } } /** * Return the full path of storage from relative path. * * @param string $path The relative storage path * @param bool $acceptEmpty If true, return root path if path is empty. Default to false. * * @return string|false The full path or false if path is invalid. */ protected function getFullPath($path, $acceptEmpty = false) { $path = SnapIO::untrailingslashit(ltrim((string) $path, '/\\')); if (strlen($path) === 0) { return $acceptEmpty ? SnapIO::untrailingslashit($this->root) : false; } return $this->root . $path; } /** * Returns the dest file handle * * @param string $destFilePath The source file path * * @return resource|false returns the dest file handle or false on failure. */ private function getDestFileHandle($destFilePath) { if ($this->lastDestFilePath === $destFilePath) { return $this->destFileHandle; } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } if (($this->destFileHandle = @fopen($destFilePath, 'cb')) === false) { return false; } $this->lastDestFilePath = $destFilePath; return $this->destFileHandle; } /** * Returns the source file handle * * @param string $sourceFilePath The source file path * * @return resource */ private function getSourceFileHandle($sourceFilePath) { if ($this->lastSourceFilePath === $sourceFilePath) { return $this->sourceFileHandle; } if (is_resource($this->sourceFileHandle)) { fclose($this->sourceFileHandle); } if (($this->sourceFileHandle = SnapIO::fopen($sourceFilePath, 'r')) === false) { throw new Exception('Can\'t open ' . $sourceFilePath . ' file'); } $this->lastSourceFilePath = $sourceFilePath; return $this->sourceFileHandle; } /** * Get the elapsed time in microseconds * * @param float $startTime The start time * * @return float The elapsed time in microseconds */ private static function getElapsedTime($startTime) { return (microtime(true) - $startTime) * SECONDS_IN_MICROSECONDS; } } addons/amazons3addon/src/Models/DreamStorage.php000064400000004115147600374260015667 0ustar00> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Overview', 'duplicator-pro'), 'url' => 'https://help.dreamhost.com/hc/en-us/articles/214823108-DreamObjects-overview', ], [ 'label' => __('S3 Compatible API', 'duplicator-pro'), 'url' => 'https://help.dreamhost.com/hc/en-us/articles/217590537-How-To-Use-DreamObjects-S3-compatible-API', ], ]; } } addons/amazons3addon/src/Models/VultrStorage.php000064400000003231147600374260015751 0ustar00> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Vultr Object Storage', 'duplicator-pro'), 'url' => 'https://www.vultr.com/docs/vultr-object-storage/', ], ]; } } addons/amazons3addon/src/Models/GoogleCloudStorage.php000064400000003236147600374260017045 0ustar00config['bucket'] . $this->config['storage_folder']; } /** * Returns the storage type icon url. * * @return string The icon url */ protected static function getIconUrl() { return DUPLICATOR_PRO_IMG_URL . '/google-cloud.svg'; } /** * Get ACL description * * @return string */ protected function getACLDescription() { return __( "Make sure to change the 'Access Control' to 'Fine Grained' for this setting to work.", 'duplicator-pro' ); } /** * Get documentation links * * @return array> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Interoperability with S3 API', 'duplicator-pro'), 'url' => 'https://cloud.google.com/storage/docs/interoperability', ], ]; } } addons/amazons3addon/src/Models/WasabiStorage.php000064400000003460147600374260016047 0ustar00> */ protected static function getDocumentationLinks() { return [ [ 'label' => __('Wasabi Academy', 'duplicator-pro'), 'url' => 'https://docs.wasabi.com/', ], [ 'label' => __('S3 Compatible API', 'duplicator-pro'), 'url' => 'https://docs.wasabi.com/docs/wasabi-api', ], ]; } } addons/amazons3addon/src/Utils/Autoloader.php000064400000007576147600374260015304 0ustar00 $mappedPath) { if (strpos($className, $namespace) !== 0) { continue; } $filepath = self::getFilenameFromClass($className, $namespace, $mappedPath); if (file_exists($filepath)) { include $filepath; return; } } } /** * Load necessary files * * @return void */ private static function loadFiles() { $files = [ '/paragonie/random_compat/lib/random.php', '/ralouphie/getallheaders/src/getallheaders.php', '/guzzlehttp/promises/src/functions_include.php', '/guzzlehttp/psr7/src/functions_include.php', '/symfony/polyfill-intl-normalizer/bootstrap.php', '/symfony/polyfill-php70/bootstrap.php', '/symfony/polyfill-php72/bootstrap.php', '/symfony/polyfill-intl-idn/bootstrap.php', '/symfony/polyfill-mbstring/bootstrap.php', '/guzzlehttp/guzzle/src/functions_include.php', '/mtdowling/jmespath.php/src/JmesPath.php', '/aws/aws-sdk-php/src/functions.php', ]; foreach ($files as $file) { require_once self::VENDOR_PATH . $file; } } /** * Return namespace mapping * * @return string[] */ protected static function getNamespacesVendorMapping() { return [ self::ROOT_VENDOR . 'Symfony\\Polyfill\\Intl\\Idn' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/symfony/polyfill-intl-idn', self::ROOT_VENDOR . 'Symfony\\Polyfill\\Intl\\Normalizer' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/symfony/polyfill-intl-normalizer', self::ROOT_VENDOR . 'Symfony\\Polyfill\\Mbstring' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/symfony/polyfill-mbstring', self::ROOT_VENDOR . 'Symfony\\Polyfill\\Php70' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/symfony/polyfill-php70', self::ROOT_VENDOR . 'Symfony\\Polyfill\\Php72' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/symfony/polyfill-php72', self::ROOT_VENDOR . 'JmesPath' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/mtdowling/jmespath.php/src', self::ROOT_VENDOR . 'Psr\\Http\\Message' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/psr/http-message/src', self::ROOT_VENDOR . 'GuzzleHttp\\Promise' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/guzzlehttp/promises/src', self::ROOT_VENDOR . 'GuzzleHttp\\Psr7' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/guzzlehttp/psr7/src', self::ROOT_VENDOR . 'GuzzleHttp' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/guzzlehttp/guzzle/src', self::ROOT_VENDOR . 'Aws' => AmazonS3Addon::getAddonPath() . '/vendor-prefixed/aws/aws-sdk-php/src', ]; } } addons/amazons3addon/template/amazons3addon/configs/all_s3_compatible.php000064400000030276147600374260022667 0ustar00 $tplData * @var AmazonS3CompatibleStorage $storage */ $storage = $tplData["storage"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var string */ $accessKey = $tplData["accessKey"]; /** @var string */ $bucket = $tplData["bucket"]; /** @var string */ $region = $tplData["region"]; /** @var string */ $secretKey = $tplData["secretKey"]; /** @var string */ $storageClass = $tplData["storageClass"]; /** @var string */ $endpoint = $tplData["endpoint"]; /** @var string */ $aclFullControl = $tplData["aclFullControl"]; /** @var bool */ $isAutofillEndpoint = $tplData["isAutofillEndpoint"]; /** @var bool */ $isAutofillRegion = $tplData["isAutofillRegion"]; /** @var bool */ $isAclSupported = $tplData["isAclSupported"]; /** @var string */ $aclDescription = $tplData["aclDescription"]; /** @var array> */ $documentationLinks = $tplData["documentationLinks"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?> tags', 'duplicator-pro' ), '', '', '', '' ); ?> 0) { printf( esc_html_x( 'Documentation for %s: ', '%s is the provider name', 'duplicator-pro' ), esc_html($storage->getStypeName()) ); foreach ($documentationLinks as $link) { ?>  

getId() < 0) { echo wp_kses( $storage->getStypeIcon(), [ 'i' => [ 'class' => [], ], 'img' => [ 'src' => [], 'class' => [], 'alt' => [], ], ] ); } echo esc_html($storage->getStypeName()) . ' ' . esc_html__('Account', 'duplicator-pro'); ?>

getSType() === AmazonS3CompatibleStorage::getSType()) { $tplMng->render('amazons3addon/parts/s3_compatible_msg'); } ?>
" data-parsley-errors-container="#s3_secret_key_getSType(); ?>_error_container" autocomplete="off" value="" >
data-parsley-required="true" >

value="" data-parsley-required="true" data-parsley-pattern="[0-9a-zA-Z-_]+" >

>

render('admin_pages/storages/parts/provider_foot'); addons/amazons3addon/template/amazons3addon/configs/amazon_s3.php000064400000017467147600374260021214 0ustar00 $tplData * @var AmazonS3Storage $storage */ $storage = $tplData["storage"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var string */ $accessKey = $tplData["accessKey"]; /** @var string */ $bucket = $tplData["bucket"]; /** @var string */ $region = $tplData["region"]; /** @var string */ $secretKey = $tplData["secretKey"]; /** @var string */ $storageClass = $tplData["storageClass"]; /** @var string */ $endpoint = $tplData["endpoint"]; /** @var string */ $aclFullControl = $tplData["aclFullControl"]; /** @var array */ $regionOptions = $tplData["regionOptions"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?> tag, 2,4 represents tag', 'duplicator-pro' ), '', '', '', '' ); ?>


" data-parsley-errors-container="#s3_secret_key_amazon_error_container" autocomplete="off" value="" >

render('admin_pages/storages/parts/provider_foot'); ?> addons/amazons3addon/template/amazons3addon/configs/global_options.php000064400000005555147600374260022330 0ustar00 $tplData */ ?>


 KB

 KB

addons/amazons3addon/template/amazons3addon/parts/s3_compatible_msg.php000064400000001764147600374260022406 0ustar00 $tplData * @var AbstractStorageEntity $storage */ $storage = $tplData["storage"]; ?>

' . esc_html(implode(', ', AmazonS3CompatibleStorage::getCompatibleProviders())) . '' ); ?>

addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Account/Exception/AccountException.php000064400000000350147600374260026722 0ustar00getStatusCode(); if ($this->api && !\is_null($this->api->getMetadata('awsQueryCompatible')) && $response->getHeaderLine('x-amzn-query-error')) { $queryError = $response->getHeaderLine('x-amzn-query-error'); $parts = \explode(';', $queryError); if (isset($parts) && \count($parts) == 2 && $parts[0] && $parts[1]) { $error_code = $parts[0]; $error_type = $parts[1]; } } if (!isset($error_type)) { $error_type = $code[0] == '4' ? 'client' : 'server'; } return ['request_id' => (string) $response->getHeaderLine('x-amzn-requestid'), 'code' => isset($error_code) ? $error_code : null, 'message' => null, 'type' => $error_type, 'parsed' => $this->parseJson($response->getBody(), $response)]; } protected function payload(ResponseInterface $response, StructureShape $member) { $jsonBody = $this->parseJson($response->getBody(), $response); if ($jsonBody) { return $this->parser->parse($member, $jsonBody); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ErrorParser/AbstractErrorParser.php000064400000005476147600374260027044 0ustar00api = $api; } protected abstract function payload(ResponseInterface $response, StructureShape $member); protected function extractPayload(StructureShape $member, ResponseInterface $response) { if ($member instanceof StructureShape) { // Structure members parse top-level data into a specific key. return $this->payload($response, $member); } else { // Streaming data is just the stream from the response body. return $response->getBody(); } } protected function populateShape(array &$data, ResponseInterface $response, CommandInterface $command = null) { $data['body'] = []; if (!empty($command) && !empty($this->api)) { // If modeled error code is indicated, check for known error shape if (!empty($data['code'])) { $errors = $this->api->getOperation($command->getName())->getErrors(); foreach ($errors as $key => $error) { // If error code matches a known error shape, populate the body if ($data['code'] == $error['name'] && $error instanceof StructureShape) { $modeledError = $error; $data['body'] = $this->extractPayload($modeledError, $response); $data['error_shape'] = $modeledError; foreach ($error->getMembers() as $name => $member) { switch ($member['location']) { case 'header': $this->extractHeader($name, $member, $response, $data['body']); break; case 'headers': $this->extractHeaders($name, $member, $response, $data['body']); break; case 'statusCode': $this->extractStatus($name, $response, $data['body']); break; } } break; } } } } return $data; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ErrorParser/JsonRpcErrorParser.php000064400000002446147600374260026651 0ustar00parser = $parser ?: new JsonParser(); } public function __invoke(ResponseInterface $response, CommandInterface $command = null) { $data = $this->genericHandler($response); // Make the casing consistent across services. if ($data['parsed']) { $data['parsed'] = \array_change_key_case($data['parsed']); } if (isset($data['parsed']['__type'])) { if (!isset($data['code'])) { $parts = \explode('#', $data['parsed']['__type']); $data['code'] = isset($parts[1]) ? $parts[1] : $parts[0]; } $data['message'] = isset($data['parsed']['message']) ? $data['parsed']['message'] : null; } $this->populateShape($data, $response, $command); return $data; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ErrorParser/XmlErrorParser.php000064400000006103147600374260026025 0ustar00parser = $parser ?: new XmlParser(); } public function __invoke(ResponseInterface $response, CommandInterface $command = null) { $code = (string) $response->getStatusCode(); $data = ['type' => $code[0] == '4' ? 'client' : 'server', 'request_id' => null, 'code' => null, 'message' => null, 'parsed' => null]; $body = $response->getBody(); if ($body->getSize() > 0) { $this->parseBody($this->parseXml($body, $response), $data); } else { $this->parseHeaders($response, $data); } $this->populateShape($data, $response, $command); return $data; } private function parseHeaders(ResponseInterface $response, array &$data) { if ($response->getStatusCode() == '404') { $data['code'] = 'NotFound'; } $data['message'] = $response->getStatusCode() . ' ' . $response->getReasonPhrase(); if ($requestId = $response->getHeaderLine('x-amz-request-id')) { $data['request_id'] = $requestId; $data['message'] .= " (Request-ID: {$requestId})"; } } private function parseBody(\SimpleXMLElement $body, array &$data) { $data['parsed'] = $body; $prefix = $this->registerNamespacePrefix($body); if ($tempXml = $body->xpath("//{$prefix}Code[1]")) { $data['code'] = (string) $tempXml[0]; } if ($tempXml = $body->xpath("//{$prefix}Message[1]")) { $data['message'] = (string) $tempXml[0]; } $tempXml = $body->xpath("//{$prefix}RequestId[1]"); if (isset($tempXml[0])) { $data['request_id'] = (string) $tempXml[0]; } } protected function registerNamespacePrefix(\SimpleXMLElement $element) { $namespaces = $element->getDocNamespaces(); if (!isset($namespaces[''])) { return ''; } // Account for the default namespace being defined and PHP not // being able to handle it :(. $element->registerXPathNamespace('ns', $namespaces['']); return 'ns:'; } protected function payload(ResponseInterface $response, StructureShape $member) { $xmlBody = $this->parseXml($response->getBody(), $response); $prefix = $this->registerNamespacePrefix($xmlBody); $errorBody = $xmlBody->xpath("//{$prefix}Error"); if (\is_array($errorBody) && !empty($errorBody[0])) { return $this->parser->parse($member, $errorBody[0]); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ErrorParser/RestJsonErrorParser.php000064400000003145147600374260027037 0ustar00parser = $parser ?: new JsonParser(); } public function __invoke(ResponseInterface $response, CommandInterface $command = null) { $data = $this->genericHandler($response); // Merge in error data from the JSON body if ($json = $data['parsed']) { $data = \array_replace($data, $json); } // Correct error type from services like Amazon Glacier if (!empty($data['type'])) { $data['type'] = \strtolower($data['type']); } // Retrieve the error code from services like Amazon Elastic Transcoder if ($code = $response->getHeaderLine('x-amzn-errortype')) { $colon = \strpos($code, ':'); $data['code'] = $colon ? \substr($code, 0, $colon) : $code; } // Retrieve error message directly $data['message'] = isset($data['parsed']['message']) ? $data['parsed']['message'] : (isset($data['parsed']['Message']) ? $data['parsed']['Message'] : null); $this->populateShape($data, $response, $command); return $data; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/Exception/ParserException.php000064400000002642147600374260027141 0ustar00errorCode = isset($context['error_code']) ? $context['error_code'] : null; $this->requestId = isset($context['request_id']) ? $context['request_id'] : null; $this->response = isset($context['response']) ? $context['response'] : null; parent::__construct($message, $code, $previous); } /** * Get the error code, if any. * * @return string|null */ public function getErrorCode() { return $this->errorCode; } /** * Get the request ID, if any. * * @return string|null */ public function getRequestId() { return $this->requestId; } /** * Get the received HTTP response if any. * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/DecodingEventStreamIterator.php000064400000020646147600374260027500 0ustar00 'decodeUint32', self::LENGTH_HEADERS => 'decodeUint32', self::CRC_PRELUDE => 'decodeUint32']; private static $lengthFormatMap = [1 => 'decodeUint8', 2 => 'decodeUint16', 4 => 'decodeUint32', 8 => 'decodeUint64']; private static $headerTypeMap = [0 => 'decodeBooleanTrue', 1 => 'decodeBooleanFalse', 2 => 'decodeInt8', 3 => 'decodeInt16', 4 => 'decodeInt32', 5 => 'decodeInt64', 6 => 'decodeBytes', 7 => 'decodeString', 8 => 'decodeTimestamp', 9 => 'decodeUuid']; /** @var StreamInterface Stream of eventstream shape to parse. */ private $stream; /** @var array Currently parsed event. */ private $currentEvent; /** @var int Current in-order event key. */ private $key; /** @var resource|\HashContext CRC32 hash context for event validation */ private $hashContext; /** @var int $currentPosition */ private $currentPosition; /** * DecodingEventStreamIterator constructor. * * @param StreamInterface $stream */ public function __construct(StreamInterface $stream) { $this->stream = $stream; $this->rewind(); } private function parseHeaders($headerBytes) { $headers = []; $bytesRead = 0; while ($bytesRead < $headerBytes) { list($key, $numBytes) = $this->decodeString(1); $bytesRead += $numBytes; list($type, $numBytes) = $this->decodeUint8(); $bytesRead += $numBytes; $f = self::$headerTypeMap[$type]; list($value, $numBytes) = $this->{$f}(); $bytesRead += $numBytes; if (isset($headers[$key])) { throw new ParserException('Duplicate key in event headers.'); } $headers[$key] = $value; } return [$headers, $bytesRead]; } private function parsePrelude() { $prelude = []; $bytesRead = 0; $calculatedCrc = null; foreach (self::$preludeFormat as $key => $decodeFunction) { if ($key === self::CRC_PRELUDE) { $hashCopy = \hash_copy($this->hashContext); $calculatedCrc = \hash_final($this->hashContext, \true); $this->hashContext = $hashCopy; } list($value, $numBytes) = $this->{$decodeFunction}(); $bytesRead += $numBytes; $prelude[$key] = $value; } if (\unpack('N', $calculatedCrc)[1] !== $prelude[self::CRC_PRELUDE]) { throw new ParserException('Prelude checksum mismatch.'); } return [$prelude, $bytesRead]; } private function parseEvent() { $event = []; if ($this->stream->tell() < $this->stream->getSize()) { $this->hashContext = \hash_init('crc32b'); $bytesLeft = $this->stream->getSize() - $this->stream->tell(); list($prelude, $numBytes) = $this->parsePrelude(); if ($prelude[self::LENGTH_TOTAL] > $bytesLeft) { throw new ParserException('Message length too long.'); } $bytesLeft -= $numBytes; if ($prelude[self::LENGTH_HEADERS] > $bytesLeft) { throw new ParserException('Headers length too long.'); } list($event[self::HEADERS], $numBytes) = $this->parseHeaders($prelude[self::LENGTH_HEADERS]); $event[self::PAYLOAD] = Psr7\Utils::streamFor($this->readAndHashBytes($prelude[self::LENGTH_TOTAL] - self::BYTES_PRELUDE - $numBytes - self::BYTES_TRAILING)); $calculatedCrc = \hash_final($this->hashContext, \true); $messageCrc = $this->stream->read(4); if ($calculatedCrc !== $messageCrc) { throw new ParserException('Message checksum mismatch.'); } } return $event; } // Iterator Functionality /** * @return array */ #[\ReturnTypeWillChange] public function current() { return $this->currentEvent; } /** * @return int */ #[\ReturnTypeWillChange] public function key() { return $this->key; } #[\ReturnTypeWillChange] public function next() { $this->currentPosition = $this->stream->tell(); if ($this->valid()) { $this->key++; $this->currentEvent = $this->parseEvent(); } } #[\ReturnTypeWillChange] public function rewind() { $this->stream->rewind(); $this->key = 0; $this->currentPosition = 0; $this->currentEvent = $this->parseEvent(); } /** * @return bool */ #[\ReturnTypeWillChange] public function valid() { return $this->currentPosition < $this->stream->getSize(); } // Decoding Utilities private function readAndHashBytes($num) { $bytes = $this->stream->read($num); \hash_update($this->hashContext, $bytes); return $bytes; } private function decodeBooleanTrue() { return [\true, 0]; } private function decodeBooleanFalse() { return [\false, 0]; } private function uintToInt($val, $size) { $signedCap = \pow(2, $size - 1); if ($val > $signedCap) { $val -= 2 * $signedCap; } return $val; } private function decodeInt8() { $val = (int) \unpack('C', $this->readAndHashBytes(1))[1]; return [$this->uintToInt($val, 8), 1]; } private function decodeUint8() { return [\unpack('C', $this->readAndHashBytes(1))[1], 1]; } private function decodeInt16() { $val = (int) \unpack('n', $this->readAndHashBytes(2))[1]; return [$this->uintToInt($val, 16), 2]; } private function decodeUint16() { return [\unpack('n', $this->readAndHashBytes(2))[1], 2]; } private function decodeInt32() { $val = (int) \unpack('N', $this->readAndHashBytes(4))[1]; return [$this->uintToInt($val, 32), 4]; } private function decodeUint32() { return [\unpack('N', $this->readAndHashBytes(4))[1], 4]; } private function decodeInt64() { $val = $this->unpackInt64($this->readAndHashBytes(8))[1]; return [$this->uintToInt($val, 64), 8]; } private function decodeUint64() { return [$this->unpackInt64($this->readAndHashBytes(8))[1], 8]; } private function unpackInt64($bytes) { if (\version_compare(\PHP_VERSION, '5.6.3', '<')) { $d = \unpack('N2', $bytes); return [1 => $d[1] << 32 | $d[2]]; } return \unpack('J', $bytes); } private function decodeBytes($lengthBytes = 2) { if (!isset(self::$lengthFormatMap[$lengthBytes])) { throw new ParserException('Undefined variable length format.'); } $f = self::$lengthFormatMap[$lengthBytes]; list($len, $bytes) = $this->{$f}(); return [$this->readAndHashBytes($len), $len + $bytes]; } private function decodeString($lengthBytes = 2) { if (!isset(self::$lengthFormatMap[$lengthBytes])) { throw new ParserException('Undefined variable length format.'); } $f = self::$lengthFormatMap[$lengthBytes]; list($len, $bytes) = $this->{$f}(); return [$this->readAndHashBytes($len), $len + $bytes]; } private function decodeTimestamp() { list($val, $bytes) = $this->decodeInt64(); return [DateTimeResult::createFromFormat('U.u', $val / 1000), $bytes]; } private function decodeUuid() { $val = \unpack('H32', $this->readAndHashBytes(16))[1]; return [\substr($val, 0, 8) . '-' . \substr($val, 8, 4) . '-' . \substr($val, 12, 4) . '-' . \substr($val, 16, 4) . '-' . \substr($val, 20, 12), 16]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/XmlParser.php000064400000011304147600374260024000 0ustar00dispatch($shape, $value); } private function dispatch($shape, \SimpleXMLElement $value) { static $methods = ['structure' => 'parse_structure', 'list' => 'parse_list', 'map' => 'parse_map', 'blob' => 'parse_blob', 'boolean' => 'parse_boolean', 'integer' => 'parse_integer', 'float' => 'parse_float', 'double' => 'parse_float', 'timestamp' => 'parse_timestamp']; $type = $shape['type']; if (isset($methods[$type])) { return $this->{$methods[$type]}($shape, $value); } return (string) $value; } private function parse_structure(StructureShape $shape, \SimpleXMLElement $value) { $target = []; foreach ($shape->getMembers() as $name => $member) { // Extract the name of the XML node $node = $this->memberKey($member, $name); if (isset($value->{$node})) { $target[$name] = $this->dispatch($member, $value->{$node}); } else { $memberShape = $shape->getMember($name); if (!empty($memberShape['xmlAttribute'])) { $target[$name] = $this->parse_xml_attribute($shape, $memberShape, $value); } } } if (isset($shape['union']) && $shape['union'] && empty($target)) { foreach ($value as $key => $val) { $name = $val->children()->getName(); $target['Unknown'][$name] = $val->{$name}; } } return $target; } private function memberKey(Shape $shape, $name) { if (null !== $shape['locationName']) { return $shape['locationName']; } if ($shape instanceof ListShape && $shape['flattened']) { return $shape->getMember()['locationName'] ?: $name; } return $name; } private function parse_list(ListShape $shape, \SimpleXMLElement $value) { $target = []; $member = $shape->getMember(); if (!$shape['flattened']) { $value = $value->{$member['locationName'] ?: 'member'}; } foreach ($value as $v) { $target[] = $this->dispatch($member, $v); } return $target; } private function parse_map(MapShape $shape, \SimpleXMLElement $value) { $target = []; if (!$shape['flattened']) { $value = $value->entry; } $mapKey = $shape->getKey(); $mapValue = $shape->getValue(); $keyName = $shape->getKey()['locationName'] ?: 'key'; $valueName = $shape->getValue()['locationName'] ?: 'value'; foreach ($value as $node) { $key = $this->dispatch($mapKey, $node->{$keyName}); $value = $this->dispatch($mapValue, $node->{$valueName}); $target[$key] = $value; } return $target; } private function parse_blob(Shape $shape, $value) { return \base64_decode((string) $value); } private function parse_float(Shape $shape, $value) { return (float) (string) $value; } private function parse_integer(Shape $shape, $value) { return (int) (string) $value; } private function parse_boolean(Shape $shape, $value) { return $value == 'true'; } private function parse_timestamp(Shape $shape, $value) { if (\is_string($value) || \is_int($value) || \is_object($value) && \method_exists($value, '__toString')) { return DateTimeResult::fromTimestamp((string) $value, !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null); } throw new ParserException('Invalid timestamp value passed to XmlParser::parse_timestamp'); } private function parse_xml_attribute(Shape $shape, Shape $memberShape, $value) { $namespace = $shape['xmlNamespace']['uri'] ? $shape['xmlNamespace']['uri'] : ''; $prefix = $shape['xmlNamespace']['prefix'] ? $shape['xmlNamespace']['prefix'] : ''; if (!empty($prefix)) { $prefix .= ':'; } $key = \str_replace($prefix, '', $memberShape['locationName']); $attributes = $value->attributes($namespace); return isset($attributes[$key]) ? (string) $attributes[$key] : null; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/AbstractParser.php000064400000002076147600374260025011 0ustar00api = $api; } /** * @param CommandInterface $command Command that was executed. * @param ResponseInterface $response Response that was received. * * @return ResultInterface */ public abstract function __invoke(CommandInterface $command, ResponseInterface $response); public abstract function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/AbstractRestParser.php000064400000012513147600374260025644 0ustar00api->getOperation($command->getName())->getOutput(); $result = []; if ($payload = $output['payload']) { $this->extractPayload($payload, $output, $response, $result); } foreach ($output->getMembers() as $name => $member) { switch ($member['location']) { case 'header': $this->extractHeader($name, $member, $response, $result); break; case 'headers': $this->extractHeaders($name, $member, $response, $result); break; case 'statusCode': $this->extractStatus($name, $response, $result); break; } } if (!$payload && $response->getBody()->getSize() > 0 && \count($output->getMembers()) > 0) { // if no payload was found, then parse the contents of the body $this->payload($response, $output, $result); } return new Result($result); } private function extractPayload($payload, StructureShape $output, ResponseInterface $response, array &$result) { $member = $output->getMember($payload); if (!empty($member['eventstream'])) { $result[$payload] = new EventParsingIterator($response->getBody(), $member, $this); } else { if ($member instanceof StructureShape) { // Structure members parse top-level data into a specific key. $result[$payload] = []; $this->payload($response, $member, $result[$payload]); } else { // Streaming data is just the stream from the response body. $result[$payload] = $response->getBody(); } } } /** * Extract a single header from the response into the result. */ private function extractHeader($name, Shape $shape, ResponseInterface $response, &$result) { $value = $response->getHeaderLine($shape['locationName'] ?: $name); switch ($shape->getType()) { case 'float': case 'double': $value = (float) $value; break; case 'long': $value = (int) $value; break; case 'boolean': $value = \filter_var($value, \FILTER_VALIDATE_BOOLEAN); break; case 'blob': $value = \base64_decode($value); break; case 'timestamp': try { $value = DateTimeResult::fromTimestamp($value, !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null); break; } catch (\Exception $e) { // If the value cannot be parsed, then do not add it to the // output structure. return; } case 'string': try { if ($shape['jsonvalue']) { $value = $this->parseJson(\base64_decode($value), $response); } // If value is not set, do not add to output structure. if (!isset($value)) { return; } break; } catch (\Exception $e) { //If the value cannot be parsed, then do not add it to the //output structure. return; } } $result[$name] = $value; } /** * Extract a map of headers with an optional prefix from the response. */ private function extractHeaders($name, Shape $shape, ResponseInterface $response, &$result) { // Check if the headers are prefixed by a location name $result[$name] = []; $prefix = $shape['locationName']; $prefixLen = $prefix !== null ? \strlen($prefix) : 0; foreach ($response->getHeaders() as $k => $values) { if (!$prefixLen) { $result[$name][$k] = \implode(', ', $values); } elseif (\stripos($k, $prefix) === 0) { $result[$name][\substr($k, $prefixLen)] = \implode(', ', $values); } } } /** * Places the status code of the response into the result array. */ private function extractStatus($name, ResponseInterface $response, array &$result) { $result[$name] = (int) $response->getStatusCode(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/MetadataParserTrait.php000064400000004757147600374260026002 0ustar00getHeaderLine($shape['locationName'] ?: $name); switch ($shape->getType()) { case 'float': case 'double': $value = (float) $value; break; case 'long': $value = (int) $value; break; case 'boolean': $value = \filter_var($value, \FILTER_VALIDATE_BOOLEAN); break; case 'blob': $value = \base64_decode($value); break; case 'timestamp': try { $value = DateTimeResult::fromTimestamp($value, !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null); break; } catch (\Exception $e) { // If the value cannot be parsed, then do not add it to the // output structure. return; } case 'string': if ($shape['jsonvalue']) { $value = $this->parseJson(\base64_decode($value), $response); } break; } $result[$name] = $value; } /** * Extract a map of headers with an optional prefix from the response. */ protected function extractHeaders($name, Shape $shape, ResponseInterface $response, &$result) { // Check if the headers are prefixed by a location name $result[$name] = []; $prefix = $shape['locationName']; $prefixLen = \strlen($prefix); foreach ($response->getHeaders() as $k => $values) { if (!$prefixLen) { $result[$name][$k] = \implode(', ', $values); } elseif (\stripos($k, $prefix) === 0) { $result[$name][\substr($k, $prefixLen)] = \implode(', ', $values); } } } /** * Places the status code of the response into the result array. */ protected function extractStatus($name, ResponseInterface $response, array &$result) { $result[$name] = (int) $response->getStatusCode(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/RestJsonParser.php000064400000002373147600374260025015 0ustar00parser = $parser ?: new JsonParser(); } protected function payload(ResponseInterface $response, StructureShape $member, array &$result) { $jsonBody = $this->parseJson($response->getBody(), $response); if ($jsonBody) { $result += $this->parser->parse($member, $jsonBody); } } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { $jsonBody = $this->parseJson($stream, $response); if ($jsonBody) { return $this->parser->parse($member, $jsonBody); } return []; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/RestXmlParser.php000064400000002131147600374260024634 0ustar00parser = $parser ?: new XmlParser(); } protected function payload(ResponseInterface $response, StructureShape $member, array &$result) { $result += $this->parseMemberFromStream($response->getBody(), $member, $response); } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { $xml = $this->parseXml($stream, $response); return $this->parser->parse($member, $xml); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/EventParsingIterator.php000064400000005664147600374260026216 0ustar00decodingIterator = new DecodingEventStreamIterator($stream); $this->shape = $shape; $this->parser = $parser; } #[\ReturnTypeWillChange] public function current() { return $this->parseEvent($this->decodingIterator->current()); } #[\ReturnTypeWillChange] public function key() { return $this->decodingIterator->key(); } #[\ReturnTypeWillChange] public function next() { $this->decodingIterator->next(); } #[\ReturnTypeWillChange] public function rewind() { $this->decodingIterator->rewind(); } #[\ReturnTypeWillChange] public function valid() { return $this->decodingIterator->valid(); } private function parseEvent(array $event) { if (!empty($event['headers'][':message-type'])) { if ($event['headers'][':message-type'] === 'error') { return $this->parseError($event); } if ($event['headers'][':message-type'] !== 'event') { throw new ParserException('Failed to parse unknown message type.'); } } if (empty($event['headers'][':event-type'])) { throw new ParserException('Failed to parse without event type.'); } $eventShape = $this->shape->getMember($event['headers'][':event-type']); $parsedEvent = []; foreach ($eventShape['members'] as $shape => $details) { if (!empty($details['eventpayload'])) { $payloadShape = $eventShape->getMember($shape); if ($payloadShape['type'] === 'blob') { $parsedEvent[$shape] = $event['payload']; } else { $parsedEvent[$shape] = $this->parser->parseMemberFromStream($event['payload'], $payloadShape, null); } } else { $parsedEvent[$shape] = $event['headers'][$shape]; } } return [$event['headers'][':event-type'] => $parsedEvent]; } private function parseError(array $event) { throw new EventStreamDataException($event['headers'][':error-code'], $event['headers'][':error-message']); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/Crc32ValidatingParser.php000064400000002566147600374260026131 0ustar00parser = $parser; } public function __invoke(CommandInterface $command, ResponseInterface $response) { if ($expected = $response->getHeaderLine('x-amz-crc32')) { $hash = \hexdec(Psr7\Utils::hash($response->getBody(), 'crc32b')); if ($expected != $hash) { throw new AwsException("crc32 mismatch. Expected {$expected}, found {$hash}.", $command, ['code' => 'ClientChecksumMismatch', 'connection_error' => \true, 'response' => $response]); } } $fn = $this->parser; return $fn($command, $response); } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parseMemberFromStream($stream, $member, $response); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/QueryParser.php000064400000003425147600374260024352 0ustar00parser = $xmlParser ?: new XmlParser(); $this->honorResultWrapper = $honorResultWrapper; } public function __invoke(CommandInterface $command, ResponseInterface $response) { $output = $this->api->getOperation($command->getName())->getOutput(); $xml = $this->parseXml($response->getBody(), $response); if ($this->honorResultWrapper && $output['resultWrapper']) { $xml = $xml->{$output['resultWrapper']}; } return new Result($this->parser->parse($output, $xml)); } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { $xml = $this->parseXml($stream, $response); return $this->parser->parse($member, $xml); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/JsonParser.php000064400000003662147600374260024161 0ustar00getMembers() as $name => $member) { $locationName = $member['locationName'] ?: $name; if (isset($value[$locationName])) { $target[$name] = $this->parse($member, $value[$locationName]); } } if (isset($shape['union']) && $shape['union'] && \is_array($value) && empty($target)) { foreach ($value as $key => $val) { $target['Unknown'][$key] = $val; } } return $target; case 'list': $member = $shape->getMember(); $target = []; foreach ($value as $v) { $target[] = $this->parse($member, $v); } return $target; case 'map': $values = $shape->getValue(); $target = []; foreach ($value as $k => $v) { $target[$k] = $this->parse($values, $v); } return $target; case 'timestamp': return DateTimeResult::fromTimestamp($value, !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : null); case 'blob': return \base64_decode($value); default: return $value; } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/PayloadParserTrait.php000064400000002540147600374260025637 0ustar00 $response]); } return $jsonPayload; } /** * @param string $xml * * @throws ParserException * * @return \SimpleXMLElement */ protected function parseXml($xml, $response) { $priorSetting = \libxml_use_internal_errors(\true); try { \libxml_clear_errors(); $xmlPayload = new \SimpleXMLElement($xml); if ($error = \libxml_get_last_error()) { throw new \RuntimeException($error->message); } } catch (\Exception $e) { throw new ParserException("Error parsing XML: {$e->getMessage()}", 0, $e, ['response' => $response]); } finally { \libxml_use_internal_errors($priorSetting); } return $xmlPayload; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Parser/JsonRpcParser.php000064400000002432147600374260024620 0ustar00parser = $parser ?: new JsonParser(); } public function __invoke(CommandInterface $command, ResponseInterface $response) { $operation = $this->api->getOperation($command->getName()); $result = null === $operation['output'] ? null : $this->parseMemberFromStream($response->getBody(), $operation->getOutput(), $response); return new Result($result ?: []); } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parse($member, $this->parseJson($stream, $response)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/JsonRpcSerializer.php000064400000004506147600374260026356 0ustar00endpoint = $endpoint; $this->api = $api; $this->jsonFormatter = $jsonFormatter ?: new JsonBody($this->api); $this->contentType = JsonBody::getContentType($api); } /** * When invoked with an AWS command, returns a serialization array * containing "method", "uri", "headers", and "body" key value pairs. * * @param CommandInterface $command Command to serialize into a request. * @param $endpointProvider Provider used for dynamic endpoint resolution. * @param $clientArgs Client arguments used for dynamic endpoint resolution. * * @return RequestInterface */ public function __invoke(CommandInterface $command, $endpointProvider = null, $clientArgs = null) { $operationName = $command->getName(); $operation = $this->api->getOperation($operationName); $commandArgs = $command->toArray(); $headers = ['X-Amz-Target' => $this->api->getMetadata('targetPrefix') . '.' . $operationName, 'Content-Type' => $this->contentType]; if ($endpointProvider instanceof EndpointProviderV2) { $this->setRequestOptions($endpointProvider, $command, $operation, $commandArgs, $clientArgs, $headers); } return new Request($operation['http']['method'], $this->endpoint, $headers, $this->jsonFormatter->build($operation->getInput(), $commandArgs)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/RestSerializer.php000064400000023122147600374260025710 0ustar00api = $api; $this->endpoint = Psr7\Utils::uriFor($endpoint); } /** * @param CommandInterface $command Command to serialize into a request. * @param $endpointProvider Provider used for dynamic endpoint resolution. * @param $clientArgs Client arguments used for dynamic endpoint resolution. * * @return RequestInterface */ public function __invoke(CommandInterface $command, $endpointProvider = null, $clientArgs = null) { $operation = $this->api->getOperation($command->getName()); $commandArgs = $command->toArray(); $opts = $this->serialize($operation, $commandArgs); $headers = isset($opts['headers']) ? $opts['headers'] : []; if ($endpointProvider instanceof EndpointProviderV2) { $this->setRequestOptions($endpointProvider, $command, $operation, $commandArgs, $clientArgs, $headers); $this->endpoint = new Uri($this->endpoint); } $uri = $this->buildEndpoint($operation, $commandArgs, $opts); return new Request($operation['http']['method'], $uri, $headers, isset($opts['body']) ? $opts['body'] : null); } /** * Modifies a hash of request options for a payload body. * * @param StructureShape $member Member to serialize * @param array $value Value to serialize * @param array $opts Request options to modify. */ protected abstract function payload(StructureShape $member, array $value, array &$opts); private function serialize(Operation $operation, array $args) { $opts = []; $input = $operation->getInput(); // Apply the payload trait if present if ($payload = $input['payload']) { $this->applyPayload($input, $payload, $args, $opts); } foreach ($args as $name => $value) { if ($input->hasMember($name)) { $member = $input->getMember($name); $location = $member['location']; if (!$payload && !$location) { $bodyMembers[$name] = $value; } elseif ($location == 'header') { $this->applyHeader($name, $member, $value, $opts); } elseif ($location == 'querystring') { $this->applyQuery($name, $member, $value, $opts); } elseif ($location == 'headers') { $this->applyHeaderMap($name, $member, $value, $opts); } } } if (isset($bodyMembers)) { $this->payload($operation->getInput(), $bodyMembers, $opts); } else { if (!isset($opts['body']) && $this->hasPayloadParam($input, $payload)) { $this->payload($operation->getInput(), [], $opts); } } return $opts; } private function applyPayload(StructureShape $input, $name, array $args, array &$opts) { if (!isset($args[$name])) { return; } $m = $input->getMember($name); if ($m['streaming'] || ($m['type'] == 'string' || $m['type'] == 'blob')) { // Streaming bodies or payloads that are strings are // always just a stream of data. $opts['body'] = Psr7\Utils::streamFor($args[$name]); return; } $this->payload($m, $args[$name], $opts); } private function applyHeader($name, Shape $member, $value, array &$opts) { if ($member->getType() === 'timestamp') { $timestampFormat = !empty($member['timestampFormat']) ? $member['timestampFormat'] : 'rfc822'; $value = TimestampShape::format($value, $timestampFormat); } elseif ($member->getType() === 'boolean') { $value = $value ? 'true' : 'false'; } if ($member['jsonvalue']) { $value = \json_encode($value); if (empty($value) && \JSON_ERROR_NONE !== \json_last_error()) { throw new \InvalidArgumentException('Unable to encode the provided value' . ' with \'json_encode\'. ' . \json_last_error_msg()); } $value = \base64_encode($value); } $opts['headers'][$member['locationName'] ?: $name] = $value; } /** * Note: This is currently only present in the Amazon S3 model. */ private function applyHeaderMap($name, Shape $member, array $value, array &$opts) { $prefix = $member['locationName']; foreach ($value as $k => $v) { $opts['headers'][$prefix . $k] = $v; } } private function applyQuery($name, Shape $member, $value, array &$opts) { if ($member instanceof MapShape) { $opts['query'] = isset($opts['query']) && \is_array($opts['query']) ? $opts['query'] + $value : $value; } elseif ($value !== null) { $type = $member->getType(); if ($type === 'boolean') { $value = $value ? 'true' : 'false'; } elseif ($type === 'timestamp') { $timestampFormat = !empty($member['timestampFormat']) ? $member['timestampFormat'] : 'iso8601'; $value = TimestampShape::format($value, $timestampFormat); } $opts['query'][$member['locationName'] ?: $name] = $value; } } private function buildEndpoint(Operation $operation, array $args, array $opts) { // Create an associative array of variable definitions used in expansions $varDefinitions = $this->getVarDefinitions($operation, $args); $relative = \preg_replace_callback('/\\{([^\\}]+)\\}/', function (array $matches) use($varDefinitions) { $isGreedy = \substr($matches[1], -1, 1) == '+'; $k = $isGreedy ? \substr($matches[1], 0, -1) : $matches[1]; if (!isset($varDefinitions[$k])) { return ''; } if ($isGreedy) { return \str_replace('%2F', '/', \rawurlencode($varDefinitions[$k])); } return \rawurlencode($varDefinitions[$k]); }, $operation['http']['requestUri']); // Add the query string variables or appending to one if needed. if (!empty($opts['query'])) { $relative = $this->appendQuery($opts['query'], $relative); } $path = $this->endpoint->getPath(); //Accounts for trailing '/' in path when custom endpoint //is provided to endpointProviderV2 if ($this->api->isModifiedModel() && $this->api->getServiceName() === 's3') { if (\substr($path, -1) === '/' && $relative[0] === '/') { $path = \rtrim($path, '/'); } $relative = $path . $relative; } // If endpoint has path, remove leading '/' to preserve URI resolution. if ($path && $relative[0] === '/') { $relative = \substr($relative, 1); } //Append path to endpoint when leading '//...' present // as uri cannot be properly resolved if ($this->api->isModifiedModel() && \strpos($relative, '//') === 0) { return new Uri($this->endpoint . $relative); } // Expand path place holders using Amazon's slightly different URI // template syntax. return UriResolver::resolve($this->endpoint, new Uri($relative)); } /** * @param StructureShape $input */ private function hasPayloadParam(StructureShape $input, $payload) { if ($payload) { $potentiallyEmptyTypes = ['blob', 'string']; if ($this->api->getMetadata('protocol') == 'rest-xml') { $potentiallyEmptyTypes[] = 'structure'; } $payloadMember = $input->getMember($payload); if (\in_array($payloadMember['type'], $potentiallyEmptyTypes)) { return \false; } } foreach ($input->getMembers() as $member) { if (!isset($member['location'])) { return \true; } } return \false; } private function appendQuery($query, $endpoint) { $append = Psr7\Query::build($query); return $endpoint .= \strpos($endpoint, '?') !== \false ? "&{$append}" : "?{$append}"; } private function getVarDefinitions($command, $args) { $varDefinitions = []; foreach ($command->getInput()->getMembers() as $name => $member) { if ($member['location'] == 'uri') { $varDefinitions[$member['locationName'] ?: $name] = isset($args[$name]) ? $args[$name] : null; } } return $varDefinitions; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/Ec2ParamBuilder.php000064400000001530147600374260025641 0ustar00getMember(); foreach ($value as $k => $v) { $this->format($items, $v, $prefix . '.' . ($k + 1), $query); } } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/JsonBody.php000064400000006012147600374260024467 0ustar00api = $api; } /** * Gets the JSON Content-Type header for a service API * * @param Service $service * * @return string */ public static function getContentType(Service $service) { if ($service->getMetadata('protocol') === 'rest-json') { return 'application/json'; } $jsonVersion = $service->getMetadata('jsonVersion'); if (empty($jsonVersion)) { throw new \InvalidArgumentException('invalid json'); } else { return 'application/x-amz-json-' . @\number_format($service->getMetadata('jsonVersion'), 1); } } /** * Builds the JSON body based on an array of arguments. * * @param Shape $shape Operation being constructed * @param array $args Associative array of arguments * * @return string */ public function build(Shape $shape, array $args) { $result = \json_encode($this->format($shape, $args)); return $result == '[]' ? '{}' : $result; } private function format(Shape $shape, $value) { switch ($shape['type']) { case 'structure': $data = []; if (isset($shape['document']) && $shape['document']) { return $value; } foreach ($value as $k => $v) { if ($v !== null && $shape->hasMember($k)) { $valueShape = $shape->getMember($k); $data[$valueShape['locationName'] ?: $k] = $this->format($valueShape, $v); } } if (empty($data)) { return new \stdClass(); } return $data; case 'list': $items = $shape->getMember(); foreach ($value as $k => $v) { $value[$k] = $this->format($items, $v); } return $value; case 'map': if (empty($value)) { return new \stdClass(); } $values = $shape->getValue(); foreach ($value as $k => $v) { $value[$k] = $this->format($values, $v); } return $value; case 'blob': return \base64_encode($value); case 'timestamp': $timestampFormat = !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : 'unixTimestamp'; return TimestampShape::format($value, $timestampFormat); default: return $value; } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/XmlBody.php000064400000012602147600374260024320 0ustar00api = $api; } /** * Builds the XML body based on an array of arguments. * * @param Shape $shape Operation being constructed * @param array $args Associative array of arguments * * @return string */ public function build(Shape $shape, array $args) { $xml = new XMLWriter(); $xml->openMemory(); $xml->startDocument('1.0', 'UTF-8'); $this->format($shape, $shape['locationName'] ?: $shape['name'], $args, $xml); $xml->endDocument(); return $xml->outputMemory(); } private function startElement(Shape $shape, $name, XMLWriter $xml) { $xml->startElement($name); if ($ns = $shape['xmlNamespace']) { $xml->writeAttribute(isset($ns['prefix']) ? "xmlns:{$ns['prefix']}" : 'xmlns', $shape['xmlNamespace']['uri']); } } private function format(Shape $shape, $name, $value, XMLWriter $xml) { // Any method mentioned here has a custom serialization handler. static $methods = ['add_structure' => \true, 'add_list' => \true, 'add_blob' => \true, 'add_timestamp' => \true, 'add_boolean' => \true, 'add_map' => \true, 'add_string' => \true]; $type = 'add_' . $shape['type']; if (isset($methods[$type])) { $this->{$type}($shape, $name, $value, $xml); } else { $this->defaultShape($shape, $name, $value, $xml); } } private function defaultShape(Shape $shape, $name, $value, XMLWriter $xml) { $this->startElement($shape, $name, $xml); $xml->text($value); $xml->endElement(); } private function add_structure(StructureShape $shape, $name, array $value, \XMLWriter $xml) { $this->startElement($shape, $name, $xml); foreach ($this->getStructureMembers($shape, $value) as $k => $definition) { $this->format($definition['member'], $definition['member']['locationName'] ?: $k, $definition['value'], $xml); } $xml->endElement(); } private function getStructureMembers(StructureShape $shape, array $value) { $members = []; foreach ($value as $k => $v) { if ($v !== null && $shape->hasMember($k)) { $definition = ['member' => $shape->getMember($k), 'value' => $v]; if ($definition['member']['xmlAttribute']) { // array_unshift_associative $members = [$k => $definition] + $members; } else { $members[$k] = $definition; } } } return $members; } private function add_list(ListShape $shape, $name, array $value, XMLWriter $xml) { $items = $shape->getMember(); if ($shape['flattened']) { $elementName = $name; } else { $this->startElement($shape, $name, $xml); $elementName = $items['locationName'] ?: 'member'; } foreach ($value as $v) { $this->format($items, $elementName, $v, $xml); } if (!$shape['flattened']) { $xml->endElement(); } } private function add_map(MapShape $shape, $name, array $value, XMLWriter $xml) { $xmlEntry = $shape['flattened'] ? $shape['locationName'] : 'entry'; $xmlKey = $shape->getKey()['locationName'] ?: 'key'; $xmlValue = $shape->getValue()['locationName'] ?: 'value'; $this->startElement($shape, $name, $xml); foreach ($value as $key => $v) { $this->startElement($shape, $xmlEntry, $xml); $this->format($shape->getKey(), $xmlKey, $key, $xml); $this->format($shape->getValue(), $xmlValue, $v, $xml); $xml->endElement(); } $xml->endElement(); } private function add_blob(Shape $shape, $name, $value, XMLWriter $xml) { $this->startElement($shape, $name, $xml); $xml->writeRaw(\base64_encode($value)); $xml->endElement(); } private function add_timestamp(TimestampShape $shape, $name, $value, XMLWriter $xml) { $this->startElement($shape, $name, $xml); $timestampFormat = !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : 'iso8601'; $xml->writeRaw(TimestampShape::format($value, $timestampFormat)); $xml->endElement(); } private function add_boolean(Shape $shape, $name, $value, XMLWriter $xml) { $this->startElement($shape, $name, $xml); $xml->writeRaw($value ? 'true' : 'false'); $xml->endElement(); } private function add_string(Shape $shape, $name, $value, XMLWriter $xml) { if ($shape['xmlAttribute']) { $xml->writeAttribute($shape['locationName'] ?: $name, $value); } else { $this->defaultShape($shape, $name, $value, $xml); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/RestJsonSerializer.php000064400000002154147600374260026544 0ustar00contentType = JsonBody::getContentType($api); $this->jsonFormatter = $jsonFormatter ?: new JsonBody($api); } protected function payload(StructureShape $member, array $value, array &$opts) { $body = isset($value) ? (string) $this->jsonFormatter->build($member, $value) : "{}"; $opts['headers']['Content-Type'] = $this->contentType; $opts['body'] = $body; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/RestXmlSerializer.php000064400000002437147600374260026377 0ustar00xmlBody = $xmlBody ?: new XmlBody($api); } protected function payload(StructureShape $member, array $value, array &$opts) { $opts['headers']['Content-Type'] = 'application/xml'; $opts['body'] = $this->getXmlBody($member, $value); } /** * @param StructureShape $member * @param array $value * @return string */ private function getXmlBody(StructureShape $member, array $value) { $xmlBody = (string) $this->xmlBody->build($member, $value); $xmlBody = \str_replace("'", "'", $xmlBody); $xmlBody = \str_replace('\\r', " ", $xmlBody); $xmlBody = \str_replace('\\n', " ", $xmlBody); return $xmlBody; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/QuerySerializer.php000064400000004240147600374260026100 0ustar00api = $api; $this->endpoint = $endpoint; $this->paramBuilder = $paramBuilder ?: new QueryParamBuilder(); } /** * When invoked with an AWS command, returns a serialization array * containing "method", "uri", "headers", and "body" key value pairs. * * @param CommandInterface $command Command to serialize into a request. * @param $endpointProvider Provider used for dynamic endpoint resolution. * @param $clientArgs Client arguments used for dynamic endpoint resolution. * * @return RequestInterface */ public function __invoke(CommandInterface $command, $endpointProvider = null, $clientArgs = null) { $operation = $this->api->getOperation($command->getName()); $body = ['Action' => $command->getName(), 'Version' => $this->api->getMetadata('apiVersion')]; $commandArgs = $command->toArray(); // Only build up the parameters when there are parameters to build if ($commandArgs) { $body += \call_user_func($this->paramBuilder, $operation->getInput(), $commandArgs); } $body = \http_build_query($body, '', '&', \PHP_QUERY_RFC3986); $headers = ['Content-Length' => \strlen($body), 'Content-Type' => 'application/x-www-form-urlencoded']; if ($endpointProvider instanceof EndpointProviderV2) { $this->setRequestOptions($endpointProvider, $command, $operation, $commandArgs, $clientArgs, $headers); } return new Request('POST', $this->endpoint, $headers, $body); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Serializer/QueryParamBuilder.php000064400000007413147600374260026343 0ustar00isFlat($shape) && !empty($shape['member']['locationName'])) { return $shape['member']['locationName']; } return $default; } protected function isFlat(Shape $shape) { return $shape['flattened'] === \true; } public function __invoke(StructureShape $shape, array $params) { if (!$this->methods) { $this->methods = \array_fill_keys(\get_class_methods($this), \true); } $query = []; $this->format_structure($shape, $params, '', $query); return $query; } protected function format(Shape $shape, $value, $prefix, array &$query) { $type = 'format_' . $shape['type']; if (isset($this->methods[$type])) { $this->{$type}($shape, $value, $prefix, $query); } else { $query[$prefix] = (string) $value; } } protected function format_structure(StructureShape $shape, array $value, $prefix, &$query) { if ($prefix) { $prefix .= '.'; } foreach ($value as $k => $v) { if ($shape->hasMember($k)) { $member = $shape->getMember($k); $this->format($member, $v, $prefix . $this->queryName($member, $k), $query); } } } protected function format_list(ListShape $shape, array $value, $prefix, &$query) { // Handle empty list serialization if (!$value) { $query[$prefix] = ''; return; } $items = $shape->getMember(); if (!$this->isFlat($shape)) { $locationName = $shape->getMember()['locationName'] ?: 'member'; $prefix .= ".{$locationName}"; } elseif ($name = $this->queryName($items)) { $parts = \explode('.', $prefix); $parts[\count($parts) - 1] = $name; $prefix = \implode('.', $parts); } foreach ($value as $k => $v) { $this->format($items, $v, $prefix . '.' . ($k + 1), $query); } } protected function format_map(MapShape $shape, array $value, $prefix, array &$query) { $vals = $shape->getValue(); $keys = $shape->getKey(); if (!$this->isFlat($shape)) { $prefix .= '.entry'; } $i = 0; $keyName = '%s.%d.' . $this->queryName($keys, 'key'); $valueName = '%s.%s.' . $this->queryName($vals, 'value'); foreach ($value as $k => $v) { $i++; $this->format($keys, $k, \sprintf($keyName, $prefix, $i), $query); $this->format($vals, $v, \sprintf($valueName, $prefix, $i), $query); } } protected function format_blob(Shape $shape, $value, $prefix, array &$query) { $query[$prefix] = \base64_encode($value); } protected function format_timestamp(TimestampShape $shape, $value, $prefix, array &$query) { $timestampFormat = !empty($shape['timestampFormat']) ? $shape['timestampFormat'] : 'iso8601'; $query[$prefix] = TimestampShape::format($value, $timestampFormat); } protected function format_boolean(Shape $shape, $value, $prefix, array &$query) { $query[$prefix] = $value ? 'true' : 'false'; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/TimestampShape.php000064400000002700147600374260023553 0ustar00getTimestamp(); } elseif (\is_string($value)) { $value = \strtotime($value); } elseif (!\is_int($value)) { throw new \InvalidArgumentException('Unable to handle the provided' . ' timestamp type: ' . \gettype($value)); } switch ($format) { case 'iso8601': return \gmdate('Y-m-d\\TH:i:s\\Z', $value); case 'rfc822': return \gmdate('D, d M Y H:i:s \\G\\M\\T', $value); case 'unixTimestamp': return $value; default: throw new \UnexpectedValueException('Unknown timestamp format: ' . $format); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Service.php000064400000031226147600374260022234 0ustar00 [], 'shapes' => [], 'metadata' => [], 'clientContextParams' => []], $defaultMeta = ['apiVersion' => null, 'serviceFullName' => null, 'serviceId' => null, 'endpointPrefix' => null, 'signingName' => null, 'signatureVersion' => null, 'protocol' => null, 'uid' => null]; $definition += $defaults; $definition['metadata'] += $defaultMeta; $this->definition = $definition; $this->apiProvider = $provider; parent::__construct($definition, new ShapeMap($definition['shapes'])); if (isset($definition['metadata']['serviceIdentifier'])) { $this->serviceName = $this->getServiceName(); } else { $this->serviceName = $this->getEndpointPrefix(); } $this->apiVersion = $this->getApiVersion(); if (isset($definition['clientContextParams'])) { $this->clientContextParams = $definition['clientContextParams']; } } /** * Creates a request serializer for the provided API object. * * @param Service $api API that contains a protocol. * @param string $endpoint Endpoint to send requests to. * * @return callable * @throws \UnexpectedValueException */ public static function createSerializer(Service $api, $endpoint) { static $mapping = ['json' => Serializer\JsonRpcSerializer::class, 'query' => Serializer\QuerySerializer::class, 'rest-json' => Serializer\RestJsonSerializer::class, 'rest-xml' => Serializer\RestXmlSerializer::class]; $proto = $api->getProtocol(); if (isset($mapping[$proto])) { return new $mapping[$proto]($api, $endpoint); } if ($proto == 'ec2') { return new Serializer\QuerySerializer($api, $endpoint, new Serializer\Ec2ParamBuilder()); } throw new \UnexpectedValueException('Unknown protocol: ' . $api->getProtocol()); } /** * Creates an error parser for the given protocol. * * Redundant method signature to preserve backwards compatibility. * * @param string $protocol Protocol to parse (e.g., query, json, etc.) * * @return callable * @throws \UnexpectedValueException */ public static function createErrorParser($protocol, Service $api = null) { static $mapping = ['json' => ErrorParser\JsonRpcErrorParser::class, 'query' => ErrorParser\XmlErrorParser::class, 'rest-json' => ErrorParser\RestJsonErrorParser::class, 'rest-xml' => ErrorParser\XmlErrorParser::class, 'ec2' => ErrorParser\XmlErrorParser::class]; if (isset($mapping[$protocol])) { return new $mapping[$protocol]($api); } throw new \UnexpectedValueException("Unknown protocol: {$protocol}"); } /** * Applies the listeners needed to parse client models. * * @param Service $api API to create a parser for * @return callable * @throws \UnexpectedValueException */ public static function createParser(Service $api) { static $mapping = ['json' => Parser\JsonRpcParser::class, 'query' => Parser\QueryParser::class, 'rest-json' => Parser\RestJsonParser::class, 'rest-xml' => Parser\RestXmlParser::class]; $proto = $api->getProtocol(); if (isset($mapping[$proto])) { return new $mapping[$proto]($api); } if ($proto == 'ec2') { return new Parser\QueryParser($api, null, \false); } throw new \UnexpectedValueException('Unknown protocol: ' . $api->getProtocol()); } /** * Get the full name of the service * * @return string */ public function getServiceFullName() { return $this->definition['metadata']['serviceFullName']; } /** * Get the service id * * @return string */ public function getServiceId() { return $this->definition['metadata']['serviceId']; } /** * Get the API version of the service * * @return string */ public function getApiVersion() { return $this->definition['metadata']['apiVersion']; } /** * Get the API version of the service * * @return string */ public function getEndpointPrefix() { return $this->definition['metadata']['endpointPrefix']; } /** * Get the signing name used by the service. * * @return string */ public function getSigningName() { return $this->definition['metadata']['signingName'] ?: $this->definition['metadata']['endpointPrefix']; } /** * Get the service name. * * @return string */ public function getServiceName() { return $this->definition['metadata']['serviceIdentifier']; } /** * Get the default signature version of the service. * * Note: this method assumes "v4" when not specified in the model. * * @return string */ public function getSignatureVersion() { return $this->definition['metadata']['signatureVersion'] ?: 'v4'; } /** * Get the protocol used by the service. * * @return string */ public function getProtocol() { return $this->definition['metadata']['protocol']; } /** * Get the uid string used by the service * * @return string */ public function getUid() { return $this->definition['metadata']['uid']; } /** * Check if the description has a specific operation by name. * * @param string $name Operation to check by name * * @return bool */ public function hasOperation($name) { return isset($this['operations'][$name]); } /** * Get an operation by name. * * @param string $name Operation to retrieve by name * * @return Operation * @throws \InvalidArgumentException If the operation is not found */ public function getOperation($name) { if (!isset($this->operations[$name])) { if (!isset($this->definition['operations'][$name])) { throw new \InvalidArgumentException("Unknown operation: {$name}"); } $this->operations[$name] = new Operation($this->definition['operations'][$name], $this->shapeMap); } else { if ($this->modifiedModel) { $this->operations[$name] = new Operation($this->definition['operations'][$name], $this->shapeMap); } } return $this->operations[$name]; } /** * Get all of the operations of the description. * * @return Operation[] */ public function getOperations() { $result = []; foreach ($this->definition['operations'] as $name => $definition) { $result[$name] = $this->getOperation($name); } return $result; } /** * Get all of the error shapes of the service * * @return array */ public function getErrorShapes() { $result = []; foreach ($this->definition['shapes'] as $name => $definition) { if (!empty($definition['exception'])) { $definition['name'] = $name; $result[] = new StructureShape($definition, $this->getShapeMap()); } } return $result; } /** * Get all of the service metadata or a specific metadata key value. * * @param string|null $key Key to retrieve or null to retrieve all metadata * * @return mixed Returns the result or null if the key is not found */ public function getMetadata($key = null) { if (!$key) { return $this['metadata']; } if (isset($this->definition['metadata'][$key])) { return $this->definition['metadata'][$key]; } return null; } /** * Gets an associative array of available paginator configurations where * the key is the name of the paginator, and the value is the paginator * configuration. * * @return array * @unstable The configuration format of paginators may change in the future */ public function getPaginators() { if (!isset($this->paginators)) { $res = \call_user_func($this->apiProvider, 'paginator', $this->serviceName, $this->apiVersion); $this->paginators = isset($res['pagination']) ? $res['pagination'] : []; } return $this->paginators; } /** * Determines if the service has a paginator by name. * * @param string $name Name of the paginator. * * @return bool */ public function hasPaginator($name) { return isset($this->getPaginators()[$name]); } /** * Retrieve a paginator by name. * * @param string $name Paginator to retrieve by name. This argument is * typically the operation name. * @return array * @throws \UnexpectedValueException if the paginator does not exist. * @unstable The configuration format of paginators may change in the future */ public function getPaginatorConfig($name) { static $defaults = ['input_token' => null, 'output_token' => null, 'limit_key' => null, 'result_key' => null, 'more_results' => null]; if ($this->hasPaginator($name)) { return $this->paginators[$name] + $defaults; } throw new \UnexpectedValueException("There is no {$name} " . "paginator defined for the {$this->serviceName} service."); } /** * Gets an associative array of available waiter configurations where the * key is the name of the waiter, and the value is the waiter * configuration. * * @return array */ public function getWaiters() { if (!isset($this->waiters)) { $res = \call_user_func($this->apiProvider, 'waiter', $this->serviceName, $this->apiVersion); $this->waiters = isset($res['waiters']) ? $res['waiters'] : []; } return $this->waiters; } /** * Determines if the service has a waiter by name. * * @param string $name Name of the waiter. * * @return bool */ public function hasWaiter($name) { return isset($this->getWaiters()[$name]); } /** * Get a waiter configuration by name. * * @param string $name Name of the waiter by name. * * @return array * @throws \UnexpectedValueException if the waiter does not exist. */ public function getWaiterConfig($name) { // Error if the waiter is not defined if ($this->hasWaiter($name)) { return $this->waiters[$name]; } throw new \UnexpectedValueException("There is no {$name} waiter " . "defined for the {$this->serviceName} service."); } /** * Get the shape map used by the API. * * @return ShapeMap */ public function getShapeMap() { return $this->shapeMap; } /** * Get all the context params of the description. * * @return array */ public function getClientContextParams() { return $this->clientContextParams; } /** * Get the service's api provider. * * @return callable */ public function getProvider() { return $this->apiProvider; } /** * Get the service's definition. * * @return callable */ public function getDefinition() { return $this->definition; } /** * Sets the service's api definition. * Intended for internal use only. * * @return void * * @internal */ public function setDefinition($definition) { $this->definition = $definition; $this->modifiedModel = \true; } /** * Denotes whether or not a service's definition has * been modified. Intended for internal use only. * * @return bool * * @internal */ public function isModifiedModel() { return $this->modifiedModel; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ShapeMap.php000064400000002743147600374260022334 0ustar00definitions = $shapeModels; } /** * Get an array of shape names. * * @return array */ public function getShapeNames() { return \array_keys($this->definitions); } /** * Resolve a shape reference * * @param array $shapeRef Shape reference shape * * @return Shape * @throws \InvalidArgumentException */ public function resolve(array $shapeRef) { $shape = $shapeRef['shape']; if (!isset($this->definitions[$shape])) { throw new \InvalidArgumentException('Shape not found: ' . $shape); } $isSimple = \count($shapeRef) == 1; if ($isSimple && isset($this->simple[$shape])) { return $this->simple[$shape]; } $definition = $shapeRef + $this->definitions[$shape]; $definition['name'] = $definition['shape']; if (isset($definition['shape'])) { unset($definition['shape']); } $result = Shape::create($definition, $this); if ($isSimple) { $this->simple[$shape] = $result; } return $result; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ApiProvider.php000064400000016610147600374260023060 0ustar00 'api-2', 'paginator' => 'paginators-1', 'waiter' => 'waiters-2', 'docs' => 'docs-2']; /** @var array API manifest */ private $manifest; /** @var string The directory containing service models. */ private $modelsDir; /** * Resolves an API provider and ensures a non-null return value. * * @param callable $provider Provider function to invoke. * @param string $type Type of data ('api', 'waiter', 'paginator'). * @param string $service Service name. * @param string $version API version. * * @return array * @throws UnresolvedApiException */ public static function resolve(callable $provider, $type, $service, $version) { // Execute the provider and return the result, if there is one. $result = $provider($type, $service, $version); if (\is_array($result)) { if (!isset($result['metadata']['serviceIdentifier'])) { $result['metadata']['serviceIdentifier'] = $service; } return $result; } // Throw an exception with a message depending on the inputs. if (!isset(self::$typeMap[$type])) { $msg = "The type must be one of: " . \implode(', ', self::$typeMap); } elseif ($service) { $msg = "The {$service} service does not have version: {$version}."; } else { $msg = "You must specify a service name to retrieve its API data."; } throw new UnresolvedApiException($msg); } /** * Default SDK API provider. * * This provider loads pre-built manifest data from the `data` directory. * * @return self */ public static function defaultProvider() { return new self(__DIR__ . '/../data', \VendorDuplicator\Aws\manifest()); } /** * Loads API data after resolving the version to the latest, compatible, * available version based on the provided manifest data. * * Manifest data is essentially an associative array of service names to * associative arrays of API version aliases. * * [ * ... * 'ec2' => [ * 'latest' => '2014-10-01', * '2014-10-01' => '2014-10-01', * '2014-09-01' => '2014-10-01', * '2014-06-15' => '2014-10-01', * ... * ], * 'ecs' => [...], * 'elasticache' => [...], * ... * ] * * @param string $dir Directory containing service models. * @param array $manifest The API version manifest data. * * @return self */ public static function manifest($dir, array $manifest) { return new self($dir, $manifest); } /** * Loads API data from the specified directory. * * If "latest" is specified as the version, this provider must glob the * directory to find which is the latest available version. * * @param string $dir Directory containing service models. * * @return self * @throws \InvalidArgumentException if the provided `$dir` is invalid. */ public static function filesystem($dir) { return new self($dir); } /** * Retrieves a list of valid versions for the specified service. * * @param string $service Service name * * @return array */ public function getVersions($service) { if (!isset($this->manifest)) { $this->buildVersionsList($service); } if (!isset($this->manifest[$service]['versions'])) { return []; } return \array_values(\array_unique($this->manifest[$service]['versions'])); } /** * Execute the provider. * * @param string $type Type of data ('api', 'waiter', 'paginator'). * @param string $service Service name. * @param string $version API version. * * @return array|null */ public function __invoke($type, $service, $version) { // Resolve the type or return null. if (isset(self::$typeMap[$type])) { $type = self::$typeMap[$type]; } else { return null; } // Resolve the version or return null. if (!isset($this->manifest)) { $this->buildVersionsList($service); } if (!isset($this->manifest[$service]['versions'][$version])) { return null; } $version = $this->manifest[$service]['versions'][$version]; $path = "{$this->modelsDir}/{$service}/{$version}/{$type}.json"; try { return \VendorDuplicator\Aws\load_compiled_json($path); } catch (\InvalidArgumentException $e) { return null; } } /** * @param string $modelsDir Directory containing service models. * @param array $manifest The API version manifest data. */ private function __construct($modelsDir, array $manifest = null) { $this->manifest = $manifest; $this->modelsDir = \rtrim($modelsDir, '/'); if (!\is_dir($this->modelsDir)) { throw new \InvalidArgumentException("The specified models directory, {$modelsDir}, was not found."); } } /** * Build the versions list for the specified service by globbing the dir. */ private function buildVersionsList($service) { $dir = "{$this->modelsDir}/{$service}/"; if (!\is_dir($dir)) { return; } // Get versions, remove . and .., and sort in descending order. $results = \array_diff(\scandir($dir, \SCANDIR_SORT_DESCENDING), ['..', '.']); if (!$results) { $this->manifest[$service] = ['versions' => []]; } else { $this->manifest[$service] = ['versions' => ['latest' => $results[0]]]; $this->manifest[$service]['versions'] += \array_combine($results, $results); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/MapShape.php000064400000002121147600374260022322 0ustar00value) { if (!isset($this->definition['value'])) { throw new \RuntimeException('No value specified'); } $this->value = Shape::create($this->definition['value'], $this->shapeMap); } return $this->value; } /** * @return Shape */ public function getKey() { if (!$this->key) { $this->key = isset($this->definition['key']) ? Shape::create($this->definition['key'], $this->shapeMap) : new Shape(['type' => 'string'], $this->shapeMap); } return $this->key; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/DateTimeResult.php000064400000007356147600374260023536 0ustar00format('Y-m-d H:i:s.u'), new DateTimeZone('UTC')); } /** * @return DateTimeResult */ public static function fromISO8601($iso8601Timestamp) { if (\is_numeric($iso8601Timestamp) || !\is_string($iso8601Timestamp)) { throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromISO8601'); } return new DateTimeResult($iso8601Timestamp); } /** * Create a new DateTimeResult from an unknown timestamp. * * @return DateTimeResult * @throws Exception */ public static function fromTimestamp($timestamp, $expectedFormat = null) { if (empty($timestamp)) { return self::fromEpoch(0); } if (!(\is_string($timestamp) || \is_numeric($timestamp))) { throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp'); } try { if ($expectedFormat == 'iso8601') { try { return self::fromISO8601($timestamp); } catch (Exception $exception) { return self::fromEpoch($timestamp); } } else { if ($expectedFormat == 'unixTimestamp') { try { return self::fromEpoch($timestamp); } catch (Exception $exception) { return self::fromISO8601($timestamp); } } else { if (\VendorDuplicator\Aws\is_valid_epoch($timestamp)) { return self::fromEpoch($timestamp); } } } return self::fromISO8601($timestamp); } catch (Exception $exception) { throw new ParserException('Invalid timestamp value passed to DateTimeResult::fromTimestamp'); } } /** * Serialize the DateTimeResult as an ISO 8601 date string. * * @return string */ public function __toString() { return $this->format('c'); } /** * Serialize the date as an ISO 8601 date when serializing as JSON. * * @return string */ #[\ReturnTypeWillChange] public function jsonSerialize() { return (string) $this; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Operation.php000064400000006511147600374260022573 0ustar00staticContextParams = $definition['staticContextParams']; } parent::__construct($definition, $shapeMap); $this->contextParams = $this->setContextParams(); } /** * Returns an associative array of the HTTP attribute of the operation: * * - method: HTTP method of the operation * - requestUri: URI of the request (can include URI template placeholders) * * @return array */ public function getHttp() { return $this->definition['http']; } /** * Get the input shape of the operation. * * @return StructureShape */ public function getInput() { if (!$this->input) { if ($input = $this['input']) { $this->input = $this->shapeFor($input); } else { $this->input = new StructureShape([], $this->shapeMap); } } return $this->input; } /** * Get the output shape of the operation. * * @return StructureShape */ public function getOutput() { if (!$this->output) { if ($output = $this['output']) { $this->output = $this->shapeFor($output); } else { $this->output = new StructureShape([], $this->shapeMap); } } return $this->output; } /** * Get an array of operation error shapes. * * @return Shape[] */ public function getErrors() { if ($this->errors === null) { if ($errors = $this['errors']) { foreach ($errors as $key => $error) { $errors[$key] = $this->shapeFor($error); } $this->errors = $errors; } else { $this->errors = []; } } return $this->errors; } /** * Gets static modeled static values used for * endpoint resolution. * * @return array */ public function getStaticContextParams() { return $this->staticContextParams; } /** * Gets definition of modeled dynamic values used * for endpoint resolution * * @return array */ public function getContextParams() { return $this->contextParams; } private function setContextParams() { $members = $this->getInput()->getMembers(); $contextParams = []; foreach ($members as $name => $shape) { if (!empty($contextParam = $shape->getContextParam())) { $contextParams[$contextParam['name']] = ['shape' => $name, 'type' => $shape->getType()]; } } return $contextParams; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/ListShape.php000064400000001363147600374260022527 0ustar00member) { if (!isset($this->definition['member'])) { throw new \RuntimeException('No member attribute specified'); } $this->member = Shape::create($this->definition['member'], $this->shapeMap); } return $this->member; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Validator.php000064400000022410147600374260022554 0ustar00 \true, 'min' => \true, 'max' => \false, 'pattern' => \false]; /** * @param array $constraints Associative array of constraints to enforce. * Accepts the following keys: "required", "min", * "max", and "pattern". If a key is not * provided, the constraint will assume false. */ public function __construct(array $constraints = null) { static $assumedFalseValues = ['required' => \false, 'min' => \false, 'max' => \false, 'pattern' => \false]; $this->constraints = empty($constraints) ? self::$defaultConstraints : $constraints + $assumedFalseValues; } /** * Validates the given input against the schema. * * @param string $name Operation name * @param Shape $shape Shape to validate * @param array $input Input to validate * * @throws \InvalidArgumentException if the input is invalid. */ public function validate($name, Shape $shape, array $input) { $this->dispatch($shape, $input); if ($this->errors) { $message = \sprintf("Found %d error%s while validating the input provided for the " . "%s operation:\n%s", \count($this->errors), \count($this->errors) > 1 ? 's' : '', $name, \implode("\n", $this->errors)); $this->errors = []; throw new \InvalidArgumentException($message); } } private function dispatch(Shape $shape, $value) { static $methods = ['structure' => 'check_structure', 'list' => 'check_list', 'map' => 'check_map', 'blob' => 'check_blob', 'boolean' => 'check_boolean', 'integer' => 'check_numeric', 'float' => 'check_numeric', 'long' => 'check_numeric', 'string' => 'check_string', 'byte' => 'check_string', 'char' => 'check_string']; $type = $shape->getType(); if (isset($methods[$type])) { $this->{$methods[$type]}($shape, $value); } } private function check_structure(StructureShape $shape, $value) { $isDocument = isset($shape['document']) && $shape['document']; $isUnion = isset($shape['union']) && $shape['union']; if ($isDocument) { if (!$this->checkDocumentType($value)) { $this->addError("is not a valid document type"); return; } } elseif ($isUnion) { if (!$this->checkUnion($value)) { $this->addError("is a union type and must have exactly one non null value"); return; } } elseif (!$this->checkAssociativeArray($value)) { return; } if ($this->constraints['required'] && $shape['required']) { foreach ($shape['required'] as $req) { if (!isset($value[$req])) { $this->path[] = $req; $this->addError('is missing and is a required parameter'); \array_pop($this->path); } } } if (!$isDocument) { foreach ($value as $name => $v) { if ($shape->hasMember($name)) { $this->path[] = $name; $this->dispatch($shape->getMember($name), isset($value[$name]) ? $value[$name] : null); \array_pop($this->path); } } } } private function check_list(ListShape $shape, $value) { if (!\is_array($value)) { $this->addError('must be an array. Found ' . Aws\describe_type($value)); return; } $this->validateRange($shape, \count($value), "list element count"); $items = $shape->getMember(); foreach ($value as $index => $v) { $this->path[] = $index; $this->dispatch($items, $v); \array_pop($this->path); } } private function check_map(MapShape $shape, $value) { if (!$this->checkAssociativeArray($value)) { return; } $values = $shape->getValue(); foreach ($value as $key => $v) { $this->path[] = $key; $this->dispatch($values, $v); \array_pop($this->path); } } private function check_blob(Shape $shape, $value) { static $valid = ['string' => \true, 'integer' => \true, 'double' => \true, 'resource' => \true]; $type = \gettype($value); if (!isset($valid[$type])) { if ($type != 'object' || !\method_exists($value, '__toString')) { $this->addError('must be an fopen resource, a ' . 'VendorDuplicator\\GuzzleHttp\\Stream\\StreamInterface object, or something ' . 'that can be cast to a string. Found ' . Aws\describe_type($value)); } } } private function check_numeric(Shape $shape, $value) { if (!\is_numeric($value)) { $this->addError('must be numeric. Found ' . Aws\describe_type($value)); return; } $this->validateRange($shape, $value, "numeric value"); } private function check_boolean(Shape $shape, $value) { if (!\is_bool($value)) { $this->addError('must be a boolean. Found ' . Aws\describe_type($value)); } } private function check_string(Shape $shape, $value) { if ($shape['jsonvalue']) { if (!self::canJsonEncode($value)) { $this->addError('must be a value encodable with \'json_encode\'.' . ' Found ' . Aws\describe_type($value)); } return; } if (!$this->checkCanString($value)) { $this->addError('must be a string or an object that implements ' . '__toString(). Found ' . Aws\describe_type($value)); return; } $value = isset($value) ? $value : ''; $this->validateRange($shape, \strlen($value), "string length"); if ($this->constraints['pattern']) { $pattern = $shape['pattern']; if ($pattern && !\preg_match("/{$pattern}/", $value)) { $this->addError("Pattern /{$pattern}/ failed to match '{$value}'"); } } } private function validateRange(Shape $shape, $length, $descriptor) { if ($this->constraints['min']) { $min = $shape['min']; if ($min && $length < $min) { $this->addError("expected {$descriptor} to be >= {$min}, but " . "found {$descriptor} of {$length}"); } } if ($this->constraints['max']) { $max = $shape['max']; if ($max && $length > $max) { $this->addError("expected {$descriptor} to be <= {$max}, but " . "found {$descriptor} of {$length}"); } } } private function checkArray($arr) { return $this->isIndexed($arr) || $this->isAssociative($arr); } private function isAssociative($arr) { return \count(\array_filter(\array_keys($arr), "is_string")) == \count($arr); } private function isIndexed(array $arr) { return $arr == \array_values($arr); } private function checkCanString($value) { static $valid = ['string' => \true, 'integer' => \true, 'double' => \true, 'NULL' => \true]; $type = \gettype($value); return isset($valid[$type]) || $type == 'object' && \method_exists($value, '__toString'); } private function checkAssociativeArray($value) { $isAssociative = \false; if (\is_array($value)) { $expectedIndex = 0; $key = \key($value); do { $isAssociative = $key !== $expectedIndex++; \next($value); $key = \key($value); } while (!$isAssociative && null !== $key); } if (!$isAssociative) { $this->addError('must be an associative array. Found ' . Aws\describe_type($value)); return \false; } return \true; } private function checkDocumentType($value) { if (\is_array($value)) { $typeOfFirstKey = \gettype(\key($value)); foreach ($value as $key => $val) { if (!$this->checkDocumentType($val) || \gettype($key) != $typeOfFirstKey) { return \false; } } return $this->checkArray($value); } return \is_null($value) || \is_numeric($value) || \is_string($value) || \is_bool($value); } private function checkUnion($value) { if (\is_array($value)) { $nonNullCount = 0; foreach ($value as $key => $val) { if (!\is_null($val) && !(\strpos($key, "@") === 0)) { $nonNullCount++; } } return $nonNullCount == 1; } return !\is_null($value); } private function addError($message) { $this->errors[] = \implode('', \array_map(function ($s) { return "[{$s}]"; }, $this->path)) . ' ' . $message; } private function canJsonEncode($data) { return !\is_resource($data); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/Shape.php000064400000003156147600374260021675 0ustar00 StructureShape::class, 'map' => MapShape::class, 'list' => ListShape::class, 'timestamp' => TimestampShape::class, 'integer' => Shape::class, 'double' => Shape::class, 'float' => Shape::class, 'long' => Shape::class, 'string' => Shape::class, 'byte' => Shape::class, 'character' => Shape::class, 'blob' => Shape::class, 'boolean' => Shape::class]; if (isset($definition['shape'])) { return $shapeMap->resolve($definition); } if (!isset($map[$definition['type']])) { throw new \RuntimeException('Invalid type: ' . \print_r($definition, \true)); } $type = $map[$definition['type']]; return new $type($definition, $shapeMap); } /** * Get the type of the shape * * @return string */ public function getType() { return $this->definition['type']; } /** * Get the name of the shape * * @return string */ public function getName() { return $this->definition['name']; } /** * Get a context param definition. */ public function getContextParam() { return $this->contextParam; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/StructureShape.php000064400000003235147600374260023614 0ustar00members)) { $this->generateMembersHash(); } return $this->members; } /** * Check if a specific member exists by name. * * @param string $name Name of the member to check * * @return bool */ public function hasMember($name) { return isset($this->definition['members'][$name]); } /** * Retrieve a member by name. * * @param string $name Name of the member to retrieve * * @return Shape * @throws \InvalidArgumentException if the member is not found. */ public function getMember($name) { $members = $this->getMembers(); if (!isset($members[$name])) { throw new \InvalidArgumentException('Unknown member ' . $name); } return $members[$name]; } private function generateMembersHash() { $this->members = []; foreach ($this->definition['members'] as $name => $definition) { $this->members[$name] = $this->shapeFor($definition); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/AbstractModel.php000064400000003645147600374260023364 0ustar00definition = $definition; $this->shapeMap = $shapeMap; if (isset($definition['contextParam'])) { $this->contextParam = $definition['contextParam']; } } public function toArray() { return $this->definition; } /** * @return mixed|null */ #[\ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->definition[$offset]) ? $this->definition[$offset] : null; } /** * @return void */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { $this->definition[$offset] = $value; } /** * @return bool */ #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->definition[$offset]); } /** * @return void */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->definition[$offset]); } protected function shapeAt($key) { if (!isset($this->definition[$key])) { throw new \InvalidArgumentException('Expected shape definition at ' . $key); } return $this->shapeFor($this->definition[$key]); } protected function shapeFor(array $definition) { return isset($definition['shape']) ? $this->shapeMap->resolve($definition) : Shape::create($definition, $this->shapeMap); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Api/DocModel.php000064400000006310147600374260022316 0ustar00docs = $docs; } /** * Convert the doc model to an array. * * @return array */ public function toArray() { return $this->docs; } /** * Retrieves documentation about the service. * * @return null|string */ public function getServiceDocs() { return isset($this->docs['service']) ? $this->docs['service'] : null; } /** * Retrieves documentation about an operation. * * @param string $operation Name of the operation * * @return null|string */ public function getOperationDocs($operation) { return isset($this->docs['operations'][$operation]) ? $this->docs['operations'][$operation] : null; } /** * Retrieves documentation about an error. * * @param string $error Name of the error * * @return null|string */ public function getErrorDocs($error) { return isset($this->docs['shapes'][$error]['base']) ? $this->docs['shapes'][$error]['base'] : null; } /** * Retrieves documentation about a shape, specific to the context. * * @param string $shapeName Name of the shape. * @param string $parentName Name of the parent/context shape. * @param string $ref Name used by the context to reference the shape. * * @return null|string */ public function getShapeDocs($shapeName, $parentName, $ref) { if (!isset($this->docs['shapes'][$shapeName])) { return ''; } $result = ''; $d = $this->docs['shapes'][$shapeName]; if (isset($d['refs']["{$parentName}\${$ref}"])) { $result = $d['refs']["{$parentName}\${$ref}"]; } elseif (isset($d['base'])) { $result = $d['base']; } if (isset($d['append'])) { if (!isset($d['excludeAppend']) || !\in_array($parentName, $d['excludeAppend'])) { $result .= $d['append']; } } if (isset($d['appendOnly']) && \in_array($parentName, $d['appendOnly']['shapes'])) { $result .= $d['appendOnly']['message']; } return $this->clean($result); } private function clean($content) { if (!$content) { return ''; } $tidy = new \tidy(); $tidy->parseString($content, ['indent' => \true, 'doctype' => 'omit', 'output-html' => \true, 'show-body-only' => \true, 'drop-empty-paras' => \true, 'drop-font-tags' => \true, 'drop-proprietary-attributes' => \true, 'hide-comments' => \true, 'logical-emphasis' => \true]); $tidy->cleanRepair(); return (string) $content; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Arn/Exception/InvalidArnException.php000064400000000251147600374260026501 0ustar00data['outpost_id']; } public function getAccesspointName() { return $this->data['accesspoint_name']; } private static function parseOutpostData(array $data) { $resourceData = \preg_split("/[\\/:]/", $data['resource_id']); $data['outpost_id'] = isset($resourceData[0]) ? $resourceData[0] : null; $data['accesspoint_type'] = isset($resourceData[1]) ? $resourceData[1] : null; $data['accesspoint_name'] = isset($resourceData[2]) ? $resourceData[2] : null; if (isset($resourceData[3])) { $data['resource_extra'] = \implode(':', \array_slice($resourceData, 3)); } return $data; } /** * Validation specific to OutpostsAccessPointArn. Note this uses the base Arn * class validation instead of the direct parent due to it having slightly * differing requirements from its parent. * * @param array $data */ public static function validate(array $data) { Arn::validate($data); if ($data['service'] !== 's3-outposts') { throw new InvalidArnException("The 3rd component of an S3 Outposts" . " access point ARN represents the service and must be" . " 's3-outposts'."); } self::validateRegion($data, 'S3 Outposts access point ARN'); self::validateAccountId($data, 'S3 Outposts access point ARN'); if ($data['resource_type'] !== 'outpost') { throw new InvalidArnException("The 6th component of an S3 Outposts" . " access point ARN represents the resource type and must be" . " 'outpost'."); } if (!self::isValidHostLabel($data['outpost_id'])) { throw new InvalidArnException("The 7th component of an S3 Outposts" . " access point ARN is required, represents the outpost ID, and" . " must be a valid host label."); } if ($data['accesspoint_type'] !== 'accesspoint') { throw new InvalidArnException("The 8th component of an S3 Outposts" . " access point ARN must be 'accesspoint'"); } if (!self::isValidHostLabel($data['accesspoint_name'])) { throw new InvalidArnException("The 9th component of an S3 Outposts" . " access point ARN is required, represents the accesspoint name," . " and must be a valid host label."); } if (!empty($data['resource_extra'])) { throw new InvalidArnException("An S3 Outposts access point ARN" . " should only have 9 components, delimited by the characters" . " ':' and '/'. '{$data['resource_extra']}' was found after the" . " 9th component."); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Arn/S3/AccessPointArn.php000064400000001361147600374260024001 0ustar00data['bucket_name']; } public function getOutpostId() { return $this->data['outpost_id']; } private static function parseOutpostData(array $data) { $resourceData = \preg_split("/[\\/:]/", $data['resource_id'], 3); $data['outpost_id'] = isset($resourceData[0]) ? $resourceData[0] : null; $data['bucket_label'] = isset($resourceData[1]) ? $resourceData[1] : null; $data['bucket_name'] = isset($resourceData[2]) ? $resourceData[2] : null; return $data; } /** * * @param array $data */ public static function validate(array $data) { Arn::validate($data); if ($data['service'] !== 's3-outposts') { throw new InvalidArnException("The 3rd component of an S3 Outposts" . " bucket ARN represents the service and must be 's3-outposts'."); } self::validateRegion($data, 'S3 Outposts bucket ARN'); self::validateAccountId($data, 'S3 Outposts bucket ARN'); if ($data['resource_type'] !== 'outpost') { throw new InvalidArnException("The 6th component of an S3 Outposts" . " bucket ARN represents the resource type and must be" . " 'outpost'."); } if (!self::isValidHostLabel($data['outpost_id'])) { throw new InvalidArnException("The 7th component of an S3 Outposts" . " bucket ARN is required, represents the outpost ID, and" . " must be a valid host label."); } if ($data['bucket_label'] !== 'bucket') { throw new InvalidArnException("The 8th component of an S3 Outposts" . " bucket ARN must be 'bucket'"); } if (empty($data['bucket_name'])) { throw new InvalidArnException("The 9th component of an S3 Outposts" . " bucket ARN represents the bucket name and must not be empty."); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Arn/Arn.php000064400000011265147600374260021364 0ustar00 null, 'partition' => null, 'service' => null, 'region' => null, 'account_id' => null, 'resource' => null]; $length = \strlen($string); $lastDelim = 0; $numComponents = 0; for ($i = 0; $i < $length; $i++) { if ($numComponents < 5 && $string[$i] === ':') { // Split components between delimiters $data[\key($data)] = \substr($string, $lastDelim, $i - $lastDelim); // Do not include delimiter character itself $lastDelim = $i + 1; \next($data); $numComponents++; } if ($i === $length - 1) { // Put the remainder in the last component. if (\in_array($numComponents, [5])) { $data['resource'] = \substr($string, $lastDelim); } else { // If there are < 5 components, put remainder in current // component. $data[\key($data)] = \substr($string, $lastDelim); } } } return $data; } public function __construct($data) { if (\is_array($data)) { $this->data = $data; } elseif (\is_string($data)) { $this->data = static::parse($data); } else { throw new InvalidArnException('Constructor accepts a string or an' . ' array as an argument.'); } static::validate($this->data); } public function __toString() { if (!isset($this->string)) { $components = [$this->getPrefix(), $this->getPartition(), $this->getService(), $this->getRegion(), $this->getAccountId(), $this->getResource()]; $this->string = \implode(':', $components); } return $this->string; } public function getPrefix() { return $this->data['arn']; } public function getPartition() { return $this->data['partition']; } public function getService() { return $this->data['service']; } public function getRegion() { return $this->data['region']; } public function getAccountId() { return $this->data['account_id']; } public function getResource() { return $this->data['resource']; } public function toArray() { return $this->data; } /** * Minimally restrictive generic ARN validation * * @param array $data */ protected static function validate(array $data) { if ($data['arn'] !== 'arn') { throw new InvalidArnException("The 1st component of an ARN must be" . " 'arn'."); } if (empty($data['partition'])) { throw new InvalidArnException("The 2nd component of an ARN" . " represents the partition and must not be empty."); } if (empty($data['service'])) { throw new InvalidArnException("The 3rd component of an ARN" . " represents the service and must not be empty."); } if (empty($data['resource'])) { throw new InvalidArnException("The 6th component of an ARN" . " represents the resource information and must not be empty." . " Individual service ARNs may include additional delimiters" . " to further qualify resources."); } } protected static function validateAccountId($data, $arnName) { if (!self::isValidHostLabel($data['account_id'])) { throw new InvalidArnException("The 5th component of a {$arnName}" . " is required, represents the account ID, and" . " must be a valid host label."); } } protected static function validateRegion($data, $arnName) { if (empty($data['region'])) { throw new InvalidArnException("The 4th component of a {$arnName}" . " represents the region and must not be empty."); } } /** * Validates whether a string component is a valid host label * * @param $string * @return bool */ protected static function isValidHostLabel($string) { if (empty($string) || \strlen($string) > 63) { return \false; } if ($value = \preg_match("/^[a-zA-Z0-9-]+\$/", $string)) { return \true; } return \false; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Arn/ArnParser.php000064400000004231147600374260022534 0ustar00data); } public static function parse($string) { $data = parent::parse($string); $data = self::parseResourceTypeAndId($data); $data['accesspoint_name'] = $data['resource_id']; return $data; } public function getAccesspointName() { return $this->data['accesspoint_name']; } /** * Validation specific to AccessPointArn * * @param array $data */ protected static function validate(array $data) { self::validateRegion($data, 'access point ARN'); self::validateAccountId($data, 'access point ARN'); if ($data['resource_type'] !== 'accesspoint') { throw new InvalidArnException("The 6th component of an access point ARN" . " represents the resource type and must be 'accesspoint'."); } if (empty($data['resource_id'])) { throw new InvalidArnException("The 7th component of an access point ARN" . " represents the resource ID and must not be empty."); } if (\strpos($data['resource_id'], ':') !== \false) { throw new InvalidArnException("The resource ID component of an access" . " point ARN must not contain additional components" . " (delimited by ':')."); } if (!self::isValidHostLabel($data['resource_id'])) { throw new InvalidArnException("The resource ID in an access point ARN" . " must be a valid host label value."); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Arn/ArnInterface.php000064400000001553147600374260023204 0ustar00data['resource_type']; } public function getResourceId() { return $this->data['resource_id']; } protected static function parseResourceTypeAndId(array $data) { $resourceData = \preg_split("/[\\/:]/", $data['resource'], 2); $data['resource_type'] = isset($resourceData[0]) ? $resourceData[0] : null; $data['resource_id'] = isset($resourceData[1]) ? $resourceData[1] : null; return $data; } } vendor-prefixed/aws/aws-sdk-php/src/ClientSideMonitoring/Exception/ConfigurationException.php000064400000000612147600374260032554 0ustar00addons/amazons3addon $request->getUri()->getHost()]; } /** * {@inheritdoc} */ public static function getResponseData($klass) { if ($klass instanceof ResultInterface) { return ['AttemptLatency' => self::getResultAttemptLatency($klass), 'DestinationIp' => self::getResultDestinationIp($klass), 'DnsLatency' => self::getResultDnsLatency($klass), 'HttpStatusCode' => self::getResultHttpStatusCode($klass), 'XAmzId2' => self::getResultHeader($klass, 'x-amz-id-2'), 'XAmzRequestId' => self::getResultHeader($klass, 'x-amz-request-id'), 'XAmznRequestId' => self::getResultHeader($klass, 'x-amzn-RequestId')]; } if ($klass instanceof AwsException) { return ['AttemptLatency' => self::getAwsExceptionAttemptLatency($klass), 'VendorDuplicator\\AwsException' => \substr(self::getAwsExceptionErrorCode($klass), 0, 128), 'VendorDuplicator\\AwsExceptionMessage' => \substr(self::getAwsExceptionMessage($klass), 0, 512), 'DestinationIp' => self::getAwsExceptionDestinationIp($klass), 'DnsLatency' => self::getAwsExceptionDnsLatency($klass), 'HttpStatusCode' => self::getAwsExceptionHttpStatusCode($klass), 'XAmzId2' => self::getAwsExceptionHeader($klass, 'x-amz-id-2'), 'XAmzRequestId' => self::getAwsExceptionHeader($klass, 'x-amz-request-id'), 'XAmznRequestId' => self::getAwsExceptionHeader($klass, 'x-amzn-RequestId')]; } if ($klass instanceof \Exception) { return ['HttpStatusCode' => self::getExceptionHttpStatusCode($klass), 'SdkException' => \substr(self::getExceptionCode($klass), 0, 128), 'SdkExceptionMessage' => \substr(self::getExceptionMessage($klass), 0, 512), 'XAmzId2' => self::getExceptionHeader($klass, 'x-amz-id-2'), 'XAmzRequestId' => self::getExceptionHeader($klass, 'x-amz-request-id'), 'XAmznRequestId' => self::getExceptionHeader($klass, 'x-amzn-RequestId')]; } throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface, AwsException or Exception.'); } private static function getResultAttemptLatency(ResultInterface $result) { if (isset($result['@metadata']['transferStats']['http'])) { $attempt = \end($result['@metadata']['transferStats']['http']); if (isset($attempt['total_time'])) { return (int) \floor($attempt['total_time'] * 1000); } } return null; } private static function getResultDestinationIp(ResultInterface $result) { if (isset($result['@metadata']['transferStats']['http'])) { $attempt = \end($result['@metadata']['transferStats']['http']); if (isset($attempt['primary_ip'])) { return $attempt['primary_ip']; } } return null; } private static function getResultDnsLatency(ResultInterface $result) { if (isset($result['@metadata']['transferStats']['http'])) { $attempt = \end($result['@metadata']['transferStats']['http']); if (isset($attempt['namelookup_time'])) { return (int) \floor($attempt['namelookup_time'] * 1000); } } return null; } private static function getResultHttpStatusCode(ResultInterface $result) { return $result['@metadata']['statusCode']; } private static function getAwsExceptionAttemptLatency(AwsException $e) { $attempt = $e->getTransferInfo(); if (isset($attempt['total_time'])) { return (int) \floor($attempt['total_time'] * 1000); } return null; } private static function getAwsExceptionErrorCode(AwsException $e) { return $e->getAwsErrorCode(); } private static function getAwsExceptionMessage(AwsException $e) { return $e->getAwsErrorMessage(); } private static function getAwsExceptionDestinationIp(AwsException $e) { $attempt = $e->getTransferInfo(); if (isset($attempt['primary_ip'])) { return $attempt['primary_ip']; } return null; } private static function getAwsExceptionDnsLatency(AwsException $e) { $attempt = $e->getTransferInfo(); if (isset($attempt['namelookup_time'])) { return (int) \floor($attempt['namelookup_time'] * 1000); } return null; } private static function getAwsExceptionHttpStatusCode(AwsException $e) { $response = $e->getResponse(); if ($response !== null) { return $response->getStatusCode(); } return null; } private static function getExceptionHttpStatusCode(\Exception $e) { if ($e instanceof ResponseContainerInterface) { $response = $e->getResponse(); if ($response instanceof ResponseInterface) { return $response->getStatusCode(); } } return null; } private static function getExceptionCode(\Exception $e) { if (!$e instanceof AwsException) { return \get_class($e); } return null; } private static function getExceptionMessage(\Exception $e) { if (!$e instanceof AwsException) { return $e->getMessage(); } return null; } /** * {@inheritdoc} */ protected function populateRequestEventData(CommandInterface $cmd, RequestInterface $request, array $event) { $event = parent::populateRequestEventData($cmd, $request, $event); $event['Type'] = 'ApiCallAttempt'; return $event; } /** * {@inheritdoc} */ protected function populateResultEventData($result, array $event) { $event = parent::populateResultEventData($result, $event); $provider = $this->credentialProvider; /** @var CredentialsInterface $credentials */ $credentials = $provider()->wait(); $event['AccessKey'] = $credentials->getAccessKeyId(); $sessionToken = $credentials->getSecurityToken(); if ($sessionToken !== null) { $event['SessionToken'] = $sessionToken; } if (empty($event['AttemptLatency'])) { $event['AttemptLatency'] = (int) (\floor(\microtime(\true) * 1000) - $event['Timestamp']); } return $event; } } vendor-prefixed/aws/aws-sdk-php/src/ClientSideMonitoring/ApiCallMonitoringMiddleware.php000064400000010635147600374260031507 0ustar00addons/amazons3addon 'VendorDuplicator\\AwsException', 'FinalAwsExceptionMessage' => 'VendorDuplicator\\AwsExceptionMessage', 'FinalSdkException' => 'SdkException', 'FinalSdkExceptionMessage' => 'SdkExceptionMessage', 'FinalHttpStatusCode' => 'HttpStatusCode']; /** * Standard middleware wrapper function with CSM options passed in. * * @param callable $credentialProvider * @param mixed $options * @param string $region * @param string $service * @return callable */ public static function wrap(callable $credentialProvider, $options, $region, $service) { return function (callable $handler) use($credentialProvider, $options, $region, $service) { return new static($handler, $credentialProvider, $options, $region, $service); }; } /** * {@inheritdoc} */ public static function getRequestData(RequestInterface $request) { return []; } /** * {@inheritdoc} */ public static function getResponseData($klass) { if ($klass instanceof ResultInterface) { $data = ['AttemptCount' => self::getResultAttemptCount($klass), 'MaxRetriesExceeded' => 0]; } elseif ($klass instanceof \Exception) { $data = ['AttemptCount' => self::getExceptionAttemptCount($klass), 'MaxRetriesExceeded' => self::getMaxRetriesExceeded($klass)]; } else { throw new \InvalidArgumentException('Parameter must be an instance of ResultInterface or Exception.'); } return $data + self::getFinalAttemptData($klass); } private static function getResultAttemptCount(ResultInterface $result) { if (isset($result['@metadata']['transferStats']['http'])) { return \count($result['@metadata']['transferStats']['http']); } return 1; } private static function getExceptionAttemptCount(\Exception $e) { $attemptCount = 0; if ($e instanceof MonitoringEventsInterface) { foreach ($e->getMonitoringEvents() as $event) { if (isset($event['Type']) && $event['Type'] === 'ApiCallAttempt') { $attemptCount++; } } } return $attemptCount; } private static function getFinalAttemptData($klass) { $data = []; if ($klass instanceof MonitoringEventsInterface) { $finalAttempt = self::getFinalAttempt($klass->getMonitoringEvents()); if (!empty($finalAttempt)) { foreach (self::$eventKeys as $callKey => $attemptKey) { if (isset($finalAttempt[$attemptKey])) { $data[$callKey] = $finalAttempt[$attemptKey]; } } } } return $data; } private static function getFinalAttempt(array $events) { for (\end($events); \key($events) !== null; \prev($events)) { $current = \current($events); if (isset($current['Type']) && $current['Type'] === 'ApiCallAttempt') { return $current; } } return null; } private static function getMaxRetriesExceeded($klass) { if ($klass instanceof AwsException && $klass->isMaxRetriesExceeded()) { return 1; } return 0; } /** * {@inheritdoc} */ protected function populateRequestEventData(CommandInterface $cmd, RequestInterface $request, array $event) { $event = parent::populateRequestEventData($cmd, $request, $event); $event['Type'] = 'ApiCall'; return $event; } /** * {@inheritdoc} */ protected function populateResultEventData($result, array $event) { $event = parent::populateResultEventData($result, $event); $event['Latency'] = (int) (\floor(\microtime(\true) * 1000) - $event['Timestamp']); return $event; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ClientSideMonitoring/Configuration.php000064400000003070147600374260027017 0ustar00host = $host; $this->port = \filter_var($port, \FILTER_VALIDATE_INT); if ($this->port === \false) { throw new \InvalidArgumentException("CSM 'port' value must be an integer!"); } // Unparsable $enabled flag errors on the side of disabling CSM $this->enabled = \filter_var($enabled, \FILTER_VALIDATE_BOOLEAN); $this->clientId = \trim($clientId); } /** * {@inheritdoc} */ public function isEnabled() { return $this->enabled; } /** * {@inheritdoc} */ public function getClientId() { return $this->clientId; } /** * /{@inheritdoc} */ public function getHost() { return $this->host; } /** * {@inheritdoc} */ public function getPort() { return $this->port; } /** * {@inheritdoc} */ public function toArray() { return ['client_id' => $this->getClientId(), 'enabled' => $this->isEnabled(), 'host' => $this->getHost(), 'port' => $this->getPort()]; } } vendor-prefixed/aws/aws-sdk-php/src/ClientSideMonitoring/MonitoringMiddlewareInterface.php000064400000001573147600374260032103 0ustar00addons/amazons3addongetResponse(); if ($response !== null) { $header = $response->getHeader($headerName); if (!empty($header[0])) { return $header[0]; } } return null; } protected static function getResultHeader(ResultInterface $result, $headerName) { if (isset($result['@metadata']['headers'][$headerName])) { return $result['@metadata']['headers'][$headerName]; } return null; } protected static function getExceptionHeader(\Exception $e, $headerName) { if ($e instanceof ResponseContainerInterface) { $response = $e->getResponse(); if ($response instanceof ResponseInterface) { $header = $response->getHeader($headerName); if (!empty($header[0])) { return $header[0]; } } } return null; } /** * Constructor stores the passed in handler and options. * * @param callable $handler * @param callable $credentialProvider * @param $options * @param $region * @param $service */ public function __construct(callable $handler, callable $credentialProvider, $options, $region, $service) { $this->nextHandler = $handler; $this->credentialProvider = $credentialProvider; $this->options = $options; $this->region = $region; $this->service = $service; } /** * Standard invoke pattern for middleware execution to be implemented by * child classes. * * @param CommandInterface $cmd * @param RequestInterface $request * @return Promise\PromiseInterface */ public function __invoke(CommandInterface $cmd, RequestInterface $request) { $handler = $this->nextHandler; $eventData = null; $enabled = $this->isEnabled(); if ($enabled) { $cmd['@http']['collect_stats'] = \true; $eventData = $this->populateRequestEventData($cmd, $request, $this->getNewEvent($cmd, $request)); } $g = function ($value) use($eventData, $enabled) { if ($enabled) { $eventData = $this->populateResultEventData($value, $eventData); $this->sendEventData($eventData); if ($value instanceof MonitoringEventsInterface) { $value->appendMonitoringEvent($eventData); } } if ($value instanceof \Exception || $value instanceof \Throwable) { return Promise\Create::rejectionFor($value); } return $value; }; return Promise\Create::promiseFor($handler($cmd, $request))->then($g, $g); } private function getClientId() { return $this->unwrappedOptions()->getClientId(); } private function getNewEvent(CommandInterface $cmd, RequestInterface $request) { $event = ['Api' => $cmd->getName(), 'ClientId' => $this->getClientId(), 'Region' => $this->getRegion(), 'Service' => $this->getService(), 'Timestamp' => (int) \floor(\microtime(\true) * 1000), 'UserAgent' => \substr($request->getHeaderLine('User-Agent') . ' ' . \VendorDuplicator\Aws\default_user_agent(), 0, 256), 'Version' => 1]; return $event; } private function getHost() { return $this->unwrappedOptions()->getHost(); } private function getPort() { return $this->unwrappedOptions()->getPort(); } private function getRegion() { return $this->region; } private function getService() { return $this->service; } /** * Returns enabled flag from options, unwrapping options if necessary. * * @return bool */ private function isEnabled() { return $this->unwrappedOptions()->isEnabled(); } /** * Returns $eventData array with information from the request and command. * * @param CommandInterface $cmd * @param RequestInterface $request * @param array $event * @return array */ protected function populateRequestEventData(CommandInterface $cmd, RequestInterface $request, array $event) { $dataFormat = static::getRequestData($request); foreach ($dataFormat as $eventKey => $value) { if ($value !== null) { $event[$eventKey] = $value; } } return $event; } /** * Returns $eventData array with information from the response, including * the calculation for attempt latency. * * @param ResultInterface|\Exception $result * @param array $event * @return array */ protected function populateResultEventData($result, array $event) { $dataFormat = static::getResponseData($result); foreach ($dataFormat as $eventKey => $value) { if ($value !== null) { $event[$eventKey] = $value; } } return $event; } /** * Creates a UDP socket resource and stores it with the class, or retrieves * it if already instantiated and connected. Handles error-checking and * re-connecting if necessary. If $forceNewConnection is set to true, a new * socket will be created. * * @param bool $forceNewConnection * @return Resource */ private function prepareSocket($forceNewConnection = \false) { if (!\is_resource(self::$socket) || $forceNewConnection || \socket_last_error(self::$socket)) { self::$socket = \socket_create(\AF_INET, \SOCK_DGRAM, \SOL_UDP); \socket_clear_error(self::$socket); \socket_connect(self::$socket, $this->getHost(), $this->getPort()); } return self::$socket; } /** * Sends formatted monitoring event data via the UDP socket connection to * the CSM agent endpoint. * * @param array $eventData * @return int */ private function sendEventData(array $eventData) { $socket = $this->prepareSocket(); $datagram = \json_encode($eventData); $result = \socket_write($socket, $datagram, \strlen($datagram)); if ($result === \false) { $this->prepareSocket(\true); } return $result; } /** * Unwraps options, if needed, and returns them. * * @return ConfigurationInterface */ private function unwrappedOptions() { if (!$this->options instanceof ConfigurationInterface) { try { $this->options = ConfigurationProvider::unwrap($this->options); } catch (\Exception $e) { // Errors unwrapping CSM config defaults to disabling it $this->options = new Configuration(\false, ConfigurationProvider::DEFAULT_HOST, ConfigurationProvider::DEFAULT_PORT); } } return $this->options; } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ClientSideMonitoring/ConfigurationInterface.php000064400000001521147600374260030560 0ustar00addons * use Aws\ClientSideMonitoring\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see Aws\ClientSideMonitoring\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const DEFAULT_CLIENT_ID = ''; const DEFAULT_ENABLED = \false; const DEFAULT_HOST = '127.0.0.1'; const DEFAULT_PORT = 31000; const ENV_CLIENT_ID = 'AWS_CSM_CLIENT_ID'; const ENV_ENABLED = 'AWS_CSM_ENABLED'; const ENV_HOST = 'AWS_CSM_HOST'; const ENV_PORT = 'AWS_CSM_PORT'; const ENV_PROFILE = 'AWS_PROFILE'; public static $cacheKey = 'aws_cached_csm_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback(); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['csm']) && $config['csm'] instanceof CacheInterface) { return self::cache($memo, $config['csm'], self::$cacheKey); } return $memo; } /** * Provider that creates CSM config from environment variables. * * @return callable */ public static function env() { return function () { // Use credentials from environment variables, if available $enabled = \getenv(self::ENV_ENABLED); if ($enabled !== \false) { return Promise\Create::promiseFor(new Configuration($enabled, \getenv(self::ENV_HOST) ?: self::DEFAULT_HOST, \getenv(self::ENV_PORT) ?: self::DEFAULT_PORT, \getenv(self::ENV_CLIENT_ID) ?: self::DEFAULT_CLIENT_ID)); } return self::reject('Could not find environment variable CSM config' . ' in ' . self::ENV_ENABLED . '/' . self::ENV_HOST . '/' . self::ENV_PORT . '/' . self::ENV_CLIENT_ID); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback() { return function () { return Promise\Create::promiseFor(new Configuration(self::DEFAULT_ENABLED, self::DEFAULT_HOST, self::DEFAULT_PORT, self::DEFAULT_CLIENT_ID)); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'aws_csm'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read CSM config from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile]['csm_enabled'])) { return self::reject("Required CSM config values not present in\n INI profile '{$profile}' ({$filename})"); } // host is optional if (empty($data[$profile]['csm_host'])) { $data[$profile]['csm_host'] = self::DEFAULT_HOST; } // port is optional if (empty($data[$profile]['csm_port'])) { $data[$profile]['csm_port'] = self::DEFAULT_PORT; } // client_id is optional if (empty($data[$profile]['csm_client_id'])) { $data[$profile]['csm_client_id'] = self::DEFAULT_CLIENT_ID; } return Promise\Create::promiseFor(new Configuration($data[$profile]['csm_enabled'], $data[$profile]['csm_host'], $data[$profile]['csm_port'], $data[$profile]['csm_client_id'])); }; } /** * Unwraps a configuration object in whatever valid form it is in, * always returning a ConfigurationInterface object. * * @param mixed $config * @return ConfigurationInterface * @throws \InvalidArgumentException */ public static function unwrap($config) { if (\is_callable($config)) { $config = $config(); } if ($config instanceof PromiseInterface) { $config = $config->wait(); } if ($config instanceof ConfigurationInterface) { return $config; } elseif (\is_array($config) && isset($config['enabled'])) { $client_id = isset($config['client_id']) ? $config['client_id'] : self::DEFAULT_CLIENT_ID; $host = isset($config['host']) ? $config['host'] : self::DEFAULT_HOST; $port = isset($config['port']) ? $config['port'] : self::DEFAULT_PORT; return new Configuration($config['enabled'], $host, $port, $client_id); } throw new \InvalidArgumentException('Not a valid CSM configuration ' . 'argument.'); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Configuration/ConfigurationResolver.php000064400000013105147600374260027257 0ustar00 * use Aws\Credentials\CredentialProvider; * $provider = CredentialProvider::defaultProvider(); * // Returns a CredentialsInterface or throws. * $creds = $provider()->wait(); * * * Credential providers can be composed to create credentials using conditional * logic that can create different credentials in different environments. You * can compose multiple providers into a single provider using * {@see Aws\Credentials\CredentialProvider::chain}. This function accepts * providers as variadic arguments and returns a new function that will invoke * each provider until a successful set of credentials is returned. * * * // First try an INI file at this location. * $a = CredentialProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = CredentialProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = CredentialProvider::env(); * // Combine the three providers together. * $composed = CredentialProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with credentials or throws. * $promise = $composed(); * // Wait on the credentials to resolve. * $creds = $promise->wait(); * */ class CredentialProvider { const ENV_ARN = 'AWS_ROLE_ARN'; const ENV_KEY = 'AWS_ACCESS_KEY_ID'; const ENV_PROFILE = 'AWS_PROFILE'; const ENV_ROLE_SESSION_NAME = 'AWS_ROLE_SESSION_NAME'; const ENV_SECRET = 'AWS_SECRET_ACCESS_KEY'; const ENV_SESSION = 'AWS_SESSION_TOKEN'; const ENV_TOKEN_FILE = 'AWS_WEB_IDENTITY_TOKEN_FILE'; const ENV_SHARED_CREDENTIALS_FILE = 'AWS_SHARED_CREDENTIALS_FILE'; /** * Create a default credential provider that * first checks for environment variables, * then checks for assumed role via web identity, * then checks for cached SSO credentials from the CLI, * then check for credential_process in the "default" profile in ~/.aws/credentials, * then checks for the "default" profile in ~/.aws/credentials, * then for credential_process in the "default profile" profile in ~/.aws/config, * then checks for "profile default" profile in ~/.aws/config (which is * the default profile of AWS CLI), * then tries to make a GET Request to fetch credentials if ECS environment variable is presented, * finally checks for EC2 instance profile credentials. * * This provider is automatically wrapped in a memoize function that caches * previously provided credentials. * * @param array $config Optional array of ecs/instance profile credentials * provider options. * * @return callable */ public static function defaultProvider(array $config = []) { $cacheable = ['web_identity', 'sso', 'process_credentials', 'process_config', 'ecs', 'instance']; $profileName = \getenv(self::ENV_PROFILE) ?: 'default'; $defaultChain = ['env' => self::env(), 'web_identity' => self::assumeRoleWithWebIdentityCredentialProvider($config)]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] !== \false) { $defaultChain['sso'] = self::sso($profileName, self::getHomeDir() . '/.aws/config', $config); $defaultChain['process_credentials'] = self::process(); $defaultChain['ini'] = self::ini(); $defaultChain['process_config'] = self::process('profile ' . $profileName, self::getHomeDir() . '/.aws/config'); $defaultChain['ini_config'] = self::ini('profile ' . $profileName, self::getHomeDir() . '/.aws/config'); } if (self::shouldUseEcs()) { $defaultChain['ecs'] = self::ecsCredentials($config); } else { $defaultChain['instance'] = self::instanceProfile($config); } if (isset($config['credentials']) && $config['credentials'] instanceof CacheInterface) { foreach ($cacheable as $provider) { if (isset($defaultChain[$provider])) { $defaultChain[$provider] = self::cache($defaultChain[$provider], $config['credentials'], 'aws_cached_' . $provider . '_credentials'); } } } return self::memoize(\call_user_func_array([CredentialProvider::class, 'chain'], \array_values($defaultChain))); } /** * Create a credential provider function from a set of static credentials. * * @param CredentialsInterface $creds * * @return callable */ public static function fromCredentials(CredentialsInterface $creds) { $promise = Promise\Create::promiseFor($creds); return function () use($promise) { return $promise; }; } /** * Creates an aggregate credentials provider that invokes the provided * variadic providers one after the other until a provider returns * credentials. * * @return callable */ public static function chain() { $links = \func_get_args(); if (empty($links)) { throw new \InvalidArgumentException('No providers in chain'); } return function ($previousCreds = null) use($links) { /** @var callable $parent */ $parent = \array_shift($links); $promise = $parent(); while ($next = \array_shift($links)) { if ($next instanceof InstanceProfileProvider && $previousCreds instanceof Credentials) { $promise = $promise->otherwise(function () use($next, $previousCreds) { return $next($previousCreds); }); } else { $promise = $promise->otherwise($next); } } return $promise; }; } /** * Wraps a credential provider and caches previously provided credentials. * * Ensures that cached credentials are refreshed when they expire. * * @param callable $provider Credentials provider function to wrap. * * @return callable */ public static function memoize(callable $provider) { return function () use($provider) { static $result; static $isConstant; // Constant credentials will be returned constantly. if ($isConstant) { return $result; } // Create the initial promise that will be used as the cached value // until it expires. if (null === $result) { $result = $provider(); } // Return credentials that could expire and refresh when needed. return $result->then(function (CredentialsInterface $creds) use($provider, &$isConstant, &$result) { // Determine if these are constant credentials. if (!$creds->getExpiration()) { $isConstant = \true; return $creds; } // Refresh expired credentials. if (!$creds->isExpired()) { return $creds; } // Refresh the result and forward the promise. return $result = $provider($creds); })->otherwise(function ($reason) use(&$result) { // Cleanup rejected promise. $result = null; return new Promise\RejectedPromise($reason); }); }; } /** * Wraps a credential provider and saves provided credentials in an * instance of Aws\CacheInterface. Forwards calls when no credentials found * in cache and updates cache with the results. * * @param callable $provider Credentials provider function to wrap * @param CacheInterface $cache Cache to store credentials * @param string|null $cacheKey (optional) Cache key to use * * @return callable */ public static function cache(callable $provider, CacheInterface $cache, $cacheKey = null) { $cacheKey = $cacheKey ?: 'aws_cached_credentials'; return function () use($provider, $cache, $cacheKey) { $found = $cache->get($cacheKey); if ($found instanceof CredentialsInterface && !$found->isExpired()) { return Promise\Create::promiseFor($found); } return $provider()->then(function (CredentialsInterface $creds) use($cache, $cacheKey) { $cache->set($cacheKey, $creds, null === $creds->getExpiration() ? 0 : $creds->getExpiration() - \time()); return $creds; }); }; } /** * Provider that creates credentials from environment variables * AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and AWS_SESSION_TOKEN. * * @return callable */ public static function env() { return function () { // Use credentials from environment variables, if available $key = \getenv(self::ENV_KEY); $secret = \getenv(self::ENV_SECRET); if ($key && $secret) { return Promise\Create::promiseFor(new Credentials($key, $secret, \getenv(self::ENV_SESSION) ?: NULL)); } return self::reject('Could not find environment variable ' . 'credentials in ' . self::ENV_KEY . '/' . self::ENV_SECRET); }; } /** * Credential provider that creates credentials using instance profile * credentials. * * @param array $config Array of configuration data. * * @return InstanceProfileProvider * @see Aws\Credentials\InstanceProfileProvider for $config details. */ public static function instanceProfile(array $config = []) { return new InstanceProfileProvider($config); } /** * Credential provider that retrieves cached SSO credentials from the CLI * * @return callable */ public static function sso($ssoProfileName = 'default', $filename = null, $config = []) { $filename = $filename ?: self::getHomeDir() . '/.aws/config'; return function () use($ssoProfileName, $filename, $config) { if (!@\is_readable($filename)) { return self::reject("Cannot read credentials from {$filename}"); } $profiles = self::loadProfiles($filename); if (isset($profiles[$ssoProfileName])) { $ssoProfile = $profiles[$ssoProfileName]; } elseif (isset($profiles['profile ' . $ssoProfileName])) { $ssoProfileName = 'profile ' . $ssoProfileName; $ssoProfile = $profiles[$ssoProfileName]; } else { return self::reject("Profile {$ssoProfileName} does not exist in {$filename}."); } if (!empty($ssoProfile['sso_session'])) { return CredentialProvider::getSsoCredentials($profiles, $ssoProfileName, $filename, $config); } else { return CredentialProvider::getSsoCredentialsLegacy($profiles, $ssoProfileName, $filename, $config); } }; } /** * Credential provider that creates credentials using * ecs credentials by a GET request, whose uri is specified * by environment variable * * @param array $config Array of configuration data. * * @return EcsCredentialProvider * @see Aws\Credentials\EcsCredentialProvider for $config details. */ public static function ecsCredentials(array $config = []) { return new EcsCredentialProvider($config); } /** * Credential provider that creates credentials using assume role * * @param array $config Array of configuration data * @return callable * @see Aws\Credentials\AssumeRoleCredentialProvider for $config details. */ public static function assumeRole(array $config = []) { return new AssumeRoleCredentialProvider($config); } /** * Credential provider that creates credentials by assuming role from a * Web Identity Token * * @param array $config Array of configuration data * @return callable * @see Aws\Credentials\AssumeRoleWithWebIdentityCredentialProvider for * $config details. */ public static function assumeRoleWithWebIdentityCredentialProvider(array $config = []) { return function () use($config) { $arnFromEnv = \getenv(self::ENV_ARN); $tokenFromEnv = \getenv(self::ENV_TOKEN_FILE); $stsClient = isset($config['stsClient']) ? $config['stsClient'] : null; $region = isset($config['region']) ? $config['region'] : null; if ($tokenFromEnv && $arnFromEnv) { $sessionName = \getenv(self::ENV_ROLE_SESSION_NAME) ? \getenv(self::ENV_ROLE_SESSION_NAME) : null; $provider = new AssumeRoleWithWebIdentityCredentialProvider(['RoleArn' => $arnFromEnv, 'WebIdentityTokenFile' => $tokenFromEnv, 'SessionName' => $sessionName, 'client' => $stsClient, 'region' => $region]); return $provider(); } $profileName = \getenv(self::ENV_PROFILE) ?: 'default'; if (isset($config['filename'])) { $profiles = self::loadProfiles($config['filename']); } else { $profiles = self::loadDefaultProfiles(); } if (isset($profiles[$profileName])) { $profile = $profiles[$profileName]; if (isset($profile['region'])) { $region = $profile['region']; } if (isset($profile['web_identity_token_file']) && isset($profile['role_arn'])) { $sessionName = isset($profile['role_session_name']) ? $profile['role_session_name'] : null; $provider = new AssumeRoleWithWebIdentityCredentialProvider(['RoleArn' => $profile['role_arn'], 'WebIdentityTokenFile' => $profile['web_identity_token_file'], 'SessionName' => $sessionName, 'client' => $stsClient, 'region' => $region]); return $provider(); } } else { return self::reject("Unknown profile: {$profileName}"); } return self::reject("No RoleArn or WebIdentityTokenFile specified"); }; } /** * Credentials provider that creates credentials using an ini file stored * in the current user's home directory. A source can be provided * in this file for assuming a role using the credential_source config option. * * @param string|null $profile Profile to use. If not specified will use * the "default" profile in "~/.aws/credentials". * @param string|null $filename If provided, uses a custom filename rather * than looking in the home directory. * @param array|null $config If provided, may contain the following: * preferStaticCredentials: If true, prefer static * credentials to role_arn if both are present * disableAssumeRole: If true, disable support for * roles that assume an IAM role. If true and role profile * is selected, an error is raised. * stsClient: StsClient used to assume role specified in profile * * @return callable */ public static function ini($profile = null, $filename = null, array $config = []) { $filename = self::getFileName($filename); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename, $config) { $preferStaticCredentials = isset($config['preferStaticCredentials']) ? $config['preferStaticCredentials'] : \false; $disableAssumeRole = isset($config['disableAssumeRole']) ? $config['disableAssumeRole'] : \false; $stsClient = isset($config['stsClient']) ? $config['stsClient'] : null; if (!@\is_readable($filename)) { return self::reject("Cannot read credentials from {$filename}"); } $data = self::loadProfiles($filename); if ($data === \false) { return self::reject("Invalid credentials file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in credentials file"); } /* In the CLI, the presence of both a role_arn and static credentials have different meanings depending on how many profiles have been visited. For the first profile processed, role_arn takes precedence over any static credentials, but for all subsequent profiles, static credentials are used if present, and only in their absence will the profile's source_profile and role_arn keys be used to load another set of credentials. This bool is intended to yield compatible behaviour in this sdk. */ $preferStaticCredentialsToRoleArn = $preferStaticCredentials && isset($data[$profile]['aws_access_key_id']) && isset($data[$profile]['aws_secret_access_key']); if (isset($data[$profile]['role_arn']) && !$preferStaticCredentialsToRoleArn) { if ($disableAssumeRole) { return self::reject("Role assumption profiles are disabled. " . "Failed to load profile " . $profile); } return self::loadRoleProfile($data, $profile, $filename, $stsClient, $config); } if (!isset($data[$profile]['aws_access_key_id']) || !isset($data[$profile]['aws_secret_access_key'])) { return self::reject("No credentials present in INI profile " . "'{$profile}' ({$filename})"); } if (empty($data[$profile]['aws_session_token'])) { $data[$profile]['aws_session_token'] = isset($data[$profile]['aws_security_token']) ? $data[$profile]['aws_security_token'] : null; } return Promise\Create::promiseFor(new Credentials($data[$profile]['aws_access_key_id'], $data[$profile]['aws_secret_access_key'], $data[$profile]['aws_session_token'])); }; } /** * Credentials provider that creates credentials using a process configured in * ini file stored in the current user's home directory. * * @param string|null $profile Profile to use. If not specified will use * the "default" profile in "~/.aws/credentials". * @param string|null $filename If provided, uses a custom filename rather * than looking in the home directory. * * @return callable */ public static function process($profile = null, $filename = null) { $filename = self::getFileName($filename); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read process credentials from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true, \INI_SCANNER_RAW); if ($data === \false) { return self::reject("Invalid credentials file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in credentials file"); } if (!isset($data[$profile]['credential_process'])) { return self::reject("No credential_process present in INI profile " . "'{$profile}' ({$filename})"); } $credentialProcess = $data[$profile]['credential_process']; $json = \shell_exec($credentialProcess); $processData = \json_decode($json, \true); // Only support version 1 if (isset($processData['Version'])) { if ($processData['Version'] !== 1) { return self::reject("credential_process does not return Version == 1"); } } if (!isset($processData['AccessKeyId']) || !isset($processData['SecretAccessKey'])) { return self::reject("credential_process does not return valid credentials"); } if (isset($processData['Expiration'])) { try { $expiration = new DateTimeResult($processData['Expiration']); } catch (\Exception $e) { return self::reject("credential_process returned invalid expiration"); } $now = new DateTimeResult(); if ($expiration < $now) { return self::reject("credential_process returned expired credentials"); } $expires = $expiration->getTimestamp(); } else { $expires = null; } if (empty($processData['SessionToken'])) { $processData['SessionToken'] = null; } return Promise\Create::promiseFor(new Credentials($processData['AccessKeyId'], $processData['SecretAccessKey'], $processData['SessionToken'], $expires)); }; } /** * Assumes role for profile that includes role_arn * * @return callable */ private static function loadRoleProfile($profiles, $profileName, $filename, $stsClient, $config = []) { $roleProfile = $profiles[$profileName]; $roleArn = isset($roleProfile['role_arn']) ? $roleProfile['role_arn'] : ''; $roleSessionName = isset($roleProfile['role_session_name']) ? $roleProfile['role_session_name'] : 'aws-sdk-php-' . \round(\microtime(\true) * 1000); if (empty($roleProfile['source_profile']) == empty($roleProfile['credential_source'])) { return self::reject("Either source_profile or credential_source must be set " . "using profile " . $profileName . ", but not both."); } $sourceProfileName = ""; if (!empty($roleProfile['source_profile'])) { $sourceProfileName = $roleProfile['source_profile']; if (!isset($profiles[$sourceProfileName])) { return self::reject("source_profile " . $sourceProfileName . " using profile " . $profileName . " does not exist"); } if (isset($config['visited_profiles']) && \in_array($roleProfile['source_profile'], $config['visited_profiles'])) { return self::reject("Circular source_profile reference found."); } $config['visited_profiles'][] = $roleProfile['source_profile']; } else { if (empty($roleArn)) { return self::reject("A role_arn must be provided with credential_source in " . "file {$filename} under profile {$profileName} "); } } if (empty($stsClient)) { $sourceRegion = isset($profiles[$sourceProfileName]['region']) ? $profiles[$sourceProfileName]['region'] : 'us-east-1'; $config['preferStaticCredentials'] = \true; $sourceCredentials = null; if (!empty($roleProfile['source_profile'])) { $sourceCredentials = \call_user_func(CredentialProvider::ini($sourceProfileName, $filename, $config))->wait(); } else { $sourceCredentials = self::getCredentialsFromSource($profileName, $filename); } $stsClient = new StsClient(['credentials' => $sourceCredentials, 'region' => $sourceRegion, 'version' => '2011-06-15']); } $result = $stsClient->assumeRole(['RoleArn' => $roleArn, 'RoleSessionName' => $roleSessionName]); $credentials = $stsClient->createCredentials($result); return Promise\Create::promiseFor($credentials); } /** * Gets the environment's HOME directory if available. * * @return null|string */ private static function getHomeDir() { // On Linux/Unix-like systems, use the HOME environment variable if ($homeDir = \getenv('HOME')) { return $homeDir; } // Get the HOMEDRIVE and HOMEPATH values for Windows hosts $homeDrive = \getenv('HOMEDRIVE'); $homePath = \getenv('HOMEPATH'); return $homeDrive && $homePath ? $homeDrive . $homePath : null; } /** * Gets profiles from specified $filename, or default ini files. */ private static function loadProfiles($filename) { $profileData = \VendorDuplicator\Aws\parse_ini_file($filename, \true, \INI_SCANNER_RAW); // If loading .aws/credentials, also load .aws/config when AWS_SDK_LOAD_NONDEFAULT_CONFIG is set if ($filename === self::getHomeDir() . '/.aws/credentials' && \getenv('AWS_SDK_LOAD_NONDEFAULT_CONFIG')) { $configFilename = self::getHomeDir() . '/.aws/config'; $configProfileData = \VendorDuplicator\Aws\parse_ini_file($configFilename, \true, \INI_SCANNER_RAW); foreach ($configProfileData as $name => $profile) { // standardize config profile names $name = \str_replace('profile ', '', $name); if (!isset($profileData[$name])) { $profileData[$name] = $profile; } } } return $profileData; } /** * Gets profiles from ~/.aws/credentials and ~/.aws/config ini files */ private static function loadDefaultProfiles() { $profiles = []; $credFile = self::getHomeDir() . '/.aws/credentials'; $configFile = self::getHomeDir() . '/.aws/config'; if (\file_exists($credFile)) { $profiles = \VendorDuplicator\Aws\parse_ini_file($credFile, \true, \INI_SCANNER_RAW); } if (\file_exists($configFile)) { $configProfileData = \VendorDuplicator\Aws\parse_ini_file($configFile, \true, \INI_SCANNER_RAW); foreach ($configProfileData as $name => $profile) { // standardize config profile names $name = \str_replace('profile ', '', $name); if (!isset($profiles[$name])) { $profiles[$name] = $profile; } } } return $profiles; } public static function getCredentialsFromSource($profileName = '', $filename = '', $config = []) { $data = self::loadProfiles($filename); $credentialSource = !empty($data[$profileName]['credential_source']) ? $data[$profileName]['credential_source'] : null; $credentialsPromise = null; switch ($credentialSource) { case 'Environment': $credentialsPromise = self::env(); break; case 'Ec2InstanceMetadata': $credentialsPromise = self::instanceProfile($config); break; case 'EcsContainer': $credentialsPromise = self::ecsCredentials($config); break; default: throw new CredentialsException("Invalid credential_source found in config file: {$credentialSource}. Valid inputs " . "include Environment, Ec2InstanceMetadata, and EcsContainer."); } $credentialsResult = null; try { $credentialsResult = $credentialsPromise()->wait(); } catch (\Exception $reason) { return self::reject("Unable to successfully retrieve credentials from the source specified in the" . " credentials file: {$credentialSource}; failure message was: " . $reason->getMessage()); } return function () use($credentialsResult) { return Promise\Create::promiseFor($credentialsResult); }; } private static function reject($msg) { return new Promise\RejectedPromise(new CredentialsException($msg)); } /** * @param $filename * @return string */ private static function getFileName($filename) { if (!isset($filename)) { $filename = \getenv(self::ENV_SHARED_CREDENTIALS_FILE) ?: self::getHomeDir() . '/.aws/credentials'; } return $filename; } /** * @return boolean */ public static function shouldUseEcs() { //Check for relative uri. if not, then full uri. //fall back to server for each as getenv is not thread-safe. return !empty(\getenv(EcsCredentialProvider::ENV_URI)) || !empty($_SERVER[EcsCredentialProvider::ENV_URI]) || !empty(\getenv(EcsCredentialProvider::ENV_FULL_URI)) || !empty($_SERVER[EcsCredentialProvider::ENV_FULL_URI]); } /** * @param $profiles * @param $ssoProfileName * @param $filename * @param $config * @return Promise\PromiseInterface */ private static function getSsoCredentials($profiles, $ssoProfileName, $filename, $config) { if (empty($config['ssoOidcClient'])) { $ssoProfile = $profiles[$ssoProfileName]; $sessionName = $ssoProfile['sso_session']; if (empty($profiles['sso-session ' . $sessionName])) { return self::reject("Could not find sso-session {$sessionName} in {$filename}"); } $ssoSession = $profiles['sso-session ' . $ssoProfile['sso_session']]; $ssoOidcClient = new Aws\SSOOIDC\SSOOIDCClient(['region' => $ssoSession['sso_region'], 'version' => '2019-06-10', 'credentials' => \false]); } else { $ssoOidcClient = $config['ssoClient']; } $tokenPromise = new Aws\Token\SsoTokenProvider($ssoProfileName, $filename, $ssoOidcClient); $token = $tokenPromise()->wait(); $ssoCredentials = CredentialProvider::getCredentialsFromSsoService($ssoProfile, $ssoSession['sso_region'], $token->getToken(), $config); $expiration = $ssoCredentials['expiration']; return Promise\Create::promiseFor(new Credentials($ssoCredentials['accessKeyId'], $ssoCredentials['secretAccessKey'], $ssoCredentials['sessionToken'], $expiration)); } /** * @param $profiles * @param $ssoProfileName * @param $filename * @param $config * @return Promise\PromiseInterface */ private static function getSsoCredentialsLegacy($profiles, $ssoProfileName, $filename, $config) { $ssoProfile = $profiles[$ssoProfileName]; if (empty($ssoProfile['sso_start_url']) || empty($ssoProfile['sso_region']) || empty($ssoProfile['sso_account_id']) || empty($ssoProfile['sso_role_name'])) { return self::reject("Profile {$ssoProfileName} in {$filename} must contain the following keys: " . "sso_start_url, sso_region, sso_account_id, and sso_role_name."); } $tokenLocation = self::getHomeDir() . '/.aws/sso/cache/' . \sha1($ssoProfile['sso_start_url']) . ".json"; if (!@\is_readable($tokenLocation)) { return self::reject("Unable to read token file at {$tokenLocation}"); } $tokenData = \json_decode(\file_get_contents($tokenLocation), \true); if (empty($tokenData['accessToken']) || empty($tokenData['expiresAt'])) { return self::reject("Token file at {$tokenLocation} must contain an access token and an expiration"); } try { $expiration = (new DateTimeResult($tokenData['expiresAt']))->getTimestamp(); } catch (\Exception $e) { return self::reject("Cached SSO credentials returned an invalid expiration"); } $now = \time(); if ($expiration < $now) { return self::reject("Cached SSO credentials returned expired credentials"); } $ssoCredentials = CredentialProvider::getCredentialsFromSsoService($ssoProfile, $ssoProfile['sso_region'], $tokenData['accessToken'], $config); return Promise\Create::promiseFor(new Credentials($ssoCredentials['accessKeyId'], $ssoCredentials['secretAccessKey'], $ssoCredentials['sessionToken'], $expiration)); } /** * @param array $ssoProfile * @param string $clientRegion * @param string $accessToken * @param array $config * @return array|null */ private static function getCredentialsFromSsoService($ssoProfile, $clientRegion, $accessToken, $config) { if (empty($config['ssoClient'])) { $ssoClient = new Aws\SSO\SSOClient(['region' => $clientRegion, 'version' => '2019-06-10', 'credentials' => \false]); } else { $ssoClient = $config['ssoClient']; } $ssoResponse = $ssoClient->getRoleCredentials(['accessToken' => $accessToken, 'accountId' => $ssoProfile['sso_account_id'], 'roleName' => $ssoProfile['sso_role_name']]); $ssoCredentials = $ssoResponse['roleCredentials']; return $ssoCredentials; } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Credentials/AssumeRoleCredentialProvider.php000064400000003564147600374260030072 0ustar00addonsclient = $config['client']; $this->assumeRoleParams = $config['assume_role_params']; } /** * Loads assume role credentials. * * @return PromiseInterface */ public function __invoke() { $client = $this->client; return $client->assumeRoleAsync($this->assumeRoleParams)->then(function (Result $result) { return $this->client->createCredentials($result); })->otherwise(function (\RuntimeException $exception) { throw new CredentialsException("Error in retrieving assume role credentials.", 0, $exception); }); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Credentials/InstanceProfileProvider.php000064400000021466147600374260027165 0ustar00timeout = (float) \getenv(self::ENV_TIMEOUT) ?: (isset($config['timeout']) ? $config['timeout'] : 1.0); $this->profile = isset($config['profile']) ? $config['profile'] : null; $this->retries = (int) \getenv(self::ENV_RETRIES) ?: (isset($config['retries']) ? $config['retries'] : 3); $this->client = isset($config['client']) ? $config['client'] : \VendorDuplicator\Aws\default_http_handler(); } /** * Loads instance profile credentials. * * @return PromiseInterface */ public function __invoke($previousCredentials = null) { $this->attempts = 0; return Promise\Coroutine::of(function () use($previousCredentials) { // Retrieve token or switch out of secure mode $token = null; while ($this->secureMode && \is_null($token)) { try { $token = (yield $this->request(self::TOKEN_PATH, 'PUT', ['x-aws-ec2-metadata-token-ttl-seconds' => 21600])); } catch (TransferException $e) { if ($this->getExceptionStatusCode($e) === 500 && $previousCredentials instanceof Credentials) { goto generateCredentials; } else { if (!\method_exists($e, 'getResponse') || empty($e->getResponse()) || !\in_array($e->getResponse()->getStatusCode(), [400, 500, 502, 503, 504])) { $this->secureMode = \false; } else { $this->handleRetryableException($e, [], $this->createErrorMessage('Error retrieving metadata token')); } } } $this->attempts++; } // Set token header only for secure mode $headers = []; if ($this->secureMode) { $headers = ['x-aws-ec2-metadata-token' => $token]; } // Retrieve profile while (!$this->profile) { try { $this->profile = (yield $this->request(self::CRED_PATH, 'GET', $headers)); } catch (TransferException $e) { // 401 indicates insecure flow not supported, switch to // attempting secure mode for subsequent calls if (!empty($this->getExceptionStatusCode($e)) && $this->getExceptionStatusCode($e) === 401) { $this->secureMode = \true; } $this->handleRetryableException($e, ['blacklist' => [401, 403]], $this->createErrorMessage($e->getMessage())); } $this->attempts++; } // Retrieve credentials $result = null; while ($result == null) { try { $json = (yield $this->request(self::CRED_PATH . $this->profile, 'GET', $headers)); $result = $this->decodeResult($json); } catch (InvalidJsonException $e) { $this->handleRetryableException($e, ['blacklist' => [401, 403]], $this->createErrorMessage('Invalid JSON response, retries exhausted')); } catch (TransferException $e) { // 401 indicates insecure flow not supported, switch to // attempting secure mode for subsequent calls if (($this->getExceptionStatusCode($e) === 500 || \strpos($e->getMessage(), "cURL error 28") !== \false) && $previousCredentials instanceof Credentials) { goto generateCredentials; } else { if (!empty($this->getExceptionStatusCode($e)) && $this->getExceptionStatusCode($e) === 401) { $this->secureMode = \true; } } $this->handleRetryableException($e, ['blacklist' => [401, 403]], $this->createErrorMessage($e->getMessage())); } $this->attempts++; } generateCredentials: if (!isset($result)) { $credentials = $previousCredentials; } else { $credentials = new Credentials($result['AccessKeyId'], $result['SecretAccessKey'], $result['Token'], \strtotime($result['Expiration'])); } if ($credentials->isExpired()) { $credentials->extendExpiration(); } (yield $credentials); }); } /** * @param string $url * @param string $method * @param array $headers * @return PromiseInterface Returns a promise that is fulfilled with the * body of the response as a string. */ private function request($url, $method = 'GET', $headers = []) { $disabled = \getenv(self::ENV_DISABLE) ?: \false; if (\strcasecmp($disabled, 'true') === 0) { throw new CredentialsException($this->createErrorMessage('EC2 metadata service access disabled')); } $fn = $this->client; $request = new Request($method, self::SERVER_URI . $url); $userAgent = 'aws-sdk-php/' . Sdk::VERSION; if (\defined('HHVM_VERSION')) { $userAgent .= ' HHVM/' . HHVM_VERSION; } $userAgent .= ' ' . \VendorDuplicator\Aws\default_user_agent(); $request = $request->withHeader('User-Agent', $userAgent); foreach ($headers as $key => $value) { $request = $request->withHeader($key, $value); } return $fn($request, ['timeout' => $this->timeout])->then(function (ResponseInterface $response) { return (string) $response->getBody(); })->otherwise(function (array $reason) { $reason = $reason['exception']; if ($reason instanceof TransferException) { throw $reason; } $msg = $reason->getMessage(); throw new CredentialsException($this->createErrorMessage($msg)); }); } private function handleRetryableException(\Exception $e, $retryOptions, $message) { $isRetryable = \true; if (!empty($status = $this->getExceptionStatusCode($e)) && isset($retryOptions['blacklist']) && \in_array($status, $retryOptions['blacklist'])) { $isRetryable = \false; } if ($isRetryable && $this->attempts < $this->retries) { \sleep((int) \pow(1.2, $this->attempts)); } else { throw new CredentialsException($message); } } private function getExceptionStatusCode(\Exception $e) { if (\method_exists($e, 'getResponse') && !empty($e->getResponse())) { return $e->getResponse()->getStatusCode(); } return null; } private function createErrorMessage($previous) { return "Error retrieving credentials from the instance profile " . "metadata service. ({$previous})"; } private function decodeResult($response) { $result = \json_decode($response, \true); if (\json_last_error() > 0) { throw new InvalidJsonException(); } if ($result['Code'] !== 'Success') { throw new CredentialsException('Unexpected instance profile ' . 'response code: ' . $result['Code']); } return $result; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Credentials/CredentialsInterface.php000064400000002177147600374260026441 0ustar00timeout = (float) $timeout; $this->client = isset($config['client']) ? $config['client'] : \VendorDuplicator\Aws\default_http_handler(); } /** * Load ECS credentials * * @return PromiseInterface */ public function __invoke() { $client = $this->client; $request = new Request('GET', self::getEcsUri()); $headers = $this->setHeaderForAuthToken(); return $client($request, ['timeout' => $this->timeout, 'proxy' => '', 'headers' => $headers])->then(function (ResponseInterface $response) { $result = $this->decodeResult((string) $response->getBody()); return new Credentials($result['AccessKeyId'], $result['SecretAccessKey'], $result['Token'], \strtotime($result['Expiration'])); })->otherwise(function ($reason) { $reason = \is_array($reason) ? $reason['exception'] : $reason; $msg = $reason->getMessage(); throw new CredentialsException("Error retrieving credential from ECS ({$msg})"); }); } private function getEcsAuthToken() { return \getenv(self::ENV_AUTH_TOKEN); } public function setHeaderForAuthToken() { $authToken = self::getEcsAuthToken(); $headers = []; if (!empty($authToken)) { $headers = ['Authorization' => $authToken]; } return $headers; } /** * Fetch credential URI from ECS environment variable * * @return string Returns ECS URI */ private function getEcsUri() { $credsUri = \getenv(self::ENV_URI); if ($credsUri === \false) { $credsUri = isset($_SERVER[self::ENV_URI]) ? $_SERVER[self::ENV_URI] : ''; } if (empty($credsUri)) { $credFullUri = \getenv(self::ENV_FULL_URI); if ($credFullUri === \false) { $credFullUri = isset($_SERVER[self::ENV_FULL_URI]) ? $_SERVER[self::ENV_FULL_URI] : ''; } if (!empty($credFullUri)) { return $credFullUri; } } return self::SERVER_URI . $credsUri; } private function decodeResult($response) { $result = \json_decode($response, \true); if (!isset($result['AccessKeyId'])) { throw new CredentialsException('Unexpected ECS credential value'); } return $result; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Credentials/Credentials.php000064400000005312147600374260024612 0ustar00key = \trim($key); $this->secret = \trim($secret); $this->token = $token; $this->expires = $expires; } public static function __set_state(array $state) { return new self($state['key'], $state['secret'], $state['token'], $state['expires']); } public function getAccessKeyId() { return $this->key; } public function getSecretKey() { return $this->secret; } public function getSecurityToken() { return $this->token; } public function getExpiration() { return $this->expires; } public function isExpired() { return $this->expires !== null && \time() >= $this->expires; } public function toArray() { return ['key' => $this->key, 'secret' => $this->secret, 'token' => $this->token, 'expires' => $this->expires]; } public function serialize() { return \json_encode($this->__serialize()); } public function unserialize($serialized) { $data = \json_decode($serialized, \true); $this->__unserialize($data); } public function __serialize() { return $this->toArray(); } public function __unserialize($data) { $this->key = $data['key']; $this->secret = $data['secret']; $this->token = $data['token']; $this->expires = $data['expires']; } /** * Internal-only. Used when IMDS is unreachable * or returns expires credentials. * * @internal */ public function extendExpiration() { $extension = \mt_rand(5, 10); $this->expires = \time() + $extension * 60; $message = <<arn = $config['RoleArn']; if (!isset($config['WebIdentityTokenFile'])) { throw new \InvalidArgumentException(self::ERROR_MSG . "'WebIdentityTokenFile'."); } $this->tokenFile = $config['WebIdentityTokenFile']; if (!\preg_match("/^\\w\\:|^\\/|^\\\\/", $this->tokenFile)) { throw new \InvalidArgumentException("'WebIdentityTokenFile' must be an absolute path."); } $this->retries = (int) \getenv(self::ENV_RETRIES) ?: (isset($config['retries']) ? $config['retries'] : 3); $this->authenticationAttempts = 0; $this->tokenFileReadAttempts = 0; $this->session = isset($config['SessionName']) ? $config['SessionName'] : 'aws-sdk-php-' . \round(\microtime(\true) * 1000); $region = isset($config['region']) ? $config['region'] : 'us-east-1'; if (isset($config['client'])) { $this->client = $config['client']; } else { $this->client = new StsClient(['credentials' => \false, 'region' => $region, 'version' => 'latest']); } } /** * Loads assume role with web identity credentials. * * @return Promise\PromiseInterface */ public function __invoke() { return Promise\Coroutine::of(function () { $client = $this->client; $result = null; while ($result == null) { try { $token = @\file_get_contents($this->tokenFile); if (\false === $token) { \clearstatcache(\true, \dirname($this->tokenFile) . "/" . \readlink($this->tokenFile)); \clearstatcache(\true, \dirname($this->tokenFile) . "/" . \dirname(\readlink($this->tokenFile))); \clearstatcache(\true, $this->tokenFile); if (!@\is_readable($this->tokenFile)) { throw new CredentialsException("Unreadable tokenfile at location {$this->tokenFile}"); } $token = @\file_get_contents($this->tokenFile); } if (empty($token)) { if ($this->tokenFileReadAttempts < $this->retries) { \sleep((int) \pow(1.2, $this->tokenFileReadAttempts)); $this->tokenFileReadAttempts++; continue; } throw new CredentialsException("InvalidIdentityToken from file: {$this->tokenFile}"); } } catch (\Exception $exception) { throw new CredentialsException("Error reading WebIdentityTokenFile from " . $this->tokenFile, 0, $exception); } $assumeParams = ['RoleArn' => $this->arn, 'RoleSessionName' => $this->session, 'WebIdentityToken' => $token]; try { $result = $client->assumeRoleWithWebIdentity($assumeParams); } catch (AwsException $e) { if ($e->getAwsErrorCode() == 'InvalidIdentityToken') { if ($this->authenticationAttempts < $this->retries) { \sleep((int) \pow(1.2, $this->authenticationAttempts)); } else { throw new CredentialsException("InvalidIdentityToken, retries exhausted"); } } else { throw new CredentialsException("Error assuming role from web identity credentials", 0, $e); } } catch (\Exception $e) { throw new CredentialsException("Error retrieving web identity credentials: " . $e->getMessage() . " (" . $e->getCode() . ")"); } $this->authenticationAttempts++; } (yield $this->client->createCredentials($result)); }); } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/DefaultsMode/Exception/ConfigurationException.php000064400000000553147600374260031043 0ustar00addonsvalidModes)) { throw new \InvalidArgumentException("'{$mode}' is not a valid mode." . " The mode has to be 'legacy', 'standard', 'cross-region', 'in-region'," . " 'mobile', or 'auto'."); } $this->mode = $mode; if ($this->mode == 'legacy') { return; } $data = \VendorDuplicator\Aws\load_compiled_json(__DIR__ . '/../data/sdk-default-configuration.json'); $this->retryMode = $data['base']['retryMode']; $this->stsRegionalEndpoints = $data['base']['stsRegionalEndpoints']; $this->s3UsEast1RegionalEndpoints = $data['base']['s3UsEast1RegionalEndpoints']; $this->connectTimeoutInMillis = $data['base']['connectTimeoutInMillis']; if (isset($data['modes'][$mode])) { $modeData = $data['modes'][$mode]; foreach ($modeData as $settingName => $settingValue) { if (isset($this->{$settingName})) { if (isset($settingValue['override'])) { $this->{$settingName} = $settingValue['override']; } else { if (isset($settingValue['multiply'])) { $this->{$settingName} *= $settingValue['multiply']; } else { if (isset($settingValue['add'])) { $this->{$settingName} += $settingValue['add']; } } } } else { if (isset($settingValue['override'])) { if (\property_exists($this, $settingName)) { $this->{$settingName} = $settingValue['override']; } } } } } } /** * {@inheritdoc} */ public function getMode() { return $this->mode; } /** * {@inheritdoc} */ public function getRetryMode() { return $this->retryMode; } /** * {@inheritdoc} */ public function getStsRegionalEndpoints() { return $this->stsRegionalEndpoints; } /** * {@inheritdoc} */ public function getS3UsEast1RegionalEndpoints() { return $this->s3UsEast1RegionalEndpoints; } /** * {@inheritdoc} */ public function getConnectTimeoutInMillis() { return $this->connectTimeoutInMillis; } /** * {@inheritdoc} */ public function getHttpRequestTimeoutInMillis() { return $this->httpRequestTimeoutInMillis; } /** * {@inheritdoc} */ public function toArray() { return ['mode' => $this->getMode(), 'retry_mode' => $this->getRetryMode(), 'sts_regional_endpoints' => $this->getStsRegionalEndpoints(), 's3_us_east_1_regional_endpoint' => $this->getS3UsEast1RegionalEndpoints(), 'connect_timeout_in_milliseconds' => $this->getConnectTimeoutInMillis(), 'http_request_timeout_in_milliseconds' => $this->getHttpRequestTimeoutInMillis()]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/DefaultsMode/ConfigurationInterface.php000064400000002035147600374260027123 0ustar00 * use Aws\Sts\RegionalEndpoints\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see \Aws\DefaultsMode\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const DEFAULT_MODE = 'legacy'; const ENV_MODE = 'AWS_DEFAULTS_MODE'; const ENV_PROFILE = 'AWS_PROFILE'; const INI_MODE = 'defaults_mode'; public static $cacheKey = 'aws_defaults_mode'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback(); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['defaultsMode']) && $config['defaultsMode'] instanceof CacheInterface) { return self::cache($memo, $config['defaultsMode'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @return callable */ public static function env() { return function () { // Use config from environment variables, if available $mode = \getenv(self::ENV_MODE); if (!empty($mode)) { return Promise\Create::promiseFor(new Configuration($mode)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_MODE); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback() { return function () { return Promise\Create::promiseFor(new Configuration(self::DEFAULT_MODE)); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_MODE])) { return self::reject("Required defaults mode config values\n not present in INI profile '{$profile}' ({$filename})"); } return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_MODE])); }; } /** * Unwraps a configuration object in whatever valid form it is in, * always returning a ConfigurationInterface object. * * @param mixed $config * @return ConfigurationInterface * @throws \InvalidArgumentException */ public static function unwrap($config) { if (\is_callable($config)) { $config = $config(); } if ($config instanceof PromiseInterface) { $config = $config->wait(); } if ($config instanceof ConfigurationInterface) { return $config; } if (\is_string($config)) { return new Configuration($config); } throw new \InvalidArgumentException('Not a valid defaults mode configuration' . ' argument.'); } } aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/Exception/ConfigurationException.php000064400000000616147600374260034340 0ustar00addons/amazons3addon/vendor-prefixeduseDualstackEndpoint = Aws\boolean_value($useDualstackEndpoint); if (\is_null($this->useDualstackEndpoint)) { throw new ConfigurationException("'use_dual_stack_endpoint' config option" . " must be a boolean value."); } if ($this->useDualstackEndpoint == \true && (\strpos($region, "iso-") !== \false || \strpos($region, "-iso") !== \false)) { throw new ConfigurationException("Dual-stack is not supported in ISO regions"); } } /** * {@inheritdoc} */ public function isUseDualstackEndpoint() { return $this->useDualstackEndpoint; } /** * {@inheritdoc} */ public function toArray() { return ['use_dual_stack_endpoint' => $this->isUseDualstackEndpoint()]; } } vendor-prefixed/aws/aws-sdk-php/src/Endpoint/UseDualstackEndpoint/ConfigurationInterface.php000064400000000602147600374260032337 0ustar00addons/amazons3addon * use Aws\Endpoint\UseDualstackEndpoint\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see Aws\Endpoint\UseDualstackEndpoint\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const ENV_USE_DUAL_STACK_ENDPOINT = 'AWS_USE_DUALSTACK_ENDPOINT'; const INI_USE_DUAL_STACK_ENDPOINT = 'use_dualstack_endpoint'; public static $cacheKey = 'aws_cached_use_dualstack_endpoint_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $region = $config['region']; $configProviders = [self::env($region)]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini($region); } $configProviders[] = self::fallback($region); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['use_dual_stack_endpoint']) && $config['use_dual_stack_endpoint'] instanceof CacheInterface) { return self::cache($memo, $config['use_dual_stack_endpoint'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @return callable */ public static function env($region) { return function () use($region) { // Use config from environment variables, if available $useDualstackEndpoint = \getenv(self::ENV_USE_DUAL_STACK_ENDPOINT); if (!empty($useDualstackEndpoint)) { return Promise\Create::promiseFor(new Configuration($useDualstackEndpoint, $region)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_USE_DUAL_STACK_ENDPOINT); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($region, $profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($region, $profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true, \INI_SCANNER_NORMAL); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT])) { return self::reject("Required use dualstack endpoint config values\n not present in INI profile '{$profile}' ({$filename})"); } // INI_SCANNER_NORMAL parses false-y values as an empty string if ($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT] === "") { $data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT] = \false; } return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_USE_DUAL_STACK_ENDPOINT], $region)); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback($region) { return function () use($region) { return Promise\Create::promiseFor(new Configuration(\false, $region)); }; } } vendor-prefixed/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/Exception/ConfigurationException.php000064400000000604147600374260033323 0ustar00addons/amazons3addonuseFipsEndpoint = Aws\boolean_value($useFipsEndpoint); if (\is_null($this->useFipsEndpoint)) { throw new ConfigurationException("'use_fips_endpoint' config option" . " must be a boolean value."); } } /** * {@inheritdoc} */ public function isUseFipsEndpoint() { return $this->useFipsEndpoint; } /** * {@inheritdoc} */ public function toArray() { return ['use_fips_endpoint' => $this->isUseFipsEndpoint()]; } } vendor-prefixed/aws/aws-sdk-php/src/Endpoint/UseFipsEndpoint/ConfigurationInterface.php000064400000000563147600374260031333 0ustar00addons/amazons3addon * use Aws\Endpoint\UseFipsEndpoint\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see Aws\Endpoint\UseFipsEndpoint\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const ENV_USE_FIPS_ENDPOINT = 'AWS_USE_FIPS_ENDPOINT'; const INI_USE_FIPS_ENDPOINT = 'use_fips_endpoint'; public static $cacheKey = 'aws_cached_use_fips_endpoint_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback($config['region']); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['use_fips_endpoint']) && $config['use_fips_endpoint'] instanceof CacheInterface) { return self::cache($memo, $config['use_fips_endpoint'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @return callable */ public static function env() { return function () { // Use config from environment variables, if available $useFipsEndpoint = \getenv(self::ENV_USE_FIPS_ENDPOINT); if (!empty($useFipsEndpoint)) { return Promise\Create::promiseFor(new Configuration($useFipsEndpoint)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_USE_FIPS_ENDPOINT); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true, \INI_SCANNER_NORMAL); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_USE_FIPS_ENDPOINT])) { return self::reject("Required use fips endpoint config values\n not present in INI profile '{$profile}' ({$filename})"); } // INI_SCANNER_NORMAL parses false-y values as an empty string if ($data[$profile][self::INI_USE_FIPS_ENDPOINT] === "") { $data[$profile][self::INI_USE_FIPS_ENDPOINT] = \false; } return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_USE_FIPS_ENDPOINT])); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback($region) { return function () use($region) { $isFipsPseudoRegion = \strpos($region, 'fips-') !== \false || \strpos($region, '-fips') !== \false; if ($isFipsPseudoRegion) { $configuration = new Configuration(\true); } else { $configuration = new Configuration(\false); } return Promise\Create::promiseFor($configuration); }; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Endpoint/PartitionInterface.php000064400000003144147600374260025473 0ustar00patterns = $patterns; } public function __invoke(array $args = []) { $service = isset($args['service']) ? $args['service'] : ''; $region = isset($args['region']) ? $args['region'] : ''; $keys = ["{$region}/{$service}", "{$region}/*", "*/{$service}", "*/*"]; foreach ($keys as $key) { if (isset($this->patterns[$key])) { return $this->expand($this->patterns[$key], isset($args['scheme']) ? $args['scheme'] : 'https', $service, $region); } } return null; } private function expand(array $config, $scheme, $service, $region) { $config['endpoint'] = $scheme . '://' . \strtr($config['endpoint'], ['{service}' => $service, '{region}' => $region]); return $config; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Endpoint/PartitionEndpointProvider.php000064400000007454147600374260027076 0ustar00partitions = \array_map(function (array $definition) { return new Partition($definition); }, \array_values($partitions)); $this->defaultPartition = $defaultPartition; $this->options = $options; } public function __invoke(array $args = []) { $partition = $this->getPartition(isset($args['region']) ? $args['region'] : '', isset($args['service']) ? $args['service'] : ''); $args['options'] = $this->options; return $partition($args); } /** * Returns the partition containing the provided region or the default * partition if no match is found. * * @param string $region * @param string $service * * @return Partition */ public function getPartition($region, $service) { foreach ($this->partitions as $partition) { if ($partition->isRegionMatch($region, $service)) { return $partition; } } return $this->getPartitionByName($this->defaultPartition); } /** * Returns the partition with the provided name or null if no partition with * the provided name can be found. * * @param string $name * * @return Partition|null */ public function getPartitionByName($name) { foreach ($this->partitions as $partition) { if ($name === $partition->getName()) { return $partition; } } } /** * Creates and returns the default SDK partition provider. * * @param array $options * @return PartitionEndpointProvider */ public static function defaultProvider($options = []) { $data = \VendorDuplicator\Aws\load_compiled_json(__DIR__ . '/../data/endpoints.json'); $prefixData = \VendorDuplicator\Aws\load_compiled_json(__DIR__ . '/../data/endpoints_prefix_history.json'); $mergedData = self::mergePrefixData($data, $prefixData); return new self($mergedData['partitions'], 'aws', $options); } /** * Copy endpoint data for other prefixes used by a given service * * @param $data * @param $prefixData * @return array */ public static function mergePrefixData($data, $prefixData) { $prefixGroups = $prefixData['prefix-groups']; foreach ($data["partitions"] as $index => $partition) { foreach ($prefixGroups as $current => $old) { $serviceData = Env::search("services.\"{$current}\"", $partition); if (!empty($serviceData)) { foreach ($old as $prefix) { if (empty(Env::search("services.\"{$prefix}\"", $partition))) { $data["partitions"][$index]["services"][$prefix] = $serviceData; } } } } } return $data; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Endpoint/Partition.php000064400000022342147600374260023653 0ustar00data = $definition; } public function getName() { return $this->data['partition']; } /** * @internal * @return mixed */ public function getDnsSuffix() { return $this->data['dnsSuffix']; } public function isRegionMatch($region, $service) { if (isset($this->data['regions'][$region]) || isset($this->data['services'][$service]['endpoints'][$region])) { return \true; } if (isset($this->data['regionRegex'])) { return (bool) \preg_match("@{$this->data['regionRegex']}@", $region); } return \false; } public function getAvailableEndpoints($service, $allowNonRegionalEndpoints = \false) { if ($this->isServicePartitionGlobal($service)) { return [$this->getPartitionEndpoint($service)]; } if (isset($this->data['services'][$service]['endpoints'])) { $serviceRegions = \array_keys($this->data['services'][$service]['endpoints']); return $allowNonRegionalEndpoints ? $serviceRegions : \array_intersect($serviceRegions, \array_keys($this->data['regions'])); } return []; } public function __invoke(array $args = []) { $service = isset($args['service']) ? $args['service'] : ''; $region = isset($args['region']) ? $args['region'] : ''; $scheme = isset($args['scheme']) ? $args['scheme'] : 'https'; $options = isset($args['options']) ? $args['options'] : []; $data = $this->getEndpointData($service, $region, $options); $variant = $this->getVariant($options, $data); if (isset($variant['hostname'])) { $template = $variant['hostname']; } else { $template = isset($data['hostname']) ? $data['hostname'] : ''; } $dnsSuffix = isset($variant['dnsSuffix']) ? $variant['dnsSuffix'] : $this->data['dnsSuffix']; return ['endpoint' => "{$scheme}://" . $this->formatEndpoint($template, $service, $region, $dnsSuffix), 'signatureVersion' => $this->getSignatureVersion($data), 'signingRegion' => isset($data['credentialScope']['region']) ? $data['credentialScope']['region'] : $region, 'signingName' => isset($data['credentialScope']['service']) ? $data['credentialScope']['service'] : $service]; } private function getEndpointData($service, $region, $options) { $defaultRegion = $this->resolveRegion($service, $region, $options); $data = isset($this->data['services'][$service]['endpoints'][$defaultRegion]) ? $this->data['services'][$service]['endpoints'][$defaultRegion] : []; $data += isset($this->data['services'][$service]['defaults']) ? $this->data['services'][$service]['defaults'] : []; $data += isset($this->data['defaults']) ? $this->data['defaults'] : []; return $data; } private function getSignatureVersion(array $data) { static $supportedBySdk = ['s3v4', 'v4', 'anonymous']; $possibilities = \array_intersect($supportedBySdk, isset($data['signatureVersions']) ? $data['signatureVersions'] : ['v4']); return \array_shift($possibilities); } private function resolveRegion($service, $region, $options) { if (isset($this->data['services'][$service]['endpoints'][$region]) && $this->isFipsEndpointUsed($region)) { return $region; } if ($this->isServicePartitionGlobal($service) || $this->isStsLegacyEndpointUsed($service, $region, $options) || $this->isS3LegacyEndpointUsed($service, $region, $options)) { return $this->getPartitionEndpoint($service); } return $region; } private function isServicePartitionGlobal($service) { return isset($this->data['services'][$service]['isRegionalized']) && \false === $this->data['services'][$service]['isRegionalized'] && isset($this->data['services'][$service]['partitionEndpoint']); } /** * STS legacy endpoints used for valid regions unless option is explicitly * set to 'regional' * * @param string $service * @param string $region * @param array $options * @return bool */ private function isStsLegacyEndpointUsed($service, $region, $options) { return $service === 'sts' && \in_array($region, $this->stsLegacyGlobalRegions) && (empty($options['sts_regional_endpoints']) || ConfigurationProvider::unwrap($options['sts_regional_endpoints'])->getEndpointsType() !== 'regional'); } /** * S3 legacy us-east-1 endpoint used for valid regions unless option is explicitly * set to 'regional' * * @param string $service * @param string $region * @param array $options * @return bool */ private function isS3LegacyEndpointUsed($service, $region, $options) { return $service === 's3' && $region === 'us-east-1' && (empty($options['s3_us_east_1_regional_endpoint']) || S3ConfigurationProvider::unwrap($options['s3_us_east_1_regional_endpoint'])->getEndpointsType() !== 'regional'); } private function getPartitionEndpoint($service) { return $this->data['services'][$service]['partitionEndpoint']; } private function formatEndpoint($template, $service, $region, $dnsSuffix) { return \strtr($template, ['{service}' => $service, '{region}' => $region, '{dnsSuffix}' => $dnsSuffix]); } /** * @param $region * @return bool */ private function isFipsEndpointUsed($region) { return \strpos($region, "fips") !== \false; } /** * @param array $options * @param array $data * @return array */ private function getVariant(array $options, array $data) { $variantTags = []; if (isset($options['use_fips_endpoint'])) { $useFips = $options['use_fips_endpoint']; if (\is_bool($useFips)) { $useFips && ($variantTags[] = 'fips'); } elseif ($useFips->isUseFipsEndpoint()) { $variantTags[] = 'fips'; } } if (isset($options['use_dual_stack_endpoint'])) { $useDualStack = $options['use_dual_stack_endpoint']; if (\is_bool($useDualStack)) { $useDualStack && ($variantTags[] = 'dualstack'); } elseif ($useDualStack->isUseDualStackEndpoint()) { $variantTags[] = 'dualstack'; } } if (!empty($variantTags)) { if (isset($data['variants'])) { foreach ($data['variants'] as $variant) { if (\array_count_values($variant['tags']) == \array_count_values($variantTags)) { return $variant; } } } if (isset($this->data['defaults']['variants'])) { foreach ($this->data['defaults']['variants'] as $variant) { if (\array_count_values($variant['tags']) == \array_count_values($variantTags)) { return $variant; } } } } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Endpoint/EndpointProvider.php000064400000006341147600374260025176 0ustar00 'ec2', 'region' => 'us-west-2']); * // Returns an endpoint array or throws. * $endpoint = EndpointProvider::resolve($provider, [ * 'service' => 'ec2', * 'region' => 'us-west-2' * ]); * * You can compose multiple providers into a single provider using * {@see Aws\or_chain}. This function accepts providers as arguments and * returns a new function that will invoke each provider until a non-null value * is returned. * * $a = function (array $args) { * if ($args['region'] === 'my-test-region') { * return ['endpoint' => 'http://localhost:123/api']; * } * }; * $b = EndpointProvider::defaultProvider(); * $c = \Aws\or_chain($a, $b); * $config = ['service' => 'ec2', 'region' => 'my-test-region']; * $res = $c($config); // $a handles this. * $config['region'] = 'us-west-2'; * $res = $c($config); // $b handles this. */ class EndpointProvider { /** * Resolves and endpoint provider and ensures a non-null return value. * * @param callable $provider Provider function to invoke. * @param array $args Endpoint arguments to pass to the provider. * * @return array * @throws UnresolvedEndpointException */ public static function resolve(callable $provider, array $args = []) { $result = $provider($args); if (\is_array($result)) { return $result; } throw new UnresolvedEndpointException('Unable to resolve an endpoint using the provider arguments: ' . \json_encode($args) . '. Note: you can provide an "endpoint" ' . 'option to a client constructor to bypass invoking an endpoint ' . 'provider.'); } /** * Creates and returns the default SDK endpoint provider. * * @deprecated Use an instance of \Aws\Endpoint\Partition instead. * * @return callable */ public static function defaultProvider() { return PartitionEndpointProvider::defaultProvider(); } /** * Creates and returns an endpoint provider that uses patterns from an * array. * * @param array $patterns Endpoint patterns * * @return callable */ public static function patterns(array $patterns) { return new PatternEndpointProvider($patterns); } } vendor-prefixed/aws/aws-sdk-php/src/EndpointDiscovery/Exception/ConfigurationException.php000064400000000602147600374260032132 0ustar00addons/amazons3addoncacheLimit = \filter_var($cacheLimit, \FILTER_VALIDATE_INT); if ($this->cacheLimit == \false || $this->cacheLimit < 1) { throw new \InvalidArgumentException("'cache_limit' value must be a positive integer."); } // Unparsable $enabled flag errs on the side of disabling endpoint discovery $this->enabled = \filter_var($enabled, \FILTER_VALIDATE_BOOLEAN); } /** * {@inheritdoc} */ public function isEnabled() { return $this->enabled; } /** * {@inheritdoc} */ public function getCacheLimit() { return $this->cacheLimit; } /** * {@inheritdoc} */ public function toArray() { return ['enabled' => $this->isEnabled(), 'cache_limit' => $this->getCacheLimit()]; } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointDiscovery/EndpointDiscoveryMiddleware.php000064400000026364147600374260031171 0ustar00addonsnextHandler = $handler; $this->client = $client; $this->args = $args; $this->service = $client->getApi(); $this->config = $config; } public function __invoke(CommandInterface $cmd, RequestInterface $request) { $nextHandler = $this->nextHandler; $op = $this->service->getOperation($cmd->getName())->toArray(); // Continue only if endpointdiscovery trait is set if (isset($op['endpointdiscovery'])) { $config = ConfigurationProvider::unwrap($this->config); $isRequired = !empty($op['endpointdiscovery']['required']); if ($isRequired && !$config->isEnabled()) { throw new UnresolvedEndpointException('This operation ' . 'requires the use of endpoint discovery, but this has ' . 'been disabled in the configuration. Enable endpoint ' . 'discovery or use a different operation.'); } // Continue only if enabled by config if ($config->isEnabled()) { if (isset($op['endpointoperation'])) { throw new UnresolvedEndpointException('This operation is ' . 'contradictorily marked both as using endpoint discovery ' . 'and being the endpoint discovery operation. Please ' . 'verify the accuracy of your model files.'); } // Original endpoint may be used if discovery optional $originalUri = $request->getUri(); $identifiers = $this->getIdentifiers($op); $cacheKey = $this->getCacheKey($this->client->getCredentials()->wait(), $cmd, $identifiers); // Check/create cache if (!isset(self::$cache)) { self::$cache = new LruArrayCache($config->getCacheLimit()); } if (empty($endpointList = self::$cache->get($cacheKey))) { $endpointList = new EndpointList([]); } $endpoint = $endpointList->getActive(); // Retrieve endpoints if there is no active endpoint if (empty($endpoint)) { try { $endpoint = $this->discoverEndpoint($cacheKey, $cmd, $identifiers); } catch (\Exception $e) { // Use cached endpoint, expired or active, if any remain $endpoint = $endpointList->getEndpoint(); if (empty($endpoint)) { return $this->handleDiscoveryException($isRequired, $originalUri, $e, $cmd, $request); } } } $request = $this->modifyRequest($request, $endpoint); $g = function ($value) use($cacheKey, $cmd, $identifiers, $isRequired, $originalUri, $request, &$endpoint, &$g) { if ($value instanceof AwsException && ($value->getAwsErrorCode() == 'InvalidEndpointException' || $value->getStatusCode() == 421)) { return $this->handleInvalidEndpoint($cacheKey, $cmd, $identifiers, $isRequired, $originalUri, $request, $value, $endpoint, $g); } return $value; }; return $nextHandler($cmd, $request)->otherwise($g); } } return $nextHandler($cmd, $request); } private function discoverEndpoint($cacheKey, CommandInterface $cmd, array $identifiers) { $discCmd = $this->getDiscoveryCommand($cmd, $identifiers); $this->discoveryTimes[$cacheKey] = \time(); $result = $this->client->execute($discCmd); if (isset($result['Endpoints'])) { $endpointData = []; foreach ($result['Endpoints'] as $datum) { $endpointData[$datum['Address']] = \time() + $datum['CachePeriodInMinutes'] * 60; } $endpointList = new EndpointList($endpointData); self::$cache->set($cacheKey, $endpointList); return $endpointList->getEndpoint(); } throw new UnresolvedEndpointException('The endpoint discovery operation ' . 'yielded a response that did not contain properly formatted ' . 'endpoint data.'); } private function getCacheKey(CredentialsInterface $creds, CommandInterface $cmd, array $identifiers) { $key = $this->service->getServiceName() . '_' . $creds->getAccessKeyId(); if (!empty($identifiers)) { $key .= '_' . $cmd->getName(); foreach ($identifiers as $identifier) { $key .= "_{$cmd[$identifier]}"; } } return $key; } private function getDiscoveryCommand(CommandInterface $cmd, array $identifiers) { foreach ($this->service->getOperations() as $op) { if (isset($op['endpointoperation'])) { $endpointOperation = $op->toArray()['name']; break; } } if (!isset($endpointOperation)) { throw new UnresolvedEndpointException('This command is set to use ' . 'endpoint discovery, but no endpoint discovery operation was ' . 'found. Please verify the accuracy of your model files.'); } $params = []; if (!empty($identifiers)) { $params['Operation'] = $cmd->getName(); $params['Identifiers'] = []; foreach ($identifiers as $identifier) { $params['Identifiers'][$identifier] = $cmd[$identifier]; } } $command = $this->client->getCommand($endpointOperation, $params); $command->getHandlerList()->appendBuild(Middleware::mapRequest(function (RequestInterface $r) { return $r->withHeader('x-amz-api-version', $this->service->getApiVersion()); }), 'x-amz-api-version-header'); return $command; } private function getIdentifiers(array $operation) { $inputShape = $this->service->getShapeMap()->resolve($operation['input'])->toArray(); $identifiers = []; foreach ($inputShape['members'] as $key => $member) { if (!empty($member['endpointdiscoveryid'])) { $identifiers[] = $key; } } return $identifiers; } private function handleDiscoveryException($isRequired, $originalUri, \Exception $e, CommandInterface $cmd, RequestInterface $request) { // If no cached endpoints and discovery required, // throw exception if ($isRequired) { $message = 'The endpoint required for this service is currently ' . 'unable to be retrieved, and your request can not be fulfilled ' . 'unless you manually specify an endpoint.'; throw new AwsException($message, $cmd, ['code' => 'EndpointDiscoveryException', 'message' => $message], $e); } // If discovery isn't required, use original endpoint return $this->useOriginalUri($originalUri, $cmd, $request); } private function handleInvalidEndpoint($cacheKey, $cmd, $identifiers, $isRequired, $originalUri, $request, $value, &$endpoint, &$g) { $nextHandler = $this->nextHandler; $endpointList = self::$cache->get($cacheKey); if ($endpointList instanceof EndpointList) { // Remove invalid endpoint from cached list $endpointList->remove($endpoint); // If possible, get another cached endpoint $newEndpoint = $endpointList->getEndpoint(); } if (empty($newEndpoint)) { // If no more cached endpoints, make discovery call // if none made within cooldown for given key if (\time() - $this->discoveryTimes[$cacheKey] < self::$discoveryCooldown) { // If no more cached endpoints and it's required, // fail with original exception if ($isRequired) { return $value; } // Use original endpoint if not required return $this->useOriginalUri($originalUri, $cmd, $request); } $newEndpoint = $this->discoverEndpoint($cacheKey, $cmd, $identifiers); } $endpoint = $newEndpoint; $request = $this->modifyRequest($request, $endpoint); return $nextHandler($cmd, $request)->otherwise($g); } private function modifyRequest(RequestInterface $request, $endpoint) { $parsed = $this->parseEndpoint($endpoint); if (!empty($request->getHeader('User-Agent'))) { $userAgent = $request->getHeader('User-Agent')[0]; if (\strpos($userAgent, 'endpoint-discovery') === \false) { $userAgent = $userAgent . ' endpoint-discovery'; } } else { $userAgent = 'endpoint-discovery'; } return $request->withUri($request->getUri()->withHost($parsed['host'])->withPath($parsed['path']))->withHeader('User-Agent', $userAgent); } /** * Parses an endpoint returned from the discovery API into an array with * 'host' and 'path' keys. * * @param $endpoint * @return array */ private function parseEndpoint($endpoint) { $parsed = \parse_url($endpoint); // parse_url() will correctly parse full URIs with schemes if (isset($parsed['host'])) { return $parsed; } // parse_url() will put host & path in 'path' if scheme is not provided if (isset($parsed['path'])) { $split = \explode('/', $parsed['path'], 2); $parsed['host'] = $split[0]; if (isset($split[1])) { if (\substr($split[1], 0, 1) !== '/') { $split[1] = '/' . $split[1]; } $parsed['path'] = $split[1]; } else { $parsed['path'] = ''; } return $parsed; } throw new UnresolvedEndpointException("The supplied endpoint '" . "{$endpoint}' is invalid."); } private function useOriginalUri(UriInterface $uri, CommandInterface $cmd, RequestInterface $request) { $nextHandler = $this->nextHandler; $endpoint = $uri->getHost() . $uri->getPath(); $request = $this->modifyRequest($request, $endpoint); return $nextHandler($cmd, $request); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointDiscovery/EndpointList.php000064400000003660147600374260026210 0ustar00active = $endpoints; \reset($this->active); } /** * Gets an active (unexpired) endpoint. Returns null if none found. * * @return null|string */ public function getActive() { if (\count($this->active) < 1) { return null; } while (\time() > \current($this->active)) { $key = \key($this->active); $this->expired[$key] = \current($this->active); $this->increment($this->active); unset($this->active[$key]); if (\count($this->active) < 1) { return null; } } $active = \key($this->active); $this->increment($this->active); return $active; } /** * Gets an active endpoint if possible, then an expired endpoint if possible. * Returns null if no endpoints found. * * @return null|string */ public function getEndpoint() { if (!empty($active = $this->getActive())) { return $active; } return $this->getExpired(); } /** * Removes an endpoint from both lists. * * @param string $key */ public function remove($key) { unset($this->active[$key]); unset($this->expired[$key]); } /** * Get an expired endpoint. Returns null if none found. * * @return null|string */ private function getExpired() { if (\count($this->expired) < 1) { return null; } $expired = \key($this->expired); $this->increment($this->expired); return $expired; } private function increment(&$array) { if (\next($array) === \false) { \reset($array); } } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointDiscovery/ConfigurationInterface.php000064400000001124147600374260030136 0ustar00addons * use Aws\EndpointDiscovery\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see Aws\EndpointDiscovery\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const DEFAULT_ENABLED = \false; const DEFAULT_CACHE_LIMIT = 1000; const ENV_ENABLED = 'AWS_ENDPOINT_DISCOVERY_ENABLED'; const ENV_ENABLED_ALT = 'AWS_ENABLE_ENDPOINT_DISCOVERY'; const ENV_PROFILE = 'AWS_PROFILE'; public static $cacheKey = 'aws_cached_endpoint_discovery_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback($config); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['endpoint_discovery']) && $config['endpoint_discovery'] instanceof CacheInterface) { return self::cache($memo, $config['endpoint_discovery'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @param $cacheLimit * @return callable */ public static function env($cacheLimit = self::DEFAULT_CACHE_LIMIT) { return function () use($cacheLimit) { // Use config from environment variables, if available $enabled = \getenv(self::ENV_ENABLED); if ($enabled === \false || $enabled === '') { $enabled = \getenv(self::ENV_ENABLED_ALT); } if ($enabled !== \false && $enabled !== '') { return Promise\Create::promiseFor(new Configuration($enabled, $cacheLimit)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_ENABLED); }; } /** * Fallback config options when other sources are not set. Will check the * service model for any endpoint discovery required operations, and enable * endpoint discovery in that case. If no required operations found, will use * the class default values. * * @param array $config * @return callable */ public static function fallback($config = []) { $enabled = self::DEFAULT_ENABLED; if (!empty($config['api_provider']) && !empty($config['service']) && !empty($config['version'])) { $provider = $config['api_provider']; $apiData = $provider('api', $config['service'], $config['version']); if (!empty($apiData['operations'])) { foreach ($apiData['operations'] as $operation) { if (!empty($operation['endpointdiscovery']['required'])) { $enabled = \true; } } } } return function () use($enabled) { return Promise\Create::promiseFor(new Configuration($enabled, self::DEFAULT_CACHE_LIMIT)); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * @param int $cacheLimit * * @return callable */ public static function ini($profile = null, $filename = null, $cacheLimit = self::DEFAULT_CACHE_LIMIT) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename, $cacheLimit) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile]['endpoint_discovery_enabled'])) { return self::reject("Required endpoint discovery config values\n not present in INI profile '{$profile}' ({$filename})"); } return Promise\Create::promiseFor(new Configuration($data[$profile]['endpoint_discovery_enabled'], $cacheLimit)); }; } /** * Unwraps a configuration object in whatever valid form it is in, * always returning a ConfigurationInterface object. * * @param mixed $config * @return ConfigurationInterface * @throws \InvalidArgumentException */ public static function unwrap($config) { if (\is_callable($config)) { $config = $config(); } if ($config instanceof PromiseInterface) { $config = $config->wait(); } if ($config instanceof ConfigurationInterface) { return $config; } elseif (\is_array($config) && isset($config['enabled'])) { if (isset($config['cache_limit'])) { return new Configuration($config['enabled'], $config['cache_limit']); } return new Configuration($config['enabled'], self::DEFAULT_CACHE_LIMIT); } throw new \InvalidArgumentException('Not a valid endpoint_discovery ' . 'configuration argument.'); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Rule/RuleCreator.php000064400000001173147600374260025247 0ustar00rules = $this->createRules($definition['rules']); } /** * @return array */ public function getRules() { return $this->rules; } /** * If a tree rule's conditions evaluate successfully, iterate over its * subordinate rules and return a result if there is one. If any of the * subsequent rules are trees, the function will recurse until it reaches * an error or an endpoint rule * * @return mixed */ public function evaluate(array $inputParameters, RulesetStandardLibrary $standardLibrary) { if ($this->evaluateConditions($inputParameters, $standardLibrary)) { foreach ($this->rules as $rule) { $inputParametersCopy = $inputParameters; $evaluation = $rule->evaluate($inputParametersCopy, $standardLibrary); if ($evaluation !== \false) { return $evaluation; } } } return \false; } private function createRules(array $rules) { $rulesList = []; foreach ($rules as $rule) { $ruleType = RuleCreator::create($rule['type'], $rule); $rulesList[] = $ruleType; } return $rulesList; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Rule/AbstractRule.php000064400000002616147600374260025416 0ustar00conditions = $definition['conditions']; $this->documentation = isset($definition['documentation']) ? $definition['documentation'] : null; } /** * @return array */ public function getConditions() { return $this->conditions; } /** * @return mixed */ public function getDocumentation() { return $this->documentation; } /** * Determines if all conditions for a given rule are met. * * @return boolean */ protected function evaluateConditions(array &$inputParameters, RulesetStandardLibrary $standardLibrary) { foreach ($this->getConditions() as $condition) { $result = $standardLibrary->callFunction($condition, $inputParameters); if (\is_null($result) || $result === \false) { return \false; } } return \true; } public abstract function evaluate(array $inputParameters, RulesetStandardLibrary $standardLibrary); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Rule/EndpointRule.php000064400000006347147600374260025440 0ustar00endpoint = $definition['endpoint']; } /** * @return array */ public function getEndpoint() { return $this->endpoint; } /** * If all the rule's conditions are met, return the resolved * endpoint object. * * @return RulesetEndpoint | null */ public function evaluate(array $inputParameters, RulesetStandardLibrary $standardLibrary) { if ($this->evaluateConditions($inputParameters, $standardLibrary)) { return $this->resolve($inputParameters, $standardLibrary); } return \false; } /** * Given input parameters, resolve an endpoint in its entirety. * * @return RulesetEndpoint */ private function resolve(array $inputParameters, RulesetStandardLibrary $standardLibrary) { $uri = $standardLibrary->resolveValue($this->endpoint['url'], $inputParameters); $properties = isset($this->endpoint['properties']) ? $this->resolveProperties($this->endpoint['properties'], $inputParameters, $standardLibrary) : null; $headers = $this->resolveHeaders($inputParameters, $standardLibrary); return new RulesetEndpoint($uri, $properties, $headers); } /** * Recurse through an endpoint's `properties` attribute, resolving template * strings when found. Return the fully resolved attribute. * * @return array */ private function resolveProperties($properties, array $inputParameters, RulesetStandardLibrary $standardLibrary) { if (\is_array($properties)) { $propertiesArr = []; foreach ($properties as $key => $val) { $propertiesArr[$key] = $this->resolveProperties($val, $inputParameters, $standardLibrary); } return $propertiesArr; } elseif ($standardLibrary->isTemplate($properties)) { return $standardLibrary->resolveTemplateString($properties, $inputParameters); } return $properties; } /** * If present, iterate through an endpoint's headers attribute resolving * values along the way. Return the fully resolved attribute. * * @return array */ private function resolveHeaders(array $inputParameters, RulesetStandardLibrary $standardLibrary) { $headers = isset($this->endpoint['headers']) ? $this->endpoint['headers'] : null; if (\is_null($headers)) { return null; } $resolvedHeaders = []; foreach ($headers as $headerName => $headerValues) { $resolvedValues = []; foreach ($headerValues as $value) { $resolvedValue = $standardLibrary->resolveValue($value, $inputParameters, $standardLibrary); $resolvedValues[] = $resolvedValue; } $resolvedHeaders[$headerName] = $resolvedValues; } return $resolvedHeaders; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Rule/ErrorRule.php000064400000002120147600374260024732 0ustar00error = $definition['error']; } /** * @return array */ public function getError() { return $this->error; } /** * If an error rule's conditions are met, raise an * UnresolvedEndpointError containing the fully resolved error string. * * @return null * @throws UnresolvedEndpointException */ public function evaluate(array $inputParameters, RulesetStandardLibrary $standardLibrary) { if ($this->evaluateConditions($inputParameters, $standardLibrary)) { $message = $standardLibrary->resolveValue($this->error, $inputParameters); throw new UnresolvedEndpointException($message); } return \false; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetParameter.php000064400000006600147600374260027020 0ustar00isValidType($type)) { $this->type = $type; } else { throw new UnresolvedEndpointException('Unknown parameter type ' . "`{$type}`" . '. Parameters must be of type `String` or `Boolean`.'); } $this->name = $name; $this->builtIn = isset($definition['builtIn']) ? $definition['builtIn'] : null; $this->default = isset($definition['default']) ? $definition['default'] : null; $this->required = isset($definition['required']) ? $definition['required'] : \false; $this->documentation = isset($definition['documentation']) ? $definition['documentation'] : null; $this->deprecated = isset($definition['deprecated']) ? $definition['deprecated'] : \false; } /** * @return mixed */ public function getName() { return $this->name; } /** * @return mixed */ public function getType() { return $this->type; } /** * @return mixed */ public function getBuiltIn() { return $this->builtIn; } /** * @return mixed */ public function getDefault() { return $this->default; } /** * @return boolean */ public function getRequired() { return $this->required; } /** * @return string */ public function getDocumentation() { return $this->documentation; } /** * @return boolean */ public function getDeprecated() { return $this->deprecated; } /** * Validates that an input parameter matches the type provided in its definition. * * @return void * @throws InvalidArgumentException */ public function validateInputParam($inputParam) { $typeMap = ['String' => 'is_string', 'Boolean' => 'is_bool']; if ($typeMap[$this->type]($inputParam) === \false) { throw new UnresolvedEndpointException("Input parameter `{$this->name}` is the wrong type. Must be a {$this->type}."); } if ($this->deprecated) { $deprecated = $this->deprecated; $deprecationString = "{$this->name} has been deprecated "; $msg = isset($deprecated['message']) ? $deprecated['message'] : null; $since = isset($deprecated['since']) ? $deprecated['since'] : null; if (!\is_null($since)) { $deprecationString = $deprecationString . 'since ' . $since . '. '; } if (!\is_null($msg)) { $deprecationString = $deprecationString . $msg; } \trigger_error($deprecationString, \E_USER_WARNING); } } private function isValidType($type) { return \in_array($type, ['String', 'Boolean']); } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetStandardLibrary.php000064400000027774147600374260030125 0ustar00addons[^\\{\\}]+)|(?R))*\\}#x'; const HOST_LABEL_RE = '/^(?!-)[a-zA-Z\\d-]{1,63}(?partitions = $partitions; } /** * Determines if a value is set. * * @return boolean */ public function is_set($value) { return isset($value); } /** * Function implementation of logical operator `not` * * @return boolean */ public function not($value) { return !$value; } /** * Find an attribute within a value given a path string. * * @return mixed */ public function getAttr($from, $path) { $parts = \explode('.', $path); foreach ($parts as $part) { $sliceIdx = \strpos($part, '['); if ($sliceIdx !== \false) { if (\substr($part, -1) !== ']') { return null; } $slice = \intval(\substr($part, $sliceIdx + 1, \strlen($part) - 1)); $from = isset($from[\substr($part, 0, $sliceIdx)][$slice]) ? $from[\substr($part, 0, $sliceIdx)][$slice] : null; } else { $from = $from[$part]; } } return $from; } /** * Computes a substring given the start index and end index. If `reverse` is * true, slice the string from the end instead. * * @return mixed */ public function substring($input, $start, $stop, $reverse) { if (!\is_string($input)) { throw new UnresolvedEndpointException('Input passed to `substring` must be `string`.'); } if (\preg_match('/[^\\x00-\\x7F]/', $input)) { return null; } if ($start >= $stop or \strlen($input) < $stop) { return null; } if (!$reverse) { return \substr($input, $start, $stop - $start); } else { $offset = \strlen($input) - $stop; $length = $stop - $start; return \substr($input, $offset, $length); } } /** * Evaluates two strings for equality. * * @return boolean */ public function stringEquals($string1, $string2) { if (!\is_string($string1) || !\is_string($string2)) { throw new UnresolvedEndpointException('Values passed to StringEquals must be `string`.'); } return $string1 === $string2; } /** * Evaluates two booleans for equality. * * @return boolean */ public function booleanEquals($boolean1, $boolean2) { return \filter_var($boolean1, \FILTER_VALIDATE_BOOLEAN) === \filter_var($boolean2, \FILTER_VALIDATE_BOOLEAN); } /** * Percent-encodes an input string. * * @return mixed */ public function uriEncode($input) { if (\is_null($input)) { return null; } return \str_replace('%7E', '~', \rawurlencode($input)); } /** * Parses URL string into components. * * @return mixed */ public function parseUrl($url) { $parsed = \parse_url($url); if ($parsed === \false || !empty($parsed['query'])) { return null; } elseif (!isset($parsed['scheme'])) { return null; } if ($parsed['scheme'] !== 'http' && $parsed['scheme'] !== 'https') { return null; } $urlInfo = []; $urlInfo['scheme'] = $parsed['scheme']; $urlInfo['authority'] = isset($parsed['host']) ? $parsed['host'] : ''; if (isset($parsed['port'])) { $urlInfo['authority'] = $urlInfo['authority'] . ":" . $parsed['port']; } $urlInfo['path'] = isset($parsed['path']) ? $parsed['path'] : ''; $urlInfo['normalizedPath'] = !empty($parsed['path']) ? \rtrim($urlInfo['path'] ?: '', '/' . "/") . '/' : '/'; $urlInfo['isIp'] = !isset($parsed['host']) ? 'false' : $this->isValidIp($parsed['host']); return $urlInfo; } /** * Evaluates whether a value is a valid host label per * RFC 1123. If allow_subdomains is true, split on `.` and validate * each subdomain separately. * * @return boolean */ public function isValidHostLabel($hostLabel, $allowSubDomains) { if (!isset($hostLabel) || !$allowSubDomains && \strpos($hostLabel, '.') != \false) { return \false; } if ($allowSubDomains) { foreach (\explode('.', $hostLabel) as $subdomain) { if (!$this->validateHostLabel($subdomain)) { return \false; } } return \true; } else { return $this->validateHostLabel($hostLabel); } } /** * Parse and validate string for ARN components. * * @return array|null */ public function parseArn($arnString) { if (\is_null($arnString) || \substr($arnString, 0, 3) !== "arn") { return null; } $arn = []; $parts = \explode(':', $arnString, 6); if (\sizeof($parts) < 6) { return null; } $arn['partition'] = isset($parts[1]) ? $parts[1] : null; $arn['service'] = isset($parts[2]) ? $parts[2] : null; $arn['region'] = isset($parts[3]) ? $parts[3] : null; $arn['accountId'] = isset($parts[4]) ? $parts[4] : null; $arn['resourceId'] = isset($parts[5]) ? $parts[5] : null; if (empty($arn['partition']) || empty($arn['service']) || empty($arn['resourceId'])) { return null; } $resource = $arn['resourceId']; $arn['resourceId'] = \preg_split("/[:\\/]/", $resource); return $arn; } /** * Matches a region string to an AWS partition. * * @return mixed */ public function partition($region) { if (!\is_string($region)) { throw new UnresolvedEndpointException('Value passed to `partition` must be `string`.'); } $partitions = $this->partitions; foreach ($partitions['partitions'] as $partition) { if (\array_key_exists($region, $partition['regions']) || \preg_match("/{$partition['regionRegex']}/", $region)) { return $partition['outputs']; } } //return `aws` partition if no match is found. return $partitions['partitions'][0]['outputs']; } /** * Evaluates whether a value is a valid bucket name for virtual host * style bucket URLs. * * @return boolean */ public function isVirtualHostableS3Bucket($bucketName, $allowSubdomains) { if (\is_null($bucketName) || (\strlen($bucketName) < 3 || \strlen($bucketName) > 63) || \preg_match(self::IPV4_RE, $bucketName) || \strtolower($bucketName) !== $bucketName) { return \false; } if ($allowSubdomains) { $labels = \explode('.', $bucketName); $results = []; foreach ($labels as $label) { $results[] = $this->isVirtualHostableS3Bucket($label, \false); } return !\in_array(\false, $results); } return $this->isValidHostLabel($bucketName, \false); } public function callFunction($funcCondition, &$inputParameters) { $funcArgs = []; foreach ($funcCondition['argv'] as $arg) { $funcArgs[] = $this->resolveValue($arg, $inputParameters); } $funcName = \str_replace('aws.', '', $funcCondition['fn']); if ($funcName === 'isSet') { $funcName = 'is_set'; } $result = \call_user_func_array([RulesetStandardLibrary::class, $funcName], $funcArgs); if (isset($funcCondition['assign'])) { $assign = $funcCondition['assign']; if (isset($inputParameters[$assign])) { throw new UnresolvedEndpointException("Assignment `{$assign}` already exists in input parameters" . " or has already been assigned by an endpoint rule and cannot be overwritten."); } $inputParameters[$assign] = $result; } return $result; } public function resolveValue($value, $inputParameters) { //Given a value, check if it's a function, reference or template. //returns resolved value if ($this->isFunc($value)) { return $this->callFunction($value, $inputParameters); } elseif ($this->isRef($value)) { return isset($inputParameters[$value['ref']]) ? $inputParameters[$value['ref']] : null; } elseif ($this->isTemplate($value)) { return $this->resolveTemplateString($value, $inputParameters); } return $value; } public function isFunc($arg) { return \is_array($arg) && isset($arg['fn']); } public function isRef($arg) { return \is_array($arg) && isset($arg['ref']); } public function isTemplate($arg) { return \is_string($arg) && !empty(\preg_match(self::TEMPLATE_SEARCH_RE, $arg)); } public function resolveTemplateString($value, $inputParameters) { return \preg_replace_callback(self::TEMPLATE_PARSE_RE, function ($match) use($inputParameters) { if (\preg_match(self::TEMPLATE_ESCAPE_RE, $match[0])) { return $match[1]; } $notFoundMessage = 'Resolved value was null. Please check rules and ' . 'input parameters and try again.'; $parts = \explode("#", $match[1]); if (\count($parts) > 1) { $resolvedValue = $inputParameters; foreach ($parts as $part) { if (!isset($resolvedValue[$part])) { throw new UnresolvedEndpointException($notFoundMessage); } $resolvedValue = $resolvedValue[$part]; } return $resolvedValue; } else { if (!isset($inputParameters[$parts[0]])) { throw new UnresolvedEndpointException($notFoundMessage); } return $inputParameters[$parts[0]]; } }, $value); } private function validateHostLabel($hostLabel) { if (empty($hostLabel) || \strlen($hostLabel) > 63) { return \false; } if (\preg_match(self::HOST_LABEL_RE, $hostLabel)) { return \true; } return \false; } private function isValidIp($hostName) { $isWrapped = \strpos($hostName, '[') === 0 && \strrpos($hostName, ']') === \strlen($hostName) - 1; return \preg_match(self::IPV4_RE, $hostName) || $isWrapped && \preg_match(self::IPV6_RE, $hostName) ? 'true' : 'false'; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Ruleset/RulesetEndpoint.php000064400000001532147600374260026657 0ustar00url = $url; $this->properties = $properties; $this->headers = $headers; } /** * @return mixed */ public function getUrl() { return $this->url; } /** * @return mixed */ public function getProperties() { return $this->properties; } /** * @return mixed */ public function getHeaders() { return $this->headers; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/Ruleset/Ruleset.php000064400000005517147600374260025165 0ustar00version = $ruleset['version']; $this->parameters = $this->createParameters($ruleset['parameters']); $this->rules = $this->createRules($ruleset['rules']); $this->standardLibrary = new RulesetStandardLibrary($partitions); } /** * @return mixed */ public function getVersion() { return $this->version; } /** * @return array */ public function getParameters() { return $this->parameters; } /** * @return array */ public function getRules() { return $this->rules; } /** * Evaluate the ruleset against the input parameters. * Return the first rule the parameters match against. * * @return mixed */ public function evaluate(array $inputParameters) { $this->validateInputParameters($inputParameters); foreach ($this->rules as $rule) { $evaluation = $rule->evaluate($inputParameters, $this->standardLibrary); if ($evaluation !== \false) { return $evaluation; } } return \false; } /** * Ensures all corresponding client-provided parameters match * the Ruleset parameter's specified type. * * @return void */ private function validateInputParameters(array &$inputParameters) { foreach ($this->parameters as $paramName => $param) { $inputParam = isset($inputParameters[$paramName]) ? $inputParameters[$paramName] : null; if (\is_null($inputParam) && !\is_null($param->getDefault())) { $inputParameters[$paramName] = $param->getDefault(); } elseif (!\is_null($inputParam)) { $param->validateInputParam($inputParam); } } } private function createParameters(array $parameters) { $parameterList = []; foreach ($parameters as $name => $definition) { $parameterList[$name] = new RulesetParameter($name, $definition); } return $parameterList; } private function createRules(array $rules) { $rulesList = []; foreach ($rules as $rule) { $ruleObj = RuleCreator::create($rule['type'], $rule); $rulesList[] = $ruleObj; } return $rulesList; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/EndpointProviderV2.php000064400000003341147600374260025613 0ustar00ruleset = new Ruleset($ruleset, $partitions); $this->cache = new LruArrayCache(100); } /** * @return Ruleset */ public function getRuleset() { return $this->ruleset; } /** * Given a Ruleset and input parameters, determines the correct endpoint * or an error to be thrown for a given request. * * @return RulesetEndpoint * @throws UnresolvedEndpointException */ public function resolveEndpoint(array $inputParameters) { $hashedParams = $this->hashInputParameters($inputParameters); $match = $this->cache->get($hashedParams); if (!\is_null($match)) { return $match; } $endpoint = $this->ruleset->evaluate($inputParameters); if ($endpoint === \false) { throw new UnresolvedEndpointException('Unable to resolve an endpoint using the provider arguments: ' . \json_encode($inputParameters)); } $this->cache->set($hashedParams, $endpoint); return $endpoint; } private function hashInputParameters($inputParameters) { return \md5(\serialize($inputParameters)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointV2/EndpointDefinitionProvider.php000064400000004247147600374260027422 0ustar00resolveProviderArgs($endpointProvider, $operation, $commandArgs, $clientArgs); $endpoint = $endpointProvider->resolveEndpoint($providerArgs); $resolvedUrl = $endpoint->getUrl(); $this->applyScheme($resolvedUrl); $this->endpoint = $resolvedUrl; $this->applyAuthSchemeToCommand($endpoint, $command); $this->applyHeaders($endpoint, $headers); } private function resolveProviderArgs($endpointProvider, $operation, $commandArgs, $clientArgs) { $rulesetParams = $endpointProvider->getRuleset()->getParameters(); $endpointCommandArgs = $this->filterEndpointCommandArgs($rulesetParams, $commandArgs); $staticContextParams = $this->bindStaticContextParams($operation->getStaticContextParams()); $contextParams = $this->bindContextParams($commandArgs, $operation->getContextParams()); $providerArgs = $this->normalizeEndpointProviderArgs($endpointCommandArgs, $clientArgs, $contextParams, $staticContextParams); return $providerArgs; } /** * Merges endpoint provider arguments from different sources. * Client built-ins are superseded by client context params. * Client context params are superseded by context params on * an input member's shape. Context params are superseded by * static context params. The result of this combination is then * merged with any appropriate arguments from the command. */ private function normalizeEndpointProviderArgs($endpointCommandArgs, $clientArgs, $contextParams, $staticContextParams) { $commandContextParams = \array_merge($contextParams, $staticContextParams); $combinedEndpointArgs = \array_merge($clientArgs, $commandContextParams); return \array_merge($combinedEndpointArgs, $endpointCommandArgs); } private function bindContextParams($commandArgs, $contextParams) { $scopedParams = []; foreach ($contextParams as $name => $spec) { if (isset($commandArgs[$spec['shape']])) { $scopedParams[$name] = $commandArgs[$spec['shape']]; } } return $scopedParams; } private function bindStaticContextParams($staticContextParams) { $scopedParams = []; foreach ($staticContextParams as $paramName => $paramValue) { $scopedParams[$paramName] = $paramValue['value']; } return $scopedParams; } private function filterEndpointCommandArgs($rulesetParams, $commandArgs) { $endpointMiddlewareOpts = ['@use_dual_stack_endpoint' => 'UseDualStack', '@use_accelerate_endpoint' => 'Accelerate', '@use_path_style_endpoint' => 'ForcePathStyle']; $filteredArgs = []; foreach ($rulesetParams as $name => $value) { if (isset($commandArgs[$name])) { if (!empty($value->getBuiltIn())) { continue; } $filteredArgs[$name] = $commandArgs[$name]; } } if ($this->api->getServiceName() === 's3') { foreach ($endpointMiddlewareOpts as $optionName => $newValue) { if (isset($commandArgs[$optionName])) { $filteredArgs[$newValue] = $commandArgs[$optionName]; } } } return $filteredArgs; } private function applyHeaders($endpoint, &$headers) { if (!\is_null($endpoint->getHeaders())) { $headers = \array_merge($headers, $endpoint->getHeaders()); } } private function applyAuthSchemeToCommand($endpoint, $command) { if (isset($endpoint->getProperties()['authSchemes'])) { $authScheme = $this->selectAuthScheme($endpoint->getProperties()['authSchemes']); $command->setAuthSchemes($authScheme); } } private function selectAuthScheme($authSchemes) { $validAuthSchemes = ['sigv4', 'sigv4a', 'none', 'bearer']; $invalidAuthSchemes = []; foreach ($authSchemes as $authScheme) { if (\in_array($authScheme['name'], $validAuthSchemes)) { return $this->normalizeAuthScheme($authScheme); } else { $invalidAuthSchemes[] = "`{$authScheme['name']}`"; } } $invalidAuthSchemesString = \implode(', ', $invalidAuthSchemes); $validAuthSchemesString = '`' . \implode('`, `', $validAuthSchemes) . '`'; throw new \InvalidArgumentException("This operation requests {$invalidAuthSchemesString}" . " auth schemes, but the client only supports {$validAuthSchemesString}."); } private function normalizeAuthScheme($authScheme) { /* sigv4a will contain a regionSet property. which is guaranteed to be `*` for now. The SigV4 class handles this automatically for now. It seems complexity will be added here in the future. */ $normalizedAuthScheme = []; if (isset($authScheme['disableDoubleEncoding']) && $authScheme['disableDoubleEncoding'] === \true && $authScheme['name'] !== 'sigv4a') { $normalizedAuthScheme['version'] = 's3v4'; } elseif ($authScheme['name'] === 'none') { $normalizedAuthScheme['version'] = 'anonymous'; } else { $normalizedAuthScheme['version'] = \str_replace('sig', '', $authScheme['name']); } $normalizedAuthScheme['name'] = isset($authScheme['signingName']) ? $authScheme['signingName'] : null; $normalizedAuthScheme['region'] = isset($authScheme['signingRegion']) ? $authScheme['signingRegion'] : null; $normalizedAuthScheme['signingRegionSet'] = isset($authScheme['signingRegionSet']) ? $authScheme['signingRegionSet'] : null; return $normalizedAuthScheme; } private function applyScheme(&$resolvedUrl) { $resolvedEndpointScheme = \parse_url($resolvedUrl, \PHP_URL_SCHEME); $scheme = $this->endpoint instanceof Uri ? $this->endpoint->getScheme() : \parse_url($this->endpoint, \PHP_URL_SCHEME); if (!empty($scheme) && $scheme !== $resolvedEndpointScheme) { $resolvedUrl = \str_replace($resolvedEndpointScheme, $scheme, $resolvedUrl); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Exception/InvalidJsonException.php000064400000000431147600374260026152 0ustar00data = isset($context['body']) ? $context['body'] : []; $this->command = $command; $this->response = isset($context['response']) ? $context['response'] : null; $this->request = isset($context['request']) ? $context['request'] : null; $this->requestId = isset($context['request_id']) ? $context['request_id'] : null; $this->errorType = isset($context['type']) ? $context['type'] : null; $this->errorCode = isset($context['code']) ? $context['code'] : null; $this->errorShape = isset($context['error_shape']) ? $context['error_shape'] : null; $this->connectionError = !empty($context['connection_error']); $this->result = isset($context['result']) ? $context['result'] : null; $this->transferInfo = isset($context['transfer_stats']) ? $context['transfer_stats'] : []; $this->errorMessage = isset($context['message']) ? $context['message'] : null; $this->monitoringEvents = []; $this->maxRetriesExceeded = \false; parent::__construct($message, 0, $previous); } public function __toString() { if (!$this->getPrevious()) { return parent::__toString(); } // PHP strangely shows the innermost exception first before the outer // exception message. It also has a default character limit for // exception message strings such that the "next" exception (this one) // might not even get shown, causing developers to attempt to catch // the inner exception instead of the actual exception because they // can't see the outer exception's __toString output. return \sprintf("exception '%s' with message '%s'\n\n%s", \get_class($this), $this->getMessage(), parent::__toString()); } /** * Get the command that was executed. * * @return CommandInterface */ public function getCommand() { return $this->command; } /** * Get the concise error message if any. * * @return string|null */ public function getAwsErrorMessage() { return $this->errorMessage; } /** * Get the sent HTTP request if any. * * @return RequestInterface|null */ public function getRequest() { return $this->request; } /** * Get the received HTTP response if any. * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Get the result of the exception if available * * @return ResultInterface|null */ public function getResult() { return $this->result; } /** * Returns true if this is a connection error. * * @return bool */ public function isConnectionError() { return $this->connectionError; } /** * If available, gets the HTTP status code of the corresponding response * * @return int|null */ public function getStatusCode() { return $this->response ? $this->response->getStatusCode() : null; } /** * Get the request ID of the error. This value is only present if a * response was received and is not present in the event of a networking * error. * * @return string|null Returns null if no response was received */ public function getAwsRequestId() { return $this->requestId; } /** * Get the AWS error type. * * @return string|null Returns null if no response was received */ public function getAwsErrorType() { return $this->errorType; } /** * Get the AWS error code. * * @return string|null Returns null if no response was received */ public function getAwsErrorCode() { return $this->errorCode; } /** * Get the AWS error shape. * * @return Shape|null Returns null if no response was received */ public function getAwsErrorShape() { return $this->errorShape; } /** * Get all transfer information as an associative array if no $name * argument is supplied, or gets a specific transfer statistic if * a $name attribute is supplied (e.g., 'retries_attempted'). * * @param string $name Name of the transfer stat to retrieve * * @return mixed|null|array */ public function getTransferInfo($name = null) { if (!$name) { return $this->transferInfo; } return isset($this->transferInfo[$name]) ? $this->transferInfo[$name] : null; } /** * Replace the transfer information associated with an exception. * * @param array $info */ public function setTransferInfo(array $info) { $this->transferInfo = $info; } /** * Returns whether the max number of retries is exceeded. * * @return bool */ public function isMaxRetriesExceeded() { return $this->maxRetriesExceeded; } /** * Sets the flag for max number of retries exceeded. */ public function setMaxRetriesExceeded() { $this->maxRetriesExceeded = \true; } public function hasKey($name) { return isset($this->data[$name]); } public function get($key) { return $this[$key]; } public function search($expression) { return JmesPath::search($expression, $this->toArray()); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Exception/UnresolvedEndpointException.php000064400000000440147600374260027561 0ustar00 'uploading parts to']); $msg .= ". The following parts had errors:\n"; /** @var $error AwsException */ foreach ($prev as $part => $error) { $msg .= "- Part {$part}: " . $error->getMessage() . "\n"; } } elseif ($prev instanceof AwsException) { switch ($prev->getCommand()->getName()) { case 'CreateMultipartUpload': case 'InitiateMultipartUpload': $action = 'initiating'; break; case 'CompleteMultipartUpload': $action = 'completing'; break; } if (isset($action)) { $msg = \strtr($msg, ['performing' => $action]); } $msg .= ": {$prev->getMessage()}"; } if (!$prev instanceof \Exception) { $prev = null; } parent::__construct($msg, 0, $prev); $this->state = $state; } /** * Get the state of the transfer * * @return UploadState */ public function getState() { return $this->state; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Exception/CommonRuntimeException.php000064400000000155147600374260026531 0ustar00errorCode = $code; $this->errorMessage = $message; parent::__construct($message); } /** * Get the AWS error code. * * @return string|null Returns null if no response was received */ public function getAwsErrorCode() { return $this->errorCode; } /** * Get the concise error message if any. * * @return string|null */ public function getAwsErrorMessage() { return $this->errorMessage; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Exception/CredentialsException.php000064400000000431147600374260026167 0ustar00 \true, 'expect' => \true, 'cert' => \true, 'verify' => \true, 'timeout' => \true, 'debug' => \true, 'connect_timeout' => \true, 'stream' => \true, 'delay' => \true, 'sink' => \true]; /** @var ClientInterface */ private $client; /** * @param ClientInterface $client */ public function __construct(ClientInterface $client = null) { $this->client = $client ?: new Client(); } /** * @param Psr7Request $request * @param array $options * @return Promise\Promise|Promise\PromiseInterface * @throws \VendorDuplicator\GuzzleHttp\Exception\GuzzleException */ public function __invoke(Psr7Request $request, array $options = []) { // Create and send a Guzzle 5 request $guzzlePromise = $this->client->send($this->createGuzzleRequest($request, $options)); $promise = new Promise\Promise(function () use($guzzlePromise) { try { $guzzlePromise->wait(); } catch (\Exception $e) { // The promise is already delivered when the exception is // thrown, so don't rethrow it. } }, [$guzzlePromise, 'cancel']); $guzzlePromise->then([$promise, 'resolve'], [$promise, 'reject']); return $promise->then(function (GuzzleResponse $response) { // Adapt the Guzzle 5 Future to a Guzzle 6 ResponsePromise. return $this->createPsr7Response($response); }, function (Exception $exception) use($options) { // If we got a 'sink' that's a path, set the response body to // the contents of the file. This will build the resulting // exception with more information. if ($exception instanceof RequestException) { if (isset($options['sink'])) { if (!$options['sink'] instanceof Psr7StreamInterface) { $exception->getResponse()->setBody(Stream::factory(\file_get_contents($options['sink']))); } } } // Reject with information about the error. return new Promise\RejectedPromise($this->prepareErrorData($exception)); }); } private function createGuzzleRequest(Psr7Request $psrRequest, array $options) { $ringConfig = []; $statsCallback = isset($options['http_stats_receiver']) ? $options['http_stats_receiver'] : null; unset($options['http_stats_receiver']); // Remove unsupported options. foreach (\array_keys($options) as $key) { if (!isset(self::$validOptions[$key])) { unset($options[$key]); } } // Handle delay option. if (isset($options['delay'])) { $ringConfig['delay'] = $options['delay']; unset($options['delay']); } // Prepare sink option. if (isset($options['sink'])) { $ringConfig['save_to'] = $options['sink'] instanceof Psr7StreamInterface ? new GuzzleStream($options['sink']) : $options['sink']; unset($options['sink']); } // Ensure that all requests are async and lazy like Guzzle 6. $options['future'] = 'lazy'; // Create the Guzzle 5 request from the provided PSR7 request. $request = $this->client->createRequest($psrRequest->getMethod(), $psrRequest->getUri(), $options); if (\is_callable($statsCallback)) { $request->getEmitter()->on('end', function (EndEvent $event) use($statsCallback) { $statsCallback($event->getTransferInfo()); }); } // For the request body, adapt the PSR stream to a Guzzle stream. $body = $psrRequest->getBody(); if ($body->getSize() === 0) { $request->setBody(null); } else { $request->setBody(new GuzzleStream($body)); } $request->setHeaders($psrRequest->getHeaders()); $request->setHeader('User-Agent', $request->getHeader('User-Agent') . ' ' . Client::getDefaultUserAgent()); // Make sure the delay is configured, if provided. if ($ringConfig) { foreach ($ringConfig as $k => $v) { $request->getConfig()->set($k, $v); } } return $request; } private function createPsr7Response(GuzzleResponse $response) { if ($body = $response->getBody()) { $body = new PsrStream($body); } return new Psr7Response($response->getStatusCode(), $response->getHeaders(), $body, $response->getReasonPhrase()); } private function prepareErrorData(Exception $e) { $error = ['exception' => $e, 'connection_error' => \false, 'response' => null]; if ($e instanceof ConnectException) { $error['connection_error'] = \true; } if ($e instanceof RequestException && $e->getResponse()) { $error['response'] = $this->createPsr7Response($e->getResponse()); } return $error; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Handler/GuzzleV5/GuzzleStream.php000064400000001137147600374260025625 0ustar00stream = $stream; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Handler/GuzzleV5/PsrStream.php000064400000001402147600374260025104 0ustar00stream = $stream; } public function rewind() { $this->stream->seek(0); } public function getContents() { return $this->stream->getContents(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Handler/GuzzleV6/GuzzleHandler.php000064400000004361147600374260025752 0ustar00client = $client ?: new Client(); } /** * @param Psr7Request $request * @param array $options * * @return Promise\Promise */ public function __invoke(Psr7Request $request, array $options = []) { $request = $request->withHeader('User-Agent', $request->getHeaderLine('User-Agent') . ' ' . \VendorDuplicator\GuzzleHttp\default_user_agent()); return $this->client->sendAsync($request, $this->parseOptions($options))->otherwise(static function ($e) { $error = ['exception' => $e, 'connection_error' => $e instanceof ConnectException, 'response' => null]; if ($e instanceof RequestException && $e->getResponse()) { $error['response'] = $e->getResponse(); } return new Promise\RejectedPromise($error); }); } private function parseOptions(array $options) { if (isset($options['http_stats_receiver'])) { $fn = $options['http_stats_receiver']; unset($options['http_stats_receiver']); $prev = isset($options['on_stats']) ? $options['on_stats'] : null; $options['on_stats'] = static function (TransferStats $stats) use($fn, $prev) { if (\is_callable($prev)) { $prev($stats); } $transferStats = ['total_time' => $stats->getTransferTime()]; $transferStats += $stats->getHandlerStats(); $fn($transferStats); }; } return $options; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Retry/Exception/ConfigurationException.php000064400000000545147600374260027654 0ustar00withHeader('aws-sdk-retry', "{$retries}/{$delayBy}"); } private function updateStats($retries, $delay, array &$stats) { if (!isset($stats['total_retry_delay'])) { $stats['total_retry_delay'] = 0; } $stats['total_retry_delay'] += $delay; $stats['retries_attempted'] = $retries; } private function updateHttpStats($value, array &$stats) { if (empty($stats['http'])) { $stats['http'] = []; } if ($value instanceof AwsException) { $resultStats = $value->getTransferInfo(); $stats['http'][] = $resultStats; } elseif ($value instanceof ResultInterface) { $resultStats = isset($value['@metadata']['transferStats']['http'][0]) ? $value['@metadata']['transferStats']['http'][0] : []; $stats['http'][] = $resultStats; } } private function bindStatsToReturn($return, array $stats) { if ($return instanceof ResultInterface) { if (!isset($return['@metadata'])) { $return['@metadata'] = []; } $return['@metadata']['transferStats'] = $stats; } elseif ($return instanceof AwsException) { $return->setTransferInfo($stats); } return $return; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Retry/QuotaManager.php000064400000004610147600374260023611 0ustar00initialRetryTokens = isset($config['initial_retry_tokens']) ? $config['initial_retry_tokens'] : 500; $this->noRetryIncrement = isset($config['no_retry_increment']) ? $config['no_retry_increment'] : 1; $this->retryCost = isset($config['retry_cost']) ? $config['retry_cost'] : 5; $this->timeoutRetryCost = isset($config['timeout_retry_cost']) ? $config['timeout_retry_cost'] : 10; $this->maxCapacity = $this->initialRetryTokens; $this->availableCapacity = $this->initialRetryTokens; } public function hasRetryQuota($result) { if ($result instanceof AwsException && $result->isConnectionError()) { $this->capacityAmount = $this->timeoutRetryCost; } else { $this->capacityAmount = $this->retryCost; } if ($this->capacityAmount > $this->availableCapacity) { return \false; } $this->availableCapacity -= $this->capacityAmount; return \true; } public function releaseToQuota($result) { if ($result instanceof AwsException) { $statusCode = (int) $result->getStatusCode(); } elseif ($result instanceof ResultInterface) { $statusCode = isset($result['@metadata']['statusCode']) ? (int) $result['@metadata']['statusCode'] : null; } if (!empty($statusCode) && $statusCode >= 200 && $statusCode < 300) { if (isset($this->capacityAmount)) { $amount = $this->capacityAmount; $this->availableCapacity += $amount; unset($this->capacityAmount); } else { $amount = $this->noRetryIncrement; $this->availableCapacity += $amount; } $this->availableCapacity = \min($this->availableCapacity, $this->maxCapacity); } return isset($amount) ? $amount : 0; } public function getAvailableCapacity() { return $this->availableCapacity; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Retry/Configuration.php000064400000002415147600374260024035 0ustar00validModes)) { throw new ConfigurationException("'{$mode}' is not a valid mode." . " The mode has to be 'legacy', 'standard', or 'adaptive'."); } if (!\is_numeric($maxAttempts) || \intval($maxAttempts) != $maxAttempts || $maxAttempts < 1) { throw new ConfigurationException("The 'maxAttempts' parameter has" . " to be an integer >= 1."); } $this->mode = $mode; $this->maxAttempts = \intval($maxAttempts); } /** * {@inheritdoc} */ public function getMode() { return $this->mode; } /** * {@inheritdoc} */ public function getMaxAttempts() { return $this->maxAttempts; } /** * {@inheritdoc} */ public function toArray() { return ['mode' => $this->getMode(), 'max_attempts' => $this->getMaxAttempts()]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Retry/RateLimiter.php000064400000011523147600374260023447 0ustar00beta = isset($options['beta']) ? $options['beta'] : 0.7; $this->minCapacity = isset($options['min_capacity']) ? $options['min_capacity'] : 1; $this->minFillRate = isset($options['min_fill_rate']) ? $options['min_fill_rate'] : 0.5; $this->scaleConstant = isset($options['scale_constant']) ? $options['scale_constant'] : 0.4; $this->smooth = isset($options['smooth']) ? $options['smooth'] : 0.8; $this->timeProvider = isset($options['time_provider']) ? $options['time_provider'] : null; $this->lastTxRateBucket = \floor($this->time()); $this->lastThrottleTime = $this->time(); } public function isEnabled() { return $this->enabled; } public function getSendToken() { $this->acquireToken(1); } public function updateSendingRate($isThrottled) { $this->updateMeasuredRate(); if ($isThrottled) { if (!$this->isEnabled()) { $rateToUse = $this->measuredTxRate; } else { $rateToUse = \min($this->measuredTxRate, $this->fillRate); } $this->lastMaxRate = $rateToUse; $this->calculateTimeWindow(); $this->lastThrottleTime = $this->time(); $calculatedRate = $this->cubicThrottle($rateToUse); $this->enableTokenBucket(); } else { $this->calculateTimeWindow(); $calculatedRate = $this->cubicSuccess($this->time()); } $newRate = \min($calculatedRate, 2 * $this->measuredTxRate); $this->updateTokenBucketRate($newRate); return $newRate; } private function acquireToken($amount) { if (!$this->enabled) { return \true; } $this->refillTokenBucket(); if ($amount > $this->currentCapacity) { \usleep((int) (1000000 * ($amount - $this->currentCapacity) / $this->fillRate)); } $this->currentCapacity -= $amount; return \true; } private function calculateTimeWindow() { $this->timeWindow = \pow($this->lastMaxRate * (1 - $this->beta) / $this->scaleConstant, 0.333); } private function cubicSuccess($timestamp) { $dt = $timestamp - $this->lastThrottleTime; return $this->scaleConstant * \pow($dt - $this->timeWindow, 3) + $this->lastMaxRate; } private function cubicThrottle($rateToUse) { return $rateToUse * $this->beta; } private function enableTokenBucket() { $this->enabled = \true; } private function refillTokenBucket() { $timestamp = $this->time(); if (!isset($this->lastTimestamp)) { $this->lastTimestamp = $timestamp; return; } $fillAmount = ($timestamp - $this->lastTimestamp) * $this->fillRate; $this->currentCapacity = $this->currentCapacity + $fillAmount; if (!\is_null($this->maxCapacity)) { $this->currentCapacity = \min($this->maxCapacity, $this->currentCapacity); } $this->lastTimestamp = $timestamp; } private function time() { if (\is_callable($this->timeProvider)) { $provider = $this->timeProvider; $time = $provider(); return $time; } return \microtime(\true); } private function updateMeasuredRate() { $timestamp = $this->time(); $timeBucket = \floor(\round($timestamp, 3) * 2) / 2; $this->requestCount++; if ($timeBucket > $this->lastTxRateBucket) { $currentRate = $this->requestCount / ($timeBucket - $this->lastTxRateBucket); $this->measuredTxRate = $currentRate * $this->smooth + $this->measuredTxRate * (1 - $this->smooth); $this->requestCount = 0; $this->lastTxRateBucket = $timeBucket; } } private function updateTokenBucketRate($newRps) { $this->refillTokenBucket(); $this->fillRate = \max($newRps, $this->minFillRate); $this->maxCapacity = \max($newRps, $this->minCapacity); $this->currentCapacity = \min($this->currentCapacity, $this->maxCapacity); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Retry/ConfigurationInterface.php000064400000001133147600374260025652 0ustar00 * use Aws\Sts\RegionalEndpoints\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see \Aws\Retry\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const DEFAULT_MAX_ATTEMPTS = 3; const DEFAULT_MODE = 'legacy'; const ENV_MAX_ATTEMPTS = 'AWS_MAX_ATTEMPTS'; const ENV_MODE = 'AWS_RETRY_MODE'; const ENV_PROFILE = 'AWS_PROFILE'; const INI_MAX_ATTEMPTS = 'max_attempts'; const INI_MODE = 'retry_mode'; public static $cacheKey = 'aws_retries_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback(); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['retries']) && $config['retries'] instanceof CacheInterface) { return self::cache($memo, $config['retries'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @return callable */ public static function env() { return function () { // Use config from environment variables, if available $mode = \getenv(self::ENV_MODE); $maxAttempts = \getenv(self::ENV_MAX_ATTEMPTS) ? \getenv(self::ENV_MAX_ATTEMPTS) : self::DEFAULT_MAX_ATTEMPTS; if (!empty($mode)) { return Promise\Create::promiseFor(new Configuration($mode, $maxAttempts)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_MODE); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback() { return function () { return Promise\Create::promiseFor(new Configuration(self::DEFAULT_MODE, self::DEFAULT_MAX_ATTEMPTS)); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_MODE])) { return self::reject("Required retry config values\n not present in INI profile '{$profile}' ({$filename})"); } $maxAttempts = isset($data[$profile][self::INI_MAX_ATTEMPTS]) ? $data[$profile][self::INI_MAX_ATTEMPTS] : self::DEFAULT_MAX_ATTEMPTS; return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_MODE], $maxAttempts)); }; } /** * Unwraps a configuration object in whatever valid form it is in, * always returning a ConfigurationInterface object. * * @param mixed $config * @return ConfigurationInterface * @throws \InvalidArgumentException */ public static function unwrap($config) { if (\is_callable($config)) { $config = $config(); } if ($config instanceof PromiseInterface) { $config = $config->wait(); } if ($config instanceof ConfigurationInterface) { return $config; } // An integer value for this config indicates the legacy 'retries' // config option, which is incremented to translate to max attempts if (\is_int($config)) { return new Configuration('legacy', $config + 1); } if (\is_array($config) && isset($config['mode'])) { $maxAttempts = isset($config['max_attempts']) ? $config['max_attempts'] : self::DEFAULT_MAX_ATTEMPTS; return new Configuration($config['mode'], $maxAttempts); } throw new \InvalidArgumentException('Not a valid retry configuration' . ' argument.'); } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/Exception/DeleteMultipleObjectsException.php000064400000003550147600374260030375 0ustar00addonsdeleted = \array_values($deleted); $this->errors = \array_values($errors); parent::__construct('Unable to delete certain keys when executing a' . ' DeleteMultipleObjects request: ' . self::createMessageFromErrors($errors)); } /** * Create a single error message from multiple errors. * * @param array $errors Errors encountered * * @return string */ public static function createMessageFromErrors(array $errors) { return "\n- " . \implode("\n- ", \array_map(function ($key) { return \json_encode($key); }, $errors)); } /** * Get the errored objects * * @return array Returns an array of associative arrays, each containing * a 'Code', 'Message', and 'Key' key. */ public function getErrors() { return $this->errors; } /** * Get the successfully deleted objects * * @return array Returns an array of associative arrays, each containing * a 'Key' and optionally 'DeleteMarker' and * 'DeleterMarkerVersionId' */ public function getDeleted() { return $this->deleted; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/Exception/PermanentRedirectException.php000064400000000156147600374260027636 0ustar00collectPathInfo($error->getCommand()); } elseif ($prev instanceof AwsException) { $this->collectPathInfo($prev->getCommand()); } parent::__construct($state, $prev); } /** * Get the Bucket information of the transfer object * * @return string|null Returns null when 'Bucket' information * is unavailable. */ public function getBucket() { return $this->bucket; } /** * Get the Key information of the transfer object * * @return string|null Returns null when 'Key' information * is unavailable. */ public function getKey() { return $this->key; } /** * Get the source file name of the transfer object * * @return string|null Returns null when metadata of the stream * wrapped in 'Body' parameter is unavailable. */ public function getSourceFileName() { return $this->filename; } /** * Collect file path information when accessible. (Bucket, Key) * * @param CommandInterface $cmd */ private function collectPathInfo(CommandInterface $cmd) { if (empty($this->bucket) && isset($cmd['Bucket'])) { $this->bucket = $cmd['Bucket']; } if (empty($this->key) && isset($cmd['Key'])) { $this->key = $cmd['Key']; } if (empty($this->filename) && isset($cmd['Body'])) { $this->filename = $cmd['Body']->getMetadata('uri'); } } } vendor-prefixed/aws/aws-sdk-php/src/S3/RegionalEndpoint/Exception/ConfigurationException.php000064400000000610147600374260032207 0ustar00addons/amazons3addonendpointsType = \strtolower($endpointsType); $this->isFallback = $isFallback; if (!\in_array($this->endpointsType, ['legacy', 'regional'])) { throw new \InvalidArgumentException("Configuration parameter must either be 'legacy' or 'regional'."); } } /** * {@inheritdoc} */ public function getEndpointsType() { return $this->endpointsType; } /** * {@inheritdoc} */ public function toArray() { return ['endpoints_type' => $this->getEndpointsType()]; } public function isFallback() { return $this->isFallback; } } amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/RegionalEndpoint/ConfigurationInterface.php000064400000000666147600374260030226 0ustar00addons * use Aws\S3\RegionalEndpoint\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see \Aws\S3\RegionalEndpoint\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const ENV_ENDPOINTS_TYPE = 'AWS_S3_US_EAST_1_REGIONAL_ENDPOINT'; const INI_ENDPOINTS_TYPE = 's3_us_east_1_regional_endpoint'; const DEFAULT_ENDPOINTS_TYPE = 'legacy'; public static $cacheKey = 'aws_s3_us_east_1_regional_endpoint_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback(); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['s3_us_east_1_regional_endpoint']) && $config['s3_us_east_1_regional_endpoint'] instanceof CacheInterface) { return self::cache($memo, $config['s3_us_east_1_regional_endpoint'], self::$cacheKey); } return $memo; } public static function env() { return function () { // Use config from environment variables, if available $endpointsType = \getenv(self::ENV_ENDPOINTS_TYPE); if (!empty($endpointsType)) { return Promise\Create::promiseFor(new Configuration($endpointsType)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_ENDPOINTS_TYPE); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_ENDPOINTS_TYPE])) { return self::reject("Required S3 regional endpoint config values\n not present in INI profile '{$profile}' ({$filename})"); } return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_ENDPOINTS_TYPE])); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback() { return function () { return Promise\Create::promiseFor(new Configuration(self::DEFAULT_ENDPOINTS_TYPE, \true)); }; } /** * Unwraps a configuration object in whatever valid form it is in, * always returning a ConfigurationInterface object. * * @param mixed $config * @return ConfigurationInterface * @throws \InvalidArgumentException */ public static function unwrap($config) { if (\is_callable($config)) { $config = $config(); } if ($config instanceof Promise\PromiseInterface) { $config = $config->wait(); } if ($config instanceof ConfigurationInterface) { return $config; } if (\is_string($config)) { return new Configuration($config); } if (\is_array($config) && isset($config['endpoints_type'])) { return new Configuration($config['endpoints_type']); } throw new \InvalidArgumentException('Not a valid S3 regional endpoint ' . 'configuration argument.'); } } vendor-prefixed/aws/aws-sdk-php/src/S3/UseArnRegion/Exception/ConfigurationException.php000064400000000577147600374260031323 0ustar00addons/amazons3addonuseArnRegion = Aws\boolean_value($useArnRegion); if (\is_null($this->useArnRegion)) { throw new ConfigurationException("'use_arn_region' config option" . " must be a boolean value."); } } /** * {@inheritdoc} */ public function isUseArnRegion() { return $this->useArnRegion; } /** * {@inheritdoc} */ public function toArray() { return ['use_arn_region' => $this->isUseArnRegion()]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/UseArnRegion/ConfigurationInterface.php000064400000000600147600374260027371 0ustar00 * use Aws\S3\UseArnRegion\ConfigurationProvider; * $provider = ConfigurationProvider::defaultProvider(); * // Returns a ConfigurationInterface or throws. * $config = $provider()->wait(); * * * Configuration providers can be composed to create configuration using * conditional logic that can create different configurations in different * environments. You can compose multiple providers into a single provider using * {@see Aws\S3\UseArnRegion\ConfigurationProvider::chain}. This function * accepts providers as variadic arguments and returns a new function that will * invoke each provider until a successful configuration is returned. * * * // First try an INI file at this location. * $a = ConfigurationProvider::ini(null, '/path/to/file.ini'); * // Then try an INI file at this location. * $b = ConfigurationProvider::ini(null, '/path/to/other-file.ini'); * // Then try loading from environment variables. * $c = ConfigurationProvider::env(); * // Combine the three providers together. * $composed = ConfigurationProvider::chain($a, $b, $c); * // Returns a promise that is fulfilled with a configuration or throws. * $promise = $composed(); * // Wait on the configuration to resolve. * $config = $promise->wait(); * */ class ConfigurationProvider extends AbstractConfigurationProvider implements ConfigurationProviderInterface { const ENV_USE_ARN_REGION = 'AWS_S3_USE_ARN_REGION'; const INI_USE_ARN_REGION = 's3_use_arn_region'; const DEFAULT_USE_ARN_REGION = \true; public static $cacheKey = 'aws_s3_use_arn_region_config'; protected static $interfaceClass = ConfigurationInterface::class; protected static $exceptionClass = ConfigurationException::class; /** * Create a default config provider that first checks for environment * variables, then checks for a specified profile in the environment-defined * config file location (env variable is 'AWS_CONFIG_FILE', file location * defaults to ~/.aws/config), then checks for the "default" profile in the * environment-defined config file location, and failing those uses a default * fallback set of configuration options. * * This provider is automatically wrapped in a memoize function that caches * previously provided config options. * * @param array $config * * @return callable */ public static function defaultProvider(array $config = []) { $configProviders = [self::env()]; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] != \false) { $configProviders[] = self::ini(); } $configProviders[] = self::fallback(); $memo = self::memoize(\call_user_func_array([ConfigurationProvider::class, 'chain'], $configProviders)); if (isset($config['use_arn_region']) && $config['use_arn_region'] instanceof CacheInterface) { return self::cache($memo, $config['use_arn_region'], self::$cacheKey); } return $memo; } /** * Provider that creates config from environment variables. * * @return callable */ public static function env() { return function () { // Use config from environment variables, if available $useArnRegion = \getenv(self::ENV_USE_ARN_REGION); if (!empty($useArnRegion)) { return Promise\Create::promiseFor(new Configuration($useArnRegion)); } return self::reject('Could not find environment variable config' . ' in ' . self::ENV_USE_ARN_REGION); }; } /** * Config provider that creates config using a config file whose location * is specified by an environment variable 'AWS_CONFIG_FILE', defaulting to * ~/.aws/config if not specified * * @param string|null $profile Profile to use. If not specified will use * the "default" profile. * @param string|null $filename If provided, uses a custom filename rather * than looking in the default directory. * * @return callable */ public static function ini($profile = null, $filename = null) { $filename = $filename ?: self::getDefaultConfigFilename(); $profile = $profile ?: (\getenv(self::ENV_PROFILE) ?: 'default'); return function () use($profile, $filename) { if (!@\is_readable($filename)) { return self::reject("Cannot read configuration from {$filename}"); } // Use INI_SCANNER_NORMAL instead of INI_SCANNER_TYPED for PHP 5.5 compatibility $data = \VendorDuplicator\Aws\parse_ini_file($filename, \true, \INI_SCANNER_NORMAL); if ($data === \false) { return self::reject("Invalid config file: {$filename}"); } if (!isset($data[$profile])) { return self::reject("'{$profile}' not found in config file"); } if (!isset($data[$profile][self::INI_USE_ARN_REGION])) { return self::reject("Required S3 Use Arn Region config values\n not present in INI profile '{$profile}' ({$filename})"); } // INI_SCANNER_NORMAL parses false-y values as an empty string if ($data[$profile][self::INI_USE_ARN_REGION] === "") { $data[$profile][self::INI_USE_ARN_REGION] = \false; } return Promise\Create::promiseFor(new Configuration($data[$profile][self::INI_USE_ARN_REGION])); }; } /** * Fallback config options when other sources are not set. * * @return callable */ public static function fallback() { return function () { return Promise\Create::promiseFor(new Configuration(self::DEFAULT_USE_ARN_REGION)); }; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3Client.php000064400000136132147600374260022036 0ustar00 ['type' => 'config', 'valid' => ['bool'], 'doc' => 'Set to true to send requests to a hardcoded ' . 'bucket endpoint rather than create an endpoint as a ' . 'result of injecting the bucket into the URL. This ' . 'option is useful for interacting with CNAME endpoints.'], 'use_arn_region' => ['type' => 'config', 'valid' => ['bool', Configuration::class, CacheInterface::class, 'callable'], 'doc' => 'Set to true to allow passed in ARNs to override' . ' client region. Accepts...', 'fn' => [__CLASS__, '_apply_use_arn_region'], 'default' => [UseArnRegionConfigurationProvider::class, 'defaultProvider']], 'use_accelerate_endpoint' => ['type' => 'config', 'valid' => ['bool'], 'doc' => 'Set to true to send requests to an S3 Accelerate' . ' endpoint by default. Can be enabled or disabled on' . ' individual operations by setting' . ' \'@use_accelerate_endpoint\' to true or false. Note:' . ' you must enable S3 Accelerate on a bucket before it can' . ' be accessed via an Accelerate endpoint.', 'default' => \false], 'use_path_style_endpoint' => ['type' => 'config', 'valid' => ['bool'], 'doc' => 'Set to true to send requests to an S3 path style' . ' endpoint by default.' . ' Can be enabled or disabled on individual operations by setting' . ' \'@use_path_style_endpoint\' to true or false.', 'default' => \false], 'disable_multiregion_access_points' => ['type' => 'config', 'valid' => ['bool'], 'doc' => 'Set to true to disable the usage of' . ' multi region access points. These are enabled by default.' . ' Can be enabled or disabled on individual operations by setting' . ' \'@disable_multiregion_access_points\' to true or false.', 'default' => \false]]; } /** * {@inheritdoc} * * In addition to the options available to * {@see Aws\AwsClient::__construct}, S3Client accepts the following * options: * * - bucket_endpoint: (bool) Set to true to send requests to a * hardcoded bucket endpoint rather than create an endpoint as a result * of injecting the bucket into the URL. This option is useful for * interacting with CNAME endpoints. Note: if you are using version 2.243.0 * and above and do not expect the bucket name to appear in the host, you will * also need to set `use_path_style_endpoint` to `true`. * - calculate_md5: (bool) Set to false to disable calculating an MD5 * for all Amazon S3 signed uploads. * - s3_us_east_1_regional_endpoint: * (Aws\S3\RegionalEndpoint\ConfigurationInterface|Aws\CacheInterface\|callable|string|array) * Specifies whether to use regional or legacy endpoints for the us-east-1 * region. Provide an Aws\S3\RegionalEndpoint\ConfigurationInterface object, an * instance of Aws\CacheInterface, a callable configuration provider used * to create endpoint configuration, a string value of `legacy` or * `regional`, or an associative array with the following keys: * endpoint_types: (string) Set to `legacy` or `regional`, defaults to * `legacy` * - use_accelerate_endpoint: (bool) Set to true to send requests to an S3 * Accelerate endpoint by default. Can be enabled or disabled on * individual operations by setting '@use_accelerate_endpoint' to true or * false. Note: you must enable S3 Accelerate on a bucket before it can be * accessed via an Accelerate endpoint. * - use_arn_region: (Aws\S3\UseArnRegion\ConfigurationInterface, * Aws\CacheInterface, bool, callable) Set to true to enable the client * to use the region from a supplied ARN argument instead of the client's * region. Provide an instance of Aws\S3\UseArnRegion\ConfigurationInterface, * an instance of Aws\CacheInterface, a callable that provides a promise for * a Configuration object, or a boolean value. Defaults to false (i.e. * the SDK will not follow the ARN region if it conflicts with the client * region and instead throw an error). * - use_dual_stack_endpoint: (bool) Set to true to send requests to an S3 * Dual Stack endpoint by default, which enables IPv6 Protocol. * Can be enabled or disabled on individual operations by setting * '@use_dual_stack_endpoint\' to true or false. Note: * you cannot use it together with an accelerate endpoint. * - use_path_style_endpoint: (bool) Set to true to send requests to an S3 * path style endpoint by default. * Can be enabled or disabled on individual operations by setting * '@use_path_style_endpoint\' to true or false. Note: * you cannot use it together with an accelerate endpoint. * - disable_multiregion_access_points: (bool) Set to true to disable * sending multi region requests. They are enabled by default. * Can be enabled or disabled on individual operations by setting * '@disable_multiregion_access_points\' to true or false. Note: * you cannot use it together with an accelerate or dualstack endpoint. * * @param array $args */ public function __construct(array $args) { if (!isset($args['s3_us_east_1_regional_endpoint']) || $args['s3_us_east_1_regional_endpoint'] instanceof CacheInterface) { $args['s3_us_east_1_regional_endpoint'] = ConfigurationProvider::defaultProvider($args); } $this->addBuiltIns($args); parent::__construct($args); $stack = $this->getHandlerList(); $stack->appendInit(SSECMiddleware::wrap($this->getEndpoint()->getScheme()), 's3.ssec'); $stack->appendBuild(ApplyChecksumMiddleware::wrap($this->getApi()), 's3.checksum'); $stack->appendBuild(Middleware::contentType(['PutObject', 'UploadPart']), 's3.content_type'); if ($this->getConfig('bucket_endpoint')) { $stack->appendBuild(BucketEndpointMiddleware::wrap(), 's3.bucket_endpoint'); } elseif (!$this->isUseEndpointV2()) { $stack->appendBuild(S3EndpointMiddleware::wrap($this->getRegion(), $this->getConfig('endpoint_provider'), ['accelerate' => $this->getConfig('use_accelerate_endpoint'), 'path_style' => $this->getConfig('use_path_style_endpoint'), 'use_fips_endpoint' => $this->getConfig('use_fips_endpoint'), 'dual_stack' => $this->getConfig('use_dual_stack_endpoint')->isUseDualStackEndpoint()]), 's3.endpoint_middleware'); } $stack->appendBuild(BucketEndpointArnMiddleware::wrap($this->getApi(), $this->getRegion(), ['use_arn_region' => $this->getConfig('use_arn_region'), 'accelerate' => $this->getConfig('use_accelerate_endpoint'), 'path_style' => $this->getConfig('use_path_style_endpoint'), 'dual_stack' => $this->getConfig('use_dual_stack_endpoint')->isUseDualStackEndpoint(), 'use_fips_endpoint' => $this->getConfig('use_fips_endpoint'), 'disable_multiregion_access_points' => $this->getConfig('disable_multiregion_access_points'), 'endpoint' => isset($args['endpoint']) ? $args['endpoint'] : null], $this->isUseEndpointV2()), 's3.bucket_endpoint_arn'); $stack->appendValidate(InputValidationMiddleware::wrap($this->getApi(), self::$mandatoryAttributes), 'input_validation_middleware'); $stack->appendSign(PutObjectUrlMiddleware::wrap(), 's3.put_object_url'); $stack->appendSign(PermanentRedirectMiddleware::wrap(), 's3.permanent_redirect'); $stack->appendInit(Middleware::sourceFile($this->getApi()), 's3.source_file'); $stack->appendInit($this->getSaveAsParameter(), 's3.save_as'); $stack->appendInit($this->getLocationConstraintMiddleware(), 's3.location'); $stack->appendInit($this->getEncodingTypeMiddleware(), 's3.auto_encode'); $stack->appendInit($this->getHeadObjectMiddleware(), 's3.head_object'); if ($this->isUseEndpointV2()) { $this->processEndpointV2Model(); $stack->after('builderV2', 's3.check_empty_path_with_query', $this->getEmptyPathWithQuery()); } } /** * Determine if a string is a valid name for a DNS compatible Amazon S3 * bucket. * * DNS compatible bucket names can be used as a subdomain in a URL (e.g., * ".s3.amazonaws.com"). * * @param string $bucket Bucket name to check. * * @return bool */ public static function isBucketDnsCompatible($bucket) { if (!\is_string($bucket)) { return \false; } $bucketLen = \strlen($bucket); return $bucketLen >= 3 && $bucketLen <= 63 && !\filter_var($bucket, \FILTER_VALIDATE_IP) && \preg_match('/^[a-z0-9]([a-z0-9\\-\\.]*[a-z0-9])?$/', $bucket); } public static function _apply_use_arn_region($value, array &$args, HandlerList $list) { if ($value instanceof CacheInterface) { $value = UseArnRegionConfigurationProvider::defaultProvider($args); } if (\is_callable($value)) { $value = $value(); } if ($value instanceof PromiseInterface) { $value = $value->wait(); } if ($value instanceof ConfigurationInterface) { $args['use_arn_region'] = $value; } else { // The Configuration class itself will validate other inputs $args['use_arn_region'] = new Configuration($value); } } public function createPresignedRequest(CommandInterface $command, $expires, array $options = []) { $command = clone $command; $command->getHandlerList()->remove('signer'); $request = \VendorDuplicator\Aws\serialize($command); $signing_name = empty($command->getAuthSchemes()) ? $this->getSigningName($request->getUri()->getHost()) : $command->getAuthSchemes()['name']; $signature_version = empty($command->getAuthSchemes()) ? $this->getConfig('signature_version') : $command->getAuthSchemes()['version']; /** @var \VendorDuplicator\Aws\Signature\SignatureInterface $signer */ $signer = \call_user_func($this->getSignatureProvider(), $signature_version, $signing_name, $this->getConfig('signing_region')); return $signer->presign($request, $this->getCredentials()->wait(), $expires, $options); } /** * Returns the URL to an object identified by its bucket and key. * * The URL returned by this method is not signed nor does it ensure that the * bucket and key given to the method exist. If you need a signed URL, then * use the {@see \Aws\S3\S3Client::createPresignedRequest} method and get * the URI of the signed request. * * @param string $bucket The name of the bucket where the object is located * @param string $key The key of the object * * @return string The URL to the object */ public function getObjectUrl($bucket, $key) { $command = $this->getCommand('GetObject', ['Bucket' => $bucket, 'Key' => $key]); return (string) \VendorDuplicator\Aws\serialize($command)->getUri(); } /** * Raw URL encode a key and allow for '/' characters * * @param string $key Key to encode * * @return string Returns the encoded key */ public static function encodeKey($key) { return \str_replace('%2F', '/', \rawurlencode($key)); } /** * Provides a middleware that removes the need to specify LocationConstraint on CreateBucket. * * @return \Closure */ private function getLocationConstraintMiddleware() { $region = $this->getRegion(); return static function (callable $handler) use($region) { return function (Command $command, $request = null) use($handler, $region) { if ($command->getName() === 'CreateBucket') { $locationConstraint = isset($command['CreateBucketConfiguration']['LocationConstraint']) ? $command['CreateBucketConfiguration']['LocationConstraint'] : null; if ($locationConstraint === 'us-east-1') { unset($command['CreateBucketConfiguration']); } elseif ('us-east-1' !== $region && empty($locationConstraint)) { $command['CreateBucketConfiguration'] = ['LocationConstraint' => $region]; } } return $handler($command, $request); }; }; } /** * Provides a middleware that supports the `SaveAs` parameter. * * @return \Closure */ private function getSaveAsParameter() { return static function (callable $handler) { return function (Command $command, $request = null) use($handler) { if ($command->getName() === 'GetObject' && isset($command['SaveAs'])) { $command['@http']['sink'] = $command['SaveAs']; unset($command['SaveAs']); } return $handler($command, $request); }; }; } /** * Provides a middleware that disables content decoding on HeadObject * commands. * * @return \Closure */ private function getHeadObjectMiddleware() { return static function (callable $handler) { return function (CommandInterface $command, RequestInterface $request = null) use($handler) { if ($command->getName() === 'HeadObject' && !isset($command['@http']['decode_content'])) { $command['@http']['decode_content'] = \false; } return $handler($command, $request); }; }; } /** * Provides a middleware that autopopulates the EncodingType parameter on * ListObjects commands. * * @return \Closure */ private function getEncodingTypeMiddleware() { return static function (callable $handler) { return function (Command $command, $request = null) use($handler) { $autoSet = \false; if ($command->getName() === 'ListObjects' && empty($command['EncodingType'])) { $command['EncodingType'] = 'url'; $autoSet = \true; } return $handler($command, $request)->then(function (ResultInterface $result) use($autoSet) { if ($result['EncodingType'] === 'url' && $autoSet) { static $topLevel = ['Delimiter', 'Marker', 'NextMarker', 'Prefix']; static $nested = [['Contents', 'Key'], ['CommonPrefixes', 'Prefix']]; foreach ($topLevel as $key) { if (isset($result[$key])) { $result[$key] = \urldecode($result[$key]); } } foreach ($nested as $steps) { if (isset($result[$steps[0]])) { foreach ($result[$steps[0]] as $key => $part) { if (isset($part[$steps[1]])) { $result[$steps[0]][$key][$steps[1]] = \urldecode($part[$steps[1]]); } } } } } return $result; }); }; }; } /** * Provides a middleware that checks for an empty path and a * non-empty query string. * * @return \Closure */ private function getEmptyPathWithQuery() { return static function (callable $handler) { return function (Command $command, RequestInterface $request) use($handler) { $uri = $request->getUri(); if (empty($uri->getPath()) && !empty($uri->getQuery())) { $uri = $uri->withPath('/'); $request = $request->withUri($uri); } return $handler($command, $request); }; }; } /** * Special handling for when the service name is s3-object-lambda. * So, if the host contains s3-object-lambda, then the service name * returned is s3-object-lambda, otherwise the default signing service is returned. * @param string $host The host to validate if is a s3-object-lambda URL. * @return string returns the signing service name to be used */ private function getSigningName($host) { if (\strpos($host, 's3-object-lambda')) { return 's3-object-lambda'; } return $this->getConfig('signing_name'); } /** * Modifies API definition to remove `Bucket` from request URIs. * This is now handled by the endpoint ruleset. * * @return void * * @internal */ private function processEndpointV2Model() { $definition = $this->getApi()->getDefinition(); foreach ($definition['operations'] as &$operation) { if (isset($operation['http']['requestUri'])) { $requestUri = $operation['http']['requestUri']; if ($requestUri === "/{Bucket}") { $requestUri = \str_replace('/{Bucket}', '/', $requestUri); } else { $requestUri = \str_replace('/{Bucket}', '', $requestUri); } $operation['http']['requestUri'] = $requestUri; } } $this->getApi()->setDefinition($definition); } /** * Adds service-specific client built-in values * * @return void */ private function addBuiltIns($args) { if ($args['region'] !== 'us-east-1') { return \false; } $key = 'AWS::S3::UseGlobalEndpoint'; $result = $args['s3_us_east_1_regional_endpoint'] instanceof \Closure ? $args['s3_us_east_1_regional_endpoint']()->wait() : $args['s3_us_east_1_regional_endpoint']; if (\is_string($result)) { if ($result === 'regional') { $value = \false; } else { if ($result === 'legacy') { $value = \true; } else { return; } } } else { if ($result->isFallback() || $result->getEndpointsType() === 'legacy') { $value = \true; } else { $value = \false; } } $this->clientBuiltIns[$key] = $value; } /** @internal */ public static function _applyRetryConfig($value, $args, HandlerList $list) { if ($value) { $config = \VendorDuplicator\Aws\Retry\ConfigurationProvider::unwrap($value); if ($config->getMode() === 'legacy') { $maxRetries = $config->getMaxAttempts() - 1; $decider = RetryMiddleware::createDefaultDecider($maxRetries); $decider = function ($retries, $command, $request, $result, $error) use($decider, $maxRetries) { $maxRetries = null !== $command['@retries'] ? $command['@retries'] : $maxRetries; if ($decider($retries, $command, $request, $result, $error)) { return \true; } if ($error instanceof AwsException && $retries < $maxRetries) { if ($error->getResponse() && $error->getResponse()->getStatusCode() >= 400) { return \strpos($error->getResponse()->getBody(), 'Your socket connection to the server') !== \false; } if ($error->getPrevious() instanceof RequestException) { // All commands except CompleteMultipartUpload are // idempotent and may be retried without worry if a // networking error has occurred. return $command->getName() !== 'CompleteMultipartUpload'; } } return \false; }; $delay = [RetryMiddleware::class, 'exponentialDelay']; $list->appendSign(Middleware::retry($decider, $delay), 'retry'); } else { $defaultDecider = RetryMiddlewareV2::createDefaultDecider(new QuotaManager(), $config->getMaxAttempts()); $list->appendSign(RetryMiddlewareV2::wrap($config, ['collect_stats' => $args['stats']['retries'], 'decider' => function ($attempts, CommandInterface $cmd, $result) use($defaultDecider, $config) { $isRetryable = $defaultDecider($attempts, $cmd, $result); if (!$isRetryable && $result instanceof AwsException && $attempts < $config->getMaxAttempts()) { if (!empty($result->getResponse()) && $result->getResponse()->getStatusCode() >= 400) { return \strpos($result->getResponse()->getBody(), 'Your socket connection to the server') !== \false; } if ($result->getPrevious() instanceof RequestException && $cmd->getName() !== 'CompleteMultipartUpload') { $isRetryable = \true; } } return $isRetryable; }]), 'retry'); } } } /** @internal */ public static function _applyApiProvider($value, array &$args, HandlerList $list) { ClientResolver::_apply_api_provider($value, $args); $args['parser'] = new GetBucketLocationParser(new ValidateResponseChecksumParser(new AmbiguousSuccessParser(new RetryableMalformedResponseParser($args['parser'], $args['exception_class']), $args['error_parser'], $args['exception_class']), $args['api'])); } /** * @internal * @codeCoverageIgnore */ public static function applyDocFilters(array $api, array $docs) { $b64 = '
This value will be base64 encoded on your behalf.
'; $opt = '
This value will be computed for you it is not supplied.
'; // Add a note on the CopyObject docs $s3ExceptionRetryMessage = "

Additional info on response behavior: if there is" . " an internal error in S3 after the request was successfully recieved," . " a 200 response will be returned with an S3Exception embedded" . " in it; this will still be caught and retried by" . " RetryMiddleware.

"; $docs['operations']['CopyObject'] .= $s3ExceptionRetryMessage; $docs['operations']['CompleteMultipartUpload'] .= $s3ExceptionRetryMessage; $docs['operations']['UploadPartCopy'] .= $s3ExceptionRetryMessage; $docs['operations']['UploadPart'] .= $s3ExceptionRetryMessage; // Add note about stream ownership in the putObject call $guzzleStreamMessage = "

Additional info on behavior of the stream" . " parameters: Psr7 takes ownership of streams and will automatically close" . " streams when this method is called with a stream as the Body" . " parameter. To prevent this, set the Body using" . " GuzzleHttp\\Psr7\\stream_for method with a is an instance of" . " Psr\\Http\\Message\\StreamInterface, and it will be returned" . " unmodified. This will allow you to keep the stream in scope.

"; $docs['operations']['PutObject'] .= $guzzleStreamMessage; // Add the SourceFile parameter. $docs['shapes']['SourceFile']['base'] = 'The path to a file on disk to use instead of the Body parameter.'; $api['shapes']['SourceFile'] = ['type' => 'string']; $api['shapes']['PutObjectRequest']['members']['SourceFile'] = ['shape' => 'SourceFile']; $api['shapes']['UploadPartRequest']['members']['SourceFile'] = ['shape' => 'SourceFile']; // Add the ContentSHA256 parameter. $docs['shapes']['ContentSHA256']['base'] = 'A SHA256 hash of the body content of the request.'; $api['shapes']['ContentSHA256'] = ['type' => 'string']; $api['shapes']['PutObjectRequest']['members']['ContentSHA256'] = ['shape' => 'ContentSHA256']; $api['shapes']['UploadPartRequest']['members']['ContentSHA256'] = ['shape' => 'ContentSHA256']; $docs['shapes']['ContentSHA256']['append'] = $opt; // Add the AddContentMD5 parameter. $docs['shapes']['AddContentMD5']['base'] = 'Set to true to calculate the ContentMD5 for the upload.'; $api['shapes']['AddContentMD5'] = ['type' => 'boolean']; $api['shapes']['PutObjectRequest']['members']['AddContentMD5'] = ['shape' => 'AddContentMD5']; $api['shapes']['UploadPartRequest']['members']['AddContentMD5'] = ['shape' => 'AddContentMD5']; // Add the SaveAs parameter. $docs['shapes']['SaveAs']['base'] = 'The path to a file on disk to save the object data.'; $api['shapes']['SaveAs'] = ['type' => 'string']; $api['shapes']['GetObjectRequest']['members']['SaveAs'] = ['shape' => 'SaveAs']; // Several SSECustomerKey documentation updates. $docs['shapes']['SSECustomerKey']['append'] = $b64; $docs['shapes']['CopySourceSSECustomerKey']['append'] = $b64; $docs['shapes']['SSECustomerKeyMd5']['append'] = $opt; // Add the ObjectURL to various output shapes and documentation. $docs['shapes']['ObjectURL']['base'] = 'The URI of the created object.'; $api['shapes']['ObjectURL'] = ['type' => 'string']; $api['shapes']['PutObjectOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; $api['shapes']['CopyObjectOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; $api['shapes']['CompleteMultipartUploadOutput']['members']['ObjectURL'] = ['shape' => 'ObjectURL']; // Fix references to Location Constraint. unset($api['shapes']['CreateBucketRequest']['payload']); $api['shapes']['BucketLocationConstraint']['enum'] = ["ap-northeast-1", "ap-southeast-2", "ap-southeast-1", "cn-north-1", "eu-central-1", "eu-west-1", "us-east-1", "us-west-1", "us-west-2", "sa-east-1"]; // Add a note that the ContentMD5 is automatically computed, except for with PutObject and UploadPart $docs['shapes']['ContentMD5']['append'] = '
The value will be computed on ' . 'your behalf.
'; $docs['shapes']['ContentMD5']['excludeAppend'] = ['PutObjectRequest', 'UploadPartRequest']; //Add a note to ContentMD5 for PutObject and UploadPart that specifies the value is required // When uploading to a bucket with object lock enabled and that it is not computed automatically $objectLock = '
This value is required if uploading to a bucket ' . 'which has Object Lock enabled. It will not be calculated for you automatically. If you wish to have ' . 'the value calculated for you, use the `AddContentMD5` parameter.
'; $docs['shapes']['ContentMD5']['appendOnly'] = ['message' => $objectLock, 'shapes' => ['PutObjectRequest', 'UploadPartRequest']]; return [new Service($api, ApiProvider::defaultProvider()), new DocModel($docs)]; } /** * @internal * @codeCoverageIgnore */ public static function addDocExamples($examples) { $getObjectExample = ['input' => ['Bucket' => 'arn:aws:s3:us-east-1:123456789012:accesspoint:myaccesspoint', 'Key' => 'my-key'], 'output' => ['Body' => 'class GuzzleHttp\\Psr7\\Stream#208 (7) {...}', 'ContentLength' => '11', 'ContentType' => 'application/octet-stream'], 'comments' => ['input' => '', 'output' => 'Simplified example output'], 'description' => 'The following example retrieves an object by referencing the bucket via an S3 accesss point ARN. Result output is simplified for the example.', 'id' => '', 'title' => 'To get an object via an S3 access point ARN']; if (isset($examples['GetObject'])) { $examples['GetObject'][] = $getObjectExample; } else { $examples['GetObject'] = [$getObjectExample]; } $putObjectExample = ['input' => ['Bucket' => 'arn:aws:s3:us-east-1:123456789012:accesspoint:myaccesspoint', 'Key' => 'my-key', 'Body' => 'my-body'], 'output' => ['ObjectURL' => 'https://my-bucket.s3.us-east-1.amazonaws.com/my-key'], 'comments' => ['input' => '', 'output' => 'Simplified example output'], 'description' => 'The following example uploads an object by referencing the bucket via an S3 accesss point ARN. Result output is simplified for the example.', 'id' => '', 'title' => 'To upload an object via an S3 access point ARN']; if (isset($examples['PutObject'])) { $examples['PutObject'][] = $putObjectExample; } else { $examples['PutObject'] = [$putObjectExample]; } return $examples; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3ClientTrait.php000064400000022476147600374260023047 0ustar00uploadAsync($bucket, $key, $body, $acl, $options)->wait(); } /** * @see S3ClientInterface::uploadAsync() */ public function uploadAsync($bucket, $key, $body, $acl = 'private', array $options = []) { return (new ObjectUploader($this, $bucket, $key, $body, $acl, $options))->promise(); } /** * @see S3ClientInterface::copy() */ public function copy($fromB, $fromK, $destB, $destK, $acl = 'private', array $opts = []) { return $this->copyAsync($fromB, $fromK, $destB, $destK, $acl, $opts)->wait(); } /** * @see S3ClientInterface::copyAsync() */ public function copyAsync($fromB, $fromK, $destB, $destK, $acl = 'private', array $opts = []) { $source = ['Bucket' => $fromB, 'Key' => $fromK]; if (isset($opts['version_id'])) { $source['VersionId'] = $opts['version_id']; } $destination = ['Bucket' => $destB, 'Key' => $destK]; return (new ObjectCopier($this, $source, $destination, $acl, $opts))->promise(); } /** * @see S3ClientInterface::registerStreamWrapper() */ public function registerStreamWrapper() { StreamWrapper::register($this); } /** * @see S3ClientInterface::registerStreamWrapperV2() */ public function registerStreamWrapperV2() { StreamWrapper::register($this, 's3', null, \true); } /** * @see S3ClientInterface::deleteMatchingObjects() */ public function deleteMatchingObjects($bucket, $prefix = '', $regex = '', array $options = []) { $this->deleteMatchingObjectsAsync($bucket, $prefix, $regex, $options)->wait(); } /** * @see S3ClientInterface::deleteMatchingObjectsAsync() */ public function deleteMatchingObjectsAsync($bucket, $prefix = '', $regex = '', array $options = []) { if (!$prefix && !$regex) { return new RejectedPromise(new \RuntimeException('A prefix or regex is required.')); } $params = ['Bucket' => $bucket, 'Prefix' => $prefix]; $iter = $this->getIterator('ListObjects', $params); if ($regex) { $iter = \VendorDuplicator\Aws\filter($iter, function ($c) use($regex) { return \preg_match($regex, $c['Key']); }); } return BatchDelete::fromIterator($this, $bucket, $iter, $options)->promise(); } /** * @see S3ClientInterface::uploadDirectory() */ public function uploadDirectory($directory, $bucket, $keyPrefix = null, array $options = []) { $this->uploadDirectoryAsync($directory, $bucket, $keyPrefix, $options)->wait(); } /** * @see S3ClientInterface::uploadDirectoryAsync() */ public function uploadDirectoryAsync($directory, $bucket, $keyPrefix = null, array $options = []) { $d = "s3://{$bucket}" . ($keyPrefix ? '/' . \ltrim($keyPrefix, '/') : ''); return (new Transfer($this, $directory, $d, $options))->promise(); } /** * @see S3ClientInterface::downloadBucket() */ public function downloadBucket($directory, $bucket, $keyPrefix = '', array $options = []) { $this->downloadBucketAsync($directory, $bucket, $keyPrefix, $options)->wait(); } /** * @see S3ClientInterface::downloadBucketAsync() */ public function downloadBucketAsync($directory, $bucket, $keyPrefix = '', array $options = []) { $s = "s3://{$bucket}" . ($keyPrefix ? '/' . \ltrim($keyPrefix, '/') : ''); return (new Transfer($this, $s, $directory, $options))->promise(); } /** * @see S3ClientInterface::determineBucketRegion() */ public function determineBucketRegion($bucketName) { return $this->determineBucketRegionAsync($bucketName)->wait(); } /** * @see S3ClientInterface::determineBucketRegionAsync() * * @param string $bucketName * * @return PromiseInterface */ public function determineBucketRegionAsync($bucketName) { $command = $this->getCommand('HeadBucket', ['Bucket' => $bucketName]); $handlerList = clone $this->getHandlerList(); $handlerList->remove('s3.permanent_redirect'); $handlerList->remove('signer'); $handler = $handlerList->resolve(); return $handler($command)->then(static function (ResultInterface $result) { return $result['@metadata']['headers']['x-amz-bucket-region']; }, function (AwsException $e) { $response = $e->getResponse(); if ($response === null) { throw $e; } if ($e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') { $region = $this->determineBucketRegionFromExceptionBody($response); if (!empty($region)) { return $region; } throw $e; } return $response->getHeaderLine('x-amz-bucket-region'); }); } private function determineBucketRegionFromExceptionBody(ResponseInterface $response) { try { $element = $this->parseXml($response->getBody(), $response); if (!empty($element->Region)) { return (string) $element->Region; } } catch (\Exception $e) { // Fallthrough on exceptions from parsing } return \false; } /** * @see S3ClientInterface::doesBucketExist() */ public function doesBucketExist($bucket) { return $this->checkExistenceWithCommand($this->getCommand('HeadBucket', ['Bucket' => $bucket])); } /** * @see S3ClientInterface::doesBucketExistV2() */ public function doesBucketExistV2($bucket, $accept403 = \false) { $command = $this->getCommand('HeadBucket', ['Bucket' => $bucket]); try { $this->execute($command); return \true; } catch (S3Exception $e) { if ($accept403 && $e->getStatusCode() === 403 || $e instanceof PermanentRedirectException) { return \true; } if ($e->getStatusCode() === 404) { return \false; } throw $e; } } /** * @see S3ClientInterface::doesObjectExist() */ public function doesObjectExist($bucket, $key, array $options = []) { return $this->checkExistenceWithCommand($this->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => $key] + $options)); } /** * @see S3ClientInterface::doesObjectExistV2() */ public function doesObjectExistV2($bucket, $key, $includeDeleteMarkers = \false, array $options = []) { $command = $this->getCommand('HeadObject', ['Bucket' => $bucket, 'Key' => $key] + $options); try { $this->execute($command); return \true; } catch (S3Exception $e) { if ($includeDeleteMarkers && $this->useDeleteMarkers($e)) { return \true; } if ($e->getStatusCode() === 404) { return \false; } throw $e; } } private function useDeleteMarkers($exception) { $response = $exception->getResponse(); return !empty($response) && $response->getHeader('x-amz-delete-marker'); } /** * Determines whether or not a resource exists using a command * * @param CommandInterface $command Command used to poll for the resource * * @return bool * @throws S3Exception|\Exception if there is an unhandled exception */ private function checkExistenceWithCommand(CommandInterface $command) { try { $this->execute($command); return \true; } catch (S3Exception $e) { if ($e->getAwsErrorCode() == 'AccessDenied') { return \true; } if ($e->getStatusCode() >= 500) { throw $e; } return \false; } } /** * @see S3ClientInterface::execute() */ public abstract function execute(CommandInterface $command); /** * @see S3ClientInterface::getCommand() */ public abstract function getCommand($name, array $args = []); /** * @see S3ClientInterface::getHandlerList() * * @return HandlerList */ public abstract function getHandlerList(); /** * @see S3ClientInterface::getIterator() * * @return \Iterator */ public abstract function getIterator($name, array $args = []); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/GetBucketLocationParser.php000064400000002540147600374260025130 0ustar00parser = $parser; } public function __invoke(CommandInterface $command, ResponseInterface $response) { $fn = $this->parser; $result = $fn($command, $response); if ($command->getName() === 'GetBucketLocation') { $location = 'us-east-1'; if (\preg_match('/>(.+?)<\\/LocationConstraint>/', $response->getBody(), $matches)) { $location = $matches[1] === 'EU' ? 'eu-west-1' : $matches[1]; } $result['LocationConstraint'] = $location; } return $result; } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parseMemberFromStream($stream, $member, $response); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/PostObject.php000064400000007217147600374260022467 0ustar00client = $client; $this->bucket = $bucket; if (\is_array($jsonPolicy)) { $jsonPolicy = \json_encode($jsonPolicy); } $this->jsonPolicy = $jsonPolicy; $this->formAttributes = ['action' => $this->generateUri(), 'method' => 'POST', 'enctype' => 'multipart/form-data']; $this->formInputs = $formInputs + ['key' => '${filename}']; $credentials = $client->getCredentials()->wait(); $this->formInputs += $this->getPolicyAndSignature($credentials); } /** * Gets the S3 client. * * @return S3ClientInterface */ public function getClient() { return $this->client; } /** * Gets the bucket name. * * @return string */ public function getBucket() { return $this->bucket; } /** * Gets the form attributes as an array. * * @return array */ public function getFormAttributes() { return $this->formAttributes; } /** * Set a form attribute. * * @param string $attribute Form attribute to set. * @param string $value Value to set. */ public function setFormAttribute($attribute, $value) { $this->formAttributes[$attribute] = $value; } /** * Gets the form inputs as an array. * * @return array */ public function getFormInputs() { return $this->formInputs; } /** * Set a form input. * * @param string $field Field name to set * @param string $value Value to set. */ public function setFormInput($field, $value) { $this->formInputs[$field] = $value; } /** * Gets the raw JSON policy. * * @return string */ public function getJsonPolicy() { return $this->jsonPolicy; } private function generateUri() { $uri = new Uri($this->client->getEndpoint()); if ($this->client->getConfig('use_path_style_endpoint') === \true || $uri->getScheme() === 'https' && \strpos($this->bucket, '.') !== \false) { // Use path-style URLs $uri = $uri->withPath("/{$this->bucket}"); } else { // Use virtual-style URLs $uri = $uri->withHost($this->bucket . '.' . $uri->getHost()); } return (string) $uri; } protected function getPolicyAndSignature(CredentialsInterface $creds) { $jsonPolicy64 = \base64_encode($this->jsonPolicy); return ['AWSAccessKeyId' => $creds->getAccessKeyId(), 'policy' => $jsonPolicy64, 'signature' => \base64_encode(\hash_hmac('sha1', $jsonPolicy64, $creds->getSecretKey(), \true))]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/BucketEndpointMiddleware.php000064400000006502147600374260025323 0ustar00 \true]; private $nextHandler; /** * Create a middleware wrapper function. * * @return callable */ public static function wrap() { return function (callable $handler) { return new self($handler); }; } public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request) { $nextHandler = $this->nextHandler; $bucket = $command['Bucket']; if ($bucket && !isset(self::$exclusions[$command->getName()])) { $request = $this->modifyRequest($request, $command); } return $nextHandler($command, $request); } /** * Performs a one-time removal of Bucket from path, then if * the bucket name is duplicated in the path, performs additional * removal which is dependent on the number of occurrences of the bucket * name in a path-like format in the key name. * * @return string */ private function removeBucketFromPath($path, $bucket, $key) { $occurrencesInKey = $this->getBucketNameOccurrencesInKey($key, $bucket); do { $len = \strlen($bucket) + 1; if (\substr($path, 0, $len) === "/{$bucket}") { $path = \substr($path, $len); } } while (\substr_count($path, "/{$bucket}") > $occurrencesInKey + 1); return $path ?: '/'; } private function removeDuplicateBucketFromHost($host, $bucket) { if (\substr_count($host, $bucket) > 1) { while (\strpos($host, "{$bucket}.{$bucket}") === 0) { $hostArr = \explode('.', $host); \array_shift($hostArr); $host = \implode('.', $hostArr); } } return $host; } private function getBucketNameOccurrencesInKey($key, $bucket) { $occurrences = 0; if (empty($key)) { return $occurrences; } $segments = \explode('/', $key); foreach ($segments as $segment) { if (\strpos($segment, $bucket) === 0) { $occurrences++; } } return $occurrences; } private function modifyRequest(RequestInterface $request, CommandInterface $command) { $key = isset($command['Key']) ? $command['Key'] : null; $uri = $request->getUri(); $path = $uri->getPath(); $host = $uri->getHost(); $bucket = $command['Bucket']; $path = $this->removeBucketFromPath($path, $bucket, $key); $host = $this->removeDuplicateBucketFromHost($host, $bucket); // Modify the Key to make sure the key is encoded, but slashes are not. if ($key) { $path = S3Client::encodeKey(\rawurldecode($path)); } return $request->withUri($uri->withHost($host)->withPath($path)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/MultipartUploader.php000064400000013674147600374260024074 0ustar00 null, 'key' => null, 'exception_class' => S3MultipartUploadException::class]); } protected function loadUploadWorkflowInfo() { return ['command' => ['initiate' => 'CreateMultipartUpload', 'upload' => 'UploadPart', 'complete' => 'CompleteMultipartUpload'], 'id' => ['bucket' => 'Bucket', 'key' => 'Key', 'upload_id' => 'UploadId'], 'part_num' => 'PartNumber']; } protected function createPart($seekable, $number) { // Initialize the array of part data that will be returned. $data = []; // Apply custom params to UploadPart data $config = $this->getConfig(); $params = isset($config['params']) ? $config['params'] : []; foreach ($params as $k => $v) { $data[$k] = $v; } $data['PartNumber'] = $number; // Read from the source to create the body stream. if ($seekable) { // Case 1: Source is seekable, use lazy stream to defer work. $body = $this->limitPartStream(new Psr7\LazyOpenStream($this->source->getMetadata('uri'), 'r')); } else { // Case 2: Stream is not seekable; must store in temp stream. $source = $this->limitPartStream($this->source); $source = $this->decorateWithHashes($source, $data); $body = Psr7\Utils::streamFor(); Psr7\Utils::copyToStream($source, $body); } $contentLength = $body->getSize(); // Do not create a part if the body size is zero. if ($contentLength === 0) { return \false; } $body->seek(0); $data['Body'] = $body; if (isset($config['add_content_md5']) && $config['add_content_md5'] === \true) { $data['AddContentMD5'] = \true; } $data['ContentLength'] = $contentLength; return $data; } protected function extractETag(ResultInterface $result) { return $result['ETag']; } protected function getSourceMimeType() { if ($uri = $this->source->getMetadata('uri')) { return Psr7\MimeType::fromFilename($uri) ?: 'application/octet-stream'; } } protected function getSourceSize() { return $this->source->getSize(); } /** * Decorates a stream with a sha256 linear hashing stream. * * @param Stream $stream Stream to decorate. * @param array $data Part data to augment with the hash result. * * @return Stream */ private function decorateWithHashes(Stream $stream, array &$data) { // Decorate source with a hashing stream $hash = new PhpHash('sha256'); return new HashingStream($stream, $hash, function ($result) use(&$data) { $data['ContentSHA256'] = \bin2hex($result); }); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3MultiRegionClient.php000064400000054202147600374260024212 0ustar00 function (array &$args) { $availableRegions = \array_keys($args['partition']['regions']); return \end($availableRegions); }]; unset($args['region']); return $args + ['bucket_region_cache' => ['type' => 'config', 'valid' => [CacheInterface::class], 'doc' => 'Cache of regions in which given buckets are located.', 'default' => function () { return new LruArrayCache(); }], 'region' => $regionDef]; } public function __construct(array $args) { parent::__construct($args); $this->cache = $this->getConfig('bucket_region_cache'); $this->getHandlerList()->prependInit($this->determineRegionMiddleware(), 'determine_region'); } private function determineRegionMiddleware() { return function (callable $handler) { return function (CommandInterface $command) use($handler) { $cacheKey = $this->getCacheKey($command['Bucket']); if (empty($command['@region']) && ($region = $this->cache->get($cacheKey))) { $command['@region'] = $region; } return Promise\Coroutine::of(function () use($handler, $command, $cacheKey) { try { (yield $handler($command)); } catch (PermanentRedirectException $e) { if (empty($command['Bucket'])) { throw $e; } $result = $e->getResult(); $region = null; if (isset($result['@metadata']['headers']['x-amz-bucket-region'])) { $region = $result['@metadata']['headers']['x-amz-bucket-region']; $this->cache->set($cacheKey, $region); } else { $region = (yield $this->determineBucketRegionAsync($command['Bucket'])); } $command['@region'] = $region; (yield $handler($command)); } catch (AwsException $e) { if ($e->getAwsErrorCode() === 'AuthorizationHeaderMalformed') { $region = $this->determineBucketRegionFromExceptionBody($e->getResponse()); if (!empty($region)) { $this->cache->set($cacheKey, $region); $command['@region'] = $region; (yield $handler($command)); } else { throw $e; } } else { throw $e; } } }); }; }; } public function createPresignedRequest(CommandInterface $command, $expires, array $options = []) { if (empty($command['Bucket'])) { throw new \InvalidArgumentException('The S3\\MultiRegionClient' . ' cannot create presigned requests for commands without a' . ' specified bucket.'); } /** @var S3ClientInterface $client */ $client = $this->getClientFromPool($this->determineBucketRegion($command['Bucket'])); return $client->createPresignedRequest($client->getCommand($command->getName(), $command->toArray()), $expires); } public function getObjectUrl($bucket, $key) { /** @var S3Client $regionalClient */ $regionalClient = $this->getClientFromPool($this->determineBucketRegion($bucket)); return $regionalClient->getObjectUrl($bucket, $key); } public function determineBucketRegionAsync($bucketName) { $cacheKey = $this->getCacheKey($bucketName); if ($cached = $this->cache->get($cacheKey)) { return Promise\Create::promiseFor($cached); } /** @var S3ClientInterface $regionalClient */ $regionalClient = $this->getClientFromPool(); return $regionalClient->determineBucketRegionAsync($bucketName)->then(function ($region) use($cacheKey) { $this->cache->set($cacheKey, $region); return $region; }); } private function getCacheKey($bucketName) { return "aws:s3:{$bucketName}:location"; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3EndpointMiddleware.php000064400000023564147600374260024402 0ustar00 \true, 'DeleteBucket' => \true, 'ListBuckets' => \true]; const NO_PATTERN = 0; const DUALSTACK = 1; const ACCELERATE = 2; const ACCELERATE_DUALSTACK = 3; const PATH_STYLE = 4; const HOST_STYLE = 5; /** @var bool */ private $accelerateByDefault; /** @var bool */ private $dualStackByDefault; /** @var bool */ private $pathStyleByDefault; /** @var string */ private $region; /** @var callable */ private $endpointProvider; /** @var callable */ private $nextHandler; /** @var string */ private $endpoint; /** * Create a middleware wrapper function * * @param string $region * @param EndpointProvider $endpointProvider * @param array $options * * @return callable */ public static function wrap($region, $endpointProvider, array $options) { return function (callable $handler) use($region, $endpointProvider, $options) { return new self($handler, $region, $options, $endpointProvider); }; } public function __construct(callable $nextHandler, $region, array $options, $endpointProvider = null) { $this->pathStyleByDefault = isset($options['path_style']) ? (bool) $options['path_style'] : \false; $this->dualStackByDefault = isset($options['dual_stack']) ? (bool) $options['dual_stack'] : \false; $this->accelerateByDefault = isset($options['accelerate']) ? (bool) $options['accelerate'] : \false; $this->region = (string) $region; $this->endpoint = isset($options['endpoint']) ? $options['endpoint'] : ""; $this->endpointProvider = \is_null($endpointProvider) ? PartitionEndpointProvider::defaultProvider() : $endpointProvider; $this->nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request) { if (!empty($this->endpoint)) { $request = $this->applyEndpoint($command, $request); } else { switch ($this->endpointPatternDecider($command, $request)) { case self::HOST_STYLE: $request = $this->applyHostStyleEndpoint($command, $request); break; case self::NO_PATTERN: break; case self::PATH_STYLE: $request = $this->applyPathStyleEndpointCustomizations($command, $request); break; case self::DUALSTACK: $request = $this->applyDualStackEndpoint($command, $request); break; case self::ACCELERATE: $request = $this->applyAccelerateEndpoint($command, $request, 's3-accelerate'); break; case self::ACCELERATE_DUALSTACK: $request = $this->applyAccelerateEndpoint($command, $request, 's3-accelerate.dualstack'); break; } } $nextHandler = $this->nextHandler; return $nextHandler($command, $request); } private static function isRequestHostStyleCompatible(CommandInterface $command, RequestInterface $request) { return S3Client::isBucketDnsCompatible($command['Bucket']) && ($request->getUri()->getScheme() === 'http' || \strpos($command['Bucket'], '.') === \false) && \filter_var($request->getUri()->getHost(), \FILTER_VALIDATE_IP) === \false; } private function endpointPatternDecider(CommandInterface $command, RequestInterface $request) { $accelerate = isset($command['@use_accelerate_endpoint']) ? $command['@use_accelerate_endpoint'] : $this->accelerateByDefault; $dualStack = isset($command['@use_dual_stack_endpoint']) ? $command['@use_dual_stack_endpoint'] : $this->dualStackByDefault; $pathStyle = isset($command['@use_path_style_endpoint']) ? $command['@use_path_style_endpoint'] : $this->pathStyleByDefault; if ($accelerate && $dualStack) { // When try to enable both for operations excluded from s3-accelerate, // only dualstack endpoints will be enabled. return $this->canAccelerate($command) ? self::ACCELERATE_DUALSTACK : self::DUALSTACK; } if ($accelerate && $this->canAccelerate($command)) { return self::ACCELERATE; } if ($dualStack) { return self::DUALSTACK; } if (!$pathStyle && self::isRequestHostStyleCompatible($command, $request)) { return self::HOST_STYLE; } return self::PATH_STYLE; } private function canAccelerate(CommandInterface $command) { return empty(self::$exclusions[$command->getName()]) && S3Client::isBucketDnsCompatible($command['Bucket']); } private function getBucketStyleHost(CommandInterface $command, $host) { // For operations on the base host (e.g. ListBuckets) if (!isset($command['Bucket'])) { return $host; } return "{$command['Bucket']}.{$host}"; } private function applyHostStyleEndpoint(CommandInterface $command, RequestInterface $request) { $uri = $request->getUri(); $request = $request->withUri($uri->withHost($this->getBucketStyleHost($command, $uri->getHost()))->withPath($this->getBucketlessPath($uri->getPath(), $command))); return $request; } private function applyPathStyleEndpointCustomizations(CommandInterface $command, RequestInterface $request) { if ($command->getName() == 'WriteGetObjectResponse') { $dnsSuffix = $this->endpointProvider->getPartition($this->region, 's3')->getDnsSuffix(); $fips = \VendorDuplicator\Aws\is_fips_pseudo_region($this->region) ? "-fips" : ""; $region = \VendorDuplicator\Aws\strip_fips_pseudo_regions($this->region); $host = "{$command['RequestRoute']}.s3-object-lambda{$fips}.{$region}.{$dnsSuffix}"; $uri = $request->getUri(); $request = $request->withUri($uri->withHost($host)->withPath($this->getBucketlessPath($uri->getPath(), $command))); } return $request; } private function applyDualStackEndpoint(CommandInterface $command, RequestInterface $request) { $request = $request->withUri($request->getUri()->withHost($this->getDualStackHost())); if (empty($command['@use_path_style_endpoint']) && !$this->pathStyleByDefault && self::isRequestHostStyleCompatible($command, $request)) { $request = $this->applyHostStyleEndpoint($command, $request); } return $request; } private function getDualStackHost() { $dnsSuffix = $this->endpointProvider->getPartition($this->region, 's3')->getDnsSuffix(); return "s3.dualstack.{$this->region}.{$dnsSuffix}"; } private function applyAccelerateEndpoint(CommandInterface $command, RequestInterface $request, $pattern) { $request = $request->withUri($request->getUri()->withHost($this->getAccelerateHost($command, $pattern))->withPath($this->getBucketlessPath($request->getUri()->getPath(), $command))); return $request; } private function getAccelerateHost(CommandInterface $command, $pattern) { $dnsSuffix = $this->endpointProvider->getPartition($this->region, 's3')->getDnsSuffix(); return "{$command['Bucket']}.{$pattern}.{$dnsSuffix}"; } private function getBucketlessPath($path, CommandInterface $command) { $pattern = '/^\\/' . \preg_quote($command['Bucket'], '/') . '/'; $path = \preg_replace($pattern, '', $path) ?: '/'; if (\substr($path, 0, 1) !== '/') { $path = '/' . $path; } return $path; } private function applyEndpoint(CommandInterface $command, RequestInterface $request) { $dualStack = isset($command['@use_dual_stack_endpoint']) ? $command['@use_dual_stack_endpoint'] : $this->dualStackByDefault; if (ArnParser::isArn($command['Bucket'])) { $arn = ArnParser::parse($command['Bucket']); $outpost = $arn->getService() == 's3-outposts'; if ($outpost && $dualStack) { throw new InvalidArgumentException("Outposts + dualstack is not supported"); } if ($arn instanceof ObjectLambdaAccessPointArn) { return $request; } } if ($dualStack) { throw new InvalidArgumentException("Custom Endpoint + Dualstack not supported"); } if ($command->getName() == 'WriteGetObjectResponse') { $host = "{$command['RequestRoute']}.{$this->endpoint}"; $uri = $request->getUri(); return $request = $request->withUri($uri->withHost($host)->withPath($this->getBucketlessPath($uri->getPath(), $command))); } $host = $this->pathStyleByDefault ? $this->endpoint : $this->getBucketStyleHost($command, $this->endpoint); $uri = $request->getUri(); $scheme = $uri->getScheme(); if (empty($scheme)) { $request = $request->withUri($uri->withHost($host)); } else { $request = $request->withUri($uri); } return $request; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/Transfer.php000064400000035055147600374260022200 0ustar00client = $client; // Prepare the destination. $this->destination = $this->prepareTarget($dest); if ($this->destination['scheme'] === 's3') { $this->s3Args = $this->getS3Args($this->destination['path']); } // Prepare the source. if (\is_string($source)) { $this->sourceMetadata = $this->prepareTarget($source); $this->source = $source; } elseif ($source instanceof Iterator) { if (empty($options['base_dir'])) { throw new \InvalidArgumentException('You must provide the source' . ' argument as a string or provide the "base_dir" option.'); } $this->sourceMetadata = $this->prepareTarget($options['base_dir']); $this->source = $source; } else { throw new \InvalidArgumentException('source must be the path to a ' . 'directory or an iterator that yields file names.'); } // Validate schemes. if ($this->sourceMetadata['scheme'] === $this->destination['scheme']) { throw new \InvalidArgumentException("You cannot copy from" . " {$this->sourceMetadata['scheme']} to" . " {$this->destination['scheme']}."); } // Handle multipart-related options. $this->concurrency = isset($options['concurrency']) ? $options['concurrency'] : MultipartUploader::DEFAULT_CONCURRENCY; $this->mupThreshold = isset($options['mup_threshold']) ? $options['mup_threshold'] : 16777216; if ($this->mupThreshold < MultipartUploader::PART_MIN_SIZE) { throw new \InvalidArgumentException('mup_threshold must be >= 5MB'); } // Handle "before" callback option. if (isset($options['before'])) { $this->before = $options['before']; if (!\is_callable($this->before)) { throw new \InvalidArgumentException('before must be a callable.'); } } // Handle "debug" option. if (isset($options['debug'])) { if ($options['debug'] === \true) { $options['debug'] = \fopen('php://output', 'w'); } if (\is_resource($options['debug'])) { $this->addDebugToBefore($options['debug']); } } // Handle "add_content_md5" option. $this->addContentMD5 = isset($options['add_content_md5']) && $options['add_content_md5'] === \true; } /** * Transfers the files. * * @return PromiseInterface */ public function promise() { // If the promise has been created, just return it. if (!$this->promise) { // Create an upload/download promise for the transfer. $this->promise = $this->sourceMetadata['scheme'] === 'file' ? $this->createUploadPromise() : $this->createDownloadPromise(); } return $this->promise; } /** * Transfers the files synchronously. */ public function transfer() { $this->promise()->wait(); } private function prepareTarget($targetPath) { $target = ['path' => $this->normalizePath($targetPath), 'scheme' => $this->determineScheme($targetPath)]; if ($target['scheme'] !== 's3' && $target['scheme'] !== 'file') { throw new \InvalidArgumentException('Scheme must be "s3" or "file".'); } return $target; } /** * Creates an array that contains Bucket and Key by parsing the filename. * * @param string $path Path to parse. * * @return array */ private function getS3Args($path) { $parts = \explode('/', \str_replace('s3://', '', $path), 2); $args = ['Bucket' => $parts[0]]; if (isset($parts[1])) { $args['Key'] = $parts[1]; } return $args; } /** * Parses the scheme from a filename. * * @param string $path Path to parse. * * @return string */ private function determineScheme($path) { return !\strpos($path, '://') ? 'file' : \explode('://', $path)[0]; } /** * Normalize a path so that it has UNIX-style directory separators and no trailing / * * @param string $path * * @return string */ private function normalizePath($path) { return \rtrim(\str_replace('\\', '/', $path), '/'); } private function resolvesOutsideTargetDirectory($sink, $objectKey) { $resolved = []; $sections = \explode('/', $sink); $targetSectionsLength = \count(\explode('/', $objectKey)); $targetSections = \array_slice($sections, -($targetSectionsLength + 1)); $targetDirectory = $targetSections[0]; foreach ($targetSections as $section) { if ($section === '.' || $section === '') { continue; } if ($section === '..') { \array_pop($resolved); if (empty($resolved) || $resolved[0] !== $targetDirectory) { return \true; } } else { $resolved[] = $section; } } return \false; } private function createDownloadPromise() { $parts = $this->getS3Args($this->sourceMetadata['path']); $prefix = "s3://{$parts['Bucket']}/" . (isset($parts['Key']) ? $parts['Key'] . '/' : ''); $commands = []; foreach ($this->getDownloadsIterator() as $object) { // Prepare the sink. $objectKey = \preg_replace('/^' . \preg_quote($prefix, '/') . '/', '', $object); $sink = $this->destination['path'] . '/' . $objectKey; $command = $this->client->getCommand('GetObject', $this->getS3Args($object) + ['@http' => ['sink' => $sink]]); if ($this->resolvesOutsideTargetDirectory($sink, $objectKey)) { throw new AwsException('Cannot download key ' . $objectKey . ', its relative path resolves outside the' . ' parent directory', $command); } // Create the directory if needed. $dir = \dirname($sink); if (!\is_dir($dir) && !\mkdir($dir, 0777, \true)) { throw new \RuntimeException("Could not create dir: {$dir}"); } // Create the command. $commands[] = $command; } // Create a GetObject command pool and return the promise. return (new Aws\CommandPool($this->client, $commands, ['concurrency' => $this->concurrency, 'before' => $this->before, 'rejected' => function ($reason, $idx, Promise\PromiseInterface $p) { $p->reject($reason); }]))->promise(); } private function createUploadPromise() { // Map each file into a promise that performs the actual transfer. $files = \VendorDuplicator\Aws\map($this->getUploadsIterator(), function ($file) { return \filesize($file) >= $this->mupThreshold ? $this->uploadMultipart($file) : $this->upload($file); }); // Create an EachPromise, that will concurrently handle the upload // operations' yielded promises from the iterator. return Promise\Each::ofLimitAll($files, $this->concurrency); } /** @return Iterator */ private function getUploadsIterator() { if (\is_string($this->source)) { return Aws\filter(Aws\recursive_dir_iterator($this->sourceMetadata['path']), function ($file) { return !\is_dir($file); }); } return $this->source; } /** @return Iterator */ private function getDownloadsIterator() { if (\is_string($this->source)) { $listArgs = $this->getS3Args($this->sourceMetadata['path']); if (isset($listArgs['Key'])) { $listArgs['Prefix'] = $listArgs['Key'] . '/'; unset($listArgs['Key']); } $files = $this->client->getPaginator('ListObjects', $listArgs)->search('Contents[].Key'); $files = Aws\map($files, function ($key) use($listArgs) { return "s3://{$listArgs['Bucket']}/{$key}"; }); return Aws\filter($files, function ($key) { return \substr($key, -1, 1) !== '/'; }); } return $this->source; } private function upload($filename) { $args = $this->s3Args; $args['SourceFile'] = $filename; $args['Key'] = $this->createS3Key($filename); $args['AddContentMD5'] = $this->addContentMD5; $command = $this->client->getCommand('PutObject', $args); $this->before and \call_user_func($this->before, $command); return $this->client->executeAsync($command); } private function uploadMultipart($filename) { $args = $this->s3Args; $args['Key'] = $this->createS3Key($filename); $filename = $filename instanceof \SplFileInfo ? $filename->getPathname() : $filename; return (new MultipartUploader($this->client, $filename, ['bucket' => $args['Bucket'], 'key' => $args['Key'], 'before_initiate' => $this->before, 'before_upload' => $this->before, 'before_complete' => $this->before, 'concurrency' => $this->concurrency, 'add_content_md5' => $this->addContentMD5]))->promise(); } private function createS3Key($filename) { $filename = $this->normalizePath($filename); $relative_file_path = \ltrim(\preg_replace('#^' . \preg_quote($this->sourceMetadata['path']) . '#', '', $filename), '/\\'); if (isset($this->s3Args['Key'])) { return \rtrim($this->s3Args['Key'], '/') . '/' . $relative_file_path; } return $relative_file_path; } private function addDebugToBefore($debug) { $before = $this->before; $sourcePath = $this->sourceMetadata['path']; $s3Args = $this->s3Args; $this->before = static function (CommandInterface $command) use($before, $debug, $sourcePath, $s3Args) { // Call the composed before function. $before and $before($command); // Determine the source and dest values based on operation. switch ($operation = $command->getName()) { case 'GetObject': $source = "s3://{$command['Bucket']}/{$command['Key']}"; $dest = $command['@http']['sink']; break; case 'PutObject': $source = $command['SourceFile']; $dest = "s3://{$command['Bucket']}/{$command['Key']}"; break; case 'UploadPart': $part = $command['PartNumber']; case 'CreateMultipartUpload': case 'CompleteMultipartUpload': $sourceKey = $command['Key']; if (isset($s3Args['Key']) && \strpos($sourceKey, $s3Args['Key']) === 0) { $sourceKey = \substr($sourceKey, \strlen($s3Args['Key']) + 1); } $source = "{$sourcePath}/{$sourceKey}"; $dest = "s3://{$command['Bucket']}/{$command['Key']}"; break; default: throw new \UnexpectedValueException("Transfer encountered an unexpected operation: {$operation}."); } // Print the debugging message. $context = \sprintf('%s -> %s (%s)', $source, $dest, $operation); if (isset($part)) { $context .= " : Part={$part}"; } \fwrite($debug, "Transferring {$context}\n"); }; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/AmbiguousSuccessParser.php000064400000004066147600374260025053 0ustar00 \true, 'UploadPartCopy' => \true, 'CopyObject' => \true, 'CompleteMultipartUpload' => \true]; /** @var callable */ private $errorParser; /** @var string */ private $exceptionClass; public function __construct(callable $parser, callable $errorParser, $exceptionClass = AwsException::class) { $this->parser = $parser; $this->errorParser = $errorParser; $this->exceptionClass = $exceptionClass; } public function __invoke(CommandInterface $command, ResponseInterface $response) { if (200 === $response->getStatusCode() && isset(self::$ambiguousSuccesses[$command->getName()])) { $errorParser = $this->errorParser; try { $parsed = $errorParser($response); } catch (ParserException $e) { $parsed = ['code' => 'ConnectionError', 'message' => "An error connecting to the service occurred" . " while performing the " . $command->getName() . " operation."]; } if (isset($parsed['code']) && isset($parsed['message'])) { throw new $this->exceptionClass($parsed['message'], $command, ['connection_error' => \true]); } } $fn = $this->parser; return $fn($command, $response); } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parseMemberFromStream($stream, $member, $response); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/SSECMiddleware.php000064400000004351147600374260023142 0ustar00nextHandler = $nextHandler; $this->endpointScheme = $endpointScheme; } public function __invoke(CommandInterface $command, RequestInterface $request = null) { // Allows only HTTPS connections when using SSE-C if (($command['SSECustomerKey'] || $command['CopySourceSSECustomerKey']) && $this->endpointScheme !== 'https') { throw new \RuntimeException('You must configure your S3 client to ' . 'use HTTPS in order to use the SSE-C features.'); } // Prepare the normal SSE-CPK headers if ($command['SSECustomerKey']) { $this->prepareSseParams($command); } // If it's a copy operation, prepare the SSE-CPK headers for the source. if ($command['CopySourceSSECustomerKey']) { $this->prepareSseParams($command, 'CopySource'); } $f = $this->nextHandler; return $f($command, $request); } private function prepareSseParams(CommandInterface $command, $prefix = '') { // Base64 encode the provided key $key = $command[$prefix . 'SSECustomerKey']; $command[$prefix . 'SSECustomerKey'] = \base64_encode($key); // Base64 the provided MD5 or, generate an MD5 if not provided if ($md5 = $command[$prefix . 'SSECustomerKeyMD5']) { $command[$prefix . 'SSECustomerKeyMD5'] = \base64_encode($md5); } else { $command[$prefix . 'SSECustomerKeyMD5'] = \base64_encode(\md5($key, \true)); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/CalculatesChecksumTrait.php000064400000003416147600374260025157 0ustar00crc32c($value))); case 'crc32': return \base64_encode(\pack('N*', $crt->crc32($value))); case 'sha256': case 'sha1': return \base64_encode(Psr7\Utils::hash($value, $requestedAlgorithm, \true)); default: break; throw new InvalidArgumentException("Invalid checksum requested: {$requestedAlgorithm}." . " Valid algorithms are CRC32C, CRC32, SHA256, and SHA1."); } } else { if ($requestedAlgorithm == 'crc32c') { throw new CommonRuntimeException("crc32c is not supported for checksums " . "without use of the common runtime for php. Please enable the CRT or choose " . "a different algorithm."); } if ($requestedAlgorithm == "crc32") { $requestedAlgorithm = "crc32b"; } return \base64_encode(Psr7\Utils::hash($value, $requestedAlgorithm, \true)); } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/PostObjectV4.php000064400000012022147600374260022667 0ustar00client = $client; $this->bucket = $bucket; // setup form attributes $this->formAttributes = ['action' => $this->generateUri(), 'method' => 'POST', 'enctype' => 'multipart/form-data']; $credentials = $this->client->getCredentials()->wait(); if ($securityToken = $credentials->getSecurityToken()) { $options[] = ['x-amz-security-token' => $securityToken]; $formInputs['X-Amz-Security-Token'] = $securityToken; } // setup basic policy $policy = ['expiration' => TimestampShape::format($expiration, 'iso8601'), 'conditions' => $options]; // setup basic formInputs $this->formInputs = $formInputs + ['key' => '${filename}']; // finalize policy and signature $this->formInputs += $this->getPolicyAndSignature($credentials, $policy); } /** * Gets the S3 client. * * @return S3ClientInterface */ public function getClient() { return $this->client; } /** * Gets the bucket name. * * @return string */ public function getBucket() { return $this->bucket; } /** * Gets the form attributes as an array. * * @return array */ public function getFormAttributes() { return $this->formAttributes; } /** * Set a form attribute. * * @param string $attribute Form attribute to set. * @param string $value Value to set. */ public function setFormAttribute($attribute, $value) { $this->formAttributes[$attribute] = $value; } /** * Gets the form inputs as an array. * * @return array */ public function getFormInputs() { return $this->formInputs; } /** * Set a form input. * * @param string $field Field name to set * @param string $value Value to set. */ public function setFormInput($field, $value) { $this->formInputs[$field] = $value; } private function generateUri() { $uri = new Uri($this->client->getEndpoint()); if ($this->client->getConfig('use_path_style_endpoint') === \true || $uri->getScheme() === 'https' && \strpos($this->bucket, '.') !== \false) { // Use path-style URLs $uri = $uri->withPath("/{$this->bucket}"); } else { // Use virtual-style URLs if haven't been set up already if (\strpos($uri->getHost(), $this->bucket . '.') !== 0) { $uri = $uri->withHost($this->bucket . '.' . $uri->getHost()); } } return (string) $uri; } protected function getPolicyAndSignature(CredentialsInterface $credentials, array $policy) { $ldt = \gmdate(SignatureV4::ISO8601_BASIC); $sdt = \substr($ldt, 0, 8); $policy['conditions'][] = ['X-Amz-Date' => $ldt]; $region = $this->client->getRegion(); $scope = $this->createScope($sdt, $region, 's3'); $creds = "{$credentials->getAccessKeyId()}/{$scope}"; $policy['conditions'][] = ['X-Amz-Credential' => $creds]; $policy['conditions'][] = ['X-Amz-Algorithm' => "AWS4-HMAC-SHA256"]; $jsonPolicy64 = \base64_encode(\json_encode($policy)); $key = $this->getSigningKey($sdt, $region, 's3', $credentials->getSecretKey()); return ['X-Amz-Credential' => $creds, 'X-Amz-Algorithm' => "AWS4-HMAC-SHA256", 'X-Amz-Date' => $ldt, 'Policy' => $jsonPolicy64, 'X-Amz-Signature' => \bin2hex(\hash_hmac('sha256', $jsonPolicy64, $key, \true))]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/PermanentRedirectMiddleware.php000064400000003043147600374260026015 0ustar00nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request = null) { $next = $this->nextHandler; return $next($command, $request)->then(function (ResultInterface $result) use($command) { $status = isset($result['@metadata']['statusCode']) ? $result['@metadata']['statusCode'] : null; if ($status == 301) { throw new PermanentRedirectException('Encountered a permanent redirect while requesting ' . $result->search('"@metadata".effectiveUri') . '. ' . 'Are you sure you are using the correct region for ' . 'this bucket?', $command, ['result' => $result]); } return $result; }); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/EndpointRegionHelperTrait.php000064400000005700147600374260025476 0ustar00getPartition($arn->getRegion(), $arn->getService()); return $partition->getDnsSuffix(); } private function getSigningRegion($region, $service, PartitionEndpointProvider $provider) { $partition = $provider->getPartition($region, $service); $data = $partition->toArray(); if (isset($data['services'][$service]['endpoints'][$region]['credentialScope']['region'])) { return $data['services'][$service]['endpoints'][$region]['credentialScope']['region']; } return $region; } private function isMatchingSigningRegion($arnRegion, $clientRegion, $service, PartitionEndpointProvider $provider) { $arnRegion = \VendorDuplicator\Aws\strip_fips_pseudo_regions(\strtolower($arnRegion)); $clientRegion = \strtolower($clientRegion); if ($arnRegion === $clientRegion) { return \true; } if ($this->getSigningRegion($clientRegion, $service, $provider) === $arnRegion) { return \true; } return \false; } private function validateFipsConfigurations(ArnInterface $arn) { $useFipsEndpoint = !empty($this->config['use_fips_endpoint']); if ($arn instanceof OutpostsArnInterface) { if (empty($this->config['use_arn_region']) || !$this->config['use_arn_region']->isUseArnRegion()) { $region = $this->region; } else { $region = $arn->getRegion(); } if (\VendorDuplicator\Aws\is_fips_pseudo_region($region)) { throw new InvalidRegionException('Fips is currently not supported with S3 Outposts access' . ' points. Please provide a non-fips region or do not supply an' . ' access point ARN.'); } } } private function validateMatchingRegion(ArnInterface $arn) { if (!$this->isMatchingSigningRegion($arn->getRegion(), $this->region, $this->service->getEndpointPrefix(), $this->partitionProvider)) { if (empty($this->config['use_arn_region']) || !$this->config['use_arn_region']->isUseArnRegion()) { throw new InvalidRegionException('The region' . " specified in the ARN (" . $arn->getRegion() . ") does not match the client region (" . "{$this->region})."); } } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/BucketEndpointArnMiddleware.php000064400000030721147600374260025764 0ustar00partitionProvider = PartitionEndpointProvider::defaultProvider(); $this->region = $region; $this->service = $service; $this->config = $config; $this->nextHandler = $nextHandler; $this->isUseEndpointV2 = $isUseEndpointV2; } public function __invoke(CommandInterface $cmd, RequestInterface $req) { $nextHandler = $this->nextHandler; $op = $this->service->getOperation($cmd->getName())->toArray(); if (!empty($op['input']['shape'])) { $service = $this->service->toArray(); if (!empty($input = $service['shapes'][$op['input']['shape']])) { foreach ($input['members'] as $key => $member) { if ($member['shape'] === 'BucketName') { $arnableKey = $key; break; } } if (!empty($arnableKey) && ArnParser::isArn($cmd[$arnableKey])) { try { // Throw for commands that do not support ARN inputs if (\in_array($cmd->getName(), $this->nonArnableCommands)) { throw new S3Exception('ARN values cannot be used in the bucket field for' . ' the ' . $cmd->getName() . ' operation.', $cmd); } if (!$this->isUseEndpointV2) { $arn = ArnParser::parse($cmd[$arnableKey]); $partition = $this->validateArn($arn); $host = $this->generateAccessPointHost($arn, $req); } // Remove encoded bucket string from path $path = $req->getUri()->getPath(); $encoded = \rawurlencode($cmd[$arnableKey]); $len = \strlen($encoded) + 1; if (\trim(\substr($path, 0, $len), '/') === "{$encoded}") { $path = \substr($path, $len); if (\substr($path, 0, 1) !== "/") { $path = '/' . $path; } } if (empty($path)) { $path = ''; } // Set modified request if ($this->isUseEndpointV2) { $req = $req->withUri($req->getUri()->withPath($path)); goto next; } $req = $req->withUri($req->getUri()->withPath($path)->withHost($host)); // Update signing region based on ARN data if configured to do so if ($this->config['use_arn_region']->isUseArnRegion() && !$this->config['use_fips_endpoint']->isUseFipsEndpoint()) { $region = $arn->getRegion(); } else { $region = $this->region; } $endpointData = $partition(['region' => $region, 'service' => $arn->getService()]); $cmd['@context']['signing_region'] = $endpointData['signingRegion']; // Update signing service for Outposts and Lambda ARNs if ($arn instanceof OutpostsArnInterface || $arn instanceof ObjectLambdaAccessPointArn) { $cmd['@context']['signing_service'] = $arn->getService(); } } catch (InvalidArnException $e) { // Add context to ARN exception throw new S3Exception('Bucket parameter parsed as ARN and failed with: ' . $e->getMessage(), $cmd, [], $e); } } } } next: return $nextHandler($cmd, $req); } private function generateAccessPointHost(BaseAccessPointArn $arn, RequestInterface $req) { if ($arn instanceof OutpostsAccessPointArn) { $accesspointName = $arn->getAccesspointName(); } else { $accesspointName = $arn->getResourceId(); } if ($arn instanceof MultiRegionAccessPointArn) { $partition = $this->partitionProvider->getPartitionByName($arn->getPartition(), 's3'); $dnsSuffix = $partition->getDnsSuffix(); return "{$accesspointName}.accesspoint.s3-global.{$dnsSuffix}"; } $host = "{$accesspointName}-" . $arn->getAccountId(); $useFips = $this->config['use_fips_endpoint']->isUseFipsEndpoint(); $fipsString = $useFips ? "-fips" : ""; if ($arn instanceof OutpostsAccessPointArn) { $host .= '.' . $arn->getOutpostId() . '.s3-outposts'; } else { if ($arn instanceof ObjectLambdaAccessPointArn) { if (!empty($this->config['endpoint'])) { return $host . '.' . $this->config['endpoint']; } else { $host .= ".s3-object-lambda{$fipsString}"; } } else { $host .= ".s3-accesspoint{$fipsString}"; if (!empty($this->config['dual_stack'])) { $host .= '.dualstack'; } } } if (!empty($this->config['use_arn_region']->isUseArnRegion())) { $region = $arn->getRegion(); } else { $region = $this->region; } $region = \VendorDuplicator\Aws\strip_fips_pseudo_regions($region); $host .= '.' . $region . '.' . $this->getPartitionSuffix($arn, $this->partitionProvider); return $host; } /** * Validates an ARN, returning a partition object corresponding to the ARN * if successful * * @param $arn * @return \VendorDuplicator\Aws\Endpoint\Partition */ private function validateArn($arn) { if ($arn instanceof AccessPointArnInterface) { // Dualstack is not supported with Outposts access points if ($arn instanceof OutpostsAccessPointArn && !empty($this->config['dual_stack'])) { throw new UnresolvedEndpointException('Dualstack is currently not supported with S3 Outposts access' . ' points. Please disable dualstack or do not supply an' . ' access point ARN.'); } if ($arn instanceof MultiRegionAccessPointArn) { if (!empty($this->config['disable_multiregion_access_points'])) { throw new UnresolvedEndpointException('Multi-Region Access Point ARNs are disabled, but one was provided. Please' . ' enable them or provide a different ARN.'); } if (!empty($this->config['dual_stack'])) { throw new UnresolvedEndpointException('Multi-Region Access Point ARNs do not currently support dual stack. Please' . ' disable dual stack or provide a different ARN.'); } } // Accelerate is not supported with access points if (!empty($this->config['accelerate'])) { throw new UnresolvedEndpointException('Accelerate is currently not supported with access points.' . ' Please disable accelerate or do not supply an access' . ' point ARN.'); } // Path-style is not supported with access points if (!empty($this->config['path_style'])) { throw new UnresolvedEndpointException('Path-style addressing is currently not supported with' . ' access points. Please disable path-style or do not' . ' supply an access point ARN.'); } // Custom endpoint is not supported with access points if (!\is_null($this->config['endpoint']) && !$arn instanceof ObjectLambdaAccessPointArn) { throw new UnresolvedEndpointException('A custom endpoint has been supplied along with an access' . ' point ARN, and these are not compatible with each other.' . ' Please only use one or the other.'); } // Dualstack is not supported with object lambda access points if ($arn instanceof ObjectLambdaAccessPointArn && !empty($this->config['dual_stack'])) { throw new UnresolvedEndpointException('Dualstack is currently not supported with Object Lambda access' . ' points. Please disable dualstack or do not supply an' . ' access point ARN.'); } // Global endpoints do not support cross-region requests if ($this->isGlobal($this->region) && $this->config['use_arn_region']->isUseArnRegion() == \false && $arn->getRegion() != $this->region && !$arn instanceof MultiRegionAccessPointArn) { throw new UnresolvedEndpointException('Global endpoints do not support cross region requests.' . ' Please enable use_arn_region or do not supply a global region' . ' with a different region in the ARN.'); } // Get partitions for ARN and client region $arnPart = $this->partitionProvider->getPartition($arn->getRegion(), 's3'); $clientPart = $this->partitionProvider->getPartition($this->region, 's3'); // If client partition not found, try removing pseudo-region qualifiers if (!$clientPart->isRegionMatch($this->region, 's3')) { $clientPart = $this->partitionProvider->getPartition(\VendorDuplicator\Aws\strip_fips_pseudo_regions($this->region), 's3'); } if (!$arn instanceof MultiRegionAccessPointArn) { // Verify that the partition matches for supplied partition and region if ($arn->getPartition() !== $clientPart->getName()) { throw new InvalidRegionException('The supplied ARN partition' . " does not match the client's partition."); } if ($clientPart->getName() !== $arnPart->getName()) { throw new InvalidRegionException('The corresponding partition' . ' for the supplied ARN region does not match the' . " client's partition."); } // Ensure ARN region matches client region unless // configured for using ARN region over client region $this->validateMatchingRegion($arn); // Ensure it is not resolved to fips pseudo-region for S3 Outposts $this->validateFipsConfigurations($arn); } return $arnPart; } throw new InvalidArnException('Provided ARN was not a valid S3 access' . ' point ARN or S3 Outposts access point ARN.'); } /** * Checks if a region is global * * @param $region * @return bool */ private function isGlobal($region) { return $region == 's3-external-1' || $region == 'aws-global'; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/PutObjectUrlMiddleware.php000064400000002743147600374260024772 0ustar00nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request = null) { $next = $this->nextHandler; return $next($command, $request)->then(function (ResultInterface $result) use($command) { $name = $command->getName(); switch ($name) { case 'PutObject': case 'CopyObject': $result['ObjectURL'] = isset($result['@metadata']['effectiveUri']) ? $result['@metadata']['effectiveUri'] : null; break; case 'CompleteMultipartUpload': $result['ObjectURL'] = $result['Location']; break; } return $result; }); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/BatchDelete.php000064400000016363147600374260022561 0ustar00 'us-west-2', * 'version' => 'latest' * ]); * * $listObjectsParams = ['Bucket' => 'foo', 'Prefix' => 'starts/with/']; * $delete = Aws\S3\BatchDelete::fromListObjects($s3, $listObjectsParams); * // Asynchronously delete * $promise = $delete->promise(); * // Force synchronous completion * $delete->delete(); * * When using one of the batch delete creational static methods, you can supply * an associative array of options: * * - before: Function invoked before executing a command. The function is * passed the command that is about to be executed. This can be useful * for logging, adding custom request headers, etc. * - batch_size: The size of each delete batch. Defaults to 1000. * * @link http://docs.aws.amazon.com/AmazonS3/latest/API/multiobjectdeleteapi.html */ class BatchDelete implements PromisorInterface { private $bucket; /** @var AwsClientInterface */ private $client; /** @var callable */ private $before; /** @var PromiseInterface */ private $cachedPromise; /** @var callable */ private $promiseCreator; private $batchSize = 1000; private $queue = []; /** * Creates a BatchDelete object from all of the paginated results of a * ListObjects operation. Each result that is returned by the ListObjects * operation will be deleted. * * @param AwsClientInterface $client AWS Client to use. * @param array $listObjectsParams ListObjects API parameters * @param array $options BatchDelete options. * * @return BatchDelete */ public static function fromListObjects(AwsClientInterface $client, array $listObjectsParams, array $options = []) { $iter = $client->getPaginator('ListObjects', $listObjectsParams); $bucket = $listObjectsParams['Bucket']; $fn = function (BatchDelete $that) use($iter) { return $iter->each(function ($result) use($that) { $promises = []; if (\is_array($result['Contents'])) { foreach ($result['Contents'] as $object) { if ($promise = $that->enqueue($object)) { $promises[] = $promise; } } } return $promises ? Promise\Utils::all($promises) : null; }); }; return new self($client, $bucket, $fn, $options); } /** * Creates a BatchDelete object from an iterator that yields results. * * @param AwsClientInterface $client AWS Client to use to execute commands * @param string $bucket Bucket where the objects are stored * @param \Iterator $iter Iterator that yields assoc arrays * @param array $options BatchDelete options * * @return BatchDelete */ public static function fromIterator(AwsClientInterface $client, $bucket, \Iterator $iter, array $options = []) { $fn = function (BatchDelete $that) use($iter) { return Promise\Coroutine::of(function () use($that, $iter) { foreach ($iter as $obj) { if ($promise = $that->enqueue($obj)) { (yield $promise); } } }); }; return new self($client, $bucket, $fn, $options); } /** * @return PromiseInterface */ public function promise() { if (!$this->cachedPromise) { $this->cachedPromise = $this->createPromise(); } return $this->cachedPromise; } /** * Synchronously deletes all of the objects. * * @throws DeleteMultipleObjectsException on error. */ public function delete() { $this->promise()->wait(); } /** * @param AwsClientInterface $client Client used to transfer the requests * @param string $bucket Bucket to delete from. * @param callable $promiseFn Creates a promise. * @param array $options Hash of options used with the batch * * @throws \InvalidArgumentException if the provided batch_size is <= 0 */ private function __construct(AwsClientInterface $client, $bucket, callable $promiseFn, array $options = []) { $this->client = $client; $this->bucket = $bucket; $this->promiseCreator = $promiseFn; if (isset($options['before'])) { if (!\is_callable($options['before'])) { throw new \InvalidArgumentException('before must be callable'); } $this->before = $options['before']; } if (isset($options['batch_size'])) { if ($options['batch_size'] <= 0) { throw new \InvalidArgumentException('batch_size is not > 0'); } $this->batchSize = \min($options['batch_size'], 1000); } } private function enqueue(array $obj) { $this->queue[] = $obj; return \count($this->queue) >= $this->batchSize ? $this->flushQueue() : null; } private function flushQueue() { static $validKeys = ['Key' => \true, 'VersionId' => \true]; if (\count($this->queue) === 0) { return null; } $batch = []; while ($obj = \array_shift($this->queue)) { $batch[] = \array_intersect_key($obj, $validKeys); } $command = $this->client->getCommand('DeleteObjects', ['Bucket' => $this->bucket, 'Delete' => ['Objects' => $batch]]); if ($this->before) { \call_user_func($this->before, $command); } return $this->client->executeAsync($command)->then(function ($result) { if (!empty($result['Errors'])) { throw new DeleteMultipleObjectsException($result['Deleted'] ?: [], $result['Errors']); } return $result; }); } /** * Returns a promise that will clean up any references when it completes. * * @return PromiseInterface */ private function createPromise() { // Create the promise $promise = \call_user_func($this->promiseCreator, $this); $this->promiseCreator = null; // Cleans up the promise state and references. $cleanup = function () { $this->before = $this->client = $this->queue = null; }; // When done, ensure cleanup and that any remaining are processed. return $promise->then(function () use($cleanup) { return Promise\Create::promiseFor($this->flushQueue())->then($cleanup); }, function ($reason) use($cleanup) { $cleanup(); return Promise\Create::rejectionFor($reason); }); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3ClientInterface.php000064400000033450147600374260023656 0ustar00api = $api; $this->nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request) { $next = $this->nextHandler; $name = $command->getName(); $body = $request->getBody(); //Checks if AddContentMD5 has been specified for PutObject or UploadPart $addContentMD5 = isset($command['AddContentMD5']) ? $command['AddContentMD5'] : null; $op = $this->api->getOperation($command->getName()); $checksumInfo = isset($op['httpChecksum']) ? $op['httpChecksum'] : []; $checksumMemberName = \array_key_exists('requestAlgorithmMember', $checksumInfo) ? $checksumInfo['requestAlgorithmMember'] : ""; $requestedAlgorithm = isset($command[$checksumMemberName]) ? $command[$checksumMemberName] : null; if (!empty($checksumMemberName) && !empty($requestedAlgorithm)) { $requestedAlgorithm = \strtolower($requestedAlgorithm); $checksumMember = $op->getInput()->getMember($checksumMemberName); $supportedAlgorithms = isset($checksumMember['enum']) ? \array_map('strtolower', $checksumMember['enum']) : null; if (\is_array($supportedAlgorithms) && \in_array($requestedAlgorithm, $supportedAlgorithms)) { $headerName = "x-amz-checksum-{$requestedAlgorithm}"; $encoded = $this->getEncodedValue($requestedAlgorithm, $body); if (!$request->hasHeader($headerName)) { $request = $request->withHeader($headerName, $encoded); } } else { throw new InvalidArgumentException("Unsupported algorithm supplied for input variable {$checksumMemberName}." . " Supported checksums for this operation include: " . \implode(", ", $supportedAlgorithms) . "."); } return $next($command, $request); } if (!empty($checksumInfo)) { //if the checksum member is absent, check if it's required $checksumRequired = isset($checksumInfo['requestChecksumRequired']) ? $checksumInfo['requestChecksumRequired'] : null; if (!empty($checksumRequired) && !$request->hasHeader('Content-MD5') || \in_array($name, self::$sha256AndMd5) && $addContentMD5) { // Set the content MD5 header for operations that require it. $request = $request->withHeader('Content-MD5', \base64_encode(Psr7\Utils::hash($body, 'md5', \true))); return $next($command, $request); } } if (\in_array($name, self::$sha256AndMd5) && $command['ContentSHA256']) { // Set the content hash header if provided in the parameters. $request = $request->withHeader('X-Amz-Content-Sha256', $command['ContentSHA256']); } return $next($command, $request); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/S3UriParser.php000064400000011433147600374260022530 0ustar00 \true, 'bucket' => null, 'key' => null, 'region' => null]; /** * Parses a URL or S3 StreamWrapper Uri (s3://) into an associative array * of Amazon S3 data including: * * - bucket: The Amazon S3 bucket (null if none) * - key: The Amazon S3 key (null if none) * - path_style: Set to true if using path style, or false if not * - region: Set to a string if a non-class endpoint is used or null. * * @param string|UriInterface $uri * * @return array * @throws \InvalidArgumentException|InvalidArnException */ public function parse($uri) { // Attempt to parse host component of uri as an ARN $components = $this->parseS3UrlComponents($uri); if (!empty($components)) { if (ArnParser::isArn($components['host'])) { $arn = new AccessPointArn($components['host']); return ['bucket' => $components['host'], 'key' => $components['path'], 'path_style' => \false, 'region' => $arn->getRegion()]; } } $url = Psr7\Utils::uriFor($uri); if ($url->getScheme() == $this->streamWrapperScheme) { return $this->parseStreamWrapper($url); } if (!$url->getHost()) { throw new \InvalidArgumentException('No hostname found in URI: ' . $uri); } if (!\preg_match($this->pattern, $url->getHost(), $matches)) { return $this->parseCustomEndpoint($url); } // Parse the URI based on the matched format (path / virtual) $result = empty($matches[1]) ? $this->parsePathStyle($url) : $this->parseVirtualHosted($url, $matches); // Add the region if one was found and not the classic endpoint $result['region'] = $matches[2] == 'amazonaws' ? null : $matches[2]; return $result; } private function parseS3UrlComponents($uri) { \preg_match("/^([a-zA-Z0-9]*):\\/\\/([a-zA-Z0-9:-]*)\\/(.*)/", $uri, $components); if (empty($components)) { return []; } return ['scheme' => $components[1], 'host' => $components[2], 'path' => $components[3]]; } private function parseStreamWrapper(UriInterface $url) { $result = self::$defaultResult; $result['path_style'] = \false; $result['bucket'] = $url->getHost(); if ($url->getPath()) { $key = \ltrim($url->getPath(), '/ '); if (!empty($key)) { $result['key'] = $key; } } return $result; } private function parseCustomEndpoint(UriInterface $url) { $result = self::$defaultResult; $path = \ltrim($url->getPath(), '/ '); $segments = \explode('/', $path, 2); if (isset($segments[0])) { $result['bucket'] = $segments[0]; if (isset($segments[1])) { $result['key'] = $segments[1]; } } return $result; } private function parsePathStyle(UriInterface $url) { $result = self::$defaultResult; if ($url->getPath() != '/') { $path = \ltrim($url->getPath(), '/'); if ($path) { $pathPos = \strpos($path, '/'); if ($pathPos === \false) { // https://s3.amazonaws.com/bucket $result['bucket'] = $path; } elseif ($pathPos == \strlen($path) - 1) { // https://s3.amazonaws.com/bucket/ $result['bucket'] = \substr($path, 0, -1); } else { // https://s3.amazonaws.com/bucket/key $result['bucket'] = \substr($path, 0, $pathPos); $result['key'] = \substr($path, $pathPos + 1) ?: null; } } } return $result; } private function parseVirtualHosted(UriInterface $url, array $matches) { $result = self::$defaultResult; $result['path_style'] = \false; // Remove trailing "." from the prefix to get the bucket $result['bucket'] = \substr($matches[1], 0, -1); $path = $url->getPath(); // Check if a key was present, and if so, removing the leading "/" $result['key'] = !$path || $path == '/' ? null : \substr($path, 1); return $result; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/ObjectUploader.php000064400000012205147600374260023306 0ustar00 null, 'concurrency' => 3, 'mup_threshold' => self::DEFAULT_MULTIPART_THRESHOLD, 'params' => [], 'part_size' => null]; private $addContentMD5; /** * @param S3ClientInterface $client The S3 Client used to execute * the upload command(s). * @param string $bucket Bucket to upload the object, or * an S3 access point ARN. * @param string $key Key of the object. * @param mixed $body Object data to upload. Can be a * StreamInterface, PHP stream * resource, or a string of data to * upload. * @param string $acl ACL to apply to the copy * (default: private). * @param array $options Options used to configure the * copy process. Options passed in * through 'params' are added to * the sub command(s). */ public function __construct(S3ClientInterface $client, $bucket, $key, $body, $acl = 'private', array $options = []) { $this->client = $client; $this->bucket = $bucket; $this->key = $key; $this->body = Psr7\Utils::streamFor($body); $this->acl = $acl; $this->options = $options + self::$defaults; // Handle "add_content_md5" option. $this->addContentMD5 = isset($options['add_content_md5']) && $options['add_content_md5'] === \true; } /** * @return PromiseInterface */ public function promise() { /** @var int $mup_threshold */ $mup_threshold = $this->options['mup_threshold']; if ($this->requiresMultipart($this->body, $mup_threshold)) { // Perform a multipart upload. return (new MultipartUploader($this->client, $this->body, ['bucket' => $this->bucket, 'key' => $this->key, 'acl' => $this->acl] + $this->options))->promise(); } // Perform a regular PutObject operation. $command = $this->client->getCommand('PutObject', ['Bucket' => $this->bucket, 'Key' => $this->key, 'Body' => $this->body, 'ACL' => $this->acl, 'AddContentMD5' => $this->addContentMD5] + $this->options['params']); if (\is_callable($this->options['before_upload'])) { $this->options['before_upload']($command); } return $this->client->executeAsync($command); } public function upload() { return $this->promise()->wait(); } /** * Determines if the body should be uploaded using PutObject or the * Multipart Upload System. It also modifies the passed-in $body as needed * to support the upload. * * @param StreamInterface $body Stream representing the body. * @param integer $threshold Minimum bytes before using Multipart. * * @return bool */ private function requiresMultipart(StreamInterface &$body, $threshold) { // If body size known, compare to threshold to determine if Multipart. if ($body->getSize() !== null) { return $body->getSize() >= $threshold; } /** * Handle the situation where the body size is unknown. * Read up to 5MB into a buffer to determine how to upload the body. * @var StreamInterface $buffer */ $buffer = Psr7\Utils::streamFor(); Psr7\Utils::copyToStream($body, $buffer, MultipartUploader::PART_MIN_SIZE); // If body < 5MB, use PutObject with the buffer. if ($buffer->getSize() < MultipartUploader::PART_MIN_SIZE) { $buffer->seek(0); $body = $buffer; return \false; } // If body >= 5 MB, then use multipart. [YES] if ($body->isSeekable() && $body->getMetadata('uri') !== 'php://input') { // If the body is seekable, just rewind the body. $body->seek(0); } else { // If the body is non-seekable, stitch the rewind the buffer and // the partially read body together into one stream. This avoids // unnecessary disc usage and does not require seeking on the // original stream. $buffer->seek(0); $body = new Psr7\AppendStream([$buffer, $body]); } return \true; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/MultipartCopy.php000064400000020654147600374260023227 0ustar00/). If the key contains a '?' * character, instead pass an array of source_key, * source_bucket, and source_version_id. * @param array $config Configuration used to perform the upload. */ public function __construct(S3ClientInterface $client, $source, array $config = []) { if (\is_array($source)) { $this->source = $source; } else { $this->source = $this->getInputSource($source); } parent::__construct($client, \array_change_key_case($config) + ['source_metadata' => null]); } /** * An alias of the self::upload method. * * @see self::upload */ public function copy() { return $this->upload(); } protected function loadUploadWorkflowInfo() { return ['command' => ['initiate' => 'CreateMultipartUpload', 'upload' => 'UploadPartCopy', 'complete' => 'CompleteMultipartUpload'], 'id' => ['bucket' => 'Bucket', 'key' => 'Key', 'upload_id' => 'UploadId'], 'part_num' => 'PartNumber']; } protected function getUploadCommands(callable $resultHandler) { $parts = \ceil($this->getSourceSize() / $this->determinePartSize()); for ($partNumber = 1; $partNumber <= $parts; $partNumber++) { // If we haven't already uploaded this part, yield a new part. if (!$this->state->hasPartBeenUploaded($partNumber)) { $command = $this->client->getCommand($this->info['command']['upload'], $this->createPart($partNumber, $parts) + $this->getState()->getId()); $command->getHandlerList()->appendSign($resultHandler, 'mup'); (yield $command); } } } private function createPart($partNumber, $partsCount) { $data = []; // Apply custom params to UploadPartCopy data $config = $this->getConfig(); $params = isset($config['params']) ? $config['params'] : []; foreach ($params as $k => $v) { $data[$k] = $v; } // The source parameter here is usually a string, but can be overloaded as an array // if the key contains a '?' character to specify where the query parameters start if (\is_array($this->source)) { $key = \str_replace('%2F', '/', \rawurlencode($this->source['source_key'])); $bucket = $this->source['source_bucket']; } else { list($bucket, $key) = \explode('/', \ltrim($this->source, '/'), 2); $key = \implode('/', \array_map('urlencode', \explode('/', \rawurldecode($key)))); } $uri = ArnParser::isArn($bucket) ? '' : '/'; $uri .= $bucket . '/' . $key; $data['CopySource'] = $uri; $data['PartNumber'] = $partNumber; if (!empty($this->sourceVersionId)) { $data['CopySource'] .= "?versionId=" . $this->sourceVersionId; } $defaultPartSize = $this->determinePartSize(); $startByte = $defaultPartSize * ($partNumber - 1); $data['ContentLength'] = $partNumber < $partsCount ? $defaultPartSize : $this->getSourceSize() - $defaultPartSize * ($partsCount - 1); $endByte = $startByte + $data['ContentLength'] - 1; $data['CopySourceRange'] = "bytes={$startByte}-{$endByte}"; return $data; } protected function extractETag(ResultInterface $result) { return $result->search('CopyPartResult.ETag'); } protected function getSourceMimeType() { return $this->getSourceMetadata()['ContentType']; } protected function getSourceSize() { return $this->getSourceMetadata()['ContentLength']; } private function getSourceMetadata() { if (empty($this->sourceMetadata)) { $this->sourceMetadata = $this->fetchSourceMetadata(); } return $this->sourceMetadata; } private function fetchSourceMetadata() { if ($this->config['source_metadata'] instanceof ResultInterface) { return $this->config['source_metadata']; } //if the source variable was overloaded with an array, use the inputs for key and bucket if (\is_array($this->source)) { $headParams = ['Key' => $this->source['source_key'], 'Bucket' => $this->source['source_bucket']]; if (isset($this->source['source_version_id'])) { $this->sourceVersionId = $this->source['source_version_id']; $headParams['VersionId'] = $this->sourceVersionId; } //otherwise, use the default source parsing behavior } else { list($bucket, $key) = \explode('/', \ltrim($this->source, '/'), 2); $headParams = ['Bucket' => $bucket, 'Key' => $key]; if (\strpos($key, '?')) { list($key, $query) = \explode('?', $key, 2); $headParams['Key'] = $key; $query = Psr7\Query::parse($query, \false); if (isset($query['versionId'])) { $this->sourceVersionId = $query['versionId']; $headParams['VersionId'] = $this->sourceVersionId; } } } return $this->client->headObject($headParams); } /** * Get the url decoded input source, starting with a slash if it is not an * ARN to standardize the source location syntax. * * @param string $inputSource The source that was passed to the constructor * @return string The source, starting with a slash if it's not an arn */ private function getInputSource($inputSource) { $sourceBuilder = ArnParser::isArn($inputSource) ? '' : '/'; $sourceBuilder .= \ltrim(\rawurldecode($inputSource), '/'); return $sourceBuilder; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/RetryableMalformedResponseParser.php000064400000002622147600374260027062 0ustar00parser = $parser; $this->exceptionClass = $exceptionClass; } public function __invoke(CommandInterface $command, ResponseInterface $response) { $fn = $this->parser; try { return $fn($command, $response); } catch (ParserException $e) { throw new $this->exceptionClass("Error parsing response for {$command->getName()}:" . " AWS parsing error: {$e->getMessage()}", $command, ['connection_error' => \true, 'exception' => $e], $e); } } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parseMemberFromStream($stream, $member, $response); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/MultipartUploadingTrait.php000064400000007667147600374260025254 0ustar00 $bucket, 'Key' => $key, 'UploadId' => $uploadId]); foreach ($client->getPaginator('ListParts', $state->getId()) as $result) { // Get the part size from the first part in the first result. if (!$state->getPartSize()) { $state->setPartSize($result->search('Parts[0].Size')); } // Mark all the parts returned by ListParts as uploaded. foreach ($result['Parts'] as $part) { $state->markPartAsUploaded($part['PartNumber'], ['PartNumber' => $part['PartNumber'], 'ETag' => $part['ETag']]); } } $state->setStatus(UploadState::INITIATED); return $state; } protected function handleResult(CommandInterface $command, ResultInterface $result) { $partData = []; $partData['PartNumber'] = $command['PartNumber']; $partData['ETag'] = $this->extractETag($result); if (isset($command['ChecksumAlgorithm'])) { $checksumMemberName = 'Checksum' . \strtoupper($command['ChecksumAlgorithm']); $partData[$checksumMemberName] = $result[$checksumMemberName]; } $this->getState()->markPartAsUploaded($command['PartNumber'], $partData); } protected abstract function extractETag(ResultInterface $result); protected function getCompleteParams() { $config = $this->getConfig(); $params = isset($config['params']) ? $config['params'] : []; $params['MultipartUpload'] = ['Parts' => $this->getState()->getUploadedParts()]; return $params; } protected function determinePartSize() { // Make sure the part size is set. $partSize = $this->getConfig()['part_size'] ?: MultipartUploader::PART_MIN_SIZE; // Adjust the part size to be larger for known, x-large uploads. if ($sourceSize = $this->getSourceSize()) { $partSize = (int) \max($partSize, \ceil($sourceSize / MultipartUploader::PART_MAX_NUM)); } // Ensure that the part size follows the rules: 5 MB <= size <= 5 GB. if ($partSize < MultipartUploader::PART_MIN_SIZE || $partSize > MultipartUploader::PART_MAX_SIZE) { throw new \InvalidArgumentException('The part size must be no less ' . 'than 5 MB and no greater than 5 GB.'); } return $partSize; } protected function getInitiateParams() { $config = $this->getConfig(); $params = isset($config['params']) ? $config['params'] : []; if (isset($config['acl'])) { $params['ACL'] = $config['acl']; } // Set the ContentType if not already present if (empty($params['ContentType']) && ($type = $this->getSourceMimeType())) { $params['ContentType'] = $type; } return $params; } /** * @return UploadState */ protected abstract function getState(); /** * @return array */ protected abstract function getConfig(); /** * @return int */ protected abstract function getSourceSize(); /** * @return string|null */ protected abstract function getSourceMimeType(); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/StreamWrapper.php000064400000073240147600374260023206 0ustar00/" files with PHP * streams, supporting "r", "w", "a", "x". * * # Opening "r" (read only) streams: * * Read only streams are truly streaming by default and will not allow you to * seek. This is because data read from the stream is not kept in memory or on * the local filesystem. You can force a "r" stream to be seekable by setting * the "seekable" stream context option true. This will allow true streaming of * data from Amazon S3, but will maintain a buffer of previously read bytes in * a 'php://temp' stream to allow seeking to previously read bytes from the * stream. * * You may pass any GetObject parameters as 's3' stream context options. These * options will affect how the data is downloaded from Amazon S3. * * # Opening "w" and "x" (write only) streams: * * Because Amazon S3 requires a Content-Length header, write only streams will * maintain a 'php://temp' stream to buffer data written to the stream until * the stream is flushed (usually by closing the stream with fclose). * * You may pass any PutObject parameters as 's3' stream context options. These * options will affect how the data is uploaded to Amazon S3. * * When opening an "x" stream, the file must exist on Amazon S3 for the stream * to open successfully. * * # Opening "a" (write only append) streams: * * Similar to "w" streams, opening append streams requires that the data be * buffered in a "php://temp" stream. Append streams will attempt to download * the contents of an object in Amazon S3, seek to the end of the object, then * allow you to append to the contents of the object. The data will then be * uploaded using a PutObject operation when the stream is flushed (usually * with fclose). * * You may pass any GetObject and/or PutObject parameters as 's3' stream * context options. These options will affect how the data is downloaded and * uploaded from Amazon S3. * * Stream context options: * * - "seekable": Set to true to create a seekable "r" (read only) stream by * using a php://temp stream buffer * - For "unlink" only: Any option that can be passed to the DeleteObject * operation */ class StreamWrapper { /** @var resource|null Stream context (this is set by PHP) */ public $context; /** @var StreamInterface Underlying stream resource */ private $body; /** @var int Size of the body that is opened */ private $size; /** @var array Hash of opened stream parameters */ private $params = []; /** @var string Mode in which the stream was opened */ private $mode; /** @var \Iterator Iterator used with opendir() related calls */ private $objectIterator; /** @var string The bucket that was opened when opendir() was called */ private $openedBucket; /** @var string The prefix of the bucket that was opened with opendir() */ private $openedBucketPrefix; /** @var string Opened bucket path */ private $openedPath; /** @var CacheInterface Cache for object and dir lookups */ private $cache; /** @var string The opened protocol (e.g., "s3") */ private $protocol = 's3'; /** @var bool Keeps track of whether stream has been flushed since opening */ private $isFlushed = \false; /** @var bool Whether or not to use V2 bucket and object existence methods */ private static $useV2Existence = \false; /** * Register the 's3://' stream wrapper * * @param S3ClientInterface $client Client to use with the stream wrapper * @param string $protocol Protocol to register as. * @param CacheInterface $cache Default cache for the protocol. */ public static function register(S3ClientInterface $client, $protocol = 's3', CacheInterface $cache = null, $v2Existence = \false) { self::$useV2Existence = $v2Existence; if (\in_array($protocol, \stream_get_wrappers())) { \stream_wrapper_unregister($protocol); } // Set the client passed in as the default stream context client \stream_wrapper_register($protocol, \get_called_class(), \STREAM_IS_URL); $default = \stream_context_get_options(\stream_context_get_default()); $default[$protocol]['client'] = $client; if ($cache) { $default[$protocol]['cache'] = $cache; } elseif (!isset($default[$protocol]['cache'])) { // Set a default cache adapter. $default[$protocol]['cache'] = new LruArrayCache(); } \stream_context_set_default($default); } public function stream_close() { if (!$this->isFlushed && empty($this->body->getSize()) && $this->mode !== 'r') { $this->stream_flush(); } $this->body = $this->cache = null; } public function stream_open($path, $mode, $options, &$opened_path) { $this->initProtocol($path); $this->isFlushed = \false; $this->params = $this->getBucketKey($path); $this->mode = \rtrim($mode, 'bt'); if ($errors = $this->validate($path, $this->mode)) { return $this->triggerError($errors); } return $this->boolCall(function () { switch ($this->mode) { case 'r': return $this->openReadStream(); case 'a': return $this->openAppendStream(); default: return $this->openWriteStream(); } }); } public function stream_eof() { return $this->body->eof(); } public function stream_flush() { // Check if stream body size has been // calculated via a flush or close if ($this->body->getSize() === null && $this->mode !== 'r') { return $this->triggerError("Unable to determine stream size. Did you forget to close or flush the stream?"); } $this->isFlushed = \true; if ($this->mode == 'r') { return \false; } if ($this->body->isSeekable()) { $this->body->seek(0); } $params = $this->getOptions(\true); $params['Body'] = $this->body; // Attempt to guess the ContentType of the upload based on the // file extension of the key if (!isset($params['ContentType']) && ($type = Psr7\MimeType::fromFilename($params['Key']))) { $params['ContentType'] = $type; } $this->clearCacheKey("{$this->protocol}://{$params['Bucket']}/{$params['Key']}"); return $this->boolCall(function () use($params) { return (bool) $this->getClient()->putObject($params); }); } public function stream_read($count) { return $this->body->read($count); } public function stream_seek($offset, $whence = \SEEK_SET) { return !$this->body->isSeekable() ? \false : $this->boolCall(function () use($offset, $whence) { $this->body->seek($offset, $whence); return \true; }); } public function stream_tell() { return $this->boolCall(function () { return $this->body->tell(); }); } public function stream_write($data) { return $this->body->write($data); } public function unlink($path) { $this->initProtocol($path); return $this->boolCall(function () use($path) { $this->clearCacheKey($path); $this->getClient()->deleteObject($this->withPath($path)); return \true; }); } public function stream_stat() { $stat = $this->getStatTemplate(); $stat[7] = $stat['size'] = $this->getSize(); $stat[2] = $stat['mode'] = $this->mode; return $stat; } /** * Provides information for is_dir, is_file, filesize, etc. Works on * buckets, keys, and prefixes. * @link http://www.php.net/manual/en/streamwrapper.url-stat.php */ public function url_stat($path, $flags) { $this->initProtocol($path); // Some paths come through as S3:// for some reason. $split = \explode('://', $path); $path = \strtolower($split[0]) . '://' . $split[1]; // Check if this path is in the url_stat cache if ($value = $this->getCacheStorage()->get($path)) { return $value; } $stat = $this->createStat($path, $flags); if (\is_array($stat)) { $this->getCacheStorage()->set($path, $stat); } return $stat; } /** * Parse the protocol out of the given path. * * @param $path */ private function initProtocol($path) { $parts = \explode('://', $path, 2); $this->protocol = $parts[0] ?: 's3'; } private function createStat($path, $flags) { $this->initProtocol($path); $parts = $this->withPath($path); if (!$parts['Key']) { return $this->statDirectory($parts, $path, $flags); } return $this->boolCall(function () use($parts, $path) { try { $result = $this->getClient()->headObject($parts); if (\substr($parts['Key'], -1, 1) == '/' && $result['ContentLength'] == 0) { // Return as if it is a bucket to account for console // bucket objects (e.g., zero-byte object "foo/") return $this->formatUrlStat($path); } // Attempt to stat and cache regular object return $this->formatUrlStat($result->toArray()); } catch (S3Exception $e) { // Maybe this isn't an actual key, but a prefix. Do a prefix // listing of objects to determine. $result = $this->getClient()->listObjects(['Bucket' => $parts['Bucket'], 'Prefix' => \rtrim($parts['Key'], '/') . '/', 'MaxKeys' => 1]); if (!$result['Contents'] && !$result['CommonPrefixes']) { throw new \Exception("File or directory not found: {$path}"); } return $this->formatUrlStat($path); } }, $flags); } private function statDirectory($parts, $path, $flags) { // Stat "directories": buckets, or "s3://" $method = self::$useV2Existence ? 'doesBucketExistV2' : 'doesBucketExist'; if (!$parts['Bucket'] || $this->getClient()->{$method}($parts['Bucket'])) { return $this->formatUrlStat($path); } return $this->triggerError("File or directory not found: {$path}", $flags); } /** * Support for mkdir(). * * @param string $path Directory which should be created. * @param int $mode Permissions. 700-range permissions map to * ACL_PUBLIC. 600-range permissions map to * ACL_AUTH_READ. All other permissions map to * ACL_PRIVATE. Expects octal form. * @param int $options A bitwise mask of values, such as * STREAM_MKDIR_RECURSIVE. * * @return bool * @link http://www.php.net/manual/en/streamwrapper.mkdir.php */ public function mkdir($path, $mode, $options) { $this->initProtocol($path); $params = $this->withPath($path); $this->clearCacheKey($path); if (!$params['Bucket']) { return \false; } if (!isset($params['ACL'])) { $params['ACL'] = $this->determineAcl($mode); } return empty($params['Key']) ? $this->createBucket($path, $params) : $this->createSubfolder($path, $params); } public function rmdir($path, $options) { $this->initProtocol($path); $this->clearCacheKey($path); $params = $this->withPath($path); $client = $this->getClient(); if (!$params['Bucket']) { return $this->triggerError('You must specify a bucket'); } return $this->boolCall(function () use($params, $path, $client) { if (!$params['Key']) { $client->deleteBucket(['Bucket' => $params['Bucket']]); return \true; } return $this->deleteSubfolder($path, $params); }); } /** * Support for opendir(). * * The opendir() method of the Amazon S3 stream wrapper supports a stream * context option of "listFilter". listFilter must be a callable that * accepts an associative array of object data and returns true if the * object should be yielded when iterating the keys in a bucket. * * @param string $path The path to the directory * (e.g. "s3://dir[]") * @param string $options Unused option variable * * @return bool true on success * @see http://www.php.net/manual/en/function.opendir.php */ public function dir_opendir($path, $options) { $this->initProtocol($path); $this->openedPath = $path; $params = $this->withPath($path); $delimiter = $this->getOption('delimiter'); /** @var callable $filterFn */ $filterFn = $this->getOption('listFilter'); $op = ['Bucket' => $params['Bucket']]; $this->openedBucket = $params['Bucket']; if ($delimiter === null) { $delimiter = '/'; } if ($delimiter) { $op['Delimiter'] = $delimiter; } if ($params['Key']) { $params['Key'] = \rtrim($params['Key'], $delimiter) . $delimiter; $op['Prefix'] = $params['Key']; } $this->openedBucketPrefix = $params['Key']; // Filter our "/" keys added by the console as directories, and ensure // that if a filter function is provided that it passes the filter. $this->objectIterator = \VendorDuplicator\Aws\flatmap($this->getClient()->getPaginator('ListObjects', $op), function (Result $result) use($filterFn) { $contentsAndPrefixes = $result->search('[Contents[], CommonPrefixes[]][]'); // Filter out dir place holder keys and use the filter fn. return \array_filter($contentsAndPrefixes, function ($key) use($filterFn) { return (!$filterFn || \call_user_func($filterFn, $key)) && (!isset($key['Key']) || \substr($key['Key'], -1, 1) !== '/'); }); }); return \true; } /** * Close the directory listing handles * * @return bool true on success */ public function dir_closedir() { $this->objectIterator = null; \gc_collect_cycles(); return \true; } /** * This method is called in response to rewinddir() * * @return boolean true on success */ public function dir_rewinddir() { return $this->boolCall(function () { $this->objectIterator = null; $this->dir_opendir($this->openedPath, null); return \true; }); } /** * This method is called in response to readdir() * * @return string Should return a string representing the next filename, or * false if there is no next file. * @link http://www.php.net/manual/en/function.readdir.php */ public function dir_readdir() { // Skip empty result keys if (!$this->objectIterator->valid()) { return \false; } // First we need to create a cache key. This key is the full path to // then object in s3: protocol://bucket/key. // Next we need to create a result value. The result value is the // current value of the iterator without the opened bucket prefix to // emulate how readdir() works on directories. // The cache key and result value will depend on if this is a prefix // or a key. $cur = $this->objectIterator->current(); if (isset($cur['Prefix'])) { // Include "directories". Be sure to strip a trailing "/" // on prefixes. $result = \rtrim($cur['Prefix'], '/'); $key = $this->formatKey($result); $stat = $this->formatUrlStat($key); } else { $result = $cur['Key']; $key = $this->formatKey($cur['Key']); $stat = $this->formatUrlStat($cur); } // Cache the object data for quick url_stat lookups used with // RecursiveDirectoryIterator. $this->getCacheStorage()->set($key, $stat); $this->objectIterator->next(); // Remove the prefix from the result to emulate other stream wrappers. return $this->openedBucketPrefix ? \substr($result, \strlen($this->openedBucketPrefix)) : $result; } private function formatKey($key) { $protocol = \explode('://', $this->openedPath)[0]; return "{$protocol}://{$this->openedBucket}/{$key}"; } /** * Called in response to rename() to rename a file or directory. Currently * only supports renaming objects. * * @param string $path_from the path to the file to rename * @param string $path_to the new path to the file * * @return bool true if file was successfully renamed * @link http://www.php.net/manual/en/function.rename.php */ public function rename($path_from, $path_to) { // PHP will not allow rename across wrapper types, so we can safely // assume $path_from and $path_to have the same protocol $this->initProtocol($path_from); $partsFrom = $this->withPath($path_from); $partsTo = $this->withPath($path_to); $this->clearCacheKey($path_from); $this->clearCacheKey($path_to); if (!$partsFrom['Key'] || !$partsTo['Key']) { return $this->triggerError('The Amazon S3 stream wrapper only ' . 'supports copying objects'); } return $this->boolCall(function () use($partsFrom, $partsTo) { $options = $this->getOptions(\true); // Copy the object and allow overriding default parameters if // desired, but by default copy metadata $this->getClient()->copy($partsFrom['Bucket'], $partsFrom['Key'], $partsTo['Bucket'], $partsTo['Key'], isset($options['acl']) ? $options['acl'] : 'private', $options); // Delete the original object $this->getClient()->deleteObject(['Bucket' => $partsFrom['Bucket'], 'Key' => $partsFrom['Key']] + $options); return \true; }); } public function stream_cast($cast_as) { return \false; } /** * Validates the provided stream arguments for fopen and returns an array * of errors. */ private function validate($path, $mode) { $errors = []; if (!$this->getOption('Key')) { $errors[] = 'Cannot open a bucket. You must specify a path in the ' . 'form of s3://bucket/key'; } if (!\in_array($mode, ['r', 'w', 'a', 'x'])) { $errors[] = "Mode not supported: {$mode}. " . "Use one 'r', 'w', 'a', or 'x'."; } if ($mode === 'x') { $method = self::$useV2Existence ? 'doesObjectExistV2' : 'doesObjectExist'; if ($this->getClient()->{$method}($this->getOption('Bucket'), $this->getOption('Key'), $this->getOptions(\true))) { $errors[] = "{$path} already exists on Amazon S3"; } } return $errors; } /** * Get the stream context options available to the current stream * * @param bool $removeContextData Set to true to remove contextual kvp's * like 'client' from the result. * * @return array */ private function getOptions($removeContextData = \false) { // Context is not set when doing things like stat if ($this->context === null) { $options = []; } else { $options = \stream_context_get_options($this->context); $options = isset($options[$this->protocol]) ? $options[$this->protocol] : []; } $default = \stream_context_get_options(\stream_context_get_default()); $default = isset($default[$this->protocol]) ? $default[$this->protocol] : []; $result = $this->params + $options + $default; if ($removeContextData) { unset($result['client'], $result['seekable'], $result['cache']); } return $result; } /** * Get a specific stream context option * * @param string $name Name of the option to retrieve * * @return mixed|null */ private function getOption($name) { $options = $this->getOptions(); return isset($options[$name]) ? $options[$name] : null; } /** * Gets the client from the stream context * * @return S3ClientInterface * @throws \RuntimeException if no client has been configured */ private function getClient() { if (!($client = $this->getOption('client'))) { throw new \RuntimeException('No client in stream context'); } return $client; } private function getBucketKey($path) { // Remove the protocol $parts = \explode('://', $path); // Get the bucket, key $parts = \explode('/', $parts[1], 2); return ['Bucket' => $parts[0], 'Key' => isset($parts[1]) ? $parts[1] : null]; } /** * Get the bucket and key from the passed path (e.g. s3://bucket/key) * * @param string $path Path passed to the stream wrapper * * @return array Hash of 'Bucket', 'Key', and custom params from the context */ private function withPath($path) { $params = $this->getOptions(\true); return $this->getBucketKey($path) + $params; } private function openReadStream() { $client = $this->getClient(); $command = $client->getCommand('GetObject', $this->getOptions(\true)); $command['@http']['stream'] = \true; $result = $client->execute($command); $this->size = $result['ContentLength']; $this->body = $result['Body']; // Wrap the body in a caching entity body if seeking is allowed if ($this->getOption('seekable') && !$this->body->isSeekable()) { $this->body = new CachingStream($this->body); } return \true; } private function openWriteStream() { $this->body = new Stream(\fopen('php://temp', 'r+')); return \true; } private function openAppendStream() { try { // Get the body of the object and seek to the end of the stream $client = $this->getClient(); $this->body = $client->getObject($this->getOptions(\true))['Body']; $this->body->seek(0, \SEEK_END); return \true; } catch (S3Exception $e) { // The object does not exist, so use a simple write stream return $this->openWriteStream(); } } /** * Trigger one or more errors * * @param string|array $errors Errors to trigger * @param mixed $flags If set to STREAM_URL_STAT_QUIET, then no * error or exception occurs * * @return bool Returns false * @throws \RuntimeException if throw_errors is true */ private function triggerError($errors, $flags = null) { // This is triggered with things like file_exists() if ($flags & \STREAM_URL_STAT_QUIET) { return $flags & \STREAM_URL_STAT_LINK ? $this->formatUrlStat(\false) : \false; } // This is triggered when doing things like lstat() or stat() \trigger_error(\implode("\n", (array) $errors), \E_USER_WARNING); return \false; } /** * Prepare a url_stat result array * * @param string|array $result Data to add * * @return array Returns the modified url_stat result */ private function formatUrlStat($result = null) { $stat = $this->getStatTemplate(); switch (\gettype($result)) { case 'NULL': case 'string': // Directory with 0777 access - see "man 2 stat". $stat['mode'] = $stat[2] = 040777; break; case 'array': // Regular file with 0777 access - see "man 2 stat". $stat['mode'] = $stat[2] = 0100777; // Pluck the content-length if available. if (isset($result['ContentLength'])) { $stat['size'] = $stat[7] = $result['ContentLength']; } elseif (isset($result['Size'])) { $stat['size'] = $stat[7] = $result['Size']; } if (isset($result['LastModified'])) { // ListObjects or HeadObject result $stat['mtime'] = $stat[9] = $stat['ctime'] = $stat[10] = \strtotime($result['LastModified']); } } return $stat; } /** * Creates a bucket for the given parameters. * * @param string $path Stream wrapper path * @param array $params A result of StreamWrapper::withPath() * * @return bool Returns true on success or false on failure */ private function createBucket($path, array $params) { $method = self::$useV2Existence ? 'doesBucketExistV2' : 'doesBucketExist'; if ($this->getClient()->{$method}($params['Bucket'])) { return $this->triggerError("Bucket already exists: {$path}"); } unset($params['ACL']); return $this->boolCall(function () use($params, $path) { $this->getClient()->createBucket($params); $this->clearCacheKey($path); return \true; }); } /** * Creates a pseudo-folder by creating an empty "/" suffixed key * * @param string $path Stream wrapper path * @param array $params A result of StreamWrapper::withPath() * * @return bool */ private function createSubfolder($path, array $params) { // Ensure the path ends in "/" and the body is empty. $params['Key'] = \rtrim($params['Key'], '/') . '/'; $params['Body'] = ''; // Fail if this pseudo directory key already exists $method = self::$useV2Existence ? 'doesObjectExistV2' : 'doesObjectExist'; if ($this->getClient()->{$method}($params['Bucket'], $params['Key'])) { return $this->triggerError("Subfolder already exists: {$path}"); } return $this->boolCall(function () use($params, $path) { $this->getClient()->putObject($params); $this->clearCacheKey($path); return \true; }); } /** * Deletes a nested subfolder if it is empty. * * @param string $path Path that is being deleted (e.g., 's3://a/b/c') * @param array $params A result of StreamWrapper::withPath() * * @return bool */ private function deleteSubfolder($path, $params) { // Use a key that adds a trailing slash if needed. $prefix = \rtrim($params['Key'], '/') . '/'; $result = $this->getClient()->listObjects(['Bucket' => $params['Bucket'], 'Prefix' => $prefix, 'MaxKeys' => 1]); // Check if the bucket contains keys other than the placeholder if ($contents = $result['Contents']) { return \count($contents) > 1 || $contents[0]['Key'] != $prefix ? $this->triggerError('Subfolder is not empty') : $this->unlink(\rtrim($path, '/') . '/'); } return $result['CommonPrefixes'] ? $this->triggerError('Subfolder contains nested folders') : \true; } /** * Determine the most appropriate ACL based on a file mode. * * @param int $mode File mode * * @return string */ private function determineAcl($mode) { switch (\substr(\decoct($mode), 0, 1)) { case '7': return 'public-read'; case '6': return 'authenticated-read'; default: return 'private'; } } /** * Gets a URL stat template with default values * * @return array */ private function getStatTemplate() { return [0 => 0, 'dev' => 0, 1 => 0, 'ino' => 0, 2 => 0, 'mode' => 0, 3 => 0, 'nlink' => 0, 4 => 0, 'uid' => 0, 5 => 0, 'gid' => 0, 6 => -1, 'rdev' => -1, 7 => 0, 'size' => 0, 8 => 0, 'atime' => 0, 9 => 0, 'mtime' => 0, 10 => 0, 'ctime' => 0, 11 => -1, 'blksize' => -1, 12 => -1, 'blocks' => -1]; } /** * Invokes a callable and triggers an error if an exception occurs while * calling the function. * * @param callable $fn * @param int $flags * * @return bool */ private function boolCall(callable $fn, $flags = null) { try { return $fn(); } catch (\Exception $e) { return $this->triggerError($e->getMessage(), $flags); } } /** * @return LruArrayCache */ private function getCacheStorage() { if (!$this->cache) { $this->cache = $this->getOption('cache') ?: new LruArrayCache(); } return $this->cache; } /** * Clears a specific stat cache value from the stat cache and LRU cache. * * @param string $key S3 path (s3://bucket/key). */ private function clearCacheKey($key) { \clearstatcache(\true, $key); $this->getCacheStorage()->remove($key); } /** * Returns the size of the opened object body. * * @return int|null */ private function getSize() { $size = $this->body->getSize(); return !empty($size) ? $size : $this->size; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/ObjectCopier.php000064400000012521147600374260022755 0ustar00 null, 'before_upload' => null, 'concurrency' => 5, 'mup_threshold' => self::DEFAULT_MULTIPART_THRESHOLD, 'params' => [], 'part_size' => null, 'version_id' => null]; /** * @param S3ClientInterface $client The S3 Client used to execute * the copy command(s). * @param array $source The object to copy, specified as * an array with a 'Bucket' and * 'Key' keys. Provide a * 'VersionID' key to copy a * specified version of an object. * @param array $destination The bucket and key to which to * copy the $source, specified as * an array with a 'Bucket' and * 'Key' keys. * @param string $acl ACL to apply to the copy * (default: private). * @param array $options Options used to configure the * copy process. Options passed in * through 'params' are added to * the sub commands. * * @throws InvalidArgumentException */ public function __construct(S3ClientInterface $client, array $source, array $destination, $acl = 'private', array $options = []) { $this->validateLocation($source); $this->validateLocation($destination); $this->client = $client; $this->source = $source; $this->destination = $destination; $this->acl = $acl; $this->options = $options + self::$defaults; } /** * Perform the configured copy asynchronously. Returns a promise that is * fulfilled with the result of the CompleteMultipartUpload or CopyObject * operation or rejected with an exception. * * @return Coroutine */ public function promise() { return Coroutine::of(function () { $headObjectCommand = $this->client->getCommand('HeadObject', $this->options['params'] + $this->source); if (\is_callable($this->options['before_lookup'])) { $this->options['before_lookup']($headObjectCommand); } $objectStats = (yield $this->client->executeAsync($headObjectCommand)); if ($objectStats['ContentLength'] > $this->options['mup_threshold']) { $mup = new MultipartCopy($this->client, $this->getSourcePath(), ['source_metadata' => $objectStats, 'acl' => $this->acl] + $this->destination + $this->options); (yield $mup->promise()); } else { $defaults = ['ACL' => $this->acl, 'MetadataDirective' => 'COPY', 'CopySource' => $this->getSourcePath()]; $params = \array_diff_key($this->options, self::$defaults) + $this->destination + $defaults + $this->options['params']; (yield $this->client->executeAsync($this->client->getCommand('CopyObject', $params))); } }); } /** * Perform the configured copy synchronously. Returns the result of the * CompleteMultipartUpload or CopyObject operation. * * @return Result * * @throws S3Exception * @throws MultipartUploadException */ public function copy() { return $this->promise()->wait(); } private function validateLocation(array $location) { if (empty($location['Bucket']) || empty($location['Key'])) { throw new \InvalidArgumentException('Locations provided to an' . ' Aws\\S3\\ObjectCopier must have a non-empty Bucket and Key'); } } private function getSourcePath() { $path = "/{$this->source['Bucket']}/"; if (ArnParser::isArn($this->source['Bucket'])) { try { new AccessPointArn($this->source['Bucket']); $path = "{$this->source['Bucket']}/object/"; } catch (\Exception $e) { throw new \InvalidArgumentException('Provided ARN was a not a valid S3 access point ARN (' . $e->getMessage() . ')', 0, $e); } } $sourcePath = $path . \rawurlencode($this->source['Key']); if (isset($this->source['VersionId'])) { $sourcePath .= "?versionId={$this->source['VersionId']}"; } return $sourcePath; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/S3/ValidateResponseChecksumParser.php000064400000011457147600374260026524 0ustar00api = $api; $this->parser = $parser; } public function __invoke(CommandInterface $command, ResponseInterface $response) { $fn = $this->parser; $result = $fn($command, $response); //Skip this middleware if the operation doesn't have an httpChecksum $op = $this->api->getOperation($command->getName()); $checksumInfo = isset($op['httpChecksum']) ? $op['httpChecksum'] : []; if (empty($checksumInfo)) { return $result; } //Skip this middleware if the operation doesn't send back a checksum, or the user doesn't opt in $checksumModeEnabledMember = isset($checksumInfo['requestValidationModeMember']) ? $checksumInfo['requestValidationModeMember'] : ""; $checksumModeEnabled = isset($command[$checksumModeEnabledMember]) ? $command[$checksumModeEnabledMember] : ""; $responseAlgorithms = isset($checksumInfo['responseAlgorithms']) ? $checksumInfo['responseAlgorithms'] : []; if (empty($responseAlgorithms) || \strtolower($checksumModeEnabled) !== "enabled") { return $result; } if (\extension_loaded('awscrt')) { $checksumPriority = ['CRC32C', 'CRC32', 'SHA1', 'SHA256']; } else { $checksumPriority = ['CRC32', 'SHA1', 'SHA256']; } $checksumsToCheck = \array_intersect($responseAlgorithms, $checksumPriority); $checksumValidationInfo = $this->validateChecksum($checksumsToCheck, $response); if ($checksumValidationInfo['status'] == "SUCCEEDED") { $result['ChecksumValidated'] = $checksumValidationInfo['checksum']; } else { if ($checksumValidationInfo['status'] == "FAILED") { //Ignore failed validations on GetObject if it's a multipart get which returned a full multipart object if ($command->getName() == "GetObject" && !empty($checksumValidationInfo['checksumHeaderValue'])) { $headerValue = $checksumValidationInfo['checksumHeaderValue']; $lastDashPos = \strrpos($headerValue, '-'); $endOfChecksum = \substr($headerValue, $lastDashPos + 1); if (\is_numeric($endOfChecksum) && \intval($endOfChecksum) > 1 && \intval($endOfChecksum) < 10000) { return $result; } } throw new S3Exception("Calculated response checksum did not match the expected value", $command); } } return $result; } public function parseMemberFromStream(StreamInterface $stream, StructureShape $member, $response) { return $this->parser->parseMemberFromStream($stream, $member, $response); } /** * @param $checksumPriority * @param ResponseInterface $response */ public function validateChecksum($checksumPriority, ResponseInterface $response) { $checksumToValidate = $this->chooseChecksumHeaderToValidate($checksumPriority, $response); $validationStatus = "SKIPPED"; $checksumHeaderValue = null; if (!empty($checksumToValidate)) { $checksumHeaderValue = $response->getHeader('x-amz-checksum-' . $checksumToValidate); if (isset($checksumHeaderValue)) { $checksumHeaderValue = $checksumHeaderValue[0]; $calculatedChecksumValue = $this->getEncodedValue($checksumToValidate, $response->getBody()); $validationStatus = $checksumHeaderValue == $calculatedChecksumValue ? "SUCCEEDED" : "FAILED"; } } return ["status" => $validationStatus, "checksum" => $checksumToValidate, "checksumHeaderValue" => $checksumHeaderValue]; } /** * @param $checksumPriority * @param ResponseInterface $response */ public function chooseChecksumHeaderToValidate($checksumPriority, ResponseInterface $response) { foreach ($checksumPriority as $checksum) { $checksumHeader = 'x-amz-checksum-' . $checksum; if ($response->hasHeader($checksumHeader)) { return $checksum; } } return null; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Signature/AnonymousSignature.php000064400000001231147600374260025727 0ustar00hasHeader('x-amz-content-sha256')) { $request = $request->withHeader('x-amz-content-sha256', $this->getPayload($request)); } $useCrt = \strpos($request->getUri()->getHost(), "accesspoint.s3-global") !== \false; if (!$useCrt) { if (\strpos($request->getUri()->getHost(), "s3-object-lambda")) { return parent::signRequest($request, $credentials, "s3-object-lambda"); } return parent::signRequest($request, $credentials); } $signingService = $signingService ?: 's3'; return $this->signWithV4a($credentials, $request, $signingService); } /** * Always add a x-amz-content-sha-256 for data integrity. * * {@inheritdoc} */ public function presign(RequestInterface $request, CredentialsInterface $credentials, $expires, array $options = []) { if (!$request->hasHeader('x-amz-content-sha256')) { $request = $request->withHeader('X-Amz-Content-Sha256', $this->getPresignedPayload($request)); } if (\strpos($request->getUri()->getHost(), "accesspoint.s3-global")) { $request = $request->withHeader("x-amz-region-set", "*"); } return parent::presign($request, $credentials, $expires, $options); } /** * Override used to allow pre-signed URLs to be created for an * in-determinate request payload. */ protected function getPresignedPayload(RequestInterface $request) { return SignatureV4::UNSIGNED_PAYLOAD; } /** * Amazon S3 does not double-encode the path component in the canonical request */ protected function createCanonicalizedPath($path) { // Only remove one slash in case of keys that have a preceding slash if (\substr($path, 0, 1) === '/') { $path = \substr($path, 1); } return '/' . $path; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Signature/SignatureTrait.php000064400000002244147600374260025027 0ustar00cache[$k])) { // Clear the cache when it reaches 50 entries if (++$this->cacheSize > 50) { $this->cache = []; $this->cacheSize = 0; } $dateKey = \hash_hmac('sha256', $shortDate, "AWS4{$secretKey}", \true); $regionKey = \hash_hmac('sha256', $region, $dateKey, \true); $serviceKey = \hash_hmac('sha256', $service, $regionKey, \true); $this->cache[$k] = \hash_hmac('sha256', 'aws4_request', $serviceKey, \true); } return $this->cache[$k]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Signature/SignatureV4.php000064400000043613147600374260024242 0ustar00 \true, 'content-type' => \true, 'content-length' => \true, 'expect' => \true, 'max-forwards' => \true, 'pragma' => \true, 'range' => \true, 'te' => \true, 'if-match' => \true, 'if-none-match' => \true, 'if-modified-since' => \true, 'if-unmodified-since' => \true, 'if-range' => \true, 'accept' => \true, 'authorization' => \true, 'proxy-authorization' => \true, 'from' => \true, 'referer' => \true, 'user-agent' => \true, 'X-Amz-User-Agent' => \true, 'x-amzn-trace-id' => \true, 'aws-sdk-invocation-id' => \true, 'aws-sdk-retry' => \true]; } /** * @param string $service Service name to use when signing * @param string $region Region name to use when signing * @param array $options Array of configuration options used when signing * - unsigned-body: Flag to make request have unsigned payload. * Unsigned body is used primarily for streaming requests. */ public function __construct($service, $region, array $options = []) { $this->service = $service; $this->region = $region; $this->unsigned = isset($options['unsigned-body']) ? $options['unsigned-body'] : \false; $this->useV4a = isset($options['use_v4a']) && $options['use_v4a'] === \true; } /** * {@inheritdoc} */ public function signRequest(RequestInterface $request, CredentialsInterface $credentials, $signingService = null) { $ldt = \gmdate(self::ISO8601_BASIC); $sdt = \substr($ldt, 0, 8); $parsed = $this->parseRequest($request); $parsed['headers']['X-Amz-Date'] = [$ldt]; if ($token = $credentials->getSecurityToken()) { $parsed['headers']['X-Amz-Security-Token'] = [$token]; } $service = isset($signingService) ? $signingService : $this->service; if ($this->useV4a) { return $this->signWithV4a($credentials, $request, $service); } $cs = $this->createScope($sdt, $this->region, $service); $payload = $this->getPayload($request); if ($payload == self::UNSIGNED_PAYLOAD) { $parsed['headers'][self::AMZ_CONTENT_SHA256_HEADER] = [$payload]; } $context = $this->createContext($parsed, $payload); $toSign = $this->createStringToSign($ldt, $cs, $context['creq']); $signingKey = $this->getSigningKey($sdt, $this->region, $service, $credentials->getSecretKey()); $signature = \hash_hmac('sha256', $toSign, $signingKey); $parsed['headers']['Authorization'] = ["AWS4-HMAC-SHA256 " . "Credential={$credentials->getAccessKeyId()}/{$cs}, " . "SignedHeaders={$context['headers']}, Signature={$signature}"]; return $this->buildRequest($parsed); } /** * Get the headers that were used to pre-sign the request. * Used for the X-Amz-SignedHeaders header. * * @param array $headers * @return array */ private function getPresignHeaders(array $headers) { $presignHeaders = []; $blacklist = $this->getHeaderBlacklist(); foreach ($headers as $name => $value) { $lName = \strtolower($name); if (!isset($blacklist[$lName]) && $name !== self::AMZ_CONTENT_SHA256_HEADER) { $presignHeaders[] = $lName; } } return $presignHeaders; } /** * {@inheritdoc} */ public function presign(RequestInterface $request, CredentialsInterface $credentials, $expires, array $options = []) { $startTimestamp = isset($options['start_time']) ? $this->convertToTimestamp($options['start_time'], null) : \time(); $expiresTimestamp = $this->convertToTimestamp($expires, $startTimestamp); if ($this->useV4a) { return $this->presignWithV4a($request, $credentials, $this->convertExpires($expiresTimestamp, $startTimestamp)); } $parsed = $this->createPresignedRequest($request, $credentials); $payload = $this->getPresignedPayload($request); $httpDate = \gmdate(self::ISO8601_BASIC, $startTimestamp); $shortDate = \substr($httpDate, 0, 8); $scope = $this->createScope($shortDate, $this->region, $this->service); $credential = $credentials->getAccessKeyId() . '/' . $scope; if ($credentials->getSecurityToken()) { unset($parsed['headers']['X-Amz-Security-Token']); } $parsed['query']['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'; $parsed['query']['X-Amz-Credential'] = $credential; $parsed['query']['X-Amz-Date'] = \gmdate('Ymd\\THis\\Z', $startTimestamp); $parsed['query']['X-Amz-SignedHeaders'] = \implode(';', $this->getPresignHeaders($parsed['headers'])); $parsed['query']['X-Amz-Expires'] = $this->convertExpires($expiresTimestamp, $startTimestamp); $context = $this->createContext($parsed, $payload); $stringToSign = $this->createStringToSign($httpDate, $scope, $context['creq']); $key = $this->getSigningKey($shortDate, $this->region, $this->service, $credentials->getSecretKey()); $parsed['query']['X-Amz-Signature'] = \hash_hmac('sha256', $stringToSign, $key); return $this->buildRequest($parsed); } /** * Converts a POST request to a GET request by moving POST fields into the * query string. * * Useful for pre-signing query protocol requests. * * @param RequestInterface $request Request to clone * * @return RequestInterface * @throws \InvalidArgumentException if the method is not POST */ public static function convertPostToGet(RequestInterface $request, $additionalQueryParams = "") { if ($request->getMethod() !== 'POST') { throw new \InvalidArgumentException('Expected a POST request but ' . 'received a ' . $request->getMethod() . ' request.'); } $sr = $request->withMethod('GET')->withBody(Psr7\Utils::streamFor(''))->withoutHeader('Content-Type')->withoutHeader('Content-Length'); // Move POST fields to the query if they are present if ($request->getHeaderLine('Content-Type') === 'application/x-www-form-urlencoded') { $body = (string) $request->getBody() . $additionalQueryParams; $sr = $sr->withUri($sr->getUri()->withQuery($body)); } return $sr; } protected function getPayload(RequestInterface $request) { if ($this->unsigned && $request->getUri()->getScheme() == 'https') { return self::UNSIGNED_PAYLOAD; } // Calculate the request signature payload if ($request->hasHeader(self::AMZ_CONTENT_SHA256_HEADER)) { // Handle streaming operations (e.g. Glacier.UploadArchive) return $request->getHeaderLine(self::AMZ_CONTENT_SHA256_HEADER); } if (!$request->getBody()->isSeekable()) { throw new CouldNotCreateChecksumException('sha256'); } try { return Psr7\Utils::hash($request->getBody(), 'sha256'); } catch (\Exception $e) { throw new CouldNotCreateChecksumException('sha256', $e); } } protected function getPresignedPayload(RequestInterface $request) { return $this->getPayload($request); } protected function createCanonicalizedPath($path) { $doubleEncoded = \rawurlencode(\ltrim($path, '/')); return '/' . \str_replace('%2F', '/', $doubleEncoded); } private function createStringToSign($longDate, $credentialScope, $creq) { $hash = \hash('sha256', $creq); return "AWS4-HMAC-SHA256\n{$longDate}\n{$credentialScope}\n{$hash}"; } private function createPresignedRequest(RequestInterface $request, CredentialsInterface $credentials) { $parsedRequest = $this->parseRequest($request); // Make sure to handle temporary credentials if ($token = $credentials->getSecurityToken()) { $parsedRequest['headers']['X-Amz-Security-Token'] = [$token]; } return $this->moveHeadersToQuery($parsedRequest); } /** * @param array $parsedRequest * @param string $payload Hash of the request payload * @return array Returns an array of context information */ private function createContext(array $parsedRequest, $payload) { $blacklist = $this->getHeaderBlacklist(); // Normalize the path as required by SigV4 $canon = $parsedRequest['method'] . "\n" . $this->createCanonicalizedPath($parsedRequest['path']) . "\n" . $this->getCanonicalizedQuery($parsedRequest['query']) . "\n"; // Case-insensitively aggregate all of the headers. $aggregate = []; foreach ($parsedRequest['headers'] as $key => $values) { $key = \strtolower($key); if (!isset($blacklist[$key])) { foreach ($values as $v) { $aggregate[$key][] = $v; } } } \ksort($aggregate); $canonHeaders = []; foreach ($aggregate as $k => $v) { if (\count($v) > 0) { \sort($v); } $canonHeaders[] = $k . ':' . \preg_replace('/\\s+/', ' ', \implode(',', $v)); } $signedHeadersString = \implode(';', \array_keys($aggregate)); $canon .= \implode("\n", $canonHeaders) . "\n\n" . $signedHeadersString . "\n" . $payload; return ['creq' => $canon, 'headers' => $signedHeadersString]; } private function getCanonicalizedQuery(array $query) { unset($query['X-Amz-Signature']); if (!$query) { return ''; } $qs = ''; \ksort($query); foreach ($query as $k => $v) { if (!\is_array($v)) { $qs .= \rawurlencode($k) . '=' . \rawurlencode($v !== null ? $v : '') . '&'; } else { \sort($v); foreach ($v as $value) { $qs .= \rawurlencode($k) . '=' . \rawurlencode($value !== null ? $value : '') . '&'; } } } return \substr($qs, 0, -1); } private function convertToTimestamp($dateValue, $relativeTimeBase = null) { if ($dateValue instanceof \DateTimeInterface) { $timestamp = $dateValue->getTimestamp(); } elseif (!\is_numeric($dateValue)) { $timestamp = \strtotime($dateValue, $relativeTimeBase === null ? \time() : $relativeTimeBase); } else { $timestamp = $dateValue; } return $timestamp; } private function convertExpires($expiresTimestamp, $startTimestamp) { $duration = $expiresTimestamp - $startTimestamp; // Ensure that the duration of the signature is not longer than a week if ($duration > 604800) { throw new \InvalidArgumentException('The expiration date of a ' . 'signature version 4 presigned URL must be less than one ' . 'week'); } return $duration; } private function moveHeadersToQuery(array $parsedRequest) { //x-amz-user-agent shouldn't be put in a query param unset($parsedRequest['headers']['X-Amz-User-Agent']); foreach ($parsedRequest['headers'] as $name => $header) { $lname = \strtolower($name); if (\substr($lname, 0, 5) == 'x-amz') { $parsedRequest['query'][$name] = $header; } $blacklist = $this->getHeaderBlacklist(); if (isset($blacklist[$lname]) || $lname === \strtolower(self::AMZ_CONTENT_SHA256_HEADER)) { unset($parsedRequest['headers'][$name]); } } return $parsedRequest; } private function parseRequest(RequestInterface $request) { // Clean up any previously set headers. /** @var RequestInterface $request */ $request = $request->withoutHeader('X-Amz-Date')->withoutHeader('Date')->withoutHeader('Authorization'); $uri = $request->getUri(); return ['method' => $request->getMethod(), 'path' => $uri->getPath(), 'query' => Psr7\Query::parse($uri->getQuery()), 'uri' => $uri, 'headers' => $request->getHeaders(), 'body' => $request->getBody(), 'version' => $request->getProtocolVersion()]; } private function buildRequest(array $req) { if ($req['query']) { $req['uri'] = $req['uri']->withQuery(Psr7\Query::build($req['query'])); } return new Psr7\Request($req['method'], $req['uri'], $req['headers'], $req['body'], $req['version']); } private function verifyCRTLoaded() { if (!\extension_loaded('awscrt')) { throw new CommonRuntimeException("AWS Common Runtime for PHP is required to use Signature V4A" . ". Please install it using the instructions found at" . " https://github.com/aws/aws-sdk-php/blob/master/CRT_INSTRUCTIONS.md"); } } private function createCRTStaticCredentialsProvider($credentials) { return new StaticCredentialsProvider(['access_key_id' => $credentials->getAccessKeyId(), 'secret_access_key' => $credentials->getSecretKey(), 'session_token' => $credentials->getSecurityToken()]); } private function removeIllegalV4aHeaders(&$request) { $illegalV4aHeaders = [self::AMZ_CONTENT_SHA256_HEADER, "aws-sdk-invocation-id", "aws-sdk-retry", 'x-amz-region-set']; $storedHeaders = []; foreach ($illegalV4aHeaders as $header) { if ($request->hasHeader($header)) { $storedHeaders[$header] = $request->getHeader($header); $request = $request->withoutHeader($header); } } return $storedHeaders; } private function CRTRequestFromGuzzleRequest($request) { return new Request( $request->getMethod(), (string) $request->getUri(), [], //leave empty as the query is parsed from the uri object \array_map(function ($header) { return $header[0]; }, $request->getHeaders()) ); } /** * @param CredentialsInterface $credentials * @param RequestInterface $request * @param $signingService * @return RequestInterface */ protected function signWithV4a(CredentialsInterface $credentials, RequestInterface $request, $signingService) { $this->verifyCRTLoaded(); $credentials_provider = $this->createCRTStaticCredentialsProvider($credentials); $signingConfig = new SigningConfigAWS(['algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC, 'signature_type' => SignatureType::HTTP_REQUEST_HEADERS, 'credentials_provider' => $credentials_provider, 'signed_body_value' => $this->getPayload($request), 'region' => "*", 'service' => $signingService, 'date' => \time()]); $removedIllegalHeaders = $this->removeIllegalV4aHeaders($request); $http_request = $this->CRTRequestFromGuzzleRequest($request); Signing::signRequestAws(Signable::fromHttpRequest($http_request), $signingConfig, function ($signing_result, $error_code) use(&$http_request) { $signing_result->applyToHttpRequest($http_request); }); foreach ($removedIllegalHeaders as $header => $value) { $request = $request->withHeader($header, $value); } $sigV4AHeaders = $http_request->headers(); foreach ($sigV4AHeaders->toArray() as $h => $v) { $request = $request->withHeader($h, $v); } return $request; } protected function presignWithV4a(RequestInterface $request, CredentialsInterface $credentials, $expires) { $this->verifyCRTLoaded(); $credentials_provider = $this->createCRTStaticCredentialsProvider($credentials); $signingConfig = new SigningConfigAWS(['algorithm' => SigningAlgorithm::SIGv4_ASYMMETRIC, 'signature_type' => SignatureType::HTTP_REQUEST_QUERY_PARAMS, 'credentials_provider' => $credentials_provider, 'signed_body_value' => $this->getPresignedPayload($request), 'region' => "*", 'service' => $this->service, 'date' => \time(), 'expiration_in_seconds' => $expires]); $this->removeIllegalV4aHeaders($request); foreach ($this->getHeaderBlacklist() as $headerName => $headerValue) { if ($request->hasHeader($headerName)) { $request = $request->withoutHeader($headerName); } } $http_request = $this->CRTRequestFromGuzzleRequest($request); Signing::signRequestAws(Signable::fromHttpRequest($http_request), $signingConfig, function ($signing_result, $error_code) use(&$http_request) { $signing_result->applyToHttpRequest($http_request); }); return $request->withUri(new Psr7\Uri($http_request->pathAndQuery())); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Signature/SignatureProvider.php000064400000011530147600374260025534 0ustar00 \true, 's3control' => \true, 's3-object-lambda' => \true]; /** * Resolves and signature provider and ensures a non-null return value. * * @param callable $provider Provider function to invoke. * @param string $version Signature version. * @param string $service Service name. * @param string $region Region name. * * @return SignatureInterface * @throws UnresolvedSignatureException */ public static function resolve(callable $provider, $version, $service, $region) { $result = $provider($version, $service, $region); if ($result instanceof SignatureInterface || $result instanceof BearerTokenAuthorization) { return $result; } throw new UnresolvedSignatureException("Unable to resolve a signature for {$version}/{$service}/{$region}.\n" . "Valid signature versions include v4 and anonymous."); } /** * Default SDK signature provider. * * @return callable */ public static function defaultProvider() { return self::memoize(self::version()); } /** * Creates a signature provider that caches previously created signature * objects. The computed cache key is the concatenation of the version, * service, and region. * * @param callable $provider Signature provider to wrap. * * @return callable */ public static function memoize(callable $provider) { $cache = []; return function ($version, $service, $region) use(&$cache, $provider) { $key = "({$version})({$service})({$region})"; if (!isset($cache[$key])) { $cache[$key] = $provider($version, $service, $region); } return $cache[$key]; }; } /** * Creates signature objects from known signature versions. * * This provider currently recognizes the following signature versions: * * - v4: Signature version 4. * - anonymous: Does not sign requests. * * @return callable */ public static function version() { return function ($version, $service, $region) { switch ($version) { case 's3v4': case 'v4': return !empty(self::$s3v4SignedServices[$service]) ? new S3SignatureV4($service, $region) : new SignatureV4($service, $region); case 'v4a': return !empty(self::$s3v4SignedServices[$service]) ? new S3SignatureV4($service, $region, ['use_v4a' => \true]) : new SignatureV4($service, $region, ['use_v4a' => \true]); case 'v4-unsigned-body': return !empty(self::$s3v4SignedServices[$service]) ? new S3SignatureV4($service, $region, ['unsigned-body' => 'true']) : new SignatureV4($service, $region, ['unsigned-body' => 'true']); case 'bearer': return new BearerTokenAuthorization(); case 'anonymous': return new AnonymousSignature(); default: return null; } }; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Signature/SignatureInterface.php000064400000002604147600374260025644 0ustar00getToken())) { throw new InvalidArgumentException("Cannot authorize a request with an empty token"); } $accessToken = $token->getToken(); return $request->withHeader('Authorization', "Bearer {$accessToken}"); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Token/Token.php000064400000004132147600374260022257 0ustar00token = $token; $this->expires = $expires; } /** * Sets the state of a token object * * @param array $state array containing 'token' and 'expires' */ public static function __set_state(array $state) { return new self($state['token'], $state['expires']); } /** * @return string */ public function getToken() { return $this->token; } /** * @return int */ public function getExpiration() { return $this->expires; } /** * @return bool */ public function isExpired() { return $this->expires !== null && \time() >= $this->expires; } /** * @return array */ public function toArray() { return ['token' => $this->token, 'expires' => $this->expires]; } /** * @return string */ public function serialize() { return \json_encode($this->__serialize()); } /** * Sets the state of the object from serialized json data */ public function unserialize($serialized) { $data = \json_decode($serialized, \true); $this->__unserialize($data); } /** * @return array */ public function __serialize() { return $this->toArray(); } /** * Sets the state of this object from an array */ public function __unserialize($data) { $this->token = $data['token']; $this->expires = $data['expires']; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Token/TokenAuthorization.php000064400000001221147600374260025034 0ustar00 $profile) { // standardize config profile names $name = \str_replace('profile ', '', $name); $profileData[$name] = $profile; } return $profileData; } /** * Gets the environment's HOME directory if available. * * @return null|string */ private static function getHomeDir() { // On Linux/Unix-like systems, use the HOME environment variable if ($homeDir = \getenv('HOME')) { return $homeDir; } // Get the HOMEDRIVE and HOMEPATH values for Windows hosts $homeDrive = \getenv('HOMEDRIVE'); $homePath = \getenv('HOMEPATH'); return $homeDrive && $homePath ? $homeDrive . $homePath : null; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Token/RefreshableTokenProviderInterface.php000064400000000670147600374260027761 0ustar00 * use Aws\Token\TokenProvider; * $provider = TokenProvider::defaultProvider(); * // Returns a TokenInterface or throws. * $token = $provider()->wait(); * * * Token providers can be composed to create a token using conditional * logic that can create different tokens in different environments. You * can compose multiple providers into a single provider using * {@see Aws\Token\TokenProvider::chain}. This function accepts * providers as variadic arguments and returns a new function that will invoke * each provider until a token is successfully returned. */ class TokenProvider { use ParsesIniTrait; const ENV_PROFILE = 'AWS_PROFILE'; /** * Create a default token provider tha checks for cached a SSO token from * the CLI * * This provider is automatically wrapped in a memoize function that caches * previously provided tokens. * * @param array $config Optional array of token provider options. * * @return callable */ public static function defaultProvider(array $config = []) { $cacheable = ['sso']; $defaultChain = []; if (!isset($config['use_aws_shared_config_files']) || $config['use_aws_shared_config_files'] !== \false) { $profileName = \getenv(self::ENV_PROFILE) ?: 'default'; $defaultChain['sso'] = self::sso($profileName, self::getHomeDir() . '/.aws/config', $config); } if (isset($config['token']) && $config['token'] instanceof CacheInterface) { foreach ($cacheable as $provider) { if (isset($defaultChain[$provider])) { $defaultChain[$provider] = self::cache($defaultChain[$provider], $config['token'], 'aws_cached_' . $provider . '_token'); } } } return self::memoize(\call_user_func_array([TokenProvider::class, 'chain'], \array_values($defaultChain))); } /** * Create a token provider function from a static token. * * @param TokenInterface $token * * @return callable */ public static function fromToken(TokenInterface $token) { $promise = Promise\Create::promiseFor($token); return function () use($promise) { return $promise; }; } /** * Creates an aggregate token provider that invokes the provided * variadic providers one after the other until a provider returns * a token. * * @return callable */ public static function chain() { $links = \func_get_args(); //Common use case for when aws_shared_config_files is false if (empty($links)) { return function () { return Promise\Create::promiseFor(\false); }; } return function () use($links) { /** @var callable $parent */ $parent = \array_shift($links); $promise = $parent(); while ($next = \array_shift($links)) { $promise = $promise->otherwise($next); } return $promise; }; } /** * Wraps a token provider and caches a previously provided token. * Ensures that cached tokens are refreshed when they expire. * * @param callable $provider Token provider function to wrap. * @return callable */ public static function memoize(callable $provider) { return function () use($provider) { static $result; static $isConstant; // Constant tokens will be returned constantly. if ($isConstant) { return $result; } // Create the initial promise that will be used as the cached value // until it expires. if (null === $result) { $result = $provider(); } // Return a token that could expire and refresh when needed. return $result->then(function (TokenInterface $token) use($provider, &$isConstant, &$result) { // Determine if the token is constant. if (!$token->getExpiration()) { $isConstant = \true; return $token; } if (!$token->isExpired()) { return $token; } return $result = $provider(); })->otherwise(function ($reason) use(&$result) { // Cleanup rejected promise. $result = null; return Promise\Create::promiseFor(null); }); }; } /** * Wraps a token provider and saves provided token in an * instance of Aws\CacheInterface. Forwards calls when no token found * in cache and updates cache with the results. * * @param callable $provider Token provider function to wrap * @param CacheInterface $cache Cache to store the token * @param string|null $cacheKey (optional) Cache key to use * * @return callable */ public static function cache(callable $provider, CacheInterface $cache, $cacheKey = null) { $cacheKey = $cacheKey ?: 'aws_cached_token'; return function () use($provider, $cache, $cacheKey) { $found = $cache->get($cacheKey); if (\is_array($found) && isset($found['token'])) { if (isset($found['token']) && $found['token'] instanceof TokenInterface) { $foundToken = $found['token']; if (!$foundToken->isExpired()) { return Promise\Create::promiseFor($foundToken); } if (isset($found['refreshMethod']) && \is_callable($found['refreshMethod'])) { return Promise\Create::promiseFor($found['refreshMethod']()); } } } return $provider()->then(function (TokenInterface $token) use($cache, $cacheKey) { $cache->set($cacheKey, $token, null === $token->getExpiration() ? 0 : $token->getExpiration() - \time()); return $token; }); }; } /** * Gets profiles from the ~/.aws/config ini file */ private static function loadDefaultProfiles() { $profiles = []; $configFile = self::getHomeDir() . '/.aws/config'; if (\file_exists($configFile)) { $configProfileData = \VendorDuplicator\Aws\parse_ini_file($configFile, \true, \INI_SCANNER_RAW); foreach ($configProfileData as $name => $profile) { // standardize config profile names $name = \str_replace('profile ', '', $name); if (!isset($profiles[$name])) { $profiles[$name] = $profile; } } } return $profiles; } private static function reject($msg) { return new Promise\RejectedPromise(new TokenException($msg)); } /** * Token provider that creates a token from cached sso credentials * * @param string $ssoProfileName the name of the ini profile name * @param string $filename the location of the ini file * @param array $config configuration options * * @return SsoToken * @see Aws\Token\SsoToken for $config details. */ public static function sso($profileName, $filename, $config = []) { return new SsoTokenProvider($profileName, $filename, $config); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Token/SsoTokenProvider.php000064400000016032147600374260024461 0ustar00ssoProfileName = !empty($ssoProfileName) ? $ssoProfileName : $profileName; $this->filename = !empty($filename) ? $filename : self::getHomeDir() . '/.aws/config'; $this->ssoOidcClient = $ssoOidcClient; } /* * Loads cached sso credentials * * @return PromiseInterface */ public function __invoke() { return Promise\Coroutine::of(function () { if (!@\is_readable($this->filename)) { throw new TokenException("Cannot read profiles from {$this->filename}"); } $profiles = self::loadProfiles($this->filename); if (!isset($profiles[$this->ssoProfileName])) { throw new TokenException("Profile {$this->ssoProfileName} does not exist in {$this->filename}."); } $ssoProfile = $profiles[$this->ssoProfileName]; if (empty($ssoProfile['sso_session'])) { throw new TokenException("Profile {$this->ssoProfileName} in {$this->filename} must contain an sso_session."); } $sessionProfileName = 'sso-session ' . $ssoProfile['sso_session']; if (empty($profiles[$sessionProfileName])) { throw new TokenException("Profile {$this->ssoProfileName} does not exist in {$this->filename}"); } $sessionProfileData = $profiles[$sessionProfileName]; if (empty($sessionProfileData['sso_start_url']) || empty($sessionProfileData['sso_region'])) { throw new TokenException("Profile {$this->ssoProfileName} in {$this->filename} must contain the following keys: " . "sso_start_url and sso_region."); } $tokenLocation = self::getTokenLocation($ssoProfile['sso_session']); if (!@\is_readable($tokenLocation)) { throw new TokenException("Unable to read token file at {$tokenLocation}"); } $tokenData = $this->getTokenData($tokenLocation); $this->validateTokenData($tokenLocation, $tokenData); (yield new SsoToken($tokenData['accessToken'], $tokenData['expiresAt'], isset($tokenData['refreshToken']) ? $tokenData['refreshToken'] : null, isset($tokenData['clientId']) ? $tokenData['clientId'] : null, isset($tokenData['clientSecret']) ? $tokenData['clientSecret'] : null, isset($tokenData['registrationExpiresAt']) ? $tokenData['registrationExpiresAt'] : null, isset($tokenData['region']) ? $tokenData['region'] : null, isset($tokenData['startUrl']) ? $tokenData['startUrl'] : null)); }); } /** * Refreshes the token * @return mixed|null */ public function refresh() { try { //try to reload from disk $token = $this(); if ($token instanceof SsoToken && !$token->shouldAttemptRefresh()) { return $token; } } finally { //if reload from disk fails, try refreshing $tokenLocation = self::getTokenLocation($this->ssoProfileName); $tokenData = $this->getTokenData($tokenLocation); if (empty($this->ssoOidcClient) || empty($tokenData['startUrl'])) { throw new TokenException("Cannot refresh this token without an 'ssooidcClient' " . "and a 'start_url'"); } $response = $this->ssoOidcClient->createToken([ 'clientId' => $tokenData['clientId'], 'clientSecret' => $tokenData['clientSecret'], 'grantType' => 'refresh_token', // REQUIRED 'refreshToken' => $tokenData['refreshToken'], ]); if ($response['@metadata']['statusCode'] == 200) { $tokenData['accessToken'] = $response['accessToken']; $tokenData['expiresAt'] = \time() + $response['expiresIn']; $tokenData['refreshToken'] = $response['refreshToken']; $token = new SsoToken($tokenData['accessToken'], $tokenData['expiresAt'], $tokenData['refreshToken'], isset($tokenData['clientId']) ? $tokenData['clientId'] : null, isset($tokenData['clientSecret']) ? $tokenData['clientSecret'] : null, isset($tokenData['registrationExpiresAt']) ? $tokenData['registrationExpiresAt'] : null, isset($tokenData['region']) ? $tokenData['region'] : null, isset($tokenData['startUrl']) ? $tokenData['startUrl'] : null); $this->writeNewTokenDataToDisk($tokenData, $tokenLocation); return $token; } } } public function shouldAttemptRefresh() { $tokenLocation = self::getTokenLocation($this->ssoProfileName); $tokenData = $this->getTokenData($tokenLocation); return \strtotime("-10 minutes") >= \strtotime($tokenData['expiresAt']); } /** * @param $sso_session * @return string */ public static function getTokenLocation($sso_session) { return self::getHomeDir() . '/.aws/sso/cache/' . \mb_convert_encoding(\sha1($sso_session), "UTF-8") . ".json"; } /** * @param $tokenLocation * @return array */ function getTokenData($tokenLocation) { return \json_decode(\file_get_contents($tokenLocation), \true); } /** * @param $tokenData * @param $tokenLocation * @return mixed */ private function validateTokenData($tokenLocation, $tokenData) { if (empty($tokenData['accessToken']) || empty($tokenData['expiresAt'])) { throw new TokenException("Token file at {$tokenLocation} must contain an access token and an expiration"); } $expiration = \strtotime($tokenData['expiresAt']); if ($expiration === \false) { throw new TokenException("Cached SSO token returned an invalid expiration"); } elseif ($expiration < \time()) { throw new TokenException("Cached SSO token returned an expired token"); } return $tokenData; } /** * @param array $tokenData * @param string $tokenLocation * @return void */ private function writeNewTokenDataToDisk(array $tokenData, $tokenLocation) { $tokenData['expiresAt'] = \gmdate('Y-m-d\\TH:i:s\\Z', $tokenData['expiresAt']); \file_put_contents($tokenLocation, \json_encode(\array_filter($tokenData))); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Token/SsoToken.php000064400000005266147600374260022755 0ustar00refreshToken = $refreshToken; $this->clientId = $clientId; $this->clientSecret = $clientSecret; $this->registrationExpiresAt = $registrationExpiresAt; $this->region = $region; $this->startUrl = $startUrl; } /** * @return bool */ public function isExpired() { if (isset($this->registrationExpiresAt) && \time() >= $this->registrationExpiresAt) { return \false; } return $this->expires !== null && \time() >= $this->expires; } /** * @return string|null */ public function getRefreshToken() { return $this->refreshToken; } /** * @return string|null */ public function getClientId() { return $this->clientId; } /** * @return string|null */ public function getClientSecret() { return $this->clientSecret; } /** * @return int|null */ public function getRegistrationExpiresAt() { return $this->registrationExpiresAt; } /** * @return string|null */ public function getRegion() { return $this->region; } /** * @return string|null */ public function getStartUrl() { return $this->startUrl; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/api-2.json.php000064400000606754147600374260024304 0ustar00 '2.0', 'metadata' => ['apiVersion' => '2006-03-01', 'checksumFormat' => 'md5', 'endpointPrefix' => 's3', 'globalEndpoint' => 's3.amazonaws.com', 'protocol' => 'rest-xml', 'serviceAbbreviation' => 'Amazon S3', 'serviceFullName' => 'Amazon Simple Storage Service', 'serviceId' => 'S3', 'signatureVersion' => 's3', 'uid' => 's3-2006-03-01'], 'operations' => ['AbortMultipartUpload' => ['name' => 'AbortMultipartUpload', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}', 'responseCode' => 204], 'input' => ['shape' => 'AbortMultipartUploadRequest'], 'output' => ['shape' => 'AbortMultipartUploadOutput'], 'errors' => [['shape' => 'NoSuchUpload']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadAbort.html'], 'CompleteMultipartUpload' => ['name' => 'CompleteMultipartUpload', 'http' => ['method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'CompleteMultipartUploadRequest'], 'output' => ['shape' => 'CompleteMultipartUploadOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadComplete.html'], 'CopyObject' => ['name' => 'CopyObject', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'CopyObjectRequest'], 'output' => ['shape' => 'CopyObjectOutput'], 'errors' => [['shape' => 'ObjectNotInActiveTierError']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectCOPY.html', 'alias' => 'PutObjectCopy'], 'CreateBucket' => ['name' => 'CreateBucket', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}'], 'input' => ['shape' => 'CreateBucketRequest'], 'output' => ['shape' => 'CreateBucketOutput'], 'errors' => [['shape' => 'BucketAlreadyExists'], ['shape' => 'BucketAlreadyOwnedByYou']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUT.html', 'alias' => 'PutBucket', 'staticContextParams' => ['DisableAccessPoints' => ['value' => \true]]], 'CreateMultipartUpload' => ['name' => 'CreateMultipartUpload', 'http' => ['method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?uploads'], 'input' => ['shape' => 'CreateMultipartUploadRequest'], 'output' => ['shape' => 'CreateMultipartUploadOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadInitiate.html', 'alias' => 'InitiateMultipartUpload'], 'DeleteBucket' => ['name' => 'DeleteBucket', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETE.html'], 'DeleteBucketAnalyticsConfiguration' => ['name' => 'DeleteBucketAnalyticsConfiguration', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?analytics', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketAnalyticsConfigurationRequest']], 'DeleteBucketCors' => ['name' => 'DeleteBucketCors', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?cors', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketCorsRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETEcors.html'], 'DeleteBucketEncryption' => ['name' => 'DeleteBucketEncryption', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?encryption', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketEncryptionRequest']], 'DeleteBucketIntelligentTieringConfiguration' => ['name' => 'DeleteBucketIntelligentTieringConfiguration', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?intelligent-tiering', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketIntelligentTieringConfigurationRequest']], 'DeleteBucketInventoryConfiguration' => ['name' => 'DeleteBucketInventoryConfiguration', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?inventory', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketInventoryConfigurationRequest']], 'DeleteBucketLifecycle' => ['name' => 'DeleteBucketLifecycle', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?lifecycle', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketLifecycleRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETElifecycle.html'], 'DeleteBucketMetricsConfiguration' => ['name' => 'DeleteBucketMetricsConfiguration', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?metrics', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketMetricsConfigurationRequest']], 'DeleteBucketOwnershipControls' => ['name' => 'DeleteBucketOwnershipControls', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?ownershipControls', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketOwnershipControlsRequest']], 'DeleteBucketPolicy' => ['name' => 'DeleteBucketPolicy', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?policy', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketPolicyRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETEpolicy.html'], 'DeleteBucketReplication' => ['name' => 'DeleteBucketReplication', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?replication', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketReplicationRequest']], 'DeleteBucketTagging' => ['name' => 'DeleteBucketTagging', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?tagging', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketTaggingRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETEtagging.html'], 'DeleteBucketWebsite' => ['name' => 'DeleteBucketWebsite', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?website', 'responseCode' => 204], 'input' => ['shape' => 'DeleteBucketWebsiteRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketDELETEwebsite.html'], 'DeleteObject' => ['name' => 'DeleteObject', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}', 'responseCode' => 204], 'input' => ['shape' => 'DeleteObjectRequest'], 'output' => ['shape' => 'DeleteObjectOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectDELETE.html'], 'DeleteObjectTagging' => ['name' => 'DeleteObjectTagging', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}/{Key+}?tagging', 'responseCode' => 204], 'input' => ['shape' => 'DeleteObjectTaggingRequest'], 'output' => ['shape' => 'DeleteObjectTaggingOutput']], 'DeleteObjects' => ['name' => 'DeleteObjects', 'http' => ['method' => 'POST', 'requestUri' => '/{Bucket}?delete'], 'input' => ['shape' => 'DeleteObjectsRequest'], 'output' => ['shape' => 'DeleteObjectsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/multiobjectdeleteapi.html', 'alias' => 'DeleteMultipleObjects', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'DeletePublicAccessBlock' => ['name' => 'DeletePublicAccessBlock', 'http' => ['method' => 'DELETE', 'requestUri' => '/{Bucket}?publicAccessBlock', 'responseCode' => 204], 'input' => ['shape' => 'DeletePublicAccessBlockRequest']], 'GetBucketAccelerateConfiguration' => ['name' => 'GetBucketAccelerateConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?accelerate'], 'input' => ['shape' => 'GetBucketAccelerateConfigurationRequest'], 'output' => ['shape' => 'GetBucketAccelerateConfigurationOutput']], 'GetBucketAcl' => ['name' => 'GetBucketAcl', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?acl'], 'input' => ['shape' => 'GetBucketAclRequest'], 'output' => ['shape' => 'GetBucketAclOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETacl.html'], 'GetBucketAnalyticsConfiguration' => ['name' => 'GetBucketAnalyticsConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?analytics'], 'input' => ['shape' => 'GetBucketAnalyticsConfigurationRequest'], 'output' => ['shape' => 'GetBucketAnalyticsConfigurationOutput']], 'GetBucketCors' => ['name' => 'GetBucketCors', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?cors'], 'input' => ['shape' => 'GetBucketCorsRequest'], 'output' => ['shape' => 'GetBucketCorsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETcors.html'], 'GetBucketEncryption' => ['name' => 'GetBucketEncryption', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?encryption'], 'input' => ['shape' => 'GetBucketEncryptionRequest'], 'output' => ['shape' => 'GetBucketEncryptionOutput']], 'GetBucketIntelligentTieringConfiguration' => ['name' => 'GetBucketIntelligentTieringConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?intelligent-tiering'], 'input' => ['shape' => 'GetBucketIntelligentTieringConfigurationRequest'], 'output' => ['shape' => 'GetBucketIntelligentTieringConfigurationOutput']], 'GetBucketInventoryConfiguration' => ['name' => 'GetBucketInventoryConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?inventory'], 'input' => ['shape' => 'GetBucketInventoryConfigurationRequest'], 'output' => ['shape' => 'GetBucketInventoryConfigurationOutput']], 'GetBucketLifecycle' => ['name' => 'GetBucketLifecycle', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?lifecycle'], 'input' => ['shape' => 'GetBucketLifecycleRequest'], 'output' => ['shape' => 'GetBucketLifecycleOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETlifecycle.html', 'deprecated' => \true], 'GetBucketLifecycleConfiguration' => ['name' => 'GetBucketLifecycleConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?lifecycle'], 'input' => ['shape' => 'GetBucketLifecycleConfigurationRequest'], 'output' => ['shape' => 'GetBucketLifecycleConfigurationOutput']], 'GetBucketLocation' => ['name' => 'GetBucketLocation', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?location'], 'input' => ['shape' => 'GetBucketLocationRequest'], 'output' => ['shape' => 'GetBucketLocationOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETlocation.html'], 'GetBucketLogging' => ['name' => 'GetBucketLogging', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?logging'], 'input' => ['shape' => 'GetBucketLoggingRequest'], 'output' => ['shape' => 'GetBucketLoggingOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETlogging.html'], 'GetBucketMetricsConfiguration' => ['name' => 'GetBucketMetricsConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?metrics'], 'input' => ['shape' => 'GetBucketMetricsConfigurationRequest'], 'output' => ['shape' => 'GetBucketMetricsConfigurationOutput']], 'GetBucketNotification' => ['name' => 'GetBucketNotification', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?notification'], 'input' => ['shape' => 'GetBucketNotificationConfigurationRequest'], 'output' => ['shape' => 'NotificationConfigurationDeprecated'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETnotification.html', 'deprecated' => \true], 'GetBucketNotificationConfiguration' => ['name' => 'GetBucketNotificationConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?notification'], 'input' => ['shape' => 'GetBucketNotificationConfigurationRequest'], 'output' => ['shape' => 'NotificationConfiguration']], 'GetBucketOwnershipControls' => ['name' => 'GetBucketOwnershipControls', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?ownershipControls'], 'input' => ['shape' => 'GetBucketOwnershipControlsRequest'], 'output' => ['shape' => 'GetBucketOwnershipControlsOutput']], 'GetBucketPolicy' => ['name' => 'GetBucketPolicy', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?policy'], 'input' => ['shape' => 'GetBucketPolicyRequest'], 'output' => ['shape' => 'GetBucketPolicyOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETpolicy.html'], 'GetBucketPolicyStatus' => ['name' => 'GetBucketPolicyStatus', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?policyStatus'], 'input' => ['shape' => 'GetBucketPolicyStatusRequest'], 'output' => ['shape' => 'GetBucketPolicyStatusOutput']], 'GetBucketReplication' => ['name' => 'GetBucketReplication', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?replication'], 'input' => ['shape' => 'GetBucketReplicationRequest'], 'output' => ['shape' => 'GetBucketReplicationOutput']], 'GetBucketRequestPayment' => ['name' => 'GetBucketRequestPayment', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?requestPayment'], 'input' => ['shape' => 'GetBucketRequestPaymentRequest'], 'output' => ['shape' => 'GetBucketRequestPaymentOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTrequestPaymentGET.html'], 'GetBucketTagging' => ['name' => 'GetBucketTagging', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?tagging'], 'input' => ['shape' => 'GetBucketTaggingRequest'], 'output' => ['shape' => 'GetBucketTaggingOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETtagging.html'], 'GetBucketVersioning' => ['name' => 'GetBucketVersioning', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?versioning'], 'input' => ['shape' => 'GetBucketVersioningRequest'], 'output' => ['shape' => 'GetBucketVersioningOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETversioningStatus.html'], 'GetBucketWebsite' => ['name' => 'GetBucketWebsite', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?website'], 'input' => ['shape' => 'GetBucketWebsiteRequest'], 'output' => ['shape' => 'GetBucketWebsiteOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETwebsite.html'], 'GetObject' => ['name' => 'GetObject', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'GetObjectRequest'], 'output' => ['shape' => 'GetObjectOutput'], 'errors' => [['shape' => 'NoSuchKey'], ['shape' => 'InvalidObjectState']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html', 'httpChecksum' => ['requestValidationModeMember' => 'ChecksumMode', 'responseAlgorithms' => ['CRC32', 'CRC32C', 'SHA256', 'SHA1']]], 'GetObjectAcl' => ['name' => 'GetObjectAcl', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?acl'], 'input' => ['shape' => 'GetObjectAclRequest'], 'output' => ['shape' => 'GetObjectAclOutput'], 'errors' => [['shape' => 'NoSuchKey']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGETacl.html'], 'GetObjectAttributes' => ['name' => 'GetObjectAttributes', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?attributes'], 'input' => ['shape' => 'GetObjectAttributesRequest'], 'output' => ['shape' => 'GetObjectAttributesOutput'], 'errors' => [['shape' => 'NoSuchKey']]], 'GetObjectLegalHold' => ['name' => 'GetObjectLegalHold', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?legal-hold'], 'input' => ['shape' => 'GetObjectLegalHoldRequest'], 'output' => ['shape' => 'GetObjectLegalHoldOutput']], 'GetObjectLockConfiguration' => ['name' => 'GetObjectLockConfiguration', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?object-lock'], 'input' => ['shape' => 'GetObjectLockConfigurationRequest'], 'output' => ['shape' => 'GetObjectLockConfigurationOutput']], 'GetObjectRetention' => ['name' => 'GetObjectRetention', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?retention'], 'input' => ['shape' => 'GetObjectRetentionRequest'], 'output' => ['shape' => 'GetObjectRetentionOutput']], 'GetObjectTagging' => ['name' => 'GetObjectTagging', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?tagging'], 'input' => ['shape' => 'GetObjectTaggingRequest'], 'output' => ['shape' => 'GetObjectTaggingOutput']], 'GetObjectTorrent' => ['name' => 'GetObjectTorrent', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}?torrent'], 'input' => ['shape' => 'GetObjectTorrentRequest'], 'output' => ['shape' => 'GetObjectTorrentOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGETtorrent.html'], 'GetPublicAccessBlock' => ['name' => 'GetPublicAccessBlock', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?publicAccessBlock'], 'input' => ['shape' => 'GetPublicAccessBlockRequest'], 'output' => ['shape' => 'GetPublicAccessBlockOutput']], 'HeadBucket' => ['name' => 'HeadBucket', 'http' => ['method' => 'HEAD', 'requestUri' => '/{Bucket}'], 'input' => ['shape' => 'HeadBucketRequest'], 'errors' => [['shape' => 'NoSuchBucket']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketHEAD.html'], 'HeadObject' => ['name' => 'HeadObject', 'http' => ['method' => 'HEAD', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'HeadObjectRequest'], 'output' => ['shape' => 'HeadObjectOutput'], 'errors' => [['shape' => 'NoSuchKey']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectHEAD.html'], 'ListBucketAnalyticsConfigurations' => ['name' => 'ListBucketAnalyticsConfigurations', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?analytics'], 'input' => ['shape' => 'ListBucketAnalyticsConfigurationsRequest'], 'output' => ['shape' => 'ListBucketAnalyticsConfigurationsOutput']], 'ListBucketIntelligentTieringConfigurations' => ['name' => 'ListBucketIntelligentTieringConfigurations', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?intelligent-tiering'], 'input' => ['shape' => 'ListBucketIntelligentTieringConfigurationsRequest'], 'output' => ['shape' => 'ListBucketIntelligentTieringConfigurationsOutput']], 'ListBucketInventoryConfigurations' => ['name' => 'ListBucketInventoryConfigurations', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?inventory'], 'input' => ['shape' => 'ListBucketInventoryConfigurationsRequest'], 'output' => ['shape' => 'ListBucketInventoryConfigurationsOutput']], 'ListBucketMetricsConfigurations' => ['name' => 'ListBucketMetricsConfigurations', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?metrics'], 'input' => ['shape' => 'ListBucketMetricsConfigurationsRequest'], 'output' => ['shape' => 'ListBucketMetricsConfigurationsOutput']], 'ListBuckets' => ['name' => 'ListBuckets', 'http' => ['method' => 'GET', 'requestUri' => '/'], 'output' => ['shape' => 'ListBucketsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTServiceGET.html', 'alias' => 'GetService'], 'ListMultipartUploads' => ['name' => 'ListMultipartUploads', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?uploads'], 'input' => ['shape' => 'ListMultipartUploadsRequest'], 'output' => ['shape' => 'ListMultipartUploadsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadListMPUpload.html'], 'ListObjectVersions' => ['name' => 'ListObjectVersions', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?versions'], 'input' => ['shape' => 'ListObjectVersionsRequest'], 'output' => ['shape' => 'ListObjectVersionsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGETVersion.html', 'alias' => 'GetBucketObjectVersions'], 'ListObjects' => ['name' => 'ListObjects', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}'], 'input' => ['shape' => 'ListObjectsRequest'], 'output' => ['shape' => 'ListObjectsOutput'], 'errors' => [['shape' => 'NoSuchBucket']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketGET.html', 'alias' => 'GetBucket'], 'ListObjectsV2' => ['name' => 'ListObjectsV2', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}?list-type=2'], 'input' => ['shape' => 'ListObjectsV2Request'], 'output' => ['shape' => 'ListObjectsV2Output'], 'errors' => [['shape' => 'NoSuchBucket']]], 'ListParts' => ['name' => 'ListParts', 'http' => ['method' => 'GET', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'ListPartsRequest'], 'output' => ['shape' => 'ListPartsOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadListParts.html'], 'PutBucketAccelerateConfiguration' => ['name' => 'PutBucketAccelerateConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?accelerate'], 'input' => ['shape' => 'PutBucketAccelerateConfigurationRequest'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \false]], 'PutBucketAcl' => ['name' => 'PutBucketAcl', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?acl'], 'input' => ['shape' => 'PutBucketAclRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTacl.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketAnalyticsConfiguration' => ['name' => 'PutBucketAnalyticsConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?analytics'], 'input' => ['shape' => 'PutBucketAnalyticsConfigurationRequest']], 'PutBucketCors' => ['name' => 'PutBucketCors', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?cors'], 'input' => ['shape' => 'PutBucketCorsRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTcors.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketEncryption' => ['name' => 'PutBucketEncryption', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?encryption'], 'input' => ['shape' => 'PutBucketEncryptionRequest'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketIntelligentTieringConfiguration' => ['name' => 'PutBucketIntelligentTieringConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?intelligent-tiering'], 'input' => ['shape' => 'PutBucketIntelligentTieringConfigurationRequest']], 'PutBucketInventoryConfiguration' => ['name' => 'PutBucketInventoryConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?inventory'], 'input' => ['shape' => 'PutBucketInventoryConfigurationRequest']], 'PutBucketLifecycle' => ['name' => 'PutBucketLifecycle', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?lifecycle'], 'input' => ['shape' => 'PutBucketLifecycleRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTlifecycle.html', 'deprecated' => \true, 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketLifecycleConfiguration' => ['name' => 'PutBucketLifecycleConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?lifecycle'], 'input' => ['shape' => 'PutBucketLifecycleConfigurationRequest'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketLogging' => ['name' => 'PutBucketLogging', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?logging'], 'input' => ['shape' => 'PutBucketLoggingRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTlogging.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketMetricsConfiguration' => ['name' => 'PutBucketMetricsConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?metrics'], 'input' => ['shape' => 'PutBucketMetricsConfigurationRequest']], 'PutBucketNotification' => ['name' => 'PutBucketNotification', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?notification'], 'input' => ['shape' => 'PutBucketNotificationRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTnotification.html', 'deprecated' => \true, 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketNotificationConfiguration' => ['name' => 'PutBucketNotificationConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?notification'], 'input' => ['shape' => 'PutBucketNotificationConfigurationRequest']], 'PutBucketOwnershipControls' => ['name' => 'PutBucketOwnershipControls', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?ownershipControls'], 'input' => ['shape' => 'PutBucketOwnershipControlsRequest'], 'httpChecksum' => ['requestChecksumRequired' => \true]], 'PutBucketPolicy' => ['name' => 'PutBucketPolicy', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?policy'], 'input' => ['shape' => 'PutBucketPolicyRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTpolicy.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketReplication' => ['name' => 'PutBucketReplication', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?replication'], 'input' => ['shape' => 'PutBucketReplicationRequest'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketRequestPayment' => ['name' => 'PutBucketRequestPayment', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?requestPayment'], 'input' => ['shape' => 'PutBucketRequestPaymentRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTrequestPaymentPUT.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketTagging' => ['name' => 'PutBucketTagging', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?tagging'], 'input' => ['shape' => 'PutBucketTaggingRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTtagging.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketVersioning' => ['name' => 'PutBucketVersioning', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?versioning'], 'input' => ['shape' => 'PutBucketVersioningRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutBucketWebsite' => ['name' => 'PutBucketWebsite', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?website'], 'input' => ['shape' => 'PutBucketWebsiteRequest'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTBucketPUTwebsite.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutObject' => ['name' => 'PutObject', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'PutObjectRequest'], 'output' => ['shape' => 'PutObjectOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUT.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \false]], 'PutObjectAcl' => ['name' => 'PutObjectAcl', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?acl'], 'input' => ['shape' => 'PutObjectAclRequest'], 'output' => ['shape' => 'PutObjectAclOutput'], 'errors' => [['shape' => 'NoSuchKey']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectPUTacl.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutObjectLegalHold' => ['name' => 'PutObjectLegalHold', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?legal-hold'], 'input' => ['shape' => 'PutObjectLegalHoldRequest'], 'output' => ['shape' => 'PutObjectLegalHoldOutput'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutObjectLockConfiguration' => ['name' => 'PutObjectLockConfiguration', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?object-lock'], 'input' => ['shape' => 'PutObjectLockConfigurationRequest'], 'output' => ['shape' => 'PutObjectLockConfigurationOutput'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutObjectRetention' => ['name' => 'PutObjectRetention', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?retention'], 'input' => ['shape' => 'PutObjectRetentionRequest'], 'output' => ['shape' => 'PutObjectRetentionOutput'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutObjectTagging' => ['name' => 'PutObjectTagging', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}?tagging'], 'input' => ['shape' => 'PutObjectTaggingRequest'], 'output' => ['shape' => 'PutObjectTaggingOutput'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'PutPublicAccessBlock' => ['name' => 'PutPublicAccessBlock', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}?publicAccessBlock'], 'input' => ['shape' => 'PutPublicAccessBlockRequest'], 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \true]], 'RestoreObject' => ['name' => 'RestoreObject', 'http' => ['method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?restore'], 'input' => ['shape' => 'RestoreObjectRequest'], 'output' => ['shape' => 'RestoreObjectOutput'], 'errors' => [['shape' => 'ObjectAlreadyInActiveTierError']], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectRestore.html', 'alias' => 'PostObjectRestore', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \false]], 'SelectObjectContent' => ['name' => 'SelectObjectContent', 'http' => ['method' => 'POST', 'requestUri' => '/{Bucket}/{Key+}?select&select-type=2'], 'input' => ['shape' => 'SelectObjectContentRequest', 'locationName' => 'SelectObjectContentRequest', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'output' => ['shape' => 'SelectObjectContentOutput']], 'UploadPart' => ['name' => 'UploadPart', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'UploadPartRequest'], 'output' => ['shape' => 'UploadPartOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPart.html', 'httpChecksum' => ['requestAlgorithmMember' => 'ChecksumAlgorithm', 'requestChecksumRequired' => \false]], 'UploadPartCopy' => ['name' => 'UploadPartCopy', 'http' => ['method' => 'PUT', 'requestUri' => '/{Bucket}/{Key+}'], 'input' => ['shape' => 'UploadPartCopyRequest'], 'output' => ['shape' => 'UploadPartCopyOutput'], 'documentationUrl' => 'http://docs.amazonwebservices.com/AmazonS3/latest/API/mpUploadUploadPartCopy.html'], 'WriteGetObjectResponse' => ['name' => 'WriteGetObjectResponse', 'http' => ['method' => 'POST', 'requestUri' => '/WriteGetObjectResponse'], 'input' => ['shape' => 'WriteGetObjectResponseRequest'], 'authtype' => 'v4-unsigned-body', 'endpoint' => ['hostPrefix' => '{RequestRoute}.'], 'staticContextParams' => ['UseObjectLambdaEndpoint' => ['value' => \true]]]], 'shapes' => ['AbortDate' => ['type' => 'timestamp'], 'AbortIncompleteMultipartUpload' => ['type' => 'structure', 'members' => ['DaysAfterInitiation' => ['shape' => 'DaysAfterInitiation']]], 'AbortMultipartUploadOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'AbortMultipartUploadRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'UploadId'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'UploadId' => ['shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'AbortRuleId' => ['type' => 'string'], 'AccelerateConfiguration' => ['type' => 'structure', 'members' => ['Status' => ['shape' => 'BucketAccelerateStatus']]], 'AcceptRanges' => ['type' => 'string'], 'AccessControlPolicy' => ['type' => 'structure', 'members' => ['Grants' => ['shape' => 'Grants', 'locationName' => 'AccessControlList'], 'Owner' => ['shape' => 'Owner']]], 'AccessControlTranslation' => ['type' => 'structure', 'required' => ['Owner'], 'members' => ['Owner' => ['shape' => 'OwnerOverride']]], 'AccessPointArn' => ['type' => 'string'], 'AccountId' => ['type' => 'string'], 'AllowQuotedRecordDelimiter' => ['type' => 'boolean'], 'AllowedHeader' => ['type' => 'string'], 'AllowedHeaders' => ['type' => 'list', 'member' => ['shape' => 'AllowedHeader'], 'flattened' => \true], 'AllowedMethod' => ['type' => 'string'], 'AllowedMethods' => ['type' => 'list', 'member' => ['shape' => 'AllowedMethod'], 'flattened' => \true], 'AllowedOrigin' => ['type' => 'string'], 'AllowedOrigins' => ['type' => 'list', 'member' => ['shape' => 'AllowedOrigin'], 'flattened' => \true], 'AnalyticsAndOperator' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tags' => ['shape' => 'TagSet', 'flattened' => \true, 'locationName' => 'Tag']]], 'AnalyticsConfiguration' => ['type' => 'structure', 'required' => ['Id', 'StorageClassAnalysis'], 'members' => ['Id' => ['shape' => 'AnalyticsId'], 'Filter' => ['shape' => 'AnalyticsFilter'], 'StorageClassAnalysis' => ['shape' => 'StorageClassAnalysis']]], 'AnalyticsConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'AnalyticsConfiguration'], 'flattened' => \true], 'AnalyticsExportDestination' => ['type' => 'structure', 'required' => ['S3BucketDestination'], 'members' => ['S3BucketDestination' => ['shape' => 'AnalyticsS3BucketDestination']]], 'AnalyticsFilter' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tag' => ['shape' => 'Tag'], 'And' => ['shape' => 'AnalyticsAndOperator']]], 'AnalyticsId' => ['type' => 'string'], 'AnalyticsS3BucketDestination' => ['type' => 'structure', 'required' => ['Format', 'Bucket'], 'members' => ['Format' => ['shape' => 'AnalyticsS3ExportFileFormat'], 'BucketAccountId' => ['shape' => 'AccountId'], 'Bucket' => ['shape' => 'BucketName'], 'Prefix' => ['shape' => 'Prefix']]], 'AnalyticsS3ExportFileFormat' => ['type' => 'string', 'enum' => ['CSV']], 'ArchiveStatus' => ['type' => 'string', 'enum' => ['ARCHIVE_ACCESS', 'DEEP_ARCHIVE_ACCESS']], 'Body' => ['type' => 'blob'], 'Bucket' => ['type' => 'structure', 'members' => ['Name' => ['shape' => 'BucketName'], 'CreationDate' => ['shape' => 'CreationDate']]], 'BucketAccelerateStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Suspended']], 'BucketAlreadyExists' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'BucketAlreadyOwnedByYou' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'BucketCannedACL' => ['type' => 'string', 'enum' => ['private', 'public-read', 'public-read-write', 'authenticated-read']], 'BucketKeyEnabled' => ['type' => 'boolean'], 'BucketLifecycleConfiguration' => ['type' => 'structure', 'required' => ['Rules'], 'members' => ['Rules' => ['shape' => 'LifecycleRules', 'locationName' => 'Rule']]], 'BucketLocationConstraint' => ['type' => 'string', 'enum' => ['af-south-1', 'ap-east-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-northeast-3', 'ap-south-1', 'ap-southeast-1', 'ap-southeast-2', 'ap-southeast-3', 'ca-central-1', 'cn-north-1', 'cn-northwest-1', 'EU', 'eu-central-1', 'eu-north-1', 'eu-south-1', 'eu-west-1', 'eu-west-2', 'eu-west-3', 'me-south-1', 'sa-east-1', 'us-east-2', 'us-gov-east-1', 'us-gov-west-1', 'us-west-1', 'us-west-2', 'ap-south-2', 'eu-south-2']], 'BucketLoggingStatus' => ['type' => 'structure', 'members' => ['LoggingEnabled' => ['shape' => 'LoggingEnabled']]], 'BucketLogsPermission' => ['type' => 'string', 'enum' => ['FULL_CONTROL', 'READ', 'WRITE']], 'BucketName' => ['type' => 'string'], 'BucketVersioningStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Suspended']], 'Buckets' => ['type' => 'list', 'member' => ['shape' => 'Bucket', 'locationName' => 'Bucket']], 'BypassGovernanceRetention' => ['type' => 'boolean'], 'BytesProcessed' => ['type' => 'long'], 'BytesReturned' => ['type' => 'long'], 'BytesScanned' => ['type' => 'long'], 'CORSConfiguration' => ['type' => 'structure', 'required' => ['CORSRules'], 'members' => ['CORSRules' => ['shape' => 'CORSRules', 'locationName' => 'CORSRule']]], 'CORSRule' => ['type' => 'structure', 'required' => ['AllowedMethods', 'AllowedOrigins'], 'members' => ['ID' => ['shape' => 'ID'], 'AllowedHeaders' => ['shape' => 'AllowedHeaders', 'locationName' => 'AllowedHeader'], 'AllowedMethods' => ['shape' => 'AllowedMethods', 'locationName' => 'AllowedMethod'], 'AllowedOrigins' => ['shape' => 'AllowedOrigins', 'locationName' => 'AllowedOrigin'], 'ExposeHeaders' => ['shape' => 'ExposeHeaders', 'locationName' => 'ExposeHeader'], 'MaxAgeSeconds' => ['shape' => 'MaxAgeSeconds']]], 'CORSRules' => ['type' => 'list', 'member' => ['shape' => 'CORSRule'], 'flattened' => \true], 'CSVInput' => ['type' => 'structure', 'members' => ['FileHeaderInfo' => ['shape' => 'FileHeaderInfo'], 'Comments' => ['shape' => 'Comments'], 'QuoteEscapeCharacter' => ['shape' => 'QuoteEscapeCharacter'], 'RecordDelimiter' => ['shape' => 'RecordDelimiter'], 'FieldDelimiter' => ['shape' => 'FieldDelimiter'], 'QuoteCharacter' => ['shape' => 'QuoteCharacter'], 'AllowQuotedRecordDelimiter' => ['shape' => 'AllowQuotedRecordDelimiter']]], 'CSVOutput' => ['type' => 'structure', 'members' => ['QuoteFields' => ['shape' => 'QuoteFields'], 'QuoteEscapeCharacter' => ['shape' => 'QuoteEscapeCharacter'], 'RecordDelimiter' => ['shape' => 'RecordDelimiter'], 'FieldDelimiter' => ['shape' => 'FieldDelimiter'], 'QuoteCharacter' => ['shape' => 'QuoteCharacter']]], 'CacheControl' => ['type' => 'string'], 'Checksum' => ['type' => 'structure', 'members' => ['ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256']]], 'ChecksumAlgorithm' => ['type' => 'string', 'enum' => ['CRC32', 'CRC32C', 'SHA1', 'SHA256']], 'ChecksumAlgorithmList' => ['type' => 'list', 'member' => ['shape' => 'ChecksumAlgorithm'], 'flattened' => \true], 'ChecksumCRC32' => ['type' => 'string'], 'ChecksumCRC32C' => ['type' => 'string'], 'ChecksumMode' => ['type' => 'string', 'enum' => ['ENABLED']], 'ChecksumSHA1' => ['type' => 'string'], 'ChecksumSHA256' => ['type' => 'string'], 'CloudFunction' => ['type' => 'string'], 'CloudFunctionConfiguration' => ['type' => 'structure', 'members' => ['Id' => ['shape' => 'NotificationId'], 'Event' => ['shape' => 'Event', 'deprecated' => \true], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'CloudFunction' => ['shape' => 'CloudFunction'], 'InvocationRole' => ['shape' => 'CloudFunctionInvocationRole']]], 'CloudFunctionInvocationRole' => ['type' => 'string'], 'Code' => ['type' => 'string'], 'Comments' => ['type' => 'string'], 'CommonPrefix' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix']]], 'CommonPrefixList' => ['type' => 'list', 'member' => ['shape' => 'CommonPrefix'], 'flattened' => \true], 'CompleteMultipartUploadOutput' => ['type' => 'structure', 'members' => ['Location' => ['shape' => 'Location'], 'Bucket' => ['shape' => 'BucketName'], 'Key' => ['shape' => 'ObjectKey'], 'Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration'], 'ETag' => ['shape' => 'ETag'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'CompleteMultipartUploadRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'UploadId'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'MultipartUpload' => ['shape' => 'CompletedMultipartUpload', 'locationName' => 'CompleteMultipartUpload', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'UploadId' => ['shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5']], 'payload' => 'MultipartUpload'], 'CompletedMultipartUpload' => ['type' => 'structure', 'members' => ['Parts' => ['shape' => 'CompletedPartList', 'locationName' => 'Part']]], 'CompletedPart' => ['type' => 'structure', 'members' => ['ETag' => ['shape' => 'ETag'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256'], 'PartNumber' => ['shape' => 'PartNumber']]], 'CompletedPartList' => ['type' => 'list', 'member' => ['shape' => 'CompletedPart'], 'flattened' => \true], 'CompressionType' => ['type' => 'string', 'enum' => ['NONE', 'GZIP', 'BZIP2']], 'Condition' => ['type' => 'structure', 'members' => ['HttpErrorCodeReturnedEquals' => ['shape' => 'HttpErrorCodeReturnedEquals'], 'KeyPrefixEquals' => ['shape' => 'KeyPrefixEquals']]], 'ConfirmRemoveSelfBucketAccess' => ['type' => 'boolean'], 'ContentDisposition' => ['type' => 'string'], 'ContentEncoding' => ['type' => 'string'], 'ContentLanguage' => ['type' => 'string'], 'ContentLength' => ['type' => 'long'], 'ContentMD5' => ['type' => 'string'], 'ContentRange' => ['type' => 'string'], 'ContentType' => ['type' => 'string'], 'ContinuationEvent' => ['type' => 'structure', 'members' => [], 'event' => \true], 'CopyObjectOutput' => ['type' => 'structure', 'members' => ['CopyObjectResult' => ['shape' => 'CopyObjectResult'], 'Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration'], 'CopySourceVersionId' => ['shape' => 'CopySourceVersionId', 'location' => 'header', 'locationName' => 'x-amz-copy-source-version-id'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']], 'payload' => 'CopyObjectResult'], 'CopyObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'CopySource', 'Key'], 'members' => ['ACL' => ['shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type'], 'CopySource' => ['shape' => 'CopySource', 'location' => 'header', 'locationName' => 'x-amz-copy-source'], 'CopySourceIfMatch' => ['shape' => 'CopySourceIfMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-match'], 'CopySourceIfModifiedSince' => ['shape' => 'CopySourceIfModifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-modified-since'], 'CopySourceIfNoneMatch' => ['shape' => 'CopySourceIfNoneMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-none-match'], 'CopySourceIfUnmodifiedSince' => ['shape' => 'CopySourceIfUnmodifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-unmodified-since'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires'], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'MetadataDirective' => ['shape' => 'MetadataDirective', 'location' => 'header', 'locationName' => 'x-amz-metadata-directive'], 'TaggingDirective' => ['shape' => 'TaggingDirective', 'location' => 'header', 'locationName' => 'x-amz-tagging-directive'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class'], 'WebsiteRedirectLocation' => ['shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'CopySourceSSECustomerAlgorithm' => ['shape' => 'CopySourceSSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'], 'CopySourceSSECustomerKey' => ['shape' => 'CopySourceSSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key'], 'CopySourceSSECustomerKeyMD5' => ['shape' => 'CopySourceSSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'Tagging' => ['shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ExpectedSourceBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-source-expected-bucket-owner']]], 'CopyObjectResult' => ['type' => 'structure', 'members' => ['ETag' => ['shape' => 'ETag'], 'LastModified' => ['shape' => 'LastModified'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256']]], 'CopyPartResult' => ['type' => 'structure', 'members' => ['ETag' => ['shape' => 'ETag'], 'LastModified' => ['shape' => 'LastModified'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256']]], 'CopySource' => ['type' => 'string', 'pattern' => '\\/.+\\/.+'], 'CopySourceIfMatch' => ['type' => 'string'], 'CopySourceIfModifiedSince' => ['type' => 'timestamp'], 'CopySourceIfNoneMatch' => ['type' => 'string'], 'CopySourceIfUnmodifiedSince' => ['type' => 'timestamp'], 'CopySourceRange' => ['type' => 'string'], 'CopySourceSSECustomerAlgorithm' => ['type' => 'string'], 'CopySourceSSECustomerKey' => ['type' => 'string', 'sensitive' => \true], 'CopySourceSSECustomerKeyMD5' => ['type' => 'string'], 'CopySourceVersionId' => ['type' => 'string'], 'CreateBucketConfiguration' => ['type' => 'structure', 'members' => ['LocationConstraint' => ['shape' => 'BucketLocationConstraint']]], 'CreateBucketOutput' => ['type' => 'structure', 'members' => ['Location' => ['shape' => 'Location', 'location' => 'header', 'locationName' => 'Location']]], 'CreateBucketRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['ACL' => ['shape' => 'BucketCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CreateBucketConfiguration' => ['shape' => 'CreateBucketConfiguration', 'locationName' => 'CreateBucketConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWrite' => ['shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'ObjectLockEnabledForBucket' => ['shape' => 'ObjectLockEnabledForBucket', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-enabled'], 'ObjectOwnership' => ['shape' => 'ObjectOwnership', 'location' => 'header', 'locationName' => 'x-amz-object-ownership']], 'payload' => 'CreateBucketConfiguration'], 'CreateMultipartUploadOutput' => ['type' => 'structure', 'members' => ['AbortDate' => ['shape' => 'AbortDate', 'location' => 'header', 'locationName' => 'x-amz-abort-date'], 'AbortRuleId' => ['shape' => 'AbortRuleId', 'location' => 'header', 'locationName' => 'x-amz-abort-rule-id'], 'Bucket' => ['shape' => 'BucketName', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey'], 'UploadId' => ['shape' => 'MultipartUploadId'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm']]], 'CreateMultipartUploadRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['ACL' => ['shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires'], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class'], 'WebsiteRedirectLocation' => ['shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'Tagging' => ['shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-checksum-algorithm']]], 'CreationDate' => ['type' => 'timestamp'], 'Date' => ['type' => 'timestamp', 'timestampFormat' => 'iso8601'], 'Days' => ['type' => 'integer'], 'DaysAfterInitiation' => ['type' => 'integer'], 'DefaultRetention' => ['type' => 'structure', 'members' => ['Mode' => ['shape' => 'ObjectLockRetentionMode'], 'Days' => ['shape' => 'Days'], 'Years' => ['shape' => 'Years']]], 'Delete' => ['type' => 'structure', 'required' => ['Objects'], 'members' => ['Objects' => ['shape' => 'ObjectIdentifierList', 'locationName' => 'Object'], 'Quiet' => ['shape' => 'Quiet']]], 'DeleteBucketAnalyticsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketCorsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketEncryptionRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketIntelligentTieringConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id']]], 'DeleteBucketInventoryConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketLifecycleRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketMetricsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketOwnershipControlsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketPolicyRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketReplicationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteBucketWebsiteRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteMarker' => ['type' => 'boolean'], 'DeleteMarkerEntry' => ['type' => 'structure', 'members' => ['Owner' => ['shape' => 'Owner'], 'Key' => ['shape' => 'ObjectKey'], 'VersionId' => ['shape' => 'ObjectVersionId'], 'IsLatest' => ['shape' => 'IsLatest'], 'LastModified' => ['shape' => 'LastModified']]], 'DeleteMarkerReplication' => ['type' => 'structure', 'members' => ['Status' => ['shape' => 'DeleteMarkerReplicationStatus']]], 'DeleteMarkerReplicationStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'DeleteMarkerVersionId' => ['type' => 'string'], 'DeleteMarkers' => ['type' => 'list', 'member' => ['shape' => 'DeleteMarkerEntry'], 'flattened' => \true], 'DeleteObjectOutput' => ['type' => 'structure', 'members' => ['DeleteMarker' => ['shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'DeleteObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'MFA' => ['shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'BypassGovernanceRetention' => ['shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteObjectTaggingOutput' => ['type' => 'structure', 'members' => ['VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id']]], 'DeleteObjectTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeleteObjectsOutput' => ['type' => 'structure', 'members' => ['Deleted' => ['shape' => 'DeletedObjects'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'Errors' => ['shape' => 'Errors', 'locationName' => 'Error']]], 'DeleteObjectsRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Delete'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Delete' => ['shape' => 'Delete', 'locationName' => 'Delete', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'MFA' => ['shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'BypassGovernanceRetention' => ['shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm']], 'payload' => 'Delete'], 'DeletePublicAccessBlockRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'DeletedObject' => ['type' => 'structure', 'members' => ['Key' => ['shape' => 'ObjectKey'], 'VersionId' => ['shape' => 'ObjectVersionId'], 'DeleteMarker' => ['shape' => 'DeleteMarker'], 'DeleteMarkerVersionId' => ['shape' => 'DeleteMarkerVersionId']]], 'DeletedObjects' => ['type' => 'list', 'member' => ['shape' => 'DeletedObject'], 'flattened' => \true], 'Delimiter' => ['type' => 'string'], 'Description' => ['type' => 'string'], 'Destination' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName'], 'Account' => ['shape' => 'AccountId'], 'StorageClass' => ['shape' => 'StorageClass'], 'AccessControlTranslation' => ['shape' => 'AccessControlTranslation'], 'EncryptionConfiguration' => ['shape' => 'EncryptionConfiguration'], 'ReplicationTime' => ['shape' => 'ReplicationTime'], 'Metrics' => ['shape' => 'Metrics']]], 'DisplayName' => ['type' => 'string'], 'ETag' => ['type' => 'string'], 'EmailAddress' => ['type' => 'string'], 'EnableRequestProgress' => ['type' => 'boolean'], 'EncodingType' => ['type' => 'string', 'enum' => ['url']], 'Encryption' => ['type' => 'structure', 'required' => ['EncryptionType'], 'members' => ['EncryptionType' => ['shape' => 'ServerSideEncryption'], 'KMSKeyId' => ['shape' => 'SSEKMSKeyId'], 'KMSContext' => ['shape' => 'KMSContext']]], 'EncryptionConfiguration' => ['type' => 'structure', 'members' => ['ReplicaKmsKeyID' => ['shape' => 'ReplicaKmsKeyID']]], 'End' => ['type' => 'long'], 'EndEvent' => ['type' => 'structure', 'members' => [], 'event' => \true], 'Error' => ['type' => 'structure', 'members' => ['Key' => ['shape' => 'ObjectKey'], 'VersionId' => ['shape' => 'ObjectVersionId'], 'Code' => ['shape' => 'Code'], 'Message' => ['shape' => 'Message']]], 'ErrorCode' => ['type' => 'string'], 'ErrorDocument' => ['type' => 'structure', 'required' => ['Key'], 'members' => ['Key' => ['shape' => 'ObjectKey']]], 'ErrorMessage' => ['type' => 'string'], 'Errors' => ['type' => 'list', 'member' => ['shape' => 'Error'], 'flattened' => \true], 'Event' => ['type' => 'string', 'enum' => ['s3:ReducedRedundancyLostObject', 's3:ObjectCreated:*', 's3:ObjectCreated:Put', 's3:ObjectCreated:Post', 's3:ObjectCreated:Copy', 's3:ObjectCreated:CompleteMultipartUpload', 's3:ObjectRemoved:*', 's3:ObjectRemoved:Delete', 's3:ObjectRemoved:DeleteMarkerCreated', 's3:ObjectRestore:*', 's3:ObjectRestore:Post', 's3:ObjectRestore:Completed', 's3:Replication:*', 's3:Replication:OperationFailedReplication', 's3:Replication:OperationNotTracked', 's3:Replication:OperationMissedThreshold', 's3:Replication:OperationReplicatedAfterThreshold', 's3:ObjectRestore:Delete', 's3:LifecycleTransition', 's3:IntelligentTiering', 's3:ObjectAcl:Put', 's3:LifecycleExpiration:*', 's3:LifecycleExpiration:Delete', 's3:LifecycleExpiration:DeleteMarkerCreated', 's3:ObjectTagging:*', 's3:ObjectTagging:Put', 's3:ObjectTagging:Delete']], 'EventBridgeConfiguration' => ['type' => 'structure', 'members' => []], 'EventList' => ['type' => 'list', 'member' => ['shape' => 'Event'], 'flattened' => \true], 'ExistingObjectReplication' => ['type' => 'structure', 'required' => ['Status'], 'members' => ['Status' => ['shape' => 'ExistingObjectReplicationStatus']]], 'ExistingObjectReplicationStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'Expiration' => ['type' => 'string'], 'ExpirationStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'ExpiredObjectDeleteMarker' => ['type' => 'boolean'], 'Expires' => ['type' => 'timestamp'], 'ExposeHeader' => ['type' => 'string'], 'ExposeHeaders' => ['type' => 'list', 'member' => ['shape' => 'ExposeHeader'], 'flattened' => \true], 'Expression' => ['type' => 'string'], 'ExpressionType' => ['type' => 'string', 'enum' => ['SQL']], 'FetchOwner' => ['type' => 'boolean'], 'FieldDelimiter' => ['type' => 'string'], 'FileHeaderInfo' => ['type' => 'string', 'enum' => ['USE', 'IGNORE', 'NONE']], 'FilterRule' => ['type' => 'structure', 'members' => ['Name' => ['shape' => 'FilterRuleName'], 'Value' => ['shape' => 'FilterRuleValue']]], 'FilterRuleList' => ['type' => 'list', 'member' => ['shape' => 'FilterRule'], 'flattened' => \true], 'FilterRuleName' => ['type' => 'string', 'enum' => ['prefix', 'suffix']], 'FilterRuleValue' => ['type' => 'string'], 'GetBucketAccelerateConfigurationOutput' => ['type' => 'structure', 'members' => ['Status' => ['shape' => 'BucketAccelerateStatus'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'GetBucketAccelerateConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer']]], 'GetBucketAclOutput' => ['type' => 'structure', 'members' => ['Owner' => ['shape' => 'Owner'], 'Grants' => ['shape' => 'Grants', 'locationName' => 'AccessControlList']]], 'GetBucketAclRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketAnalyticsConfigurationOutput' => ['type' => 'structure', 'members' => ['AnalyticsConfiguration' => ['shape' => 'AnalyticsConfiguration']], 'payload' => 'AnalyticsConfiguration'], 'GetBucketAnalyticsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketCorsOutput' => ['type' => 'structure', 'members' => ['CORSRules' => ['shape' => 'CORSRules', 'locationName' => 'CORSRule']]], 'GetBucketCorsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketEncryptionOutput' => ['type' => 'structure', 'members' => ['ServerSideEncryptionConfiguration' => ['shape' => 'ServerSideEncryptionConfiguration']], 'payload' => 'ServerSideEncryptionConfiguration'], 'GetBucketEncryptionRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketIntelligentTieringConfigurationOutput' => ['type' => 'structure', 'members' => ['IntelligentTieringConfiguration' => ['shape' => 'IntelligentTieringConfiguration']], 'payload' => 'IntelligentTieringConfiguration'], 'GetBucketIntelligentTieringConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id']]], 'GetBucketInventoryConfigurationOutput' => ['type' => 'structure', 'members' => ['InventoryConfiguration' => ['shape' => 'InventoryConfiguration']], 'payload' => 'InventoryConfiguration'], 'GetBucketInventoryConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketLifecycleConfigurationOutput' => ['type' => 'structure', 'members' => ['Rules' => ['shape' => 'LifecycleRules', 'locationName' => 'Rule']]], 'GetBucketLifecycleConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketLifecycleOutput' => ['type' => 'structure', 'members' => ['Rules' => ['shape' => 'Rules', 'locationName' => 'Rule']]], 'GetBucketLifecycleRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketLocationOutput' => ['type' => 'structure', 'members' => ['LocationConstraint' => ['shape' => 'BucketLocationConstraint']]], 'GetBucketLocationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketLoggingOutput' => ['type' => 'structure', 'members' => ['LoggingEnabled' => ['shape' => 'LoggingEnabled']]], 'GetBucketLoggingRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketMetricsConfigurationOutput' => ['type' => 'structure', 'members' => ['MetricsConfiguration' => ['shape' => 'MetricsConfiguration']], 'payload' => 'MetricsConfiguration'], 'GetBucketMetricsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketNotificationConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketOwnershipControlsOutput' => ['type' => 'structure', 'members' => ['OwnershipControls' => ['shape' => 'OwnershipControls']], 'payload' => 'OwnershipControls'], 'GetBucketOwnershipControlsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketPolicyOutput' => ['type' => 'structure', 'members' => ['Policy' => ['shape' => 'Policy']], 'payload' => 'Policy'], 'GetBucketPolicyRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketPolicyStatusOutput' => ['type' => 'structure', 'members' => ['PolicyStatus' => ['shape' => 'PolicyStatus']], 'payload' => 'PolicyStatus'], 'GetBucketPolicyStatusRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketReplicationOutput' => ['type' => 'structure', 'members' => ['ReplicationConfiguration' => ['shape' => 'ReplicationConfiguration']], 'payload' => 'ReplicationConfiguration'], 'GetBucketReplicationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketRequestPaymentOutput' => ['type' => 'structure', 'members' => ['Payer' => ['shape' => 'Payer']]], 'GetBucketRequestPaymentRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketTaggingOutput' => ['type' => 'structure', 'required' => ['TagSet'], 'members' => ['TagSet' => ['shape' => 'TagSet']]], 'GetBucketTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketVersioningOutput' => ['type' => 'structure', 'members' => ['Status' => ['shape' => 'BucketVersioningStatus'], 'MFADelete' => ['shape' => 'MFADeleteStatus', 'locationName' => 'MfaDelete']]], 'GetBucketVersioningRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetBucketWebsiteOutput' => ['type' => 'structure', 'members' => ['RedirectAllRequestsTo' => ['shape' => 'RedirectAllRequestsTo'], 'IndexDocument' => ['shape' => 'IndexDocument'], 'ErrorDocument' => ['shape' => 'ErrorDocument'], 'RoutingRules' => ['shape' => 'RoutingRules']]], 'GetBucketWebsiteRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetObjectAclOutput' => ['type' => 'structure', 'members' => ['Owner' => ['shape' => 'Owner'], 'Grants' => ['shape' => 'Grants', 'locationName' => 'AccessControlList'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'GetObjectAclRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetObjectAttributesOutput' => ['type' => 'structure', 'members' => ['DeleteMarker' => ['shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker'], 'LastModified' => ['shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'ETag' => ['shape' => 'ETag'], 'Checksum' => ['shape' => 'Checksum'], 'ObjectParts' => ['shape' => 'GetObjectAttributesParts'], 'StorageClass' => ['shape' => 'StorageClass'], 'ObjectSize' => ['shape' => 'ObjectSize']]], 'GetObjectAttributesParts' => ['type' => 'structure', 'members' => ['TotalPartsCount' => ['shape' => 'PartsCount', 'locationName' => 'PartsCount'], 'PartNumberMarker' => ['shape' => 'PartNumberMarker'], 'NextPartNumberMarker' => ['shape' => 'NextPartNumberMarker'], 'MaxParts' => ['shape' => 'MaxParts'], 'IsTruncated' => ['shape' => 'IsTruncated'], 'Parts' => ['shape' => 'PartsList', 'locationName' => 'Part']]], 'GetObjectAttributesRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'ObjectAttributes'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'MaxParts' => ['shape' => 'MaxParts', 'location' => 'header', 'locationName' => 'x-amz-max-parts'], 'PartNumberMarker' => ['shape' => 'PartNumberMarker', 'location' => 'header', 'locationName' => 'x-amz-part-number-marker'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ObjectAttributes' => ['shape' => 'ObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-object-attributes']]], 'GetObjectLegalHoldOutput' => ['type' => 'structure', 'members' => ['LegalHold' => ['shape' => 'ObjectLockLegalHold']], 'payload' => 'LegalHold'], 'GetObjectLegalHoldRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetObjectLockConfigurationOutput' => ['type' => 'structure', 'members' => ['ObjectLockConfiguration' => ['shape' => 'ObjectLockConfiguration']], 'payload' => 'ObjectLockConfiguration'], 'GetObjectLockConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetObjectOutput' => ['type' => 'structure', 'members' => ['Body' => ['shape' => 'Body', 'streaming' => \true], 'DeleteMarker' => ['shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker'], 'AcceptRanges' => ['shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'accept-ranges'], 'Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration'], 'Restore' => ['shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-restore'], 'LastModified' => ['shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified'], 'ContentLength' => ['shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length'], 'ETag' => ['shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'MissingMeta' => ['shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-missing-meta'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language'], 'ContentRange' => ['shape' => 'ContentRange', 'location' => 'header', 'locationName' => 'Content-Range'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires'], 'WebsiteRedirectLocation' => ['shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'ReplicationStatus' => ['shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-replication-status'], 'PartsCount' => ['shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-mp-parts-count'], 'TagCount' => ['shape' => 'TagCount', 'location' => 'header', 'locationName' => 'x-amz-tagging-count'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold']], 'payload' => 'Body'], 'GetObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'IfMatch' => ['shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match'], 'IfModifiedSince' => ['shape' => 'IfModifiedSince', 'location' => 'header', 'locationName' => 'If-Modified-Since'], 'IfNoneMatch' => ['shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match'], 'IfUnmodifiedSince' => ['shape' => 'IfUnmodifiedSince', 'location' => 'header', 'locationName' => 'If-Unmodified-Since'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Range' => ['shape' => 'Range', 'location' => 'header', 'locationName' => 'Range'], 'ResponseCacheControl' => ['shape' => 'ResponseCacheControl', 'location' => 'querystring', 'locationName' => 'response-cache-control'], 'ResponseContentDisposition' => ['shape' => 'ResponseContentDisposition', 'location' => 'querystring', 'locationName' => 'response-content-disposition'], 'ResponseContentEncoding' => ['shape' => 'ResponseContentEncoding', 'location' => 'querystring', 'locationName' => 'response-content-encoding'], 'ResponseContentLanguage' => ['shape' => 'ResponseContentLanguage', 'location' => 'querystring', 'locationName' => 'response-content-language'], 'ResponseContentType' => ['shape' => 'ResponseContentType', 'location' => 'querystring', 'locationName' => 'response-content-type'], 'ResponseExpires' => ['shape' => 'ResponseExpires', 'location' => 'querystring', 'locationName' => 'response-expires'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'PartNumber' => ['shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ChecksumMode' => ['shape' => 'ChecksumMode', 'location' => 'header', 'locationName' => 'x-amz-checksum-mode']]], 'GetObjectResponseStatusCode' => ['type' => 'integer'], 'GetObjectRetentionOutput' => ['type' => 'structure', 'members' => ['Retention' => ['shape' => 'ObjectLockRetention']], 'payload' => 'Retention'], 'GetObjectRetentionRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetObjectTaggingOutput' => ['type' => 'structure', 'required' => ['TagSet'], 'members' => ['VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'TagSet' => ['shape' => 'TagSet']]], 'GetObjectTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer']]], 'GetObjectTorrentOutput' => ['type' => 'structure', 'members' => ['Body' => ['shape' => 'Body', 'streaming' => \true], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']], 'payload' => 'Body'], 'GetObjectTorrentRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GetPublicAccessBlockOutput' => ['type' => 'structure', 'members' => ['PublicAccessBlockConfiguration' => ['shape' => 'PublicAccessBlockConfiguration']], 'payload' => 'PublicAccessBlockConfiguration'], 'GetPublicAccessBlockRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'GlacierJobParameters' => ['type' => 'structure', 'required' => ['Tier'], 'members' => ['Tier' => ['shape' => 'Tier']]], 'Grant' => ['type' => 'structure', 'members' => ['Grantee' => ['shape' => 'Grantee'], 'Permission' => ['shape' => 'Permission']]], 'GrantFullControl' => ['type' => 'string'], 'GrantRead' => ['type' => 'string'], 'GrantReadACP' => ['type' => 'string'], 'GrantWrite' => ['type' => 'string'], 'GrantWriteACP' => ['type' => 'string'], 'Grantee' => ['type' => 'structure', 'required' => ['Type'], 'members' => ['DisplayName' => ['shape' => 'DisplayName'], 'EmailAddress' => ['shape' => 'EmailAddress'], 'ID' => ['shape' => 'ID'], 'Type' => ['shape' => 'Type', 'locationName' => 'xsi:type', 'xmlAttribute' => \true], 'URI' => ['shape' => 'URI']], 'xmlNamespace' => ['prefix' => 'xsi', 'uri' => 'http://www.w3.org/2001/XMLSchema-instance']], 'Grants' => ['type' => 'list', 'member' => ['shape' => 'Grant', 'locationName' => 'Grant']], 'HeadBucketRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'HeadObjectOutput' => ['type' => 'structure', 'members' => ['DeleteMarker' => ['shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-delete-marker'], 'AcceptRanges' => ['shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'accept-ranges'], 'Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration'], 'Restore' => ['shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-restore'], 'ArchiveStatus' => ['shape' => 'ArchiveStatus', 'location' => 'header', 'locationName' => 'x-amz-archive-status'], 'LastModified' => ['shape' => 'LastModified', 'location' => 'header', 'locationName' => 'Last-Modified'], 'ContentLength' => ['shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'ETag' => ['shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag'], 'MissingMeta' => ['shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-missing-meta'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires'], 'WebsiteRedirectLocation' => ['shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'ReplicationStatus' => ['shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-replication-status'], 'PartsCount' => ['shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-mp-parts-count'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold']]], 'HeadObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'IfMatch' => ['shape' => 'IfMatch', 'location' => 'header', 'locationName' => 'If-Match'], 'IfModifiedSince' => ['shape' => 'IfModifiedSince', 'location' => 'header', 'locationName' => 'If-Modified-Since'], 'IfNoneMatch' => ['shape' => 'IfNoneMatch', 'location' => 'header', 'locationName' => 'If-None-Match'], 'IfUnmodifiedSince' => ['shape' => 'IfUnmodifiedSince', 'location' => 'header', 'locationName' => 'If-Unmodified-Since'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Range' => ['shape' => 'Range', 'location' => 'header', 'locationName' => 'Range'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'PartNumber' => ['shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ChecksumMode' => ['shape' => 'ChecksumMode', 'location' => 'header', 'locationName' => 'x-amz-checksum-mode']]], 'HostName' => ['type' => 'string'], 'HttpErrorCodeReturnedEquals' => ['type' => 'string'], 'HttpRedirectCode' => ['type' => 'string'], 'ID' => ['type' => 'string'], 'IfMatch' => ['type' => 'string'], 'IfModifiedSince' => ['type' => 'timestamp'], 'IfNoneMatch' => ['type' => 'string'], 'IfUnmodifiedSince' => ['type' => 'timestamp'], 'IndexDocument' => ['type' => 'structure', 'required' => ['Suffix'], 'members' => ['Suffix' => ['shape' => 'Suffix']]], 'Initiated' => ['type' => 'timestamp'], 'Initiator' => ['type' => 'structure', 'members' => ['ID' => ['shape' => 'ID'], 'DisplayName' => ['shape' => 'DisplayName']]], 'InputSerialization' => ['type' => 'structure', 'members' => ['CSV' => ['shape' => 'CSVInput'], 'CompressionType' => ['shape' => 'CompressionType'], 'JSON' => ['shape' => 'JSONInput'], 'Parquet' => ['shape' => 'ParquetInput']]], 'IntelligentTieringAccessTier' => ['type' => 'string', 'enum' => ['ARCHIVE_ACCESS', 'DEEP_ARCHIVE_ACCESS']], 'IntelligentTieringAndOperator' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tags' => ['shape' => 'TagSet', 'flattened' => \true, 'locationName' => 'Tag']]], 'IntelligentTieringConfiguration' => ['type' => 'structure', 'required' => ['Id', 'Status', 'Tierings'], 'members' => ['Id' => ['shape' => 'IntelligentTieringId'], 'Filter' => ['shape' => 'IntelligentTieringFilter'], 'Status' => ['shape' => 'IntelligentTieringStatus'], 'Tierings' => ['shape' => 'TieringList', 'locationName' => 'Tiering']]], 'IntelligentTieringConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'IntelligentTieringConfiguration'], 'flattened' => \true], 'IntelligentTieringDays' => ['type' => 'integer'], 'IntelligentTieringFilter' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tag' => ['shape' => 'Tag'], 'And' => ['shape' => 'IntelligentTieringAndOperator']]], 'IntelligentTieringId' => ['type' => 'string'], 'IntelligentTieringStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'InvalidObjectState' => ['type' => 'structure', 'members' => ['StorageClass' => ['shape' => 'StorageClass'], 'AccessTier' => ['shape' => 'IntelligentTieringAccessTier']], 'exception' => \true], 'InventoryConfiguration' => ['type' => 'structure', 'required' => ['Destination', 'IsEnabled', 'Id', 'IncludedObjectVersions', 'Schedule'], 'members' => ['Destination' => ['shape' => 'InventoryDestination'], 'IsEnabled' => ['shape' => 'IsEnabled'], 'Filter' => ['shape' => 'InventoryFilter'], 'Id' => ['shape' => 'InventoryId'], 'IncludedObjectVersions' => ['shape' => 'InventoryIncludedObjectVersions'], 'OptionalFields' => ['shape' => 'InventoryOptionalFields'], 'Schedule' => ['shape' => 'InventorySchedule']]], 'InventoryConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'InventoryConfiguration'], 'flattened' => \true], 'InventoryDestination' => ['type' => 'structure', 'required' => ['S3BucketDestination'], 'members' => ['S3BucketDestination' => ['shape' => 'InventoryS3BucketDestination']]], 'InventoryEncryption' => ['type' => 'structure', 'members' => ['SSES3' => ['shape' => 'SSES3', 'locationName' => 'SSE-S3'], 'SSEKMS' => ['shape' => 'SSEKMS', 'locationName' => 'SSE-KMS']]], 'InventoryFilter' => ['type' => 'structure', 'required' => ['Prefix'], 'members' => ['Prefix' => ['shape' => 'Prefix']]], 'InventoryFormat' => ['type' => 'string', 'enum' => ['CSV', 'ORC', 'Parquet']], 'InventoryFrequency' => ['type' => 'string', 'enum' => ['Daily', 'Weekly']], 'InventoryId' => ['type' => 'string'], 'InventoryIncludedObjectVersions' => ['type' => 'string', 'enum' => ['All', 'Current']], 'InventoryOptionalField' => ['type' => 'string', 'enum' => ['Size', 'LastModifiedDate', 'StorageClass', 'ETag', 'IsMultipartUploaded', 'ReplicationStatus', 'EncryptionStatus', 'ObjectLockRetainUntilDate', 'ObjectLockMode', 'ObjectLockLegalHoldStatus', 'IntelligentTieringAccessTier', 'BucketKeyStatus', 'ChecksumAlgorithm', 'ObjectAccessControlList', 'ObjectOwner']], 'InventoryOptionalFields' => ['type' => 'list', 'member' => ['shape' => 'InventoryOptionalField', 'locationName' => 'Field']], 'InventoryS3BucketDestination' => ['type' => 'structure', 'required' => ['Bucket', 'Format'], 'members' => ['AccountId' => ['shape' => 'AccountId'], 'Bucket' => ['shape' => 'BucketName'], 'Format' => ['shape' => 'InventoryFormat'], 'Prefix' => ['shape' => 'Prefix'], 'Encryption' => ['shape' => 'InventoryEncryption']]], 'InventorySchedule' => ['type' => 'structure', 'required' => ['Frequency'], 'members' => ['Frequency' => ['shape' => 'InventoryFrequency']]], 'IsEnabled' => ['type' => 'boolean'], 'IsLatest' => ['type' => 'boolean'], 'IsPublic' => ['type' => 'boolean'], 'IsRestoreInProgress' => ['type' => 'boolean'], 'IsTruncated' => ['type' => 'boolean'], 'JSONInput' => ['type' => 'structure', 'members' => ['Type' => ['shape' => 'JSONType']]], 'JSONOutput' => ['type' => 'structure', 'members' => ['RecordDelimiter' => ['shape' => 'RecordDelimiter']]], 'JSONType' => ['type' => 'string', 'enum' => ['DOCUMENT', 'LINES']], 'KMSContext' => ['type' => 'string'], 'KeyCount' => ['type' => 'integer'], 'KeyMarker' => ['type' => 'string'], 'KeyPrefixEquals' => ['type' => 'string'], 'LambdaFunctionArn' => ['type' => 'string'], 'LambdaFunctionConfiguration' => ['type' => 'structure', 'required' => ['LambdaFunctionArn', 'Events'], 'members' => ['Id' => ['shape' => 'NotificationId'], 'LambdaFunctionArn' => ['shape' => 'LambdaFunctionArn', 'locationName' => 'CloudFunction'], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'Filter' => ['shape' => 'NotificationConfigurationFilter']]], 'LambdaFunctionConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'LambdaFunctionConfiguration'], 'flattened' => \true], 'LastModified' => ['type' => 'timestamp'], 'LifecycleConfiguration' => ['type' => 'structure', 'required' => ['Rules'], 'members' => ['Rules' => ['shape' => 'Rules', 'locationName' => 'Rule']]], 'LifecycleExpiration' => ['type' => 'structure', 'members' => ['Date' => ['shape' => 'Date'], 'Days' => ['shape' => 'Days'], 'ExpiredObjectDeleteMarker' => ['shape' => 'ExpiredObjectDeleteMarker']]], 'LifecycleRule' => ['type' => 'structure', 'required' => ['Status'], 'members' => ['Expiration' => ['shape' => 'LifecycleExpiration'], 'ID' => ['shape' => 'ID'], 'Prefix' => ['shape' => 'Prefix', 'deprecated' => \true], 'Filter' => ['shape' => 'LifecycleRuleFilter'], 'Status' => ['shape' => 'ExpirationStatus'], 'Transitions' => ['shape' => 'TransitionList', 'locationName' => 'Transition'], 'NoncurrentVersionTransitions' => ['shape' => 'NoncurrentVersionTransitionList', 'locationName' => 'NoncurrentVersionTransition'], 'NoncurrentVersionExpiration' => ['shape' => 'NoncurrentVersionExpiration'], 'AbortIncompleteMultipartUpload' => ['shape' => 'AbortIncompleteMultipartUpload']]], 'LifecycleRuleAndOperator' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tags' => ['shape' => 'TagSet', 'flattened' => \true, 'locationName' => 'Tag'], 'ObjectSizeGreaterThan' => ['shape' => 'ObjectSizeGreaterThanBytes'], 'ObjectSizeLessThan' => ['shape' => 'ObjectSizeLessThanBytes']]], 'LifecycleRuleFilter' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tag' => ['shape' => 'Tag'], 'ObjectSizeGreaterThan' => ['shape' => 'ObjectSizeGreaterThanBytes'], 'ObjectSizeLessThan' => ['shape' => 'ObjectSizeLessThanBytes'], 'And' => ['shape' => 'LifecycleRuleAndOperator']]], 'LifecycleRules' => ['type' => 'list', 'member' => ['shape' => 'LifecycleRule'], 'flattened' => \true], 'ListBucketAnalyticsConfigurationsOutput' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'ContinuationToken' => ['shape' => 'Token'], 'NextContinuationToken' => ['shape' => 'NextToken'], 'AnalyticsConfigurationList' => ['shape' => 'AnalyticsConfigurationList', 'locationName' => 'AnalyticsConfiguration']]], 'ListBucketAnalyticsConfigurationsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContinuationToken' => ['shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'ListBucketIntelligentTieringConfigurationsOutput' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'ContinuationToken' => ['shape' => 'Token'], 'NextContinuationToken' => ['shape' => 'NextToken'], 'IntelligentTieringConfigurationList' => ['shape' => 'IntelligentTieringConfigurationList', 'locationName' => 'IntelligentTieringConfiguration']]], 'ListBucketIntelligentTieringConfigurationsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContinuationToken' => ['shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token']]], 'ListBucketInventoryConfigurationsOutput' => ['type' => 'structure', 'members' => ['ContinuationToken' => ['shape' => 'Token'], 'InventoryConfigurationList' => ['shape' => 'InventoryConfigurationList', 'locationName' => 'InventoryConfiguration'], 'IsTruncated' => ['shape' => 'IsTruncated'], 'NextContinuationToken' => ['shape' => 'NextToken']]], 'ListBucketInventoryConfigurationsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContinuationToken' => ['shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'ListBucketMetricsConfigurationsOutput' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'ContinuationToken' => ['shape' => 'Token'], 'NextContinuationToken' => ['shape' => 'NextToken'], 'MetricsConfigurationList' => ['shape' => 'MetricsConfigurationList', 'locationName' => 'MetricsConfiguration']]], 'ListBucketMetricsConfigurationsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContinuationToken' => ['shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'ListBucketsOutput' => ['type' => 'structure', 'members' => ['Buckets' => ['shape' => 'Buckets'], 'Owner' => ['shape' => 'Owner']]], 'ListMultipartUploadsOutput' => ['type' => 'structure', 'members' => ['Bucket' => ['shape' => 'BucketName'], 'KeyMarker' => ['shape' => 'KeyMarker'], 'UploadIdMarker' => ['shape' => 'UploadIdMarker'], 'NextKeyMarker' => ['shape' => 'NextKeyMarker'], 'Prefix' => ['shape' => 'Prefix'], 'Delimiter' => ['shape' => 'Delimiter'], 'NextUploadIdMarker' => ['shape' => 'NextUploadIdMarker'], 'MaxUploads' => ['shape' => 'MaxUploads'], 'IsTruncated' => ['shape' => 'IsTruncated'], 'Uploads' => ['shape' => 'MultipartUploadList', 'locationName' => 'Upload'], 'CommonPrefixes' => ['shape' => 'CommonPrefixList'], 'EncodingType' => ['shape' => 'EncodingType'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'ListMultipartUploadsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Delimiter' => ['shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter'], 'EncodingType' => ['shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type'], 'KeyMarker' => ['shape' => 'KeyMarker', 'location' => 'querystring', 'locationName' => 'key-marker'], 'MaxUploads' => ['shape' => 'MaxUploads', 'location' => 'querystring', 'locationName' => 'max-uploads'], 'Prefix' => ['shape' => 'Prefix', 'location' => 'querystring', 'locationName' => 'prefix'], 'UploadIdMarker' => ['shape' => 'UploadIdMarker', 'location' => 'querystring', 'locationName' => 'upload-id-marker'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer']]], 'ListObjectVersionsOutput' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'KeyMarker' => ['shape' => 'KeyMarker'], 'VersionIdMarker' => ['shape' => 'VersionIdMarker'], 'NextKeyMarker' => ['shape' => 'NextKeyMarker'], 'NextVersionIdMarker' => ['shape' => 'NextVersionIdMarker'], 'Versions' => ['shape' => 'ObjectVersionList', 'locationName' => 'Version'], 'DeleteMarkers' => ['shape' => 'DeleteMarkers', 'locationName' => 'DeleteMarker'], 'Name' => ['shape' => 'BucketName'], 'Prefix' => ['shape' => 'Prefix'], 'Delimiter' => ['shape' => 'Delimiter'], 'MaxKeys' => ['shape' => 'MaxKeys'], 'CommonPrefixes' => ['shape' => 'CommonPrefixList'], 'EncodingType' => ['shape' => 'EncodingType'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'ListObjectVersionsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Delimiter' => ['shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter'], 'EncodingType' => ['shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type'], 'KeyMarker' => ['shape' => 'KeyMarker', 'location' => 'querystring', 'locationName' => 'key-marker'], 'MaxKeys' => ['shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys'], 'Prefix' => ['shape' => 'Prefix', 'location' => 'querystring', 'locationName' => 'prefix'], 'VersionIdMarker' => ['shape' => 'VersionIdMarker', 'location' => 'querystring', 'locationName' => 'version-id-marker'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'OptionalObjectAttributes' => ['shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes']]], 'ListObjectsOutput' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'Marker' => ['shape' => 'Marker'], 'NextMarker' => ['shape' => 'NextMarker'], 'Contents' => ['shape' => 'ObjectList'], 'Name' => ['shape' => 'BucketName'], 'Prefix' => ['shape' => 'Prefix'], 'Delimiter' => ['shape' => 'Delimiter'], 'MaxKeys' => ['shape' => 'MaxKeys'], 'CommonPrefixes' => ['shape' => 'CommonPrefixList'], 'EncodingType' => ['shape' => 'EncodingType'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'ListObjectsRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Delimiter' => ['shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter'], 'EncodingType' => ['shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type'], 'Marker' => ['shape' => 'Marker', 'location' => 'querystring', 'locationName' => 'marker'], 'MaxKeys' => ['shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys'], 'Prefix' => ['shape' => 'Prefix', 'location' => 'querystring', 'locationName' => 'prefix'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'OptionalObjectAttributes' => ['shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes']]], 'ListObjectsV2Output' => ['type' => 'structure', 'members' => ['IsTruncated' => ['shape' => 'IsTruncated'], 'Contents' => ['shape' => 'ObjectList'], 'Name' => ['shape' => 'BucketName'], 'Prefix' => ['shape' => 'Prefix'], 'Delimiter' => ['shape' => 'Delimiter'], 'MaxKeys' => ['shape' => 'MaxKeys'], 'CommonPrefixes' => ['shape' => 'CommonPrefixList'], 'EncodingType' => ['shape' => 'EncodingType'], 'KeyCount' => ['shape' => 'KeyCount'], 'ContinuationToken' => ['shape' => 'Token'], 'NextContinuationToken' => ['shape' => 'NextToken'], 'StartAfter' => ['shape' => 'StartAfter'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'ListObjectsV2Request' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Delimiter' => ['shape' => 'Delimiter', 'location' => 'querystring', 'locationName' => 'delimiter'], 'EncodingType' => ['shape' => 'EncodingType', 'location' => 'querystring', 'locationName' => 'encoding-type'], 'MaxKeys' => ['shape' => 'MaxKeys', 'location' => 'querystring', 'locationName' => 'max-keys'], 'Prefix' => ['shape' => 'Prefix', 'location' => 'querystring', 'locationName' => 'prefix'], 'ContinuationToken' => ['shape' => 'Token', 'location' => 'querystring', 'locationName' => 'continuation-token'], 'FetchOwner' => ['shape' => 'FetchOwner', 'location' => 'querystring', 'locationName' => 'fetch-owner'], 'StartAfter' => ['shape' => 'StartAfter', 'location' => 'querystring', 'locationName' => 'start-after'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'OptionalObjectAttributes' => ['shape' => 'OptionalObjectAttributesList', 'location' => 'header', 'locationName' => 'x-amz-optional-object-attributes']]], 'ListPartsOutput' => ['type' => 'structure', 'members' => ['AbortDate' => ['shape' => 'AbortDate', 'location' => 'header', 'locationName' => 'x-amz-abort-date'], 'AbortRuleId' => ['shape' => 'AbortRuleId', 'location' => 'header', 'locationName' => 'x-amz-abort-rule-id'], 'Bucket' => ['shape' => 'BucketName'], 'Key' => ['shape' => 'ObjectKey'], 'UploadId' => ['shape' => 'MultipartUploadId'], 'PartNumberMarker' => ['shape' => 'PartNumberMarker'], 'NextPartNumberMarker' => ['shape' => 'NextPartNumberMarker'], 'MaxParts' => ['shape' => 'MaxParts'], 'IsTruncated' => ['shape' => 'IsTruncated'], 'Parts' => ['shape' => 'Parts', 'locationName' => 'Part'], 'Initiator' => ['shape' => 'Initiator'], 'Owner' => ['shape' => 'Owner'], 'StorageClass' => ['shape' => 'StorageClass'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm']]], 'ListPartsRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'UploadId'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'MaxParts' => ['shape' => 'MaxParts', 'location' => 'querystring', 'locationName' => 'max-parts'], 'PartNumberMarker' => ['shape' => 'PartNumberMarker', 'location' => 'querystring', 'locationName' => 'part-number-marker'], 'UploadId' => ['shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5']]], 'Location' => ['type' => 'string'], 'LocationPrefix' => ['type' => 'string'], 'LoggingEnabled' => ['type' => 'structure', 'required' => ['TargetBucket', 'TargetPrefix'], 'members' => ['TargetBucket' => ['shape' => 'TargetBucket'], 'TargetGrants' => ['shape' => 'TargetGrants'], 'TargetPrefix' => ['shape' => 'TargetPrefix']]], 'MFA' => ['type' => 'string'], 'MFADelete' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'MFADeleteStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'Marker' => ['type' => 'string'], 'MaxAgeSeconds' => ['type' => 'integer'], 'MaxKeys' => ['type' => 'integer'], 'MaxParts' => ['type' => 'integer'], 'MaxUploads' => ['type' => 'integer'], 'Message' => ['type' => 'string'], 'Metadata' => ['type' => 'map', 'key' => ['shape' => 'MetadataKey'], 'value' => ['shape' => 'MetadataValue']], 'MetadataDirective' => ['type' => 'string', 'enum' => ['COPY', 'REPLACE']], 'MetadataEntry' => ['type' => 'structure', 'members' => ['Name' => ['shape' => 'MetadataKey'], 'Value' => ['shape' => 'MetadataValue']]], 'MetadataKey' => ['type' => 'string'], 'MetadataValue' => ['type' => 'string'], 'Metrics' => ['type' => 'structure', 'required' => ['Status'], 'members' => ['Status' => ['shape' => 'MetricsStatus'], 'EventThreshold' => ['shape' => 'ReplicationTimeValue']]], 'MetricsAndOperator' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tags' => ['shape' => 'TagSet', 'flattened' => \true, 'locationName' => 'Tag'], 'AccessPointArn' => ['shape' => 'AccessPointArn']]], 'MetricsConfiguration' => ['type' => 'structure', 'required' => ['Id'], 'members' => ['Id' => ['shape' => 'MetricsId'], 'Filter' => ['shape' => 'MetricsFilter']]], 'MetricsConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'MetricsConfiguration'], 'flattened' => \true], 'MetricsFilter' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tag' => ['shape' => 'Tag'], 'AccessPointArn' => ['shape' => 'AccessPointArn'], 'And' => ['shape' => 'MetricsAndOperator']]], 'MetricsId' => ['type' => 'string'], 'MetricsStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'Minutes' => ['type' => 'integer'], 'MissingMeta' => ['type' => 'integer'], 'MultipartUpload' => ['type' => 'structure', 'members' => ['UploadId' => ['shape' => 'MultipartUploadId'], 'Key' => ['shape' => 'ObjectKey'], 'Initiated' => ['shape' => 'Initiated'], 'StorageClass' => ['shape' => 'StorageClass'], 'Owner' => ['shape' => 'Owner'], 'Initiator' => ['shape' => 'Initiator'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm']]], 'MultipartUploadId' => ['type' => 'string'], 'MultipartUploadList' => ['type' => 'list', 'member' => ['shape' => 'MultipartUpload'], 'flattened' => \true], 'NextKeyMarker' => ['type' => 'string'], 'NextMarker' => ['type' => 'string'], 'NextPartNumberMarker' => ['type' => 'integer'], 'NextToken' => ['type' => 'string'], 'NextUploadIdMarker' => ['type' => 'string'], 'NextVersionIdMarker' => ['type' => 'string'], 'NoSuchBucket' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'NoSuchKey' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'NoSuchUpload' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'NoncurrentVersionExpiration' => ['type' => 'structure', 'members' => ['NoncurrentDays' => ['shape' => 'Days'], 'NewerNoncurrentVersions' => ['shape' => 'VersionCount']]], 'NoncurrentVersionTransition' => ['type' => 'structure', 'members' => ['NoncurrentDays' => ['shape' => 'Days'], 'StorageClass' => ['shape' => 'TransitionStorageClass'], 'NewerNoncurrentVersions' => ['shape' => 'VersionCount']]], 'NoncurrentVersionTransitionList' => ['type' => 'list', 'member' => ['shape' => 'NoncurrentVersionTransition'], 'flattened' => \true], 'NotificationConfiguration' => ['type' => 'structure', 'members' => ['TopicConfigurations' => ['shape' => 'TopicConfigurationList', 'locationName' => 'TopicConfiguration'], 'QueueConfigurations' => ['shape' => 'QueueConfigurationList', 'locationName' => 'QueueConfiguration'], 'LambdaFunctionConfigurations' => ['shape' => 'LambdaFunctionConfigurationList', 'locationName' => 'CloudFunctionConfiguration'], 'EventBridgeConfiguration' => ['shape' => 'EventBridgeConfiguration']]], 'NotificationConfigurationDeprecated' => ['type' => 'structure', 'members' => ['TopicConfiguration' => ['shape' => 'TopicConfigurationDeprecated'], 'QueueConfiguration' => ['shape' => 'QueueConfigurationDeprecated'], 'CloudFunctionConfiguration' => ['shape' => 'CloudFunctionConfiguration']]], 'NotificationConfigurationFilter' => ['type' => 'structure', 'members' => ['Key' => ['shape' => 'S3KeyFilter', 'locationName' => 'S3Key']]], 'NotificationId' => ['type' => 'string'], 'Object' => ['type' => 'structure', 'members' => ['Key' => ['shape' => 'ObjectKey'], 'LastModified' => ['shape' => 'LastModified'], 'ETag' => ['shape' => 'ETag'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithmList'], 'Size' => ['shape' => 'Size'], 'StorageClass' => ['shape' => 'ObjectStorageClass'], 'Owner' => ['shape' => 'Owner'], 'RestoreStatus' => ['shape' => 'RestoreStatus']]], 'ObjectAlreadyInActiveTierError' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'ObjectAttributes' => ['type' => 'string', 'enum' => ['ETag', 'Checksum', 'ObjectParts', 'StorageClass', 'ObjectSize']], 'ObjectAttributesList' => ['type' => 'list', 'member' => ['shape' => 'ObjectAttributes']], 'ObjectCannedACL' => ['type' => 'string', 'enum' => ['private', 'public-read', 'public-read-write', 'authenticated-read', 'aws-exec-read', 'bucket-owner-read', 'bucket-owner-full-control']], 'ObjectIdentifier' => ['type' => 'structure', 'required' => ['Key'], 'members' => ['Key' => ['shape' => 'ObjectKey'], 'VersionId' => ['shape' => 'ObjectVersionId']]], 'ObjectIdentifierList' => ['type' => 'list', 'member' => ['shape' => 'ObjectIdentifier'], 'flattened' => \true], 'ObjectKey' => ['type' => 'string', 'min' => 1], 'ObjectList' => ['type' => 'list', 'member' => ['shape' => 'Object'], 'flattened' => \true], 'ObjectLockConfiguration' => ['type' => 'structure', 'members' => ['ObjectLockEnabled' => ['shape' => 'ObjectLockEnabled'], 'Rule' => ['shape' => 'ObjectLockRule']]], 'ObjectLockEnabled' => ['type' => 'string', 'enum' => ['Enabled']], 'ObjectLockEnabledForBucket' => ['type' => 'boolean'], 'ObjectLockLegalHold' => ['type' => 'structure', 'members' => ['Status' => ['shape' => 'ObjectLockLegalHoldStatus']]], 'ObjectLockLegalHoldStatus' => ['type' => 'string', 'enum' => ['ON', 'OFF']], 'ObjectLockMode' => ['type' => 'string', 'enum' => ['GOVERNANCE', 'COMPLIANCE']], 'ObjectLockRetainUntilDate' => ['type' => 'timestamp', 'timestampFormat' => 'iso8601'], 'ObjectLockRetention' => ['type' => 'structure', 'members' => ['Mode' => ['shape' => 'ObjectLockRetentionMode'], 'RetainUntilDate' => ['shape' => 'Date']]], 'ObjectLockRetentionMode' => ['type' => 'string', 'enum' => ['GOVERNANCE', 'COMPLIANCE']], 'ObjectLockRule' => ['type' => 'structure', 'members' => ['DefaultRetention' => ['shape' => 'DefaultRetention']]], 'ObjectLockToken' => ['type' => 'string'], 'ObjectNotInActiveTierError' => ['type' => 'structure', 'members' => [], 'exception' => \true], 'ObjectOwnership' => ['type' => 'string', 'enum' => ['BucketOwnerPreferred', 'ObjectWriter', 'BucketOwnerEnforced']], 'ObjectPart' => ['type' => 'structure', 'members' => ['PartNumber' => ['shape' => 'PartNumber'], 'Size' => ['shape' => 'Size'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256']]], 'ObjectSize' => ['type' => 'long'], 'ObjectSizeGreaterThanBytes' => ['type' => 'long'], 'ObjectSizeLessThanBytes' => ['type' => 'long'], 'ObjectStorageClass' => ['type' => 'string', 'enum' => ['STANDARD', 'REDUCED_REDUNDANCY', 'GLACIER', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'DEEP_ARCHIVE', 'OUTPOSTS', 'GLACIER_IR', 'SNOW']], 'ObjectVersion' => ['type' => 'structure', 'members' => ['ETag' => ['shape' => 'ETag'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithmList'], 'Size' => ['shape' => 'Size'], 'StorageClass' => ['shape' => 'ObjectVersionStorageClass'], 'Key' => ['shape' => 'ObjectKey'], 'VersionId' => ['shape' => 'ObjectVersionId'], 'IsLatest' => ['shape' => 'IsLatest'], 'LastModified' => ['shape' => 'LastModified'], 'Owner' => ['shape' => 'Owner'], 'RestoreStatus' => ['shape' => 'RestoreStatus']]], 'ObjectVersionId' => ['type' => 'string'], 'ObjectVersionList' => ['type' => 'list', 'member' => ['shape' => 'ObjectVersion'], 'flattened' => \true], 'ObjectVersionStorageClass' => ['type' => 'string', 'enum' => ['STANDARD']], 'OptionalObjectAttributes' => ['type' => 'string', 'enum' => ['RestoreStatus']], 'OptionalObjectAttributesList' => ['type' => 'list', 'member' => ['shape' => 'OptionalObjectAttributes']], 'OutputLocation' => ['type' => 'structure', 'members' => ['S3' => ['shape' => 'S3Location']]], 'OutputSerialization' => ['type' => 'structure', 'members' => ['CSV' => ['shape' => 'CSVOutput'], 'JSON' => ['shape' => 'JSONOutput']]], 'Owner' => ['type' => 'structure', 'members' => ['DisplayName' => ['shape' => 'DisplayName'], 'ID' => ['shape' => 'ID']]], 'OwnerOverride' => ['type' => 'string', 'enum' => ['Destination']], 'OwnershipControls' => ['type' => 'structure', 'required' => ['Rules'], 'members' => ['Rules' => ['shape' => 'OwnershipControlsRules', 'locationName' => 'Rule']]], 'OwnershipControlsRule' => ['type' => 'structure', 'required' => ['ObjectOwnership'], 'members' => ['ObjectOwnership' => ['shape' => 'ObjectOwnership']]], 'OwnershipControlsRules' => ['type' => 'list', 'member' => ['shape' => 'OwnershipControlsRule'], 'flattened' => \true], 'ParquetInput' => ['type' => 'structure', 'members' => []], 'Part' => ['type' => 'structure', 'members' => ['PartNumber' => ['shape' => 'PartNumber'], 'LastModified' => ['shape' => 'LastModified'], 'ETag' => ['shape' => 'ETag'], 'Size' => ['shape' => 'Size'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256']]], 'PartNumber' => ['type' => 'integer'], 'PartNumberMarker' => ['type' => 'integer'], 'Parts' => ['type' => 'list', 'member' => ['shape' => 'Part'], 'flattened' => \true], 'PartsCount' => ['type' => 'integer'], 'PartsList' => ['type' => 'list', 'member' => ['shape' => 'ObjectPart'], 'flattened' => \true], 'Payer' => ['type' => 'string', 'enum' => ['Requester', 'BucketOwner']], 'Permission' => ['type' => 'string', 'enum' => ['FULL_CONTROL', 'WRITE', 'WRITE_ACP', 'READ', 'READ_ACP']], 'Policy' => ['type' => 'string'], 'PolicyStatus' => ['type' => 'structure', 'members' => ['IsPublic' => ['shape' => 'IsPublic', 'locationName' => 'IsPublic']]], 'Prefix' => ['type' => 'string'], 'Priority' => ['type' => 'integer'], 'Progress' => ['type' => 'structure', 'members' => ['BytesScanned' => ['shape' => 'BytesScanned'], 'BytesProcessed' => ['shape' => 'BytesProcessed'], 'BytesReturned' => ['shape' => 'BytesReturned']]], 'ProgressEvent' => ['type' => 'structure', 'members' => ['Details' => ['shape' => 'Progress', 'eventpayload' => \true]], 'event' => \true], 'Protocol' => ['type' => 'string', 'enum' => ['http', 'https']], 'PublicAccessBlockConfiguration' => ['type' => 'structure', 'members' => ['BlockPublicAcls' => ['shape' => 'Setting', 'locationName' => 'BlockPublicAcls'], 'IgnorePublicAcls' => ['shape' => 'Setting', 'locationName' => 'IgnorePublicAcls'], 'BlockPublicPolicy' => ['shape' => 'Setting', 'locationName' => 'BlockPublicPolicy'], 'RestrictPublicBuckets' => ['shape' => 'Setting', 'locationName' => 'RestrictPublicBuckets']]], 'PutBucketAccelerateConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'AccelerateConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'AccelerateConfiguration' => ['shape' => 'AccelerateConfiguration', 'locationName' => 'AccelerateConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm']], 'payload' => 'AccelerateConfiguration'], 'PutBucketAclRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['ACL' => ['shape' => 'BucketCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'AccessControlPolicy' => ['shape' => 'AccessControlPolicy', 'locationName' => 'AccessControlPolicy', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWrite' => ['shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'AccessControlPolicy'], 'PutBucketAnalyticsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id', 'AnalyticsConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'AnalyticsId', 'location' => 'querystring', 'locationName' => 'id'], 'AnalyticsConfiguration' => ['shape' => 'AnalyticsConfiguration', 'locationName' => 'AnalyticsConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'AnalyticsConfiguration'], 'PutBucketCorsRequest' => ['type' => 'structure', 'required' => ['Bucket', 'CORSConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CORSConfiguration' => ['shape' => 'CORSConfiguration', 'locationName' => 'CORSConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'CORSConfiguration'], 'PutBucketEncryptionRequest' => ['type' => 'structure', 'required' => ['Bucket', 'ServerSideEncryptionConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ServerSideEncryptionConfiguration' => ['shape' => 'ServerSideEncryptionConfiguration', 'locationName' => 'ServerSideEncryptionConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'ServerSideEncryptionConfiguration'], 'PutBucketIntelligentTieringConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id', 'IntelligentTieringConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'IntelligentTieringId', 'location' => 'querystring', 'locationName' => 'id'], 'IntelligentTieringConfiguration' => ['shape' => 'IntelligentTieringConfiguration', 'locationName' => 'IntelligentTieringConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']]], 'payload' => 'IntelligentTieringConfiguration'], 'PutBucketInventoryConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id', 'InventoryConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'InventoryId', 'location' => 'querystring', 'locationName' => 'id'], 'InventoryConfiguration' => ['shape' => 'InventoryConfiguration', 'locationName' => 'InventoryConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'InventoryConfiguration'], 'PutBucketLifecycleConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'LifecycleConfiguration' => ['shape' => 'BucketLifecycleConfiguration', 'locationName' => 'LifecycleConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'LifecycleConfiguration'], 'PutBucketLifecycleRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'LifecycleConfiguration' => ['shape' => 'LifecycleConfiguration', 'locationName' => 'LifecycleConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'LifecycleConfiguration'], 'PutBucketLoggingRequest' => ['type' => 'structure', 'required' => ['Bucket', 'BucketLoggingStatus'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'BucketLoggingStatus' => ['shape' => 'BucketLoggingStatus', 'locationName' => 'BucketLoggingStatus', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'BucketLoggingStatus'], 'PutBucketMetricsConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Id', 'MetricsConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Id' => ['shape' => 'MetricsId', 'location' => 'querystring', 'locationName' => 'id'], 'MetricsConfiguration' => ['shape' => 'MetricsConfiguration', 'locationName' => 'MetricsConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'MetricsConfiguration'], 'PutBucketNotificationConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'NotificationConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'NotificationConfiguration' => ['shape' => 'NotificationConfiguration', 'locationName' => 'NotificationConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'SkipDestinationValidation' => ['shape' => 'SkipValidation', 'location' => 'header', 'locationName' => 'x-amz-skip-destination-validation']], 'payload' => 'NotificationConfiguration'], 'PutBucketNotificationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'NotificationConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'NotificationConfiguration' => ['shape' => 'NotificationConfigurationDeprecated', 'locationName' => 'NotificationConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'NotificationConfiguration'], 'PutBucketOwnershipControlsRequest' => ['type' => 'structure', 'required' => ['Bucket', 'OwnershipControls'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'OwnershipControls' => ['shape' => 'OwnershipControls', 'locationName' => 'OwnershipControls', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']]], 'payload' => 'OwnershipControls'], 'PutBucketPolicyRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Policy'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ConfirmRemoveSelfBucketAccess' => ['shape' => 'ConfirmRemoveSelfBucketAccess', 'location' => 'header', 'locationName' => 'x-amz-confirm-remove-self-bucket-access'], 'Policy' => ['shape' => 'Policy'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'Policy'], 'PutBucketReplicationRequest' => ['type' => 'structure', 'required' => ['Bucket', 'ReplicationConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ReplicationConfiguration' => ['shape' => 'ReplicationConfiguration', 'locationName' => 'ReplicationConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'Token' => ['shape' => 'ObjectLockToken', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-token'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'ReplicationConfiguration'], 'PutBucketRequestPaymentRequest' => ['type' => 'structure', 'required' => ['Bucket', 'RequestPaymentConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'RequestPaymentConfiguration' => ['shape' => 'RequestPaymentConfiguration', 'locationName' => 'RequestPaymentConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'RequestPaymentConfiguration'], 'PutBucketTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Tagging'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'Tagging' => ['shape' => 'Tagging', 'locationName' => 'Tagging', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'Tagging'], 'PutBucketVersioningRequest' => ['type' => 'structure', 'required' => ['Bucket', 'VersioningConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'MFA' => ['shape' => 'MFA', 'location' => 'header', 'locationName' => 'x-amz-mfa'], 'VersioningConfiguration' => ['shape' => 'VersioningConfiguration', 'locationName' => 'VersioningConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'VersioningConfiguration'], 'PutBucketWebsiteRequest' => ['type' => 'structure', 'required' => ['Bucket', 'WebsiteConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'WebsiteConfiguration' => ['shape' => 'WebsiteConfiguration', 'locationName' => 'WebsiteConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'WebsiteConfiguration'], 'PutObjectAclOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'PutObjectAclRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['ACL' => ['shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'AccessControlPolicy' => ['shape' => 'AccessControlPolicy', 'locationName' => 'AccessControlPolicy', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWrite' => ['shape' => 'GrantWrite', 'location' => 'header', 'locationName' => 'x-amz-grant-write'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'AccessControlPolicy'], 'PutObjectLegalHoldOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'PutObjectLegalHoldRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'LegalHold' => ['shape' => 'ObjectLockLegalHold', 'locationName' => 'LegalHold', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'LegalHold'], 'PutObjectLockConfigurationOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'PutObjectLockConfigurationRequest' => ['type' => 'structure', 'required' => ['Bucket'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ObjectLockConfiguration' => ['shape' => 'ObjectLockConfiguration', 'locationName' => 'ObjectLockConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'Token' => ['shape' => 'ObjectLockToken', 'location' => 'header', 'locationName' => 'x-amz-bucket-object-lock-token'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'ObjectLockConfiguration'], 'PutObjectOutput' => ['type' => 'structure', 'members' => ['Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-expiration'], 'ETag' => ['shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'PutObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['ACL' => ['shape' => 'ObjectCannedACL', 'location' => 'header', 'locationName' => 'x-amz-acl'], 'Body' => ['shape' => 'Body', 'streaming' => \true], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'Cache-Control'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'Content-Language'], 'ContentLength' => ['shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'Content-Type'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'Expires'], 'GrantFullControl' => ['shape' => 'GrantFullControl', 'location' => 'header', 'locationName' => 'x-amz-grant-full-control'], 'GrantRead' => ['shape' => 'GrantRead', 'location' => 'header', 'locationName' => 'x-amz-grant-read'], 'GrantReadACP' => ['shape' => 'GrantReadACP', 'location' => 'header', 'locationName' => 'x-amz-grant-read-acp'], 'GrantWriteACP' => ['shape' => 'GrantWriteACP', 'location' => 'header', 'locationName' => 'x-amz-grant-write-acp'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-storage-class'], 'WebsiteRedirectLocation' => ['shape' => 'WebsiteRedirectLocation', 'location' => 'header', 'locationName' => 'x-amz-website-redirect-location'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'SSEKMSEncryptionContext' => ['shape' => 'SSEKMSEncryptionContext', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-context'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'Tagging' => ['shape' => 'TaggingHeader', 'location' => 'header', 'locationName' => 'x-amz-tagging'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-object-lock-mode'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-object-lock-retain-until-date'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-object-lock-legal-hold'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'Body'], 'PutObjectRetentionOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'PutObjectRetentionRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'Retention' => ['shape' => 'ObjectLockRetention', 'locationName' => 'Retention', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'BypassGovernanceRetention' => ['shape' => 'BypassGovernanceRetention', 'location' => 'header', 'locationName' => 'x-amz-bypass-governance-retention'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'Retention'], 'PutObjectTaggingOutput' => ['type' => 'structure', 'members' => ['VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-version-id']]], 'PutObjectTaggingRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'Tagging'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'Tagging' => ['shape' => 'Tagging', 'locationName' => 'Tagging', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer']], 'payload' => 'Tagging'], 'PutPublicAccessBlockRequest' => ['type' => 'structure', 'required' => ['Bucket', 'PublicAccessBlockConfiguration'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'PublicAccessBlockConfiguration' => ['shape' => 'PublicAccessBlockConfiguration', 'locationName' => 'PublicAccessBlockConfiguration', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'PublicAccessBlockConfiguration'], 'QueueArn' => ['type' => 'string'], 'QueueConfiguration' => ['type' => 'structure', 'required' => ['QueueArn', 'Events'], 'members' => ['Id' => ['shape' => 'NotificationId'], 'QueueArn' => ['shape' => 'QueueArn', 'locationName' => 'Queue'], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'Filter' => ['shape' => 'NotificationConfigurationFilter']]], 'QueueConfigurationDeprecated' => ['type' => 'structure', 'members' => ['Id' => ['shape' => 'NotificationId'], 'Event' => ['shape' => 'Event', 'deprecated' => \true], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'Queue' => ['shape' => 'QueueArn']]], 'QueueConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'QueueConfiguration'], 'flattened' => \true], 'Quiet' => ['type' => 'boolean'], 'QuoteCharacter' => ['type' => 'string'], 'QuoteEscapeCharacter' => ['type' => 'string'], 'QuoteFields' => ['type' => 'string', 'enum' => ['ALWAYS', 'ASNEEDED']], 'Range' => ['type' => 'string'], 'RecordDelimiter' => ['type' => 'string'], 'RecordsEvent' => ['type' => 'structure', 'members' => ['Payload' => ['shape' => 'Body', 'eventpayload' => \true]], 'event' => \true], 'Redirect' => ['type' => 'structure', 'members' => ['HostName' => ['shape' => 'HostName'], 'HttpRedirectCode' => ['shape' => 'HttpRedirectCode'], 'Protocol' => ['shape' => 'Protocol'], 'ReplaceKeyPrefixWith' => ['shape' => 'ReplaceKeyPrefixWith'], 'ReplaceKeyWith' => ['shape' => 'ReplaceKeyWith']]], 'RedirectAllRequestsTo' => ['type' => 'structure', 'required' => ['HostName'], 'members' => ['HostName' => ['shape' => 'HostName'], 'Protocol' => ['shape' => 'Protocol']]], 'ReplaceKeyPrefixWith' => ['type' => 'string'], 'ReplaceKeyWith' => ['type' => 'string'], 'ReplicaKmsKeyID' => ['type' => 'string'], 'ReplicaModifications' => ['type' => 'structure', 'required' => ['Status'], 'members' => ['Status' => ['shape' => 'ReplicaModificationsStatus']]], 'ReplicaModificationsStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'ReplicationConfiguration' => ['type' => 'structure', 'required' => ['Role', 'Rules'], 'members' => ['Role' => ['shape' => 'Role'], 'Rules' => ['shape' => 'ReplicationRules', 'locationName' => 'Rule']]], 'ReplicationRule' => ['type' => 'structure', 'required' => ['Status', 'Destination'], 'members' => ['ID' => ['shape' => 'ID'], 'Priority' => ['shape' => 'Priority'], 'Prefix' => ['shape' => 'Prefix', 'deprecated' => \true], 'Filter' => ['shape' => 'ReplicationRuleFilter'], 'Status' => ['shape' => 'ReplicationRuleStatus'], 'SourceSelectionCriteria' => ['shape' => 'SourceSelectionCriteria'], 'ExistingObjectReplication' => ['shape' => 'ExistingObjectReplication'], 'Destination' => ['shape' => 'Destination'], 'DeleteMarkerReplication' => ['shape' => 'DeleteMarkerReplication']]], 'ReplicationRuleAndOperator' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tags' => ['shape' => 'TagSet', 'flattened' => \true, 'locationName' => 'Tag']]], 'ReplicationRuleFilter' => ['type' => 'structure', 'members' => ['Prefix' => ['shape' => 'Prefix'], 'Tag' => ['shape' => 'Tag'], 'And' => ['shape' => 'ReplicationRuleAndOperator']]], 'ReplicationRuleStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'ReplicationRules' => ['type' => 'list', 'member' => ['shape' => 'ReplicationRule'], 'flattened' => \true], 'ReplicationStatus' => ['type' => 'string', 'enum' => ['COMPLETE', 'PENDING', 'FAILED', 'REPLICA']], 'ReplicationTime' => ['type' => 'structure', 'required' => ['Status', 'Time'], 'members' => ['Status' => ['shape' => 'ReplicationTimeStatus'], 'Time' => ['shape' => 'ReplicationTimeValue']]], 'ReplicationTimeStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'ReplicationTimeValue' => ['type' => 'structure', 'members' => ['Minutes' => ['shape' => 'Minutes']]], 'RequestCharged' => ['type' => 'string', 'enum' => ['requester']], 'RequestPayer' => ['type' => 'string', 'enum' => ['requester']], 'RequestPaymentConfiguration' => ['type' => 'structure', 'required' => ['Payer'], 'members' => ['Payer' => ['shape' => 'Payer']]], 'RequestProgress' => ['type' => 'structure', 'members' => ['Enabled' => ['shape' => 'EnableRequestProgress']]], 'RequestRoute' => ['type' => 'string'], 'RequestToken' => ['type' => 'string'], 'ResponseCacheControl' => ['type' => 'string'], 'ResponseContentDisposition' => ['type' => 'string'], 'ResponseContentEncoding' => ['type' => 'string'], 'ResponseContentLanguage' => ['type' => 'string'], 'ResponseContentType' => ['type' => 'string'], 'ResponseExpires' => ['type' => 'timestamp', 'timestampFormat' => 'rfc822'], 'Restore' => ['type' => 'string'], 'RestoreExpiryDate' => ['type' => 'timestamp'], 'RestoreObjectOutput' => ['type' => 'structure', 'members' => ['RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged'], 'RestoreOutputPath' => ['shape' => 'RestoreOutputPath', 'location' => 'header', 'locationName' => 'x-amz-restore-output-path']]], 'RestoreObjectRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'querystring', 'locationName' => 'versionId'], 'RestoreRequest' => ['shape' => 'RestoreRequest', 'locationName' => 'RestoreRequest', 'xmlNamespace' => ['uri' => 'http://s3.amazonaws.com/doc/2006-03-01/']], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'RestoreRequest'], 'RestoreOutputPath' => ['type' => 'string'], 'RestoreRequest' => ['type' => 'structure', 'members' => ['Days' => ['shape' => 'Days'], 'GlacierJobParameters' => ['shape' => 'GlacierJobParameters'], 'Type' => ['shape' => 'RestoreRequestType'], 'Tier' => ['shape' => 'Tier'], 'Description' => ['shape' => 'Description'], 'SelectParameters' => ['shape' => 'SelectParameters'], 'OutputLocation' => ['shape' => 'OutputLocation']]], 'RestoreRequestType' => ['type' => 'string', 'enum' => ['SELECT']], 'RestoreStatus' => ['type' => 'structure', 'members' => ['IsRestoreInProgress' => ['shape' => 'IsRestoreInProgress'], 'RestoreExpiryDate' => ['shape' => 'RestoreExpiryDate']]], 'Role' => ['type' => 'string'], 'RoutingRule' => ['type' => 'structure', 'required' => ['Redirect'], 'members' => ['Condition' => ['shape' => 'Condition'], 'Redirect' => ['shape' => 'Redirect']]], 'RoutingRules' => ['type' => 'list', 'member' => ['shape' => 'RoutingRule', 'locationName' => 'RoutingRule']], 'Rule' => ['type' => 'structure', 'required' => ['Prefix', 'Status'], 'members' => ['Expiration' => ['shape' => 'LifecycleExpiration'], 'ID' => ['shape' => 'ID'], 'Prefix' => ['shape' => 'Prefix'], 'Status' => ['shape' => 'ExpirationStatus'], 'Transition' => ['shape' => 'Transition'], 'NoncurrentVersionTransition' => ['shape' => 'NoncurrentVersionTransition'], 'NoncurrentVersionExpiration' => ['shape' => 'NoncurrentVersionExpiration'], 'AbortIncompleteMultipartUpload' => ['shape' => 'AbortIncompleteMultipartUpload']]], 'Rules' => ['type' => 'list', 'member' => ['shape' => 'Rule'], 'flattened' => \true], 'S3KeyFilter' => ['type' => 'structure', 'members' => ['FilterRules' => ['shape' => 'FilterRuleList', 'locationName' => 'FilterRule']]], 'S3Location' => ['type' => 'structure', 'required' => ['BucketName', 'Prefix'], 'members' => ['BucketName' => ['shape' => 'BucketName'], 'Prefix' => ['shape' => 'LocationPrefix'], 'Encryption' => ['shape' => 'Encryption'], 'CannedACL' => ['shape' => 'ObjectCannedACL'], 'AccessControlList' => ['shape' => 'Grants'], 'Tagging' => ['shape' => 'Tagging'], 'UserMetadata' => ['shape' => 'UserMetadata'], 'StorageClass' => ['shape' => 'StorageClass']]], 'SSECustomerAlgorithm' => ['type' => 'string'], 'SSECustomerKey' => ['type' => 'string', 'sensitive' => \true], 'SSECustomerKeyMD5' => ['type' => 'string'], 'SSEKMS' => ['type' => 'structure', 'required' => ['KeyId'], 'members' => ['KeyId' => ['shape' => 'SSEKMSKeyId']], 'locationName' => 'SSE-KMS'], 'SSEKMSEncryptionContext' => ['type' => 'string', 'sensitive' => \true], 'SSEKMSKeyId' => ['type' => 'string', 'sensitive' => \true], 'SSES3' => ['type' => 'structure', 'members' => [], 'locationName' => 'SSE-S3'], 'ScanRange' => ['type' => 'structure', 'members' => ['Start' => ['shape' => 'Start'], 'End' => ['shape' => 'End']]], 'SelectObjectContentEventStream' => ['type' => 'structure', 'members' => ['Records' => ['shape' => 'RecordsEvent'], 'Stats' => ['shape' => 'StatsEvent'], 'Progress' => ['shape' => 'ProgressEvent'], 'Cont' => ['shape' => 'ContinuationEvent'], 'End' => ['shape' => 'EndEvent']], 'eventstream' => \true], 'SelectObjectContentOutput' => ['type' => 'structure', 'members' => ['Payload' => ['shape' => 'SelectObjectContentEventStream']], 'payload' => 'Payload'], 'SelectObjectContentRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'Expression', 'ExpressionType', 'InputSerialization', 'OutputSerialization'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'Expression' => ['shape' => 'Expression'], 'ExpressionType' => ['shape' => 'ExpressionType'], 'RequestProgress' => ['shape' => 'RequestProgress'], 'InputSerialization' => ['shape' => 'InputSerialization'], 'OutputSerialization' => ['shape' => 'OutputSerialization'], 'ScanRange' => ['shape' => 'ScanRange'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']]], 'SelectParameters' => ['type' => 'structure', 'required' => ['InputSerialization', 'ExpressionType', 'Expression', 'OutputSerialization'], 'members' => ['InputSerialization' => ['shape' => 'InputSerialization'], 'ExpressionType' => ['shape' => 'ExpressionType'], 'Expression' => ['shape' => 'Expression'], 'OutputSerialization' => ['shape' => 'OutputSerialization']]], 'ServerSideEncryption' => ['type' => 'string', 'enum' => ['AES256', 'aws:kms', 'aws:kms:dsse']], 'ServerSideEncryptionByDefault' => ['type' => 'structure', 'required' => ['SSEAlgorithm'], 'members' => ['SSEAlgorithm' => ['shape' => 'ServerSideEncryption'], 'KMSMasterKeyID' => ['shape' => 'SSEKMSKeyId']]], 'ServerSideEncryptionConfiguration' => ['type' => 'structure', 'required' => ['Rules'], 'members' => ['Rules' => ['shape' => 'ServerSideEncryptionRules', 'locationName' => 'Rule']]], 'ServerSideEncryptionRule' => ['type' => 'structure', 'members' => ['ApplyServerSideEncryptionByDefault' => ['shape' => 'ServerSideEncryptionByDefault'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled']]], 'ServerSideEncryptionRules' => ['type' => 'list', 'member' => ['shape' => 'ServerSideEncryptionRule'], 'flattened' => \true], 'Setting' => ['type' => 'boolean'], 'Size' => ['type' => 'long'], 'SkipValidation' => ['type' => 'boolean'], 'SourceSelectionCriteria' => ['type' => 'structure', 'members' => ['SseKmsEncryptedObjects' => ['shape' => 'SseKmsEncryptedObjects'], 'ReplicaModifications' => ['shape' => 'ReplicaModifications']]], 'SseKmsEncryptedObjects' => ['type' => 'structure', 'required' => ['Status'], 'members' => ['Status' => ['shape' => 'SseKmsEncryptedObjectsStatus']]], 'SseKmsEncryptedObjectsStatus' => ['type' => 'string', 'enum' => ['Enabled', 'Disabled']], 'Start' => ['type' => 'long'], 'StartAfter' => ['type' => 'string'], 'Stats' => ['type' => 'structure', 'members' => ['BytesScanned' => ['shape' => 'BytesScanned'], 'BytesProcessed' => ['shape' => 'BytesProcessed'], 'BytesReturned' => ['shape' => 'BytesReturned']]], 'StatsEvent' => ['type' => 'structure', 'members' => ['Details' => ['shape' => 'Stats', 'eventpayload' => \true]], 'event' => \true], 'StorageClass' => ['type' => 'string', 'enum' => ['STANDARD', 'REDUCED_REDUNDANCY', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'GLACIER', 'DEEP_ARCHIVE', 'OUTPOSTS', 'GLACIER_IR', 'SNOW']], 'StorageClassAnalysis' => ['type' => 'structure', 'members' => ['DataExport' => ['shape' => 'StorageClassAnalysisDataExport']]], 'StorageClassAnalysisDataExport' => ['type' => 'structure', 'required' => ['OutputSchemaVersion', 'Destination'], 'members' => ['OutputSchemaVersion' => ['shape' => 'StorageClassAnalysisSchemaVersion'], 'Destination' => ['shape' => 'AnalyticsExportDestination']]], 'StorageClassAnalysisSchemaVersion' => ['type' => 'string', 'enum' => ['V_1']], 'Suffix' => ['type' => 'string'], 'Tag' => ['type' => 'structure', 'required' => ['Key', 'Value'], 'members' => ['Key' => ['shape' => 'ObjectKey'], 'Value' => ['shape' => 'Value']]], 'TagCount' => ['type' => 'integer'], 'TagSet' => ['type' => 'list', 'member' => ['shape' => 'Tag', 'locationName' => 'Tag']], 'Tagging' => ['type' => 'structure', 'required' => ['TagSet'], 'members' => ['TagSet' => ['shape' => 'TagSet']]], 'TaggingDirective' => ['type' => 'string', 'enum' => ['COPY', 'REPLACE']], 'TaggingHeader' => ['type' => 'string'], 'TargetBucket' => ['type' => 'string'], 'TargetGrant' => ['type' => 'structure', 'members' => ['Grantee' => ['shape' => 'Grantee'], 'Permission' => ['shape' => 'BucketLogsPermission']]], 'TargetGrants' => ['type' => 'list', 'member' => ['shape' => 'TargetGrant', 'locationName' => 'Grant']], 'TargetPrefix' => ['type' => 'string'], 'Tier' => ['type' => 'string', 'enum' => ['Standard', 'Bulk', 'Expedited']], 'Tiering' => ['type' => 'structure', 'required' => ['Days', 'AccessTier'], 'members' => ['Days' => ['shape' => 'IntelligentTieringDays'], 'AccessTier' => ['shape' => 'IntelligentTieringAccessTier']]], 'TieringList' => ['type' => 'list', 'member' => ['shape' => 'Tiering'], 'flattened' => \true], 'Token' => ['type' => 'string'], 'TopicArn' => ['type' => 'string'], 'TopicConfiguration' => ['type' => 'structure', 'required' => ['TopicArn', 'Events'], 'members' => ['Id' => ['shape' => 'NotificationId'], 'TopicArn' => ['shape' => 'TopicArn', 'locationName' => 'Topic'], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'Filter' => ['shape' => 'NotificationConfigurationFilter']]], 'TopicConfigurationDeprecated' => ['type' => 'structure', 'members' => ['Id' => ['shape' => 'NotificationId'], 'Events' => ['shape' => 'EventList', 'locationName' => 'Event'], 'Event' => ['shape' => 'Event', 'deprecated' => \true], 'Topic' => ['shape' => 'TopicArn']]], 'TopicConfigurationList' => ['type' => 'list', 'member' => ['shape' => 'TopicConfiguration'], 'flattened' => \true], 'Transition' => ['type' => 'structure', 'members' => ['Date' => ['shape' => 'Date'], 'Days' => ['shape' => 'Days'], 'StorageClass' => ['shape' => 'TransitionStorageClass']]], 'TransitionList' => ['type' => 'list', 'member' => ['shape' => 'Transition'], 'flattened' => \true], 'TransitionStorageClass' => ['type' => 'string', 'enum' => ['GLACIER', 'STANDARD_IA', 'ONEZONE_IA', 'INTELLIGENT_TIERING', 'DEEP_ARCHIVE', 'GLACIER_IR']], 'Type' => ['type' => 'string', 'enum' => ['CanonicalUser', 'AmazonCustomerByEmail', 'Group']], 'URI' => ['type' => 'string'], 'UploadIdMarker' => ['type' => 'string'], 'UploadPartCopyOutput' => ['type' => 'structure', 'members' => ['CopySourceVersionId' => ['shape' => 'CopySourceVersionId', 'location' => 'header', 'locationName' => 'x-amz-copy-source-version-id'], 'CopyPartResult' => ['shape' => 'CopyPartResult'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']], 'payload' => 'CopyPartResult'], 'UploadPartCopyRequest' => ['type' => 'structure', 'required' => ['Bucket', 'CopySource', 'Key', 'PartNumber', 'UploadId'], 'members' => ['Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'CopySource' => ['shape' => 'CopySource', 'location' => 'header', 'locationName' => 'x-amz-copy-source'], 'CopySourceIfMatch' => ['shape' => 'CopySourceIfMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-match'], 'CopySourceIfModifiedSince' => ['shape' => 'CopySourceIfModifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-modified-since'], 'CopySourceIfNoneMatch' => ['shape' => 'CopySourceIfNoneMatch', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-none-match'], 'CopySourceIfUnmodifiedSince' => ['shape' => 'CopySourceIfUnmodifiedSince', 'location' => 'header', 'locationName' => 'x-amz-copy-source-if-unmodified-since'], 'CopySourceRange' => ['shape' => 'CopySourceRange', 'location' => 'header', 'locationName' => 'x-amz-copy-source-range'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'PartNumber' => ['shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber'], 'UploadId' => ['shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'CopySourceSSECustomerAlgorithm' => ['shape' => 'CopySourceSSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-algorithm'], 'CopySourceSSECustomerKey' => ['shape' => 'CopySourceSSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key'], 'CopySourceSSECustomerKeyMD5' => ['shape' => 'CopySourceSSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner'], 'ExpectedSourceBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-source-expected-bucket-owner']]], 'UploadPartOutput' => ['type' => 'structure', 'members' => ['ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption'], 'ETag' => ['shape' => 'ETag', 'location' => 'header', 'locationName' => 'ETag'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-aws-kms-key-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-bucket-key-enabled'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-request-charged']]], 'UploadPartRequest' => ['type' => 'structure', 'required' => ['Bucket', 'Key', 'PartNumber', 'UploadId'], 'members' => ['Body' => ['shape' => 'Body', 'streaming' => \true], 'Bucket' => ['shape' => 'BucketName', 'contextParam' => ['name' => 'Bucket'], 'location' => 'uri', 'locationName' => 'Bucket'], 'ContentLength' => ['shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length'], 'ContentMD5' => ['shape' => 'ContentMD5', 'location' => 'header', 'locationName' => 'Content-MD5'], 'ChecksumAlgorithm' => ['shape' => 'ChecksumAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-sdk-checksum-algorithm'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-checksum-sha256'], 'Key' => ['shape' => 'ObjectKey', 'location' => 'uri', 'locationName' => 'Key'], 'PartNumber' => ['shape' => 'PartNumber', 'location' => 'querystring', 'locationName' => 'partNumber'], 'UploadId' => ['shape' => 'MultipartUploadId', 'location' => 'querystring', 'locationName' => 'uploadId'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-algorithm'], 'SSECustomerKey' => ['shape' => 'SSECustomerKey', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-server-side-encryption-customer-key-MD5'], 'RequestPayer' => ['shape' => 'RequestPayer', 'location' => 'header', 'locationName' => 'x-amz-request-payer'], 'ExpectedBucketOwner' => ['shape' => 'AccountId', 'location' => 'header', 'locationName' => 'x-amz-expected-bucket-owner']], 'payload' => 'Body'], 'UserMetadata' => ['type' => 'list', 'member' => ['shape' => 'MetadataEntry', 'locationName' => 'MetadataEntry']], 'Value' => ['type' => 'string'], 'VersionCount' => ['type' => 'integer'], 'VersionIdMarker' => ['type' => 'string'], 'VersioningConfiguration' => ['type' => 'structure', 'members' => ['MFADelete' => ['shape' => 'MFADelete', 'locationName' => 'MfaDelete'], 'Status' => ['shape' => 'BucketVersioningStatus']]], 'WebsiteConfiguration' => ['type' => 'structure', 'members' => ['ErrorDocument' => ['shape' => 'ErrorDocument'], 'IndexDocument' => ['shape' => 'IndexDocument'], 'RedirectAllRequestsTo' => ['shape' => 'RedirectAllRequestsTo'], 'RoutingRules' => ['shape' => 'RoutingRules']]], 'WebsiteRedirectLocation' => ['type' => 'string'], 'WriteGetObjectResponseRequest' => ['type' => 'structure', 'required' => ['RequestRoute', 'RequestToken'], 'members' => ['RequestRoute' => ['shape' => 'RequestRoute', 'hostLabel' => \true, 'location' => 'header', 'locationName' => 'x-amz-request-route'], 'RequestToken' => ['shape' => 'RequestToken', 'location' => 'header', 'locationName' => 'x-amz-request-token'], 'Body' => ['shape' => 'Body', 'streaming' => \true], 'StatusCode' => ['shape' => 'GetObjectResponseStatusCode', 'location' => 'header', 'locationName' => 'x-amz-fwd-status'], 'ErrorCode' => ['shape' => 'ErrorCode', 'location' => 'header', 'locationName' => 'x-amz-fwd-error-code'], 'ErrorMessage' => ['shape' => 'ErrorMessage', 'location' => 'header', 'locationName' => 'x-amz-fwd-error-message'], 'AcceptRanges' => ['shape' => 'AcceptRanges', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-accept-ranges'], 'CacheControl' => ['shape' => 'CacheControl', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Cache-Control'], 'ContentDisposition' => ['shape' => 'ContentDisposition', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Disposition'], 'ContentEncoding' => ['shape' => 'ContentEncoding', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Encoding'], 'ContentLanguage' => ['shape' => 'ContentLanguage', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Language'], 'ContentLength' => ['shape' => 'ContentLength', 'location' => 'header', 'locationName' => 'Content-Length'], 'ContentRange' => ['shape' => 'ContentRange', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Range'], 'ContentType' => ['shape' => 'ContentType', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Content-Type'], 'ChecksumCRC32' => ['shape' => 'ChecksumCRC32', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-crc32'], 'ChecksumCRC32C' => ['shape' => 'ChecksumCRC32C', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-crc32c'], 'ChecksumSHA1' => ['shape' => 'ChecksumSHA1', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-sha1'], 'ChecksumSHA256' => ['shape' => 'ChecksumSHA256', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-checksum-sha256'], 'DeleteMarker' => ['shape' => 'DeleteMarker', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-delete-marker'], 'ETag' => ['shape' => 'ETag', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-ETag'], 'Expires' => ['shape' => 'Expires', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Expires'], 'Expiration' => ['shape' => 'Expiration', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-expiration'], 'LastModified' => ['shape' => 'LastModified', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-Last-Modified'], 'MissingMeta' => ['shape' => 'MissingMeta', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-missing-meta'], 'Metadata' => ['shape' => 'Metadata', 'location' => 'headers', 'locationName' => 'x-amz-meta-'], 'ObjectLockMode' => ['shape' => 'ObjectLockMode', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-mode'], 'ObjectLockLegalHoldStatus' => ['shape' => 'ObjectLockLegalHoldStatus', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-legal-hold'], 'ObjectLockRetainUntilDate' => ['shape' => 'ObjectLockRetainUntilDate', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-object-lock-retain-until-date'], 'PartsCount' => ['shape' => 'PartsCount', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-mp-parts-count'], 'ReplicationStatus' => ['shape' => 'ReplicationStatus', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-replication-status'], 'RequestCharged' => ['shape' => 'RequestCharged', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-request-charged'], 'Restore' => ['shape' => 'Restore', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-restore'], 'ServerSideEncryption' => ['shape' => 'ServerSideEncryption', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption'], 'SSECustomerAlgorithm' => ['shape' => 'SSECustomerAlgorithm', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-customer-algorithm'], 'SSEKMSKeyId' => ['shape' => 'SSEKMSKeyId', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id'], 'SSECustomerKeyMD5' => ['shape' => 'SSECustomerKeyMD5', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-customer-key-MD5'], 'StorageClass' => ['shape' => 'StorageClass', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-storage-class'], 'TagCount' => ['shape' => 'TagCount', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-tagging-count'], 'VersionId' => ['shape' => 'ObjectVersionId', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-version-id'], 'BucketKeyEnabled' => ['shape' => 'BucketKeyEnabled', 'location' => 'header', 'locationName' => 'x-amz-fwd-header-x-amz-server-side-encryption-bucket-key-enabled']], 'payload' => 'Body'], 'Years' => ['type' => 'integer']], 'clientContextParams' => ['Accelerate' => ['documentation' => 'Enables this client to use S3 Transfer Acceleration endpoints.', 'type' => 'boolean'], 'DisableMultiRegionAccessPoints' => ['documentation' => 'Disables this client\'s usage of Multi-Region Access Points.', 'type' => 'boolean'], 'ForcePathStyle' => ['documentation' => 'Forces this client to use path-style addressing for buckets.', 'type' => 'boolean'], 'UseArnRegion' => ['documentation' => 'Enables this client to use an ARN\'s region when constructing an endpoint instead of the client\'s configured region.', 'type' => 'boolean']]]; addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/paginators-1.json.php000064400000002361147600374260025661 0ustar00 ['ListBuckets' => ['result_key' => 'Buckets'], 'ListMultipartUploads' => ['input_token' => ['KeyMarker', 'UploadIdMarker'], 'limit_key' => 'MaxUploads', 'more_results' => 'IsTruncated', 'output_token' => ['NextKeyMarker', 'NextUploadIdMarker'], 'result_key' => ['Uploads', 'CommonPrefixes']], 'ListObjectVersions' => ['input_token' => ['KeyMarker', 'VersionIdMarker'], 'limit_key' => 'MaxKeys', 'more_results' => 'IsTruncated', 'output_token' => ['NextKeyMarker', 'NextVersionIdMarker'], 'result_key' => ['Versions', 'DeleteMarkers', 'CommonPrefixes']], 'ListObjects' => ['input_token' => 'Marker', 'limit_key' => 'MaxKeys', 'more_results' => 'IsTruncated', 'output_token' => 'NextMarker || Contents[-1].Key', 'result_key' => ['Contents', 'CommonPrefixes']], 'ListObjectsV2' => ['input_token' => 'ContinuationToken', 'limit_key' => 'MaxKeys', 'output_token' => 'NextContinuationToken', 'result_key' => ['Contents', 'CommonPrefixes']], 'ListParts' => ['input_token' => 'PartNumberMarker', 'limit_key' => 'MaxParts', 'more_results' => 'IsTruncated', 'output_token' => 'NextPartNumberMarker', 'result_key' => 'Parts']]]; addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-2.json.php000064400000002110147600374260025161 0ustar00;;; 2, 'waiters' => ['BucketExists' => ['delay' => 5, 'operation' => 'HeadBucket', 'maxAttempts' => 20, 'acceptors' => [['expected' => 200, 'matcher' => 'status', 'state' => 'success'], ['expected' => 301, 'matcher' => 'status', 'state' => 'success'], ['expected' => 403, 'matcher' => 'status', 'state' => 'success'], ['expected' => 404, 'matcher' => 'status', 'state' => 'retry']]], 'BucketNotExists' => ['delay' => 5, 'operation' => 'HeadBucket', 'maxAttempts' => 20, 'acceptors' => [['expected' => 404, 'matcher' => 'status', 'state' => 'success']]], 'ObjectExists' => ['delay' => 5, 'operation' => 'HeadObject', 'maxAttempts' => 20, 'acceptors' => [['expected' => 200, 'matcher' => 'status', 'state' => 'success'], ['expected' => 404, 'matcher' => 'status', 'state' => 'retry']]], 'ObjectNotExists' => ['delay' => 5, 'operation' => 'HeadObject', 'maxAttempts' => 20, 'acceptors' => [['expected' => 404, 'matcher' => 'status', 'state' => 'success']]]]];amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/endpoint-rule-set-1.json.php000064400000411250147600374260027012 0ustar00addons;;; '1.0', 'parameters' => [ 'Bucket' => [ 'required' => false, 'documentation' => 'The S3 bucket used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 bucket.', 'type' => 'String', ], 'Region' => [ 'builtIn' => 'AWS::Region', 'required' => false, 'documentation' => 'The AWS region used to dispatch the request.', 'type' => 'String', ], 'UseFIPS' => [ 'builtIn' => 'AWS::UseFIPS', 'required' => true, 'default' => false, 'documentation' => 'When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.', 'type' => 'Boolean', ], 'UseDualStack' => [ 'builtIn' => 'AWS::UseDualStack', 'required' => true, 'default' => false, 'documentation' => 'When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.', 'type' => 'Boolean', ], 'Endpoint' => [ 'builtIn' => 'SDK::Endpoint', 'required' => false, 'documentation' => 'Override the endpoint used to send this request', 'type' => 'String', ], 'ForcePathStyle' => [ 'builtIn' => 'AWS::S3::ForcePathStyle', 'required' => false, 'documentation' => 'When true, force a path-style endpoint to be used where the bucket name is part of the path.', 'type' => 'Boolean', ], 'Accelerate' => [ 'builtIn' => 'AWS::S3::Accelerate', 'required' => true, 'default' => false, 'documentation' => 'When true, use S3 Accelerate. NOTE: Not all regions support S3 accelerate.', 'type' => 'Boolean', ], 'UseGlobalEndpoint' => [ 'builtIn' => 'AWS::S3::UseGlobalEndpoint', 'required' => true, 'default' => false, 'documentation' => 'Whether the global endpoint should be used, rather then the regional endpoint for us-east-1.', 'type' => 'Boolean', ], 'UseObjectLambdaEndpoint' => [ 'required' => false, 'documentation' => 'Internal parameter to use object lambda endpoint for an operation (eg: WriteGetObjectResponse)', 'type' => 'Boolean', ], 'DisableAccessPoints' => [ 'required' => false, 'documentation' => 'Internal parameter to disable Access Point Buckets', 'type' => 'Boolean', ], 'DisableMultiRegionAccessPoints' => [ 'builtIn' => 'AWS::S3::DisableMultiRegionAccessPoints', 'required' => true, 'default' => false, 'documentation' => 'Whether multi-region access points (MRAP) should be disabled.', 'type' => 'Boolean', ], 'UseArnRegion' => [ 'builtIn' => 'AWS::S3::UseArnRegion', 'required' => false, 'documentation' => 'When an Access Point ARN is provided and this flag is enabled, the SDK MUST use the ARN\'s region when constructing the endpoint instead of the client\'s configured region.', 'type' => 'Boolean', ], ], 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Region', ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 49, 50, true, ], 'assign' => 'hardwareType', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 8, 12, true, ], 'assign' => 'regionPrefix', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 7, true, ], 'assign' => 'abbaSuffix', ], [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 32, 49, true, ], 'assign' => 'outpostId', ], [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'regionPartition', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'abbaSuffix', ], '--op-s3', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'outpostId', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'hardwareType', ], 'e', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'regionPrefix', ], 'beta', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], 'error' => 'Expected a endpoint to be specified but no endpoint was found', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.ec2.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.ec2.s3-outposts.{Region}.{regionPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'hardwareType', ], 'o', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'regionPrefix', ], 'beta', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], 'error' => 'Expected a endpoint to be specified but no endpoint was found', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.op-{outpostId}.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.op-{outpostId}.s3-outposts.{Region}.{regionPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [], 'error' => 'Unrecognized hardware type: "Expected hardware type o or e but got {hardwareType}"', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], ], ], ], 'error' => 'Custom endpoint `{Endpoint}` was not a valid URI', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'ForcePathStyle', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], 'error' => 'Path-style addressing cannot be used with ARN buckets', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'error' => 'Cannot set dual-stack in combination with a custom endpoint.', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Path-style addressing cannot be used with S3 Accelerate', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], ], ], ], ], [ 'conditions' => [ [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Accelerate cannot be used with FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'S3 Accelerate cannot be used in this region', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'Host override cannot be combined with Dualstack, FIPS, or S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'isIp', ], ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{Bucket}.s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], ], ], ], ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'url', ], 'scheme', ], ], 'http', ], ], [ 'fn' => 'aws.isVirtualHostableS3Bucket', 'argv' => [ [ 'ref' => 'Bucket', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{Bucket}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'bucketArn', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[0]', ], 'assign' => 'arnType', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3-object-lambda', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'accessPointName', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'accessPointName', ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], true, ], ], ], 'error' => 'Access points are not supported for this operation', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], ], ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], '', ], ], ], 'error' => 'Invalid ARN: Missing account id', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-object-lambda.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Could not load partition for ARN region `{bucketArn#region}`', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: bucket ARN is missing a region', 'type' => 'error', ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'accessPointName', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'accessPointName', ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnType', ], 'accesspoint', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableAccessPoints', ], true, ], ], ], 'error' => 'Access points are not supported for this operation', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], ], ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], '{partitionResult#name}', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'Access Points do not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'error' => 'DualStack cannot be combined with a Host override (PrivateLink)', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint-fips.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.dualstack.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{accessPointName}-{bucketArn#accountId}.{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.s3-accesspoint.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Could not load partition for ARN region `{bucketArn#region}`', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: bucket ARN is missing a region', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'accessPointName', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 MRAP does not support dual-stack', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'S3 MRAP does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 MRAP does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'DisableMultiRegionAccessPoints', ], true, ], ], ], 'error' => 'Invalid configuration: Multi-Region Access Point ARNs are disabled.', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'mrapPartition', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'mrapPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'partition', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}.accesspoint.s3-global.{mrapPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4a', 'signingName' => 's3', 'signingRegionSet' => [ '*', ], ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{mrapPartition#name}` but bucket referred to partition `{bucketArn#partition}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => '{Region} was not a valid region', 'type' => 'error', ], ], ], ], ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid Access Point Name', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a resource of the format `accesspoint:` but no name was provided', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'service', ], ], 's3-outposts', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Outposts does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'error' => 'S3 Outposts does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Outposts does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[4]', ], ], ], ], ], 'error' => 'Invalid Arn: Outpost Access Point ARN contains sub resources', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[1]', ], 'assign' => 'outpostId', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'outpostId', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseArnRegion', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseArnRegion', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], '{Region}', ], ], ], ], ], 'error' => 'Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], ], 'assign' => 'bucketPartition', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketPartition', ], 'name', ], ], [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'region', ], ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'accountId', ], ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[2]', ], 'assign' => 'outpostType', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'bucketArn', ], 'resourceId[3]', ], 'assign' => 'accessPointName', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'outpostType', ], 'accesspoint', ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.{outpostId}.{url#authority}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://{accessPointName}-{bucketArn#accountId}.{outpostId}.s3-outposts.{bucketArn#region}.{bucketPartition#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-outposts', 'signingRegion' => '{bucketArn#region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Expected an outpost type `accesspoint`, found {outpostType}', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: expected an access point name', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: Expected a 4-component resource', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Could not load partition for ARN region {bucketArn#region}', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId}`', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: The Outpost Id was not set', 'type' => 'error', ], ], ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid ARN: No ARN type specified', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'substring', 'argv' => [ [ 'ref' => 'Bucket', ], 0, 4, false, ], 'assign' => 'arnPrefix', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'arnPrefix', ], 'arn:', ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'fn' => 'aws.parseArn', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], ], ], ], ], 'error' => 'Invalid ARN: `{Bucket}` was not a valid ARN', 'type' => 'error', ], [ 'conditions' => [ [ 'fn' => 'uriEncode', 'argv' => [ [ 'ref' => 'Bucket', ], ], 'assign' => 'uri_encoded_bucket', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], 'error' => 'Cannot set dual-stack in combination with a custom endpoint.', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], false, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], [ 'conditions' => [], 'error' => 'Path-style addressing cannot be used with S3 Accelerate', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], ], ], ], ], [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'UseObjectLambdaEndpoint', ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseObjectLambdaEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support Dual-stack', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'Accelerate', ], true, ], ], ], 'error' => 'S3 Object Lambda does not support S3 Accelerate', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], ], 'endpoint' => [ 'url' => 'https://s3-object-lambda-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-object-lambda.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3-object-lambda', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], [ 'conditions' => [ [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Bucket', ], ], ], ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'aws.partition', 'argv' => [ [ 'ref' => 'Region', ], ], 'assign' => 'partitionResult', ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'isValidHostLabel', 'argv' => [ [ 'ref' => 'Region', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'fn' => 'getAttr', 'argv' => [ [ 'ref' => 'partitionResult', ], 'name', ], ], 'aws-cn', ], ], ], 'error' => 'Partition does not support FIPS', 'type' => 'error', ], [ 'conditions' => [], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], true, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3-fips.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.us-east-1.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], true, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.dualstack.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], [ 'fn' => 'parseURL', 'argv' => [ [ 'ref' => 'Endpoint', ], ], 'assign' => 'url', ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => '{url#scheme}://{url#authority}{url#path}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => 'us-east-1', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], true, ], ], ], 'type' => 'tree', 'rules' => [ [ 'conditions' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'us-east-1', ], ], ], 'endpoint' => [ 'url' => 'https://s3.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], [ 'conditions' => [], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], [ 'conditions' => [ [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseFIPS', ], false, ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseDualStack', ], false, ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'isSet', 'argv' => [ [ 'ref' => 'Endpoint', ], ], ], ], ], [ 'fn' => 'not', 'argv' => [ [ 'fn' => 'stringEquals', 'argv' => [ [ 'ref' => 'Region', ], 'aws-global', ], ], ], ], [ 'fn' => 'booleanEquals', 'argv' => [ [ 'ref' => 'UseGlobalEndpoint', ], false, ], ], ], 'endpoint' => [ 'url' => 'https://s3.{Region}.{partitionResult#dnsSuffix}', 'properties' => [ 'authSchemes' => [ [ 'disableDoubleEncoding' => true, 'name' => 'sigv4', 'signingName' => 's3', 'signingRegion' => '{Region}', ], ], ], 'headers' => [], ], 'type' => 'endpoint', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'Invalid region: region was not a valid DNS name.', 'type' => 'error', ], ], ], ], ], [ 'conditions' => [], 'error' => 'A valid partition could not be determined', 'type' => 'error', ], ], ], ], ], ], ], [ 'conditions' => [], 'error' => 'A region must be set when sending requests to S3.', 'type' => 'error', ], ], ], ],];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/waiters-1.json.php000064400000001216147600374260025166 0ustar00;;; ['__default__' => ['interval' => 5, 'max_attempts' => 20], 'BucketExists' => ['operation' => 'HeadBucket', 'ignore_errors' => ['NoSuchBucket'], 'success_type' => 'output'], 'BucketNotExists' => ['operation' => 'HeadBucket', 'success_type' => 'error', 'success_value' => 'NoSuchBucket'], 'ObjectExists' => ['operation' => 'HeadObject', 'ignore_errors' => ['NoSuchKey'], 'success_type' => 'output'], 'ObjectNotExists' => ['operation' => 'HeadObject', 'success_type' => 'error', 'success_value' => 'NoSuchKey']]];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/s3/2006-03-01/smoke.json.php000064400000000431147600374260024466 0ustar00;;; 1, 'defaultRegion' => 'us-west-2', 'testCases' => [['operationName' => 'ListBuckets', 'input' => [], 'errorExpectedFromService' => \false]]];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/endpoints.json.php000064400001665407147600374260024026 0ustar00;;; [['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']], ['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'api.aws', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'dnsSuffix' => 'amazonaws.com', 'partition' => 'aws', 'partitionName' => 'AWS Standard', 'regionRegex' => '^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$', 'regions' => ['af-south-1' => ['description' => 'Africa (Cape Town)'], 'ap-east-1' => ['description' => 'Asia Pacific (Hong Kong)'], 'ap-northeast-1' => ['description' => 'Asia Pacific (Tokyo)'], 'ap-northeast-2' => ['description' => 'Asia Pacific (Seoul)'], 'ap-northeast-3' => ['description' => 'Asia Pacific (Osaka)'], 'ap-south-1' => ['description' => 'Asia Pacific (Mumbai)'], 'ap-south-2' => ['description' => 'Asia Pacific (Hyderabad)'], 'ap-southeast-1' => ['description' => 'Asia Pacific (Singapore)'], 'ap-southeast-2' => ['description' => 'Asia Pacific (Sydney)'], 'ap-southeast-3' => ['description' => 'Asia Pacific (Jakarta)'], 'ap-southeast-4' => ['description' => 'Asia Pacific (Melbourne)'], 'ca-central-1' => ['description' => 'Canada (Central)'], 'eu-central-1' => ['description' => 'Europe (Frankfurt)'], 'eu-central-2' => ['description' => 'Europe (Zurich)'], 'eu-north-1' => ['description' => 'Europe (Stockholm)'], 'eu-south-1' => ['description' => 'Europe (Milan)'], 'eu-south-2' => ['description' => 'Europe (Spain)'], 'eu-west-1' => ['description' => 'Europe (Ireland)'], 'eu-west-2' => ['description' => 'Europe (London)'], 'eu-west-3' => ['description' => 'Europe (Paris)'], 'il-central-1' => ['description' => 'Israel (Tel Aviv)'], 'me-central-1' => ['description' => 'Middle East (UAE)'], 'me-south-1' => ['description' => 'Middle East (Bahrain)'], 'sa-east-1' => ['description' => 'South America (Sao Paulo)'], 'us-east-1' => ['description' => 'US East (N. Virginia)'], 'us-east-2' => ['description' => 'US East (Ohio)'], 'us-west-1' => ['description' => 'US West (N. California)'], 'us-west-2' => ['description' => 'US West (Oregon)']], 'services' => ['a4b' => ['endpoints' => ['us-east-1' => []]], 'access-analyzer' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'access-analyzer-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'access-analyzer-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'access-analyzer-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'access-analyzer-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'access-analyzer-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'access-analyzer-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'access-analyzer-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'access-analyzer-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'access-analyzer-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'access-analyzer-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'account' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'account.us-east-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'acm' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'acm-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'acm-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'acm-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'acm-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'acm-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'acm-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'acm-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'acm-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'acm-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'acm-fips.us-west-2.amazonaws.com']]], 'acm-pca' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'acm-pca-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'acm-pca-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'acm-pca-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'acm-pca-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'acm-pca-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'acm-pca-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'acm-pca-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'acm-pca-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'acm-pca-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'acm-pca-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'airflow' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'amplify' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'amplifybackend' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'amplifyuibuilder' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'aoss' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'api.detective' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'api.detective-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'api.detective-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'api.detective-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'api.detective-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-west-2.amazonaws.com']]], 'api.ecr' => ['defaults' => ['variants' => [['hostname' => 'ecr-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'api.ecr.af-south-1.amazonaws.com'], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'api.ecr.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'api.ecr.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'api.ecr.ap-northeast-2.amazonaws.com'], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'api.ecr.ap-northeast-3.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'api.ecr.ap-south-1.amazonaws.com'], 'ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'hostname' => 'api.ecr.ap-south-2.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'api.ecr.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'api.ecr.ap-southeast-2.amazonaws.com'], 'ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'hostname' => 'api.ecr.ap-southeast-3.amazonaws.com'], 'ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'hostname' => 'api.ecr.ap-southeast-4.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'api.ecr.ca-central-1.amazonaws.com'], 'dkr-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'dkr-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'dkr-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'dkr-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'api.ecr.eu-central-1.amazonaws.com'], 'eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'hostname' => 'api.ecr.eu-central-2.amazonaws.com'], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'api.ecr.eu-north-1.amazonaws.com'], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'api.ecr.eu-south-1.amazonaws.com'], 'eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'hostname' => 'api.ecr.eu-south-2.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'api.ecr.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'api.ecr.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'api.ecr.eu-west-3.amazonaws.com'], 'fips-dkr-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-east-1.amazonaws.com'], 'fips-dkr-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-east-2.amazonaws.com'], 'fips-dkr-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-west-1.amazonaws.com'], 'fips-dkr-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-west-2.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'hostname' => 'api.ecr.il-central-1.amazonaws.com'], 'me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'hostname' => 'api.ecr.me-central-1.amazonaws.com'], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'api.ecr.me-south-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'api.ecr.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.ecr.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'api.ecr.us-east-2.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'api.ecr.us-west-1.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.ecr.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'api.ecr-public' => ['endpoints' => ['us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.ecr-public.us-east-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.ecr-public.us-west-2.amazonaws.com']]], 'api.elastic-inference' => ['endpoints' => ['ap-northeast-1' => ['hostname' => 'api.elastic-inference.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['hostname' => 'api.elastic-inference.ap-northeast-2.amazonaws.com'], 'eu-west-1' => ['hostname' => 'api.elastic-inference.eu-west-1.amazonaws.com'], 'us-east-1' => ['hostname' => 'api.elastic-inference.us-east-1.amazonaws.com'], 'us-east-2' => ['hostname' => 'api.elastic-inference.us-east-2.amazonaws.com'], 'us-west-2' => ['hostname' => 'api.elastic-inference.us-west-2.amazonaws.com']]], 'api.fleethub.iot' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'api.fleethub.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'api.fleethub.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'api.fleethub.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'api.fleethub.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'api.fleethub.iot-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'api.fleethub.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'api.fleethub.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'api.fleethub.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'api.iotdeviceadvisor' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'api.iotdeviceadvisor.ap-northeast-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'api.iotdeviceadvisor.eu-west-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.iotdeviceadvisor.us-east-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.iotdeviceadvisor.us-west-2.amazonaws.com']]], 'api.iotwireless' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'api.iotwireless.ap-northeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'api.iotwireless.ap-southeast-2.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'api.iotwireless.eu-central-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'api.iotwireless.eu-west-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'api.iotwireless.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.iotwireless.us-east-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.iotwireless.us-west-2.amazonaws.com']]], 'api.mediatailor' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'api.pricing' => ['defaults' => ['credentialScope' => ['service' => 'pricing']], 'endpoints' => ['ap-south-1' => [], 'eu-central-1' => [], 'us-east-1' => []]], 'api.sagemaker' => ['defaults' => ['variants' => [['hostname' => 'api-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'api-fips.sagemaker.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'api-fips.sagemaker.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'api-fips.sagemaker.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'api-fips.sagemaker.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'api-fips.sagemaker.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'api-fips.sagemaker.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'api-fips.sagemaker.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'api-fips.sagemaker.us-west-2.amazonaws.com']]], 'api.tunneling.iot' => ['defaults' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'apigateway' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'apigateway-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'apigateway-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'apigateway-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'apigateway-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'apigateway-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'apigateway-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'apigateway-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'apigateway-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'apigateway-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'apigateway-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'app-integrations' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'appconfig' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'appconfigdata' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'appflow' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'application-autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'applicationinsights' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'appmesh' => ['endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'appmesh.af-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-east-1' => ['variants' => [['hostname' => 'appmesh.ap-east-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'appmesh.ap-northeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'appmesh.ap-northeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'appmesh.ap-northeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-south-1' => ['variants' => [['hostname' => 'appmesh.ap-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'appmesh.ap-southeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'appmesh.ap-southeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 'appmesh.ap-southeast-3.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1' => ['variants' => [['hostname' => 'appmesh-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'appmesh-fips.ca-central-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'appmesh.ca-central-1.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'appmesh-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => ['variants' => [['hostname' => 'appmesh.eu-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-north-1' => ['variants' => [['hostname' => 'appmesh.eu-north-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-1' => ['variants' => [['hostname' => 'appmesh.eu-south-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-1' => ['variants' => [['hostname' => 'appmesh.eu-west-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-2' => ['variants' => [['hostname' => 'appmesh.eu-west-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-3' => ['variants' => [['hostname' => 'appmesh.eu-west-3.api.aws', 'tags' => ['dualstack']]]], 'me-south-1' => ['variants' => [['hostname' => 'appmesh.me-south-1.api.aws', 'tags' => ['dualstack']]]], 'sa-east-1' => ['variants' => [['hostname' => 'appmesh.sa-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1' => ['variants' => [['hostname' => 'appmesh-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'appmesh-fips.us-east-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'appmesh.us-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'appmesh-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'appmesh-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'appmesh-fips.us-east-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'appmesh.us-east-2.api.aws', 'tags' => ['dualstack']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'appmesh-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'appmesh-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'appmesh-fips.us-west-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'appmesh.us-west-1.api.aws', 'tags' => ['dualstack']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'appmesh-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'appmesh-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'appmesh-fips.us-west-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'appmesh.us-west-2.api.aws', 'tags' => ['dualstack']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'appmesh-fips.us-west-2.amazonaws.com']]], 'apprunner' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'apprunner-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'apprunner-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'apprunner-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'apprunner-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'apprunner-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'apprunner-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'appstream2' => ['defaults' => ['credentialScope' => ['service' => 'appstream'], 'protocols' => ['https']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'appstream2-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-east-1.amazonaws.com'], 'us-east-2' => [], 'us-west-2' => ['variants' => [['hostname' => 'appstream2-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-west-2.amazonaws.com']]], 'appsync' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'aps' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'arc-zonal-shift' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'athena' => ['endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'athena.af-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-east-1' => ['variants' => [['hostname' => 'athena.ap-east-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'athena.ap-northeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'athena.ap-northeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'athena.ap-northeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-south-1' => ['variants' => [['hostname' => 'athena.ap-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-south-2' => ['variants' => [['hostname' => 'athena.ap-south-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'athena.ap-southeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'athena.ap-southeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 'athena.ap-southeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-4' => ['variants' => [['hostname' => 'athena.ap-southeast-4.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1' => ['variants' => [['hostname' => 'athena.ca-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-central-1' => ['variants' => [['hostname' => 'athena.eu-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-central-2' => ['variants' => [['hostname' => 'athena.eu-central-2.api.aws', 'tags' => ['dualstack']]]], 'eu-north-1' => ['variants' => [['hostname' => 'athena.eu-north-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-1' => ['variants' => [['hostname' => 'athena.eu-south-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-2' => ['variants' => [['hostname' => 'athena.eu-south-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-1' => ['variants' => [['hostname' => 'athena.eu-west-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-2' => ['variants' => [['hostname' => 'athena.eu-west-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-3' => ['variants' => [['hostname' => 'athena.eu-west-3.api.aws', 'tags' => ['dualstack']]]], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-west-2.amazonaws.com'], 'me-central-1' => ['variants' => [['hostname' => 'athena.me-central-1.api.aws', 'tags' => ['dualstack']]]], 'me-south-1' => ['variants' => [['hostname' => 'athena.me-south-1.api.aws', 'tags' => ['dualstack']]]], 'sa-east-1' => ['variants' => [['hostname' => 'athena.sa-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1' => ['variants' => [['hostname' => 'athena-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-east-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-2' => ['variants' => [['hostname' => 'athena-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-east-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-east-2.api.aws', 'tags' => ['dualstack']]]], 'us-west-1' => ['variants' => [['hostname' => 'athena-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-west-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-west-1.api.aws', 'tags' => ['dualstack']]]], 'us-west-2' => ['variants' => [['hostname' => 'athena-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-west-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-west-2.api.aws', 'tags' => ['dualstack']]]]]], 'auditmanager' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'autoscaling-plans' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'backup' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'backup-gateway' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'backupstorage' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'batch' => ['defaults' => ['variants' => [['hostname' => 'fips.batch.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fips.batch.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fips.batch.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fips.batch.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fips.batch.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'fips.batch.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'fips.batch.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'fips.batch.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'fips.batch.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'billingconductor' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'billingconductor.us-east-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'braket' => ['endpoints' => ['eu-west-2' => [], 'us-east-1' => [], 'us-west-1' => [], 'us-west-2' => []]], 'budgets' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'budgets.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'cases' => ['endpoints' => ['ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['deprecated' => \true], 'fips-us-west-2' => ['deprecated' => \true], 'us-east-1' => ['variants' => [['tags' => ['fips']]]], 'us-west-2' => ['variants' => [['tags' => ['fips']]]]]], 'cassandra' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cassandra-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cassandra-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cassandra-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => ['variants' => [['hostname' => 'cassandra-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'catalog.marketplace' => ['endpoints' => ['us-east-1' => []]], 'ce' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'ce.us-east-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'chime' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'chime.us-east-1.amazonaws.com', 'protocols' => ['https']]], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'cleanrooms' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'cloud9' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'cloudcontrolapi' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'clouddirectory' => ['endpoints' => ['ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'cloudformation' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cloudformation-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cloudformation-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'cloudformation-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'cloudformation-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'cloudformation-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'cloudformation-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'cloudformation-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cloudformation-fips.us-west-2.amazonaws.com']]], 'cloudfront' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'cloudfront.amazonaws.com', 'protocols' => ['http', 'https']]], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'cloudhsm' => ['endpoints' => ['us-east-1' => []]], 'cloudhsmv2' => ['defaults' => ['credentialScope' => ['service' => 'cloudhsm']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'cloudsearch' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-west-1' => [], 'us-west-2' => []]], 'cloudtrail' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cloudtrail-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'cloudtrail-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'cloudtrail-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cloudtrail-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cloudtrail-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'cloudtrail-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'cloudtrail-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'cloudtrail-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'cloudtrail-data' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'codeartifact' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'codebuild' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'codebuild-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'codebuild-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'codebuild-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'codebuild-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-west-2.amazonaws.com']]], 'codecatalyst' => ['endpoints' => ['aws-global' => ['hostname' => 'codecatalyst.global.api.aws']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'codecommit' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'codecommit-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.ca-central-1.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'codecommit-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'codecommit-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'codecommit-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'codecommit-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-west-2.amazonaws.com']]], 'codedeploy' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'codedeploy-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'codedeploy-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'codedeploy-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'codedeploy-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-west-2.amazonaws.com']]], 'codeguru-reviewer' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'codepipeline' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'codepipeline-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'codepipeline-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'codepipeline-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'codepipeline-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'codepipeline-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'codestar' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'codestar-connections' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'codestar-notifications' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'cognito-identity' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cognito-identity-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'cognito-identity-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'cognito-identity-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cognito-identity-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cognito-identity-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'cognito-identity-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'cognito-identity-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'cognito-identity-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'cognito-idp' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'cognito-idp-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'cognito-idp-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'cognito-idp-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'cognito-idp-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'cognito-idp-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'cognito-idp-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'cognito-idp-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'cognito-idp-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'cognito-sync' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'comprehend' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'comprehend-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'comprehend-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'comprehend-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'comprehend-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'comprehend-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'comprehend-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'comprehendmedical' => ['endpoints' => ['ap-southeast-2' => [], 'ca-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'comprehendmedical-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'comprehendmedical-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'comprehendmedical-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'comprehendmedical-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'comprehendmedical-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'comprehendmedical-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'compute-optimizer' => ['endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'compute-optimizer.af-south-1.amazonaws.com'], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'compute-optimizer.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'compute-optimizer.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'compute-optimizer.ap-northeast-2.amazonaws.com'], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'compute-optimizer.ap-northeast-3.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'compute-optimizer.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'compute-optimizer.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'compute-optimizer.ap-southeast-2.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'compute-optimizer.ca-central-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'compute-optimizer.eu-central-1.amazonaws.com'], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'compute-optimizer.eu-north-1.amazonaws.com'], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'compute-optimizer.eu-south-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'compute-optimizer.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'compute-optimizer.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'compute-optimizer.eu-west-3.amazonaws.com'], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'compute-optimizer.me-south-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'compute-optimizer.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'compute-optimizer.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'compute-optimizer.us-east-2.amazonaws.com'], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'compute-optimizer.us-west-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'compute-optimizer.us-west-2.amazonaws.com']]], 'config' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'config-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'config-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'config-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'config-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'config-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'config-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'config-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'config-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'connect' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'connect-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'connect-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'connect-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'connect-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'connect-campaigns' => ['endpoints' => ['ap-southeast-2' => [], 'ca-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'connect-campaigns-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'connect-campaigns-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'connect-campaigns-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'connect-campaigns-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'contact-lens' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'controltower' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'controltower-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'controltower-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'controltower-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'controltower-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'controltower-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'controltower-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'controltower-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'controltower-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'controltower-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'controltower-fips.us-west-2.amazonaws.com']]], 'cur' => ['endpoints' => ['us-east-1' => []]], 'data-ats.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'data.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'data.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'data.iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'data.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'data.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'data.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'data.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'data.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'data.iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'data.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'data.jobs.iot' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'data.jobs.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'data.mediastore' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'databrew' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'databrew-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'databrew-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'databrew-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'databrew-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'databrew-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'databrew-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'databrew-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'databrew-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'dataexchange' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'datapipeline' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'datasync' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'datasync-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'datasync-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'datasync-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'datasync-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'datasync-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'datasync-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'dax' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'devicefarm' => ['endpoints' => ['us-west-2' => []]], 'devops-guru' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'devops-guru-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'devops-guru-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'devops-guru-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'devops-guru-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'devops-guru-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'devops-guru-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'devops-guru-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'devops-guru-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'devops-guru-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'devops-guru-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'directconnect' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'directconnect-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'directconnect-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'directconnect-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'directconnect-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'directconnect-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'directconnect-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'directconnect-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'directconnect-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'discovery' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'dlm' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'dms' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'dms' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'dms-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'dms-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'dms-fips.us-west-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'dms-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'dms-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'dms-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'dms-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'dms-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'dms-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'dms-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'dms-fips.us-west-2.amazonaws.com']]], 'docdb' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'rds.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'rds.ap-northeast-2.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'rds.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'rds.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'rds.ap-southeast-2.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'rds.ca-central-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'rds.eu-central-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'rds.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'rds.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'rds.eu-west-3.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'rds.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'rds.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'rds.us-east-2.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'rds.us-west-2.amazonaws.com']]], 'drs' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'ds' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ds-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ds-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ds-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ds-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ds-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ds-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'dynamodb' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'dynamodb-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'dynamodb-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'local' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'localhost:8000', 'protocols' => ['http']], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'dynamodb-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'dynamodb-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'dynamodb-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'dynamodb-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'dynamodb-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'dynamodb-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'dynamodb-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'dynamodb-fips.us-west-2.amazonaws.com']]], 'ebs' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ebs-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ebs-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ebs-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ebs-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ebs-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ebs-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ebs-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ebs-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ebs-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ebs-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ec2' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => ['variants' => [['hostname' => 'ec2.ap-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ec2-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => ['variants' => [['hostname' => 'ec2.eu-west-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ec2-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ec2-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ec2-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ec2-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ec2-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => ['variants' => [['hostname' => 'ec2.sa-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1' => ['variants' => [['hostname' => 'ec2-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'ec2.us-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-2' => ['variants' => [['hostname' => 'ec2-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'ec2.us-east-2.api.aws', 'tags' => ['dualstack']]]], 'us-west-1' => ['variants' => [['hostname' => 'ec2-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ec2-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'ec2.us-west-2.api.aws', 'tags' => ['dualstack']]]]]], 'ecs' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ecs-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ecs-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ecs-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ecs-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'edge.sagemaker' => ['endpoints' => ['ap-northeast-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'eks' => ['defaults' => ['protocols' => ['http', 'https'], 'variants' => [['hostname' => 'fips.eks.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fips.eks.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fips.eks.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fips.eks.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fips.eks.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'fips.eks.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'fips.eks.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'fips.eks.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'fips.eks.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticache' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticache-fips.us-west-1.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'elasticache-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'elasticache-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'elasticache-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'elasticache-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'elasticache-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticache-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'elasticache-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'elasticache-fips.us-west-2.amazonaws.com']]], 'elasticbeanstalk' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'elasticbeanstalk-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'elasticbeanstalk-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'elasticbeanstalk-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'elasticbeanstalk-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticfilesystem' => ['endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.af-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-northeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-south-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-southeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-4' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ap-southeast-4.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-central-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-north-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-north-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-south-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-south-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3' => ['variants' => [['hostname' => 'elasticfilesystem-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'fips-af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.af-south-1.amazonaws.com'], 'fips-ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-east-1.amazonaws.com'], 'fips-ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-1.amazonaws.com'], 'fips-ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-2.amazonaws.com'], 'fips-ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-northeast-3.amazonaws.com'], 'fips-ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-south-1.amazonaws.com'], 'fips-ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-south-2.amazonaws.com'], 'fips-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-1.amazonaws.com'], 'fips-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-2.amazonaws.com'], 'fips-ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-3.amazonaws.com'], 'fips-ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ap-southeast-4.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.ca-central-1.amazonaws.com'], 'fips-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-central-1.amazonaws.com'], 'fips-eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-central-2.amazonaws.com'], 'fips-eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-north-1.amazonaws.com'], 'fips-eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-south-1.amazonaws.com'], 'fips-eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-south-2.amazonaws.com'], 'fips-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-west-1.amazonaws.com'], 'fips-eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-west-2.amazonaws.com'], 'fips-eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.eu-west-3.amazonaws.com'], 'fips-il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.il-central-1.amazonaws.com'], 'fips-me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.me-central-1.amazonaws.com'], 'fips-me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.me-south-1.amazonaws.com'], 'fips-sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.sa-east-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.il-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-central-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.me-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-south-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.me-south-1.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticloadbalancing' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'elasticloadbalancing-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'elasticloadbalancing-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'elasticloadbalancing-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'elasticloadbalancing-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticmapreduce' => ['defaults' => ['protocols' => ['https'], 'sslCommonName' => '{region}.{service}.{dnsSuffix}'], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'elasticmapreduce-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['sslCommonName' => '{service}.{region}.{dnsSuffix}'], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['sslCommonName' => '{service}.{region}.{dnsSuffix}', 'variants' => [['hostname' => 'elasticmapreduce-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'elasticmapreduce-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'elasticmapreduce-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'elasticmapreduce-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'elastictranscoder' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-1' => [], 'us-west-2' => []]], 'email' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'email-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'email-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'email-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => ['variants' => [['hostname' => 'email-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'emr-containers' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'emr-containers-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'emr-containers-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'emr-containers-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'emr-containers-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'emr-containers-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'emr-containers-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'emr-containers-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'emr-containers-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'emr-containers-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'emr-containers-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'emr-serverless' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'emr-serverless-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'emr-serverless-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'emr-serverless-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'emr-serverless-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'emr-serverless-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'emr-serverless-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'emr-serverless-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'emr-serverless-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'emr-serverless-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'emr-serverless-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'entitlement.marketplace' => ['defaults' => ['credentialScope' => ['service' => 'aws-marketplace']], 'endpoints' => ['us-east-1' => []]], 'es' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-west-1.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'es-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'es-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'es-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'es-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'es-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'es-fips.us-west-2.amazonaws.com']]], 'events' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'events-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'events-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'events-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'events-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'events-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'events-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'events-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'events-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'evidently' => ['endpoints' => ['ap-northeast-1' => ['hostname' => 'evidently.ap-northeast-1.amazonaws.com'], 'ap-southeast-1' => ['hostname' => 'evidently.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['hostname' => 'evidently.ap-southeast-2.amazonaws.com'], 'eu-central-1' => ['hostname' => 'evidently.eu-central-1.amazonaws.com'], 'eu-north-1' => ['hostname' => 'evidently.eu-north-1.amazonaws.com'], 'eu-west-1' => ['hostname' => 'evidently.eu-west-1.amazonaws.com'], 'us-east-1' => ['hostname' => 'evidently.us-east-1.amazonaws.com'], 'us-east-2' => ['hostname' => 'evidently.us-east-2.amazonaws.com'], 'us-west-2' => ['hostname' => 'evidently.us-west-2.amazonaws.com']]], 'finspace' => ['endpoints' => ['ca-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'finspace-api' => ['endpoints' => ['ca-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'firehose' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'firehose-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'firehose-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'firehose-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'firehose-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'fms' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'fms-fips.af-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-east-1' => ['variants' => [['hostname' => 'fms-fips.ap-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'fms-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'fms-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3' => [], 'ap-south-1' => ['variants' => [['hostname' => 'fms-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-2' => [], 'ap-southeast-1' => ['variants' => [['hostname' => 'fms-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'fms-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'fms-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['variants' => [['hostname' => 'fms-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => ['variants' => [['hostname' => 'fms-fips.eu-south-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-2' => [], 'eu-west-1' => ['variants' => [['hostname' => 'fms-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2' => ['variants' => [['hostname' => 'fms-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3' => ['variants' => [['hostname' => 'fms-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'fips-af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.af-south-1.amazonaws.com'], 'fips-ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-east-1.amazonaws.com'], 'fips-ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-northeast-1.amazonaws.com'], 'fips-ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-northeast-2.amazonaws.com'], 'fips-ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-south-1.amazonaws.com'], 'fips-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-southeast-1.amazonaws.com'], 'fips-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'fms-fips.ap-southeast-2.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.ca-central-1.amazonaws.com'], 'fips-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.eu-central-1.amazonaws.com'], 'fips-eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.eu-south-1.amazonaws.com'], 'fips-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.eu-west-1.amazonaws.com'], 'fips-eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'fms-fips.eu-west-2.amazonaws.com'], 'fips-eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'fms-fips.eu-west-3.amazonaws.com'], 'fips-me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.me-south-1.amazonaws.com'], 'fips-sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.sa-east-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => ['variants' => [['hostname' => 'fms-fips.me-south-1.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => ['variants' => [['hostname' => 'fms-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['variants' => [['hostname' => 'fms-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'fms-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'fms-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'fms-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'forecast' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'forecast-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'forecast-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'forecast-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'forecast-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'forecast-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'forecast-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'forecastquery' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'forecastquery-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'forecastquery-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'forecastquery-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'forecastquery-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'forecastquery-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'forecastquery-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'frauddetector' => ['endpoints' => ['ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'fsx' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'fsx-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com'], 'fips-prod-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.ca-central-1.amazonaws.com'], 'fips-prod-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-east-1.amazonaws.com'], 'fips-prod-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-east-2.amazonaws.com'], 'fips-prod-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-west-1.amazonaws.com'], 'fips-prod-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-west-2.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'prod-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'prod-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'prod-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'prod-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'prod-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'fsx-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'fsx-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'fsx-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'fsx-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'gamelift' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'gamesparks' => ['endpoints' => ['ap-northeast-1' => [], 'us-east-1' => []]], 'geo' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'glacier' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'glacier-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'glacier-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'glacier-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'glacier-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'glacier-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'glacier-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'glacier-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'glacier-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'glacier-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'glacier-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'glue' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'glue-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'glue-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'glue-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'glue-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'grafana' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'grafana.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'grafana.ap-northeast-2.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'grafana.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'grafana.ap-southeast-2.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'grafana.eu-central-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'grafana.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'grafana.eu-west-2.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'grafana.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'grafana.us-east-2.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'grafana.us-west-2.amazonaws.com']]], 'greengrass' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'greengrass-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'greengrass-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'greengrass-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'greengrass-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'greengrass-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'greengrass-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'greengrass-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'greengrass-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]], 'isRegionalized' => \true], 'groundstation' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'groundstation-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'groundstation-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'groundstation-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'groundstation-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'groundstation-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'groundstation-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'guardduty' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'guardduty-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'guardduty-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'guardduty-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'guardduty-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'guardduty-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'guardduty-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'guardduty-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'guardduty-fips.us-west-2.amazonaws.com']], 'isRegionalized' => \true], 'health' => ['defaults' => ['protocols' => ['https'], 'sslCommonName' => 'health.us-east-1.amazonaws.com'], 'endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'global.health.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'health-fips.us-east-2.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'health-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]]], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'healthlake' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-south-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'honeycode' => ['endpoints' => ['us-west-2' => []]], 'iam' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'iam.amazonaws.com', 'variants' => [['hostname' => 'iam-fips.amazonaws.com', 'tags' => ['fips']]]], 'aws-global-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'iam-fips.amazonaws.com'], 'iam' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'iam-fips.amazonaws.com', 'tags' => ['fips']]]], 'iam-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'iam-fips.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'identity-chime' => ['endpoints' => ['eu-central-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'identity-chime-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'identity-chime-fips.us-east-1.amazonaws.com']]], 'identitystore' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'importexport' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1', 'service' => 'IngestionService'], 'hostname' => 'importexport.amazonaws.com', 'signatureVersions' => ['v2', 'v4']]], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'ingest.timestream' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'ingest-fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ingest.timestream-fips.us-east-1.amazonaws.com'], 'ingest-fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ingest.timestream-fips.us-east-2.amazonaws.com'], 'ingest-fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ingest.timestream-fips.us-west-2.amazonaws.com'], 'ingest-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'ingest.timestream-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ingest-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'ingest.timestream-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'ingest-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'ingest.timestream-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'inspector' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'inspector-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'inspector-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'inspector-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'inspector-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'inspector2' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'inspector2-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'inspector2-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'inspector2-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'inspector2-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'internetmonitor' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => ['hostname' => 'internetmonitor.af-south-1.api.aws'], 'ap-east-1' => ['hostname' => 'internetmonitor.ap-east-1.api.aws'], 'ap-northeast-1' => ['hostname' => 'internetmonitor.ap-northeast-1.api.aws'], 'ap-northeast-2' => ['hostname' => 'internetmonitor.ap-northeast-2.api.aws'], 'ap-northeast-3' => ['hostname' => 'internetmonitor.ap-northeast-3.api.aws'], 'ap-south-1' => ['hostname' => 'internetmonitor.ap-south-1.api.aws'], 'ap-south-2' => ['hostname' => 'internetmonitor.ap-south-2.api.aws'], 'ap-southeast-1' => ['hostname' => 'internetmonitor.ap-southeast-1.api.aws'], 'ap-southeast-2' => ['hostname' => 'internetmonitor.ap-southeast-2.api.aws'], 'ap-southeast-3' => ['hostname' => 'internetmonitor.ap-southeast-3.api.aws'], 'ap-southeast-4' => ['hostname' => 'internetmonitor.ap-southeast-4.api.aws'], 'ca-central-1' => ['hostname' => 'internetmonitor.ca-central-1.api.aws', 'variants' => [['hostname' => 'internetmonitor-fips.ca-central-1.api.aws', 'tags' => ['fips']]]], 'eu-central-1' => ['hostname' => 'internetmonitor.eu-central-1.api.aws'], 'eu-central-2' => ['hostname' => 'internetmonitor.eu-central-2.api.aws'], 'eu-north-1' => ['hostname' => 'internetmonitor.eu-north-1.api.aws'], 'eu-south-1' => ['hostname' => 'internetmonitor.eu-south-1.api.aws'], 'eu-south-2' => ['hostname' => 'internetmonitor.eu-south-2.api.aws'], 'eu-west-1' => ['hostname' => 'internetmonitor.eu-west-1.api.aws'], 'eu-west-2' => ['hostname' => 'internetmonitor.eu-west-2.api.aws'], 'eu-west-3' => ['hostname' => 'internetmonitor.eu-west-3.api.aws'], 'il-central-1' => ['hostname' => 'internetmonitor.il-central-1.api.aws'], 'me-central-1' => ['hostname' => 'internetmonitor.me-central-1.api.aws'], 'me-south-1' => ['hostname' => 'internetmonitor.me-south-1.api.aws'], 'sa-east-1' => ['hostname' => 'internetmonitor.sa-east-1.api.aws'], 'us-east-1' => ['hostname' => 'internetmonitor.us-east-1.api.aws', 'variants' => [['hostname' => 'internetmonitor-fips.us-east-1.api.aws', 'tags' => ['fips']]]], 'us-east-2' => ['hostname' => 'internetmonitor.us-east-2.api.aws', 'variants' => [['hostname' => 'internetmonitor-fips.us-east-2.api.aws', 'tags' => ['fips']]]], 'us-west-1' => ['hostname' => 'internetmonitor.us-west-1.api.aws', 'variants' => [['hostname' => 'internetmonitor-fips.us-west-1.api.aws', 'tags' => ['fips']]]], 'us-west-2' => ['hostname' => 'internetmonitor.us-west-2.api.aws', 'variants' => [['hostname' => 'internetmonitor-fips.us-west-2.api.aws', 'tags' => ['fips']]]]]], 'iot' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['deprecated' => \true, 'hostname' => 'iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'iotanalytics' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'iotevents' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'iotevents-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'iotevents-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'iotevents-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'iotevents-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'iotevents-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'iotevents-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'iotevents-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'iotevents-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ioteventsdata' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'data.iotevents.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'data.iotevents.ap-northeast-2.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'data.iotevents.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'data.iotevents.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'data.iotevents.ap-southeast-2.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'data.iotevents.ca-central-1.amazonaws.com', 'variants' => [['hostname' => 'data.iotevents-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'data.iotevents.eu-central-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'data.iotevents.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'data.iotevents.eu-west-2.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'data.iotevents-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'data.iotevents-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'data.iotevents-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'data.iotevents-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'data.iotevents.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'data.iotevents-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'data.iotevents.us-east-2.amazonaws.com', 'variants' => [['hostname' => 'data.iotevents-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'data.iotevents.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'data.iotevents-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'iotfleetwise' => ['endpoints' => ['eu-central-1' => [], 'us-east-1' => []]], 'iotroborunner' => ['endpoints' => ['eu-central-1' => [], 'us-east-1' => []]], 'iotsecuredtunneling' => ['defaults' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'iotsitewise' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'iotsitewise-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'iotsitewise-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'iotsitewise-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'iotsitewise-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'iotsitewise-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'iotsitewise-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'iotsitewise-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'iotsitewise-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'iotthingsgraph' => ['defaults' => ['credentialScope' => ['service' => 'iotthingsgraph']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'iottwinmaker' => ['endpoints' => ['ap-southeast-1' => [], 'ap-southeast-2' => [], 'api-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'api.iottwinmaker.ap-southeast-1.amazonaws.com'], 'api-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'api.iottwinmaker.ap-southeast-2.amazonaws.com'], 'api-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'api.iottwinmaker.eu-central-1.amazonaws.com'], 'api-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'api.iottwinmaker.eu-west-1.amazonaws.com'], 'api-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.iottwinmaker.us-east-1.amazonaws.com'], 'api-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.iottwinmaker.us-west-2.amazonaws.com'], 'data-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'data.iottwinmaker.ap-southeast-1.amazonaws.com'], 'data-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'data.iottwinmaker.ap-southeast-2.amazonaws.com'], 'data-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'data.iottwinmaker.eu-central-1.amazonaws.com'], 'data-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'data.iottwinmaker.eu-west-1.amazonaws.com'], 'data-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'data.iottwinmaker.us-east-1.amazonaws.com'], 'data-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'data.iottwinmaker.us-west-2.amazonaws.com'], 'eu-central-1' => [], 'eu-west-1' => [], 'fips-api-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.iottwinmaker-fips.us-east-1.amazonaws.com'], 'fips-api-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.iottwinmaker-fips.us-west-2.amazonaws.com'], 'fips-data-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'data.iottwinmaker-fips.us-east-1.amazonaws.com'], 'fips-data-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'data.iottwinmaker-fips.us-west-2.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'iottwinmaker-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'iottwinmaker-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'iottwinmaker-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'iottwinmaker-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'iotwireless' => ['endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'api.iotwireless.ap-northeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'api.iotwireless.ap-southeast-2.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'api.iotwireless.eu-west-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'api.iotwireless.us-east-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'api.iotwireless.us-west-2.amazonaws.com']]], 'ivs' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'ivschat' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'ivsrealtime' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'kafka' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'kafka-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'kafka-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'kafka-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'kafka-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'kafka-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'kafka-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'kafka-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'kafka-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'kafka-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'kafka-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'kafkaconnect' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'kendra' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'kendra-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'kendra-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'kendra-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'kendra-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'kendra-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'kendra-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'kendra-ranking' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => ['hostname' => 'kendra-ranking.af-south-1.api.aws'], 'ap-east-1' => ['hostname' => 'kendra-ranking.ap-east-1.api.aws'], 'ap-northeast-1' => ['hostname' => 'kendra-ranking.ap-northeast-1.api.aws'], 'ap-northeast-2' => ['hostname' => 'kendra-ranking.ap-northeast-2.api.aws'], 'ap-northeast-3' => ['hostname' => 'kendra-ranking.ap-northeast-3.api.aws'], 'ap-south-1' => ['hostname' => 'kendra-ranking.ap-south-1.api.aws'], 'ap-south-2' => ['hostname' => 'kendra-ranking.ap-south-2.api.aws'], 'ap-southeast-1' => ['hostname' => 'kendra-ranking.ap-southeast-1.api.aws'], 'ap-southeast-2' => ['hostname' => 'kendra-ranking.ap-southeast-2.api.aws'], 'ap-southeast-3' => ['hostname' => 'kendra-ranking.ap-southeast-3.api.aws'], 'ap-southeast-4' => ['hostname' => 'kendra-ranking.ap-southeast-4.api.aws'], 'ca-central-1' => ['hostname' => 'kendra-ranking.ca-central-1.api.aws', 'variants' => [['hostname' => 'kendra-ranking-fips.ca-central-1.api.aws', 'tags' => ['fips']]]], 'eu-central-2' => ['hostname' => 'kendra-ranking.eu-central-2.api.aws'], 'eu-north-1' => ['hostname' => 'kendra-ranking.eu-north-1.api.aws'], 'eu-south-1' => ['hostname' => 'kendra-ranking.eu-south-1.api.aws'], 'eu-south-2' => ['hostname' => 'kendra-ranking.eu-south-2.api.aws'], 'eu-west-1' => ['hostname' => 'kendra-ranking.eu-west-1.api.aws'], 'eu-west-3' => ['hostname' => 'kendra-ranking.eu-west-3.api.aws'], 'il-central-1' => ['hostname' => 'kendra-ranking.il-central-1.api.aws'], 'me-central-1' => ['hostname' => 'kendra-ranking.me-central-1.api.aws'], 'me-south-1' => ['hostname' => 'kendra-ranking.me-south-1.api.aws'], 'sa-east-1' => ['hostname' => 'kendra-ranking.sa-east-1.api.aws'], 'us-east-1' => ['hostname' => 'kendra-ranking.us-east-1.api.aws', 'variants' => [['hostname' => 'kendra-ranking-fips.us-east-1.api.aws', 'tags' => ['fips']]]], 'us-east-2' => ['hostname' => 'kendra-ranking.us-east-2.api.aws', 'variants' => [['hostname' => 'kendra-ranking-fips.us-east-2.api.aws', 'tags' => ['fips']]]], 'us-west-1' => ['hostname' => 'kendra-ranking.us-west-1.api.aws'], 'us-west-2' => ['hostname' => 'kendra-ranking.us-west-2.api.aws', 'variants' => [['hostname' => 'kendra-ranking-fips.us-west-2.api.aws', 'tags' => ['fips']]]]]], 'kinesis' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'kinesis-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'kinesis-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'kinesis-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'kinesis-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'kinesis-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'kinesis-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'kinesis-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'kinesis-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'kinesisanalytics' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'kinesisvideo' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'kms' => ['endpoints' => ['ProdFips' => ['credentialScope' => ['region' => 'eu-central-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-central-2.amazonaws.com'], 'af-south-1' => ['variants' => [['hostname' => 'kms-fips.af-south-1.amazonaws.com', 'tags' => ['fips']]]], 'af-south-1-fips' => ['credentialScope' => ['region' => 'af-south-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.af-south-1.amazonaws.com'], 'ap-east-1' => ['variants' => [['hostname' => 'kms-fips.ap-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-east-1-fips' => ['credentialScope' => ['region' => 'ap-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['variants' => [['hostname' => 'kms-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-1-fips' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['variants' => [['hostname' => 'kms-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2-fips' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-northeast-2.amazonaws.com'], 'ap-northeast-3' => ['variants' => [['hostname' => 'kms-fips.ap-northeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3-fips' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-northeast-3.amazonaws.com'], 'ap-south-1' => ['variants' => [['hostname' => 'kms-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-1-fips' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-south-1.amazonaws.com'], 'ap-south-2' => ['variants' => [['hostname' => 'kms-fips.ap-south-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-2-fips' => ['credentialScope' => ['region' => 'ap-south-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-south-2.amazonaws.com'], 'ap-southeast-1' => ['variants' => [['hostname' => 'kms-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-1-fips' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['variants' => [['hostname' => 'kms-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2-fips' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-southeast-2.amazonaws.com'], 'ap-southeast-3' => ['variants' => [['hostname' => 'kms-fips.ap-southeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3-fips' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-southeast-3.amazonaws.com'], 'ap-southeast-4' => ['variants' => [['hostname' => 'kms-fips.ap-southeast-4.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-4-fips' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'deprecated' => \true, 'hostname' => 'kms-fips.ap-southeast-4.amazonaws.com'], 'ca-central-1' => ['variants' => [['hostname' => 'kms-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => ['variants' => [['hostname' => 'kms-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1-fips' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-central-1.amazonaws.com'], 'eu-central-2' => ['variants' => [['hostname' => 'kms-fips.eu-central-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-2-fips' => ['credentialScope' => ['region' => 'eu-central-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-central-2.amazonaws.com'], 'eu-north-1' => ['variants' => [['hostname' => 'kms-fips.eu-north-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-north-1-fips' => ['credentialScope' => ['region' => 'eu-north-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-north-1.amazonaws.com'], 'eu-south-1' => ['variants' => [['hostname' => 'kms-fips.eu-south-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-1-fips' => ['credentialScope' => ['region' => 'eu-south-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-south-1.amazonaws.com'], 'eu-south-2' => ['variants' => [['hostname' => 'kms-fips.eu-south-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-2-fips' => ['credentialScope' => ['region' => 'eu-south-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-south-2.amazonaws.com'], 'eu-west-1' => ['variants' => [['hostname' => 'kms-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-1-fips' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-west-1.amazonaws.com'], 'eu-west-2' => ['variants' => [['hostname' => 'kms-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2-fips' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-west-2.amazonaws.com'], 'eu-west-3' => ['variants' => [['hostname' => 'kms-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3-fips' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'kms-fips.eu-west-3.amazonaws.com'], 'il-central-1' => ['variants' => [['hostname' => 'kms-fips.il-central-1.amazonaws.com', 'tags' => ['fips']]]], 'il-central-1-fips' => ['credentialScope' => ['region' => 'il-central-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.il-central-1.amazonaws.com'], 'me-central-1' => ['variants' => [['hostname' => 'kms-fips.me-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-central-1-fips' => ['credentialScope' => ['region' => 'me-central-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.me-central-1.amazonaws.com'], 'me-south-1' => ['variants' => [['hostname' => 'kms-fips.me-south-1.amazonaws.com', 'tags' => ['fips']]]], 'me-south-1-fips' => ['credentialScope' => ['region' => 'me-south-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.me-south-1.amazonaws.com'], 'sa-east-1' => ['variants' => [['hostname' => 'kms-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1-fips' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.sa-east-1.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'kms-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'kms-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'kms-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'kms-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-west-2.amazonaws.com']]], 'lakeformation' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'lakeformation-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'lakeformation-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'lakeformation-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'lakeformation-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'lambda' => ['endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'lambda.af-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-east-1' => ['variants' => [['hostname' => 'lambda.ap-east-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'lambda.ap-northeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'lambda.ap-northeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'lambda.ap-northeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-south-1' => ['variants' => [['hostname' => 'lambda.ap-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-south-2' => ['variants' => [['hostname' => 'lambda.ap-south-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'lambda.ap-southeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'lambda.ap-southeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 'lambda.ap-southeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-4' => ['variants' => [['hostname' => 'lambda.ap-southeast-4.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1' => ['variants' => [['hostname' => 'lambda.ca-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-central-1' => ['variants' => [['hostname' => 'lambda.eu-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-central-2' => ['variants' => [['hostname' => 'lambda.eu-central-2.api.aws', 'tags' => ['dualstack']]]], 'eu-north-1' => ['variants' => [['hostname' => 'lambda.eu-north-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-1' => ['variants' => [['hostname' => 'lambda.eu-south-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-2' => ['variants' => [['hostname' => 'lambda.eu-south-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-1' => ['variants' => [['hostname' => 'lambda.eu-west-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-2' => ['variants' => [['hostname' => 'lambda.eu-west-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-3' => ['variants' => [['hostname' => 'lambda.eu-west-3.api.aws', 'tags' => ['dualstack']]]], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['variants' => [['hostname' => 'lambda.il-central-1.api.aws', 'tags' => ['dualstack']]]], 'me-central-1' => ['variants' => [['hostname' => 'lambda.me-central-1.api.aws', 'tags' => ['dualstack']]]], 'me-south-1' => ['variants' => [['hostname' => 'lambda.me-south-1.api.aws', 'tags' => ['dualstack']]]], 'sa-east-1' => ['variants' => [['hostname' => 'lambda.sa-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1' => ['variants' => [['hostname' => 'lambda-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-2' => ['variants' => [['hostname' => 'lambda-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-east-2.api.aws', 'tags' => ['dualstack']]]], 'us-west-1' => ['variants' => [['hostname' => 'lambda-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-west-1.api.aws', 'tags' => ['dualstack']]]], 'us-west-2' => ['variants' => [['hostname' => 'lambda-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-west-2.api.aws', 'tags' => ['dualstack']]]]]], 'license-manager' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'license-manager-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'license-manager-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'license-manager-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'license-manager-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'license-manager-linux-subscriptions' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'license-manager-user-subscriptions' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'license-manager-user-subscriptions-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'license-manager-user-subscriptions-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'license-manager-user-subscriptions-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'license-manager-user-subscriptions-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'license-manager-user-subscriptions-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'license-manager-user-subscriptions-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'license-manager-user-subscriptions-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'license-manager-user-subscriptions-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'lightsail' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'logs' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'logs-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'logs-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'logs-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'logs-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'logs-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'logs-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'logs-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'logs-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'lookoutequipment' => ['endpoints' => ['ap-northeast-2' => [], 'eu-west-1' => [], 'us-east-1' => []]], 'lookoutmetrics' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'lookoutvision' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'm2' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['deprecated' => \true], 'fips-us-east-1' => ['deprecated' => \true], 'fips-us-east-2' => ['deprecated' => \true], 'fips-us-west-1' => ['deprecated' => \true], 'fips-us-west-2' => ['deprecated' => \true], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['tags' => ['fips']]]], 'us-east-2' => ['variants' => [['tags' => ['fips']]]], 'us-west-1' => ['variants' => [['tags' => ['fips']]]], 'us-west-2' => ['variants' => [['tags' => ['fips']]]]]], 'machinelearning' => ['endpoints' => ['eu-west-1' => [], 'us-east-1' => []]], 'macie' => ['endpoints' => ['fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'macie-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'macie-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'macie-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'macie-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'macie2' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'macie2-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'macie2-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'macie2-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'macie2-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'macie2-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'macie2-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'macie2-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'macie2-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'managedblockchain' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => []]], 'marketplacecommerceanalytics' => ['endpoints' => ['us-east-1' => []]], 'media-pipelines-chime' => ['endpoints' => ['ap-southeast-1' => [], 'eu-central-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'media-pipelines-chime-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'media-pipelines-chime-fips.us-east-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'media-pipelines-chime-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'media-pipelines-chime-fips.us-west-2.amazonaws.com']]], 'mediaconnect' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'mediaconvert' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'mediaconvert-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'mediaconvert-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'mediaconvert-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'mediaconvert-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'mediaconvert-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'mediaconvert-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'mediaconvert-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'mediaconvert-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'mediaconvert-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'mediaconvert-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'medialive' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'medialive-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'medialive-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'medialive-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'medialive-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'medialive-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'medialive-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'mediapackage' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'mediapackage-vod' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'mediapackagev2' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'mediastore' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'meetings-chime' => ['endpoints' => ['ap-southeast-1' => [], 'eu-central-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'meetings-chime-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'meetings-chime-fips.us-east-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'meetings-chime-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'meetings-chime-fips.us-west-2.amazonaws.com']]], 'memory-db' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'memory-db-fips.us-west-1.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'messaging-chime' => ['endpoints' => ['eu-central-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'messaging-chime-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'messaging-chime-fips.us-east-1.amazonaws.com']]], 'metering.marketplace' => ['defaults' => ['credentialScope' => ['service' => 'aws-marketplace']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'metrics.sagemaker' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'mgh' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'mgn' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'mgn-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'mgn-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'mgn-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'mgn-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'migrationhub-orchestrator' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'migrationhub-strategy' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'mobileanalytics' => ['endpoints' => ['us-east-1' => []]], 'models-v2-lex' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'models.lex' => ['defaults' => ['credentialScope' => ['service' => 'lex'], 'variants' => [['hostname' => 'models-fips.lex.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => ['variants' => [['hostname' => 'models-fips.lex.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'models-fips.lex.us-east-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'models-fips.lex.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'models-fips.lex.us-west-2.amazonaws.com']]], 'monitoring' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'monitoring-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'monitoring-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'monitoring-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'monitoring-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'monitoring-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'monitoring-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'monitoring-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'monitoring-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'mq' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'mq-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'mq-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'mq-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'mq-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'mturk-requester' => ['endpoints' => ['sandbox' => ['hostname' => 'mturk-requester-sandbox.us-east-1.amazonaws.com'], 'us-east-1' => []], 'isRegionalized' => \false], 'neptune' => ['endpoints' => ['ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'rds.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'rds.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'rds.ap-northeast-2.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'rds.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'rds.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'rds.ap-southeast-2.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'rds.ca-central-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'rds.eu-central-1.amazonaws.com'], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'rds.eu-north-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'rds.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'rds.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'rds.eu-west-3.amazonaws.com'], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'rds.me-south-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'rds.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'rds.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'rds.us-east-2.amazonaws.com'], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'rds.us-west-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'rds.us-west-2.amazonaws.com']]], 'network-firewall' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'network-firewall-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'network-firewall-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'network-firewall-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'network-firewall-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'network-firewall-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'networkmanager' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'networkmanager.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'networkmanager-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-global' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'networkmanager-fips.us-west-2.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'nimble' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'oam' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'oidc' => ['endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'oidc.af-south-1.amazonaws.com'], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'oidc.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'oidc.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'oidc.ap-northeast-2.amazonaws.com'], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'oidc.ap-northeast-3.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'oidc.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'oidc.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'oidc.ap-southeast-2.amazonaws.com'], 'ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'hostname' => 'oidc.ap-southeast-3.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'oidc.ca-central-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'oidc.eu-central-1.amazonaws.com'], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'oidc.eu-north-1.amazonaws.com'], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'oidc.eu-south-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'oidc.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'oidc.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'oidc.eu-west-3.amazonaws.com'], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'oidc.me-south-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'oidc.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'oidc.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'oidc.us-east-2.amazonaws.com'], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'oidc.us-west-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'oidc.us-west-2.amazonaws.com']]], 'omics' => ['endpoints' => ['ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'omics.ap-southeast-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'omics.eu-central-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'omics.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'omics.eu-west-2.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'omics-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'omics-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'omics.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'omics-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'omics.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'omics-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'opsworks' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'opsworks-cm' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'organizations' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'organizations.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'organizations-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'organizations-fips.us-east-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'osis' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'outposts' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'outposts-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'outposts-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'outposts-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'outposts-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'outposts-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'outposts-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'outposts-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'outposts-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'outposts-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'outposts-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'participant.connect' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'participant.connect-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'participant.connect-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'participant.connect-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'participant.connect-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'personalize' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'pi' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'pinpoint' => ['defaults' => ['credentialScope' => ['service' => 'mobiletargeting']], 'endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'pinpoint.ca-central-1.amazonaws.com', 'variants' => [['hostname' => 'pinpoint-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'pinpoint-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'pinpoint-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'pinpoint-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'pinpoint-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'pinpoint.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'pinpoint-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'pinpoint.us-east-2.amazonaws.com', 'variants' => [['hostname' => 'pinpoint-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'pinpoint.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'pinpoint-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'pipes' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'polly' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'polly-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'polly-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'polly-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'polly-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'polly-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'polly-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'polly-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'polly-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'portal.sso' => ['endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'portal.sso.af-south-1.amazonaws.com'], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'portal.sso.ap-east-1.amazonaws.com'], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'portal.sso.ap-northeast-1.amazonaws.com'], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'portal.sso.ap-northeast-2.amazonaws.com'], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'portal.sso.ap-northeast-3.amazonaws.com'], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'portal.sso.ap-south-1.amazonaws.com'], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'portal.sso.ap-southeast-1.amazonaws.com'], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'portal.sso.ap-southeast-2.amazonaws.com'], 'ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'hostname' => 'portal.sso.ap-southeast-3.amazonaws.com'], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'portal.sso.ca-central-1.amazonaws.com'], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'portal.sso.eu-central-1.amazonaws.com'], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'portal.sso.eu-north-1.amazonaws.com'], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'portal.sso.eu-south-1.amazonaws.com'], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'portal.sso.eu-west-1.amazonaws.com'], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'portal.sso.eu-west-2.amazonaws.com'], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'portal.sso.eu-west-3.amazonaws.com'], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'portal.sso.me-south-1.amazonaws.com'], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'portal.sso.sa-east-1.amazonaws.com'], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'portal.sso.us-east-1.amazonaws.com'], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'portal.sso.us-east-2.amazonaws.com'], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'portal.sso.us-west-1.amazonaws.com'], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'portal.sso.us-west-2.amazonaws.com']]], 'profile' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'profile-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'profile-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'profile-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'profile-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'profile-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'profile-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'projects.iot1click' => ['endpoints' => ['ap-northeast-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'proton' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'qldb' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'qldb-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'qldb-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'qldb-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'qldb-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'qldb-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'qldb-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'qldb-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'qldb-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'quicksight' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'ram' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ram-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ram-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ram-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ram-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ram-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ram-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ram-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ram-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ram-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ram-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'rbin' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'rbin-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'rbin-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'rbin-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'rbin-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'rbin-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'rds' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'rds-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'rds-fips.ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.ca-central-1.amazonaws.com'], 'rds-fips.us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-east-1.amazonaws.com'], 'rds-fips.us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-east-2.amazonaws.com'], 'rds-fips.us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-west-1.amazonaws.com'], 'rds-fips.us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-west-2.amazonaws.com'], 'rds.ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rds-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'rds.us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rds-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'rds.us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'rds-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'rds.us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rds-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'rds.us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'rds-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => [], 'us-east-1' => ['sslCommonName' => '{service}.{dnsSuffix}', 'variants' => [['hostname' => 'rds-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'rds-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'rds-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'rds-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rds-fips.us-west-2.amazonaws.com']]], 'rds-data' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rds-data-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rds-data-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rds-data-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rds-data-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'rds-data-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'rds-data-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'rds-data-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'rds-data-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'redshift' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'redshift-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'redshift-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'redshift-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'redshift-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'redshift-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'redshift-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'redshift-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'redshift-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'redshift-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'redshift-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'redshift-serverless' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'rekognition' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'rekognition-fips.ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.ca-central-1.amazonaws.com'], 'rekognition-fips.us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com'], 'rekognition-fips.us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com'], 'rekognition-fips.us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com'], 'rekognition-fips.us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com'], 'rekognition.ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'rekognition.us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'rekognition.us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'rekognition.us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'rekognition.us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['variants' => [['hostname' => 'rekognition-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'rekognition-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'rekognition-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'rekognition-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-west-2.amazonaws.com']]], 'resiliencehub' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'resource-explorer-2' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['ap-northeast-1' => ['hostname' => 'resource-explorer-2.ap-northeast-1.api.aws'], 'ap-northeast-2' => ['hostname' => 'resource-explorer-2.ap-northeast-2.api.aws'], 'ap-northeast-3' => ['hostname' => 'resource-explorer-2.ap-northeast-3.api.aws'], 'ap-south-1' => ['hostname' => 'resource-explorer-2.ap-south-1.api.aws'], 'ap-south-2' => ['hostname' => 'resource-explorer-2.ap-south-2.api.aws'], 'ap-southeast-1' => ['hostname' => 'resource-explorer-2.ap-southeast-1.api.aws'], 'ap-southeast-2' => ['hostname' => 'resource-explorer-2.ap-southeast-2.api.aws'], 'ap-southeast-4' => ['hostname' => 'resource-explorer-2.ap-southeast-4.api.aws'], 'ca-central-1' => ['hostname' => 'resource-explorer-2.ca-central-1.api.aws'], 'eu-central-1' => ['hostname' => 'resource-explorer-2.eu-central-1.api.aws'], 'eu-central-2' => ['hostname' => 'resource-explorer-2.eu-central-2.api.aws'], 'eu-north-1' => ['hostname' => 'resource-explorer-2.eu-north-1.api.aws'], 'eu-west-1' => ['hostname' => 'resource-explorer-2.eu-west-1.api.aws'], 'eu-west-2' => ['hostname' => 'resource-explorer-2.eu-west-2.api.aws'], 'eu-west-3' => ['hostname' => 'resource-explorer-2.eu-west-3.api.aws'], 'il-central-1' => ['hostname' => 'resource-explorer-2.il-central-1.api.aws'], 'sa-east-1' => ['hostname' => 'resource-explorer-2.sa-east-1.api.aws'], 'us-east-1' => ['hostname' => 'resource-explorer-2.us-east-1.api.aws'], 'us-east-2' => ['hostname' => 'resource-explorer-2.us-east-2.api.aws'], 'us-west-1' => ['hostname' => 'resource-explorer-2.us-west-1.api.aws'], 'us-west-2' => ['hostname' => 'resource-explorer-2.us-west-2.api.aws']]], 'resource-groups' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'resource-groups-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'resource-groups-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'resource-groups-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'resource-groups-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'resource-groups-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'resource-groups-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'resource-groups-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'resource-groups-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'robomaker' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'rolesanywhere' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'route53' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'route53.amazonaws.com', 'variants' => [['hostname' => 'route53-fips.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'route53-fips.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'route53-recovery-control-config' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'route53-recovery-control-config.us-west-2.amazonaws.com']]], 'route53domains' => ['endpoints' => ['us-east-1' => []]], 'route53resolver' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'rum' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'runtime-v2-lex' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'runtime.lex' => ['defaults' => ['credentialScope' => ['service' => 'lex'], 'variants' => [['hostname' => 'runtime-fips.lex.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => ['variants' => [['hostname' => 'runtime-fips.lex.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'runtime-fips.lex.us-east-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'runtime-fips.lex.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'runtime-fips.lex.us-west-2.amazonaws.com']]], 'runtime.sagemaker' => ['defaults' => ['variants' => [['hostname' => 'runtime-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'runtime-fips.sagemaker.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'runtime-fips.sagemaker.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'runtime-fips.sagemaker.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'runtime-fips.sagemaker.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'runtime-fips.sagemaker.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'runtime-fips.sagemaker.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'runtime-fips.sagemaker.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'runtime-fips.sagemaker.us-west-2.amazonaws.com']]], 's3' => ['defaults' => ['protocols' => ['http', 'https'], 'signatureVersions' => ['s3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['af-south-1' => ['variants' => [['hostname' => 's3.dualstack.af-south-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-east-1' => ['variants' => [['hostname' => 's3.dualstack.ap-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-northeast-1' => ['hostname' => 's3.ap-northeast-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3.dualstack.ap-northeast-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 's3.dualstack.ap-northeast-2.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 's3.dualstack.ap-northeast-3.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-south-1' => ['variants' => [['hostname' => 's3.dualstack.ap-south-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-south-2' => ['variants' => [['hostname' => 's3.dualstack.ap-south-2.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['hostname' => 's3.ap-southeast-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3.dualstack.ap-southeast-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['hostname' => 's3.ap-southeast-2.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3.dualstack.ap-southeast-2.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 's3.dualstack.ap-southeast-3.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-4' => ['variants' => [['hostname' => 's3.dualstack.ap-southeast-4.amazonaws.com', 'tags' => ['dualstack']]]], 'aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 's3.amazonaws.com', 'signatureVersions' => ['s3', 's3v4']], 'ca-central-1' => ['variants' => [['hostname' => 's3-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-fips.dualstack.ca-central-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3.dualstack.ca-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-central-1' => ['variants' => [['hostname' => 's3.dualstack.eu-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-central-2' => ['variants' => [['hostname' => 's3.dualstack.eu-central-2.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-north-1' => ['variants' => [['hostname' => 's3.dualstack.eu-north-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-south-1' => ['variants' => [['hostname' => 's3.dualstack.eu-south-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-south-2' => ['variants' => [['hostname' => 's3.dualstack.eu-south-2.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-1' => ['hostname' => 's3.eu-west-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3.dualstack.eu-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-2' => ['variants' => [['hostname' => 's3.dualstack.eu-west-2.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-3' => ['variants' => [['hostname' => 's3.dualstack.eu-west-3.amazonaws.com', 'tags' => ['dualstack']]]], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 's3-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 's3-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 's3-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 's3-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 's3-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['variants' => [['hostname' => 's3.dualstack.il-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'me-central-1' => ['variants' => [['hostname' => 's3.dualstack.me-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'me-south-1' => ['variants' => [['hostname' => 's3.dualstack.me-south-1.amazonaws.com', 'tags' => ['dualstack']]]], 's3-external-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 's3-external-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4']], 'sa-east-1' => ['hostname' => 's3.sa-east-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3.dualstack.sa-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-east-1' => ['hostname' => 's3.us-east-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3-fips.dualstack.us-east-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-east-2' => ['variants' => [['hostname' => 's3-fips.dualstack.us-east-2.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-east-2.amazonaws.com', 'tags' => ['dualstack']]]], 'us-west-1' => ['hostname' => 's3.us-west-1.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3-fips.dualstack.us-west-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-west-2' => ['hostname' => 's3.us-west-2.amazonaws.com', 'signatureVersions' => ['s3', 's3v4'], 'variants' => [['hostname' => 's3-fips.dualstack.us-west-2.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-west-2.amazonaws.com', 'tags' => ['dualstack']]]]], 'isRegionalized' => \true, 'partitionEndpoint' => 'aws-global'], 's3-control' => ['defaults' => ['protocols' => ['https'], 'signatureVersions' => ['s3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 's3-control.ap-northeast-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-northeast-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 's3-control.ap-northeast-2.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-northeast-2.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 's3-control.ap-northeast-3.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-northeast-3.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 's3-control.ap-south-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-south-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 's3-control.ap-southeast-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-southeast-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 's3-control.ap-southeast-2.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.ap-southeast-2.amazonaws.com', 'tags' => ['dualstack']]]], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 's3-control.ca-central-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control-fips.dualstack.ca-central-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control.dualstack.ca-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 's3-control-fips.ca-central-1.amazonaws.com', 'signatureVersions' => ['s3v4']], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 's3-control.eu-central-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.eu-central-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 's3-control.eu-north-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.eu-north-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 's3-control.eu-west-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.eu-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 's3-control.eu-west-2.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.eu-west-2.amazonaws.com', 'tags' => ['dualstack']]]], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 's3-control.eu-west-3.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.eu-west-3.amazonaws.com', 'tags' => ['dualstack']]]], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 's3-control.sa-east-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.sa-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 's3-control.us-east-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-east-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-east-1.amazonaws.com', 'signatureVersions' => ['s3v4']], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 's3-control.us-east-2.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-east-2.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-east-2.amazonaws.com', 'tags' => ['dualstack']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-east-2.amazonaws.com', 'signatureVersions' => ['s3v4']], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 's3-control.us-west-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-west-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-west-1.amazonaws.com', 'signatureVersions' => ['s3v4']], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 's3-control.us-west-2.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-west-2.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-west-2.amazonaws.com', 'tags' => ['dualstack']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-west-2.amazonaws.com', 'signatureVersions' => ['s3v4']]]], 's3-outposts' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['deprecated' => \true], 'fips-us-east-1' => ['deprecated' => \true], 'fips-us-east-2' => ['deprecated' => \true], 'fips-us-west-1' => ['deprecated' => \true], 'fips-us-west-2' => ['deprecated' => \true], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['tags' => ['fips']]]], 'us-east-2' => ['variants' => [['tags' => ['fips']]]], 'us-west-1' => ['variants' => [['tags' => ['fips']]]], 'us-west-2' => ['variants' => [['tags' => ['fips']]]]]], 'sagemaker-geospatial' => ['endpoints' => ['us-west-2' => []]], 'savingsplans' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'savingsplans.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'scheduler' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'schemas' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'sdb' => ['defaults' => ['protocols' => ['http', 'https'], 'signatureVersions' => ['v2']], 'endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'sa-east-1' => [], 'us-east-1' => ['hostname' => 'sdb.amazonaws.com'], 'us-west-1' => [], 'us-west-2' => []]], 'secretsmanager' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'secretsmanager-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'secretsmanager-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'secretsmanager-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'secretsmanager-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'secretsmanager-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-west-2.amazonaws.com']]], 'securityhub' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'securityhub-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'securityhub-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'securityhub-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'securityhub-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'securitylake' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'serverlessrepo' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-east-1' => ['protocols' => ['https']], 'ap-northeast-1' => ['protocols' => ['https']], 'ap-northeast-2' => ['protocols' => ['https']], 'ap-south-1' => ['protocols' => ['https']], 'ap-southeast-1' => ['protocols' => ['https']], 'ap-southeast-2' => ['protocols' => ['https']], 'ca-central-1' => ['protocols' => ['https']], 'eu-central-1' => ['protocols' => ['https']], 'eu-north-1' => ['protocols' => ['https']], 'eu-west-1' => ['protocols' => ['https']], 'eu-west-2' => ['protocols' => ['https']], 'eu-west-3' => ['protocols' => ['https']], 'me-south-1' => ['protocols' => ['https']], 'sa-east-1' => ['protocols' => ['https']], 'us-east-1' => ['protocols' => ['https']], 'us-east-2' => ['protocols' => ['https']], 'us-west-1' => ['protocols' => ['https']], 'us-west-2' => ['protocols' => ['https']]]], 'servicecatalog' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'servicecatalog-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'servicecatalog-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'servicecatalog-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'servicecatalog-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-west-2.amazonaws.com']]], 'servicecatalog-appregistry' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'servicecatalog-appregistry-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-appregistry-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-appregistry-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'servicecatalog-appregistry-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-appregistry-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'servicecatalog-appregistry-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'servicecatalog-appregistry-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'servicecatalog-appregistry-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'servicecatalog-appregistry-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'servicecatalog-appregistry-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'servicediscovery' => ['endpoints' => ['af-south-1' => ['variants' => [['hostname' => 'servicediscovery.af-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-east-1' => ['variants' => [['hostname' => 'servicediscovery.ap-east-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-1' => ['variants' => [['hostname' => 'servicediscovery.ap-northeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'servicediscovery.ap-northeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'servicediscovery.ap-northeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-south-1' => ['variants' => [['hostname' => 'servicediscovery.ap-south-1.api.aws', 'tags' => ['dualstack']]]], 'ap-south-2' => ['variants' => [['hostname' => 'servicediscovery.ap-south-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'servicediscovery.ap-southeast-1.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'servicediscovery.ap-southeast-2.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-3' => ['variants' => [['hostname' => 'servicediscovery.ap-southeast-3.api.aws', 'tags' => ['dualstack']]]], 'ap-southeast-4' => ['variants' => [['hostname' => 'servicediscovery.ap-southeast-4.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1' => ['variants' => [['hostname' => 'servicediscovery-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery-fips.ca-central-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery.ca-central-1.api.aws', 'tags' => ['dualstack']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => ['variants' => [['hostname' => 'servicediscovery.eu-central-1.api.aws', 'tags' => ['dualstack']]]], 'eu-central-2' => ['variants' => [['hostname' => 'servicediscovery.eu-central-2.api.aws', 'tags' => ['dualstack']]]], 'eu-north-1' => ['variants' => [['hostname' => 'servicediscovery.eu-north-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-1' => ['variants' => [['hostname' => 'servicediscovery.eu-south-1.api.aws', 'tags' => ['dualstack']]]], 'eu-south-2' => ['variants' => [['hostname' => 'servicediscovery.eu-south-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-1' => ['variants' => [['hostname' => 'servicediscovery.eu-west-1.api.aws', 'tags' => ['dualstack']]]], 'eu-west-2' => ['variants' => [['hostname' => 'servicediscovery.eu-west-2.api.aws', 'tags' => ['dualstack']]]], 'eu-west-3' => ['variants' => [['hostname' => 'servicediscovery.eu-west-3.api.aws', 'tags' => ['dualstack']]]], 'il-central-1' => ['variants' => [['hostname' => 'servicediscovery.il-central-1.api.aws', 'tags' => ['dualstack']]]], 'me-central-1' => ['variants' => [['hostname' => 'servicediscovery.me-central-1.api.aws', 'tags' => ['dualstack']]]], 'me-south-1' => ['variants' => [['hostname' => 'servicediscovery.me-south-1.api.aws', 'tags' => ['dualstack']]]], 'sa-east-1' => ['variants' => [['hostname' => 'servicediscovery.sa-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1' => ['variants' => [['hostname' => 'servicediscovery-fips.us-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery-fips.us-east-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery.us-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'servicediscovery-fips.us-east-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery-fips.us-east-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery.us-east-2.api.aws', 'tags' => ['dualstack']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'servicediscovery-fips.us-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery-fips.us-west-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery.us-west-1.api.aws', 'tags' => ['dualstack']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'servicediscovery-fips.us-west-2.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery-fips.us-west-2.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery.us-west-2.api.aws', 'tags' => ['dualstack']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-west-2.amazonaws.com']]], 'servicequotas' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'session.qldb' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'session.qldb-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'session.qldb-fips.us-east-2.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'session.qldb-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'session.qldb-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'session.qldb-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'session.qldb-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'shield' => ['defaults' => ['protocols' => ['https'], 'sslCommonName' => 'shield.us-east-1.amazonaws.com'], 'endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'shield.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'shield-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'shield-fips.us-east-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'signer' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'signer-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'signer-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'signer-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'signer-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'signer-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'signer-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'signer-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'signer-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'simspaceweaver' => ['endpoints' => ['ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'sms' => ['endpoints' => ['fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'sms-fips.us-west-2.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'sms-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'sms-voice' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'sms-voice-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'sms-voice-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'sms-voice-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'sms-voice-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'sms-voice-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'sms-voice-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'snowball' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => ['variants' => [['hostname' => 'snowball-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2' => ['variants' => [['hostname' => 'snowball-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3' => ['variants' => [['hostname' => 'snowball-fips.ap-northeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-1' => ['variants' => [['hostname' => 'snowball-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-1' => ['variants' => [['hostname' => 'snowball-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2' => ['variants' => [['hostname' => 'snowball-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'snowball-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['variants' => [['hostname' => 'snowball-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => ['variants' => [['hostname' => 'snowball-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2' => ['variants' => [['hostname' => 'snowball-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3' => ['variants' => [['hostname' => 'snowball-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'fips-ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-northeast-1.amazonaws.com'], 'fips-ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-northeast-2.amazonaws.com'], 'fips-ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-northeast-3.amazonaws.com'], 'fips-ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-south-1.amazonaws.com'], 'fips-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-southeast-1.amazonaws.com'], 'fips-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ap-southeast-2.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.ca-central-1.amazonaws.com'], 'fips-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.eu-central-1.amazonaws.com'], 'fips-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.eu-west-1.amazonaws.com'], 'fips-eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'snowball-fips.eu-west-2.amazonaws.com'], 'fips-eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'snowball-fips.eu-west-3.amazonaws.com'], 'fips-sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.sa-east-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'sa-east-1' => ['variants' => [['hostname' => 'snowball-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['variants' => [['hostname' => 'snowball-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'snowball-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'snowball-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'snowball-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'sns' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'sns-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'sns-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'sns-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'sns-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'sns-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'sns-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'sns-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'sns-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'sqs' => ['defaults' => ['protocols' => ['http', 'https'], 'sslCommonName' => '{region}.queue.{dnsSuffix}'], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'sqs-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'sqs-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'sqs-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'sqs-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['sslCommonName' => 'queue.{dnsSuffix}', 'variants' => [['hostname' => 'sqs-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'sqs-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'sqs-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'sqs-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ssm' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ssm-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ssm-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ssm-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ssm-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ssm-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ssm-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ssm-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ssm-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ssm-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ssm-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ssm-contacts' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ssm-contacts-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ssm-contacts-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ssm-contacts-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ssm-contacts-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ssm-contacts-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ssm-contacts-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ssm-contacts-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ssm-contacts-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ssm-incidents' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ssm-incidents-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ssm-incidents-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ssm-incidents-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ssm-incidents-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ssm-incidents-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ssm-incidents-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ssm-incidents-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ssm-incidents-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ssm-incidents-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ssm-incidents-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'ssm-sap' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => ['variants' => [['hostname' => 'ssm-sap-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'ssm-sap-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'ssm-sap-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'ssm-sap-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'ssm-sap-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'ssm-sap-fips.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'ssm-sap-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'ssm-sap-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'ssm-sap-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'ssm-sap-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'sso' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'states' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'states-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'states-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'states-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'states-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'states-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'states-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'states-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'states-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'storagegateway' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'storagegateway-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'storagegateway-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'storagegateway-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'storagegateway-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'storagegateway-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-west-2.amazonaws.com']]], 'streams.dynamodb' => ['defaults' => ['credentialScope' => ['service' => 'dynamodb'], 'protocols' => ['http', 'https']], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'local' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'localhost:8000', 'protocols' => ['http']], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'sts' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'sts.amazonaws.com'], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'sts-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'sts-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'sts-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'sts-fips.us-east-2.amazonaws.com'], 'us-west-1' => ['variants' => [['hostname' => 'sts-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1-fips' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'sts-fips.us-west-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'sts-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'sts-fips.us-west-2.amazonaws.com']], 'partitionEndpoint' => 'aws-global'], 'support' => ['endpoints' => ['aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'support.us-east-1.amazonaws.com']], 'partitionEndpoint' => 'aws-global'], 'supportapp' => ['endpoints' => ['eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'swf' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'swf-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'swf-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'swf-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'swf-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'swf-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'swf-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'swf-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'swf-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'synthetics' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'synthetics-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'synthetics-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'synthetics-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'synthetics-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'tagging' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'textract' => ['endpoints' => ['ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'textract-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'textract-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'textract-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'textract-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'textract-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'textract-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'tnb' => ['endpoints' => ['ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-3' => [], 'us-east-1' => [], 'us-west-2' => []]], 'transcribe' => ['defaults' => ['protocols' => ['https'], 'variants' => [['hostname' => 'fips.transcribe.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'fips.transcribe.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-west-2.amazonaws.com'], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'fips.transcribe.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'fips.transcribe.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'fips.transcribe.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'fips.transcribe.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'transcribestreaming' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'sa-east-1' => [], 'transcribestreaming-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'transcribestreaming-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'transcribestreaming-fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'transcribestreaming-fips.ca-central-1.amazonaws.com'], 'transcribestreaming-fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'transcribestreaming-fips.us-east-1.amazonaws.com'], 'transcribestreaming-fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'transcribestreaming-fips.us-east-2.amazonaws.com'], 'transcribestreaming-fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'transcribestreaming-fips.us-west-2.amazonaws.com'], 'transcribestreaming-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'transcribestreaming-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'transcribestreaming-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'transcribestreaming-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'transcribestreaming-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'variants' => [['hostname' => 'transcribestreaming-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'transfer' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => ['variants' => [['hostname' => 'transfer-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'transfer-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-west-2.amazonaws.com'], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'transfer-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'transfer-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'transfer-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'transfer-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'translate' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'us-east-1' => ['variants' => [['hostname' => 'translate-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'translate-fips.us-east-1.amazonaws.com'], 'us-east-2' => ['variants' => [['hostname' => 'translate-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2-fips' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'translate-fips.us-east-2.amazonaws.com'], 'us-west-1' => [], 'us-west-2' => ['variants' => [['hostname' => 'translate-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'translate-fips.us-west-2.amazonaws.com']]], 'verifiedpermissions' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'voice-chime' => ['endpoints' => ['ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-southeast-1' => [], 'ca-central-1' => ['variants' => [['hostname' => 'voice-chime-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1-fips' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'voice-chime-fips.ca-central-1.amazonaws.com'], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => ['variants' => [['hostname' => 'voice-chime-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'voice-chime-fips.us-east-1.amazonaws.com'], 'us-west-2' => ['variants' => [['hostname' => 'voice-chime-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2-fips' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'voice-chime-fips.us-west-2.amazonaws.com']]], 'voiceid' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => ['variants' => [['hostname' => 'voiceid-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'voiceid-fips.ca-central-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'voiceid-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'voiceid-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'voiceid-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'voiceid-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'vpc-lattice' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-2' => []]], 'waf' => ['endpoints' => ['aws' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'waf-fips.amazonaws.com', 'tags' => ['fips']]]], 'aws-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'waf-fips.amazonaws.com'], 'aws-global' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'waf.amazonaws.com', 'variants' => [['hostname' => 'waf-fips.amazonaws.com', 'tags' => ['fips']]]], 'aws-global-fips' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'waf-fips.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-global'], 'waf-regional' => ['endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'waf-regional.af-south-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.af-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'waf-regional.ap-east-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'waf-regional.ap-northeast-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'waf-regional.ap-northeast-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'waf-regional.ap-northeast-3.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-northeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'waf-regional.ap-south-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'hostname' => 'waf-regional.ap-south-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-south-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'waf-regional.ap-southeast-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'waf-regional.ap-southeast-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'hostname' => 'waf-regional.ap-southeast-3.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-southeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'hostname' => 'waf-regional.ap-southeast-4.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ap-southeast-4.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'waf-regional.ca-central-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'waf-regional.eu-central-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'hostname' => 'waf-regional.eu-central-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-central-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'waf-regional.eu-north-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-north-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'waf-regional.eu-south-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-south-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'hostname' => 'waf-regional.eu-south-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-south-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'waf-regional.eu-west-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'waf-regional.eu-west-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'waf-regional.eu-west-3.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'fips-af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.af-south-1.amazonaws.com'], 'fips-ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-east-1.amazonaws.com'], 'fips-ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-northeast-1.amazonaws.com'], 'fips-ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-northeast-2.amazonaws.com'], 'fips-ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-northeast-3.amazonaws.com'], 'fips-ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-south-1.amazonaws.com'], 'fips-ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-south-2.amazonaws.com'], 'fips-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-southeast-1.amazonaws.com'], 'fips-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-southeast-2.amazonaws.com'], 'fips-ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-southeast-3.amazonaws.com'], 'fips-ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ap-southeast-4.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.ca-central-1.amazonaws.com'], 'fips-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-central-1.amazonaws.com'], 'fips-eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-central-2.amazonaws.com'], 'fips-eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-north-1.amazonaws.com'], 'fips-eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-south-1.amazonaws.com'], 'fips-eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-south-2.amazonaws.com'], 'fips-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-west-1.amazonaws.com'], 'fips-eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-west-2.amazonaws.com'], 'fips-eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.eu-west-3.amazonaws.com'], 'fips-il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.il-central-1.amazonaws.com'], 'fips-me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.me-central-1.amazonaws.com'], 'fips-me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.me-south-1.amazonaws.com'], 'fips-sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.sa-east-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'hostname' => 'waf-regional.il-central-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.il-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'hostname' => 'waf-regional.me-central-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.me-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'waf-regional.me-south-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.me-south-1.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'waf-regional.sa-east-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'waf-regional.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'waf-regional.us-east-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'waf-regional.us-west-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'waf-regional.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'wafv2' => ['endpoints' => ['af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'hostname' => 'wafv2.af-south-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.af-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'hostname' => 'wafv2.ap-east-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-east-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'hostname' => 'wafv2.ap-northeast-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-northeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'hostname' => 'wafv2.ap-northeast-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-northeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'hostname' => 'wafv2.ap-northeast-3.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-northeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'hostname' => 'wafv2.ap-south-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-south-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'hostname' => 'wafv2.ap-south-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-south-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'hostname' => 'wafv2.ap-southeast-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-southeast-1.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'hostname' => 'wafv2.ap-southeast-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-southeast-2.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'hostname' => 'wafv2.ap-southeast-3.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-southeast-3.amazonaws.com', 'tags' => ['fips']]]], 'ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'hostname' => 'wafv2.ap-southeast-4.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ap-southeast-4.amazonaws.com', 'tags' => ['fips']]]], 'ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'hostname' => 'wafv2.ca-central-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.ca-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'hostname' => 'wafv2.eu-central-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-central-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'hostname' => 'wafv2.eu-central-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-central-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'hostname' => 'wafv2.eu-north-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-north-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'hostname' => 'wafv2.eu-south-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-south-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'hostname' => 'wafv2.eu-south-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-south-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'hostname' => 'wafv2.eu-west-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-west-1.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'hostname' => 'wafv2.eu-west-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-west-2.amazonaws.com', 'tags' => ['fips']]]], 'eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'hostname' => 'wafv2.eu-west-3.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.eu-west-3.amazonaws.com', 'tags' => ['fips']]]], 'fips-af-south-1' => ['credentialScope' => ['region' => 'af-south-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.af-south-1.amazonaws.com'], 'fips-ap-east-1' => ['credentialScope' => ['region' => 'ap-east-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-east-1.amazonaws.com'], 'fips-ap-northeast-1' => ['credentialScope' => ['region' => 'ap-northeast-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-northeast-1.amazonaws.com'], 'fips-ap-northeast-2' => ['credentialScope' => ['region' => 'ap-northeast-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-northeast-2.amazonaws.com'], 'fips-ap-northeast-3' => ['credentialScope' => ['region' => 'ap-northeast-3'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-northeast-3.amazonaws.com'], 'fips-ap-south-1' => ['credentialScope' => ['region' => 'ap-south-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-south-1.amazonaws.com'], 'fips-ap-south-2' => ['credentialScope' => ['region' => 'ap-south-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-south-2.amazonaws.com'], 'fips-ap-southeast-1' => ['credentialScope' => ['region' => 'ap-southeast-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-southeast-1.amazonaws.com'], 'fips-ap-southeast-2' => ['credentialScope' => ['region' => 'ap-southeast-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-southeast-2.amazonaws.com'], 'fips-ap-southeast-3' => ['credentialScope' => ['region' => 'ap-southeast-3'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-southeast-3.amazonaws.com'], 'fips-ap-southeast-4' => ['credentialScope' => ['region' => 'ap-southeast-4'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ap-southeast-4.amazonaws.com'], 'fips-ca-central-1' => ['credentialScope' => ['region' => 'ca-central-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.ca-central-1.amazonaws.com'], 'fips-eu-central-1' => ['credentialScope' => ['region' => 'eu-central-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-central-1.amazonaws.com'], 'fips-eu-central-2' => ['credentialScope' => ['region' => 'eu-central-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-central-2.amazonaws.com'], 'fips-eu-north-1' => ['credentialScope' => ['region' => 'eu-north-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-north-1.amazonaws.com'], 'fips-eu-south-1' => ['credentialScope' => ['region' => 'eu-south-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-south-1.amazonaws.com'], 'fips-eu-south-2' => ['credentialScope' => ['region' => 'eu-south-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-south-2.amazonaws.com'], 'fips-eu-west-1' => ['credentialScope' => ['region' => 'eu-west-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-west-1.amazonaws.com'], 'fips-eu-west-2' => ['credentialScope' => ['region' => 'eu-west-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-west-2.amazonaws.com'], 'fips-eu-west-3' => ['credentialScope' => ['region' => 'eu-west-3'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.eu-west-3.amazonaws.com'], 'fips-il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.il-central-1.amazonaws.com'], 'fips-me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.me-central-1.amazonaws.com'], 'fips-me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.me-south-1.amazonaws.com'], 'fips-sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.sa-east-1.amazonaws.com'], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-west-2.amazonaws.com'], 'il-central-1' => ['credentialScope' => ['region' => 'il-central-1'], 'hostname' => 'wafv2.il-central-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.il-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-central-1' => ['credentialScope' => ['region' => 'me-central-1'], 'hostname' => 'wafv2.me-central-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.me-central-1.amazonaws.com', 'tags' => ['fips']]]], 'me-south-1' => ['credentialScope' => ['region' => 'me-south-1'], 'hostname' => 'wafv2.me-south-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.me-south-1.amazonaws.com', 'tags' => ['fips']]]], 'sa-east-1' => ['credentialScope' => ['region' => 'sa-east-1'], 'hostname' => 'wafv2.sa-east-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.sa-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'hostname' => 'wafv2.us-east-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'hostname' => 'wafv2.us-east-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'hostname' => 'wafv2.us-west-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'hostname' => 'wafv2.us-west-2.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'wellarchitected' => ['endpoints' => ['ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-north-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => [], 'us-east-2' => [], 'us-west-1' => [], 'us-west-2' => []]], 'wisdom' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-2' => [], 'eu-central-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['deprecated' => \true], 'fips-us-west-2' => ['deprecated' => \true], 'ui-ap-northeast-1' => [], 'ui-ap-southeast-2' => [], 'ui-eu-central-1' => [], 'ui-eu-west-2' => [], 'ui-us-east-1' => [], 'ui-us-west-2' => [], 'us-east-1' => ['variants' => [['tags' => ['fips']]]], 'us-west-2' => ['variants' => [['tags' => ['fips']]]]]], 'workdocs' => ['endpoints' => ['ap-northeast-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'eu-west-1' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'workdocs-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'workdocs-fips.us-west-2.amazonaws.com'], 'us-east-1' => ['variants' => [['hostname' => 'workdocs-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'workdocs-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'workmail' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['eu-west-1' => [], 'us-east-1' => [], 'us-west-2' => []]], 'workspaces' => ['endpoints' => ['af-south-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'workspaces-fips.us-east-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'workspaces-fips.us-west-2.amazonaws.com'], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'workspaces-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'workspaces-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]], 'workspaces-web' => ['endpoints' => ['ap-northeast-1' => [], 'ap-south-1' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'us-east-1' => [], 'us-west-2' => []]], 'xray' => ['endpoints' => ['af-south-1' => [], 'ap-east-1' => [], 'ap-northeast-1' => [], 'ap-northeast-2' => [], 'ap-northeast-3' => [], 'ap-south-1' => [], 'ap-south-2' => [], 'ap-southeast-1' => [], 'ap-southeast-2' => [], 'ap-southeast-3' => [], 'ap-southeast-4' => [], 'ca-central-1' => [], 'eu-central-1' => [], 'eu-central-2' => [], 'eu-north-1' => [], 'eu-south-1' => [], 'eu-south-2' => [], 'eu-west-1' => [], 'eu-west-2' => [], 'eu-west-3' => [], 'fips-us-east-1' => ['credentialScope' => ['region' => 'us-east-1'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-east-1.amazonaws.com'], 'fips-us-east-2' => ['credentialScope' => ['region' => 'us-east-2'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-east-2.amazonaws.com'], 'fips-us-west-1' => ['credentialScope' => ['region' => 'us-west-1'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-west-1.amazonaws.com'], 'fips-us-west-2' => ['credentialScope' => ['region' => 'us-west-2'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-west-2.amazonaws.com'], 'il-central-1' => [], 'me-central-1' => [], 'me-south-1' => [], 'sa-east-1' => [], 'us-east-1' => ['variants' => [['hostname' => 'xray-fips.us-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-east-2' => ['variants' => [['hostname' => 'xray-fips.us-east-2.amazonaws.com', 'tags' => ['fips']]]], 'us-west-1' => ['variants' => [['hostname' => 'xray-fips.us-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-west-2' => ['variants' => [['hostname' => 'xray-fips.us-west-2.amazonaws.com', 'tags' => ['fips']]]]]]]], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']], ['dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'dnsSuffix' => 'amazonaws.com.cn', 'partition' => 'aws-cn', 'partitionName' => 'AWS China', 'regionRegex' => '^cn\\-\\w+\\-\\d+$', 'regions' => ['cn-north-1' => ['description' => 'China (Beijing)'], 'cn-northwest-1' => ['description' => 'China (Ningxia)']], 'services' => ['access-analyzer' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'account' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'account.cn-northwest-1.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'acm' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'airflow' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'api.ecr' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'api.ecr.cn-north-1.amazonaws.com.cn'], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'api.ecr.cn-northwest-1.amazonaws.com.cn']]], 'api.sagemaker' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'api.tunneling.iot' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'apigateway' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'appconfig' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'appconfigdata' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'application-autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'applicationinsights' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'appmesh' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'appmesh.cn-north-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'appmesh.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]]]], 'appsync' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'arc-zonal-shift' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'athena' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'athena.cn-north-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'athena.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]]]], 'autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'autoscaling-plans' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'backup' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'backupstorage' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'batch' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'budgets' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'budgets.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'cassandra' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'ce' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'ce.cn-northwest-1.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'cloudcontrolapi' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'cloudformation' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'cloudfront' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'cloudfront.cn-northwest-1.amazonaws.com.cn', 'protocols' => ['http', 'https']]], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'cloudtrail' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'codebuild' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'codecommit' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'codedeploy' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'codepipeline' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'cognito-identity' => ['endpoints' => ['cn-north-1' => []]], 'compute-optimizer' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'compute-optimizer.cn-north-1.amazonaws.com.cn'], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'compute-optimizer.cn-northwest-1.amazonaws.com.cn']]], 'config' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'cur' => ['endpoints' => ['cn-northwest-1' => []]], 'data-ats.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['cn-north-1' => ['hostname' => 'data.ats.iot.cn-north-1.amazonaws.com.cn', 'protocols' => ['https']], 'cn-northwest-1' => []]], 'data.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'data.jobs.iot' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'databrew' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'datasync' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'dax' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'directconnect' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'dlm' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'dms' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'docdb' => ['endpoints' => ['cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'rds.cn-northwest-1.amazonaws.com.cn']]], 'ds' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'dynamodb' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'ebs' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'ec2' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'ecs' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'eks' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'elasticache' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'elasticbeanstalk' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'elasticfilesystem' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.cn-north-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'fips-cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.cn-north-1.amazonaws.com.cn'], 'fips-cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn']]], 'elasticloadbalancing' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'elasticmapreduce' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'emr-containers' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'emr-serverless' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'es' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'events' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'firehose' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'firehose.cn-north-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'firehose.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]]]], 'fms' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'fsx' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'gamelift' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'glacier' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'glue' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'greengrass' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => []], 'isRegionalized' => \true], 'guardduty' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []], 'isRegionalized' => \true], 'health' => ['defaults' => ['protocols' => ['https'], 'sslCommonName' => 'health.cn-northwest-1.amazonaws.com.cn'], 'endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'global.health.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'iam' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'iam.cn-north-1.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'internetmonitor' => ['defaults' => ['dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [['dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['cn-north-1' => ['hostname' => 'internetmonitor.cn-north-1.api.amazonwebservices.com.cn'], 'cn-northwest-1' => ['hostname' => 'internetmonitor.cn-northwest-1.api.amazonwebservices.com.cn']]], 'iot' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'iotanalytics' => ['endpoints' => ['cn-north-1' => []]], 'iotevents' => ['endpoints' => ['cn-north-1' => []]], 'ioteventsdata' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'data.iotevents.cn-north-1.amazonaws.com.cn']]], 'iotsecuredtunneling' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'iotsitewise' => ['endpoints' => ['cn-north-1' => []]], 'kafka' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'kendra-ranking' => ['defaults' => ['dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [['dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['cn-north-1' => ['hostname' => 'kendra-ranking.cn-north-1.api.amazonwebservices.com.cn'], 'cn-northwest-1' => ['hostname' => 'kendra-ranking.cn-northwest-1.api.amazonwebservices.com.cn']]], 'kinesis' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'kinesisanalytics' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'kinesisvideo' => ['endpoints' => ['cn-north-1' => []]], 'kms' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'lakeformation' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'lambda' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'lambda.cn-north-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'lambda.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]]]], 'license-manager' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'license-manager-linux-subscriptions' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'logs' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'mediaconvert' => ['endpoints' => ['cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'subscribe.mediaconvert.cn-northwest-1.amazonaws.com.cn']]], 'memory-db' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'metrics.sagemaker' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'monitoring' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'mq' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'neptune' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'rds.cn-north-1.amazonaws.com.cn'], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'rds.cn-northwest-1.amazonaws.com.cn']]], 'oam' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'organizations' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'organizations.cn-northwest-1.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'personalize' => ['endpoints' => ['cn-north-1' => []]], 'pi' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'polly' => ['endpoints' => ['cn-northwest-1' => []]], 'ram' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'rbin' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'rds' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'redshift' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'resource-explorer-2' => ['defaults' => ['dnsSuffix' => 'api.amazonwebservices.com.cn', 'variants' => [['dnsSuffix' => 'api.amazonwebservices.com.cn', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['cn-north-1' => ['hostname' => 'resource-explorer-2.cn-north-1.api.amazonwebservices.com.cn'], 'cn-northwest-1' => ['hostname' => 'resource-explorer-2.cn-northwest-1.api.amazonwebservices.com.cn']]], 'resource-groups' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'rolesanywhere' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'route53' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'route53.amazonaws.com.cn']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-cn-global'], 'route53resolver' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'runtime.sagemaker' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 's3' => ['defaults' => ['protocols' => ['http', 'https'], 'signatureVersions' => ['s3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 's3.dualstack.cn-north-1.amazonaws.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 's3.dualstack.cn-northwest-1.amazonaws.com.cn', 'tags' => ['dualstack']]]]]], 's3-control' => ['defaults' => ['protocols' => ['https'], 'signatureVersions' => ['s3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com.cn', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 's3-control.cn-north-1.amazonaws.com.cn', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.cn-north-1.amazonaws.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 's3-control.cn-northwest-1.amazonaws.com.cn', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control.dualstack.cn-northwest-1.amazonaws.com.cn', 'tags' => ['dualstack']]]]]], 'savingsplans' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'savingsplans.cn-north-1.amazonaws.com.cn'], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'savingsplans.cn-northwest-1.amazonaws.com.cn']], 'isRegionalized' => \true], 'schemas' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'secretsmanager' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'securityhub' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'serverlessrepo' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => ['protocols' => ['https']], 'cn-northwest-1' => ['protocols' => ['https']]]], 'servicecatalog' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'servicediscovery' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'servicediscovery.cn-north-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn', 'tags' => ['dualstack']]]]]], 'servicequotas' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'signer' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'sms' => ['endpoints' => ['cn-north-1' => []]], 'snowball' => ['endpoints' => ['cn-north-1' => ['variants' => [['hostname' => 'snowball-fips.cn-north-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'cn-northwest-1' => ['variants' => [['hostname' => 'snowball-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'fips-cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.cn-north-1.amazonaws.com.cn'], 'fips-cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.cn-northwest-1.amazonaws.com.cn']]], 'sns' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'sqs' => ['defaults' => ['protocols' => ['http', 'https'], 'sslCommonName' => '{region}.queue.{dnsSuffix}'], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'ssm' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'states' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'storagegateway' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'streams.dynamodb' => ['defaults' => ['credentialScope' => ['service' => 'dynamodb'], 'protocols' => ['http', 'https']], 'endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'sts' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'support' => ['endpoints' => ['aws-cn-global' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'support.cn-north-1.amazonaws.com.cn']], 'partitionEndpoint' => 'aws-cn-global'], 'swf' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'synthetics' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'tagging' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'transcribe' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'cn.transcribe.cn-north-1.amazonaws.com.cn'], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'cn.transcribe.cn-northwest-1.amazonaws.com.cn']]], 'transcribestreaming' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'transfer' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]], 'waf-regional' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'waf-regional.cn-north-1.amazonaws.com.cn', 'variants' => [['hostname' => 'waf-regional-fips.cn-north-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'waf-regional.cn-northwest-1.amazonaws.com.cn', 'variants' => [['hostname' => 'waf-regional-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'fips-cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.cn-north-1.amazonaws.com.cn'], 'fips-cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.cn-northwest-1.amazonaws.com.cn']]], 'wafv2' => ['endpoints' => ['cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'hostname' => 'wafv2.cn-north-1.amazonaws.com.cn', 'variants' => [['hostname' => 'wafv2-fips.cn-north-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'hostname' => 'wafv2.cn-northwest-1.amazonaws.com.cn', 'variants' => [['hostname' => 'wafv2-fips.cn-northwest-1.amazonaws.com.cn', 'tags' => ['fips']]]], 'fips-cn-north-1' => ['credentialScope' => ['region' => 'cn-north-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.cn-north-1.amazonaws.com.cn'], 'fips-cn-northwest-1' => ['credentialScope' => ['region' => 'cn-northwest-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.cn-northwest-1.amazonaws.com.cn']]], 'workspaces' => ['endpoints' => ['cn-northwest-1' => []]], 'xray' => ['endpoints' => ['cn-north-1' => [], 'cn-northwest-1' => []]]]], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']], ['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'api.aws', 'hostname' => '{service}.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'dnsSuffix' => 'amazonaws.com', 'partition' => 'aws-us-gov', 'partitionName' => 'AWS GovCloud (US)', 'regionRegex' => '^us\\-gov\\-\\w+\\-\\d+$', 'regions' => ['us-gov-east-1' => ['description' => 'AWS GovCloud (US-East)'], 'us-gov-west-1' => ['description' => 'AWS GovCloud (US-West)']], 'services' => ['access-analyzer' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'access-analyzer.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'access-analyzer.us-gov-west-1.amazonaws.com']]], 'acm' => ['defaults' => ['variants' => [['hostname' => 'acm.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'acm.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'acm.us-gov-west-1.amazonaws.com']]], 'acm-pca' => ['defaults' => ['protocols' => ['https'], 'variants' => [['hostname' => 'acm-pca.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'acm-pca.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'acm-pca.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'acm-pca.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'acm-pca.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'api.detective' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'api.detective-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'api.detective-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'api.detective-fips.us-gov-west-1.amazonaws.com']]], 'api.ecr' => ['defaults' => ['variants' => [['hostname' => 'ecr-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['dkr-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'dkr-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'fips-dkr-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com'], 'fips-dkr-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com'], 'fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'api.ecr.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'api.ecr.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'ecr-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'api.sagemaker' => ['defaults' => ['variants' => [['hostname' => 'api-fips.sagemaker.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => ['variants' => [['hostname' => 'api-fips.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'api-fips.sagemaker.us-gov-west-1.amazonaws.com'], 'us-gov-west-1-fips-secondary' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'api.sagemaker.us-gov-west-1.amazonaws.com'], 'us-gov-west-1-secondary' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'api.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'api.tunneling.iot' => ['defaults' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'apigateway' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'appconfig' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'appconfig.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'appconfig.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'appconfig.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'appconfig.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'appconfigdata' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'application-autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-gov-east-1' => ['hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'protocols' => ['http', 'https'], 'variants' => [['hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['deprecated' => \true, 'hostname' => 'application-autoscaling.us-gov-east-1.amazonaws.com', 'protocols' => ['http', 'https']], 'us-gov-west-1' => ['hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'protocols' => ['http', 'https'], 'variants' => [['hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['deprecated' => \true, 'hostname' => 'application-autoscaling.us-gov-west-1.amazonaws.com', 'protocols' => ['http', 'https']]]], 'applicationinsights' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'applicationinsights.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'applicationinsights.us-gov-west-1.amazonaws.com']]], 'appstream2' => ['defaults' => ['credentialScope' => ['service' => 'appstream'], 'protocols' => ['https']], 'endpoints' => ['fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'appstream2-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'appstream2-fips.us-gov-west-1.amazonaws.com']]], 'athena' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'athena-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'athena-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-gov-east-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-gov-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'athena-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'athena-fips.us-gov-west-1.api.aws', 'tags' => ['dualstack', 'fips']], ['hostname' => 'athena.us-gov-west-1.api.aws', 'tags' => ['dualstack']]]]]], 'autoscaling' => ['defaults' => ['variants' => [['hostname' => 'autoscaling.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['protocols' => ['http', 'https']], 'us-gov-west-1' => ['protocols' => ['http', 'https']]]], 'autoscaling-plans' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-gov-east-1' => ['protocols' => ['http', 'https']], 'us-gov-west-1' => ['protocols' => ['http', 'https']]]], 'backup' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'backup-gateway' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'backupstorage' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'batch' => ['defaults' => ['variants' => [['hostname' => 'batch.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'batch.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'batch.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'batch.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'batch.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'cassandra' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'cassandra.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'cassandra.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'cassandra.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'cassandra.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'cassandra.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cassandra.us-gov-west-1.amazonaws.com']]], 'cloudcontrolapi' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cloudcontrolapi-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'cloudcontrolapi-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'clouddirectory' => ['endpoints' => ['us-gov-west-1' => ['variants' => [['hostname' => 'clouddirectory.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'clouddirectory.us-gov-west-1.amazonaws.com']]], 'cloudformation' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'cloudformation.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'cloudformation.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'cloudformation.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'cloudformation.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'cloudformation.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cloudformation.us-gov-west-1.amazonaws.com']]], 'cloudhsm' => ['endpoints' => ['us-gov-west-1' => []]], 'cloudhsmv2' => ['defaults' => ['credentialScope' => ['service' => 'cloudhsm']], 'endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'cloudtrail' => ['defaults' => ['variants' => [['hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'cloudtrail.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'cloudtrail.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'cloudtrail.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'codebuild' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'codebuild-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'codebuild-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'codebuild-fips.us-gov-west-1.amazonaws.com']]], 'codecommit' => ['endpoints' => ['fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'codecommit-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'codecommit-fips.us-gov-west-1.amazonaws.com']]], 'codedeploy' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'codedeploy-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'codedeploy-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'codedeploy-fips.us-gov-west-1.amazonaws.com']]], 'codepipeline' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'codepipeline-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'codepipeline-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'codepipeline-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'cognito-identity' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cognito-identity-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'cognito-identity-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'cognito-idp' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'cognito-idp-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'cognito-idp-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'comprehend' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'comprehend-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'comprehend-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'comprehendmedical' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'comprehendmedical-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'comprehendmedical-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'compute-optimizer' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'compute-optimizer-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'compute-optimizer-fips.us-gov-west-1.amazonaws.com']]], 'config' => ['defaults' => ['variants' => [['hostname' => 'config.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'config.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'config.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'config.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'config.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'connect' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'connect.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'connect.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'controltower' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'data-ats.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'data.iot' => ['defaults' => ['credentialScope' => ['service' => 'iotdata'], 'protocols' => ['https']], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['service' => 'iotdata'], 'deprecated' => \true, 'hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'data.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'data.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'data.jobs.iot' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'data.jobs.iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'data.jobs.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'databrew' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'databrew.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'databrew.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'datasync' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'datasync-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'datasync-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'datasync-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'directconnect' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'directconnect.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'directconnect.us-gov-west-1.amazonaws.com']]], 'dlm' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'dlm.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'dlm.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'dlm.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'dlm.us-gov-west-1.amazonaws.com']]], 'dms' => ['defaults' => ['variants' => [['hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['dms' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'dms.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'dms-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'dms.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'dms.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'dms.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'dms.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'dms.us-gov-west-1.amazonaws.com']]], 'docdb' => ['endpoints' => ['us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'rds.us-gov-west-1.amazonaws.com']]], 'ds' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ds-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'ds-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'ds-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'dynamodb' => ['defaults' => ['variants' => [['hostname' => 'dynamodb.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'dynamodb.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'dynamodb.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'dynamodb.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'dynamodb.us-gov-west-1.amazonaws.com']]], 'ebs' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'ec2' => ['defaults' => ['variants' => [['hostname' => 'ec2.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'ec2.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'ec2.us-gov-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'ec2.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'ec2.us-gov-west-1.api.aws', 'tags' => ['dualstack']]]]]], 'ecs' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ecs-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'ecs-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'ecs-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'eks' => ['defaults' => ['protocols' => ['http', 'https'], 'variants' => [['hostname' => 'eks.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'eks.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'eks.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'eks.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'eks.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticache' => ['defaults' => ['variants' => [['hostname' => 'elasticache.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticache.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => [], 'us-gov-west-1' => ['variants' => [['hostname' => 'elasticache.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticache.us-gov-west-1.amazonaws.com']]], 'elasticbeanstalk' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticbeanstalk.us-gov-west-1.amazonaws.com']]], 'elasticfilesystem' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticloadbalancing' => ['defaults' => ['variants' => [['hostname' => 'elasticloadbalancing.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticloadbalancing.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'elasticloadbalancing.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['protocols' => ['http', 'https'], 'variants' => [['hostname' => 'elasticloadbalancing.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'elasticmapreduce' => ['defaults' => ['variants' => [['hostname' => 'elasticmapreduce.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'elasticmapreduce.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'elasticmapreduce.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['protocols' => ['https'], 'variants' => [['hostname' => 'elasticmapreduce.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'email' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'email-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'email-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'emr-containers' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'es' => ['endpoints' => ['fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'es-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'es-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'es-fips.us-gov-west-1.amazonaws.com']]], 'events' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'events.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'events.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'events.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'events.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'firehose' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'firehose-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'firehose-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'firehose-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'fms' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'fms-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'fms-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'fms-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'fsx' => ['endpoints' => ['fips-prod-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com'], 'fips-prod-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com'], 'fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com'], 'prod-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'prod-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1' => ['variants' => [['hostname' => 'fsx-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'fsx-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'glacier' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'glacier.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'glacier.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'glacier.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['protocols' => ['http', 'https'], 'variants' => [['hostname' => 'glacier.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'glue' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'glue-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'glue-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'glue-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'greengrass' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['dataplane-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'greengrass-ats.iot.us-gov-east-1.amazonaws.com'], 'dataplane-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'greengrass-ats.iot.us-gov-west-1.amazonaws.com'], 'fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'greengrass.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'greengrass.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'greengrass.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'greengrass.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]], 'isRegionalized' => \true], 'guardduty' => ['defaults' => ['protocols' => ['https'], 'variants' => [['hostname' => 'guardduty.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'guardduty.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'guardduty.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'guardduty.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'guardduty.us-gov-west-1.amazonaws.com']], 'isRegionalized' => \true], 'health' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'health-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'health-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'iam' => ['endpoints' => ['aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'iam.us-gov.amazonaws.com', 'variants' => [['hostname' => 'iam.us-gov.amazonaws.com', 'tags' => ['fips']]]], 'aws-us-gov-global-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'iam.us-gov.amazonaws.com'], 'iam-govcloud' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'iam.us-gov.amazonaws.com', 'tags' => ['fips']]]], 'iam-govcloud-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'iam.us-gov.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-us-gov-global'], 'identitystore' => ['defaults' => ['variants' => [['hostname' => 'identitystore.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'identitystore.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'identitystore.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'identitystore.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'identitystore.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'ingest.timestream' => ['endpoints' => ['us-gov-west-1' => ['variants' => [['hostname' => 'ingest.timestream.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ingest.timestream.us-gov-west-1.amazonaws.com']]], 'inspector' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'inspector-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'inspector-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'inspector-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'inspector2' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'inspector2-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'inspector2-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'inspector2-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'internetmonitor' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['hostname' => 'internetmonitor.us-gov-east-1.api.aws'], 'us-gov-west-1' => ['hostname' => 'internetmonitor.us-gov-west-1.api.aws']]], 'iot' => ['endpoints' => ['fips-us-gov-east-1' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['deprecated' => \true, 'hostname' => 'iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'iotevents' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'iotevents-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'iotevents-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'ioteventsdata' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'data.iotevents-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'data.iotevents.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'data.iotevents-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'iotsecuredtunneling' => ['defaults' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'api.tunneling.iot-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'iotsitewise' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'iotsitewise-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'iotsitewise-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'iottwinmaker' => ['endpoints' => ['api-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'api.iottwinmaker.us-gov-west-1.amazonaws.com'], 'data-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'data.iottwinmaker.us-gov-west-1.amazonaws.com'], 'fips-api-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'api.iottwinmaker-fips.us-gov-west-1.amazonaws.com'], 'fips-data-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'data.iottwinmaker-fips.us-gov-west-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'iottwinmaker-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'iottwinmaker-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'kafka' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'kafka.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'kafka.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'kafka.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'kafka.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'kafka.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'kafka.us-gov-west-1.amazonaws.com']]], 'kendra' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'kendra-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'kendra-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'kendra-ranking' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['hostname' => 'kendra-ranking.us-gov-east-1.api.aws'], 'us-gov-west-1' => ['hostname' => 'kendra-ranking.us-gov-west-1.api.aws']]], 'kinesis' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'kinesis.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'kinesis.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'kinesis.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'kinesis.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'kinesis.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'kinesis.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'kinesisanalytics' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'kms' => ['endpoints' => ['ProdFips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'kms-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'kms-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-gov-west-1.amazonaws.com']]], 'lakeformation' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'lakeformation-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'lakeformation-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'lakeformation-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'lambda' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'lambda-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'lambda-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-gov-east-1.api.aws', 'tags' => ['dualstack']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'lambda-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'lambda.us-gov-west-1.api.aws', 'tags' => ['dualstack']]]]]], 'license-manager' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'license-manager-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'license-manager-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'license-manager-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'license-manager-linux-subscriptions' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'logs' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'logs.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'logs.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'logs.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'logs.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'managedblockchain' => ['endpoints' => ['us-gov-west-1' => []]], 'mediaconvert' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'mediaconvert.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'mediaconvert.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'meetings-chime' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'meetings-chime-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'meetings-chime-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'meetings-chime-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'meetings-chime-fips.us-gov-west-1.amazonaws.com']]], 'metering.marketplace' => ['defaults' => ['credentialScope' => ['service' => 'aws-marketplace']], 'endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'metrics.sagemaker' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'mgn' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'mgn-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'mgn-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'mgn-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'models.lex' => ['defaults' => ['credentialScope' => ['service' => 'lex'], 'variants' => [['hostname' => 'models-fips.lex.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-west-1' => ['variants' => [['hostname' => 'models-fips.lex.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'models-fips.lex.us-gov-west-1.amazonaws.com']]], 'monitoring' => ['defaults' => ['variants' => [['hostname' => 'monitoring.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'monitoring.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'monitoring.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'monitoring.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'monitoring.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'mq' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'mq-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'mq-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'mq-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'neptune' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'rds.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'rds.us-gov-west-1.amazonaws.com']]], 'network-firewall' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'network-firewall-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'network-firewall-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'network-firewall-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'networkmanager' => ['endpoints' => ['aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'networkmanager.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'networkmanager.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'networkmanager.us-gov-west-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-us-gov-global'], 'oidc' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'oidc.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'oidc.us-gov-west-1.amazonaws.com']]], 'organizations' => ['endpoints' => ['aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'organizations.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'organizations.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'organizations.us-gov-west-1.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-us-gov-global'], 'outposts' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'outposts.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'outposts.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'outposts.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'outposts.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'participant.connect' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'participant.connect.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'participant.connect.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'pi' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'pinpoint' => ['defaults' => ['credentialScope' => ['service' => 'mobiletargeting']], 'endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'pinpoint-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'pinpoint.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'pinpoint-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'polly' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'polly-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'polly-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'portal.sso' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'portal.sso.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'portal.sso.us-gov-west-1.amazonaws.com']]], 'quicksight' => ['endpoints' => ['api' => [], 'us-gov-west-1' => []]], 'ram' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'ram.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'ram.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ram.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'ram.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'ram.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ram.us-gov-west-1.amazonaws.com']]], 'rbin' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'rbin-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'rbin-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'rds' => ['defaults' => ['variants' => [['hostname' => 'rds.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['rds.us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'rds.us-gov-east-1.amazonaws.com'], 'rds.us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'rds.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'rds.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'rds.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'rds.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'rds.us-gov-west-1.amazonaws.com']]], 'redshift' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'redshift.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'redshift.us-gov-west-1.amazonaws.com']]], 'rekognition' => ['endpoints' => ['rekognition-fips.us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com'], 'rekognition.us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'rekognition-fips.us-gov-west-1.amazonaws.com']]], 'resource-explorer-2' => ['defaults' => ['dnsSuffix' => 'api.aws', 'variants' => [['dnsSuffix' => 'api.aws', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['hostname' => 'resource-explorer-2.us-gov-east-1.api.aws'], 'us-gov-west-1' => ['hostname' => 'resource-explorer-2.us-gov-west-1.api.aws']]], 'resource-groups' => ['defaults' => ['variants' => [['hostname' => 'resource-groups.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'resource-groups.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'resource-groups.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'resource-groups.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'resource-groups.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'robomaker' => ['endpoints' => ['us-gov-west-1' => []]], 'route53' => ['endpoints' => ['aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'route53.us-gov.amazonaws.com', 'variants' => [['hostname' => 'route53.us-gov.amazonaws.com', 'tags' => ['fips']]]], 'fips-aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'route53.us-gov.amazonaws.com']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-us-gov-global'], 'route53resolver' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'route53resolver.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['deprecated' => \true, 'hostname' => 'route53resolver.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'route53resolver.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['deprecated' => \true, 'hostname' => 'route53resolver.us-gov-west-1.amazonaws.com']]], 'runtime.lex' => ['defaults' => ['credentialScope' => ['service' => 'lex'], 'variants' => [['hostname' => 'runtime-fips.lex.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-west-1' => ['variants' => [['hostname' => 'runtime-fips.lex.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'runtime-fips.lex.us-gov-west-1.amazonaws.com']]], 'runtime.sagemaker' => ['defaults' => ['variants' => [['hostname' => 'runtime.sagemaker.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => ['variants' => [['hostname' => 'runtime.sagemaker.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'runtime.sagemaker.us-gov-west-1.amazonaws.com']]], 's3' => ['defaults' => ['signatureVersions' => ['s3', 's3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 's3-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 's3-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['hostname' => 's3.us-gov-east-1.amazonaws.com', 'protocols' => ['http', 'https'], 'variants' => [['hostname' => 's3-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-gov-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-gov-west-1' => ['hostname' => 's3.us-gov-west-1.amazonaws.com', 'protocols' => ['http', 'https'], 'variants' => [['hostname' => 's3-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3.dualstack.us-gov-west-1.amazonaws.com', 'tags' => ['dualstack']]]]]], 's3-control' => ['defaults' => ['protocols' => ['https'], 'signatureVersions' => ['s3v4'], 'variants' => [['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}-fips.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack', 'fips']], ['dnsSuffix' => 'amazonaws.com', 'hostname' => '{service}.dualstack.{region}.{dnsSuffix}', 'tags' => ['dualstack']]]], 'endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 's3-control.us-gov-east-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-gov-east-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-gov-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-gov-east-1.amazonaws.com', 'signatureVersions' => ['s3v4']], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 's3-control.us-gov-west-1.amazonaws.com', 'signatureVersions' => ['s3v4'], 'variants' => [['hostname' => 's3-control-fips.dualstack.us-gov-west-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 's3-control-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 's3-control.dualstack.us-gov-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 's3-control-fips.us-gov-west-1.amazonaws.com', 'signatureVersions' => ['s3v4']]]], 's3-outposts' => ['endpoints' => ['fips-us-gov-east-1' => ['deprecated' => \true], 'fips-us-gov-west-1' => ['deprecated' => \true], 'us-gov-east-1' => ['variants' => [['tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['tags' => ['fips']]]]]], 'secretsmanager' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'secretsmanager-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'secretsmanager-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'secretsmanager-fips.us-gov-west-1.amazonaws.com']]], 'securityhub' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'securityhub-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'securityhub-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'securityhub-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'serverlessrepo' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-gov-east-1' => ['protocols' => ['https'], 'variants' => [['hostname' => 'serverlessrepo.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'serverlessrepo.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['protocols' => ['https'], 'variants' => [['hostname' => 'serverlessrepo.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'serverlessrepo.us-gov-west-1.amazonaws.com']]], 'servicecatalog' => ['endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'servicecatalog-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'servicecatalog-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'servicecatalog-fips.us-gov-west-1.amazonaws.com']]], 'servicecatalog-appregistry' => ['defaults' => ['variants' => [['hostname' => 'servicecatalog-appregistry.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'servicediscovery' => ['endpoints' => ['servicediscovery' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'servicediscovery-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'servicediscovery-fips.us-gov-east-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery.us-gov-east-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', 'tags' => ['dualstack', 'fips']], ['hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']], ['hostname' => 'servicediscovery.us-gov-west-1.amazonaws.com', 'tags' => ['dualstack']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'servicediscovery-fips.us-gov-west-1.amazonaws.com']]], 'servicequotas' => ['defaults' => ['protocols' => ['https'], 'variants' => [['hostname' => 'servicequotas.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'servicequotas.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'servicequotas.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'servicequotas.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'servicequotas.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'simspaceweaver' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'sms' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'sms-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'sms-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'sms-voice' => ['endpoints' => ['fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'sms-voice-fips.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'sms-voice-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'snowball' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'snowball-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'snowball-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'snowball-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'sns' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'sns.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'sns.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'sns.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['protocols' => ['https'], 'variants' => [['hostname' => 'sns.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'sqs' => ['defaults' => ['variants' => [['hostname' => 'sqs.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'sqs.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'sqs.us-gov-west-1.amazonaws.com', 'protocols' => ['http', 'https'], 'sslCommonName' => '{region}.queue.{dnsSuffix}']]], 'ssm' => ['defaults' => ['variants' => [['hostname' => 'ssm.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'ssm.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'ssm.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'ssm.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'ssm.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'sso' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'sso.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'sso.us-gov-west-1.amazonaws.com']]], 'states' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'states-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'states.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'states-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'states.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'storagegateway' => ['endpoints' => ['fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'storagegateway-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'storagegateway-fips.us-gov-west-1.amazonaws.com']]], 'streams.dynamodb' => ['defaults' => ['credentialScope' => ['service' => 'dynamodb'], 'variants' => [['hostname' => 'streams.dynamodb.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'streams.dynamodb.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'streams.dynamodb.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'streams.dynamodb.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'streams.dynamodb.us-gov-west-1.amazonaws.com']]], 'sts' => ['defaults' => ['variants' => [['hostname' => 'sts.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['us-gov-east-1' => ['variants' => [['hostname' => 'sts.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'sts.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['variants' => [['hostname' => 'sts.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'sts.us-gov-west-1.amazonaws.com']]], 'support' => ['endpoints' => ['aws-us-gov-global' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'support.us-gov-west-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'support.us-gov-west-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'support.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]], 'partitionEndpoint' => 'aws-us-gov-global'], 'swf' => ['endpoints' => ['us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'swf.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'swf.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-east-1-fips' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'swf.us-gov-east-1.amazonaws.com'], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'swf.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'swf.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'swf.us-gov-west-1.amazonaws.com']]], 'synthetics' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'synthetics-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'synthetics-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'synthetics-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'tagging' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'textract' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'textract-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'textract-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'textract-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'transcribe' => ['defaults' => ['protocols' => ['https'], 'variants' => [['hostname' => 'fips.transcribe.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'fips.transcribe.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'fips.transcribe.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'fips.transcribe.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'transcribestreaming' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'transfer' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'transfer-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'transfer-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'transfer-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'translate' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-gov-west-1' => ['variants' => [['hostname' => 'translate-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1-fips' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'translate-fips.us-gov-west-1.amazonaws.com']]], 'waf-regional' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'waf-regional-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'waf-regional.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'waf-regional.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'waf-regional-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'wafv2' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'wafv2-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'hostname' => 'wafv2.us-gov-east-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'hostname' => 'wafv2.us-gov-west-1.amazonaws.com', 'variants' => [['hostname' => 'wafv2-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'wellarchitected' => ['endpoints' => ['us-gov-east-1' => [], 'us-gov-west-1' => []]], 'workspaces' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'workspaces-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'workspaces-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'workspaces-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'workspaces-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]], 'xray' => ['endpoints' => ['fips-us-gov-east-1' => ['credentialScope' => ['region' => 'us-gov-east-1'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-gov-east-1.amazonaws.com'], 'fips-us-gov-west-1' => ['credentialScope' => ['region' => 'us-gov-west-1'], 'deprecated' => \true, 'hostname' => 'xray-fips.us-gov-west-1.amazonaws.com'], 'us-gov-east-1' => ['variants' => [['hostname' => 'xray-fips.us-gov-east-1.amazonaws.com', 'tags' => ['fips']]]], 'us-gov-west-1' => ['variants' => [['hostname' => 'xray-fips.us-gov-west-1.amazonaws.com', 'tags' => ['fips']]]]]]]], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'c2s.ic.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'dnsSuffix' => 'c2s.ic.gov', 'partition' => 'aws-iso', 'partitionName' => 'AWS ISO (US)', 'regionRegex' => '^us\\-iso\\-\\w+\\-\\d+$', 'regions' => ['us-iso-east-1' => ['description' => 'US ISO East'], 'us-iso-west-1' => ['description' => 'US ISO WEST']], 'services' => ['api.ecr' => ['endpoints' => ['us-iso-east-1' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'hostname' => 'api.ecr.us-iso-east-1.c2s.ic.gov'], 'us-iso-west-1' => ['credentialScope' => ['region' => 'us-iso-west-1'], 'hostname' => 'api.ecr.us-iso-west-1.c2s.ic.gov']]], 'api.sagemaker' => ['endpoints' => ['us-iso-east-1' => []]], 'apigateway' => ['endpoints' => ['us-iso-east-1' => []]], 'appconfig' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'appconfigdata' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'application-autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'athena' => ['endpoints' => ['us-iso-east-1' => []]], 'autoscaling' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'cloudcontrolapi' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'cloudformation' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'cloudtrail' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'codedeploy' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'comprehend' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-iso-east-1' => []]], 'config' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'datapipeline' => ['endpoints' => ['us-iso-east-1' => []]], 'directconnect' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'dlm' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'dms' => ['defaults' => ['variants' => [['hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['dms' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'dms.us-iso-east-1.c2s.ic.gov', 'tags' => ['fips']]]], 'dms-fips' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov'], 'us-iso-east-1' => ['variants' => [['hostname' => 'dms.us-iso-east-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-east-1-fips' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'dms.us-iso-east-1.c2s.ic.gov'], 'us-iso-west-1' => ['variants' => [['hostname' => 'dms.us-iso-west-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-west-1-fips' => ['credentialScope' => ['region' => 'us-iso-west-1'], 'deprecated' => \true, 'hostname' => 'dms.us-iso-west-1.c2s.ic.gov']]], 'ds' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'dynamodb' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'ebs' => ['endpoints' => ['us-iso-east-1' => []]], 'ec2' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'ecs' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'eks' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-iso-east-1' => []]], 'elasticache' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'elasticfilesystem' => ['endpoints' => ['fips-us-iso-east-1' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov'], 'fips-us-iso-west-1' => ['credentialScope' => ['region' => 'us-iso-west-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov'], 'us-iso-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-west-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov', 'tags' => ['fips']]]]]], 'elasticloadbalancing' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'elasticmapreduce' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['https']], 'us-iso-west-1' => []]], 'es' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'events' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'firehose' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'glacier' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'glue' => ['endpoints' => ['us-iso-east-1' => []]], 'health' => ['endpoints' => ['us-iso-east-1' => []]], 'iam' => ['endpoints' => ['aws-iso-global' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'hostname' => 'iam.us-iso-east-1.c2s.ic.gov']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-iso-global'], 'kinesis' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'kms' => ['endpoints' => ['ProdFips' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov'], 'us-iso-east-1' => ['variants' => [['hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-east-1-fips' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-iso-east-1.c2s.ic.gov'], 'us-iso-west-1' => ['variants' => [['hostname' => 'kms-fips.us-iso-west-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-west-1-fips' => ['credentialScope' => ['region' => 'us-iso-west-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-iso-west-1.c2s.ic.gov']]], 'lambda' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'license-manager' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'logs' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'medialive' => ['endpoints' => ['us-iso-east-1' => []]], 'mediapackage' => ['endpoints' => ['us-iso-east-1' => []]], 'metrics.sagemaker' => ['endpoints' => ['us-iso-east-1' => []]], 'monitoring' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'outposts' => ['endpoints' => ['us-iso-east-1' => []]], 'ram' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'rbin' => ['endpoints' => ['fips-us-iso-east-1' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-iso-east-1.c2s.ic.gov'], 'fips-us-iso-west-1' => ['credentialScope' => ['region' => 'us-iso-west-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-iso-west-1.c2s.ic.gov'], 'us-iso-east-1' => ['variants' => [['hostname' => 'rbin-fips.us-iso-east-1.c2s.ic.gov', 'tags' => ['fips']]]], 'us-iso-west-1' => ['variants' => [['hostname' => 'rbin-fips.us-iso-west-1.c2s.ic.gov', 'tags' => ['fips']]]]]], 'rds' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'redshift' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'route53' => ['endpoints' => ['aws-iso-global' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'hostname' => 'route53.c2s.ic.gov']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-iso-global'], 'route53resolver' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'runtime.sagemaker' => ['endpoints' => ['us-iso-east-1' => []]], 's3' => ['defaults' => ['signatureVersions' => ['s3v4']], 'endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https'], 'signatureVersions' => ['s3v4']], 'us-iso-west-1' => []]], 'secretsmanager' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'snowball' => ['endpoints' => ['us-iso-east-1' => []]], 'sns' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'sqs' => ['endpoints' => ['us-iso-east-1' => ['protocols' => ['http', 'https']], 'us-iso-west-1' => []]], 'ssm' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'states' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'streams.dynamodb' => ['defaults' => ['credentialScope' => ['service' => 'dynamodb']], 'endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'sts' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'support' => ['endpoints' => ['aws-iso-global' => ['credentialScope' => ['region' => 'us-iso-east-1'], 'hostname' => 'support.us-iso-east-1.c2s.ic.gov']], 'partitionEndpoint' => 'aws-iso-global'], 'swf' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'synthetics' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'tagging' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]], 'transcribe' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-iso-east-1' => []]], 'transcribestreaming' => ['endpoints' => ['us-iso-east-1' => []]], 'translate' => ['defaults' => ['protocols' => ['https']], 'endpoints' => ['us-iso-east-1' => []]], 'workspaces' => ['endpoints' => ['us-iso-east-1' => [], 'us-iso-west-1' => []]]]], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'sc2s.sgov.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'dnsSuffix' => 'sc2s.sgov.gov', 'partition' => 'aws-iso-b', 'partitionName' => 'AWS ISOB (US)', 'regionRegex' => '^us\\-isob\\-\\w+\\-\\d+$', 'regions' => ['us-isob-east-1' => ['description' => 'US ISOB East (Ohio)']], 'services' => ['api.ecr' => ['endpoints' => ['us-isob-east-1' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'hostname' => 'api.ecr.us-isob-east-1.sc2s.sgov.gov']]], 'appconfig' => ['endpoints' => ['us-isob-east-1' => []]], 'appconfigdata' => ['endpoints' => ['us-isob-east-1' => []]], 'application-autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'autoscaling' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'cloudformation' => ['endpoints' => ['us-isob-east-1' => []]], 'cloudtrail' => ['endpoints' => ['us-isob-east-1' => []]], 'codedeploy' => ['endpoints' => ['us-isob-east-1' => []]], 'config' => ['endpoints' => ['us-isob-east-1' => []]], 'directconnect' => ['endpoints' => ['us-isob-east-1' => []]], 'dlm' => ['endpoints' => ['us-isob-east-1' => []]], 'dms' => ['defaults' => ['variants' => [['hostname' => 'dms.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'endpoints' => ['dms' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'variants' => [['hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', 'tags' => ['fips']]]], 'dms-fips' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov'], 'us-isob-east-1' => ['variants' => [['hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov', 'tags' => ['fips']]]], 'us-isob-east-1-fips' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'dms.us-isob-east-1.sc2s.sgov.gov']]], 'ds' => ['endpoints' => ['us-isob-east-1' => []]], 'dynamodb' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'ebs' => ['endpoints' => ['us-isob-east-1' => []]], 'ec2' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'ecs' => ['endpoints' => ['us-isob-east-1' => []]], 'eks' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'elasticache' => ['endpoints' => ['us-isob-east-1' => []]], 'elasticfilesystem' => ['endpoints' => ['fips-us-isob-east-1' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov'], 'us-isob-east-1' => ['variants' => [['hostname' => 'elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => ['fips']]]]]], 'elasticloadbalancing' => ['endpoints' => ['us-isob-east-1' => ['protocols' => ['https']]]], 'elasticmapreduce' => ['endpoints' => ['us-isob-east-1' => []]], 'es' => ['endpoints' => ['us-isob-east-1' => []]], 'events' => ['endpoints' => ['us-isob-east-1' => []]], 'glacier' => ['endpoints' => ['us-isob-east-1' => []]], 'health' => ['endpoints' => ['us-isob-east-1' => []]], 'iam' => ['endpoints' => ['aws-iso-b-global' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'hostname' => 'iam.us-isob-east-1.sc2s.sgov.gov']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-iso-b-global'], 'kinesis' => ['endpoints' => ['us-isob-east-1' => []]], 'kms' => ['endpoints' => ['ProdFips' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov'], 'us-isob-east-1' => ['variants' => [['hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => ['fips']]]], 'us-isob-east-1-fips' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'kms-fips.us-isob-east-1.sc2s.sgov.gov']]], 'lambda' => ['endpoints' => ['us-isob-east-1' => []]], 'license-manager' => ['endpoints' => ['us-isob-east-1' => []]], 'logs' => ['endpoints' => ['us-isob-east-1' => []]], 'metering.marketplace' => ['defaults' => ['credentialScope' => ['service' => 'aws-marketplace']], 'endpoints' => ['us-isob-east-1' => []]], 'metrics.sagemaker' => ['endpoints' => ['us-isob-east-1' => []]], 'monitoring' => ['endpoints' => ['us-isob-east-1' => []]], 'ram' => ['endpoints' => ['us-isob-east-1' => []]], 'rbin' => ['endpoints' => ['fips-us-isob-east-1' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'deprecated' => \true, 'hostname' => 'rbin-fips.us-isob-east-1.sc2s.sgov.gov'], 'us-isob-east-1' => ['variants' => [['hostname' => 'rbin-fips.us-isob-east-1.sc2s.sgov.gov', 'tags' => ['fips']]]]]], 'rds' => ['endpoints' => ['us-isob-east-1' => []]], 'redshift' => ['endpoints' => ['us-isob-east-1' => []]], 'resource-groups' => ['endpoints' => ['us-isob-east-1' => []]], 'route53' => ['endpoints' => ['aws-iso-b-global' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'hostname' => 'route53.sc2s.sgov.gov']], 'isRegionalized' => \false, 'partitionEndpoint' => 'aws-iso-b-global'], 'route53resolver' => ['endpoints' => ['us-isob-east-1' => []]], 's3' => ['defaults' => ['protocols' => ['http', 'https'], 'signatureVersions' => ['s3v4']], 'endpoints' => ['us-isob-east-1' => []]], 'secretsmanager' => ['endpoints' => ['us-isob-east-1' => []]], 'snowball' => ['endpoints' => ['us-isob-east-1' => []]], 'sns' => ['defaults' => ['protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'sqs' => ['defaults' => ['protocols' => ['http', 'https'], 'sslCommonName' => '{region}.queue.{dnsSuffix}'], 'endpoints' => ['us-isob-east-1' => []]], 'ssm' => ['endpoints' => ['us-isob-east-1' => []]], 'states' => ['endpoints' => ['us-isob-east-1' => []]], 'streams.dynamodb' => ['defaults' => ['credentialScope' => ['service' => 'dynamodb'], 'protocols' => ['http', 'https']], 'endpoints' => ['us-isob-east-1' => []]], 'sts' => ['endpoints' => ['us-isob-east-1' => []]], 'support' => ['endpoints' => ['aws-iso-b-global' => ['credentialScope' => ['region' => 'us-isob-east-1'], 'hostname' => 'support.us-isob-east-1.sc2s.sgov.gov']], 'partitionEndpoint' => 'aws-iso-b-global'], 'swf' => ['endpoints' => ['us-isob-east-1' => []]], 'synthetics' => ['endpoints' => ['us-isob-east-1' => []]], 'tagging' => ['endpoints' => ['us-isob-east-1' => []]], 'workspaces' => ['endpoints' => ['us-isob-east-1' => []]]]], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'cloud.adc-e.uk', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'dnsSuffix' => 'cloud.adc-e.uk', 'partition' => 'aws-iso-e', 'partitionName' => 'AWS ISOE (Europe)', 'regionRegex' => '^eu\\-isoe\\-\\w+\\-\\d+$', 'regions' => [], 'services' => []], ['defaults' => ['hostname' => '{service}.{region}.{dnsSuffix}', 'protocols' => ['https'], 'signatureVersions' => ['v4'], 'variants' => [['dnsSuffix' => 'csp.hci.ic.gov', 'hostname' => '{service}-fips.{region}.{dnsSuffix}', 'tags' => ['fips']]]], 'dnsSuffix' => 'csp.hci.ic.gov', 'partition' => 'aws-iso-f', 'partitionName' => 'AWS ISOF', 'regionRegex' => '^us\\-isof\\-\\w+\\-\\d+$', 'regions' => [], 'services' => []]], 'version' => 3];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/grandfathered-services.json.php000064400000011727147600374260026427 0ustar00;;; ['AccessAnalyzer', 'Account', 'ACMPCA', 'ACM', 'AlexaForBusiness', 'PrometheusService', 'Amplify', 'AmplifyBackend', 'AmplifyUIBuilder', 'APIGateway', 'ApiGatewayManagementApi', 'ApiGatewayV2', 'AppConfig', 'AppConfigData', 'Appflow', 'AppIntegrationsService', 'ApplicationAutoScaling', 'ApplicationInsights', 'ApplicationCostProfiler', 'AppMesh', 'AppRunner', 'AppStream', 'AppSync', 'Athena', 'AuditManager', 'AutoScalingPlans', 'AutoScaling', 'BackupGateway', 'Backup', 'Batch', 'BillingConductor', 'Braket', 'Budgets', 'CostExplorer', 'ChimeSDKIdentity', 'ChimeSDKMediaPipelines', 'ChimeSDKMeetings', 'ChimeSDKMessaging', 'Chime', 'Cloud9', 'CloudControlApi', 'CloudDirectory', 'CloudFormation', 'CloudFront', 'CloudHSM', 'CloudHSMV2', 'CloudSearch', 'CloudSearchDomain', 'CloudTrail', 'CodeArtifact', 'CodeBuild', 'CodeCommit', 'CodeDeploy', 'CodeGuruReviewer', 'CodeGuruProfiler', 'CodePipeline', 'CodeStarconnections', 'CodeStarNotifications', 'CodeStar', 'CognitoIdentity', 'CognitoIdentityProvider', 'CognitoSync', 'Comprehend', 'ComprehendMedical', 'ComputeOptimizer', 'ConfigService', 'ConnectContactLens', 'Connect', 'ConnectCampaignService', 'ConnectParticipant', 'CostandUsageReportService', 'CustomerProfiles', 'IoTDataPlane', 'GlueDataBrew', 'DataExchange', 'DataPipeline', 'DataSync', 'DAX', 'Detective', 'DeviceFarm', 'DevOpsGuru', 'DirectConnect', 'ApplicationDiscoveryService', 'DLM', 'DatabaseMigrationService', 'DocDB', 'drs', 'DirectoryService', 'DynamoDB', 'EBS', 'EC2InstanceConnect', 'EC2', 'ECRPublic', 'ECR', 'ECS', 'EKS', 'ElasticInference', 'ElastiCache', 'ElasticBeanstalk', 'EFS', 'ElasticLoadBalancing', 'ElasticLoadBalancingv2', 'EMR', 'ElasticTranscoder', 'SES', 'EMRContainers', 'EMRServerless', 'MarketplaceEntitlementService', 'ElasticsearchService', 'EventBridge', 'CloudWatchEvents', 'CloudWatchEvidently', 'FinSpaceData', 'finspace', 'Firehose', 'FIS', 'FMS', 'ForecastService', 'ForecastQueryService', 'FraudDetector', 'FSx', 'GameLift', 'GameSparks', 'Glacier', 'GlobalAccelerator', 'Glue', 'ManagedGrafana', 'Greengrass', 'GreengrassV2', 'GroundStation', 'GuardDuty', 'Health', 'HealthLake', 'Honeycode', 'IAM', 'IdentityStore', 'imagebuilder', 'ImportExport', 'Inspector', 'Inspector2', 'IoTJobsDataPlane', 'IoT', 'IoT1ClickDevicesService', 'IoT1ClickProjects', 'IoTAnalytics', 'IoTDeviceAdvisor', 'IoTEventsData', 'IoTEvents', 'IoTFleetHub', 'IoTSecureTunneling', 'IoTSiteWise', 'IoTThingsGraph', 'IoTTwinMaker', 'IoTWireless', 'IVS', 'ivschat', 'Kafka', 'KafkaConnect', 'kendra', 'Keyspaces', 'KinesisVideoArchivedMedia', 'KinesisVideoMedia', 'KinesisVideoSignalingChannels', 'Kinesis', 'KinesisAnalytics', 'KinesisAnalyticsV2', 'KinesisVideo', 'KMS', 'LakeFormation', 'Lambda', 'LexModelBuildingService', 'LicenseManager', 'Lightsail', 'LocationService', 'CloudWatchLogs', 'LookoutEquipment', 'LookoutMetrics', 'LookoutforVision', 'MainframeModernization', 'MachineLearning', 'Macie', 'Macie2', 'ManagedBlockchain', 'MarketplaceCatalog', 'MarketplaceCommerceAnalytics', 'MediaConnect', 'MediaConvert', 'MediaLive', 'MediaPackageVod', 'MediaPackage', 'MediaStoreData', 'MediaStore', 'MediaTailor', 'MemoryDB', 'MarketplaceMetering', 'MigrationHub', 'mgn', 'MigrationHubRefactorSpaces', 'MigrationHubConfig', 'MigrationHubStrategyRecommendations', 'Mobile', 'LexModelsV2', 'CloudWatch', 'MQ', 'MTurk', 'MWAA', 'Neptune', 'NetworkFirewall', 'NetworkManager', 'NimbleStudio', 'OpenSearchService', 'OpsWorks', 'OpsWorksCM', 'Organizations', 'Outposts', 'Panorama', 'PersonalizeEvents', 'PersonalizeRuntime', 'Personalize', 'PI', 'PinpointEmail', 'PinpointSMSVoiceV2', 'Pinpoint', 'Polly', 'Pricing', 'Proton', 'QLDBSession', 'QLDB', 'QuickSight', 'RAM', 'RecycleBin', 'RDSDataService', 'RDS', 'RedshiftDataAPIService', 'RedshiftServerless', 'Redshift', 'Rekognition', 'ResilienceHub', 'ResourceGroups', 'ResourceGroupsTaggingAPI', 'RoboMaker', 'Route53RecoveryCluster', 'Route53RecoveryControlConfig', 'Route53RecoveryReadiness', 'Route53', 'Route53Domains', 'Route53Resolver', 'CloudWatchRUM', 'LexRuntimeV2', 'LexRuntimeService', 'SageMakerRuntime', 'S3', 'S3Control', 'S3Outposts', 'AugmentedAIRuntime', 'SagemakerEdgeManager', 'SageMakerFeatureStoreRuntime', 'SageMaker', 'SavingsPlans', 'Schemas', 'SecretsManager', 'SecurityHub', 'ServerlessApplicationRepository', 'ServiceQuotas', 'AppRegistry', 'ServiceCatalog', 'ServiceDiscovery', 'SESV2', 'Shield', 'signer', 'PinpointSMSVoice', 'SMS', 'SnowDeviceManagement', 'Snowball', 'SNS', 'SQS', 'SSMContacts', 'SSMIncidents', 'SSM', 'SSOAdmin', 'SSOOIDC', 'SSO', 'SFN', 'StorageGateway', 'DynamoDBStreams', 'STS', 'Support', 'SWF', 'Synthetics', 'Textract', 'TimestreamQuery', 'TimestreamWrite', 'TranscribeService', 'Transfer', 'Translate', 'VoiceID', 'WAFRegional', 'WAF', 'WAFV2', 'WellArchitected', 'ConnectWisdomService', 'WorkDocs', 'WorkLink', 'WorkMail', 'WorkMailMessageFlow', 'WorkSpacesWeb', 'WorkSpaces', 'XRay']];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/manifest.json.php000064400000161214147600374260023613 0ustar00;;; ['namespace' => 'AccessAnalyzer', 'versions' => ['latest' => '2019-11-01', '2019-11-01' => '2019-11-01'], 'serviceIdentifier' => 'accessanalyzer'], 'account' => ['namespace' => 'Account', 'versions' => ['latest' => '2021-02-01', '2021-02-01' => '2021-02-01'], 'serviceIdentifier' => 'account'], 'acm-pca' => ['namespace' => 'ACMPCA', 'versions' => ['latest' => '2017-08-22', '2017-08-22' => '2017-08-22'], 'serviceIdentifier' => 'acm_pca'], 'acm' => ['namespace' => 'Acm', 'versions' => ['latest' => '2015-12-08', '2015-12-08' => '2015-12-08'], 'serviceIdentifier' => 'acm'], 'alexaforbusiness' => ['namespace' => 'AlexaForBusiness', 'versions' => ['latest' => '2017-11-09', '2017-11-09' => '2017-11-09'], 'serviceIdentifier' => 'alexa_for_business'], 'amp' => ['namespace' => 'PrometheusService', 'versions' => ['latest' => '2020-08-01', '2020-08-01' => '2020-08-01'], 'serviceIdentifier' => 'amp'], 'amplify' => ['namespace' => 'Amplify', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'amplify'], 'amplifybackend' => ['namespace' => 'AmplifyBackend', 'versions' => ['latest' => '2020-08-11', '2020-08-11' => '2020-08-11'], 'serviceIdentifier' => 'amplifybackend'], 'amplifyuibuilder' => ['namespace' => 'AmplifyUIBuilder', 'versions' => ['latest' => '2021-08-11', '2021-08-11' => '2021-08-11'], 'serviceIdentifier' => 'amplifyuibuilder'], 'apigateway' => ['namespace' => 'ApiGateway', 'versions' => ['latest' => '2015-07-09', '2015-07-09' => '2015-07-09', '2015-06-01' => '2015-07-09'], 'serviceIdentifier' => 'api_gateway'], 'apigatewaymanagementapi' => ['namespace' => 'ApiGatewayManagementApi', 'versions' => ['latest' => '2018-11-29', '2018-11-29' => '2018-11-29'], 'serviceIdentifier' => 'apigatewaymanagementapi'], 'apigatewayv2' => ['namespace' => 'ApiGatewayV2', 'versions' => ['latest' => '2018-11-29', '2018-11-29' => '2018-11-29'], 'serviceIdentifier' => 'apigatewayv2'], 'appconfig' => ['namespace' => 'AppConfig', 'versions' => ['latest' => '2019-10-09', '2019-10-09' => '2019-10-09'], 'serviceIdentifier' => 'appconfig'], 'appconfigdata' => ['namespace' => 'AppConfigData', 'versions' => ['latest' => '2021-11-11', '2021-11-11' => '2021-11-11'], 'serviceIdentifier' => 'appconfigdata'], 'appfabric' => ['namespace' => 'AppFabric', 'versions' => ['latest' => '2023-05-19', '2023-05-19' => '2023-05-19'], 'serviceIdentifier' => 'appfabric'], 'appflow' => ['namespace' => 'Appflow', 'versions' => ['latest' => '2020-08-23', '2020-08-23' => '2020-08-23'], 'serviceIdentifier' => 'appflow'], 'appintegrations' => ['namespace' => 'AppIntegrationsService', 'versions' => ['latest' => '2020-07-29', '2020-07-29' => '2020-07-29'], 'serviceIdentifier' => 'appintegrations'], 'application-autoscaling' => ['namespace' => 'ApplicationAutoScaling', 'versions' => ['latest' => '2016-02-06', '2016-02-06' => '2016-02-06'], 'serviceIdentifier' => 'application_auto_scaling'], 'application-insights' => ['namespace' => 'ApplicationInsights', 'versions' => ['latest' => '2018-11-25', '2018-11-25' => '2018-11-25'], 'serviceIdentifier' => 'application_insights'], 'applicationcostprofiler' => ['namespace' => 'ApplicationCostProfiler', 'versions' => ['latest' => '2020-09-10', '2020-09-10' => '2020-09-10'], 'serviceIdentifier' => 'applicationcostprofiler'], 'appmesh' => ['namespace' => 'AppMesh', 'versions' => ['latest' => '2019-01-25', '2019-01-25' => '2019-01-25', '2018-10-01' => '2018-10-01'], 'serviceIdentifier' => 'app_mesh'], 'apprunner' => ['namespace' => 'AppRunner', 'versions' => ['latest' => '2020-05-15', '2020-05-15' => '2020-05-15'], 'serviceIdentifier' => 'apprunner'], 'appstream' => ['namespace' => 'Appstream', 'versions' => ['latest' => '2016-12-01', '2016-12-01' => '2016-12-01'], 'serviceIdentifier' => 'appstream'], 'appsync' => ['namespace' => 'AppSync', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'appsync'], 'arc-zonal-shift' => ['namespace' => 'ARCZonalShift', 'versions' => ['latest' => '2022-10-30', '2022-10-30' => '2022-10-30'], 'serviceIdentifier' => 'arc_zonal_shift'], 'athena' => ['namespace' => 'Athena', 'versions' => ['latest' => '2017-05-18', '2017-05-18' => '2017-05-18'], 'serviceIdentifier' => 'athena'], 'auditmanager' => ['namespace' => 'AuditManager', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'auditmanager'], 'autoscaling-plans' => ['namespace' => 'AutoScalingPlans', 'versions' => ['latest' => '2018-01-06', '2018-01-06' => '2018-01-06'], 'serviceIdentifier' => 'auto_scaling_plans'], 'autoscaling' => ['namespace' => 'AutoScaling', 'versions' => ['latest' => '2011-01-01', '2011-01-01' => '2011-01-01'], 'serviceIdentifier' => 'auto_scaling'], 'backup-gateway' => ['namespace' => 'BackupGateway', 'versions' => ['latest' => '2021-01-01', '2021-01-01' => '2021-01-01'], 'serviceIdentifier' => 'backup_gateway'], 'backup' => ['namespace' => 'Backup', 'versions' => ['latest' => '2018-11-15', '2018-11-15' => '2018-11-15'], 'serviceIdentifier' => 'backup'], 'backupstorage' => ['namespace' => 'BackupStorage', 'versions' => ['latest' => '2018-04-10', '2018-04-10' => '2018-04-10'], 'serviceIdentifier' => 'backupstorage'], 'batch' => ['namespace' => 'Batch', 'versions' => ['latest' => '2016-08-10', '2016-08-10' => '2016-08-10'], 'serviceIdentifier' => 'batch'], 'billingconductor' => ['namespace' => 'BillingConductor', 'versions' => ['latest' => '2021-07-30', '2021-07-30' => '2021-07-30'], 'serviceIdentifier' => 'billingconductor'], 'braket' => ['namespace' => 'Braket', 'versions' => ['latest' => '2019-09-01', '2019-09-01' => '2019-09-01'], 'serviceIdentifier' => 'braket'], 'budgets' => ['namespace' => 'Budgets', 'versions' => ['latest' => '2016-10-20', '2016-10-20' => '2016-10-20'], 'serviceIdentifier' => 'budgets'], 'ce' => ['namespace' => 'CostExplorer', 'versions' => ['latest' => '2017-10-25', '2017-10-25' => '2017-10-25'], 'serviceIdentifier' => 'cost_explorer'], 'chime-sdk-identity' => ['namespace' => 'ChimeSDKIdentity', 'versions' => ['latest' => '2021-04-20', '2021-04-20' => '2021-04-20'], 'serviceIdentifier' => 'chime_sdk_identity'], 'chime-sdk-media-pipelines' => ['namespace' => 'ChimeSDKMediaPipelines', 'versions' => ['latest' => '2021-07-15', '2021-07-15' => '2021-07-15'], 'serviceIdentifier' => 'chime_sdk_media_pipelines'], 'chime-sdk-meetings' => ['namespace' => 'ChimeSDKMeetings', 'versions' => ['latest' => '2021-07-15', '2021-07-15' => '2021-07-15'], 'serviceIdentifier' => 'chime_sdk_meetings'], 'chime-sdk-messaging' => ['namespace' => 'ChimeSDKMessaging', 'versions' => ['latest' => '2021-05-15', '2021-05-15' => '2021-05-15'], 'serviceIdentifier' => 'chime_sdk_messaging'], 'chime-sdk-voice' => ['namespace' => 'ChimeSDKVoice', 'versions' => ['latest' => '2022-08-03', '2022-08-03' => '2022-08-03'], 'serviceIdentifier' => 'chime_sdk_voice'], 'chime' => ['namespace' => 'Chime', 'versions' => ['latest' => '2018-05-01', '2018-05-01' => '2018-05-01'], 'serviceIdentifier' => 'chime'], 'cleanrooms' => ['namespace' => 'CleanRooms', 'versions' => ['latest' => '2022-02-17', '2022-02-17' => '2022-02-17'], 'serviceIdentifier' => 'cleanrooms'], 'cloud9' => ['namespace' => 'Cloud9', 'versions' => ['latest' => '2017-09-23', '2017-09-23' => '2017-09-23'], 'serviceIdentifier' => 'cloud9'], 'cloudcontrol' => ['namespace' => 'CloudControlApi', 'versions' => ['latest' => '2021-09-30', '2021-09-30' => '2021-09-30'], 'serviceIdentifier' => 'cloudcontrol'], 'clouddirectory' => ['namespace' => 'CloudDirectory', 'versions' => ['latest' => '2017-01-11', '2017-01-11' => '2017-01-11', '2016-05-10' => '2016-05-10'], 'serviceIdentifier' => 'clouddirectory'], 'cloudformation' => ['namespace' => 'CloudFormation', 'versions' => ['latest' => '2010-05-15', '2010-05-15' => '2010-05-15'], 'serviceIdentifier' => 'cloudformation'], 'cloudfront' => ['namespace' => 'CloudFront', 'versions' => ['latest' => '2020-05-31', '2020-05-31' => '2020-05-31', '2019-03-26' => '2019-03-26', '2018-11-05' => '2018-11-05', '2018-06-18' => '2018-06-18', '2017-10-30' => '2017-10-30', '2017-03-25' => '2017-03-25', '2016-11-25' => '2016-11-25', '2016-09-29' => '2016-09-29', '2016-09-07' => '2016-09-07', '2016-08-20' => '2016-08-20', '2016-08-01' => '2016-08-01', '2016-01-28' => '2016-01-28', '2016-01-13' => '2020-05-31', '2015-09-17' => '2020-05-31', '2015-07-27' => '2015-07-27', '2015-04-17' => '2015-07-27', '2014-11-06' => '2015-07-27'], 'serviceIdentifier' => 'cloudfront'], 'cloudhsm' => ['namespace' => 'CloudHsm', 'versions' => ['latest' => '2014-05-30', '2014-05-30' => '2014-05-30'], 'serviceIdentifier' => 'cloudhsm'], 'cloudhsmv2' => ['namespace' => 'CloudHSMV2', 'versions' => ['latest' => '2017-04-28', '2017-04-28' => '2017-04-28'], 'serviceIdentifier' => 'cloudhsm_v2'], 'cloudsearch' => ['namespace' => 'CloudSearch', 'versions' => ['latest' => '2013-01-01', '2013-01-01' => '2013-01-01'], 'serviceIdentifier' => 'cloudsearch'], 'cloudsearchdomain' => ['namespace' => 'CloudSearchDomain', 'versions' => ['latest' => '2013-01-01', '2013-01-01' => '2013-01-01'], 'serviceIdentifier' => 'cloudsearch_domain'], 'cloudtrail-data' => ['namespace' => 'CloudTrailData', 'versions' => ['latest' => '2021-08-11', '2021-08-11' => '2021-08-11'], 'serviceIdentifier' => 'cloudtrail_data'], 'cloudtrail' => ['namespace' => 'CloudTrail', 'versions' => ['latest' => '2013-11-01', '2013-11-01' => '2013-11-01'], 'serviceIdentifier' => 'cloudtrail'], 'codeartifact' => ['namespace' => 'CodeArtifact', 'versions' => ['latest' => '2018-09-22', '2018-09-22' => '2018-09-22'], 'serviceIdentifier' => 'codeartifact'], 'codebuild' => ['namespace' => 'CodeBuild', 'versions' => ['latest' => '2016-10-06', '2016-10-06' => '2016-10-06'], 'serviceIdentifier' => 'codebuild'], 'codecatalyst' => ['namespace' => 'CodeCatalyst', 'versions' => ['latest' => '2022-09-28', '2022-09-28' => '2022-09-28'], 'serviceIdentifier' => 'codecatalyst'], 'codecommit' => ['namespace' => 'CodeCommit', 'versions' => ['latest' => '2015-04-13', '2015-04-13' => '2015-04-13'], 'serviceIdentifier' => 'codecommit'], 'codedeploy' => ['namespace' => 'CodeDeploy', 'versions' => ['latest' => '2014-10-06', '2014-10-06' => '2014-10-06'], 'serviceIdentifier' => 'codedeploy'], 'codeguru-reviewer' => ['namespace' => 'CodeGuruReviewer', 'versions' => ['latest' => '2019-09-19', '2019-09-19' => '2019-09-19'], 'serviceIdentifier' => 'codeguru_reviewer'], 'codeguru-security' => ['namespace' => 'CodeGuruSecurity', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'codeguru_security'], 'codeguruprofiler' => ['namespace' => 'CodeGuruProfiler', 'versions' => ['latest' => '2019-07-18', '2019-07-18' => '2019-07-18'], 'serviceIdentifier' => 'codeguruprofiler'], 'codepipeline' => ['namespace' => 'CodePipeline', 'versions' => ['latest' => '2015-07-09', '2015-07-09' => '2015-07-09'], 'serviceIdentifier' => 'codepipeline'], 'codestar-connections' => ['namespace' => 'CodeStarconnections', 'versions' => ['latest' => '2019-12-01', '2019-12-01' => '2019-12-01'], 'serviceIdentifier' => 'codestar_connections'], 'codestar-notifications' => ['namespace' => 'CodeStarNotifications', 'versions' => ['latest' => '2019-10-15', '2019-10-15' => '2019-10-15'], 'serviceIdentifier' => 'codestar_notifications'], 'codestar' => ['namespace' => 'CodeStar', 'versions' => ['latest' => '2017-04-19', '2017-04-19' => '2017-04-19'], 'serviceIdentifier' => 'codestar'], 'cognito-identity' => ['namespace' => 'CognitoIdentity', 'versions' => ['latest' => '2014-06-30', '2014-06-30' => '2014-06-30'], 'serviceIdentifier' => 'cognito_identity'], 'cognito-idp' => ['namespace' => 'CognitoIdentityProvider', 'versions' => ['latest' => '2016-04-18', '2016-04-18' => '2016-04-18'], 'serviceIdentifier' => 'cognito_identity_provider'], 'cognito-sync' => ['namespace' => 'CognitoSync', 'versions' => ['latest' => '2014-06-30', '2014-06-30' => '2014-06-30'], 'serviceIdentifier' => 'cognito_sync'], 'comprehend' => ['namespace' => 'Comprehend', 'versions' => ['latest' => '2017-11-27', '2017-11-27' => '2017-11-27'], 'serviceIdentifier' => 'comprehend'], 'comprehendmedical' => ['namespace' => 'ComprehendMedical', 'versions' => ['latest' => '2018-10-30', '2018-10-30' => '2018-10-30'], 'serviceIdentifier' => 'comprehendmedical'], 'compute-optimizer' => ['namespace' => 'ComputeOptimizer', 'versions' => ['latest' => '2019-11-01', '2019-11-01' => '2019-11-01'], 'serviceIdentifier' => 'compute_optimizer'], 'config' => ['namespace' => 'ConfigService', 'versions' => ['latest' => '2014-11-12', '2014-11-12' => '2014-11-12'], 'serviceIdentifier' => 'config_service'], 'connect-contact-lens' => ['namespace' => 'ConnectContactLens', 'versions' => ['latest' => '2020-08-21', '2020-08-21' => '2020-08-21'], 'serviceIdentifier' => 'connect_contact_lens'], 'connect' => ['namespace' => 'Connect', 'versions' => ['latest' => '2017-08-08', '2017-08-08' => '2017-08-08'], 'serviceIdentifier' => 'connect'], 'connectcampaigns' => ['namespace' => 'ConnectCampaignService', 'versions' => ['latest' => '2021-01-30', '2021-01-30' => '2021-01-30'], 'serviceIdentifier' => 'connectcampaigns'], 'connectcases' => ['namespace' => 'ConnectCases', 'versions' => ['latest' => '2022-10-03', '2022-10-03' => '2022-10-03'], 'serviceIdentifier' => 'connectcases'], 'connectparticipant' => ['namespace' => 'ConnectParticipant', 'versions' => ['latest' => '2018-09-07', '2018-09-07' => '2018-09-07'], 'serviceIdentifier' => 'connectparticipant'], 'controltower' => ['namespace' => 'ControlTower', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'controltower'], 'cur' => ['namespace' => 'CostandUsageReportService', 'versions' => ['latest' => '2017-01-06', '2017-01-06' => '2017-01-06'], 'serviceIdentifier' => 'cost_and_usage_report_service'], 'customer-profiles' => ['namespace' => 'CustomerProfiles', 'versions' => ['latest' => '2020-08-15', '2020-08-15' => '2020-08-15'], 'serviceIdentifier' => 'customer_profiles'], 'data.iot' => ['namespace' => 'IotDataPlane', 'versions' => ['latest' => '2015-05-28', '2015-05-28' => '2015-05-28'], 'serviceIdentifier' => 'iot_data_plane'], 'databrew' => ['namespace' => 'GlueDataBrew', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'databrew'], 'dataexchange' => ['namespace' => 'DataExchange', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'dataexchange'], 'datapipeline' => ['namespace' => 'DataPipeline', 'versions' => ['latest' => '2012-10-29', '2012-10-29' => '2012-10-29'], 'serviceIdentifier' => 'data_pipeline'], 'datasync' => ['namespace' => 'DataSync', 'versions' => ['latest' => '2018-11-09', '2018-11-09' => '2018-11-09'], 'serviceIdentifier' => 'datasync'], 'dax' => ['namespace' => 'DAX', 'versions' => ['latest' => '2017-04-19', '2017-04-19' => '2017-04-19'], 'serviceIdentifier' => 'dax'], 'detective' => ['namespace' => 'Detective', 'versions' => ['latest' => '2018-10-26', '2018-10-26' => '2018-10-26'], 'serviceIdentifier' => 'detective'], 'devicefarm' => ['namespace' => 'DeviceFarm', 'versions' => ['latest' => '2015-06-23', '2015-06-23' => '2015-06-23'], 'serviceIdentifier' => 'device_farm'], 'devops-guru' => ['namespace' => 'DevOpsGuru', 'versions' => ['latest' => '2020-12-01', '2020-12-01' => '2020-12-01'], 'serviceIdentifier' => 'devops_guru'], 'directconnect' => ['namespace' => 'DirectConnect', 'versions' => ['latest' => '2012-10-25', '2012-10-25' => '2012-10-25'], 'serviceIdentifier' => 'direct_connect'], 'discovery' => ['namespace' => 'ApplicationDiscoveryService', 'versions' => ['latest' => '2015-11-01', '2015-11-01' => '2015-11-01'], 'serviceIdentifier' => 'application_discovery_service'], 'dlm' => ['namespace' => 'DLM', 'versions' => ['latest' => '2018-01-12', '2018-01-12' => '2018-01-12'], 'serviceIdentifier' => 'dlm'], 'dms' => ['namespace' => 'DatabaseMigrationService', 'versions' => ['latest' => '2016-01-01', '2016-01-01' => '2016-01-01'], 'serviceIdentifier' => 'database_migration_service'], 'docdb-elastic' => ['namespace' => 'DocDBElastic', 'versions' => ['latest' => '2022-11-28', '2022-11-28' => '2022-11-28'], 'serviceIdentifier' => 'docdb_elastic'], 'docdb' => ['namespace' => 'DocDB', 'versions' => ['latest' => '2014-10-31', '2014-10-31' => '2014-10-31'], 'serviceIdentifier' => 'docdb'], 'drs' => ['namespace' => 'drs', 'versions' => ['latest' => '2020-02-26', '2020-02-26' => '2020-02-26'], 'serviceIdentifier' => 'drs'], 'ds' => ['namespace' => 'DirectoryService', 'versions' => ['latest' => '2015-04-16', '2015-04-16' => '2015-04-16'], 'serviceIdentifier' => 'directory_service'], 'dynamodb' => ['namespace' => 'DynamoDb', 'versions' => ['latest' => '2012-08-10', '2012-08-10' => '2012-08-10', '2011-12-05' => '2011-12-05'], 'serviceIdentifier' => 'dynamodb'], 'ebs' => ['namespace' => 'EBS', 'versions' => ['latest' => '2019-11-02', '2019-11-02' => '2019-11-02'], 'serviceIdentifier' => 'ebs'], 'ec2-instance-connect' => ['namespace' => 'EC2InstanceConnect', 'versions' => ['latest' => '2018-04-02', '2018-04-02' => '2018-04-02'], 'serviceIdentifier' => 'ec2_instance_connect'], 'ec2' => ['namespace' => 'Ec2', 'versions' => ['latest' => '2016-11-15', '2016-11-15' => '2016-11-15', '2016-09-15' => '2016-09-15', '2016-04-01' => '2016-04-01', '2015-10-01' => '2015-10-01', '2015-04-15' => '2016-11-15'], 'serviceIdentifier' => 'ec2'], 'ecr-public' => ['namespace' => 'ECRPublic', 'versions' => ['latest' => '2020-10-30', '2020-10-30' => '2020-10-30'], 'serviceIdentifier' => 'ecr_public'], 'ecr' => ['namespace' => 'Ecr', 'versions' => ['latest' => '2015-09-21', '2015-09-21' => '2015-09-21'], 'serviceIdentifier' => 'ecr'], 'ecs' => ['namespace' => 'Ecs', 'versions' => ['latest' => '2014-11-13', '2014-11-13' => '2014-11-13'], 'serviceIdentifier' => 'ecs'], 'eks' => ['namespace' => 'EKS', 'versions' => ['latest' => '2017-11-01', '2017-11-01' => '2017-11-01'], 'serviceIdentifier' => 'eks'], 'elastic-inference' => ['namespace' => 'ElasticInference', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'elastic_inference'], 'elasticache' => ['namespace' => 'ElastiCache', 'versions' => ['latest' => '2015-02-02', '2015-02-02' => '2015-02-02'], 'serviceIdentifier' => 'elasticache'], 'elasticbeanstalk' => ['namespace' => 'ElasticBeanstalk', 'versions' => ['latest' => '2010-12-01', '2010-12-01' => '2010-12-01'], 'serviceIdentifier' => 'elastic_beanstalk'], 'elasticfilesystem' => ['namespace' => 'Efs', 'versions' => ['latest' => '2015-02-01', '2015-02-01' => '2015-02-01'], 'serviceIdentifier' => 'efs'], 'elasticloadbalancing' => ['namespace' => 'ElasticLoadBalancing', 'versions' => ['latest' => '2012-06-01', '2012-06-01' => '2012-06-01'], 'serviceIdentifier' => 'elastic_load_balancing'], 'elasticloadbalancingv2' => ['namespace' => 'ElasticLoadBalancingV2', 'versions' => ['latest' => '2015-12-01', '2015-12-01' => '2015-12-01'], 'serviceIdentifier' => 'elastic_load_balancing_v2'], 'elasticmapreduce' => ['namespace' => 'Emr', 'versions' => ['latest' => '2009-03-31', '2009-03-31' => '2009-03-31'], 'serviceIdentifier' => 'emr'], 'elastictranscoder' => ['namespace' => 'ElasticTranscoder', 'versions' => ['latest' => '2012-09-25', '2012-09-25' => '2012-09-25'], 'serviceIdentifier' => 'elastic_transcoder'], 'email' => ['namespace' => 'Ses', 'versions' => ['latest' => '2010-12-01', '2010-12-01' => '2010-12-01'], 'serviceIdentifier' => 'ses'], 'emr-containers' => ['namespace' => 'EMRContainers', 'versions' => ['latest' => '2020-10-01', '2020-10-01' => '2020-10-01'], 'serviceIdentifier' => 'emr_containers'], 'emr-serverless' => ['namespace' => 'EMRServerless', 'versions' => ['latest' => '2021-07-13', '2021-07-13' => '2021-07-13'], 'serviceIdentifier' => 'emr_serverless'], 'entitlement.marketplace' => ['namespace' => 'MarketplaceEntitlementService', 'versions' => ['latest' => '2017-01-11', '2017-01-11' => '2017-01-11'], 'serviceIdentifier' => 'marketplace_entitlement_service'], 'entityresolution' => ['namespace' => 'EntityResolution', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'entityresolution'], 'es' => ['namespace' => 'ElasticsearchService', 'versions' => ['latest' => '2015-01-01', '2015-01-01' => '2015-01-01'], 'serviceIdentifier' => 'elasticsearch_service'], 'eventbridge' => ['namespace' => 'EventBridge', 'versions' => ['latest' => '2015-10-07', '2015-10-07' => '2015-10-07'], 'serviceIdentifier' => 'eventbridge'], 'events' => ['namespace' => 'CloudWatchEvents', 'versions' => ['latest' => '2015-10-07', '2015-10-07' => '2015-10-07', '2014-02-03' => '2015-10-07'], 'serviceIdentifier' => 'cloudwatch_events'], 'evidently' => ['namespace' => 'CloudWatchEvidently', 'versions' => ['latest' => '2021-02-01', '2021-02-01' => '2021-02-01'], 'serviceIdentifier' => 'evidently'], 'finspace-data' => ['namespace' => 'FinSpaceData', 'versions' => ['latest' => '2020-07-13', '2020-07-13' => '2020-07-13'], 'serviceIdentifier' => 'finspace_data'], 'finspace' => ['namespace' => 'finspace', 'versions' => ['latest' => '2021-03-12', '2021-03-12' => '2021-03-12'], 'serviceIdentifier' => 'finspace'], 'firehose' => ['namespace' => 'Firehose', 'versions' => ['latest' => '2015-08-04', '2015-08-04' => '2015-08-04'], 'serviceIdentifier' => 'firehose'], 'fis' => ['namespace' => 'FIS', 'versions' => ['latest' => '2020-12-01', '2020-12-01' => '2020-12-01'], 'serviceIdentifier' => 'fis'], 'fms' => ['namespace' => 'FMS', 'versions' => ['latest' => '2018-01-01', '2018-01-01' => '2018-01-01'], 'serviceIdentifier' => 'fms'], 'forecast' => ['namespace' => 'ForecastService', 'versions' => ['latest' => '2018-06-26', '2018-06-26' => '2018-06-26'], 'serviceIdentifier' => 'forecast'], 'forecastquery' => ['namespace' => 'ForecastQueryService', 'versions' => ['latest' => '2018-06-26', '2018-06-26' => '2018-06-26'], 'serviceIdentifier' => 'forecastquery'], 'frauddetector' => ['namespace' => 'FraudDetector', 'versions' => ['latest' => '2019-11-15', '2019-11-15' => '2019-11-15'], 'serviceIdentifier' => 'frauddetector'], 'fsx' => ['namespace' => 'FSx', 'versions' => ['latest' => '2018-03-01', '2018-03-01' => '2018-03-01'], 'serviceIdentifier' => 'fsx'], 'gamelift' => ['namespace' => 'GameLift', 'versions' => ['latest' => '2015-10-01', '2015-10-01' => '2015-10-01'], 'serviceIdentifier' => 'gamelift'], 'gamesparks' => ['namespace' => 'GameSparks', 'versions' => ['latest' => '2021-08-17', '2021-08-17' => '2021-08-17'], 'serviceIdentifier' => 'gamesparks'], 'glacier' => ['namespace' => 'Glacier', 'versions' => ['latest' => '2012-06-01', '2012-06-01' => '2012-06-01'], 'serviceIdentifier' => 'glacier'], 'globalaccelerator' => ['namespace' => 'GlobalAccelerator', 'versions' => ['latest' => '2018-08-08', '2018-08-08' => '2018-08-08'], 'serviceIdentifier' => 'global_accelerator'], 'glue' => ['namespace' => 'Glue', 'versions' => ['latest' => '2017-03-31', '2017-03-31' => '2017-03-31'], 'serviceIdentifier' => 'glue'], 'grafana' => ['namespace' => 'ManagedGrafana', 'versions' => ['latest' => '2020-08-18', '2020-08-18' => '2020-08-18'], 'serviceIdentifier' => 'grafana'], 'greengrass' => ['namespace' => 'Greengrass', 'versions' => ['latest' => '2017-06-07', '2017-06-07' => '2017-06-07'], 'serviceIdentifier' => 'greengrass'], 'greengrassv2' => ['namespace' => 'GreengrassV2', 'versions' => ['latest' => '2020-11-30', '2020-11-30' => '2020-11-30'], 'serviceIdentifier' => 'greengrassv2'], 'groundstation' => ['namespace' => 'GroundStation', 'versions' => ['latest' => '2019-05-23', '2019-05-23' => '2019-05-23'], 'serviceIdentifier' => 'groundstation'], 'guardduty' => ['namespace' => 'GuardDuty', 'versions' => ['latest' => '2017-11-28', '2017-11-28' => '2017-11-28'], 'serviceIdentifier' => 'guardduty'], 'health' => ['namespace' => 'Health', 'versions' => ['latest' => '2016-08-04', '2016-08-04' => '2016-08-04'], 'serviceIdentifier' => 'health'], 'healthlake' => ['namespace' => 'HealthLake', 'versions' => ['latest' => '2017-07-01', '2017-07-01' => '2017-07-01'], 'serviceIdentifier' => 'healthlake'], 'honeycode' => ['namespace' => 'Honeycode', 'versions' => ['latest' => '2020-03-01', '2020-03-01' => '2020-03-01'], 'serviceIdentifier' => 'honeycode'], 'iam' => ['namespace' => 'Iam', 'versions' => ['latest' => '2010-05-08', '2010-05-08' => '2010-05-08'], 'serviceIdentifier' => 'iam'], 'identitystore' => ['namespace' => 'IdentityStore', 'versions' => ['latest' => '2020-06-15', '2020-06-15' => '2020-06-15'], 'serviceIdentifier' => 'identitystore'], 'imagebuilder' => ['namespace' => 'imagebuilder', 'versions' => ['latest' => '2019-12-02', '2019-12-02' => '2019-12-02'], 'serviceIdentifier' => 'imagebuilder'], 'importexport' => ['namespace' => 'ImportExport', 'versions' => ['latest' => '2010-06-01', '2010-06-01' => '2010-06-01'], 'serviceIdentifier' => 'importexport'], 'inspector' => ['namespace' => 'Inspector', 'versions' => ['latest' => '2016-02-16', '2016-02-16' => '2016-02-16', '2015-08-18' => '2016-02-16'], 'serviceIdentifier' => 'inspector'], 'inspector2' => ['namespace' => 'Inspector2', 'versions' => ['latest' => '2020-06-08', '2020-06-08' => '2020-06-08'], 'serviceIdentifier' => 'inspector2'], 'internetmonitor' => ['namespace' => 'InternetMonitor', 'versions' => ['latest' => '2021-06-03', '2021-06-03' => '2021-06-03'], 'serviceIdentifier' => 'internetmonitor'], 'iot-jobs-data' => ['namespace' => 'IoTJobsDataPlane', 'versions' => ['latest' => '2017-09-29', '2017-09-29' => '2017-09-29'], 'serviceIdentifier' => 'iot_jobs_data_plane'], 'iot-roborunner' => ['namespace' => 'IoTRoboRunner', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'iot_roborunner'], 'iot' => ['namespace' => 'Iot', 'versions' => ['latest' => '2015-05-28', '2015-05-28' => '2015-05-28'], 'serviceIdentifier' => 'iot'], 'iot1click-devices' => ['namespace' => 'IoT1ClickDevicesService', 'versions' => ['latest' => '2018-05-14', '2018-05-14' => '2018-05-14'], 'serviceIdentifier' => 'iot_1click_devices_service'], 'iot1click-projects' => ['namespace' => 'IoT1ClickProjects', 'versions' => ['latest' => '2018-05-14', '2018-05-14' => '2018-05-14'], 'serviceIdentifier' => 'iot_1click_projects'], 'iotanalytics' => ['namespace' => 'IoTAnalytics', 'versions' => ['latest' => '2017-11-27', '2017-11-27' => '2017-11-27'], 'serviceIdentifier' => 'iotanalytics'], 'iotdeviceadvisor' => ['namespace' => 'IoTDeviceAdvisor', 'versions' => ['latest' => '2020-09-18', '2020-09-18' => '2020-09-18'], 'serviceIdentifier' => 'iotdeviceadvisor'], 'iotevents-data' => ['namespace' => 'IoTEventsData', 'versions' => ['latest' => '2018-10-23', '2018-10-23' => '2018-10-23'], 'serviceIdentifier' => 'iot_events_data'], 'iotevents' => ['namespace' => 'IoTEvents', 'versions' => ['latest' => '2018-07-27', '2018-07-27' => '2018-07-27'], 'serviceIdentifier' => 'iot_events'], 'iotfleethub' => ['namespace' => 'IoTFleetHub', 'versions' => ['latest' => '2020-11-03', '2020-11-03' => '2020-11-03'], 'serviceIdentifier' => 'iotfleethub'], 'iotfleetwise' => ['namespace' => 'IoTFleetWise', 'versions' => ['latest' => '2021-06-17', '2021-06-17' => '2021-06-17'], 'serviceIdentifier' => 'iotfleetwise'], 'iotsecuretunneling' => ['namespace' => 'IoTSecureTunneling', 'versions' => ['latest' => '2018-10-05', '2018-10-05' => '2018-10-05'], 'serviceIdentifier' => 'iotsecuretunneling'], 'iotsitewise' => ['namespace' => 'IoTSiteWise', 'versions' => ['latest' => '2019-12-02', '2019-12-02' => '2019-12-02'], 'serviceIdentifier' => 'iotsitewise'], 'iotthingsgraph' => ['namespace' => 'IoTThingsGraph', 'versions' => ['latest' => '2018-09-06', '2018-09-06' => '2018-09-06'], 'serviceIdentifier' => 'iotthingsgraph'], 'iottwinmaker' => ['namespace' => 'IoTTwinMaker', 'versions' => ['latest' => '2021-11-29', '2021-11-29' => '2021-11-29'], 'serviceIdentifier' => 'iottwinmaker'], 'iotwireless' => ['namespace' => 'IoTWireless', 'versions' => ['latest' => '2020-11-22', '2020-11-22' => '2020-11-22'], 'serviceIdentifier' => 'iot_wireless'], 'ivs-realtime' => ['namespace' => 'IVSRealTime', 'versions' => ['latest' => '2020-07-14', '2020-07-14' => '2020-07-14'], 'serviceIdentifier' => 'ivs_realtime'], 'ivs' => ['namespace' => 'IVS', 'versions' => ['latest' => '2020-07-14', '2020-07-14' => '2020-07-14'], 'serviceIdentifier' => 'ivs'], 'ivschat' => ['namespace' => 'ivschat', 'versions' => ['latest' => '2020-07-14', '2020-07-14' => '2020-07-14'], 'serviceIdentifier' => 'ivschat'], 'kafka' => ['namespace' => 'Kafka', 'versions' => ['latest' => '2018-11-14', '2018-11-14' => '2018-11-14'], 'serviceIdentifier' => 'kafka'], 'kafkaconnect' => ['namespace' => 'KafkaConnect', 'versions' => ['latest' => '2021-09-14', '2021-09-14' => '2021-09-14'], 'serviceIdentifier' => 'kafkaconnect'], 'kendra-ranking' => ['namespace' => 'KendraRanking', 'versions' => ['latest' => '2022-10-19', '2022-10-19' => '2022-10-19'], 'serviceIdentifier' => 'kendra_ranking'], 'kendra' => ['namespace' => 'kendra', 'versions' => ['latest' => '2019-02-03', '2019-02-03' => '2019-02-03'], 'serviceIdentifier' => 'kendra'], 'keyspaces' => ['namespace' => 'Keyspaces', 'versions' => ['latest' => '2022-02-10', '2022-02-10' => '2022-02-10'], 'serviceIdentifier' => 'keyspaces'], 'kinesis-video-archived-media' => ['namespace' => 'KinesisVideoArchivedMedia', 'versions' => ['latest' => '2017-09-30', '2017-09-30' => '2017-09-30'], 'serviceIdentifier' => 'kinesis_video_archived_media'], 'kinesis-video-media' => ['namespace' => 'KinesisVideoMedia', 'versions' => ['latest' => '2017-09-30', '2017-09-30' => '2017-09-30'], 'serviceIdentifier' => 'kinesis_video_media'], 'kinesis-video-signaling' => ['namespace' => 'KinesisVideoSignalingChannels', 'versions' => ['latest' => '2019-12-04', '2019-12-04' => '2019-12-04'], 'serviceIdentifier' => 'kinesis_video_signaling'], 'kinesis-video-webrtc-storage' => ['namespace' => 'KinesisVideoWebRTCStorage', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'kinesis_video_webrtc_storage'], 'kinesis' => ['namespace' => 'Kinesis', 'versions' => ['latest' => '2013-12-02', '2013-12-02' => '2013-12-02'], 'serviceIdentifier' => 'kinesis'], 'kinesisanalytics' => ['namespace' => 'KinesisAnalytics', 'versions' => ['latest' => '2015-08-14', '2015-08-14' => '2015-08-14'], 'serviceIdentifier' => 'kinesis_analytics'], 'kinesisanalyticsv2' => ['namespace' => 'KinesisAnalyticsV2', 'versions' => ['latest' => '2018-05-23', '2018-05-23' => '2018-05-23'], 'serviceIdentifier' => 'kinesis_analytics_v2'], 'kinesisvideo' => ['namespace' => 'KinesisVideo', 'versions' => ['latest' => '2017-09-30', '2017-09-30' => '2017-09-30'], 'serviceIdentifier' => 'kinesis_video'], 'kms' => ['namespace' => 'Kms', 'versions' => ['latest' => '2014-11-01', '2014-11-01' => '2014-11-01'], 'serviceIdentifier' => 'kms'], 'lakeformation' => ['namespace' => 'LakeFormation', 'versions' => ['latest' => '2017-03-31', '2017-03-31' => '2017-03-31'], 'serviceIdentifier' => 'lakeformation'], 'lambda' => ['namespace' => 'Lambda', 'versions' => ['latest' => '2015-03-31', '2015-03-31' => '2015-03-31'], 'serviceIdentifier' => 'lambda'], 'lex-models' => ['namespace' => 'LexModelBuildingService', 'versions' => ['latest' => '2017-04-19', '2017-04-19' => '2017-04-19'], 'serviceIdentifier' => 'lex_model_building_service'], 'license-manager-linux-subscriptions' => ['namespace' => 'LicenseManagerLinuxSubscriptions', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'license_manager_linux_subscriptions'], 'license-manager-user-subscriptions' => ['namespace' => 'LicenseManagerUserSubscriptions', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'license_manager_user_subscriptions'], 'license-manager' => ['namespace' => 'LicenseManager', 'versions' => ['latest' => '2018-08-01', '2018-08-01' => '2018-08-01'], 'serviceIdentifier' => 'license_manager'], 'lightsail' => ['namespace' => 'Lightsail', 'versions' => ['latest' => '2016-11-28', '2016-11-28' => '2016-11-28'], 'serviceIdentifier' => 'lightsail'], 'location' => ['namespace' => 'LocationService', 'versions' => ['latest' => '2020-11-19', '2020-11-19' => '2020-11-19'], 'serviceIdentifier' => 'location'], 'logs' => ['namespace' => 'CloudWatchLogs', 'versions' => ['latest' => '2014-03-28', '2014-03-28' => '2014-03-28'], 'serviceIdentifier' => 'cloudwatch_logs'], 'lookoutequipment' => ['namespace' => 'LookoutEquipment', 'versions' => ['latest' => '2020-12-15', '2020-12-15' => '2020-12-15'], 'serviceIdentifier' => 'lookoutequipment'], 'lookoutmetrics' => ['namespace' => 'LookoutMetrics', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 'lookoutmetrics'], 'lookoutvision' => ['namespace' => 'LookoutforVision', 'versions' => ['latest' => '2020-11-20', '2020-11-20' => '2020-11-20'], 'serviceIdentifier' => 'lookoutvision'], 'm2' => ['namespace' => 'MainframeModernization', 'versions' => ['latest' => '2021-04-28', '2021-04-28' => '2021-04-28'], 'serviceIdentifier' => 'm2'], 'machinelearning' => ['namespace' => 'MachineLearning', 'versions' => ['latest' => '2014-12-12', '2014-12-12' => '2014-12-12'], 'serviceIdentifier' => 'machine_learning'], 'macie' => ['namespace' => 'Macie', 'versions' => ['latest' => '2017-12-19', '2017-12-19' => '2017-12-19'], 'serviceIdentifier' => 'macie'], 'macie2' => ['namespace' => 'Macie2', 'versions' => ['latest' => '2020-01-01', '2020-01-01' => '2020-01-01'], 'serviceIdentifier' => 'macie2'], 'managedblockchain-query' => ['namespace' => 'ManagedBlockchainQuery', 'versions' => ['latest' => '2023-05-04', '2023-05-04' => '2023-05-04'], 'serviceIdentifier' => 'managedblockchain_query'], 'managedblockchain' => ['namespace' => 'ManagedBlockchain', 'versions' => ['latest' => '2018-09-24', '2018-09-24' => '2018-09-24'], 'serviceIdentifier' => 'managedblockchain'], 'marketplace-catalog' => ['namespace' => 'MarketplaceCatalog', 'versions' => ['latest' => '2018-09-17', '2018-09-17' => '2018-09-17'], 'serviceIdentifier' => 'marketplace_catalog'], 'marketplacecommerceanalytics' => ['namespace' => 'MarketplaceCommerceAnalytics', 'versions' => ['latest' => '2015-07-01', '2015-07-01' => '2015-07-01'], 'serviceIdentifier' => 'marketplace_commerce_analytics'], 'mediaconnect' => ['namespace' => 'MediaConnect', 'versions' => ['latest' => '2018-11-14', '2018-11-14' => '2018-11-14'], 'serviceIdentifier' => 'mediaconnect'], 'mediaconvert' => ['namespace' => 'MediaConvert', 'versions' => ['latest' => '2017-08-29', '2017-08-29' => '2017-08-29'], 'serviceIdentifier' => 'mediaconvert'], 'medialive' => ['namespace' => 'MediaLive', 'versions' => ['latest' => '2017-10-14', '2017-10-14' => '2017-10-14'], 'serviceIdentifier' => 'medialive'], 'mediapackage-vod' => ['namespace' => 'MediaPackageVod', 'versions' => ['latest' => '2018-11-07', '2018-11-07' => '2018-11-07'], 'serviceIdentifier' => 'mediapackage_vod'], 'mediapackage' => ['namespace' => 'MediaPackage', 'versions' => ['latest' => '2017-10-12', '2017-10-12' => '2017-10-12'], 'serviceIdentifier' => 'mediapackage'], 'mediapackagev2' => ['namespace' => 'MediaPackageV2', 'versions' => ['latest' => '2022-12-25', '2022-12-25' => '2022-12-25'], 'serviceIdentifier' => 'mediapackagev2'], 'mediastore-data' => ['namespace' => 'MediaStoreData', 'versions' => ['latest' => '2017-09-01', '2017-09-01' => '2017-09-01'], 'serviceIdentifier' => 'mediastore_data'], 'mediastore' => ['namespace' => 'MediaStore', 'versions' => ['latest' => '2017-09-01', '2017-09-01' => '2017-09-01'], 'serviceIdentifier' => 'mediastore'], 'mediatailor' => ['namespace' => 'MediaTailor', 'versions' => ['latest' => '2018-04-23', '2018-04-23' => '2018-04-23'], 'serviceIdentifier' => 'mediatailor'], 'medical-imaging' => ['namespace' => 'MedicalImaging', 'versions' => ['latest' => '2023-07-19', '2023-07-19' => '2023-07-19'], 'serviceIdentifier' => 'medical_imaging'], 'memorydb' => ['namespace' => 'MemoryDB', 'versions' => ['latest' => '2021-01-01', '2021-01-01' => '2021-01-01'], 'serviceIdentifier' => 'memorydb'], 'metering.marketplace' => ['namespace' => 'MarketplaceMetering', 'versions' => ['latest' => '2016-01-14', '2016-01-14' => '2016-01-14'], 'serviceIdentifier' => 'marketplace_metering'], 'mgh' => ['namespace' => 'MigrationHub', 'versions' => ['latest' => '2017-05-31', '2017-05-31' => '2017-05-31'], 'serviceIdentifier' => 'migration_hub'], 'mgn' => ['namespace' => 'mgn', 'versions' => ['latest' => '2020-02-26', '2020-02-26' => '2020-02-26'], 'serviceIdentifier' => 'mgn'], 'migration-hub-refactor-spaces' => ['namespace' => 'MigrationHubRefactorSpaces', 'versions' => ['latest' => '2021-10-26', '2021-10-26' => '2021-10-26'], 'serviceIdentifier' => 'migration_hub_refactor_spaces'], 'migrationhub-config' => ['namespace' => 'MigrationHubConfig', 'versions' => ['latest' => '2019-06-30', '2019-06-30' => '2019-06-30'], 'serviceIdentifier' => 'migrationhub_config'], 'migrationhuborchestrator' => ['namespace' => 'MigrationHubOrchestrator', 'versions' => ['latest' => '2021-08-28', '2021-08-28' => '2021-08-28'], 'serviceIdentifier' => 'migrationhuborchestrator'], 'migrationhubstrategy' => ['namespace' => 'MigrationHubStrategyRecommendations', 'versions' => ['latest' => '2020-02-19', '2020-02-19' => '2020-02-19'], 'serviceIdentifier' => 'migrationhubstrategy'], 'mobile' => ['namespace' => 'Mobile', 'versions' => ['latest' => '2017-07-01', '2017-07-01' => '2017-07-01'], 'serviceIdentifier' => 'mobile'], 'models.lex.v2' => ['namespace' => 'LexModelsV2', 'versions' => ['latest' => '2020-08-07', '2020-08-07' => '2020-08-07'], 'serviceIdentifier' => 'lex_models_v2'], 'monitoring' => ['namespace' => 'CloudWatch', 'versions' => ['latest' => '2010-08-01', '2010-08-01' => '2010-08-01'], 'serviceIdentifier' => 'cloudwatch'], 'mq' => ['namespace' => 'MQ', 'versions' => ['latest' => '2017-11-27', '2017-11-27' => '2017-11-27'], 'serviceIdentifier' => 'mq'], 'mturk-requester' => ['namespace' => 'MTurk', 'versions' => ['latest' => '2017-01-17', '2017-01-17' => '2017-01-17'], 'serviceIdentifier' => 'mturk'], 'mwaa' => ['namespace' => 'MWAA', 'versions' => ['latest' => '2020-07-01', '2020-07-01' => '2020-07-01'], 'serviceIdentifier' => 'mwaa'], 'neptune' => ['namespace' => 'Neptune', 'versions' => ['latest' => '2014-10-31', '2014-10-31' => '2014-10-31'], 'serviceIdentifier' => 'neptune'], 'network-firewall' => ['namespace' => 'NetworkFirewall', 'versions' => ['latest' => '2020-11-12', '2020-11-12' => '2020-11-12'], 'serviceIdentifier' => 'network_firewall'], 'networkmanager' => ['namespace' => 'NetworkManager', 'versions' => ['latest' => '2019-07-05', '2019-07-05' => '2019-07-05'], 'serviceIdentifier' => 'networkmanager'], 'nimble' => ['namespace' => 'NimbleStudio', 'versions' => ['latest' => '2020-08-01', '2020-08-01' => '2020-08-01'], 'serviceIdentifier' => 'nimble'], 'oam' => ['namespace' => 'OAM', 'versions' => ['latest' => '2022-06-10', '2022-06-10' => '2022-06-10'], 'serviceIdentifier' => 'oam'], 'omics' => ['namespace' => 'Omics', 'versions' => ['latest' => '2022-11-28', '2022-11-28' => '2022-11-28'], 'serviceIdentifier' => 'omics'], 'opensearch' => ['namespace' => 'OpenSearchService', 'versions' => ['latest' => '2021-01-01', '2021-01-01' => '2021-01-01'], 'serviceIdentifier' => 'opensearch'], 'opensearchserverless' => ['namespace' => 'OpenSearchServerless', 'versions' => ['latest' => '2021-11-01', '2021-11-01' => '2021-11-01'], 'serviceIdentifier' => 'opensearchserverless'], 'opsworks' => ['namespace' => 'OpsWorks', 'versions' => ['latest' => '2013-02-18', '2013-02-18' => '2013-02-18'], 'serviceIdentifier' => 'opsworks'], 'opsworkscm' => ['namespace' => 'OpsWorksCM', 'versions' => ['latest' => '2016-11-01', '2016-11-01' => '2016-11-01'], 'serviceIdentifier' => 'opsworkscm'], 'organizations' => ['namespace' => 'Organizations', 'versions' => ['latest' => '2016-11-28', '2016-11-28' => '2016-11-28'], 'serviceIdentifier' => 'organizations'], 'osis' => ['namespace' => 'OSIS', 'versions' => ['latest' => '2022-01-01', '2022-01-01' => '2022-01-01'], 'serviceIdentifier' => 'osis'], 'outposts' => ['namespace' => 'Outposts', 'versions' => ['latest' => '2019-12-03', '2019-12-03' => '2019-12-03'], 'serviceIdentifier' => 'outposts'], 'panorama' => ['namespace' => 'Panorama', 'versions' => ['latest' => '2019-07-24', '2019-07-24' => '2019-07-24'], 'serviceIdentifier' => 'panorama'], 'payment-cryptography-data' => ['namespace' => 'PaymentCryptographyData', 'versions' => ['latest' => '2022-02-03', '2022-02-03' => '2022-02-03'], 'serviceIdentifier' => 'payment_cryptography_data'], 'payment-cryptography' => ['namespace' => 'PaymentCryptography', 'versions' => ['latest' => '2021-09-14', '2021-09-14' => '2021-09-14'], 'serviceIdentifier' => 'payment_cryptography'], 'personalize-events' => ['namespace' => 'PersonalizeEvents', 'versions' => ['latest' => '2018-03-22', '2018-03-22' => '2018-03-22'], 'serviceIdentifier' => 'personalize_events'], 'personalize-runtime' => ['namespace' => 'PersonalizeRuntime', 'versions' => ['latest' => '2018-05-22', '2018-05-22' => '2018-05-22'], 'serviceIdentifier' => 'personalize_runtime'], 'personalize' => ['namespace' => 'Personalize', 'versions' => ['latest' => '2018-05-22', '2018-05-22' => '2018-05-22'], 'serviceIdentifier' => 'personalize'], 'pi' => ['namespace' => 'PI', 'versions' => ['latest' => '2018-02-27', '2018-02-27' => '2018-02-27'], 'serviceIdentifier' => 'pi'], 'pinpoint-email' => ['namespace' => 'PinpointEmail', 'versions' => ['latest' => '2018-07-26', '2018-07-26' => '2018-07-26'], 'serviceIdentifier' => 'pinpoint_email'], 'pinpoint-sms-voice-v2' => ['namespace' => 'PinpointSMSVoiceV2', 'versions' => ['latest' => '2022-03-31', '2022-03-31' => '2022-03-31'], 'serviceIdentifier' => 'pinpoint_sms_voice_v2'], 'pinpoint' => ['namespace' => 'Pinpoint', 'versions' => ['latest' => '2016-12-01', '2016-12-01' => '2016-12-01'], 'serviceIdentifier' => 'pinpoint'], 'pipes' => ['namespace' => 'Pipes', 'versions' => ['latest' => '2015-10-07', '2015-10-07' => '2015-10-07'], 'serviceIdentifier' => 'pipes'], 'polly' => ['namespace' => 'Polly', 'versions' => ['latest' => '2016-06-10', '2016-06-10' => '2016-06-10'], 'serviceIdentifier' => 'polly'], 'pricing' => ['namespace' => 'Pricing', 'versions' => ['latest' => '2017-10-15', '2017-10-15' => '2017-10-15'], 'serviceIdentifier' => 'pricing'], 'privatenetworks' => ['namespace' => 'PrivateNetworks', 'versions' => ['latest' => '2021-12-03', '2021-12-03' => '2021-12-03'], 'serviceIdentifier' => 'privatenetworks'], 'proton' => ['namespace' => 'Proton', 'versions' => ['latest' => '2020-07-20', '2020-07-20' => '2020-07-20'], 'serviceIdentifier' => 'proton'], 'qldb-session' => ['namespace' => 'QLDBSession', 'versions' => ['latest' => '2019-07-11', '2019-07-11' => '2019-07-11'], 'serviceIdentifier' => 'qldb_session'], 'qldb' => ['namespace' => 'QLDB', 'versions' => ['latest' => '2019-01-02', '2019-01-02' => '2019-01-02'], 'serviceIdentifier' => 'qldb'], 'quicksight' => ['namespace' => 'QuickSight', 'versions' => ['latest' => '2018-04-01', '2018-04-01' => '2018-04-01'], 'serviceIdentifier' => 'quicksight'], 'ram' => ['namespace' => 'RAM', 'versions' => ['latest' => '2018-01-04', '2018-01-04' => '2018-01-04'], 'serviceIdentifier' => 'ram'], 'rbin' => ['namespace' => 'RecycleBin', 'versions' => ['latest' => '2021-06-15', '2021-06-15' => '2021-06-15'], 'serviceIdentifier' => 'rbin'], 'rds-data' => ['namespace' => 'RDSDataService', 'versions' => ['latest' => '2018-08-01', '2018-08-01' => '2018-08-01'], 'serviceIdentifier' => 'rds_data'], 'rds' => ['namespace' => 'Rds', 'versions' => ['latest' => '2014-10-31', '2014-10-31' => '2014-10-31', '2014-09-01' => '2014-09-01'], 'serviceIdentifier' => 'rds'], 'redshift-data' => ['namespace' => 'RedshiftDataAPIService', 'versions' => ['latest' => '2019-12-20', '2019-12-20' => '2019-12-20'], 'serviceIdentifier' => 'redshift_data'], 'redshift-serverless' => ['namespace' => 'RedshiftServerless', 'versions' => ['latest' => '2021-04-21', '2021-04-21' => '2021-04-21'], 'serviceIdentifier' => 'redshift_serverless'], 'redshift' => ['namespace' => 'Redshift', 'versions' => ['latest' => '2012-12-01', '2012-12-01' => '2012-12-01'], 'serviceIdentifier' => 'redshift'], 'rekognition' => ['namespace' => 'Rekognition', 'versions' => ['latest' => '2016-06-27', '2016-06-27' => '2016-06-27'], 'serviceIdentifier' => 'rekognition'], 'resiliencehub' => ['namespace' => 'ResilienceHub', 'versions' => ['latest' => '2020-04-30', '2020-04-30' => '2020-04-30'], 'serviceIdentifier' => 'resiliencehub'], 'resource-explorer-2' => ['namespace' => 'ResourceExplorer2', 'versions' => ['latest' => '2022-07-28', '2022-07-28' => '2022-07-28'], 'serviceIdentifier' => 'resource_explorer_2'], 'resource-groups' => ['namespace' => 'ResourceGroups', 'versions' => ['latest' => '2017-11-27', '2017-11-27' => '2017-11-27'], 'serviceIdentifier' => 'resource_groups'], 'resourcegroupstaggingapi' => ['namespace' => 'ResourceGroupsTaggingAPI', 'versions' => ['latest' => '2017-01-26', '2017-01-26' => '2017-01-26'], 'serviceIdentifier' => 'resource_groups_tagging_api'], 'robomaker' => ['namespace' => 'RoboMaker', 'versions' => ['latest' => '2018-06-29', '2018-06-29' => '2018-06-29'], 'serviceIdentifier' => 'robomaker'], 'rolesanywhere' => ['namespace' => 'RolesAnywhere', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'rolesanywhere'], 'route53-recovery-cluster' => ['namespace' => 'Route53RecoveryCluster', 'versions' => ['latest' => '2019-12-02', '2019-12-02' => '2019-12-02'], 'serviceIdentifier' => 'route53_recovery_cluster'], 'route53-recovery-control-config' => ['namespace' => 'Route53RecoveryControlConfig', 'versions' => ['latest' => '2020-11-02', '2020-11-02' => '2020-11-02'], 'serviceIdentifier' => 'route53_recovery_control_config'], 'route53-recovery-readiness' => ['namespace' => 'Route53RecoveryReadiness', 'versions' => ['latest' => '2019-12-02', '2019-12-02' => '2019-12-02'], 'serviceIdentifier' => 'route53_recovery_readiness'], 'route53' => ['namespace' => 'Route53', 'versions' => ['latest' => '2013-04-01', '2013-04-01' => '2013-04-01'], 'serviceIdentifier' => 'route_53'], 'route53domains' => ['namespace' => 'Route53Domains', 'versions' => ['latest' => '2014-05-15', '2014-05-15' => '2014-05-15'], 'serviceIdentifier' => 'route_53_domains'], 'route53resolver' => ['namespace' => 'Route53Resolver', 'versions' => ['latest' => '2018-04-01', '2018-04-01' => '2018-04-01'], 'serviceIdentifier' => 'route53resolver'], 'rum' => ['namespace' => 'CloudWatchRUM', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'rum'], 'runtime.lex.v2' => ['namespace' => 'LexRuntimeV2', 'versions' => ['latest' => '2020-08-07', '2020-08-07' => '2020-08-07'], 'serviceIdentifier' => 'lex_runtime_v2'], 'runtime.lex' => ['namespace' => 'LexRuntimeService', 'versions' => ['latest' => '2016-11-28', '2016-11-28' => '2016-11-28'], 'serviceIdentifier' => 'lex_runtime_service'], 'runtime.sagemaker' => ['namespace' => 'SageMakerRuntime', 'versions' => ['latest' => '2017-05-13', '2017-05-13' => '2017-05-13'], 'serviceIdentifier' => 'sagemaker_runtime'], 's3' => ['namespace' => 'S3', 'versions' => ['latest' => '2006-03-01', '2006-03-01' => '2006-03-01'], 'serviceIdentifier' => 's3'], 's3control' => ['namespace' => 'S3Control', 'versions' => ['latest' => '2018-08-20', '2018-08-20' => '2018-08-20'], 'serviceIdentifier' => 's3_control'], 's3outposts' => ['namespace' => 'S3Outposts', 'versions' => ['latest' => '2017-07-25', '2017-07-25' => '2017-07-25'], 'serviceIdentifier' => 's3outposts'], 'sagemaker-a2i-runtime' => ['namespace' => 'AugmentedAIRuntime', 'versions' => ['latest' => '2019-11-07', '2019-11-07' => '2019-11-07'], 'serviceIdentifier' => 'sagemaker_a2i_runtime'], 'sagemaker-edge' => ['namespace' => 'SagemakerEdgeManager', 'versions' => ['latest' => '2020-09-23', '2020-09-23' => '2020-09-23'], 'serviceIdentifier' => 'sagemaker_edge'], 'sagemaker-featurestore-runtime' => ['namespace' => 'SageMakerFeatureStoreRuntime', 'versions' => ['latest' => '2020-07-01', '2020-07-01' => '2020-07-01'], 'serviceIdentifier' => 'sagemaker_featurestore_runtime'], 'sagemaker-geospatial' => ['namespace' => 'SageMakerGeospatial', 'versions' => ['latest' => '2020-05-27', '2020-05-27' => '2020-05-27'], 'serviceIdentifier' => 'sagemaker_geospatial'], 'sagemaker-metrics' => ['namespace' => 'SageMakerMetrics', 'versions' => ['latest' => '2022-09-30', '2022-09-30' => '2022-09-30'], 'serviceIdentifier' => 'sagemaker_metrics'], 'sagemaker' => ['namespace' => 'SageMaker', 'versions' => ['latest' => '2017-07-24', '2017-07-24' => '2017-07-24'], 'serviceIdentifier' => 'sagemaker'], 'savingsplans' => ['namespace' => 'SavingsPlans', 'versions' => ['latest' => '2019-06-28', '2019-06-28' => '2019-06-28'], 'serviceIdentifier' => 'savingsplans'], 'scheduler' => ['namespace' => 'Scheduler', 'versions' => ['latest' => '2021-06-30', '2021-06-30' => '2021-06-30'], 'serviceIdentifier' => 'scheduler'], 'schemas' => ['namespace' => 'Schemas', 'versions' => ['latest' => '2019-12-02', '2019-12-02' => '2019-12-02'], 'serviceIdentifier' => 'schemas'], 'secretsmanager' => ['namespace' => 'SecretsManager', 'versions' => ['latest' => '2017-10-17', '2017-10-17' => '2017-10-17'], 'serviceIdentifier' => 'secrets_manager'], 'securityhub' => ['namespace' => 'SecurityHub', 'versions' => ['latest' => '2018-10-26', '2018-10-26' => '2018-10-26'], 'serviceIdentifier' => 'securityhub'], 'securitylake' => ['namespace' => 'SecurityLake', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'securitylake'], 'serverlessrepo' => ['namespace' => 'ServerlessApplicationRepository', 'versions' => ['latest' => '2017-09-08', '2017-09-08' => '2017-09-08'], 'serviceIdentifier' => 'serverlessapplicationrepository'], 'service-quotas' => ['namespace' => 'ServiceQuotas', 'versions' => ['latest' => '2019-06-24', '2019-06-24' => '2019-06-24'], 'serviceIdentifier' => 'service_quotas'], 'servicecatalog-appregistry' => ['namespace' => 'AppRegistry', 'versions' => ['latest' => '2020-06-24', '2020-06-24' => '2020-06-24'], 'serviceIdentifier' => 'service_catalog_appregistry'], 'servicecatalog' => ['namespace' => 'ServiceCatalog', 'versions' => ['latest' => '2015-12-10', '2015-12-10' => '2015-12-10'], 'serviceIdentifier' => 'service_catalog'], 'servicediscovery' => ['namespace' => 'ServiceDiscovery', 'versions' => ['latest' => '2017-03-14', '2017-03-14' => '2017-03-14'], 'serviceIdentifier' => 'servicediscovery'], 'sesv2' => ['namespace' => 'SesV2', 'versions' => ['latest' => '2019-09-27', '2019-09-27' => '2019-09-27'], 'serviceIdentifier' => 'sesv2'], 'shield' => ['namespace' => 'Shield', 'versions' => ['latest' => '2016-06-02', '2016-06-02' => '2016-06-02'], 'serviceIdentifier' => 'shield'], 'signer' => ['namespace' => 'signer', 'versions' => ['latest' => '2017-08-25', '2017-08-25' => '2017-08-25'], 'serviceIdentifier' => 'signer'], 'simspaceweaver' => ['namespace' => 'SimSpaceWeaver', 'versions' => ['latest' => '2022-10-28', '2022-10-28' => '2022-10-28'], 'serviceIdentifier' => 'simspaceweaver'], 'sms-voice' => ['namespace' => 'PinpointSMSVoice', 'versions' => ['latest' => '2018-09-05', '2018-09-05' => '2018-09-05'], 'serviceIdentifier' => 'pinpoint_sms_voice'], 'sms' => ['namespace' => 'Sms', 'versions' => ['latest' => '2016-10-24', '2016-10-24' => '2016-10-24'], 'serviceIdentifier' => 'sms'], 'snow-device-management' => ['namespace' => 'SnowDeviceManagement', 'versions' => ['latest' => '2021-08-04', '2021-08-04' => '2021-08-04'], 'serviceIdentifier' => 'snow_device_management'], 'snowball' => ['namespace' => 'SnowBall', 'versions' => ['latest' => '2016-06-30', '2016-06-30' => '2016-06-30'], 'serviceIdentifier' => 'snowball'], 'sns' => ['namespace' => 'Sns', 'versions' => ['latest' => '2010-03-31', '2010-03-31' => '2010-03-31'], 'serviceIdentifier' => 'sns'], 'sqs' => ['namespace' => 'Sqs', 'versions' => ['latest' => '2012-11-05', '2012-11-05' => '2012-11-05'], 'serviceIdentifier' => 'sqs'], 'ssm-contacts' => ['namespace' => 'SSMContacts', 'versions' => ['latest' => '2021-05-03', '2021-05-03' => '2021-05-03'], 'serviceIdentifier' => 'ssm_contacts'], 'ssm-incidents' => ['namespace' => 'SSMIncidents', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'ssm_incidents'], 'ssm-sap' => ['namespace' => 'SsmSap', 'versions' => ['latest' => '2018-05-10', '2018-05-10' => '2018-05-10'], 'serviceIdentifier' => 'ssm_sap'], 'ssm' => ['namespace' => 'Ssm', 'versions' => ['latest' => '2014-11-06', '2014-11-06' => '2014-11-06'], 'serviceIdentifier' => 'ssm'], 'sso-admin' => ['namespace' => 'SSOAdmin', 'versions' => ['latest' => '2020-07-20', '2020-07-20' => '2020-07-20'], 'serviceIdentifier' => 'sso_admin'], 'sso-oidc' => ['namespace' => 'SSOOIDC', 'versions' => ['latest' => '2019-06-10', '2019-06-10' => '2019-06-10'], 'serviceIdentifier' => 'sso_oidc'], 'sso' => ['namespace' => 'SSO', 'versions' => ['latest' => '2019-06-10', '2019-06-10' => '2019-06-10'], 'serviceIdentifier' => 'sso'], 'states' => ['namespace' => 'Sfn', 'versions' => ['latest' => '2016-11-23', '2016-11-23' => '2016-11-23'], 'serviceIdentifier' => 'sfn'], 'storagegateway' => ['namespace' => 'StorageGateway', 'versions' => ['latest' => '2013-06-30', '2013-06-30' => '2013-06-30'], 'serviceIdentifier' => 'storage_gateway'], 'streams.dynamodb' => ['namespace' => 'DynamoDbStreams', 'versions' => ['latest' => '2012-08-10', '2012-08-10' => '2012-08-10'], 'serviceIdentifier' => 'dynamodb_streams'], 'sts' => ['namespace' => 'Sts', 'versions' => ['latest' => '2011-06-15', '2011-06-15' => '2011-06-15'], 'serviceIdentifier' => 'sts'], 'support-app' => ['namespace' => 'SupportApp', 'versions' => ['latest' => '2021-08-20', '2021-08-20' => '2021-08-20'], 'serviceIdentifier' => 'support_app'], 'support' => ['namespace' => 'Support', 'versions' => ['latest' => '2013-04-15', '2013-04-15' => '2013-04-15'], 'serviceIdentifier' => 'support'], 'swf' => ['namespace' => 'Swf', 'versions' => ['latest' => '2012-01-25', '2012-01-25' => '2012-01-25'], 'serviceIdentifier' => 'swf'], 'synthetics' => ['namespace' => 'Synthetics', 'versions' => ['latest' => '2017-10-11', '2017-10-11' => '2017-10-11'], 'serviceIdentifier' => 'synthetics'], 'textract' => ['namespace' => 'Textract', 'versions' => ['latest' => '2018-06-27', '2018-06-27' => '2018-06-27'], 'serviceIdentifier' => 'textract'], 'timestream-query' => ['namespace' => 'TimestreamQuery', 'versions' => ['latest' => '2018-11-01', '2018-11-01' => '2018-11-01'], 'serviceIdentifier' => 'timestream_query'], 'timestream-write' => ['namespace' => 'TimestreamWrite', 'versions' => ['latest' => '2018-11-01', '2018-11-01' => '2018-11-01'], 'serviceIdentifier' => 'timestream_write'], 'tnb' => ['namespace' => 'Tnb', 'versions' => ['latest' => '2008-10-21', '2008-10-21' => '2008-10-21'], 'serviceIdentifier' => 'tnb'], 'transcribe' => ['namespace' => 'TranscribeService', 'versions' => ['latest' => '2017-10-26', '2017-10-26' => '2017-10-26'], 'serviceIdentifier' => 'transcribe'], 'transfer' => ['namespace' => 'Transfer', 'versions' => ['latest' => '2018-11-05', '2018-11-05' => '2018-11-05'], 'serviceIdentifier' => 'transfer'], 'translate' => ['namespace' => 'Translate', 'versions' => ['latest' => '2017-07-01', '2017-07-01' => '2017-07-01'], 'serviceIdentifier' => 'translate'], 'verifiedpermissions' => ['namespace' => 'VerifiedPermissions', 'versions' => ['latest' => '2021-12-01', '2021-12-01' => '2021-12-01'], 'serviceIdentifier' => 'verifiedpermissions'], 'voice-id' => ['namespace' => 'VoiceID', 'versions' => ['latest' => '2021-09-27', '2021-09-27' => '2021-09-27'], 'serviceIdentifier' => 'voice_id'], 'vpc-lattice' => ['namespace' => 'VPCLattice', 'versions' => ['latest' => '2022-11-30', '2022-11-30' => '2022-11-30'], 'serviceIdentifier' => 'vpc_lattice'], 'waf-regional' => ['namespace' => 'WafRegional', 'versions' => ['latest' => '2016-11-28', '2016-11-28' => '2016-11-28'], 'serviceIdentifier' => 'waf_regional'], 'waf' => ['namespace' => 'Waf', 'versions' => ['latest' => '2015-08-24', '2015-08-24' => '2015-08-24'], 'serviceIdentifier' => 'waf'], 'wafv2' => ['namespace' => 'WAFV2', 'versions' => ['latest' => '2019-07-29', '2019-07-29' => '2019-07-29'], 'serviceIdentifier' => 'wafv2'], 'wellarchitected' => ['namespace' => 'WellArchitected', 'versions' => ['latest' => '2020-03-31', '2020-03-31' => '2020-03-31'], 'serviceIdentifier' => 'wellarchitected'], 'wisdom' => ['namespace' => 'ConnectWisdomService', 'versions' => ['latest' => '2020-10-19', '2020-10-19' => '2020-10-19'], 'serviceIdentifier' => 'wisdom'], 'workdocs' => ['namespace' => 'WorkDocs', 'versions' => ['latest' => '2016-05-01', '2016-05-01' => '2016-05-01'], 'serviceIdentifier' => 'workdocs'], 'worklink' => ['namespace' => 'WorkLink', 'versions' => ['latest' => '2018-09-25', '2018-09-25' => '2018-09-25'], 'serviceIdentifier' => 'worklink'], 'workmail' => ['namespace' => 'WorkMail', 'versions' => ['latest' => '2017-10-01', '2017-10-01' => '2017-10-01'], 'serviceIdentifier' => 'workmail'], 'workmailmessageflow' => ['namespace' => 'WorkMailMessageFlow', 'versions' => ['latest' => '2019-05-01', '2019-05-01' => '2019-05-01'], 'serviceIdentifier' => 'workmailmessageflow'], 'workspaces-web' => ['namespace' => 'WorkSpacesWeb', 'versions' => ['latest' => '2020-07-08', '2020-07-08' => '2020-07-08'], 'serviceIdentifier' => 'workspaces_web'], 'workspaces' => ['namespace' => 'WorkSpaces', 'versions' => ['latest' => '2015-04-08', '2015-04-08' => '2015-04-08'], 'serviceIdentifier' => 'workspaces'], 'xray' => ['namespace' => 'XRay', 'versions' => ['latest' => '2016-04-12', '2016-04-12' => '2016-04-12'], 'serviceIdentifier' => 'xray']];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/partitions.json.php000064400000010330147600374260024171 0ustar00 [['id' => 'aws', 'outputs' => ['dnsSuffix' => 'amazonaws.com', 'dualStackDnsSuffix' => 'api.aws', 'name' => 'aws', 'supportsDualStack' => \true, 'supportsFIPS' => \true], 'regionRegex' => '^(us|eu|ap|sa|ca|me|af|il)\\-\\w+\\-\\d+$', 'regions' => ['af-south-1' => ['description' => 'Africa (Cape Town)'], 'ap-east-1' => ['description' => 'Asia Pacific (Hong Kong)'], 'ap-northeast-1' => ['description' => 'Asia Pacific (Tokyo)'], 'ap-northeast-2' => ['description' => 'Asia Pacific (Seoul)'], 'ap-northeast-3' => ['description' => 'Asia Pacific (Osaka)'], 'ap-south-1' => ['description' => 'Asia Pacific (Mumbai)'], 'ap-south-2' => ['description' => 'Asia Pacific (Hyderabad)'], 'ap-southeast-1' => ['description' => 'Asia Pacific (Singapore)'], 'ap-southeast-2' => ['description' => 'Asia Pacific (Sydney)'], 'ap-southeast-3' => ['description' => 'Asia Pacific (Jakarta)'], 'ap-southeast-4' => ['description' => 'Asia Pacific (Melbourne)'], 'aws-global' => ['description' => 'AWS Standard global region'], 'ca-central-1' => ['description' => 'Canada (Central)'], 'eu-central-1' => ['description' => 'Europe (Frankfurt)'], 'eu-central-2' => ['description' => 'Europe (Zurich)'], 'eu-north-1' => ['description' => 'Europe (Stockholm)'], 'eu-south-1' => ['description' => 'Europe (Milan)'], 'eu-south-2' => ['description' => 'Europe (Spain)'], 'eu-west-1' => ['description' => 'Europe (Ireland)'], 'eu-west-2' => ['description' => 'Europe (London)'], 'eu-west-3' => ['description' => 'Europe (Paris)'], 'il-central-1' => ['description' => 'Israel (Tel Aviv)'], 'me-central-1' => ['description' => 'Middle East (UAE)'], 'me-south-1' => ['description' => 'Middle East (Bahrain)'], 'sa-east-1' => ['description' => 'South America (Sao Paulo)'], 'us-east-1' => ['description' => 'US East (N. Virginia)'], 'us-east-2' => ['description' => 'US East (Ohio)'], 'us-west-1' => ['description' => 'US West (N. California)'], 'us-west-2' => ['description' => 'US West (Oregon)']]], ['id' => 'aws-cn', 'outputs' => ['dnsSuffix' => 'amazonaws.com.cn', 'dualStackDnsSuffix' => 'api.amazonwebservices.com.cn', 'name' => 'aws-cn', 'supportsDualStack' => \true, 'supportsFIPS' => \true], 'regionRegex' => '^cn\\-\\w+\\-\\d+$', 'regions' => ['aws-cn-global' => ['description' => 'AWS China global region'], 'cn-north-1' => ['description' => 'China (Beijing)'], 'cn-northwest-1' => ['description' => 'China (Ningxia)']]], ['id' => 'aws-us-gov', 'outputs' => ['dnsSuffix' => 'amazonaws.com', 'dualStackDnsSuffix' => 'api.aws', 'name' => 'aws-us-gov', 'supportsDualStack' => \true, 'supportsFIPS' => \true], 'regionRegex' => '^us\\-gov\\-\\w+\\-\\d+$', 'regions' => ['aws-us-gov-global' => ['description' => 'AWS GovCloud (US) global region'], 'us-gov-east-1' => ['description' => 'AWS GovCloud (US-East)'], 'us-gov-west-1' => ['description' => 'AWS GovCloud (US-West)']]], ['id' => 'aws-iso', 'outputs' => ['dnsSuffix' => 'c2s.ic.gov', 'dualStackDnsSuffix' => 'c2s.ic.gov', 'name' => 'aws-iso', 'supportsDualStack' => \false, 'supportsFIPS' => \true], 'regionRegex' => '^us\\-iso\\-\\w+\\-\\d+$', 'regions' => ['aws-iso-global' => ['description' => 'AWS ISO (US) global region'], 'us-iso-east-1' => ['description' => 'US ISO East'], 'us-iso-west-1' => ['description' => 'US ISO WEST']]], ['id' => 'aws-iso-b', 'outputs' => ['dnsSuffix' => 'sc2s.sgov.gov', 'dualStackDnsSuffix' => 'sc2s.sgov.gov', 'name' => 'aws-iso-b', 'supportsDualStack' => \false, 'supportsFIPS' => \true], 'regionRegex' => '^us\\-isob\\-\\w+\\-\\d+$', 'regions' => ['aws-iso-b-global' => ['description' => 'AWS ISOB (US) global region'], 'us-isob-east-1' => ['description' => 'US ISOB East (Ohio)']]], ['id' => 'aws-iso-e', 'outputs' => ['dnsSuffix' => 'cloud.adc-e.uk', 'dualStackDnsSuffix' => 'cloud.adc-e.uk', 'name' => 'aws-iso-e', 'supportsDualStack' => \false, 'supportsFIPS' => \true], 'regionRegex' => '^eu\\-isoe\\-\\w+\\-\\d+$', 'regions' => []], ['id' => 'aws-iso-f', 'outputs' => ['dnsSuffix' => 'csp.hci.ic.gov', 'dualStackDnsSuffix' => 'csp.hci.ic.gov', 'name' => 'aws-iso-f', 'supportsDualStack' => \false, 'supportsFIPS' => \true], 'regionRegex' => '^us\\-isof\\-\\w+\\-\\d+$', 'regions' => []]], 'version' => '1.1']; addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/sdk-default-configuration.json.php000064400000007707147600374260027063 0ustar00;;; 1, 'base' => ['retryMode' => 'standard', 'stsRegionalEndpoints' => 'regional', 's3UsEast1RegionalEndpoints' => 'regional', 'connectTimeoutInMillis' => 1100, 'tlsNegotiationTimeoutInMillis' => 1100], 'modes' => ['standard' => ['connectTimeoutInMillis' => ['override' => 3100], 'tlsNegotiationTimeoutInMillis' => ['override' => 3100]], 'in-region' => [], 'cross-region' => ['connectTimeoutInMillis' => ['override' => 3100], 'tlsNegotiationTimeoutInMillis' => ['override' => 3100]], 'mobile' => ['connectTimeoutInMillis' => ['override' => 30000], 'tlsNegotiationTimeoutInMillis' => ['override' => 30000]]], 'documentation' => ['modes' => ['standard' => '

The STANDARD mode provides the latest recommended default values that should be safe to run in most scenarios

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'in-region' => '

The IN_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services from within the same AWS region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'cross-region' => '

The CROSS_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services in a different region

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'mobile' => '

The MOBILE mode builds on the standard mode and includes optimization tailored for mobile applications

Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK

', 'auto' => '

The AUTO mode is an experimental mode that builds on the standard mode. The SDK will attempt to discover the execution environment to determine the appropriate settings automatically.

Note that the auto detection is heuristics-based and does not guarantee 100% accuracy. STANDARD mode will be used if the execution environment cannot be determined. The auto detection might query EC2 Instance Metadata service, which might introduce latency. Therefore we recommend choosing an explicit defaults_mode instead if startup latency is critical to your application

', 'legacy' => '

The LEGACY mode provides default settings that vary per SDK and were used prior to establishment of defaults_mode

'], 'configuration' => ['retryMode' => '

A retry mode specifies how the SDK attempts retries. See Retry Mode

', 'stsRegionalEndpoints' => '

Specifies how the SDK determines the AWS service endpoint that it uses to talk to the AWS Security Token Service (AWS STS). See Setting STS Regional endpoints

', 's3UsEast1RegionalEndpoints' => '

Specifies how the SDK determines the AWS service endpoint that it uses to talk to the Amazon S3 for the us-east-1 region

', 'connectTimeoutInMillis' => '

The amount of time after making an initial connection attempt on a socket, where if the client does not receive a completion of the connect handshake, the client gives up and fails the operation

', 'tlsNegotiationTimeoutInMillis' => '

The maximum amount of time that a TLS handshake is allowed to take from the time the CLIENT HELLO message is sent to ethe time the client and server have fully negotiated ciphers and exchanged keys

']]];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/endpoints_prefix_history.json.php000064400000000555147600374260027146 0ustar00;;; ['api.ecr' => ['ecr'], 'api.elastic-inference' => ['elastic-inference'], 'api.sagemaker' => ['sagemaker'], 'ecr' => ['api.ecr'], 'elastic-inference' => ['api.elastic-inference'], 'sagemaker' => ['api.sagemaker']]];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/data/aliases.json.php000064400000001003147600374260023413 0ustar00;;; ['ApiGatewayV2' => ['2018-11-29' => ['GetApi' => 'GetApiResource']], 'CloudHSM' => ['2014-05-30' => ['GetConfig' => 'GetConfigFiles']], 'GroundStation' => ['2019-05-23' => ['GetConfig' => 'GetMissionProfileConfig']], 'Pinpoint' => ['2016-12-01' => ['GetEndpoint' => 'GetUserEndpoint', 'UpdateEndpoint' => 'UpdateUserEndpoint', 'UpdateEndpointsBatch' => 'UpdateUserEndpointsBatch']]]];addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Psr16CacheAdapter.php000064400000001132147600374260023254 0ustar00cache = $cache; } public function get($key) { return $this->cache->get($key); } public function set($key, $value, $ttl = 0) { $this->cache->set($key, $value, $ttl); } public function remove($key) { $this->cache->delete($key); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/MockHandler.php000064400000010047147600374260022310 0ustar00queue = []; $this->onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($resultOrQueue) { \call_user_func_array([$this, 'append'], \array_values($resultOrQueue)); } } /** * Adds one or more variadic ResultInterface or AwsException objects to the * queue. */ public function append() { foreach (\func_get_args() as $value) { if ($value instanceof ResultInterface || $value instanceof Exception || \is_callable($value)) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected an Aws\\ResultInterface or Exception.'); } } } /** * Adds one or more \Exception or \Throwable to the queue */ public function appendException() { foreach (\func_get_args() as $value) { if ($value instanceof \Exception || $value instanceof \Throwable) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected an \\Exception or \\Throwable.'); } } } public function __invoke(CommandInterface $command, RequestInterface $request) { if (!$this->queue) { $last = $this->lastCommand ? ' The last command sent was ' . $this->lastCommand->getName() . '.' : ''; throw new \RuntimeException('Mock queue is empty. Trying to send a ' . $command->getName() . ' command failed.' . $last); } $this->lastCommand = $command; $this->lastRequest = $request; $result = \array_shift($this->queue); if (\is_callable($result)) { $result = $result($command, $request); } if ($result instanceof \Exception) { $result = new RejectedPromise($result); } else { // Add an effective URI and statusCode if not present. $meta = $result['@metadata']; if (!isset($meta['effectiveUri'])) { $meta['effectiveUri'] = (string) $request->getUri(); } if (!isset($meta['statusCode'])) { $meta['statusCode'] = 200; } $result['@metadata'] = $meta; $result = Promise\Create::promiseFor($result); } $result->then($this->onFulfilled, $this->onRejected); return $result; } /** * Get the last received request. * * @return RequestInterface */ public function getLastRequest() { return $this->lastRequest; } /** * Get the last received command. * * @return CommandInterface */ public function getLastCommand() { return $this->lastCommand; } /** * Returns the number of remaining items in the queue. * * @return int */ #[\ReturnTypeWillChange] public function count() { return \count($this->queue); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/PsrCacheAdapter.php000064400000001402147600374260023105 0ustar00pool = $pool; } public function get($key) { $item = $this->pool->getItem($key); return $item->isHit() ? $item->get() : null; } public function set($key, $value, $ttl = 0) { $item = $this->pool->getItem($key); $item->set($value); if ($ttl > 0) { $item->expiresAfter($ttl); } $this->pool->save($item); } public function remove($key) { $this->pool->deleteItem($key); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/CacheInterface.php000064400000001403147600374260022741 0ustar00 '[TOKEN]']; private static $authStrings = [ // S3Signature '/AWSAccessKeyId=[A-Z0-9]{20}&/i' => 'AWSAccessKeyId=[KEY]&', // SignatureV4 Signature and S3Signature '/Signature=.+/i' => 'Signature=[SIGNATURE]', // SignatureV4 access key ID '/Credential=[A-Z0-9]{20}\\//i' => 'Credential=[KEY]/', // S3 signatures '/AWS [A-Z0-9]{20}:.+/' => 'AWS AKI[KEY]:[SIGNATURE]', // STS Presigned URLs '/X-Amz-Security-Token=[^&]+/i' => 'X-Amz-Security-Token=[TOKEN]', // Crypto *Stream Keys '/\\["key.{27,36}Stream.{9}\\]=>\\s+.{7}\\d{2}\\) "\\X{16,64}"/U' => '["key":[CONTENT KEY]]', ]; /** * Configuration array can contain the following key value pairs. * * - logfn: (callable) Function that is invoked with log messages. By * default, PHP's "echo" function will be utilized. * - stream_size: (int) When the size of a stream is greater than this * number, the stream data will not be logged. Set to "0" to not log any * stream data. * - scrub_auth: (bool) Set to false to disable the scrubbing of auth data * from the logged messages. * - http: (bool) Set to false to disable the "debug" feature of lower * level HTTP adapters (e.g., verbose curl output). * - auth_strings: (array) A mapping of authentication string regular * expressions to scrubbed strings. These mappings are passed directly to * preg_replace (e.g., preg_replace($key, $value, $debugOutput) if * "scrub_auth" is set to true. * - auth_headers: (array) A mapping of header names known to contain * sensitive data to what the scrubbed value should be. The value of any * headers contained in this array will be replaced with the if * "scrub_auth" is set to true. */ public function __construct(array $config = [], Service $service = null) { $this->config = $config + ['logfn' => function ($value) { echo $value; }, 'stream_size' => 524288, 'scrub_auth' => \true, 'http' => \true, 'auth_strings' => [], 'auth_headers' => []]; $this->config['auth_strings'] += self::$authStrings; $this->config['auth_headers'] += self::$authHeaders; $this->service = $service; } public function __invoke($step, $name) { $this->prevOutput = $this->prevInput = []; return function (callable $next) use($step, $name) { return function (CommandInterface $command, RequestInterface $request = null) use($next, $step, $name) { $this->createHttpDebug($command); $start = \microtime(\true); $this->stepInput(['step' => $step, 'name' => $name, 'request' => $this->requestArray($request), 'command' => $this->commandArray($command)]); return $next($command, $request)->then(function ($value) use($step, $name, $command, $start) { $this->flushHttpDebug($command); $this->stepOutput($start, ['step' => $step, 'name' => $name, 'result' => $this->resultArray($value), 'error' => null]); return $value; }, function ($reason) use($step, $name, $start, $command) { $this->flushHttpDebug($command); $this->stepOutput($start, ['step' => $step, 'name' => $name, 'result' => null, 'error' => $this->exceptionArray($reason)]); return new RejectedPromise($reason); }); }; }; } private function stepInput($entry) { static $keys = ['command', 'request']; $this->compareStep($this->prevInput, $entry, '-> Entering', $keys); $this->write("\n"); $this->prevInput = $entry; } private function stepOutput($start, $entry) { static $keys = ['result', 'error']; $this->compareStep($this->prevOutput, $entry, '<- Leaving', $keys); $totalTime = \microtime(\true) - $start; $this->write(" Inclusive step time: " . $totalTime . "\n\n"); $this->prevOutput = $entry; } private function compareStep(array $a, array $b, $title, array $keys) { $changes = []; foreach ($keys as $key) { $av = isset($a[$key]) ? $a[$key] : null; $bv = isset($b[$key]) ? $b[$key] : null; $this->compareArray($av, $bv, $key, $changes); } $str = "\n{$title} step {$b['step']}, name '{$b['name']}'"; $str .= "\n" . \str_repeat('-', \strlen($str) - 1) . "\n\n "; $str .= $changes ? \implode("\n ", \str_replace("\n", "\n ", $changes)) : 'no changes'; $this->write($str . "\n"); } private function commandArray(CommandInterface $cmd) { return ['instance' => \spl_object_hash($cmd), 'name' => $cmd->getName(), 'params' => $this->getRedactedArray($cmd)]; } private function requestArray(RequestInterface $request = null) { return !$request ? [] : \array_filter(['instance' => \spl_object_hash($request), 'method' => $request->getMethod(), 'headers' => $this->redactHeaders($request->getHeaders()), 'body' => $this->streamStr($request->getBody()), 'scheme' => $request->getUri()->getScheme(), 'port' => $request->getUri()->getPort(), 'path' => $request->getUri()->getPath(), 'query' => $request->getUri()->getQuery()]); } private function responseArray(ResponseInterface $response = null) { return !$response ? [] : ['instance' => \spl_object_hash($response), 'statusCode' => $response->getStatusCode(), 'headers' => $this->redactHeaders($response->getHeaders()), 'body' => $this->streamStr($response->getBody())]; } private function resultArray($value) { return $value instanceof ResultInterface ? ['instance' => \spl_object_hash($value), 'data' => $value->toArray()] : $value; } private function exceptionArray($e) { if (!$e instanceof \Exception) { return $e; } $result = ['instance' => \spl_object_hash($e), 'class' => \get_class($e), 'message' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTraceAsString()]; if ($e instanceof AwsException) { $result += ['type' => $e->getAwsErrorType(), 'code' => $e->getAwsErrorCode(), 'requestId' => $e->getAwsRequestId(), 'statusCode' => $e->getStatusCode(), 'result' => $this->resultArray($e->getResult()), 'request' => $this->requestArray($e->getRequest()), 'response' => $this->responseArray($e->getResponse())]; } return $result; } private function compareArray($a, $b, $path, array &$diff) { if ($a === $b) { return; } if (\is_array($a)) { $b = (array) $b; $keys = \array_unique(\array_merge(\array_keys($a), \array_keys($b))); foreach ($keys as $k) { if (!\array_key_exists($k, $a)) { $this->compareArray(null, $b[$k], "{$path}.{$k}", $diff); } elseif (!\array_key_exists($k, $b)) { $this->compareArray($a[$k], null, "{$path}.{$k}", $diff); } else { $this->compareArray($a[$k], $b[$k], "{$path}.{$k}", $diff); } } } elseif ($a !== null && $b === null) { $diff[] = "{$path} was unset"; } elseif ($a === null && $b !== null) { $diff[] = \sprintf("%s was set to %s", $path, $this->str($b)); } else { $diff[] = \sprintf("%s changed from %s to %s", $path, $this->str($a), $this->str($b)); } } private function str($value) { if (\is_scalar($value)) { return (string) $value; } if ($value instanceof \Exception) { $value = $this->exceptionArray($value); } \ob_start(); \var_dump($value); return \ob_get_clean(); } private function streamStr(StreamInterface $body) { return $body->getSize() < $this->config['stream_size'] ? (string) $body : 'stream(size=' . $body->getSize() . ')'; } private function createHttpDebug(CommandInterface $command) { if ($this->config['http'] && !isset($command['@http']['debug'])) { $command['@http']['debug'] = \fopen('php://temp', 'w+'); } } private function flushHttpDebug(CommandInterface $command) { if ($res = $command['@http']['debug']) { if (\is_resource($res)) { \rewind($res); $this->write(\stream_get_contents($res)); \fclose($res); } $command['@http']['debug'] = null; } } private function write($value) { if ($this->config['scrub_auth']) { foreach ($this->config['auth_strings'] as $pattern => $replacement) { $value = \preg_replace_callback($pattern, function ($matches) use($replacement) { return $replacement; }, $value); } } \call_user_func($this->config['logfn'], $value); } private function redactHeaders(array $headers) { if ($this->config['scrub_auth']) { $headers = $this->config['auth_headers'] + $headers; } return $headers; } /** * @param CommandInterface $cmd * @return array */ private function getRedactedArray(CommandInterface $cmd) { if (!isset($this->service["shapes"])) { return $cmd->toArray(); } $shapes = $this->service["shapes"]; $cmdArray = $cmd->toArray(); $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($cmdArray), RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $parameter => $value) { if (isset($shapes[$parameter]['sensitive']) && $shapes[$parameter]['sensitive'] === \true) { $redactedValue = \is_string($value) ? "[{$parameter}]" : ["[{$parameter}]"]; $currentDepth = $iterator->getDepth(); for ($subDepth = $currentDepth; $subDepth >= 0; $subDepth--) { $subIterator = $iterator->getSubIterator($subDepth); $subIterator->offsetSet($subIterator->key(), $subDepth === $currentDepth ? $redactedValue : $iterator->getSubIterator($subDepth + 1)->getArrayCopy()); } } } return $iterator->getArrayCopy(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/IdempotencyTokenMiddleware.php000064400000007252147600374260025404 0ustar00bytesGenerator = $bytesGenerator ?: $this->findCompatibleRandomSource(); $this->service = $service; $this->nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request = null) { $handler = $this->nextHandler; if ($this->bytesGenerator) { $operation = $this->service->getOperation($command->getName()); $members = $operation->getInput()->getMembers(); foreach ($members as $member => $value) { if ($value['idempotencyToken']) { $bytes = \call_user_func($this->bytesGenerator, 16); // populating UUIDv4 only when the parameter is not set $command[$member] = $command[$member] ?: $this->getUuidV4($bytes); // only one member could have the trait enabled break; } } } return $handler($command, $request); } /** * This function generates a random UUID v4 string, * which is used as auto filled token value. * * @param string $bytes 16 bytes of pseudo-random bytes * @return string * More information about UUID v4, see: * https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 * https://tools.ietf.org/html/rfc4122#page-14 */ private static function getUuidV4($bytes) { // set version to 0100 $bytes[6] = \chr(\ord($bytes[6]) & 0xf | 0x40); // set bits 6-7 to 10 $bytes[8] = \chr(\ord($bytes[8]) & 0x3f | 0x80); return \vsprintf('%s%s-%s-%s-%s-%s%s%s', \str_split(\bin2hex($bytes), 4)); } /** * This function decides the PHP function used in generating random bytes. * * @return callable|null */ private function findCompatibleRandomSource() { if (\function_exists('random_bytes')) { return 'random_bytes'; } if (\function_exists('openssl_random_pseudo_bytes')) { return 'openssl_random_pseudo_bytes'; } if (\function_exists('mcrypt_create_iv')) { return 'mcrypt_create_iv'; } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Command.php000064400000003751147600374260021503 0ustar00name = $name; $this->data = $args; $this->handlerList = $list ?: new HandlerList(); if (!isset($this->data['@http'])) { $this->data['@http'] = []; } if (!isset($this->data['@context'])) { $this->data['@context'] = []; } } public function __clone() { $this->handlerList = clone $this->handlerList; } public function getName() { return $this->name; } public function hasParam($name) { return \array_key_exists($name, $this->data); } public function getHandlerList() { return $this->handlerList; } /** * For overriding auth schemes on a per endpoint basis when using * EndpointV2 provider. Intended for internal use only. * * @param array $authSchemes * * @internal */ public function setAuthSchemes(array $authSchemes) { $this->authSchemes = $authSchemes; } /** * Get auth schemes added to command as required * for endpoint resolution * * @returns array | null */ public function getAuthSchemes() { return $this->authSchemes; } /** @deprecated */ public function get($name) { return $this[$name]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Sdk.php000064400000221744147600374260020652 0ustar00args = $args; if (!isset($args['handler']) && !isset($args['http_handler'])) { $this->args['http_handler'] = default_http_handler(); } } public function __call($name, array $args) { $args = isset($args[0]) ? $args[0] : []; if (\strpos($name, 'createMultiRegion') === 0) { return $this->createMultiRegionClient(\substr($name, 17), $args); } if (\strpos($name, 'create') === 0) { return $this->createClient(\substr($name, 6), $args); } throw new \BadMethodCallException("Unknown method: {$name}."); } /** * Get a client by name using an array of constructor options. * * @param string $name Service name or namespace (e.g., DynamoDb, s3). * @param array $args Arguments to configure the client. * * @return AwsClientInterface * @throws \InvalidArgumentException if any required options are missing or * the service is not supported. * @see Aws\AwsClient::__construct for a list of available options for args. */ public function createClient($name, array $args = []) { // Get information about the service from the manifest file. $service = manifest($name); $namespace = $service['namespace']; // Instantiate the client class. $client = "VendorDuplicator\\Aws\\{$namespace}\\{$namespace}Client"; return new $client($this->mergeArgs($namespace, $service, $args)); } public function createMultiRegionClient($name, array $args = []) { // Get information about the service from the manifest file. $service = manifest($name); $namespace = $service['namespace']; $klass = "VendorDuplicator\\Aws\\{$namespace}\\{$namespace}MultiRegionClient"; $klass = \class_exists($klass) ? $klass : MultiRegionClient::class; return new $klass($this->mergeArgs($namespace, $service, $args)); } /** * Clone existing SDK instance with ability to pass an associative array * of extra client settings. * * @param array $args * * @return self */ public function copy(array $args = []) { return new self($args + $this->args); } private function mergeArgs($namespace, array $manifest, array $args = []) { // Merge provided args with stored, service-specific args. if (isset($this->args[$namespace])) { $args += $this->args[$namespace]; } // Provide the endpoint prefix in the args. if (!isset($args['service'])) { $args['service'] = $manifest['endpoint']; } return $args + $this->args; } /** * Determine the endpoint prefix from a client namespace. * * @param string $name Namespace name * * @return string * @internal * @deprecated Use the `\Aws\manifest()` function instead. */ public static function getEndpointPrefix($name) { return manifest($name)['endpoint']; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/functions.php000064400000033143147600374260022133 0ustar00 \true, '..' => \true]; $pathLen = \strlen($path) + 1; $iterator = dir_iterator($path, $context); $queue = []; do { while ($iterator->valid()) { $file = $iterator->current(); $iterator->next(); if (isset($invalid[\basename($file)])) { continue; } $fullPath = "{$path}/{$file}"; (yield $fullPath); if (\is_dir($fullPath)) { $queue[] = $iterator; $iterator = map(dir_iterator($fullPath, $context), function ($file) use($fullPath, $pathLen) { return \substr("{$fullPath}/{$file}", $pathLen); }); continue; } } $iterator = \array_pop($queue); } while ($iterator); } //----------------------------------------------------------------------------- // Misc. functions. //----------------------------------------------------------------------------- /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (\gettype($input)) { case 'object': return 'object(' . \get_class($input) . ')'; case 'array': return 'array(' . \count($input) . ')'; default: \ob_start(); \var_dump($input); // normalize float vs double return \str_replace('double(', 'float(', \rtrim(\ob_get_clean())); } } /** * Creates a default HTTP handler based on the available clients. * * @return callable */ function default_http_handler() { $version = guzzle_major_version(); // If Guzzle 6 or 7 installed if ($version === 6 || $version === 7) { return new \VendorDuplicator\Aws\Handler\GuzzleV6\GuzzleHandler(); } // If Guzzle 5 installed if ($version === 5) { return new \VendorDuplicator\Aws\Handler\GuzzleV5\GuzzleHandler(); } throw new \RuntimeException('Unknown Guzzle version: ' . $version); } /** * Gets the default user agent string depending on the Guzzle version * * @return string */ function default_user_agent() { $version = guzzle_major_version(); // If Guzzle 6 or 7 installed if ($version === 6 || $version === 7) { return \VendorDuplicator\GuzzleHttp\default_user_agent(); } // If Guzzle 5 installed if ($version === 5) { return \VendorDuplicator\GuzzleHttp\Client::getDefaultUserAgent(); } throw new \RuntimeException('Unknown Guzzle version: ' . $version); } /** * Get the major version of guzzle that is installed. * * @internal This function is internal and should not be used outside aws/aws-sdk-php. * @return int * @throws \RuntimeException */ function guzzle_major_version() { static $cache = null; if (null !== $cache) { return $cache; } if (\defined('VendorDuplicator\\GuzzleHttp\\ClientInterface::VERSION')) { $version = (string) ClientInterface::VERSION; if ($version[0] === '6') { return $cache = 6; } if ($version[0] === '5') { return $cache = 5; } } elseif (\defined('VendorDuplicator\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) { return $cache = ClientInterface::MAJOR_VERSION; } throw new \RuntimeException('Unable to determine what Guzzle version is installed.'); } /** * Serialize a request for a command but do not send it. * * Returns a promise that is fulfilled with the serialized request. * * @param CommandInterface $command Command to serialize. * * @return RequestInterface * @throws \RuntimeException */ function serialize(CommandInterface $command) { $request = null; $handlerList = $command->getHandlerList(); // Return a mock result. $handlerList->setHandler(function (CommandInterface $_, RequestInterface $r) use(&$request) { $request = $r; return new FulfilledPromise(new Result([])); }); \call_user_func($handlerList->resolve(), $command)->wait(); if (!$request instanceof RequestInterface) { throw new \RuntimeException('Calling handler did not serialize request'); } return $request; } /** * Retrieves data for a service from the SDK's service manifest file. * * Manifest data is stored statically, so it does not need to be loaded more * than once per process. The JSON data is also cached in opcache. * * @param string $service Case-insensitive namespace or endpoint prefix of the * service for which you are retrieving manifest data. * * @return array * @throws \InvalidArgumentException if the service is not supported. */ function manifest($service = null) { // Load the manifest and create aliases for lowercased namespaces static $manifest = []; static $aliases = []; if (empty($manifest)) { $manifest = load_compiled_json(__DIR__ . '/data/manifest.json'); foreach ($manifest as $endpoint => $info) { $alias = \strtolower($info['namespace']); if ($alias !== $endpoint) { $aliases[$alias] = $endpoint; } } } // If no service specified, then return the whole manifest. if ($service === null) { return $manifest; } // Look up the service's info in the manifest data. $service = \strtolower($service); if (isset($manifest[$service])) { return $manifest[$service] + ['endpoint' => $service]; } if (isset($aliases[$service])) { return manifest($aliases[$service]); } throw new \InvalidArgumentException("The service \"{$service}\" is not provided by the AWS SDK for PHP."); } /** * Checks if supplied parameter is a valid hostname * * @param string $hostname * @return bool */ function is_valid_hostname($hostname) { return \preg_match("/^([a-z\\d](-*[a-z\\d])*)(\\.([a-z\\d](-*[a-z\\d])*))*\\.?\$/i", $hostname) && \preg_match("/^.{1,253}\$/", $hostname) && \preg_match("/^[^\\.]{1,63}(\\.[^\\.]{0,63})*\$/", $hostname); } /** * Checks if supplied parameter is a valid host label * * @param $label * @return bool */ function is_valid_hostlabel($label) { return \preg_match("/^(?!-)[a-zA-Z0-9-]{1,63}(?execute($command); * $jpResult = $result->search('foo.*.bar[?baz > `10`]'); * * @param string $expression JMESPath expression to execute * * @return mixed Returns the result of the JMESPath expression. * @link http://jmespath.readthedocs.org/en/latest/ JMESPath documentation */ public function search($expression); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ClientResolver.php000064400000131516147600374260023066 0ustar00 'is_resource', 'callable' => 'is_callable', 'int' => 'is_int', 'bool' => 'is_bool', 'boolean' => 'is_bool', 'string' => 'is_string', 'object' => 'is_object', 'array' => 'is_array']; private static $defaultArgs = ['service' => ['type' => 'value', 'valid' => ['string'], 'doc' => 'Name of the service to utilize. This value will be supplied by default when using one of the SDK clients (e.g., Aws\\S3\\S3Client).', 'required' => \true, 'internal' => \true], 'exception_class' => ['type' => 'value', 'valid' => ['string'], 'doc' => 'Exception class to create when an error occurs.', 'default' => AwsException::class, 'internal' => \true], 'scheme' => ['type' => 'value', 'valid' => ['string'], 'default' => 'https', 'doc' => 'URI scheme to use when connecting connect. The SDK will utilize "https" endpoints (i.e., utilize SSL/TLS connections) by default. You can attempt to connect to a service over an unencrypted "http" endpoint by setting ``scheme`` to "http".'], 'disable_host_prefix_injection' => ['type' => 'value', 'valid' => ['bool'], 'doc' => 'Set to true to disable host prefix injection logic for services that use it. This disables the entire prefix injection, including the portions supplied by user-defined parameters. Setting this flag will have no effect on services that do not use host prefix injection.', 'default' => \false], 'endpoint' => ['type' => 'value', 'valid' => ['string'], 'doc' => 'The full URI of the webservice. This is only required when connecting to a custom endpoint (e.g., a local version of S3).', 'fn' => [__CLASS__, '_apply_endpoint']], 'region' => ['type' => 'value', 'valid' => ['string'], 'required' => [__CLASS__, '_missing_region'], 'doc' => 'Region to connect to. See http://docs.aws.amazon.com/general/latest/gr/rande.html for a list of available regions.'], 'version' => ['type' => 'value', 'valid' => ['string'], 'doc' => 'The version of the webservice to utilize (e.g., 2006-03-01).', 'default' => 'latest'], 'signature_provider' => ['type' => 'value', 'valid' => ['callable'], 'doc' => 'A callable that accepts a signature version name (e.g., "v4"), a service name, and region, and returns a SignatureInterface object or null. This provider is used to create signers utilized by the client. See Aws\\Signature\\SignatureProvider for a list of built-in providers', 'default' => [__CLASS__, '_default_signature_provider']], 'api_provider' => ['type' => 'value', 'valid' => ['callable'], 'doc' => 'An optional PHP callable that accepts a type, service, and version argument, and returns an array of corresponding configuration data. The type value can be one of api, waiter, or paginator.', 'fn' => [__CLASS__, '_apply_api_provider'], 'default' => [ApiProvider::class, 'defaultProvider']], 'configuration_mode' => ['type' => 'value', 'valid' => [ConfigModeInterface::class, CacheInterface::class, 'string', 'closure'], 'doc' => "Sets the default configuration mode. Otherwise provide an instance of Aws\\DefaultsMode\\ConfigurationInterface, an instance of Aws\\CacheInterface, or a string containing a valid mode", 'fn' => [__CLASS__, '_apply_defaults'], 'default' => [ConfigModeProvider::class, 'defaultProvider']], 'use_fips_endpoint' => ['type' => 'value', 'valid' => ['bool', UseFipsEndpointConfiguration::class, CacheInterface::class, 'callable'], 'doc' => 'Set to true to enable the use of FIPS pseudo regions', 'fn' => [__CLASS__, '_apply_use_fips_endpoint'], 'default' => [__CLASS__, '_default_use_fips_endpoint']], 'use_dual_stack_endpoint' => ['type' => 'value', 'valid' => ['bool', UseDualStackEndpointConfiguration::class, CacheInterface::class, 'callable'], 'doc' => 'Set to true to enable the use of dual-stack endpoints', 'fn' => [__CLASS__, '_apply_use_dual_stack_endpoint'], 'default' => [__CLASS__, '_default_use_dual_stack_endpoint']], 'endpoint_provider' => ['type' => 'value', 'valid' => ['callable', EndpointV2\EndpointProviderV2::class], 'fn' => [__CLASS__, '_apply_endpoint_provider'], 'doc' => 'An optional PHP callable that accepts a hash of options including a "service" and "region" key and returns NULL or a hash of endpoint data, of which the "endpoint" key is required. See Aws\\Endpoint\\EndpointProvider for a list of built-in providers.', 'default' => [__CLASS__, '_default_endpoint_provider']], 'serializer' => ['default' => [__CLASS__, '_default_serializer'], 'internal' => \true, 'type' => 'value', 'valid' => ['callable']], 'signature_version' => ['type' => 'config', 'valid' => ['string'], 'doc' => 'A string representing a custom signature version to use with a service (e.g., v4). Note that per/operation signature version MAY override this requested signature version.', 'default' => [__CLASS__, '_default_signature_version']], 'signing_name' => ['type' => 'config', 'valid' => ['string'], 'doc' => 'A string representing a custom service name to be used when calculating a request signature.', 'default' => [__CLASS__, '_default_signing_name']], 'signing_region' => ['type' => 'config', 'valid' => ['string'], 'doc' => 'A string representing a custom region name to be used when calculating a request signature.', 'default' => [__CLASS__, '_default_signing_region']], 'profile' => ['type' => 'config', 'valid' => ['string'], 'doc' => 'Allows you to specify which profile to use when credentials are created from the AWS credentials file in your HOME directory. This setting overrides the AWS_PROFILE environment variable. Note: Specifying "profile" will cause the "credentials" and "use_aws_shared_config_files" keys to be ignored.', 'fn' => [__CLASS__, '_apply_profile']], 'credentials' => ['type' => 'value', 'valid' => [CredentialsInterface::class, CacheInterface::class, 'array', 'bool', 'callable'], 'doc' => 'Specifies the credentials used to sign requests. Provide an Aws\\Credentials\\CredentialsInterface object, an associative array of "key", "secret", and an optional "token" key, `false` to use null credentials, or a callable credentials provider used to create credentials or return null. See Aws\\Credentials\\CredentialProvider for a list of built-in credentials providers. If no credentials are provided, the SDK will attempt to load them from the environment.', 'fn' => [__CLASS__, '_apply_credentials'], 'default' => [__CLASS__, '_default_credential_provider']], 'token' => ['type' => 'value', 'valid' => [TokenInterface::class, CacheInterface::class, 'array', 'bool', 'callable'], 'doc' => 'Specifies the token used to authorize requests. Provide an Aws\\Token\\TokenInterface object, an associative array of "token", and an optional "expiration" key, `false` to use a null token, or a callable token provider used to fetch a token or return null. See Aws\\Token\\TokenProvider for a list of built-in credentials providers. If no token is provided, the SDK will attempt to load one from the environment.', 'fn' => [__CLASS__, '_apply_token'], 'default' => [__CLASS__, '_default_token_provider']], 'endpoint_discovery' => ['type' => 'value', 'valid' => [ConfigurationInterface::class, CacheInterface::class, 'array', 'callable'], 'doc' => 'Specifies settings for endpoint discovery. Provide an instance of Aws\\EndpointDiscovery\\ConfigurationInterface, an instance Aws\\CacheInterface, a callable that provides a promise for a Configuration object, or an associative array with the following keys: enabled: (bool) Set to true to enable endpoint discovery, false to explicitly disable it. Defaults to false; cache_limit: (int) The maximum number of keys in the endpoints cache. Defaults to 1000.', 'fn' => [__CLASS__, '_apply_endpoint_discovery'], 'default' => [__CLASS__, '_default_endpoint_discovery_provider']], 'stats' => ['type' => 'value', 'valid' => ['bool', 'array'], 'default' => \false, 'doc' => 'Set to true to gather transfer statistics on requests sent. Alternatively, you can provide an associative array with the following keys: retries: (bool) Set to false to disable reporting on retries attempted; http: (bool) Set to true to enable collecting statistics from lower level HTTP adapters (e.g., values returned in GuzzleHttp\\TransferStats). HTTP handlers must support an http_stats_receiver option for this to have an effect; timer: (bool) Set to true to enable a command timer that reports the total wall clock time spent on an operation in seconds.', 'fn' => [__CLASS__, '_apply_stats']], 'retries' => ['type' => 'value', 'valid' => ['int', RetryConfigInterface::class, CacheInterface::class, 'callable', 'array'], 'doc' => "Configures the retry mode and maximum number of allowed retries for a client (pass 0 to disable retries). Provide an integer for 'legacy' mode with the specified number of retries. Otherwise provide an instance of Aws\\Retry\\ConfigurationInterface, an instance of Aws\\CacheInterface, a callable function, or an array with the following keys: mode: (string) Set to 'legacy', 'standard' (uses retry quota management), or 'adapative' (an experimental mode that adds client-side rate limiting to standard mode); max_attempts: (int) The maximum number of attempts for a given request. ", 'fn' => [__CLASS__, '_apply_retries'], 'default' => [RetryConfigProvider::class, 'defaultProvider']], 'validate' => ['type' => 'value', 'valid' => ['bool', 'array'], 'default' => \true, 'doc' => 'Set to false to disable client-side parameter validation. Set to true to utilize default validation constraints. Set to an associative array of validation options to enable specific validation constraints.', 'fn' => [__CLASS__, '_apply_validate']], 'debug' => ['type' => 'value', 'valid' => ['bool', 'array'], 'doc' => 'Set to true to display debug information when sending requests. Alternatively, you can provide an associative array with the following keys: logfn: (callable) Function that is invoked with log messages; stream_size: (int) When the size of a stream is greater than this number, the stream data will not be logged (set to "0" to not log any stream data); scrub_auth: (bool) Set to false to disable the scrubbing of auth data from the logged messages; http: (bool) Set to false to disable the "debug" feature of lower level HTTP adapters (e.g., verbose curl output).', 'fn' => [__CLASS__, '_apply_debug']], 'disable_request_compression' => ['type' => 'value', 'valid' => ['bool', 'callable'], 'doc' => 'Set to true to disable request compression for supported operations', 'fn' => [__CLASS__, '_apply_disable_request_compression'], 'default' => [__CLASS__, '_default_disable_request_compression']], 'request_min_compression_size_bytes' => ['type' => 'value', 'valid' => ['int', 'callable'], 'doc' => 'Set to a value between between 0 and 10485760 bytes, inclusive. This value will be ignored if `disable_request_compression` is set to `true`', 'fn' => [__CLASS__, '_apply_min_compression_size'], 'default' => [__CLASS__, '_default_min_compression_size']], 'csm' => ['type' => 'value', 'valid' => [\VendorDuplicator\Aws\ClientSideMonitoring\ConfigurationInterface::class, 'callable', 'array', 'bool'], 'doc' => 'CSM options for the client. Provides a callable wrapping a promise, a boolean "false", an instance of ConfigurationInterface, or an associative array of "enabled", "host", "port", and "client_id".', 'fn' => [__CLASS__, '_apply_csm'], 'default' => [\VendorDuplicator\Aws\ClientSideMonitoring\ConfigurationProvider::class, 'defaultProvider']], 'http' => ['type' => 'value', 'valid' => ['array'], 'default' => [], 'doc' => 'Set to an array of SDK request options to apply to each request (e.g., proxy, verify, etc.).'], 'http_handler' => ['type' => 'value', 'valid' => ['callable'], 'doc' => 'An HTTP handler is a function that accepts a PSR-7 request object and returns a promise that is fulfilled with a PSR-7 response object or rejected with an array of exception data. NOTE: This option supersedes any provided "handler" option.', 'fn' => [__CLASS__, '_apply_http_handler']], 'handler' => ['type' => 'value', 'valid' => ['callable'], 'doc' => 'A handler that accepts a command object, request object and returns a promise that is fulfilled with an Aws\\ResultInterface object or rejected with an Aws\\Exception\\AwsException. A handler does not accept a next handler as it is terminal and expected to fulfill a command. If no handler is provided, a default Guzzle handler will be utilized.', 'fn' => [__CLASS__, '_apply_handler'], 'default' => [__CLASS__, '_default_handler']], 'ua_append' => ['type' => 'value', 'valid' => ['string', 'array'], 'doc' => 'Provide a string or array of strings to send in the User-Agent header.', 'fn' => [__CLASS__, '_apply_user_agent'], 'default' => []], 'idempotency_auto_fill' => ['type' => 'value', 'valid' => ['bool', 'callable'], 'doc' => 'Set to false to disable SDK to populate parameters that enabled \'idempotencyToken\' trait with a random UUID v4 value on your behalf. Using default value \'true\' still allows parameter value to be overwritten when provided. Note: auto-fill only works when cryptographically secure random bytes generator functions(random_bytes, openssl_random_pseudo_bytes or mcrypt_create_iv) can be found. You may also provide a callable source of random bytes.', 'default' => \true, 'fn' => [__CLASS__, '_apply_idempotency_auto_fill']], 'use_aws_shared_config_files' => ['type' => 'value', 'valid' => ['bool'], 'doc' => 'Set to false to disable checking for shared aws config files usually located in \'~/.aws/config\' and \'~/.aws/credentials\'. This will be ignored if you set the \'profile\' setting.', 'default' => \true], 'suppress_php_deprecation_warning' => ['type' => 'value', 'valid' => ['bool'], 'doc' => 'Set to false to disable the deprecation warning of PHP versions 7.2.4 and below', 'default' => \false, 'fn' => [__CLASS__, '_apply_suppress_php_deprecation_warning']]]; /** * Gets an array of default client arguments, each argument containing a * hash of the following: * * - type: (string, required) option type described as follows: * - value: The default option type. * - config: The provided value is made available in the client's * getConfig() method. * - valid: (array, required) Valid PHP types or class names. Note: null * is not an allowed type. * - required: (bool, callable) Whether or not the argument is required. * Provide a function that accepts an array of arguments and returns a * string to provide a custom error message. * - default: (mixed) The default value of the argument if not provided. If * a function is provided, then it will be invoked to provide a default * value. The function is provided the array of options and is expected * to return the default value of the option. The default value can be a * closure and can not be a callable string that is not part of the * defaultArgs array. * - doc: (string) The argument documentation string. * - fn: (callable) Function used to apply the argument. The function * accepts the provided value, array of arguments by reference, and an * event emitter. * * Note: Order is honored and important when applying arguments. * * @return array */ public static function getDefaultArguments() { return self::$defaultArgs; } /** * @param array $argDefinitions Client arguments. */ public function __construct(array $argDefinitions) { $this->argDefinitions = $argDefinitions; } /** * Resolves client configuration options and attached event listeners. * Check for missing keys in passed arguments * * @param array $args Provided constructor arguments. * @param HandlerList $list Handler list to augment. * * @return array Returns the array of provided options. * @throws \InvalidArgumentException * @see Aws\AwsClient::__construct for a list of available options. */ public function resolve(array $args, HandlerList $list) { $args['config'] = []; foreach ($this->argDefinitions as $key => $a) { // Add defaults, validate required values, and skip if not set. if (!isset($args[$key])) { if (isset($a['default'])) { // Merge defaults in when not present. if (\is_callable($a['default']) && (\is_array($a['default']) || $a['default'] instanceof \Closure)) { $args[$key] = $a['default']($args); } else { $args[$key] = $a['default']; } } elseif (empty($a['required'])) { continue; } else { $this->throwRequired($args); } } // Validate the types against the provided value. foreach ($a['valid'] as $check) { if (isset(self::$typeMap[$check])) { $fn = self::$typeMap[$check]; if ($fn($args[$key])) { goto is_valid; } } elseif ($args[$key] instanceof $check) { goto is_valid; } } $this->invalidType($key, $args[$key]); // Apply the value is_valid: if (isset($a['fn'])) { $a['fn']($args[$key], $args, $list); } if ($a['type'] === 'config') { $args['config'][$key] = $args[$key]; } } $this->_apply_client_context_params($args); return $args; } /** * Creates a verbose error message for an invalid argument. * * @param string $name Name of the argument that is missing. * @param array $args Provided arguments * @param bool $useRequired Set to true to show the required fn text if * available instead of the documentation. * @return string */ private function getArgMessage($name, $args = [], $useRequired = \false) { $arg = $this->argDefinitions[$name]; $msg = ''; $modifiers = []; if (isset($arg['valid'])) { $modifiers[] = \implode('|', $arg['valid']); } if (isset($arg['choice'])) { $modifiers[] = 'One of ' . \implode(', ', $arg['choice']); } if ($modifiers) { $msg .= '(' . \implode('; ', $modifiers) . ')'; } $msg = \wordwrap("{$name}: {$msg}", 75, "\n "); if ($useRequired && \is_callable($arg['required'])) { $msg .= "\n\n "; $msg .= \str_replace("\n", "\n ", \call_user_func($arg['required'], $args)); } elseif (isset($arg['doc'])) { $msg .= \wordwrap("\n\n {$arg['doc']}", 75, "\n "); } return $msg; } /** * Throw when an invalid type is encountered. * * @param string $name Name of the value being validated. * @param mixed $provided The provided value. * @throws \InvalidArgumentException */ private function invalidType($name, $provided) { $expected = \implode('|', $this->argDefinitions[$name]['valid']); $msg = "Invalid configuration value " . "provided for \"{$name}\". Expected {$expected}, but got " . describe_type($provided) . "\n\n" . $this->getArgMessage($name); throw new IAE($msg); } /** * Throws an exception for missing required arguments. * * @param array $args Passed in arguments. * @throws \InvalidArgumentException */ private function throwRequired(array $args) { $missing = []; foreach ($this->argDefinitions as $k => $a) { if (empty($a['required']) || isset($a['default']) || isset($args[$k])) { continue; } $missing[] = $this->getArgMessage($k, $args, \true); } $msg = "Missing required client configuration options: \n\n"; $msg .= \implode("\n\n", $missing); throw new IAE($msg); } public static function _apply_retries($value, array &$args, HandlerList $list) { // A value of 0 for the config option disables retries if ($value) { $config = RetryConfigProvider::unwrap($value); if ($config->getMode() === 'legacy') { // # of retries is 1 less than # of attempts $decider = RetryMiddleware::createDefaultDecider($config->getMaxAttempts() - 1); $list->appendSign(Middleware::retry($decider, null, $args['stats']['retries']), 'retry'); } else { $list->appendSign(RetryMiddlewareV2::wrap($config, ['collect_stats' => $args['stats']['retries']]), 'retry'); } } } public static function _apply_defaults($value, array &$args, HandlerList $list) { $config = ConfigModeProvider::unwrap($value); if ($config->getMode() !== 'legacy') { if (!isset($args['retries']) && !\is_null($config->getRetryMode())) { $args['retries'] = ['mode' => $config->getRetryMode()]; } if (!isset($args['sts_regional_endpoints']) && !\is_null($config->getStsRegionalEndpoints())) { $args['sts_regional_endpoints'] = ['mode' => $config->getStsRegionalEndpoints()]; } if (!isset($args['s3_us_east_1_regional_endpoint']) && !\is_null($config->getS3UsEast1RegionalEndpoints())) { $args['s3_us_east_1_regional_endpoint'] = ['mode' => $config->getS3UsEast1RegionalEndpoints()]; } if (!isset($args['http'])) { $args['http'] = []; } if (!isset($args['http']['connect_timeout']) && !\is_null($config->getConnectTimeoutInMillis())) { $args['http']['connect_timeout'] = $config->getConnectTimeoutInMillis() / 1000; } if (!isset($args['http']['timeout']) && !\is_null($config->getHttpRequestTimeoutInMillis())) { $args['http']['timeout'] = $config->getHttpRequestTimeoutInMillis() / 1000; } } } public static function _apply_disable_request_compression($value, array &$args) { if (\is_callable($value)) { $value = $value(); } if (!\is_bool($value)) { throw new IAE("Invalid configuration value provided for 'disable_request_compression'." . " value must be a bool."); } $args['config']['disable_request_compression'] = $value; } public static function _default_disable_request_compression(array &$args) { return ConfigurationResolver::resolve('disable_request_compression', \false, 'bool', $args); } public static function _apply_min_compression_size($value, array &$args) { if (\is_callable($value)) { $value = $value(); } if (!\is_int($value) || \is_int($value) && ($value < 0 || $value > 10485760)) { throw new IAE(" Invalid configuration value provided for 'min_compression_size_bytes'." . " value must be an integer between 0 and 10485760, inclusive."); } $args['config']['request_min_compression_size_bytes'] = $value; } public static function _default_min_compression_size(array &$args) { return ConfigurationResolver::resolve('request_min_compression_size_bytes', 10240, 'int', $args); } public static function _apply_credentials($value, array &$args) { if (\is_callable($value)) { return; } if ($value instanceof CredentialsInterface) { $args['credentials'] = CredentialProvider::fromCredentials($value); } elseif (\is_array($value) && isset($value['key']) && isset($value['secret'])) { $args['credentials'] = CredentialProvider::fromCredentials(new Credentials($value['key'], $value['secret'], isset($value['token']) ? $value['token'] : null, isset($value['expires']) ? $value['expires'] : null)); } elseif ($value === \false) { $args['credentials'] = CredentialProvider::fromCredentials(new Credentials('', '')); $args['config']['signature_version'] = 'anonymous'; } elseif ($value instanceof CacheInterface) { $args['credentials'] = CredentialProvider::defaultProvider($args); } else { throw new IAE('Credentials must be an instance of ' . "'" . CredentialsInterface::class . ', an associative ' . 'array that contains "key", "secret", and an optional "token" ' . 'key-value pairs, a credentials provider function, or false.'); } } public static function _default_credential_provider(array $args) { return CredentialProvider::defaultProvider($args); } public static function _apply_token($value, array &$args) { if (\is_callable($value)) { return; } if ($value instanceof Token) { $args['token'] = TokenProvider::fromToken($value); } elseif (\is_array($value) && isset($value['token'])) { $args['token'] = TokenProvider::fromToken(new Token($value['token'], isset($value['expires']) ? $value['expires'] : null)); } elseif ($value instanceof CacheInterface) { $args['token'] = TokenProvider::defaultProvider($args); } else { throw new IAE('Token must be an instance of ' . TokenInterface::class . ', an associative ' . 'array that contains "token" and an optional "expires" ' . 'key-value pairs, a token provider function, or false.'); } } public static function _default_token_provider(array $args) { return TokenProvider::defaultProvider($args); } public static function _apply_csm($value, array &$args, HandlerList $list) { if ($value === \false) { $value = new Configuration(\false, \VendorDuplicator\Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_HOST, \VendorDuplicator\Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_PORT, \VendorDuplicator\Aws\ClientSideMonitoring\ConfigurationProvider::DEFAULT_CLIENT_ID); $args['csm'] = $value; } $list->appendBuild(ApiCallMonitoringMiddleware::wrap($args['credentials'], $value, $args['region'], $args['api']->getServiceId()), 'ApiCallMonitoringMiddleware'); $list->appendAttempt(ApiCallAttemptMonitoringMiddleware::wrap($args['credentials'], $value, $args['region'], $args['api']->getServiceId()), 'ApiCallAttemptMonitoringMiddleware'); } public static function _apply_api_provider(callable $value, array &$args) { $api = new Service(ApiProvider::resolve($value, 'api', $args['service'], $args['version']), $value); if (empty($args['config']['signing_name']) && isset($api['metadata']['signingName'])) { $args['config']['signing_name'] = $api['metadata']['signingName']; } $args['api'] = $api; $args['parser'] = Service::createParser($api); $args['error_parser'] = Service::createErrorParser($api->getProtocol(), $api); } public static function _apply_endpoint_provider($value, array &$args) { if (!isset($args['endpoint'])) { if ($value instanceof \VendorDuplicator\Aws\EndpointV2\EndpointProviderV2) { $options = self::getEndpointProviderOptions($args); $value = PartitionEndpointProvider::defaultProvider($options)->getPartition($args['region'], $args['service']); } $endpointPrefix = isset($args['api']['metadata']['endpointPrefix']) ? $args['api']['metadata']['endpointPrefix'] : $args['service']; // Check region is a valid host label when it is being used to // generate an endpoint if (!self::isValidRegion($args['region'])) { throw new InvalidRegionException('Region must be a valid RFC' . ' host label.'); } $serviceEndpoints = \is_array($value) && isset($value['services'][$args['service']]['endpoints']) ? $value['services'][$args['service']]['endpoints'] : null; if (isset($serviceEndpoints[$args['region']]['deprecated'])) { \trigger_error("The service " . $args['service'] . "has " . " deprecated the region " . $args['region'] . ".", \E_USER_WARNING); } $args['region'] = \VendorDuplicator\Aws\strip_fips_pseudo_regions($args['region']); // Invoke the endpoint provider and throw if it does not resolve. $result = EndpointProvider::resolve($value, ['service' => $endpointPrefix, 'region' => $args['region'], 'scheme' => $args['scheme'], 'options' => self::getEndpointProviderOptions($args)]); $args['endpoint'] = $result['endpoint']; if (empty($args['config']['signature_version'])) { if (isset($args['api']) && $args['api']->getSignatureVersion() == 'bearer') { $args['config']['signature_version'] = 'bearer'; } elseif (isset($result['signatureVersion'])) { $args['config']['signature_version'] = $result['signatureVersion']; } } if (empty($args['config']['signing_region']) && isset($result['signingRegion'])) { $args['config']['signing_region'] = $result['signingRegion']; } if (empty($args['config']['signing_name']) && isset($result['signingName'])) { $args['config']['signing_name'] = $result['signingName']; } } } public static function _apply_endpoint_discovery($value, array &$args) { $args['endpoint_discovery'] = $value; } public static function _default_endpoint_discovery_provider(array $args) { return ConfigurationProvider::defaultProvider($args); } public static function _apply_use_fips_endpoint($value, array &$args) { if ($value instanceof CacheInterface) { $value = UseFipsConfigProvider::defaultProvider($args); } if (\is_callable($value)) { $value = $value(); } if ($value instanceof PromiseInterface) { $value = $value->wait(); } if ($value instanceof UseFipsEndpointConfigurationInterface) { $args['config']['use_fips_endpoint'] = $value; } else { // The Configuration class itself will validate other inputs $args['config']['use_fips_endpoint'] = new UseFipsEndpointConfiguration($value); } } public static function _default_use_fips_endpoint(array &$args) { return UseFipsConfigProvider::defaultProvider($args); } public static function _apply_use_dual_stack_endpoint($value, array &$args) { if ($value instanceof CacheInterface) { $value = UseDualStackConfigProvider::defaultProvider($args); } if (\is_callable($value)) { $value = $value(); } if ($value instanceof PromiseInterface) { $value = $value->wait(); } if ($value instanceof UseDualStackEndpointConfigurationInterface) { $args['config']['use_dual_stack_endpoint'] = $value; } else { // The Configuration class itself will validate other inputs $args['config']['use_dual_stack_endpoint'] = new UseDualStackEndpointConfiguration($value, $args['region']); } } public static function _default_use_dual_stack_endpoint(array &$args) { return UseDualStackConfigProvider::defaultProvider($args); } public static function _apply_debug($value, array &$args, HandlerList $list) { if ($value !== \false) { $list->interpose(new TraceMiddleware($value === \true ? [] : $value, $args['api'])); } } public static function _apply_stats($value, array &$args, HandlerList $list) { // Create an array of stat collectors that are disabled (set to false) // by default. If the user has passed in true, enable all stat // collectors. $defaults = \array_fill_keys(['http', 'retries', 'timer'], $value === \true); $args['stats'] = \is_array($value) ? \array_replace($defaults, $value) : $defaults; if ($args['stats']['timer']) { $list->prependInit(Middleware::timer(), 'timer'); } } public static function _apply_profile($_, array &$args) { $args['credentials'] = CredentialProvider::ini($args['profile']); } public static function _apply_validate($value, array &$args, HandlerList $list) { if ($value === \false) { return; } $validator = $value === \true ? new Validator() : new Validator($value); $list->appendValidate(Middleware::validation($args['api'], $validator), 'validation'); } public static function _apply_handler($value, array &$args, HandlerList $list) { $list->setHandler($value); } public static function _default_handler(array &$args) { return new WrappedHttpHandler(default_http_handler(), $args['parser'], $args['error_parser'], $args['exception_class'], $args['stats']['http']); } public static function _apply_http_handler($value, array &$args, HandlerList $list) { $args['handler'] = new WrappedHttpHandler($value, $args['parser'], $args['error_parser'], $args['exception_class'], $args['stats']['http']); } public static function _apply_user_agent($inputUserAgent, array &$args, HandlerList $list) { //Add SDK version $userAgent = ['aws-sdk-php/' . Sdk::VERSION]; //If on HHVM add the HHVM version if (\defined('HHVM_VERSION')) { $userAgent[] = 'HHVM/' . HHVM_VERSION; } //Add OS version $disabledFunctions = \explode(',', \ini_get('disable_functions')); if (\function_exists('php_uname') && !\in_array('php_uname', $disabledFunctions, \true)) { $osName = "OS/" . \php_uname('s') . '#' . \php_uname('r'); if (!empty($osName)) { $userAgent[] = $osName; } } //Add the language version $userAgent[] = 'lang/php#' . \phpversion(); //Add exec environment if present if ($executionEnvironment = \getenv('AWS_EXECUTION_ENV')) { $userAgent[] = $executionEnvironment; } //Add endpoint discovery if set if (isset($args['endpoint_discovery'])) { if ($args['endpoint_discovery'] instanceof \VendorDuplicator\Aws\EndpointDiscovery\Configuration && $args['endpoint_discovery']->isEnabled()) { $userAgent[] = 'cfg/endpoint-discovery'; } elseif (\is_array($args['endpoint_discovery']) && isset($args['endpoint_discovery']['enabled']) && $args['endpoint_discovery']['enabled']) { $userAgent[] = 'cfg/endpoint-discovery'; } } //Add retry mode if set if (isset($args['retries'])) { if ($args['retries'] instanceof \VendorDuplicator\Aws\Retry\Configuration) { $userAgent[] = 'cfg/retry-mode#' . $args["retries"]->getMode(); } elseif (\is_array($args['retries']) && isset($args["retries"]["mode"])) { $userAgent[] = 'cfg/retry-mode#' . $args["retries"]["mode"]; } } //Add the input to the end if ($inputUserAgent) { if (!\is_array($inputUserAgent)) { $inputUserAgent = [$inputUserAgent]; } $inputUserAgent = \array_map('strval', $inputUserAgent); $userAgent = \array_merge($userAgent, $inputUserAgent); } $args['ua_append'] = $userAgent; $list->appendBuild(static function (callable $handler) use($userAgent) { return function (CommandInterface $command, RequestInterface $request) use($handler, $userAgent) { return $handler($command, $request->withHeader('X-Amz-User-Agent', \implode(' ', \array_merge($userAgent, $request->getHeader('X-Amz-User-Agent'))))->withHeader('User-Agent', \implode(' ', \array_merge($userAgent, $request->getHeader('User-Agent'))))); }; }); } public static function _apply_endpoint($value, array &$args, HandlerList $list) { $args['endpoint'] = $value; } public static function _apply_idempotency_auto_fill($value, array &$args, HandlerList $list) { $enabled = \false; $generator = null; if (\is_bool($value)) { $enabled = $value; } elseif (\is_callable($value)) { $enabled = \true; $generator = $value; } if ($enabled) { $list->prependInit(IdempotencyTokenMiddleware::wrap($args['api'], $generator), 'idempotency_auto_fill'); } } public static function _apply_suppress_php_deprecation_warning($suppressWarning, array &$args) { if ($suppressWarning) { $args['suppress_php_deprecation_warning'] = \true; } elseif (!empty($_ENV["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"])) { $args['suppress_php_deprecation_warning'] = $_ENV["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"]; } elseif (!empty($_SERVER["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"])) { $args['suppress_php_deprecation_warning'] = $_SERVER["AWS_SUPPRESS_PHP_DEPRECATION_WARNING"]; } elseif (!empty(\getenv("AWS_SUPPRESS_PHP_DEPRECATION_WARNING"))) { $args['suppress_php_deprecation_warning'] = \getenv("AWS_SUPPRESS_PHP_DEPRECATION_WARNING"); } } public static function _default_endpoint_provider(array $args) { $service = isset($args['api']) ? $args['api'] : null; $serviceName = isset($service) ? $service->getServiceName() : null; $apiVersion = isset($service) ? $service->getApiVersion() : null; if (self::isValidService($serviceName) && self::isValidApiVersion($serviceName, $apiVersion)) { $ruleset = EndpointDefinitionProvider::getEndpointRuleset($service->getServiceName(), $service->getApiVersion()); return new \VendorDuplicator\Aws\EndpointV2\EndpointProviderV2($ruleset, EndpointDefinitionProvider::getPartitions()); } $options = self::getEndpointProviderOptions($args); return PartitionEndpointProvider::defaultProvider($options)->getPartition($args['region'], $args['service']); } public static function _default_serializer(array $args) { return Service::createSerializer($args['api'], $args['endpoint']); } public static function _default_signature_provider() { return SignatureProvider::defaultProvider(); } public static function _default_signature_version(array &$args) { if (isset($args['config']['signature_version'])) { return $args['config']['signature_version']; } $args['__partition_result'] = isset($args['__partition_result']) ? isset($args['__partition_result']) : \call_user_func(PartitionEndpointProvider::defaultProvider(), ['service' => $args['service'], 'region' => $args['region']]); return isset($args['__partition_result']['signatureVersion']) ? $args['__partition_result']['signatureVersion'] : $args['api']->getSignatureVersion(); } public static function _default_signing_name(array &$args) { if (isset($args['config']['signing_name'])) { return $args['config']['signing_name']; } $args['__partition_result'] = isset($args['__partition_result']) ? isset($args['__partition_result']) : \call_user_func(PartitionEndpointProvider::defaultProvider(), ['service' => $args['service'], 'region' => $args['region']]); if (isset($args['__partition_result']['signingName'])) { return $args['__partition_result']['signingName']; } if ($signingName = $args['api']->getSigningName()) { return $signingName; } return $args['service']; } public static function _default_signing_region(array &$args) { if (isset($args['config']['signing_region'])) { return $args['config']['signing_region']; } $args['__partition_result'] = isset($args['__partition_result']) ? isset($args['__partition_result']) : \call_user_func(PartitionEndpointProvider::defaultProvider(), ['service' => $args['service'], 'region' => $args['region']]); return isset($args['__partition_result']['signingRegion']) ? $args['__partition_result']['signingRegion'] : $args['region']; } public static function _missing_region(array $args) { $service = isset($args['service']) ? $args['service'] : ''; return <<getClientContextParams())) { $clientContextParams = $args['api']->getClientContextParams(); foreach ($clientContextParams as $paramName => $paramDefinition) { $definition = ['type' => 'value', 'valid' => [$paramDefinition['type']], 'doc' => isset($paramDefinition['documentation']) ? $paramDefinition['documentation'] : null]; $this->argDefinitions[$paramName] = $definition; if (isset($args[$paramName])) { $fn = self::$typeMap[$paramDefinition['type']]; if (!$fn($args[$paramName])) { $this->invalidType($paramName, $args[$paramName]); } } } } } private static function isValidService($service) { if (\is_null($service)) { return \false; } $services = \VendorDuplicator\Aws\manifest(); return isset($services[$service]); } private static function isValidApiVersion($service, $apiVersion) { if (\is_null($apiVersion)) { return \false; } return \is_dir(__DIR__ . "/data/{$service}/{$apiVersion}"); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/DoctrineCacheAdapter.php000064400000001766147600374260024125 0ustar00cache = $cache; } public function get($key) { return $this->cache->fetch($key); } public function fetch($key) { return $this->get($key); } public function set($key, $value, $ttl = 0) { return $this->cache->save($key, $value, $ttl); } public function save($key, $value, $ttl = 0) { return $this->set($key, $value, $ttl); } public function remove($key) { return $this->cache->delete($key); } public function delete($key) { return $this->remove($key); } public function contains($key) { return $this->cache->contains($key); } public function getStats() { return $this->cache->getStats(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ResultPaginator.php000064400000013403147600374260023243 0ustar00client = $client; $this->operation = $operation; $this->args = $args; $this->config = $config; } /** * Runs a paginator asynchronously and uses a callback to handle results. * * The callback should have the signature: function (Aws\Result $result). * A non-null return value from the callback will be yielded by the * promise. This means that you can return promises from the callback that * will need to be resolved before continuing iteration over the remaining * items, essentially merging in other promises to the iteration. The last * non-null value returned by the callback will be the result that fulfills * the promise to any downstream promises. * * @param callable $handleResult Callback for handling each page of results. * The callback accepts the result that was * yielded as a single argument. If the * callback returns a promise, the promise * will be merged into the coroutine. * * @return Promise\Promise */ public function each(callable $handleResult) { return Promise\Coroutine::of(function () use($handleResult) { $nextToken = null; do { $command = $this->createNextCommand($this->args, $nextToken); $result = (yield $this->client->executeAsync($command)); $nextToken = $this->determineNextToken($result); $retVal = $handleResult($result); if ($retVal !== null) { (yield Promise\Create::promiseFor($retVal)); } } while ($nextToken); }); } /** * Returns an iterator that iterates over the values of applying a JMESPath * search to each result yielded by the iterator as a flat sequence. * * @param string $expression JMESPath expression to apply to each result. * * @return \Iterator */ public function search($expression) { // Apply JMESPath expression on each result, but as a flat sequence. return flatmap($this, function (Result $result) use($expression) { return (array) $result->search($expression); }); } /** * @return Result */ #[\ReturnTypeWillChange] public function current() { return $this->valid() ? $this->result : \false; } #[\ReturnTypeWillChange] public function key() { return $this->valid() ? $this->requestCount - 1 : null; } #[\ReturnTypeWillChange] public function next() { $this->result = null; } #[\ReturnTypeWillChange] public function valid() { if ($this->result) { return \true; } if ($this->nextToken || !$this->requestCount) { //Forward/backward paging can result in a case where the last page's nextforwardtoken //is the same as the one that came before it. This can cause an infinite loop. $hasBidirectionalPaging = $this->config['output_token'] === 'nextForwardToken'; if ($hasBidirectionalPaging && $this->nextToken) { $tokenKey = $this->config['input_token']; $previousToken = $this->nextToken[$tokenKey]; } $this->result = $this->client->execute($this->createNextCommand($this->args, $this->nextToken)); $this->nextToken = $this->determineNextToken($this->result); if (isset($previousToken) && $previousToken === $this->nextToken[$tokenKey]) { return \false; } $this->requestCount++; return \true; } return \false; } #[\ReturnTypeWillChange] public function rewind() { $this->requestCount = 0; $this->nextToken = null; $this->result = null; } private function createNextCommand(array $args, array $nextToken = null) { return $this->client->getCommand($this->operation, \array_merge($args, $nextToken ?: [])); } private function determineNextToken(Result $result) { if (!$this->config['output_token']) { return null; } if ($this->config['more_results'] && !$result->search($this->config['more_results'])) { return null; } $nextToken = \is_scalar($this->config['output_token']) ? [$this->config['input_token'] => $this->config['output_token']] : \array_combine($this->config['input_token'], $this->config['output_token']); return \array_filter(\array_map(function ($outputToken) use($result) { return $result->search($outputToken); }, $nextToken)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/CommandInterface.php000064400000001701147600374260023315 0ustar00 \true, 'ThrottlingException' => \true, 'ThrottledException' => \true, 'RequestThrottledException' => \true, 'TooManyRequestsException' => \true, 'ProvisionedThroughputExceededException' => \true, 'TransactionInProgressException' => \true, 'RequestLimitExceeded' => \true, 'BandwidthLimitExceeded' => \true, 'LimitExceededException' => \true, 'RequestThrottled' => \true, 'SlowDown' => \true, 'PriorRequestNotComplete' => \true, 'EC2ThrottledException' => \true]; private static $standardTransientErrors = ['RequestTimeout' => \true, 'RequestTimeoutException' => \true]; private static $standardTransientStatusCodes = [500 => \true, 502 => \true, 503 => \true, 504 => \true]; private $collectStats; private $decider; private $delayer; private $maxAttempts; private $maxBackoff; private $mode; private $nextHandler; private $options; private $quotaManager; private $rateLimiter; public static function wrap($config, $options) { return function (callable $handler) use($config, $options) { return new static($config, $handler, $options); }; } public static function createDefaultDecider(QuotaManager $quotaManager, $maxAttempts = 3, $options = []) { $retryCurlErrors = []; if (\extension_loaded('curl')) { $retryCurlErrors[\CURLE_RECV_ERROR] = \true; } return function ($attempts, CommandInterface $command, $result) use($options, $quotaManager, $retryCurlErrors, $maxAttempts) { // Release retry tokens back to quota on a successful result $quotaManager->releaseToQuota($result); // Allow command-level option to override this value // # of attempts = # of retries + 1 $maxAttempts = null !== $command['@retries'] ? $command['@retries'] + 1 : $maxAttempts; $isRetryable = self::isRetryable($result, $retryCurlErrors, $options); if ($isRetryable) { // Retrieve retry tokens and check if quota has been exceeded if (!$quotaManager->hasRetryQuota($result)) { return \false; } if ($attempts >= $maxAttempts) { if (!empty($result) && $result instanceof AwsException) { $result->setMaxRetriesExceeded(); } return \false; } } return $isRetryable; }; } public function __construct(ConfigurationInterface $config, callable $handler, $options = []) { $this->options = $options; $this->maxAttempts = $config->getMaxAttempts(); $this->mode = $config->getMode(); $this->nextHandler = $handler; $this->quotaManager = new QuotaManager(); $this->maxBackoff = isset($options['max_backoff']) ? $options['max_backoff'] : 20000; $this->collectStats = isset($options['collect_stats']) ? (bool) $options['collect_stats'] : \false; $this->decider = isset($options['decider']) ? $options['decider'] : self::createDefaultDecider($this->quotaManager, $this->maxAttempts, $options); $this->delayer = isset($options['delayer']) ? $options['delayer'] : function ($attempts) { return $this->exponentialDelayWithJitter($attempts); }; if ($this->mode === 'adaptive') { $this->rateLimiter = isset($options['rate_limiter']) ? $options['rate_limiter'] : new RateLimiter(); } } public function __invoke(CommandInterface $cmd, RequestInterface $req) { $decider = $this->decider; $delayer = $this->delayer; $handler = $this->nextHandler; $attempts = 1; $monitoringEvents = []; $requestStats = []; $req = $this->addRetryHeader($req, 0, 0); $callback = function ($value) use($handler, $cmd, $req, $decider, $delayer, &$attempts, &$requestStats, &$monitoringEvents, &$callback) { if ($this->mode === 'adaptive') { $this->rateLimiter->updateSendingRate($this->isThrottlingError($value)); } $this->updateHttpStats($value, $requestStats); if ($value instanceof MonitoringEventsInterface) { $reversedEvents = \array_reverse($monitoringEvents); $monitoringEvents = \array_merge($monitoringEvents, $value->getMonitoringEvents()); foreach ($reversedEvents as $event) { $value->prependMonitoringEvent($event); } } if ($value instanceof \Exception || $value instanceof \Throwable) { if (!$decider($attempts, $cmd, $value)) { return Promise\Create::rejectionFor($this->bindStatsToReturn($value, $requestStats)); } } elseif ($value instanceof ResultInterface && !$decider($attempts, $cmd, $value)) { return $this->bindStatsToReturn($value, $requestStats); } $delayBy = $delayer($attempts++); $cmd['@http']['delay'] = $delayBy; if ($this->collectStats) { $this->updateStats($attempts - 1, $delayBy, $requestStats); } // Update retry header with retry count and delayBy $req = $this->addRetryHeader($req, $attempts - 1, $delayBy); // Get token from rate limiter, which will sleep if necessary if ($this->mode === 'adaptive') { $this->rateLimiter->getSendToken(); } return $handler($cmd, $req)->then($callback, $callback); }; // Get token from rate limiter, which will sleep if necessary if ($this->mode === 'adaptive') { $this->rateLimiter->getSendToken(); } return $handler($cmd, $req)->then($callback, $callback); } /** * Amount of milliseconds to delay as a function of attempt number * * @param $attempts * @return mixed */ public function exponentialDelayWithJitter($attempts) { $rand = \mt_rand() / \mt_getrandmax(); return \min(1000 * $rand * \pow(2, $attempts), $this->maxBackoff); } private static function isRetryable($result, $retryCurlErrors, $options = []) { $errorCodes = self::$standardThrottlingErrors + self::$standardTransientErrors; if (!empty($options['transient_error_codes']) && \is_array($options['transient_error_codes'])) { foreach ($options['transient_error_codes'] as $code) { $errorCodes[$code] = \true; } } if (!empty($options['throttling_error_codes']) && \is_array($options['throttling_error_codes'])) { foreach ($options['throttling_error_codes'] as $code) { $errorCodes[$code] = \true; } } $statusCodes = self::$standardTransientStatusCodes; if (!empty($options['status_codes']) && \is_array($options['status_codes'])) { foreach ($options['status_codes'] as $code) { $statusCodes[$code] = \true; } } if (!empty($options['curl_errors']) && \is_array($options['curl_errors'])) { foreach ($options['curl_errors'] as $code) { $retryCurlErrors[$code] = \true; } } if ($result instanceof \Exception || $result instanceof \Throwable) { $isError = \true; } else { $isError = \false; } if (!$isError) { if (!isset($result['@metadata']['statusCode'])) { return \false; } return isset($statusCodes[$result['@metadata']['statusCode']]); } if (!$result instanceof AwsException) { return \false; } if ($result->isConnectionError()) { return \true; } if (!empty($errorCodes[$result->getAwsErrorCode()])) { return \true; } if (!empty($statusCodes[$result->getStatusCode()])) { return \true; } if (\count($retryCurlErrors) && ($previous = $result->getPrevious()) && $previous instanceof RequestException) { if (\method_exists($previous, 'getHandlerContext')) { $context = $previous->getHandlerContext(); return !empty($context['errno']) && isset($retryCurlErrors[$context['errno']]); } $message = $previous->getMessage(); foreach (\array_keys($retryCurlErrors) as $curlError) { if (\strpos($message, 'cURL error ' . $curlError . ':') === 0) { return \true; } } } // Check error shape for the retryable trait if (!empty($errorShape = $result->getAwsErrorShape())) { $definition = $errorShape->toArray(); if (!empty($definition['retryable'])) { return \true; } } return \false; } private function isThrottlingError($result) { if ($result instanceof AwsException) { // Check pre-defined throttling errors $throttlingErrors = self::$standardThrottlingErrors; if (!empty($this->options['throttling_error_codes']) && \is_array($this->options['throttling_error_codes'])) { foreach ($this->options['throttling_error_codes'] as $code) { $throttlingErrors[$code] = \true; } } if (!empty($result->getAwsErrorCode()) && !empty($throttlingErrors[$result->getAwsErrorCode()])) { return \true; } // Check error shape for the throttling trait if (!empty($errorShape = $result->getAwsErrorShape())) { $definition = $errorShape->toArray(); if (!empty($definition['retryable']['throttling'])) { return \true; } } } return \false; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/JsonCompiler.php000064400000000757147600374260022534 0ustar00monitoringEvents; } /** * Prepend a client-side monitoring event to this object's event list * * @param array $event */ public function prependMonitoringEvent(array $event) { \array_unshift($this->monitoringEvents, $event); } /** * Append a client-side monitoring event to this object's event list * * @param array $event */ public function appendMonitoringEvent(array $event) { $this->monitoringEvents[] = $event; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/History.php000064400000007556147600374260021575 0ustar00maxEntries = $maxEntries; } /** * @return int */ #[\ReturnTypeWillChange] public function count() { return \count($this->entries); } #[\ReturnTypeWillChange] public function getIterator() { return new \ArrayIterator(\array_values($this->entries)); } /** * Get the last finished command seen by the history container. * * @return CommandInterface * @throws \LogicException if no commands have been seen. */ public function getLastCommand() { if (!$this->entries) { throw new \LogicException('No commands received'); } return \end($this->entries)['command']; } /** * Get the last finished request seen by the history container. * * @return RequestInterface * @throws \LogicException if no requests have been seen. */ public function getLastRequest() { if (!$this->entries) { throw new \LogicException('No requests received'); } return \end($this->entries)['request']; } /** * Get the last received result or exception. * * @return ResultInterface|AwsException * @throws \LogicException if no return values have been received. */ public function getLastReturn() { if (!$this->entries) { throw new \LogicException('No entries'); } $last = \end($this->entries); if (isset($last['result'])) { return $last['result']; } if (isset($last['exception'])) { return $last['exception']; } throw new \LogicException('No return value for last entry.'); } /** * Initiate an entry being added to the history. * * @param CommandInterface $cmd Command be executed. * @param RequestInterface $req Request being sent. * * @return string Returns the ticket used to finish the entry. */ public function start(CommandInterface $cmd, RequestInterface $req) { $ticket = \uniqid(); $this->entries[$ticket] = ['command' => $cmd, 'request' => $req, 'result' => null, 'exception' => null]; return $ticket; } /** * Finish adding an entry to the history container. * * @param string $ticket Ticket returned from the start call. * @param mixed $result The result (an exception or AwsResult). */ public function finish($ticket, $result) { if (!isset($this->entries[$ticket])) { throw new \InvalidArgumentException('Invalid history ticket'); } if (isset($this->entries[$ticket]['result']) || isset($this->entries[$ticket]['exception'])) { throw new \LogicException('History entry is already finished'); } if ($result instanceof \Exception) { $this->entries[$ticket]['exception'] = $result; } else { $this->entries[$ticket]['result'] = $result; } if (\count($this->entries) >= $this->maxEntries) { $this->entries = \array_slice($this->entries, -$this->maxEntries, null, \true); } } /** * Flush the history */ public function clear() { $this->entries = []; } /** * Converts the history to an array. * * @return array */ public function toArray() { return \array_values($this->entries); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/RetryMiddleware.php000064400000017374147600374260023236 0ustar00 \true, 502 => \true, 503 => \true, 504 => \true]; private static $retryCodes = [ // Throttling error 'RequestLimitExceeded' => \true, 'Throttling' => \true, 'ThrottlingException' => \true, 'ThrottledException' => \true, 'ProvisionedThroughputExceededException' => \true, 'RequestThrottled' => \true, 'BandwidthLimitExceeded' => \true, 'RequestThrottledException' => \true, 'TooManyRequestsException' => \true, 'IDPCommunicationError' => \true, 'EC2ThrottledException' => \true, ]; private $decider; private $delay; private $nextHandler; private $collectStats; public function __construct(callable $decider, callable $delay, callable $nextHandler, $collectStats = \false) { $this->decider = $decider; $this->delay = $delay; $this->nextHandler = $nextHandler; $this->collectStats = (bool) $collectStats; } /** * Creates a default AWS retry decider function. * * The optional $extraConfig parameter is an associative array * that specifies additional retry conditions on top of the ones specified * by default by the Aws\RetryMiddleware class, with the following keys: * * - errorCodes: (string[]) An indexed array of AWS exception codes to retry. * Optional. * - statusCodes: (int[]) An indexed array of HTTP status codes to retry. * Optional. * - curlErrors: (int[]) An indexed array of Curl error codes to retry. Note * these should be valid Curl constants. Optional. * * @param int $maxRetries * @param array $extraConfig * @return callable */ public static function createDefaultDecider($maxRetries = 3, $extraConfig = []) { $retryCurlErrors = []; if (\extension_loaded('curl')) { $retryCurlErrors[\CURLE_RECV_ERROR] = \true; } return function ($retries, CommandInterface $command, RequestInterface $request, ResultInterface $result = null, $error = null) use($maxRetries, $retryCurlErrors, $extraConfig) { // Allow command-level options to override this value $maxRetries = null !== $command['@retries'] ? $command['@retries'] : $maxRetries; $isRetryable = self::isRetryable($result, $error, $retryCurlErrors, $extraConfig); if ($retries >= $maxRetries) { if (!empty($error) && $error instanceof AwsException && $isRetryable) { $error->setMaxRetriesExceeded(); } return \false; } return $isRetryable; }; } private static function isRetryable($result, $error, $retryCurlErrors, $extraConfig = []) { $errorCodes = self::$retryCodes; if (!empty($extraConfig['error_codes']) && \is_array($extraConfig['error_codes'])) { foreach ($extraConfig['error_codes'] as $code) { $errorCodes[$code] = \true; } } $statusCodes = self::$retryStatusCodes; if (!empty($extraConfig['status_codes']) && \is_array($extraConfig['status_codes'])) { foreach ($extraConfig['status_codes'] as $code) { $statusCodes[$code] = \true; } } if (!empty($extraConfig['curl_errors']) && \is_array($extraConfig['curl_errors'])) { foreach ($extraConfig['curl_errors'] as $code) { $retryCurlErrors[$code] = \true; } } if (!$error) { if (!isset($result['@metadata']['statusCode'])) { return \false; } return isset($statusCodes[$result['@metadata']['statusCode']]); } if (!$error instanceof AwsException) { return \false; } if ($error->isConnectionError()) { return \true; } if (isset($errorCodes[$error->getAwsErrorCode()])) { return \true; } if (isset($statusCodes[$error->getStatusCode()])) { return \true; } if (\count($retryCurlErrors) && ($previous = $error->getPrevious()) && $previous instanceof RequestException) { if (\method_exists($previous, 'getHandlerContext')) { $context = $previous->getHandlerContext(); return !empty($context['errno']) && isset($retryCurlErrors[$context['errno']]); } $message = $previous->getMessage(); foreach (\array_keys($retryCurlErrors) as $curlError) { if (\strpos($message, 'cURL error ' . $curlError . ':') === 0) { return \true; } } } return \false; } /** * Delay function that calculates an exponential delay. * * Exponential backoff with jitter, 100ms base, 20 sec ceiling * * @param $retries - The number of retries that have already been attempted * * @return int * * @link https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/ */ public static function exponentialDelay($retries) { return \mt_rand(0, (int) \min(20000, (int) \pow(2, $retries) * 100)); } /** * @param CommandInterface $command * @param RequestInterface $request * * @return PromiseInterface */ public function __invoke(CommandInterface $command, RequestInterface $request = null) { $retries = 0; $requestStats = []; $monitoringEvents = []; $handler = $this->nextHandler; $decider = $this->decider; $delay = $this->delay; $request = $this->addRetryHeader($request, 0, 0); $g = function ($value) use($handler, $decider, $delay, $command, $request, &$retries, &$requestStats, &$monitoringEvents, &$g) { $this->updateHttpStats($value, $requestStats); if ($value instanceof MonitoringEventsInterface) { $reversedEvents = \array_reverse($monitoringEvents); $monitoringEvents = \array_merge($monitoringEvents, $value->getMonitoringEvents()); foreach ($reversedEvents as $event) { $value->prependMonitoringEvent($event); } } if ($value instanceof \Exception || $value instanceof \Throwable) { if (!$decider($retries, $command, $request, null, $value)) { return Promise\Create::rejectionFor($this->bindStatsToReturn($value, $requestStats)); } } elseif ($value instanceof ResultInterface && !$decider($retries, $command, $request, $value, null)) { return $this->bindStatsToReturn($value, $requestStats); } // Delay fn is called with 0, 1, ... so increment after the call. $delayBy = $delay($retries++); $command['@http']['delay'] = $delayBy; if ($this->collectStats) { $this->updateStats($retries, $delayBy, $requestStats); } // Update retry header with retry count and delayBy $request = $this->addRetryHeader($request, $retries, $delayBy); return $handler($command, $request)->then($g, $g); }; return $handler($command, $request)->then($g, $g); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Middleware.php000064400000033356147600374260022206 0ustar00getOperation($command->getName()); $source = $command[$sourceParameter]; if ($source !== null && $operation->getInput()->hasMember($bodyParameter)) { $command[$bodyParameter] = new LazyOpenStream($source, 'r'); unset($command[$sourceParameter]); } return $handler($command, $request); }; }; } /** * Adds a middleware that uses client-side validation. * * @param Service $api API being accessed. * * @return callable */ public static function validation(Service $api, Validator $validator = null) { $validator = $validator ?: new Validator(); return function (callable $handler) use($api, $validator) { return function (CommandInterface $command, RequestInterface $request = null) use($api, $validator, $handler) { if ($api->isModifiedModel()) { $api = new Service($api->getDefinition(), $api->getProvider()); } $operation = $api->getOperation($command->getName()); $validator->validate($command->getName(), $operation->getInput(), $command->toArray()); return $handler($command, $request); }; }; } /** * Builds an HTTP request for a command. * * @param callable $serializer Function used to serialize a request for a * command. * @param EndpointProviderV2 | null $endpointProvider * @param array $providerArgs * @return callable */ public static function requestBuilder($serializer, $endpointProvider = null, array $providerArgs = null) { return function (callable $handler) use($serializer, $endpointProvider, $providerArgs) { return function (CommandInterface $command) use($serializer, $handler, $endpointProvider, $providerArgs) { return $handler($command, $serializer($command, $endpointProvider, $providerArgs)); }; }; } /** * Creates a middleware that signs requests for a command. * * @param callable $credProvider Credentials provider function that * returns a promise that is resolved * with a CredentialsInterface object. * @param callable $signatureFunction Function that accepts a Command * object and returns a * SignatureInterface. * * @return callable */ public static function signer(callable $credProvider, callable $signatureFunction, $tokenProvider = null) { return function (callable $handler) use($signatureFunction, $credProvider, $tokenProvider) { return function (CommandInterface $command, RequestInterface $request) use($handler, $signatureFunction, $credProvider, $tokenProvider) { $signer = $signatureFunction($command); if ($signer instanceof TokenAuthorization) { return $tokenProvider()->then(function (TokenInterface $token) use($handler, $command, $signer, $request) { return $handler($command, $signer->authorizeRequest($request, $token)); }); } else { return $credProvider()->then(function (CredentialsInterface $creds) use($handler, $command, $signer, $request) { return $handler($command, $signer->signRequest($request, $creds)); }); } }; }; } /** * Creates a middleware that invokes a callback at a given step. * * The tap callback accepts a CommandInterface and RequestInterface as * arguments but is not expected to return a new value or proxy to * downstream middleware. It's simply a way to "tap" into the handler chain * to debug or get an intermediate value. * * @param callable $fn Tap function * * @return callable */ public static function tap(callable $fn) { return function (callable $handler) use($fn) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $fn) { $fn($command, $request); return $handler($command, $request); }; }; } /** * Middleware wrapper function that retries requests based on the boolean * result of invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [result], and [exception] and * returns true if the command is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * @param bool $stats Whether to collect statistics on retries and the * associated delay. * * @return callable */ public static function retry(callable $decider = null, callable $delay = null, $stats = \false) { $decider = $decider ?: RetryMiddleware::createDefaultDecider(); $delay = $delay ?: [RetryMiddleware::class, 'exponentialDelay']; return function (callable $handler) use($decider, $delay, $stats) { return new RetryMiddleware($decider, $delay, $handler, $stats); }; } /** * Middleware wrapper function that adds an invocation id header to * requests, which is only applied after the build step. * * This is a uniquely generated UUID to identify initial and subsequent * retries as part of a complete request lifecycle. * * @return callable */ public static function invocationId() { return function (callable $handler) { return function (CommandInterface $command, RequestInterface $request) use($handler) { return $handler($command, $request->withHeader('aws-sdk-invocation-id', \md5(\uniqid(\gethostname(), \true)))); }; }; } /** * Middleware wrapper function that adds a Content-Type header to requests. * This is only done when the Content-Type has not already been set, and the * request body's URI is available. It then checks the file extension of the * URI to determine the mime-type. * * @param array $operations Operations that Content-Type should be added to. * * @return callable */ public static function contentType(array $operations) { return function (callable $handler) use($operations) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $operations) { if (!$request->hasHeader('Content-Type') && \in_array($command->getName(), $operations, \true) && ($uri = $request->getBody()->getMetadata('uri'))) { $request = $request->withHeader('Content-Type', Psr7\MimeType::fromFilename($uri) ?: 'application/octet-stream'); } return $handler($command, $request); }; }; } /** * Middleware wrapper function that adds a trace id header to requests * from clients instantiated in supported Lambda runtime environments. * * The purpose for this header is to track and stop Lambda functions * from being recursively invoked due to misconfigured resources. * * @return callable */ public static function recursionDetection() { return function (callable $handler) { return function (CommandInterface $command, RequestInterface $request) use($handler) { $isLambda = \getenv('AWS_LAMBDA_FUNCTION_NAME'); $traceId = \str_replace('\\e', '\\x1b', \getenv('_X_AMZN_TRACE_ID')); if ($isLambda && $traceId) { if (!$request->hasHeader('X-Amzn-Trace-Id')) { $ignoreChars = ['=', ';', ':', '+', '&', '[', ']', '{', '}', '"', '\'', ',']; $traceIdEncoded = \rawurlencode(\stripcslashes($traceId)); foreach ($ignoreChars as $char) { $encodedChar = \rawurlencode($char); $traceIdEncoded = \str_replace($encodedChar, $char, $traceIdEncoded); } return $handler($command, $request->withHeader('X-Amzn-Trace-Id', $traceIdEncoded)); } } return $handler($command, $request); }; }; } /** * Tracks command and request history using a history container. * * This is useful for testing. * * @param History $history History container to store entries. * * @return callable */ public static function history(History $history) { return function (callable $handler) use($history) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $history) { $ticket = $history->start($command, $request); return $handler($command, $request)->then(function ($result) use($history, $ticket) { $history->finish($ticket, $result); return $result; }, function ($reason) use($history, $ticket) { $history->finish($ticket, $reason); return Promise\Create::rejectionFor($reason); }); }; }; } /** * Creates a middleware that applies a map function to requests as they * pass through the middleware. * * @param callable $f Map function that accepts a RequestInterface and * returns a RequestInterface. * * @return callable */ public static function mapRequest(callable $f) { return function (callable $handler) use($f) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { return $handler($command, $f($request)); }; }; } /** * Creates a middleware that applies a map function to commands as they * pass through the middleware. * * @param callable $f Map function that accepts a command and returns a * command. * * @return callable */ public static function mapCommand(callable $f) { return function (callable $handler) use($f) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { return $handler($f($command), $request); }; }; } /** * Creates a middleware that applies a map function to results. * * @param callable $f Map function that accepts an Aws\ResultInterface and * returns an Aws\ResultInterface. * * @return callable */ public static function mapResult(callable $f) { return function (callable $handler) use($f) { return function (CommandInterface $command, RequestInterface $request = null) use($handler, $f) { return $handler($command, $request)->then($f); }; }; } public static function timer() { return function (callable $handler) { return function (CommandInterface $command, RequestInterface $request = null) use($handler) { $start = \microtime(\true); return $handler($command, $request)->then(function (ResultInterface $res) use($start) { if (!isset($res['@metadata'])) { $res['@metadata'] = []; } if (!isset($res['@metadata']['transferStats'])) { $res['@metadata']['transferStats'] = []; } $res['@metadata']['transferStats']['total_time'] = \microtime(\true) - $start; return $res; }, function ($err) use($start) { if ($err instanceof AwsException) { $err->setTransferInfo(['total_time' => \microtime(\true) - $start] + $err->getTransferInfo()); } return Promise\Create::rejectionFor($err); }); }; }; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/PresignUrlMiddleware.php000064400000010501147600374260024204 0ustar00endpointProvider = $endpointProvider; $this->client = $client; $this->nextHandler = $nextHandler; $this->commandPool = $options['operations']; $this->serviceName = $options['service']; $this->presignParam = !empty($options['presign_param']) ? $options['presign_param'] : 'PresignedUrl'; $this->extraQueryParams = !empty($options['extra_query_params']) ? $options['extra_query_params'] : []; $this->requireDifferentRegion = !empty($options['require_different_region']); } public static function wrap(AwsClientInterface $client, $endpointProvider, array $options = []) { return function (callable $handler) use($endpointProvider, $client, $options) { $f = new PresignUrlMiddleware($options, $endpointProvider, $client, $handler); return $f; }; } public function __invoke(CommandInterface $cmd, RequestInterface $request = null) { if (\in_array($cmd->getName(), $this->commandPool) && !isset($cmd->{'__skip' . $cmd->getName()})) { $cmd['DestinationRegion'] = $this->client->getRegion(); if (!empty($cmd['SourceRegion']) && !empty($cmd[$this->presignParam])) { goto nexthandler; } if (!$this->requireDifferentRegion || !empty($cmd['SourceRegion']) && $cmd['SourceRegion'] !== $cmd['DestinationRegion']) { $cmd[$this->presignParam] = $this->createPresignedUrl($this->client, $cmd); } } nexthandler: $nextHandler = $this->nextHandler; return $nextHandler($cmd, $request); } private function createPresignedUrl(AwsClientInterface $client, CommandInterface $cmd) { $cmdName = $cmd->getName(); $newCmd = $client->getCommand($cmdName, $cmd->toArray()); // Avoid infinite recursion by flagging the new command. $newCmd->{'__skip' . $cmdName} = \true; // Serialize a request for the operation. $request = \VendorDuplicator\Aws\serialize($newCmd); // Create the new endpoint for the target endpoint. if ($this->endpointProvider instanceof \VendorDuplicator\Aws\EndpointV2\EndpointProviderV2) { $providerArgs = \array_merge($this->client->getEndpointProviderArgs(), ['Region' => $cmd['SourceRegion']]); $endpoint = $this->endpointProvider->resolveEndpoint($providerArgs)->getUrl(); } else { $endpoint = EndpointProvider::resolve($this->endpointProvider, ['region' => $cmd['SourceRegion'], 'service' => $this->serviceName])['endpoint']; } // Set the request to hit the target endpoint. $uri = $request->getUri()->withHost((new Uri($endpoint))->getHost()); $request = $request->withUri($uri); // Create a presigned URL for our generated request. $signer = new SignatureV4($this->serviceName, $cmd['SourceRegion']); $currentQueryParams = (string) $request->getBody(); $paramsToAdd = \false; if (!empty($this->extraQueryParams[$cmdName])) { foreach ($this->extraQueryParams[$cmdName] as $param) { if (!\strpos($currentQueryParams, $param)) { $paramsToAdd = "&{$param}={$cmd[$param]}"; } } } return (string) $signer->presign(SignatureV4::convertPostToGet($request, $paramsToAdd ?: ""), $client->getCredentials()->wait(), '+1 hour')->getUri(); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/HasDataTrait.php000064400000002741147600374260022434 0ustar00data); } /** * This method returns a reference to the variable to allow for indirect * array modification (e.g., $foo['bar']['baz'] = 'qux'). * * @param $offset * * @return mixed|null */ #[\ReturnTypeWillChange] public function &offsetGet($offset) { if (isset($this->data[$offset])) { return $this->data[$offset]; } $value = null; return $value; } /** * @return void */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { $this->data[$offset] = $value; } /** * @return bool */ #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->data[$offset]); } /** * @return void */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->data[$offset]); } public function toArray() { return $this->data; } /** * @return int */ #[\ReturnTypeWillChange] public function count() { return \count($this->data); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/CommandPool.php000064400000012253147600374260022332 0ustar00getBefore($config); $mapFn = function ($commands) use($client, $before, $config) { foreach ($commands as $key => $command) { if (!$command instanceof CommandInterface) { throw new \InvalidArgumentException('Each value yielded by ' . 'the iterator must be an Aws\\CommandInterface.'); } if ($before) { $before($command, $key); } if (!empty($config['preserve_iterator_keys'])) { (yield $key => $client->executeAsync($command)); } else { (yield $client->executeAsync($command)); } } }; $this->each = new EachPromise($mapFn($commands), $config); } /** * @return PromiseInterface */ public function promise() { return $this->each->promise(); } /** * Executes a pool synchronously and aggregates the results of the pool * into an indexed array in the same order as the passed in array. * * @param AwsClientInterface $client Client used to execute commands. * @param mixed $commands Iterable that yields commands. * @param array $config Configuration options. * * @return array * @see \VendorDuplicator\Aws\CommandPool::__construct for available configuration options. */ public static function batch(AwsClientInterface $client, $commands, array $config = []) { $results = []; self::cmpCallback($config, 'fulfilled', $results); self::cmpCallback($config, 'rejected', $results); return (new self($client, $commands, $config))->promise()->then(static function () use(&$results) { \ksort($results); return $results; })->wait(); } /** * @return callable */ private function getBefore(array $config) { if (!isset($config['before'])) { return null; } if (\is_callable($config['before'])) { return $config['before']; } throw new \InvalidArgumentException('before must be callable'); } /** * Adds an onFulfilled or onRejected callback that aggregates results into * an array. If a callback is already present, it is replaced with the * composed function. * * @param array $config * @param $name * @param array $results */ private static function cmpCallback(array &$config, $name, array &$results) { if (!isset($config[$name])) { $config[$name] = function ($v, $k) use(&$results) { $results[$k] = $v; }; } else { $currentFn = $config[$name]; $config[$name] = function ($v, $k) use(&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/AwsClientInterface.php000064400000013003147600374260023626 0ustar00getWaiter('foo', ['bar' => 'baz']); * $waiter->promise()->then(function () { echo 'Done!'; }); * * @param string|callable $name Name of the waiter that defines the wait * configuration and conditions. * @param array $args Args to be used with each command executed * by the waiter. Waiter configuration options * can be provided in an associative array in * the @waiter key. * @return \VendorDuplicator\Aws\Waiter * @throws \UnexpectedValueException if the waiter is invalid. */ public function getWaiter($name, array $args = []); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/RequestCompressionMiddleware.php000064400000011010147600374260025760 0ustar00 'gzencode']; /** * Create a middleware wrapper function. * * @return callable */ public static function wrap(array $config) { return function (callable $handler) use($config) { return new self($handler, $config); }; } public function __construct(callable $nextHandler, $config) { $this->minimumCompressionSize = $this->determineMinimumCompressionSize($config); $this->api = $config['api']; $this->nextHandler = $nextHandler; } public function __invoke(CommandInterface $command, RequestInterface $request) { if (isset($command['@request_min_compression_size_bytes']) && \is_int($command['@request_min_compression_size_bytes']) && $this->isValidCompressionSize($command['@request_min_compression_size_bytes'])) { $this->minimumCompressionSize = $command['@request_min_compression_size_bytes']; } $nextHandler = $this->nextHandler; $operation = $this->api->getOperation($command->getName()); $compressionInfo = isset($operation['requestcompression']) ? $operation['requestcompression'] : null; if (!$this->shouldCompressRequestBody($compressionInfo, $command, $operation, $request)) { return $nextHandler($command, $request); } $this->encodings = $compressionInfo['encodings']; $request = $this->compressRequestBody($request); return $nextHandler($command, $request); } private function compressRequestBody(RequestInterface $request) { $fn = $this->determineEncoding(); if (\is_null($fn)) { return $request; } $body = $request->getBody()->getContents(); $compressedBody = $fn($body); return $request->withBody(Psr7\Utils::streamFor($compressedBody))->withHeader('content-encoding', $this->encoding); } private function determineEncoding() { foreach ($this->encodings as $encoding) { if (isset($this->encodingMap[$encoding])) { $this->encoding = $encoding; return $this->encodingMap[$encoding]; } } return null; } private function shouldCompressRequestBody($compressionInfo, $command, $operation, $request) { if ($compressionInfo) { if (isset($command['@disable_request_compression']) && $command['@disable_request_compression'] === \true) { return \false; } elseif ($this->hasStreamingTraitWithoutRequiresLength($command, $operation)) { return \true; } $requestBodySize = $request->hasHeader('content-length') ? (int) $request->getHeaderLine('content-length') : $request->getBody()->getSize(); if ($requestBodySize >= $this->minimumCompressionSize) { return \true; } } return \false; } private function hasStreamingTraitWithoutRequiresLength($command, $operation) { foreach ($operation->getInput()->getMembers() as $name => $member) { if (isset($command[$name]) && !empty($member['streaming']) && empty($member['requiresLength'])) { return \true; } } return \false; } private function determineMinimumCompressionSize($config) { if (\is_callable($config['request_min_compression_size_bytes'])) { $minCompressionSz = $config['request_min_compression_size_bytes'](); } else { $minCompressionSz = $config['request_min_compression_size_bytes']; } if ($this->isValidCompressionSize($minCompressionSz)) { return $minCompressionSz; } } private function isValidCompressionSize($compressionSize) { if (\is_numeric($compressionSize) && ($compressionSize >= 0 && $compressionSize <= 10485760)) { return \true; } throw new \InvalidArgumentException('The minimum request compression size must be a ' . 'non-negative integer value between 0 and 10485760 bytes, inclusive.'); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/StreamRequestPayloadMiddleware.php000064400000004720147600374260026236 0ustar00nextHandler = $nextHandler; $this->service = $service; } public function __invoke(CommandInterface $command, RequestInterface $request) { $nextHandler = $this->nextHandler; $operation = $this->service->getOperation($command->getName()); $contentLength = $request->getHeader('content-length'); $hasStreaming = \false; $requiresLength = \false; // Check if any present input member is a stream and requires the // content length foreach ($operation->getInput()->getMembers() as $name => $member) { if (!empty($member['streaming']) && isset($command[$name])) { $hasStreaming = \true; if (!empty($member['requiresLength'])) { $requiresLength = \true; } } } if ($hasStreaming) { // Add 'transfer-encoding' header if payload size not required to // to be calculated and not already known if (empty($requiresLength) && empty($contentLength) && isset($operation['authtype']) && $operation['authtype'] == 'v4-unsigned-body') { $request = $request->withHeader('transfer-encoding', 'chunked'); // Otherwise, make sure 'content-length' header is added } else { if (empty($contentLength)) { $size = $request->getBody()->getSize(); if (\is_null($size)) { throw new IncalculablePayloadException('Payload' . ' content length is required and can not be' . ' calculated.'); } $request = $request->withHeader('content-length', $size); } } } return $nextHandler($command, $request); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Result.php000064400000002261147600374260021376 0ustar00data = $data; } public function hasKey($name) { return isset($this->data[$name]); } public function get($key) { return $this[$key]; } public function search($expression) { return JmesPath::search($expression, $this->toArray()); } public function __toString() { $jsonData = \json_encode($this->toArray(), \JSON_PRETTY_PRINT); return <<get(\$key)`) or "accessing the result like an associative array (e.g. `\$result['key']`). You can also execute JMESPath expressions on the result data using the search() method. {$jsonData} EOT; } /** * @deprecated */ public function getPath($path) { return $this->search(\str_replace('/', '.', $path)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/Waiter.php000064400000020234147600374260021353 0ustar00 0, 'before' => null]; /** @var array Required configuration options. */ private static $required = ['acceptors', 'delay', 'maxAttempts', 'operation']; /** * The array of configuration options include: * * - acceptors: (array) Array of acceptor options * - delay: (int) Number of seconds to delay between attempts * - maxAttempts: (int) Maximum number of attempts before failing * - operation: (string) Name of the API operation to use for polling * - before: (callable) Invoked before attempts. Accepts command and tries. * * @param AwsClientInterface $client Client used to execute commands. * @param string $name Waiter name. * @param array $args Command arguments. * @param array $config Waiter config that overrides defaults. * * @throws \InvalidArgumentException if the configuration is incomplete. */ public function __construct(AwsClientInterface $client, $name, array $args = [], array $config = []) { $this->client = $client; $this->name = $name; $this->args = $args; // Prepare and validate config. $this->config = $config + self::$defaults; foreach (self::$required as $key) { if (!isset($this->config[$key])) { throw new \InvalidArgumentException('The provided waiter configuration was incomplete.'); } } if ($this->config['before'] && !\is_callable($this->config['before'])) { throw new \InvalidArgumentException('The provided "before" callback is not callable.'); } } /** * @return Coroutine */ public function promise() { return Coroutine::of(function () { $name = $this->config['operation']; for ($state = 'retry', $attempt = 1; $state === 'retry'; $attempt++) { // Execute the operation. $args = $this->getArgsForAttempt($attempt); $command = $this->client->getCommand($name, $args); try { if ($this->config['before']) { $this->config['before']($command, $attempt); } $result = (yield $this->client->executeAsync($command)); } catch (AwsException $e) { $result = $e; } // Determine the waiter's state and what to do next. $state = $this->determineState($result); if ($state === 'success') { (yield $command); } elseif ($state === 'failed') { $msg = "The {$this->name} waiter entered a failure state."; if ($result instanceof \Exception) { $msg .= ' Reason: ' . $result->getMessage(); } (yield new RejectedPromise(new \RuntimeException($msg))); } elseif ($state === 'retry' && $attempt >= $this->config['maxAttempts']) { $state = 'failed'; (yield new RejectedPromise(new \RuntimeException("The {$this->name} waiter failed after attempt #{$attempt}."))); } } }); } /** * Gets the operation arguments for the attempt, including the delay. * * @param $attempt Number of the current attempt. * * @return mixed integer */ private function getArgsForAttempt($attempt) { $args = $this->args; // Determine the delay. $delay = $attempt === 1 ? $this->config['initDelay'] : $this->config['delay']; if (\is_callable($delay)) { $delay = $delay($attempt); } // Set the delay. (Note: handlers except delay in milliseconds.) if (!isset($args['@http'])) { $args['@http'] = []; } $args['@http']['delay'] = $delay * 1000; return $args; } /** * Determines the state of the waiter attempt, based on the result of * polling the resource. A waiter can have the state of "success", "failed", * or "retry". * * @param mixed $result * * @return string Will be "success", "failed", or "retry" */ private function determineState($result) { foreach ($this->config['acceptors'] as $acceptor) { $matcher = 'matches' . \ucfirst($acceptor['matcher']); if ($this->{$matcher}($result, $acceptor)) { return $acceptor['state']; } } return $result instanceof \Exception ? 'failed' : 'retry'; } /** * @param Result $result Result or exception. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesPath($result, array $acceptor) { return !$result instanceof ResultInterface ? \false : $acceptor['expected'] == $result->search($acceptor['argument']); } /** * @param Result $result Result or exception. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesPathAll($result, array $acceptor) { if (!$result instanceof ResultInterface) { return \false; } $actuals = $result->search($acceptor['argument']) ?: []; foreach ($actuals as $actual) { if ($actual != $acceptor['expected']) { return \false; } } return \true; } /** * @param Result $result Result or exception. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesPathAny($result, array $acceptor) { if (!$result instanceof ResultInterface) { return \false; } $actuals = $result->search($acceptor['argument']) ?: []; return \in_array($acceptor['expected'], $actuals); } /** * @param Result $result Result or exception. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesStatus($result, array $acceptor) { if ($result instanceof ResultInterface) { return $acceptor['expected'] == $result['@metadata']['statusCode']; } if ($result instanceof AwsException && ($response = $result->getResponse())) { return $acceptor['expected'] == $response->getStatusCode(); } return \false; } /** * @param Result $result Result or exception. * @param array $acceptor Acceptor configuration being checked. * * @return bool */ private function matchesError($result, array $acceptor) { if ($result instanceof AwsException) { return $result->isConnectionError() || $result->getAwsErrorCode() == $acceptor['expected']; } return \false; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/InputValidationMiddleware.php000064400000004521147600374260025231 0ustar00service = $service; $this->nextHandler = $nextHandler; $this->mandatoryAttributeList = $mandatoryAttributeList; } public function __invoke(CommandInterface $cmd) { $nextHandler = $this->nextHandler; $op = $this->service->getOperation($cmd->getName())->toArray(); if (!empty($op['input']['shape'])) { $service = $this->service->toArray(); if (!empty($input = $service['shapes'][$op['input']['shape']])) { if (!empty($input['required'])) { foreach ($input['required'] as $key => $member) { if (\in_array($member, $this->mandatoryAttributeList)) { $argument = \is_string($cmd[$member]) ? \trim($cmd[$member]) : $cmd[$member]; if ($argument === '' || $argument === null) { $commandName = $cmd->getName(); throw new \InvalidArgumentException("The {$commandName} operation requires non-empty parameter: {$member}"); } } } } } } return $nextHandler($cmd); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/MultiRegionClient.php000064400000017363147600374260023526 0ustar00 \true, 'region' => \true]); $args['region']['required'] = \false; return $args + ['client_factory' => ['type' => 'config', 'valid' => ['callable'], 'doc' => 'A callable that takes an array of client' . ' configuration arguments and returns a regionalized' . ' client.', 'required' => \true, 'internal' => \true, 'default' => function (array $args) { $namespace = manifest($args['service'])['namespace']; $klass = "VendorDuplicator\\Aws\\{$namespace}\\{$namespace}Client"; $region = isset($args['region']) ? $args['region'] : null; return function (array $args) use($klass, $region) { if ($region && empty($args['region'])) { $args['region'] = $region; } return new $klass($args); }; }], 'partition' => ['type' => 'config', 'valid' => ['string', PartitionInterface::class], 'doc' => 'AWS partition to connect to. Valid partitions' . ' include "aws," "aws-cn," and "aws-us-gov." Used to' . ' restrict the scope of the mapRegions method.', 'default' => function (array $args) { $region = isset($args['region']) ? $args['region'] : ''; return PartitionEndpointProvider::defaultProvider()->getPartition($region, $args['service']); }, 'fn' => function ($value, array &$args) { if (\is_string($value)) { $value = PartitionEndpointProvider::defaultProvider()->getPartitionByName($value); } if (!$value instanceof PartitionInterface) { throw new \InvalidArgumentException('No valid partition' . ' was provided. Provide a concrete partition or' . ' the name of a partition (e.g., "aws," "aws-cn,"' . ' or "aws-us-gov").'); } $ruleset = EndpointDefinitionProvider::getEndpointRuleset($args['service'], isset($args['version']) ? $args['version'] : 'latest'); $partitions = EndpointDefinitionProvider::getPartitions(); $args['endpoint_provider'] = new EndpointProviderV2($ruleset, $partitions); }]]; } /** * The multi-region client constructor accepts the following options: * * - client_factory: (callable) An optional callable that takes an array of * client configuration arguments and returns a regionalized client. * - partition: (Aws\Endpoint\Partition|string) AWS partition to connect to. * Valid partitions include "aws," "aws-cn," and "aws-us-gov." Used to * restrict the scope of the mapRegions method. * - region: (string) Region to connect to when no override is provided. * Used to create the default client factory and determine the appropriate * AWS partition when present. * * @param array $args Client configuration arguments. */ public function __construct(array $args = []) { if (!isset($args['service'])) { $args['service'] = $this->parseClass(); } $this->handlerList = new HandlerList(function (CommandInterface $command) { list($region, $args) = $this->getRegionFromArgs($command->toArray()); $command = $this->getClientFromPool($region)->getCommand($command->getName(), $args); if ($this->isUseCustomHandler()) { $command->getHandlerList()->setHandler($this->customHandler); } return $this->executeAsync($command); }); $argDefinitions = static::getArguments(); $resolver = new ClientResolver($argDefinitions); $args = $resolver->resolve($args, $this->handlerList); $this->config = $args['config']; $this->factory = $args['client_factory']; $this->partition = $args['partition']; $this->args = \array_diff_key($args, $args['config']); } /** * Get the region to which the client is configured to send requests by * default. * * @return string */ public function getRegion() { return $this->getClientFromPool()->getRegion(); } /** * Create a command for an operation name. * * Special keys may be set on the command to control how it behaves, * including: * * - @http: Associative array of transfer specific options to apply to the * request that is serialized for this command. Available keys include * "proxy", "verify", "timeout", "connect_timeout", "debug", "delay", and * "headers". * - @region: The region to which the command should be sent. * * @param string $name Name of the operation to use in the command * @param array $args Arguments to pass to the command * * @return CommandInterface * @throws \InvalidArgumentException if no command can be found by name */ public function getCommand($name, array $args = []) { return new Command($name, $args, clone $this->getHandlerList()); } public function getConfig($option = null) { if (null === $option) { return $this->config; } if (isset($this->config[$option])) { return $this->config[$option]; } return $this->getClientFromPool()->getConfig($option); } public function getCredentials() { return $this->getClientFromPool()->getCredentials(); } public function getHandlerList() { return $this->handlerList; } public function getApi() { return $this->getClientFromPool()->getApi(); } public function getEndpoint() { return $this->getClientFromPool()->getEndpoint(); } public function useCustomHandler(callable $handler) { $this->customHandler = $handler; } private function isUseCustomHandler() { return isset($this->customHandler); } /** * @param string $region Omit this argument or pass in an empty string to * allow the configured client factory to apply the * region. * * @return AwsClientInterface */ protected function getClientFromPool($region = '') { if (empty($this->clientPool[$region])) { $factory = $this->factory; $this->clientPool[$region] = $factory(\array_replace($this->args, \array_filter(['region' => $region]))); } return $this->clientPool[$region]; } /** * Parse the class name and return the "service" name of the client. * * @return string */ private function parseClass() { $klass = \get_class($this); if ($klass === __CLASS__) { return ''; } return \strtolower(\substr($klass, \strrpos($klass, '\\') + 1, -17)); } private function getRegionFromArgs(array $args) { $region = isset($args['@region']) ? $args['@region'] : $this->getRegion(); unset($args['@region']); return [$region, $args]; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ResponseContainerInterface.php000064400000000430147600374260025376 0ustar00stream = $stream; $this->hash = $hash; $this->callback = $onComplete; } public function read($length) { $data = $this->stream->read($length); $this->hash->update($data); if ($this->eof()) { $result = $this->hash->complete(); if ($this->callback) { \call_user_func($this->callback, $result); } } return $data; } public function seek($offset, $whence = \SEEK_SET) { if ($offset === 0) { $this->hash->reset(); return $this->stream->seek($offset); } // Seeking arbitrarily is not supported. return \false; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/WrappedHttpHandler.php000064400000014451147600374260023664 0ustar00httpHandler = $httpHandler; $this->parser = $parser; $this->errorParser = $errorParser; $this->exceptionClass = $exceptionClass; $this->collectStats = $collectStats; } /** * Calls the simpler HTTP specific handler and wraps the returned promise * with AWS specific values (e.g., a result object or AWS exception). * * @param CommandInterface $command Command being executed. * @param RequestInterface $request Request to send. * * @return Promise\PromiseInterface */ public function __invoke(CommandInterface $command, RequestInterface $request) { $fn = $this->httpHandler; $options = $command['@http'] ?: []; $stats = []; if ($this->collectStats || !empty($options['collect_stats'])) { $options['http_stats_receiver'] = static function (array $transferStats) use(&$stats) { $stats = $transferStats; }; } elseif (isset($options['http_stats_receiver'])) { throw new \InvalidArgumentException('Providing a custom HTTP stats' . ' receiver to Aws\\WrappedHttpHandler is not supported.'); } return Promise\Create::promiseFor($fn($request, $options))->then(function (ResponseInterface $res) use($command, $request, &$stats) { return $this->parseResponse($command, $request, $res, $stats); }, function ($err) use($request, $command, &$stats) { if (\is_array($err)) { $err = $this->parseError($err, $request, $command, $stats); } return new Promise\RejectedPromise($err); }); } /** * @param CommandInterface $command * @param RequestInterface $request * @param ResponseInterface $response * @param array $stats * * @return ResultInterface */ private function parseResponse(CommandInterface $command, RequestInterface $request, ResponseInterface $response, array $stats) { $parser = $this->parser; $status = $response->getStatusCode(); $result = $status < 300 ? $parser($command, $response) : new Result(); $metadata = ['statusCode' => $status, 'effectiveUri' => (string) $request->getUri(), 'headers' => [], 'transferStats' => []]; if (!empty($stats)) { $metadata['transferStats']['http'] = [$stats]; } // Bring headers into the metadata array. foreach ($response->getHeaders() as $name => $values) { $metadata['headers'][\strtolower($name)] = $values[0]; } $result['@metadata'] = $metadata; return $result; } /** * Parses a rejection into an AWS error. * * @param array $err Rejection error array. * @param RequestInterface $request Request that was sent. * @param CommandInterface $command Command being sent. * @param array $stats Transfer statistics * * @return \Exception */ private function parseError(array $err, RequestInterface $request, CommandInterface $command, array $stats) { if (!isset($err['exception'])) { throw new \RuntimeException('The HTTP handler was rejected without an "exception" key value pair.'); } $serviceError = "AWS HTTP error: " . $err['exception']->getMessage(); if (!isset($err['response'])) { $parts = ['response' => null]; } else { try { $parts = \call_user_func($this->errorParser, $err['response'], $command); $serviceError .= " {$parts['code']} ({$parts['type']}): " . "{$parts['message']} - " . $err['response']->getBody(); } catch (ParserException $e) { $parts = []; $serviceError .= ' Unable to parse error information from ' . "response - {$e->getMessage()}"; } $parts['response'] = $err['response']; } $parts['exception'] = $err['exception']; $parts['request'] = $request; $parts['connection_error'] = !empty($err['connection_error']); $parts['transfer_stats'] = $stats; return new $this->exceptionClass(\sprintf('Error executing "%s" on "%s"; %s', $command->getName(), $request->getUri(), $serviceError), $command, $parts, $err['exception']); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/HashInterface.php000064400000001043147600374260022621 0ustar00algo = $algo; $this->options = $options; } public function update($data) { if ($this->hash !== null) { $this->reset(); } \hash_update($this->getContext(), $data); } public function complete() { if ($this->hash) { return $this->hash; } $this->hash = \hash_final($this->getContext(), \true); if (isset($this->options['base64']) && $this->options['base64']) { $this->hash = \base64_encode($this->hash); } return $this->hash; } public function reset() { $this->context = $this->hash = null; } /** * Get a hash context or create one if needed * * @return resource|\HashContext */ private function getContext() { if (!$this->context) { $key = isset($this->options['key']) ? $this->options['key'] : ''; $this->context = \hash_init($this->algo, $key ? \HASH_HMAC : 0, $key); } return $this->context; } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/ConfigurationProviderInterface.php000064400000000410147600374260026255 0ustar00 [], self::SIGN => [], self::BUILD => [], self::VALIDATE => [], self::INIT => []]; /** * @param callable $handler HTTP handler. */ public function __construct(callable $handler = null) { $this->handler = $handler; } /** * Dumps a string representation of the list. * * @return string */ public function __toString() { $str = ''; $i = 0; foreach (\array_reverse($this->steps) as $k => $step) { foreach (\array_reverse($step) as $j => $tuple) { $str .= "{$i}) Step: {$k}, "; if ($tuple[1]) { $str .= "Name: {$tuple[1]}, "; } $str .= "Function: " . $this->debugCallable($tuple[0]) . "\n"; $i++; } } if ($this->handler) { $str .= "{$i}) Handler: " . $this->debugCallable($this->handler) . "\n"; } return $str; } /** * Set the HTTP handler that actually returns a response. * * @param callable $handler Function that accepts a request and array of * options and returns a Promise. */ public function setHandler(callable $handler) { $this->handler = $handler; } /** * Returns true if the builder has a handler. * * @return bool */ public function hasHandler() { return (bool) $this->handler; } /** * Append a middleware to the init step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function appendInit(callable $middleware, $name = null) { $this->add(self::INIT, $name, $middleware); } /** * Prepend a middleware to the init step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function prependInit(callable $middleware, $name = null) { $this->add(self::INIT, $name, $middleware, \true); } /** * Append a middleware to the validate step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function appendValidate(callable $middleware, $name = null) { $this->add(self::VALIDATE, $name, $middleware); } /** * Prepend a middleware to the validate step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function prependValidate(callable $middleware, $name = null) { $this->add(self::VALIDATE, $name, $middleware, \true); } /** * Append a middleware to the build step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function appendBuild(callable $middleware, $name = null) { $this->add(self::BUILD, $name, $middleware); } /** * Prepend a middleware to the build step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function prependBuild(callable $middleware, $name = null) { $this->add(self::BUILD, $name, $middleware, \true); } /** * Append a middleware to the sign step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function appendSign(callable $middleware, $name = null) { $this->add(self::SIGN, $name, $middleware); } /** * Prepend a middleware to the sign step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function prependSign(callable $middleware, $name = null) { $this->add(self::SIGN, $name, $middleware, \true); } /** * Append a middleware to the attempt step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function appendAttempt(callable $middleware, $name = null) { $this->add(self::ATTEMPT, $name, $middleware); } /** * Prepend a middleware to the attempt step. * * @param callable $middleware Middleware function to add. * @param string $name Name of the middleware. */ public function prependAttempt(callable $middleware, $name = null) { $this->add(self::ATTEMPT, $name, $middleware, \true); } /** * Add a middleware before the given middleware by name. * * @param string|callable $findName Add before this * @param string $withName Optional name to give the middleware * @param callable $middleware Middleware to add. */ public function before($findName, $withName, callable $middleware) { $this->splice($findName, $withName, $middleware, \true); } /** * Add a middleware after the given middleware by name. * * @param string|callable $findName Add after this * @param string $withName Optional name to give the middleware * @param callable $middleware Middleware to add. */ public function after($findName, $withName, callable $middleware) { $this->splice($findName, $withName, $middleware, \false); } /** * Remove a middleware by name or by instance from the list. * * @param string|callable $nameOrInstance Middleware to remove. */ public function remove($nameOrInstance) { if (\is_callable($nameOrInstance)) { $this->removeByInstance($nameOrInstance); } elseif (\is_string($nameOrInstance)) { $this->removeByName($nameOrInstance); } } /** * Interpose a function between each middleware (e.g., allowing for a trace * through the middleware layers). * * The interpose function is a function that accepts a "step" argument as a * string and a "name" argument string. This function must then return a * function that accepts the next handler in the list. This function must * then return a function that accepts a CommandInterface and optional * RequestInterface and returns a promise that is fulfilled with an * Aws\ResultInterface or rejected with an Aws\Exception\AwsException * object. * * @param callable|null $fn Pass null to remove any previously set function */ public function interpose(callable $fn = null) { $this->sorted = null; $this->interposeFn = $fn; } /** * Compose the middleware and handler into a single callable function. * * @return callable */ public function resolve() { if (!($prev = $this->handler)) { throw new \LogicException('No handler has been specified'); } if ($this->sorted === null) { $this->sortMiddleware(); } foreach ($this->sorted as $fn) { $prev = $fn($prev); } return $prev; } /** * @return int */ #[\ReturnTypeWillChange] public function count() { return \count($this->steps[self::INIT]) + \count($this->steps[self::VALIDATE]) + \count($this->steps[self::BUILD]) + \count($this->steps[self::SIGN]) + \count($this->steps[self::ATTEMPT]); } /** * Splices a function into the middleware list at a specific position. * * @param $findName * @param $withName * @param callable $middleware * @param $before */ private function splice($findName, $withName, callable $middleware, $before) { if (!isset($this->named[$findName])) { throw new \InvalidArgumentException("{$findName} not found"); } $idx = $this->sorted = null; $step = $this->named[$findName]; if ($withName) { $this->named[$withName] = $step; } foreach ($this->steps[$step] as $i => $tuple) { if ($tuple[1] === $findName) { $idx = $i; break; } } $replacement = $before ? [$this->steps[$step][$idx], [$middleware, $withName]] : [[$middleware, $withName], $this->steps[$step][$idx]]; \array_splice($this->steps[$step], $idx, 1, $replacement); } /** * Provides a debug string for a given callable. * * @param array|callable $fn Function to write as a string. * * @return string */ private function debugCallable($fn) { if (\is_string($fn)) { return "callable({$fn})"; } if (\is_array($fn)) { $ele = \is_string($fn[0]) ? $fn[0] : \get_class($fn[0]); return "callable(['{$ele}', '{$fn[1]}'])"; } return 'callable(' . \spl_object_hash($fn) . ')'; } /** * Sort the middleware, and interpose if needed in the sorted list. */ private function sortMiddleware() { $this->sorted = []; if (!$this->interposeFn) { foreach ($this->steps as $step) { foreach ($step as $fn) { $this->sorted[] = $fn[0]; } } return; } $ifn = $this->interposeFn; // Interpose the interposeFn into the handler stack. foreach ($this->steps as $stepName => $step) { foreach ($step as $fn) { $this->sorted[] = $ifn($stepName, $fn[1]); $this->sorted[] = $fn[0]; } } } private function removeByName($name) { if (!isset($this->named[$name])) { return; } $this->sorted = null; $step = $this->named[$name]; $this->steps[$step] = \array_values(\array_filter($this->steps[$step], function ($tuple) use($name) { return $tuple[1] !== $name; })); } private function removeByInstance(callable $fn) { foreach ($this->steps as $k => $step) { foreach ($step as $j => $tuple) { if ($tuple[0] === $fn) { $this->sorted = null; unset($this->named[$this->steps[$k][$j][1]]); unset($this->steps[$k][$j]); } } } } /** * Add a middleware to a step. * * @param string $step Middleware step. * @param string $name Middleware name. * @param callable $middleware Middleware function to add. * @param bool $prepend Prepend instead of append. */ private function add($step, $name, callable $middleware, $prepend = \false) { $this->sorted = null; if ($prepend) { $this->steps[$step][] = [$middleware, $name]; } else { \array_unshift($this->steps[$step], [$middleware, $name]); } if ($name) { $this->named[$name] = $step; } } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/AbstractConfigurationProvider.php000064400000010541147600374260026126 0ustar00get($cacheKey); if ($found instanceof static::$interfaceClass) { return Promise\Create::promiseFor($found); } return $provider()->then(function ($config) use($cache, $cacheKey) { $cache->set($cacheKey, $config); return $config; }); }; } /** * Creates an aggregate configuration provider that invokes the provided * variadic providers one after the other until a provider returns * configuration. * * @return callable */ public static function chain() { $links = \func_get_args(); if (empty($links)) { throw new \InvalidArgumentException('No providers in chain'); } return function () use($links) { /** @var callable $parent */ $parent = \array_shift($links); $promise = $parent(); while ($next = \array_shift($links)) { $promise = $promise->otherwise($next); } return $promise; }; } /** * Gets the environment's HOME directory if available. * * @return null|string */ protected static function getHomeDir() { // On Linux/Unix-like systems, use the HOME environment variable if ($homeDir = \getenv('HOME')) { return $homeDir; } // Get the HOMEDRIVE and HOMEPATH values for Windows hosts $homeDrive = \getenv('HOMEDRIVE'); $homePath = \getenv('HOMEPATH'); return $homeDrive && $homePath ? $homeDrive . $homePath : null; } /** * Gets default config file location from environment, falling back to aws * default location * * @return string */ protected static function getDefaultConfigFilename() { if ($filename = \getenv(self::ENV_CONFIG_FILE)) { return $filename; } return self::getHomeDir() . '/.aws/config'; } /** * Wraps a config provider and caches previously provided configuration. * * @param callable $provider Config provider function to wrap. * * @return callable */ public static function memoize(callable $provider) { return function () use($provider) { static $result; static $isConstant; // Constant config will be returned constantly. if ($isConstant) { return $result; } // Create the initial promise that will be used as the cached value if (null === $result) { $result = $provider(); } // Return config and set flag that provider is already set return $result->then(function ($config) use(&$isConstant) { $isConstant = \true; return $config; }); }; } /** * Reject promise with standardized exception. * * @param $msg * @return Promise\RejectedPromise */ protected static function reject($msg) { $exceptionClass = static::$exceptionClass; return new Promise\RejectedPromise(new $exceptionClass($msg)); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/LruArrayCache.php000064400000004356147600374260022614 0ustar00maxItems = $maxItems; } public function get($key) { if (!isset($this->items[$key])) { return null; } $entry = $this->items[$key]; // Ensure the item is not expired. if (!$entry[1] || \time() < $entry[1]) { // LRU: remove the item and push it to the end of the array. unset($this->items[$key]); $this->items[$key] = $entry; return $entry[0]; } unset($this->items[$key]); return null; } public function set($key, $value, $ttl = 0) { // Only call time() if the TTL is not 0/false/null $ttl = $ttl ? \time() + $ttl : 0; $this->items[$key] = [$value, $ttl]; // Determine if there are more items in the cache than allowed. $diff = \count($this->items) - $this->maxItems; // Clear out least recently used items. if ($diff > 0) { // Reset to the beginning of the array and begin unsetting. \reset($this->items); for ($i = 0; $i < $diff; $i++) { unset($this->items[\key($this->items)]); \next($this->items); } } } public function remove($key) { unset($this->items[$key]); } /** * @return int */ #[\ReturnTypeWillChange] public function count() { return \count($this->items); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/EndpointParameterMiddleware.php000064400000005200147600374260025533 0ustar00nextHandler = $nextHandler; $this->service = $service; } public function __invoke(CommandInterface $command, RequestInterface $request) { $nextHandler = $this->nextHandler; $operation = $this->service->getOperation($command->getName()); if (!empty($operation['endpoint']['hostPrefix'])) { $prefix = $operation['endpoint']['hostPrefix']; // Captures endpoint parameters stored in the modeled host. // These are denoted by enclosure in braces, i.e. '{param}' \preg_match_all("/\\{([a-zA-Z0-9]+)}/", $prefix, $parameters); if (!empty($parameters[1])) { // Captured parameters without braces stored in $parameters[1], // which should correspond to members in the Command object foreach ($parameters[1] as $index => $parameter) { if (empty($command[$parameter])) { throw new \InvalidArgumentException("The parameter '{$parameter}' must be set and not empty."); } // Captured parameters with braces stored in $parameters[0], // which are replaced by their corresponding Command value $prefix = \str_replace($parameters[0][$index], $command[$parameter], $prefix); } } $uri = $request->getUri(); $host = $prefix . $uri->getHost(); if (!\VendorDuplicator\Aws\is_valid_hostname($host)) { throw new \InvalidArgumentException("The supplied parameters result in an invalid hostname: '{$host}'."); } $request = $request->withUri($uri->withHost($host)); } return $nextHandler($command, $request); } } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/AwsClientTrait.php000064400000005140147600374260023014 0ustar00getApi()->getPaginatorConfig($name); return new ResultPaginator($this, $name, $args, $config); } public function getIterator($name, array $args = []) { $config = $this->getApi()->getPaginatorConfig($name); if (!$config['result_key']) { throw new \UnexpectedValueException(\sprintf('There are no resources to iterate for the %s operation of %s', $name, $this->getApi()['serviceFullName'])); } $key = \is_array($config['result_key']) ? $config['result_key'][0] : $config['result_key']; if ($config['output_token'] && $config['input_token']) { return $this->getPaginator($name, $args)->search($key); } $result = $this->execute($this->getCommand($name, $args))->search($key); return new \ArrayIterator((array) $result); } public function waitUntil($name, array $args = []) { return $this->getWaiter($name, $args)->promise()->wait(); } public function getWaiter($name, array $args = []) { $config = isset($args['@waiter']) ? $args['@waiter'] : []; $config += $this->getApi()->getWaiterConfig($name); return new Waiter($this, $name, $args, $config); } public function execute(CommandInterface $command) { return $this->executeAsync($command)->wait(); } public function executeAsync(CommandInterface $command) { $handler = $command->getHandlerList()->resolve(); return $handler($command); } public function __call($name, array $args) { if (\substr($name, -5) === 'Async') { $name = \substr($name, 0, -5); $isAsync = \true; } if (!empty($this->aliases[\ucfirst($name)])) { $name = $this->aliases[\ucfirst($name)]; } $params = isset($args[0]) ? $args[0] : []; if (!empty($isAsync)) { return $this->executeAsync($this->getCommand($name, $params)); } return $this->execute($this->getCommand($name, $params)); } /** * @param string $name * @param array $args * * @return CommandInterface */ public abstract function getCommand($name, array $args = []); /** * @return Service */ public abstract function getApi(); } addons/amazons3addon/vendor-prefixed/aws/aws-sdk-php/src/AwsClient.php000064400000060410147600374260022011 0ustar00parseClass(); if (!isset($args['service'])) { $args['service'] = manifest($service)['endpoint']; } if (!isset($args['exception_class'])) { $args['exception_class'] = $exceptionClass; } $this->handlerList = new HandlerList(); $resolver = new ClientResolver(static::getArguments()); $config = $resolver->resolve($args, $this->handlerList); $this->api = $config['api']; $this->signatureProvider = $config['signature_provider']; $this->endpoint = new Uri($config['endpoint']); $this->credentialProvider = $config['credentials']; $this->tokenProvider = $config['token']; $this->region = isset($config['region']) ? $config['region'] : null; $this->config = $config['config']; $this->setClientBuiltIns($args); $this->clientContextParams = $this->setClientContextParams($args); $this->defaultRequestOptions = $config['http']; $this->endpointProvider = $config['endpoint_provider']; $this->serializer = $config['serializer']; $this->addSignatureMiddleware(); $this->addInvocationId(); $this->addEndpointParameterMiddleware($args); $this->addEndpointDiscoveryMiddleware($config, $args); $this->addRequestCompressionMiddleware($config); $this->loadAliases(); $this->addStreamRequestPayload(); $this->addRecursionDetection(); $this->addRequestBuilder(); if (!$config['suppress_php_deprecation_warning']) { $this->emitDeprecationWarning(); } if (isset($args['with_resolved'])) { $args['with_resolved']($config); } } public function getHandlerList() { return $this->handlerList; } public function getConfig($option = null) { return $option === null ? $this->config : (isset($this->config[$option]) ? $this->config[$option] : null); } public function getCredentials() { $fn = $this->credentialProvider; return $fn(); } public function getEndpoint() { return $this->endpoint; } public function getRegion() { return $this->region; } public function getApi() { return $this->api; } public function getCommand($name, array $args = []) { // Fail fast if the command cannot be found in the description. if (!isset($this->getApi()['operations'][$name])) { $name = \ucfirst($name); if (!isset($this->getApi()['operations'][$name])) { throw new \InvalidArgumentException("Operation not found: {$name}"); } } if (!isset($args['@http'])) { $args['@http'] = $this->defaultRequestOptions; } else { $args['@http'] += $this->defaultRequestOptions; } return new Command($name, $args, clone $this->getHandlerList()); } public function getEndpointProvider() { return $this->endpointProvider; } /** * Provides the set of service context parameter * key-value pairs used for endpoint resolution. * * @return array */ public function getClientContextParams() { return $this->clientContextParams; } /** * Provides the set of built-in keys and values * used for endpoint resolution * * @return array */ public function getClientBuiltIns() { return $this->clientBuiltIns; } public function __sleep() { throw new \RuntimeException('Instances of ' . static::class . ' cannot be serialized'); } /** * Get the signature_provider function of the client. * * @return callable */ public final function getSignatureProvider() { return $this->signatureProvider; } /** * Parse the class name and setup the custom exception class of the client * and return the "service" name of the client and "exception_class". * * @return array */ private function parseClass() { $klass = \get_class($this); if ($klass === __CLASS__) { return ['', AwsException::class]; } $service = \substr($klass, \strrpos($klass, '\\') + 1, -6); return [\strtolower($service), "VendorDuplicator\\Aws\\{$service}\\Exception\\{$service}Exception"]; } private function addEndpointParameterMiddleware($args) { if (empty($args['disable_host_prefix_injection'])) { $list = $this->getHandlerList(); $list->appendBuild(EndpointParameterMiddleware::wrap($this->api), 'endpoint_parameter'); } } private function addEndpointDiscoveryMiddleware($config, $args) { $list = $this->getHandlerList(); if (!isset($args['endpoint'])) { $list->appendBuild(EndpointDiscoveryMiddleware::wrap($this, $args, $config['endpoint_discovery']), 'EndpointDiscoveryMiddleware'); } } private function addSignatureMiddleware() { $api = $this->getApi(); $provider = $this->signatureProvider; $version = $this->config['signature_version']; $name = $this->config['signing_name']; $region = $this->config['signing_region']; $resolver = static function (CommandInterface $c) use($api, $provider, $name, $region, $version) { if (!empty($c['@context']['signing_region'])) { $region = $c['@context']['signing_region']; } if (!empty($c['@context']['signing_service'])) { $name = $c['@context']['signing_service']; } $authType = $api->getOperation($c->getName())['authtype']; switch ($authType) { case 'none': $version = 'anonymous'; break; case 'v4-unsigned-body': $version = 'v4-unsigned-body'; break; case 'bearer': $version = 'bearer'; break; } if (isset($c['@context']['signature_version'])) { if ($c['@context']['signature_version'] == 'v4a') { $version = 'v4a'; } } if (!empty($endpointAuthSchemes = $c->getAuthSchemes())) { $version = $endpointAuthSchemes['version']; $name = isset($endpointAuthSchemes['name']) ? $endpointAuthSchemes['name'] : $name; $region = isset($endpointAuthSchemes['region']) ? $endpointAuthSchemes['region'] : $region; } return SignatureProvider::resolve($provider, $version, $name, $region); }; $this->handlerList->appendSign(Middleware::signer($this->credentialProvider, $resolver, $this->tokenProvider), 'signer'); } private function addRequestCompressionMiddleware($config) { if (empty($config['disable_request_compression'])) { $list = $this->getHandlerList(); $list->appendBuild(RequestCompressionMiddleware::wrap($config), 'request-compression'); } } private function addInvocationId() { // Add invocation id to each request $this->handlerList->prependSign(Middleware::invocationId(), 'invocation-id'); } private function loadAliases($file = null) { if (!isset($this->aliases)) { if (\is_null($file)) { $file = __DIR__ . '/data/aliases.json'; } $aliases = \VendorDuplicator\Aws\load_compiled_json($file); $serviceId = $this->api->getServiceId(); $version = $this->getApi()->getApiVersion(); if (!empty($aliases['operations'][$serviceId][$version])) { $this->aliases = \array_flip($aliases['operations'][$serviceId][$version]); } } } private function addStreamRequestPayload() { $streamRequestPayloadMiddleware = StreamRequestPayloadMiddleware::wrap($this->api); $this->handlerList->prependSign($streamRequestPayloadMiddleware, 'StreamRequestPayloadMiddleware'); } private function addRecursionDetection() { // Add recursion detection header to requests // originating in supported Lambda runtimes $this->handlerList->appendBuild(Middleware::recursionDetection(), 'recursion-detection'); } /** * Adds the `builder` middleware such that a client's endpoint * provider and endpoint resolution arguments can be passed. */ private function addRequestBuilder() { $handlerList = $this->getHandlerList(); $serializer = $this->serializer; $endpointProvider = $this->endpointProvider; $endpointArgs = $this->getEndpointProviderArgs(); $handlerList->prependBuild(Middleware::requestBuilder($serializer, $endpointProvider, $endpointArgs), 'builderV2'); } /** * Retrieves client context param definition from service model, * creates mapping of client context param names with client-provided * values. * * @return array */ private function setClientContextParams($args) { $api = $this->getApi(); $resolvedParams = []; if (!empty($paramDefinitions = $api->getClientContextParams())) { foreach ($paramDefinitions as $paramName => $paramValue) { if (isset($args[$paramName])) { $result[$paramName] = $args[$paramName]; } } } return $resolvedParams; } /** * Retrieves and sets default values used for endpoint resolution. */ private function setClientBuiltIns($args) { $builtIns = []; $config = $this->getConfig(); $service = $args['service']; $builtIns['SDK::Endpoint'] = isset($args['endpoint']) ? $args['endpoint'] : null; $builtIns['AWS::Region'] = $this->getRegion(); $builtIns['AWS::UseFIPS'] = $config['use_fips_endpoint']->isUseFipsEndpoint(); $builtIns['AWS::UseDualStack'] = $config['use_dual_stack_endpoint']->isUseDualstackEndpoint(); if ($service === 's3' || $service === 's3control') { $builtIns['AWS::S3::UseArnRegion'] = $config['use_arn_region']->isUseArnRegion(); } if ($service === 's3') { $builtIns['AWS::S3::UseArnRegion'] = $config['use_arn_region']->isUseArnRegion(); $builtIns['AWS::S3::Accelerate'] = $config['use_accelerate_endpoint']; $builtIns['AWS::S3::ForcePathStyle'] = $config['use_path_style_endpoint']; $builtIns['AWS::S3::DisableMultiRegionAccessPoints'] = $config['disable_multiregion_access_points']; } $this->clientBuiltIns += $builtIns; } /** * Retrieves arguments to be used in endpoint resolution. * * @return array */ public function getEndpointProviderArgs() { return $this->normalizeEndpointProviderArgs(); } /** * Combines built-in and client context parameter values in * order of specificity. Client context parameter values supersede * built-in values. * * @return array */ private function normalizeEndpointProviderArgs() { $normalizedBuiltIns = []; foreach ($this->clientBuiltIns as $name => $value) { $normalizedName = \explode('::', $name); $normalizedName = $normalizedName[\count($normalizedName) - 1]; $normalizedBuiltIns[$normalizedName] = $value; } return \array_merge($normalizedBuiltIns, $this->getClientContextParams()); } protected function isUseEndpointV2() { return $this->endpointProvider instanceof EndpointProviderV2; } public static function emitDeprecationWarning() { $phpVersion = \PHP_VERSION_ID; if ($phpVersion < 70205) { $phpVersionString = \phpversion(); @\trigger_error("This installation of the SDK is using PHP version" . " {$phpVersionString}, which will be deprecated on August" . " 15th, 2023. Please upgrade your PHP version to a minimum of" . " 7.2.5 before then to continue receiving updates to the AWS" . " SDK for PHP. To disable this warning, set" . " suppress_php_deprecation_warning to true on the client constructor" . " or set the environment variable AWS_SUPPRESS_PHP_DEPRECATION_WARNING" . " to true.", \E_USER_DEPRECATED); } } /** * Returns a service model and doc model with any necessary changes * applied. * * @param array $api Array of service data being documented. * @param array $docs Array of doc model data. * * @return array Tuple containing a [Service, DocModel] * * @internal This should only used to document the service API. * @codeCoverageIgnore */ public static function applyDocFilters(array $api, array $docs) { $aliases = \VendorDuplicator\Aws\load_compiled_json(__DIR__ . '/data/aliases.json'); $serviceId = $api['metadata']['serviceId']; $version = $api['metadata']['apiVersion']; // Replace names for any operations with SDK aliases if (!empty($aliases['operations'][$serviceId][$version])) { foreach ($aliases['operations'][$serviceId][$version] as $op => $alias) { $api['operations'][$alias] = $api['operations'][$op]; $docs['operations'][$alias] = $docs['operations'][$op]; unset($api['operations'][$op], $docs['operations'][$op]); } } \ksort($api['operations']); return [new Service($api, ApiProvider::defaultProvider()), new DocModel($docs)]; } /** * @deprecated * @return static */ public static function factory(array $config = []) { return new static($config); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php000064400000005231147600374260024607 0ustar00filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; if (\file_exists($cookieFile)) { $this->load($cookieFile); } } /** * Saves the file when shutting down */ public function __destruct() { $this->save($this->filename); } /** * Saves the cookies to a file. * * @param string $filename File to save * @throws \RuntimeException if the file cannot be found or created */ public function save($filename) { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $jsonStr = \VendorDuplicator\GuzzleHttp\json_encode($json); if (\false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } /** * Load cookies from a JSON formatted file. * * Old cookies are kept unless overwritten by newly loaded ones. * * @param string $filename Cookie file to load. * @throws \RuntimeException if the file cannot be loaded. */ public function load($filename) { $json = \file_get_contents($filename); if (\false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); } elseif ($json === '') { return; } $data = \VendorDuplicator\GuzzleHttp\json_decode($json, \true); if (\is_array($data)) { foreach (\json_decode($json, \true) as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php000064400000024257147600374260024037 0ustar00 null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => \false, 'Discard' => \false, 'HttpOnly' => \false]; /** @var array Cookie data */ private $data; /** * Create a new SetCookie object from a string * * @param string $cookie Set-Cookie header string * * @return self */ public static function fromString($cookie) { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. if (empty($pieces[0]) || !\strpos($pieces[0], '=')) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { $cookieParts = \explode('=', $part, 2); $key = \trim($cookieParts[0]); $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\x00\v") : \true; // Only check for non-cookies when cookies have been found if (empty($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { foreach (\array_keys(self::$defaults) as $search) { if (!\strcasecmp($search, $key)) { $data[$search] = $value; continue 2; } } $data[$key] = $value; } } return new self($data); } /** * @param array $data Array of cookie data provided by a Cookie parser */ public function __construct(array $data = []) { $this->data = \array_replace(self::$defaults, $data); // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date $this->setExpires(\time() + $this->getMaxAge()); } elseif ($this->getExpires() && !\is_numeric($this->getExpires())) { $this->setExpires($this->getExpires()); } } public function __toString() { $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== \false) { if ($k === 'Expires') { $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; '; } else { $str .= ($v === \true ? $k : "{$k}={$v}") . '; '; } } } return \rtrim($str, '; '); } public function toArray() { return $this->data; } /** * Get the cookie name * * @return string */ public function getName() { return $this->data['Name']; } /** * Set the cookie name * * @param string $name Cookie name */ public function setName($name) { $this->data['Name'] = $name; } /** * Get the cookie value * * @return string */ public function getValue() { return $this->data['Value']; } /** * Set the cookie value * * @param string $value Cookie value */ public function setValue($value) { $this->data['Value'] = $value; } /** * Get the domain * * @return string|null */ public function getDomain() { return $this->data['Domain']; } /** * Set the domain of the cookie * * @param string $domain */ public function setDomain($domain) { $this->data['Domain'] = $domain; } /** * Get the path * * @return string */ public function getPath() { return $this->data['Path']; } /** * Set the path of the cookie * * @param string $path Path of the cookie */ public function setPath($path) { $this->data['Path'] = $path; } /** * Maximum lifetime of the cookie in seconds * * @return int|null */ public function getMaxAge() { return $this->data['Max-Age']; } /** * Set the max-age of the cookie * * @param int $maxAge Max age of the cookie in seconds */ public function setMaxAge($maxAge) { $this->data['Max-Age'] = $maxAge; } /** * The UNIX timestamp when the cookie Expires * * @return mixed */ public function getExpires() { return $this->data['Expires']; } /** * Set the unix timestamp for which the cookie will expire * * @param int $timestamp Unix timestamp */ public function setExpires($timestamp) { $this->data['Expires'] = \is_numeric($timestamp) ? (int) $timestamp : \strtotime($timestamp); } /** * Get whether or not this is a secure cookie * * @return bool|null */ public function getSecure() { return $this->data['Secure']; } /** * Set whether or not the cookie is secure * * @param bool $secure Set to true or false if secure */ public function setSecure($secure) { $this->data['Secure'] = $secure; } /** * Get whether or not this is a session cookie * * @return bool|null */ public function getDiscard() { return $this->data['Discard']; } /** * Set whether or not this is a session cookie * * @param bool $discard Set to true or false if this is a session cookie */ public function setDiscard($discard) { $this->data['Discard'] = $discard; } /** * Get whether or not this is an HTTP only cookie * * @return bool */ public function getHttpOnly() { return $this->data['HttpOnly']; } /** * Set whether or not this is an HTTP only cookie * * @param bool $httpOnly Set to true or false if this is HTTP only */ public function setHttpOnly($httpOnly) { $this->data['HttpOnly'] = $httpOnly; } /** * Check if the cookie matches a path value. * * A request-path path-matches a given cookie-path if at least one of * the following conditions holds: * * - The cookie-path and the request-path are identical. * - The cookie-path is a prefix of the request-path, and the last * character of the cookie-path is %x2F ("/"). * - The cookie-path is a prefix of the request-path, and the first * character of the request-path that is not included in the cookie- * path is a %x2F ("/") character. * * @param string $requestPath Path to check against * * @return bool */ public function matchesPath($requestPath) { $cookiePath = $this->getPath(); // Match on exact matches or when path is the default empty "/" if ($cookiePath === '/' || $cookiePath == $requestPath) { return \true; } // Ensure that the cookie-path is a prefix of the request path. if (0 !== \strpos($requestPath, $cookiePath)) { return \false; } // Match if the last character of the cookie-path is "/" if (\substr($cookiePath, -1, 1) === '/') { return \true; } // Match if the first character not included in cookie path is "/" return \substr($requestPath, \strlen($cookiePath), 1) === '/'; } /** * Check if the cookie matches a domain value * * @param string $domain Domain to check against * * @return bool */ public function matchesDomain($domain) { $cookieDomain = $this->getDomain(); if (null === $cookieDomain) { return \true; } // Remove the leading '.' as per spec in RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.2.3 $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); $domain = \strtolower($domain); // Domain not set or exact match. if ('' === $cookieDomain || $domain === $cookieDomain) { return \true; } // Matching the subdomain according to RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.1.3 if (\filter_var($domain, \FILTER_VALIDATE_IP)) { return \false; } return (bool) \preg_match('/\\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); } /** * Check if the cookie is expired * * @return bool */ public function isExpired() { return $this->getExpires() !== null && \time() > $this->getExpires(); } /** * Check if the cookie is valid according to RFC 6265 * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { // Names must not be empty, but can be 0 $name = $this->getName(); if (empty($name) && !\is_numeric($name)) { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name if (\preg_match('/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/', $name)) { return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\\"/?={}'; } // Value must not be empty, but can be 0 $value = $this->getValue(); if (empty($value) && !\is_numeric($value)) { return 'The cookie value must not be empty'; } // Domains must not be empty, but can be 0 // A "0" is not a valid internet domain, but may be used as server name // in a private network. $domain = $this->getDomain(); if (empty($domain) && !\is_numeric($domain)) { return 'The cookie domain must not be empty'; } return \true; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php000064400000021520147600374260024006 0ustar00strictMode = $strictMode; foreach ($cookieArray as $cookie) { if (!$cookie instanceof SetCookie) { $cookie = new SetCookie($cookie); } $this->setCookie($cookie); } } /** * Create a new Cookie jar from an associative array and domain. * * @param array $cookies Cookies to create the jar from * @param string $domain Domain to set the cookies to * * @return self */ public static function fromArray(array $cookies, $domain) { $cookieJar = new self(); foreach ($cookies as $name => $value) { $cookieJar->setCookie(new SetCookie(['Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => \true])); } return $cookieJar; } /** * @deprecated */ public static function getCookieValue($value) { return $value; } /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * * @param SetCookie $cookie Being evaluated. * @param bool $allowSessionCookies If we should persist session cookies * @return bool */ public static function shouldPersist(SetCookie $cookie, $allowSessionCookies = \false) { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return \true; } } return \false; } /** * Finds and returns the cookie based on the name * * @param string $name cookie name to search for * @return SetCookie|null cookie that was found or null if not found */ public function getCookieByName($name) { // don't allow a non string name if ($name === null || !\is_scalar($name)) { return null; } foreach ($this->cookies as $cookie) { if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } return null; } public function toArray() { return \array_map(function (SetCookie $cookie) { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } public function clear($domain = null, $path = null, $name = null) { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($domain) { return !$cookie->matchesDomain($domain); }); } elseif (!$name) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain) { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } else { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } } public function clearSessionCookies() { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) { return !$cookie->getDiscard() && $cookie->getExpires(); }); } public function setCookie(SetCookie $cookie) { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. $name = $cookie->getName(); if (!$name && $name !== '0') { return \false; } // Only allow cookies with set and valid domain, name, value $result = $cookie->validate(); if ($result !== \true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: ' . $result); } else { $this->removeCookieIfEmpty($cookie); return \false; } } // Resolve conflicts with previously set cookies foreach ($this->cookies as $i => $c) { // Two cookies are identical, when their path, and domain are // identical. if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName()) { continue; } // The previously set cookie is a discard cookie and this one is // not so allow the new cookie to be set if (!$cookie->getDiscard() && $c->getDiscard()) { unset($this->cookies[$i]); continue; } // If the new cookie's expiration is further into the future, then // replace the old cookie if ($cookie->getExpires() > $c->getExpires()) { unset($this->cookies[$i]); continue; } // If the value has changed, we better change it if ($cookie->getValue() !== $c->getValue()) { unset($this->cookies[$i]); continue; } // The cookie exists, so no need to continue return \false; } $this->cookies[] = $cookie; return \true; } public function count() { return \count($this->cookies); } public function getIterator() { return new \ArrayIterator(\array_values($this->cookies)); } public function extractCookies(RequestInterface $request, ResponseInterface $response) { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } if (!$sc->matchesDomain($request->getUri()->getHost())) { continue; } // Note: At this point `$sc->getDomain()` being a public suffix should // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } } /** * Computes cookie path following RFC 6265 section 5.1.4 * * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 * * @param RequestInterface $request * @return string */ private function getCookiePathFromRequest(RequestInterface $request) { $uriPath = $request->getUri()->getPath(); if ('' === $uriPath) { return '/'; } if (0 !== \strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } if (0 === ($lastSlashPos = \strrpos($uriPath, '/'))) { return '/'; } return \substr($uriPath, 0, $lastSlashPos); } public function withCookieHeader(RequestInterface $request) { $values = []; $uri = $request->getUri(); $scheme = $uri->getScheme(); $host = $uri->getHost(); $path = $uri->getPath() ?: '/'; foreach ($this->cookies as $cookie) { if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https')) { $values[] = $cookie->getName() . '=' . $cookie->getValue(); } } return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. * * @param SetCookie $cookie */ private function removeCookieIfEmpty(SetCookie $cookie) { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { $this->clear($cookie->getDomain(), $cookie->getPath(), $cookie->getName()); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php000064400000003654147600374260025362 0ustar00sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); } /** * Saves cookies to session when shutting down */ public function __destruct() { $this->save(); } /** * Save cookies to the client session */ public function save() { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $_SESSION[$this->sessionKey] = \json_encode($json); } /** * Load the contents of the client session into the data array */ protected function load() { if (!isset($_SESSION[$this->sessionKey])) { return; } $data = \json_decode($_SESSION[$this->sessionKey], \true); if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie data"); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php000064400000005411147600374260025630 0ustar00stream = $stream; $msg = $msg ?: 'Could not seek the stream to position ' . $pos; parent::__construct($msg); } /** * @return StreamInterface */ public function getStream() { return $this->stream; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php000064400000001403147600374260026747 0ustar00getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; $this->handlerContext = $handlerContext; } /** * Wrap non-RequestExceptions with a RequestException * * @param RequestInterface $request * @param \Exception $e * * @return RequestException */ public static function wrapException(RequestInterface $request, \Exception $e) { return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request * @param ResponseInterface $response Response received * @param \Exception $previous Previous exception * @param array $ctx Optional handler context. * * @return self */ public static function create(RequestInterface $request, ResponseInterface $response = null, \Exception $previous = null, array $ctx = []) { if (!$response) { return new self('Error completing request', $request, null, $previous, $ctx); } $level = (int) \floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; } elseif ($level === 5) { $label = 'Server error'; $className = ServerException::class; } else { $label = 'Unsuccessful request'; $className = __CLASS__; } $uri = $request->getUri(); $uri = static::obfuscateUri($uri); // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) $message = \sprintf('%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri, $response->getStatusCode(), $response->getReasonPhrase()); $summary = static::getResponseBodySummary($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } return new $className($message, $request, $response, $previous, $ctx); } /** * Get a short summary of the response * * Will return `null` if the response is not printable. * * @param ResponseInterface $response * * @return string|null */ public static function getResponseBodySummary(ResponseInterface $response) { return \VendorDuplicator\GuzzleHttp\Psr7\get_message_body_summary($response); } /** * Obfuscates URI if there is a username and a password present * * @param UriInterface $uri * * @return UriInterface */ private static function obfuscateUri(UriInterface $uri) { $userInfo = $uri->getUserInfo(); if (\false !== ($pos = \strpos($userInfo, ':'))) { return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); } return $uri; } /** * Get the request that caused the exception * * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Get the associated response * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Check if a response was received * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. * * @return array */ public function getHandlerContext() { return $this->handlerContext; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php000064400000000751147600374260026027 0ustar00headers)) { throw new \RuntimeException('No headers have been received'); } // HTTP-version SP status-code SP reason-phrase $startLine = \explode(' ', \array_shift($this->headers), 3); $headers = \VendorDuplicator\GuzzleHttp\headers_from_lines($this->headers); $normalizedKeys = \VendorDuplicator\GuzzleHttp\normalize_header_keys($headers); if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } } // Attach a response to the easy handle with the parsed headers. $this->response = new Response($startLine[1], $headers, $this->sink, \substr($startLine[0], 5), isset($startLine[2]) ? (string) $startLine[2] : null); } public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php000064400000013520147600374260024474 0ustar00onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { \call_user_func_array([$this, 'append'], $queue); } } public function __invoke(RequestInterface $request, array $options) { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } if (isset($options['delay']) && \is_numeric($options['delay'])) { \usleep($options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; $response = \array_shift($this->queue); if (isset($options['on_headers'])) { if (!\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $response = new RequestException($msg, $request, $response, $e); } } if (\is_callable($response)) { $response = \call_user_func($response, $request, $options); } $response = $response instanceof \Exception ? \VendorDuplicator\GuzzleHttp\Promise\rejection_for($response) : \VendorDuplicator\GuzzleHttp\Promise\promise_for($response); return $response->then(function ($value) use($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value); } if (isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; if (\is_resource($sink)) { \fwrite($sink, $contents); } elseif (\is_string($sink)) { \file_put_contents($sink, $contents); } elseif ($sink instanceof \VendorDuplicator\Psr\Http\Message\StreamInterface) { $sink->write($contents); } } return $value; }, function ($reason) use($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { \call_user_func($this->onRejected, $reason); } return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); } /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. */ public function append() { foreach (\func_get_args() as $value) { if ($value instanceof ResponseInterface || $value instanceof \Exception || $value instanceof PromiseInterface || \is_callable($value)) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected a response or ' . 'exception. Found ' . \VendorDuplicator\GuzzleHttp\describe_type($value)); } } } /** * Get the last received request. * * @return RequestInterface */ public function getLastRequest() { return $this->lastRequest; } /** * Get the last received request options. * * @return array */ public function getLastOptions() { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. * * @return int */ public function count() { return \count($this->queue); } public function reset() { $this->queue = []; } private function invokeStats(RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null) { if (isset($options['on_stats'])) { $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; $stats = new TransferStats($request, $response, $transferTime, $reason); \call_user_func($options['on_stats'], $stats); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php000064400000003273147600374260023432 0ustar00withoutHeader('Expect'); // Append a content-length header if body size is zero to match // cURL's behavior. if (0 === $request->getBody()->getSize()) { $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse($request, $options, $this->createStream($request, $options), $startTime); } catch (\InvalidArgumentException $e) { throw $e; } catch (\Exception $e) { // Determine if the error was a networking error. $message = $e->getMessage(); // This list can probably get more comprehensive. if (\strpos($message, 'getaddrinfo') || \strpos($message, 'Connection refused') || \strpos($message, "couldn't connect to host") || \strpos($message, "connection attempt failed")) { $e = new ConnectException($e->getMessage(), $request, $e); } $e = RequestException::wrapException($request, $e); $this->invokeStats($options, $request, $startTime, null, $e); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($e); } } private function invokeStats(array $options, RequestInterface $request, $startTime, ResponseInterface $response = null, $error = null) { if (isset($options['on_stats'])) { $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); \call_user_func($options['on_stats'], $stats); } } private function createResponse(RequestInterface $request, array $options, $stream, $startTime) { $hdrs = $this->lastHeaders; $this->lastHeaders = []; $parts = \explode(' ', \array_shift($hdrs), 3); $ver = \explode('/', $parts[0])[1]; $status = $parts[1]; $reason = isset($parts[2]) ? $parts[2] : null; $headers = \VendorDuplicator\GuzzleHttp\headers_from_lines($hdrs); list($stream, $headers) = $this->checkDecode($options, $headers, $stream); $stream = Psr7\stream_for($stream); $sink = $stream; if (\strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $ex = new RequestException($msg, $request, $response, $e); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($ex); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); } $this->invokeStats($options, $request, $startTime, $response, null); return new FulfilledPromise($response); } private function createSink(StreamInterface $stream, array $options) { if (!empty($options['stream'])) { return $stream; } $sink = isset($options['sink']) ? $options['sink'] : \fopen('php://temp', 'r+'); return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\stream_for($sink); } private function checkDecode(array $options, array $headers, $stream) { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { $normalizedKeys = \VendorDuplicator\GuzzleHttp\normalize_header_keys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { $stream = new Psr7\InflateStream(Psr7\stream_for($stream)); $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); // Fix content-length header if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); } else { $headers[$normalizedKeys['content-length']] = [$length]; } } } } } return [$stream, $headers]; } /** * Drains the source stream into the "sink" client option. * * @param StreamInterface $source * @param StreamInterface $sink * @param string $contentLength Header specifying the amount of * data to read. * * @return StreamInterface * @throws \RuntimeException when the sink option is invalid. */ private function drain(StreamInterface $source, StreamInterface $sink, $contentLength) { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. Psr7\copy_to_stream($source, $sink, \strlen($contentLength) > 0 && (int) $contentLength > 0 ? (int) $contentLength : -1); $sink->seek(0); $source->close(); return $sink; } /** * Create a resource and check to ensure it was created successfully * * @param callable $callback Callable that returns stream resource * * @return resource * @throws \RuntimeException on error */ private function createResource(callable $callback) { $errors = null; \set_error_handler(function ($_, $msg, $file, $line) use(&$errors) { $errors[] = ['message' => $msg, 'file' => $file, 'line' => $line]; return \true; }); $resource = $callback(); \restore_error_handler(); if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { $message .= "[{$key}] {$value}" . \PHP_EOL; } } throw new \RuntimeException(\trim($message)); } return $resource; } private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { $methods = \array_flip(\get_class_methods(__CLASS__)); } // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection')) { $request = $request->withHeader('Connection', 'close'); } // Ensure SSL is verified by default if (!isset($options['verify'])) { $options['verify'] = \true; } $params = []; $context = $this->getDefaultContext($request); if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } if (!empty($options)) { foreach ($options as $key => $value) { $method = "add_{$key}"; if (isset($methods[$method])) { $this->{$method}($request, $context, $value, $params); } } } if (isset($options['stream_context'])) { if (!\is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } $context = \array_replace_recursive($context, $options['stream_context']); } // Microsoft NTLM authentication only supported with curl handler if (isset($options['auth']) && \is_array($options['auth']) && isset($options['auth'][2]) && 'ntlm' == $options['auth'][2]) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); $context = $this->createResource(function () use($context, $params) { return \stream_context_create($context, $params); }); return $this->createResource(function () use($uri, &$http_response_header, $context, $options) { $resource = \fopen((string) $uri, 'r', null, $context); $this->lastHeaders = $http_response_header; if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; \stream_set_timeout($resource, $sec, $usec); } return $resource; }); } private function resolveHost(RequestInterface $request, array $options) { $uri = $request->getUri(); if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_A); if (!isset($records[0]['ip'])) { throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost($records[0]['ip']); } elseif ('v6' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_AAAA); if (!isset($records[0]['ipv6'])) { throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); } } return $uri; } private function getDefaultContext(RequestInterface $request) { $headers = ''; foreach ($request->getHeaders() as $name => $value) { foreach ($value as $val) { $headers .= "{$name}: {$val}\r\n"; } } $context = ['http' => ['method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => \true, 'follow_location' => 0]]; $body = (string) $request->getBody(); if (!empty($body)) { $context['http']['content'] = $body; // Prevent the HTTP handler from adding a Content-Type header. if (!$request->hasHeader('Content-Type')) { $context['http']['header'] .= "Content-Type:\r\n"; } } $context['http']['header'] = \rtrim($context['http']['header']); return $context; } private function add_proxy(RequestInterface $request, &$options, $value, &$params) { if (!\is_array($value)) { $options['http']['proxy'] = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { if (!isset($value['no']) || !\VendorDuplicator\GuzzleHttp\is_host_in_noproxy($request->getUri()->getHost(), $value['no'])) { $options['http']['proxy'] = $value[$scheme]; } } } } private function add_timeout(RequestInterface $request, &$options, $value, &$params) { if ($value > 0) { $options['http']['timeout'] = $value; } } private function add_verify(RequestInterface $request, &$options, $value, &$params) { if ($value === \true) { // PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert. if (\PHP_VERSION_ID < 50600) { $options['ssl']['cafile'] = \VendorDuplicator\GuzzleHttp\default_ca_bundle(); } } elseif (\is_string($value)) { $options['ssl']['cafile'] = $value; if (!\file_exists($value)) { throw new \RuntimeException("SSL CA bundle not found: {$value}"); } } elseif ($value === \false) { $options['ssl']['verify_peer'] = \false; $options['ssl']['verify_peer_name'] = \false; return; } else { throw new \InvalidArgumentException('Invalid verify request option'); } $options['ssl']['verify_peer'] = \true; $options['ssl']['verify_peer_name'] = \true; $options['ssl']['allow_self_signed'] = \false; } private function add_cert(RequestInterface $request, &$options, $value, &$params) { if (\is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } if (!\file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } private function add_progress(RequestInterface $request, &$options, $value, &$params) { $this->addNotification($params, function ($code, $a, $b, $c, $transferred, $total) use($value) { if ($code == \STREAM_NOTIFY_PROGRESS) { $value($total, $transferred, null, null); } }); } private function add_debug(RequestInterface $request, &$options, $value, &$params) { if ($value === \false) { return; } static $map = [\STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE']; static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; $value = \VendorDuplicator\GuzzleHttp\debug_resource($value); $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); $this->addNotification($params, function () use($ident, $value, $map, $args) { $passed = \func_get_args(); $code = \array_shift($passed); \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); foreach (\array_filter($passed) as $i => $v) { \fwrite($value, $args[$i] . ': "' . $v . '" '); } \fwrite($value, "\n"); }); } private function addNotification(array &$params, callable $notify) { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { $params['notification'] = $this->callArray([$params['notification'], $notify]); } } private function callArray(array $functions) { return function () use($functions) { $args = \func_get_args(); foreach ($functions as $fn) { \call_user_func_array($fn, $args); } }; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php000064400000047765147600374260024564 0ustar00maxHandles = $maxHandles; } public function create(RequestInterface $request, array $options) { if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; unset($options['curl']['body_as_string']); } $easy = new EasyHandle(); $easy->request = $request; $easy->options = $options; $conf = $this->getDefaultConf($easy); $this->applyMethod($easy, $conf); $this->applyHandlerOptions($easy, $conf); $this->applyHeaders($easy, $conf); unset($conf['_headers']); // Add handler options from the request configuration options if (isset($options['curl'])) { $conf = \array_replace($conf, $options['curl']); } $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); \curl_setopt_array($easy->handle, $conf); return $easy; } public function release(EasyHandle $easy) { $resource = $easy->handle; unset($easy->handle); if (\count($this->handles) >= $this->maxHandles) { \curl_close($resource); } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); \curl_setopt($resource, \CURLOPT_READFUNCTION, null); \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); \curl_reset($resource); $this->handles[] = $resource; } } /** * Completes a cURL transaction, either returning a response promise or a * rejected promise. * * @param callable $handler * @param EasyHandle $easy * @param CurlFactoryInterface $factory Dictates how the handle is released * * @return \VendorDuplicator\GuzzleHttp\Promise\PromiseInterface */ public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } if (!$easy->response || $easy->errno) { return self::finishError($handler, $easy, $factory); } // Return the response if it is present and there is no error. $factory->release($easy); // Rewind the body of the response if possible. $body = $easy->response->getBody(); if ($body->isSeekable()) { $body->rewind(); } return new FulfilledPromise($easy->response); } private static function invokeStats(EasyHandle $easy) { $curlStats = \curl_getinfo($easy->handle); $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); $stats = new TransferStats($easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats); \call_user_func($easy->options['on_stats'], $stats); } private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { // Get error information and release the handle to the factory. $ctx = ['errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME)] + \curl_getinfo($easy->handle); $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } private static function createRejection(EasyHandle $easy, array $ctx) { static $connectionErrors = [\CURLE_OPERATION_TIMEOUTED => \true, \CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true]; // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { return \VendorDuplicator\GuzzleHttp\Promise\rejection_for(new RequestException('An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx)); } if (\version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { $message = \sprintf('cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'); } else { $message = \sprintf('cURL error %s: %s (%s) for %s', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', $easy->request->getUri()); } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($error); } private function getDefaultConf(EasyHandle $easy) { $conf = ['_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => \false, \CURLOPT_HEADER => \false, \CURLOPT_CONNECTTIMEOUT => 150]; if (\defined('CURLOPT_PROTOCOLS')) { $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ($version == 1.1) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; } elseif ($version == 2.0) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; } else { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; } return $conf; } private function applyMethod(EasyHandle $easy, array &$conf) { $body = $easy->request->getBody(); $size = $body->getSize(); if ($size === null || $size > 0) { $this->applyBody($easy->request, $easy->options, $conf); return; } $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { // See http://tools.ietf.org/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { $conf[\CURLOPT_NOBODY] = \true; unset($conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE]); } } private function applyBody(RequestInterface $request, array $options, array &$conf) { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. if ($size !== null && $size < 1000000 || !empty($options['_body_as_string'])) { $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { $conf[\CURLOPT_UPLOAD] = \true; if ($size !== null) { $conf[\CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } $conf[\CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } private function applyHeaders(EasyHandle $easy, array &$conf) { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { $value = (string) $value; if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. $conf[\CURLOPT_HTTPHEADER][] = "{$name};"; } else { $conf[\CURLOPT_HTTPHEADER][] = "{$name}: {$value}"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; } } /** * Remove a header from the options array. * * @param string $name Case-insensitive header to remove * @param array $options Array of options to modify */ private function removeHeader($name, array &$options) { foreach (\array_keys($options['_headers']) as $key) { if (!\strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } private function applyHandlerOptions(EasyHandle $easy, array &$conf) { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === \false) { unset($conf[\CURLOPT_CAINFO]); $conf[\CURLOPT_SSL_VERIFYHOST] = 0; $conf[\CURLOPT_SSL_VERIFYPEER] = \false; } else { $conf[\CURLOPT_SSL_VERIFYHOST] = 2; $conf[\CURLOPT_SSL_VERIFYPEER] = \true; if (\is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. if (!\file_exists($options['verify'])) { throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. if (\is_dir($options['verify']) || \is_link($options['verify']) && \is_dir(\readlink($options['verify']))) { $conf[\CURLOPT_CAPATH] = $options['verify']; } else { $conf[\CURLOPT_CAINFO] = $options['verify']; } } } } if (!empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { $conf[\CURLOPT_ENCODING] = $accept; } else { $conf[\CURLOPT_ENCODING] = ''; // Don't let curl send the header over the wire $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } if (isset($options['sink'])) { $sink = $options['sink']; if (!\is_string($sink)) { $sink = \VendorDuplicator\GuzzleHttp\Psr7\stream_for($sink); } elseif (!\is_dir(\dirname($sink))) { // Ensure that the directory exists before failing in curl. throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); } else { $sink = new LazyOpenStream($sink, 'w+'); } $easy->sink = $sink; $conf[\CURLOPT_WRITEFUNCTION] = function ($ch, $write) use($sink) { return $sink->write($write); }; } else { // Use a default temp stream if no sink was set. $conf[\CURLOPT_FILE] = \fopen('php://temp', 'w+'); $easy->sink = Psr7\stream_for($conf[\CURLOPT_FILE]); } $timeoutRequiresNoSignal = \false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { $conf[\CURLOPT_NOSIGNAL] = \true; } if (isset($options['proxy'])) { if (!\is_array($options['proxy'])) { $conf[\CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); if (!isset($options['proxy']['no']) || !\VendorDuplicator\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])) { $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } } if (isset($options['cert'])) { $cert = $options['cert']; if (\is_array($cert)) { $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } if (!\file_exists($cert)) { throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); } $conf[\CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { if (\is_array($options['ssl_key'])) { if (\count($options['ssl_key']) === 2) { list($sslKey, $conf[\CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; } else { list($sslKey) = $options['ssl_key']; } } $sslKey = isset($sslKey) ? $sslKey : $options['ssl_key']; if (!\file_exists($sslKey)) { throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); } $conf[\CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; if (!\is_callable($progress)) { throw new \InvalidArgumentException('progress client option must be callable'); } $conf[\CURLOPT_NOPROGRESS] = \false; $conf[\CURLOPT_PROGRESSFUNCTION] = function () use($progress) { $args = \func_get_args(); // PHP 5.5 pushed the handle onto the start of the args if (\is_resource($args[0])) { \array_shift($args); } \call_user_func_array($progress, $args); }; } if (!empty($options['debug'])) { $conf[\CURLOPT_STDERR] = \VendorDuplicator\GuzzleHttp\debug_resource($options['debug']); $conf[\CURLOPT_VERBOSE] = \true; } } /** * This function ensures that a response was set on a transaction. If one * was not set, then the request is retried if possible. This error * typically means you are sending a payload, curl encountered a * "Connection died, retrying a fresh connect" error, tried to rewind the * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. */ private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx) { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); if ($body->tell() > 0) { $body->rewind(); } } catch (\RuntimeException $e) { $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e; return self::createRejection($easy, $ctx); } // Retry no more than 3 times before giving up. if (!isset($easy->options['_curl_retries'])) { $easy->options['_curl_retries'] = 1; } elseif ($easy->options['_curl_retries'] == 2) { $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.'; return self::createRejection($easy, $ctx); } else { $easy->options['_curl_retries']++; } return $handler($easy->request, $easy->options); } private function createHeaderFn(EasyHandle $easy) { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; if (!\is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } return function ($ch, $h) use($onHeaders, $easy, &$startingResponse) { $value = \trim($h); if ($value === '') { $startingResponse = \true; $easy->createResponse(); if ($onHeaders !== null) { try { $onHeaders($easy->response); } catch (\Exception $e) { // Associate the exception with the handle and trigger // a curl header write error by returning 0. $easy->onHeadersException = $e; return -1; } } } elseif ($startingResponse) { $startingResponse = \false; $easy->headers = [$value]; } else { $easy->headers[] = $value; } return \strlen($h); }; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php000064400000002411147600374260024505 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(3); } public function __invoke(RequestInterface $request, array $options) { if (isset($options['delay'])) { \usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); \curl_exec($easy->handle); $easy->errno = \curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php000064400000014175147600374260025532 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; } elseif ($selectTimeout = \getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { $this->selectTimeout = $selectTimeout; } else { $this->selectTimeout = 1; } $this->options = isset($options['options']) ? $options['options'] : []; } public function __get($name) { if ($name === '_mh') { $this->_mh = \curl_multi_init(); foreach ($this->options as $option => $value) { // A warning is raised in case of a wrong option. \curl_multi_setopt($this->_mh, $option, $value); } // Further calls to _mh will return the value directly, without entering the // __get() method at all. return $this->_mh; } throw new \BadMethodCallException(); } public function __destruct() { if (isset($this->_mh)) { \curl_multi_close($this->_mh); unset($this->_mh); } } public function __invoke(RequestInterface $request, array $options) { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; $promise = new Promise([$this, 'execute'], function () use($id) { return $this->cancel($id); }); $this->addRequest(['easy' => $easy, 'deferred' => $promise]); return $promise; } /** * Ticks the curl event loop. */ public function tick() { // Add any delayed handles if needed. if ($this->delays) { $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); \curl_multi_add_handle($this->_mh, $this->handles[$id]['easy']->handle); } } } // Step through the task queue which may add additional requests. P\queue()->run(); if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 \usleep(250); } while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { } $this->processMessages(); } /** * Runs until all outstanding connections have completed. */ public function execute() { $queue = P\queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { \usleep($this->timeToNext()); } $this->tick(); } } private function addRequest(array $entry) { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { \curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + $easy->options['delay'] / 1000; } } /** * Cancels a handle from sending and removes references to it. * * @param int $id Handle ID to cancel and remove. * * @return bool True on success, false on failure. */ private function cancel($id) { // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return \false; } $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); \curl_multi_remove_handle($this->_mh, $handle); \curl_close($handle); return \true; } private function processMessages() { while ($done = \curl_multi_info_read($this->_mh)) { $id = (int) $done['handle']; \curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve(CurlFactory::finish($this, $entry['easy'], $this->factory)); } } private function timeToNext() { $currentTime = Utils::currentTime(); $nextTime = \PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } return \max(0, $nextTime - $currentTime) * 1000000; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Utils.php000064400000005477147600374260022044 0ustar00getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === \false) { $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; $errorConstants = \array_filter(\array_keys(\get_defined_constants()), function ($name) { return \substr($name, 0, 11) === 'IDNA_ERROR_'; }); $errors = []; foreach ($errorConstants as $errorConstant) { if ($errorBitSet & \constant($errorConstant)) { $errors[] = $errorConstant; } } $errorMessage = 'IDN conversion failed'; if ($errors) { $errorMessage .= ' (errors: ' . \implode(', ', $errors) . ')'; } throw new InvalidArgumentException($errorMessage); } else { if ($uri->getHost() !== $asciiHost) { // Replace URI only if the ASCII version is different $uri = $uri->withHost($asciiHost); } } } return $uri; } /** * @param string $domain * @param int $options * @param array $info * * @return string|false */ private static function idnToAsci($domain, $options, &$info = []) { if (\preg_match('%^[ -~]+$%', $domain) === 1) { return $domain; } if (\extension_loaded('intl') && \defined('INTL_IDNA_VARIANT_UTS46')) { return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); } /* * The Idn class is marked as @internal. Verify that class and method exists. */ if (\method_exists(Idn::class, 'idn_to_ascii')) { return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); } throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/MessageFormatter.php000064400000014617147600374260024210 0ustar00>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; /** @var string Template used to format log messages */ private $template; /** * @param string $template Log message template */ public function __construct($template = self::CLF) { $this->template = $template ?: self::CLF; } /** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received * @param \Exception $error Exception that was received * * @return string */ public function format(RequestInterface $request, ResponseInterface $response = null, \Exception $error = null) { $cache = []; return \preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { return $cache[$matches[1]]; } $result = ''; switch ($matches[1]) { case 'request': $result = Psr7\str($request); break; case 'response': $result = $response ? Psr7\str($response) : ''; break; case 'req_headers': $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); break; case 'res_headers': $result = $response ? \sprintf('HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase()) . "\r\n" . $this->headers($response) : 'NULL'; break; case 'req_body': $result = $request->getBody(); break; case 'res_body': $result = $response ? $response->getBody() : 'NULL'; break; case 'ts': case 'date_iso_8601': $result = \gmdate('c'); break; case 'date_common_log': $result = \date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); break; case 'version': $result = $request->getProtocolVersion(); break; case 'uri': case 'url': $result = $request->getUri(); break; case 'target': $result = $request->getRequestTarget(); break; case 'req_version': $result = $request->getProtocolVersion(); break; case 'res_version': $result = $response ? $response->getProtocolVersion() : 'NULL'; break; case 'host': $result = $request->getHeaderLine('Host'); break; case 'hostname': $result = \gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; break; case 'phrase': $result = $response ? $response->getReasonPhrase() : 'NULL'; break; case 'error': $result = $error ? $error->getMessage() : 'NULL'; break; default: // handle prefixed dynamic headers if (\strpos($matches[1], 'req_header_') === 0) { $result = $request->getHeaderLine(\substr($matches[1], 11)); } elseif (\strpos($matches[1], 'res_header_') === 0) { $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; } } $cache[$matches[1]] = $result; return $result; }, $this->template); } /** * Get headers from message as string * * @return string */ private function headers(MessageInterface $message) { $result = ''; foreach ($message->getHeaders() as $name => $values) { $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; } return \trim($result); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/functions.php000064400000023352147600374260022744 0ustar00expand($template, $variables); } /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (\gettype($input)) { case 'object': return 'object(' . \get_class($input) . ')'; case 'array': return 'array(' . \count($input) . ')'; default: \ob_start(); \var_dump($input); // normalize float vs double return \str_replace('double(', 'float(', \rtrim(\ob_get_clean())); } } /** * Parses an array of header lines into an associative array of headers. * * @param iterable $lines Header lines array of strings in the following * format: "Name: Value" * @return array */ function headers_from_lines($lines) { $headers = []; foreach ($lines as $line) { $parts = \explode(':', $line, 2); $headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null; } return $headers; } /** * Returns a debug stream based on the provided variable. * * @param mixed $value Optional value * * @return resource */ function debug_resource($value = null) { if (\is_resource($value)) { return $value; } elseif (\defined('STDOUT')) { return \STDOUT; } return \fopen('php://output', 'w'); } /** * Chooses and creates a default handler to use based on the environment. * * The returned handler is not wrapped by any default middlewares. * * @return callable Returns the best handler for the given system. * @throws \RuntimeException if no viable Handler is available. */ function choose_handler() { $handler = null; if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); } elseif (\function_exists('curl_exec')) { $handler = new CurlHandler(); } elseif (\function_exists('curl_multi_exec')) { $handler = new CurlMultiHandler(); } if (\ini_get('allow_url_fopen')) { $handler = $handler ? Proxy::wrapStreaming($handler, new StreamHandler()) : new StreamHandler(); } elseif (!$handler) { throw new \RuntimeException('VendorDuplicator\\GuzzleHttp requires cURL, the ' . 'allow_url_fopen ini setting, or a custom HTTP handler.'); } return $handler; } /** * Get the default User-Agent string to use with Guzzle * * @return string */ function default_user_agent() { static $defaultAgent = ''; if (!$defaultAgent) { $defaultAgent = 'VendorDuplicator\\GuzzleHttp/' . Client::VERSION; if (\extension_loaded('curl') && \function_exists('curl_version')) { $defaultAgent .= ' curl/' . \curl_version()['version']; } $defaultAgent .= ' PHP/' . \PHP_VERSION; } return $defaultAgent; } /** * Returns the default cacert bundle for the current system. * * First, the openssl.cafile and curl.cainfo php.ini settings are checked. * If those settings are not configured, then the common locations for * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X * and Windows are checked. If any of these file locations are found on * disk, they will be utilized. * * Note: the result of this function is cached for subsequent calls. * * @return string * @throws \RuntimeException if no bundle can be found. */ function default_ca_bundle() { static $cached = null; static $cafiles = [ // Red Hat, CentOS, Fedora (provided by the ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Ubuntu, Debian (provided by the ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // FreeBSD (provided by the ca_root_nss package) '/usr/local/share/certs/ca-root-nss.crt', // SLES 12 (provided by the ca-certificates package) '/var/lib/ca-certificates/ca-bundle.pem', // OS X provided by homebrew (using the default path) '/usr/local/etc/openssl/cert.pem', // Google app engine '/etc/ca-certificates.crt', // Windows? 'C:\\windows\\system32\\curl-ca-bundle.crt', 'C:\\windows\\curl-ca-bundle.crt', ]; if ($cached) { return $cached; } if ($ca = \ini_get('openssl.cafile')) { return $cached = $ca; } if ($ca = \ini_get('curl.cainfo')) { return $cached = $ca; } foreach ($cafiles as $filename) { if (\file_exists($filename)) { return $cached = $filename; } } throw new \RuntimeException(<< ['prefix' => '', 'joiner' => ',', 'query' => \false], '+' => ['prefix' => '', 'joiner' => ',', 'query' => \false], '#' => ['prefix' => '#', 'joiner' => ',', 'query' => \false], '.' => ['prefix' => '.', 'joiner' => '.', 'query' => \false], '/' => ['prefix' => '/', 'joiner' => '/', 'query' => \false], ';' => ['prefix' => ';', 'joiner' => ';', 'query' => \true], '?' => ['prefix' => '?', 'joiner' => '&', 'query' => \true], '&' => ['prefix' => '&', 'joiner' => '&', 'query' => \true]]; /** @var array Delimiters */ private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=']; /** @var array Percent encoded delimiters */ private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D']; public function expand($template, array $variables) { if (\false === \strpos($template, '{')) { return $template; } $this->template = $template; $this->variables = $variables; return \preg_replace_callback('/\\{([^\\}]+)\\}/', [$this, 'expandMatch'], $this->template); } /** * Parse an expression into parts * * @param string $expression Expression to parse * * @return array Returns an associative array of parts */ private function parseExpression($expression) { $result = []; if (isset(self::$operatorHash[$expression[0]])) { $result['operator'] = $expression[0]; $expression = \substr($expression, 1); } else { $result['operator'] = ''; } foreach (\explode(',', $expression) as $value) { $value = \trim($value); $varspec = []; if ($colonPos = \strpos($value, ':')) { $varspec['value'] = \substr($value, 0, $colonPos); $varspec['modifier'] = ':'; $varspec['position'] = (int) \substr($value, $colonPos + 1); } elseif (\substr($value, -1) === '*') { $varspec['modifier'] = '*'; $varspec['value'] = \substr($value, 0, -1); } else { $varspec['value'] = (string) $value; $varspec['modifier'] = ''; } $result['values'][] = $varspec; } return $result; } /** * Process an expansion * * @param array $matches Matches met in the preg_replace_callback * * @return string Returns the replacement string */ private function expandMatch(array $matches) { static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; $replacements = []; $parsed = self::parseExpression($matches[1]); $prefix = self::$operatorHash[$parsed['operator']]['prefix']; $joiner = self::$operatorHash[$parsed['operator']]['joiner']; $useQuery = self::$operatorHash[$parsed['operator']]['query']; foreach ($parsed['values'] as $value) { if (!isset($this->variables[$value['value']])) { continue; } $variable = $this->variables[$value['value']]; $actuallyUseQuery = $useQuery; $expanded = ''; if (\is_array($variable)) { $isAssoc = $this->isAssoc($variable); $kvp = []; foreach ($variable as $key => $var) { if ($isAssoc) { $key = \rawurlencode($key); $isNestedArray = \is_array($var); } else { $isNestedArray = \false; } if (!$isNestedArray) { $var = \rawurlencode($var); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $var = $this->decodeReserved($var); } } if ($value['modifier'] === '*') { if ($isAssoc) { if ($isNestedArray) { // Nested arrays must allow for deeply nested // structures. $var = \strtr(\http_build_query([$key => $var]), $rfc1738to3986); } else { $var = $key . '=' . $var; } } elseif ($key > 0 && $actuallyUseQuery) { $var = $value['value'] . '=' . $var; } } $kvp[$key] = $var; } if (empty($variable)) { $actuallyUseQuery = \false; } elseif ($value['modifier'] === '*') { $expanded = \implode($joiner, $kvp); if ($isAssoc) { // Don't prepend the value name when using the explode // modifier with an associative array. $actuallyUseQuery = \false; } } else { if ($isAssoc) { // When an associative array is encountered and the // explode modifier is not set, then the result must be // a comma separated list of keys followed by their // respective values. foreach ($kvp as $k => &$v) { $v = $k . ',' . $v; } } $expanded = \implode(',', $kvp); } } else { if ($value['modifier'] === ':') { $variable = \substr($variable, 0, $value['position']); } $expanded = \rawurlencode($variable); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $expanded = $this->decodeReserved($expanded); } } if ($actuallyUseQuery) { if (!$expanded && $joiner !== '&') { $expanded = $value['value']; } else { $expanded = $value['value'] . '=' . $expanded; } } $replacements[] = $expanded; } $ret = \implode($joiner, $replacements); if ($ret && $prefix) { return $prefix . $ret; } return $ret; } /** * Determines if an array is associative. * * This makes the assumption that input arrays are sequences or hashes. * This assumption is a tradeoff for accuracy in favor of speed, but it * should work in almost every case where input is supplied for a URI * template. * * @param array $array Array to check * * @return bool */ private function isAssoc(array $array) { return $array && \array_keys($array)[0] !== 0; } /** * Removes percent encoding on reserved characters (used with + and # * modifiers). * * @param string $string String to fix * * @return string */ private function decodeReserved($string) { return \str_replace(self::$delimsPct, self::$delims, $string); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/ClientInterface.php000064400000005621147600374260023772 0ustar00 'http://www.foo.com/1.0/', * 'timeout' => 0, * 'allow_redirects' => false, * 'proxy' => '192.168.16.1:10' * ]); * * Client configuration settings include the following options: * * - handler: (callable) Function that transfers HTTP requests over the * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a * Psr7\Http\Message\ResponseInterface on success. * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged * into relative URIs. Can be a string or instance of UriInterface. * - **: any request option * * @param array $config Client configuration settings. * * @see \VendorDuplicator\GuzzleHttp\RequestOptions for a list of available request options. */ public function __construct(array $config = []) { if (!isset($config['handler'])) { $config['handler'] = HandlerStack::create(); } elseif (!\is_callable($config['handler'])) { throw new \InvalidArgumentException('handler must be a callable'); } // Convert the base_uri to a UriInterface if (isset($config['base_uri'])) { $config['base_uri'] = Psr7\uri_for($config['base_uri']); } $this->configureDefaults($config); } /** * @param string $method * @param array $args * * @return Promise\PromiseInterface */ public function __call($method, $args) { if (\count($args) < 1) { throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $opts = isset($args[1]) ? $args[1] : []; return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } /** * Asynchronously send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function sendAsync(RequestInterface $request, array $options = []) { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); return $this->transfer($request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options); } /** * Send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function send(RequestInterface $request, array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->sendAsync($request, $options)->wait(); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function requestAsync($method, $uri = '', array $options = []) { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. $headers = isset($options['headers']) ? $options['headers'] : []; $body = isset($options['body']) ? $options['body'] : null; $version = isset($options['version']) ? $options['version'] : '1.1'; // Merge the URI into the base URI. $uri = $this->buildUri($uri, $options); if (\is_array($body)) { $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. unset($options['headers'], $options['body'], $options['version']); return $this->transfer($request, $options); } /** * Create and send an HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string $method HTTP method. * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function request($method, $uri = '', array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->requestAsync($method, $uri, $options)->wait(); } /** * Get a client configuration option. * * These options include default request options of the client, a "handler" * (if utilized by the concrete client), and a "base_uri" if utilized by * the concrete client. * * @param string|null $option The config option to retrieve. * * @return mixed */ public function getConfig($option = null) { return $option === null ? $this->config : (isset($this->config[$option]) ? $this->config[$option] : null); } /** * @param string|null $uri * * @return UriInterface */ private function buildUri($uri, array $config) { // for BC we accept null which would otherwise fail in uri_for $uri = Psr7\uri_for($uri === null ? '' : $uri); if (isset($config['base_uri'])) { $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && $config['idn_conversion'] !== \false) { $idnOptions = $config['idn_conversion'] === \true ? \IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } /** * Configures the default options for a client. * * @param array $config * @return void */ private function configureDefaults(array $config) { $defaults = ['allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => \true, 'decode_content' => \true, 'verify' => \true, 'cookies' => \false, 'idn_conversion' => \true]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". if (\php_sapi_name() === 'cli' && \getenv('HTTP_PROXY')) { $defaults['proxy']['http'] = \getenv('HTTP_PROXY'); } if ($proxy = \getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } if ($noProxy = \getenv('NO_PROXY')) { $cleanedNoProxy = \str_replace(' ', '', $noProxy); $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; if (!empty($config['cookies']) && $config['cookies'] === \true) { $this->config['cookies'] = new CookieJar(); } // Add the default user-agent header. if (!isset($this->config['headers'])) { $this->config['headers'] = ['User-Agent' => default_user_agent()]; } else { // Add the User-Agent header if one was not already set. foreach (\array_keys($this->config['headers']) as $name) { if (\strtolower($name) === 'user-agent') { return; } } $this->config['headers']['User-Agent'] = default_user_agent(); } } /** * Merges default options into the array. * * @param array $options Options to modify by reference * * @return array */ private function prepareDefaults(array $options) { $defaults = $this->config; if (!empty($defaults['headers'])) { // Default headers are only added if they are not present. $defaults['_conditional'] = $defaults['headers']; unset($defaults['headers']); } // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. if (\array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); } elseif (!\is_array($options['headers'])) { throw new \InvalidArgumentException('headers must be an array'); } } // Shallow merge defaults underneath options. $result = $options + $defaults; // Remove null values. foreach ($result as $k => $v) { if ($v === null) { unset($result[$k]); } } return $result; } /** * Transfers the given request and applies request options. * * The URI of the request is not modified and the request options are used * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ private function transfer(RequestInterface $request, array $options) { // save_to -> sink if (isset($options['save_to'])) { $options['sink'] = $options['save_to']; unset($options['save_to']); } // exceptions -> http_errors if (isset($options['exceptions'])) { $options['http_errors'] = $options['exceptions']; unset($options['exceptions']); } $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { return Promise\promise_for($handler($request, $options)); } catch (\Exception $e) { return Promise\rejection_for($e); } } /** * Applies the array of request options to a request. * * @param RequestInterface $request * @param array $options * * @return RequestInterface */ private function applyOptions(RequestInterface $request, array &$options) { $modify = ['set_headers' => []]; if (isset($options['headers'])) { $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { throw new \InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); } $options['body'] = \http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } if (isset($options['multipart'])) { $options['body'] = new Psr7\MultipartStream($options['multipart']); unset($options['multipart']); } if (isset($options['json'])) { $options['body'] = \VendorDuplicator\GuzzleHttp\json_encode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } if (!empty($options['decode_content']) && $options['decode_content'] !== \true) { // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { if (\is_array($options['body'])) { $this->invalidBody(); } $modify['body'] = Psr7\stream_for($options['body']); unset($options['body']); } if (!empty($options['auth']) && \is_array($options['auth'])) { $value = $options['auth']; $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' . \base64_encode("{$value[0]}:{$value[1]}"); break; case 'digest': // @todo: Do not rely on curl $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; case 'ntlm': $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; } } if (isset($options['query'])) { $value = $options['query']; if (\is_array($value)) { $value = \http_build_query($value, null, '&', \PHP_QUERY_RFC3986); } if (!\is_string($value)) { throw new \InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); } // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? if (\is_bool($options['sink'])) { throw new \InvalidArgumentException('sink must not be a boolean'); } } $request = Psr7\modify_request($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); } // Merge in conditional headers if they are not present. if (isset($options['_conditional'])) { // Build up the changes so it's in a single clone of the message. $modify = []; foreach ($options['_conditional'] as $k => $v) { if (!$request->hasHeader($k)) { $modify['set_headers'][$k] = $v; } } $request = Psr7\modify_request($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } return $request; } /** * Throw Exception with pre-set message. * @return void * @throws \InvalidArgumentException Invalid body. */ private function invalidBody() { throw new \InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a POST request has been deprecated. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/Pool.php000064400000011317147600374260021643 0ustar00 $rfn) { if ($rfn instanceof RequestInterface) { (yield $key => $client->sendAsync($rfn, $opts)); } elseif (\is_callable($rfn)) { (yield $key => $rfn($opts)); } else { throw new \InvalidArgumentException('Each value yielded by ' . 'the iterator must be a Psr7\\Http\\Message\\RequestInterface ' . 'or a callable that returns a promise that fulfills ' . 'with a Psr7\\Message\\Http\\ResponseInterface object.'); } } }; $this->each = new EachPromise($requests(), $config); } /** * Get promise * * @return PromiseInterface */ public function promise() { return $this->each->promise(); } /** * Sends multiple requests concurrently and returns an array of responses * and exceptions that uses the same ordering as the provided requests. * * IMPORTANT: This method keeps every request and response in memory, and * as such, is NOT recommended when sending a large number or an * indeterminate number of requests concurrently. * * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in * {@see GuzzleHttp\Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. * @throws \InvalidArgumentException if the event format is incorrect. */ public static function batch(ClientInterface $client, $requests, array $options = []) { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); \ksort($res); return $res; } /** * Execute callback(s) * * @return void */ private static function cmpCallback(array &$options, $name, array &$results) { if (!isset($options[$name])) { $options[$name] = function ($v, $k) use(&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; $options[$name] = function ($v, $k) use(&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php000064400000006415147600374260024040 0ustar00decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; } /** * Default exponential backoff delay function. * * @param int $retries * * @return int milliseconds. */ public static function exponentialDelay($retries) { return (int) \pow(2, $retries - 1) * 1000; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); } /** * Execute fulfilled closure * * @return mixed */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, $value, null)) { return $value; } return $this->doRetry($req, $options, $value); }; } /** * Execute rejected closure * * @return callable */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, null, $reason)) { return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); } return $this->doRetry($req, $options); }; } /** * @return self */ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) { $options['delay'] = \call_user_func($this->delay, ++$options['retries'], $response); return $this($request, $options); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/RequestOptions.php000064400000024151147600374260023736 0ustar00withCookieHeader($request); return $handler($request, $options)->then(function ($response) use($cookieJar, $request) { $cookieJar->extractCookies($request, $response); return $response; }); }; }; } /** * Middleware that throws exceptions for 4xx or 5xx responses when the * "http_error" request option is set to true. * * @return callable Returns a function that accepts the next handler. */ public static function httpErrors() { return function (callable $handler) { return function ($request, array $options) use($handler) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then(function (ResponseInterface $response) use($request) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } throw RequestException::create($request, $response); }); }; }; } /** * Middleware that pushes history data to an ArrayAccess container. * * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ public static function history(&$container) { if (!\is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } return function (callable $handler) use(&$container) { return function ($request, array $options) use($handler, &$container) { return $handler($request, $options)->then(function ($value) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => $value, 'error' => null, 'options' => $options]; return $value; }, function ($reason) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => null, 'error' => $reason, 'options' => $options]; return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * Middleware that invokes a callback before and after sending a request. * * The provided listener cannot modify or alter the response. It simply * "taps" into the chain to be notified before returning the promise. The * before listener accepts a request and options array, and the after * listener accepts a request, options array, and response promise. * * @param callable $before Function to invoke before forwarding the request. * @param callable $after Function invoked after forwarding. * * @return callable Returns a function that accepts the next handler. */ public static function tap(callable $before = null, callable $after = null) { return function (callable $handler) use($before, $after) { return function ($request, array $options) use($handler, $before, $after) { if ($before) { $before($request, $options); } $response = $handler($request, $options); if ($after) { $after($request, $options, $response); } return $response; }; }; } /** * Middleware that handles request redirects. * * @return callable Returns a function that accepts the next handler. */ public static function redirect() { return function (callable $handler) { return new RedirectMiddleware($handler); }; } /** * Middleware that retries requests based on the boolean result of * invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and * returns true if the request is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * * @return callable Returns a function that accepts the next handler. */ public static function retry(callable $decider, callable $delay = null) { return function (callable $handler) use($decider, $delay) { return new RetryMiddleware($decider, $handler, $delay); }; } /** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info') { return function (callable $handler) use($logger, $formatter, $logLevel) { return function ($request, array $options) use($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter, $logLevel) { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, function ($reason) use($logger, $request, $formatter) { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, $reason); $logger->notice($message); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. * * @return callable */ public static function prepareBody() { return function (callable $handler) { return new PrepareBodyMiddleware($handler); }; } /** * Middleware that applies a map function to the request before passing to * the next handler. * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. * @return callable */ public static function mapRequest(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($fn($request), $options); }; }; } /** * Middleware that applies a map function to the resolved promise's * response. * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. * @return callable */ public static function mapResponse(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($request, $options)->then($fn); }; }; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/TransferStats.php000064400000006044147600374260023536 0ustar00request = $request; $this->response = $response; $this->transferTime = $transferTime; $this->handlerErrorData = $handlerErrorData; $this->handlerStats = $handlerStats; } /** * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Returns the response that was received (if any). * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Returns true if a response was received. * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Gets handler specific error data. * * This might be an exception, a integer representing an error code, or * anything else. Relying on this value assumes that you know what handler * you are using. * * @return mixed */ public function getHandlerErrorData() { return $this->handlerErrorData; } /** * Get the effective URI the request was sent to. * * @return UriInterface */ public function getEffectiveUri() { return $this->request->getUri(); } /** * Get the estimated time the request was being transferred by the handler. * * @return float|null Time in seconds. */ public function getTransferTime() { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. * * @return array */ public function getHandlerStats() { return $this->handlerStats; } /** * Get a specific handler statistic from the handler by name. * * @param string $stat Handler specific transfer stat to retrieve. * * @return mixed|null */ public function getHandlerStat($stat) { return isset($this->handlerStats[$stat]) ? $this->handlerStats[$stat] : null; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/functions_include.php000064400000000321147600374260024436 0ustar00nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; // Don't do anything if the request has no body. if ($request->getBody()->getSize() === 0) { return $fn($request, $options); } $modify = []; // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { if ($type = Psr7\mimetype_from_filename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } } // Add a default content-length or transfer-encoding header. if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding')) { $size = $request->getBody()->getSize(); if ($size !== null) { $modify['set_headers']['Content-Length'] = $size; } else { $modify['set_headers']['Transfer-Encoding'] = 'chunked'; } } // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); return $fn(Psr7\modify_request($request, $modify), $options); } /** * Add expect header * * @return void */ private function addExpectHeader(RequestInterface $request, array $options, array &$modify) { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } $expect = isset($options['expect']) ? $options['expect'] : null; // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 if ($expect === \false || $request->getProtocolVersion() < 1.1) { return; } // The expect header is unconditionally enabled if ($expect === \true) { $modify['set_headers']['Expect'] = '100-Continue'; return; } // By default, send the expect header when the payload is > 1mb if ($expect === null) { $expect = 1048576; } // Always add if the body cannot be rewound, the size cannot be // determined, or the size is greater than the cutoff threshold $body = $request->getBody(); $size = $body->getSize(); if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { $modify['set_headers']['Expect'] = '100-Continue'; } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php000064400000017610147600374260024473 0ustar00 5, 'protocols' => ['http', 'https'], 'strict' => \false, 'referer' => \false, 'track_redirects' => \false]; /** @var callable */ private $nextHandler; /** * @param callable $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; if (empty($options['allow_redirects'])) { return $fn($request, $options); } if ($options['allow_redirects'] === \true) { $options['allow_redirects'] = self::$defaultSettings; } elseif (!\is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings $options['allow_redirects'] += self::$defaultSettings; } if (empty($options['allow_redirects']['max'])) { return $fn($request, $options); } return $fn($request, $options)->then(function (ResponseInterface $response) use($request, $options) { return $this->checkRedirect($request, $options, $response); }); } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return ResponseInterface|PromiseInterface */ public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) { if (\substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location')) { return $response; } $this->guardMax($request, $options); $nextRequest = $this->modifyRequest($request, $options, $response); // If authorization is handled by curl, unset it if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && \defined('\\CURLOPT_HTTPAUTH')) { unset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]); } if (isset($options['allow_redirects']['on_redirect'])) { \call_user_func($options['allow_redirects']['on_redirect'], $request, $response, $nextRequest->getUri()); } /** @var PromiseInterface|ResponseInterface $promise */ $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. if (!empty($options['allow_redirects']['track_redirects'])) { return $this->withTracking($promise, (string) $nextRequest->getUri(), $response->getStatusCode()); } return $promise; } /** * Enable tracking on promise. * * @return PromiseInterface */ private function withTracking(PromiseInterface $promise, $uri, $statusCode) { return $promise->then(function (ResponseInterface $response) use($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); \array_unshift($historyHeader, $uri); \array_unshift($statusHeader, $statusCode); return $response->withHeader(self::HISTORY_HEADER, $historyHeader)->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); }); } /** * Check for too many redirects. * * @return void * * @throws TooManyRedirectsException Too many redirects. */ private function guardMax(RequestInterface $request, array &$options) { $current = isset($options['__redirect_count']) ? $options['__redirect_count'] : 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request); } } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return RequestInterface */ public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response) { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; // Use a GET request if this is an entity enclosing request and we are // not forcing RFC compliance, but rather emulating what all browsers // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || $statusCode <= 302 && !$options['allow_redirects']['strict']) { $modify['method'] = 'GET'; $modify['body'] = ''; } $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && $options['idn_conversion'] !== \false) { $idnOptions = $options['idn_conversion'] === \true ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; Psr7\rewind_body($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme()) { $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; } // Remove Authorization and Cookie headers if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; $modify['remove_headers'][] = 'Cookie'; } return Psr7\modify_request($request, $modify); } /** * Set the appropriate URL on the request based on the location header. * * @param RequestInterface $request * @param ResponseInterface $response * @param array $protocols * * @return UriInterface */ private static function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols) { $location = Psr7\UriResolver::resolve($request->getUri(), new Psr7\Uri($response->getHeaderLine('Location'))); // Ensure that the redirect URI is allowed based on the protocols. if (!\in_array($location->getScheme(), $protocols)) { throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); } return $location; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/guzzle/src/HandlerStack.php000064400000017110147600374260023272 0ustar00push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); $stack->push(Middleware::prepareBody(), 'prepare_body'); return $stack; } /** * @param callable $handler Underlying HTTP handler. */ public function __construct(callable $handler = null) { $this->handler = $handler; } /** * Invokes the handler stack as a composed handler * * @param RequestInterface $request * @param array $options * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $handler = $this->resolve(); return $handler($request, $options); } /** * Dumps a string representation of the stack. * * @return string */ public function __toString() { $depth = 0; $stack = []; if ($this->handler) { $stack[] = "0) Handler: " . $this->debugCallable($this->handler); } $result = ''; foreach (\array_reverse($this->stack) as $tuple) { $depth++; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= "Function: " . $this->debugCallable($tuple[0]); $result = "> {$str}\n{$result}"; $stack[] = $str; } foreach (\array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } return $result; } /** * Set the HTTP handler that actually returns a promise. * * @param callable $handler Accepts a request and array of options and * returns a Promise. */ public function setHandler(callable $handler) { $this->handler = $handler; $this->cached = null; } /** * Returns true if the builder has a handler. * * @return bool */ public function hasHandler() { return (bool) $this->handler; } /** * Unshift a middleware to the bottom of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function unshift(callable $middleware, $name = null) { \array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function push(callable $middleware, $name = '') { $this->stack[] = [$middleware, $name]; $this->cached = null; } /** * Add a middleware before another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function before($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \true); } /** * Add a middleware after another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function after($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \false); } /** * Remove a middleware by instance or name from the stack. * * @param callable|string $remove Middleware to remove by instance or name. */ public function remove($remove) { $this->cached = null; $idx = \is_callable($remove) ? 0 : 1; $this->stack = \array_values(\array_filter($this->stack, function ($tuple) use($idx, $remove) { return $tuple[$idx] !== $remove; })); } /** * Compose the middleware and handler into a single callable function. * * @return callable */ public function resolve() { if (!$this->cached) { if (!($prev = $this->handler)) { throw new \LogicException('No handler has been specified'); } foreach (\array_reverse($this->stack) as $fn) { $prev = $fn[0]($prev); } $this->cached = $prev; } return $this->cached; } /** * @param string $name * @return int */ private function findByName($name) { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { return $k; } } throw new \InvalidArgumentException("Middleware not found: {$name}"); } /** * Splices a function into the middleware list at a specific position. * * @param string $findName * @param string $withName * @param callable $middleware * @param bool $before */ private function splice($findName, $withName, callable $middleware, $before) { $this->cached = null; $idx = $this->findByName($findName); $tuple = [$middleware, $withName]; if ($before) { if ($idx === 0) { \array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; \array_splice($this->stack, $idx, 1, $replacement); } } elseif ($idx === \count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; \array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * * @param array|callable $fn Function to write as a string. * * @return string */ private function debugCallable($fn) { if (\is_string($fn)) { return "callable({$fn})"; } if (\is_array($fn)) { return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; } return 'callable(' . \spl_object_hash($fn) . ')'; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/AggregateException.php000064400000000555147600374260025022 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\Utils::queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface */ public static function queue(TaskQueueInterface $assign = null) { static $queue; if ($assign) { $queue = $assign; } elseif (!$queue) { $queue = new TaskQueue(); } return $queue; } /** * Adds a function to run in the task queue when it is next `run()` and * returns a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface */ public static function task(callable $task) { $queue = self::queue(); $promise = new Promise([$queue, 'run']); $queue->add(function () use($task, $promise) { try { if (Is::pending($promise)) { $promise->resolve($task()); } } catch (\Throwable $e) { $promise->reject($e); } catch (\Exception $e) { $promise->reject($e); } }); return $promise; } /** * Synchronously waits on a promise to resolve and returns an inspection * state array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the * array will contain a "value" key mapping to the fulfilled value of the * promise. If the promise is rejected, the array will contain a "reason" * key mapping to the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array */ public static function inspect(PromiseInterface $promise) { try { return ['state' => PromiseInterface::FULFILLED, 'value' => $promise->wait()]; } catch (RejectionException $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; } catch (\Throwable $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } catch (\Exception $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } } /** * Waits on all of the provided promises, but does not unwrap rejected * promises as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array */ public static function inspectAll($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = self::inspect($promise); } return $results; } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same * order the promises were provided). An exception is thrown if any of the * promises are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 */ public static function unwrap($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = $promise->wait(); } return $results; } /** * Given an array of promises, return a promise that is fulfilled when all * the items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface */ public static function all($promises, $recursive = \false) { $results = []; $promise = Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = $value; }, function ($reason, $idx, Promise $aggregate) { $aggregate->reject($reason); })->then(function () use(&$results) { \ksort($results); return $results; }); if (\true === $recursive) { $promise = $promise->then(function ($results) use($recursive, &$promises) { foreach ($promises as $promise) { if (Is::pending($promise)) { return self::all($promises, $recursive); } } return $results; }); } return $promise; } /** * Initiate a competitive race between multiple promises or values (values * will become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise * is fulfilled with an array that contains the fulfillment values of the * winners in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number * of fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function some($count, $promises) { $results = []; $rejections = []; return Each::of($promises, function ($value, $idx, PromiseInterface $p) use(&$results, $count) { if (Is::settled($p)) { return; } $results[$idx] = $value; if (\count($results) >= $count) { $p->resolve(null); } }, function ($reason) use(&$rejections) { $rejections[] = $reason; })->then(function () use(&$results, &$rejections, $count) { if (\count($results) !== $count) { throw new AggregateException('Not enough promises to fulfill count', $rejections); } \ksort($results); return \array_values($results); }); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function any($promises) { return self::some(1, $promises)->then(function ($values) { return $values[0]; }); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function settle($promises) { $results = []; return Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; }, function ($reason, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; })->then(function () use(&$results) { \ksort($results); return $results; }); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/functions.php000064400000023541147600374260023265 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface * * @deprecated queue will be removed in guzzlehttp/promises:2.0. Use Utils::queue instead. */ function queue(TaskQueueInterface $assign = null) { return Utils::queue($assign); } /** * Adds a function to run in the task queue when it is next `run()` and returns * a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface * * @deprecated task will be removed in guzzlehttp/promises:2.0. Use Utils::task instead. */ function task(callable $task) { return Utils::task($task); } /** * Creates a promise for a value if the value is not a promise. * * @param mixed $value Promise or value. * * @return PromiseInterface * * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. */ function promise_for($value) { return Create::promiseFor($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. If * the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface * * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. */ function rejection_for($reason) { return Create::rejectionFor($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable * * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. */ function exception_for($reason) { return Create::exceptionFor($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator * * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. */ function iter_for($value) { return Create::iterFor($value); } /** * Synchronously waits on a promise to resolve and returns an inspection state * array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the array * will contain a "value" key mapping to the fulfilled value of the promise. If * the promise is rejected, the array will contain a "reason" key mapping to * the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. */ function inspect(PromiseInterface $promise) { return Utils::inspect($promise); } /** * Waits on all of the provided promises, but does not unwrap rejected promises * as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. */ function inspect_all($promises) { return Utils::inspectAll($promises); } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same order * the promises were provided). An exception is thrown if any of the promises * are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 * * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. */ function unwrap($promises) { return Utils::unwrap($promises); } /** * Given an array of promises, return a promise that is fulfilled when all the * items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface * * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. */ function all($promises, $recursive = \false) { return Utils::all($promises, $recursive); } /** * Initiate a competitive race between multiple promises or values (values will * become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise is * fulfilled with an array that contains the fulfillment values of the winners * in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number of * fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. */ function some($count, $promises) { return Utils::some($count, $promises); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. */ function any($promises) { return Utils::any($promises); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. */ function settle($promises) { return Utils::settle($promises); } /** * Given an iterator that yields promises or values, returns a promise that is * fulfilled with a null value when the iterator has been consumed or the * aggregate promise has been fulfilled or rejected. * * $onFulfilled is a function that accepts the fulfilled value, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * $onRejected is a function that accepts the rejection reason, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * @param mixed $iterable Iterator or array to iterate over. * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. */ function each($iterable, callable $onFulfilled = null, callable $onRejected = null) { return Each::of($iterable, $onFulfilled, $onRejected); } /** * Like each, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow for * dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. */ function each_limit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); } /** * Like each_limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface * * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. */ function each_limit_all($iterable, $concurrency, callable $onFulfilled = null) { return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); } /** * Returns true if a promise is fulfilled. * * @return bool * * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. */ function is_fulfilled(PromiseInterface $promise) { return Is::fulfilled($promise); } /** * Returns true if a promise is rejected. * * @return bool * * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. */ function is_rejected(PromiseInterface $promise) { return Is::rejected($promise); } /** * Returns true if a promise is fulfilled or rejected. * * @return bool * * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. */ function is_settled(PromiseInterface $promise) { return Is::settled($promise); } /** * Create a new coroutine. * * @see Coroutine * * @return PromiseInterface * * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. */ function coroutine(callable $generatorFn) { return Coroutine::of($generatorFn); } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/Is.php000064400000001765147600374260021634 0ustar00getState() === PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled or rejected. * * @return bool */ public static function settled(PromiseInterface $promise) { return $promise->getState() !== PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled. * * @return bool */ public static function fulfilled(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::FULFILLED; } /** * Returns true if a promise is rejected. * * @return bool */ public static function rejected(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::REJECTED; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/RejectionException.php000064400000002254147600374260025054 0ustar00reason = $reason; $message = 'The promise was rejected'; if ($description) { $message .= ' with reason: ' . $description; } elseif (\is_string($reason) || \is_object($reason) && \method_exists($reason, '__toString')) { $message .= ' with reason: ' . $this->reason; } elseif ($reason instanceof \JsonSerializable) { $message .= ' with reason: ' . \json_encode($this->reason, \JSON_PRETTY_PRINT); } parent::__construct($message); } /** * Returns the rejection reason. * * @return mixed */ public function getReason() { return $this->reason; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/PromisorInterface.php000064400000000405147600374260024702 0ustar00run(); */ class TaskQueue implements TaskQueueInterface { private $enableShutdown = \true; private $queue = []; public function __construct($withShutdown = \true) { if ($withShutdown) { \register_shutdown_function(function () { if ($this->enableShutdown) { // Only run the tasks if an E_ERROR didn't occur. $err = \error_get_last(); if (!$err || $err['type'] ^ \E_ERROR) { $this->run(); } } }); } } public function isEmpty() { return !$this->queue; } public function add(callable $task) { $this->queue[] = $task; } public function run() { while ($task = \array_shift($this->queue)) { /** @var callable $task */ $task(); } } /** * The task queue will be run and exhausted by default when the process * exits IFF the exit is not the result of a PHP E_ERROR error. * * You can disable running the automatic shutdown of the queue by calling * this function. If you disable the task queue shutdown process, then you * MUST either run the task queue (as a result of running your event loop * or manually using the run() method) or wait on each outstanding promise. * * Note: This shutdown will occur before any destructors are triggered. */ public function disableShutdown() { $this->enableShutdown = \false; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/PromiseInterface.php000064400000005431147600374260024512 0ustar00then([$promise, 'resolve'], [$promise, 'reject']); return $promise; } return new FulfilledPromise($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. * If the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface */ public static function rejectionFor($reason) { if ($reason instanceof PromiseInterface) { return $reason; } return new RejectedPromise($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable */ public static function exceptionFor($reason) { if ($reason instanceof \Exception || $reason instanceof \Throwable) { return $reason; } return new RejectionException($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator */ public static function iterFor($value) { if ($value instanceof \Iterator) { return $value; } if (\is_array($value)) { return new \ArrayIterator($value); } return new \ArrayIterator([$value]); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/Each.php000064400000005153147600374260022114 0ustar00 $onFulfilled, 'rejected' => $onRejected]))->promise(); } /** * Like of, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow * for dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface */ public static function ofLimit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return (new EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency]))->promise(); } /** * Like limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface */ public static function ofLimitAll($iterable, $concurrency, callable $onFulfilled = null) { return self::ofLimit($iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate) { $aggregate->reject($reason); }); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/RejectedPromise.php000064400000004303147600374260024334 0ustar00reason = $reason; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // If there's no onRejected callback then just return self. if (!$onRejected) { return $this; } $queue = Utils::queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use($p, $reason, $onRejected) { if (Is::pending($p)) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); } catch (\Throwable $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } catch (\Exception $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { if ($unwrap) { throw Create::exceptionFor($this->reason); } return null; } public function getState() { return self::REJECTED; } public function resolve($value) { throw new \LogicException("Cannot resolve a rejected promise"); } public function reject($reason) { if ($reason !== $this->reason) { throw new \LogicException("Cannot reject a rejected promise"); } } public function cancel() { // pass } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/FulfilledPromise.php000064400000003637147600374260024526 0ustar00value = $value; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // Return itself if there is no onFulfilled function. if (!$onFulfilled) { return $this; } $queue = Utils::queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use($p, $value, $onFulfilled) { if (Is::pending($p)) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { $p->reject($e); } catch (\Exception $e) { $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { return $unwrap ? $this->value : null; } public function getState() { return self::FULFILLED; } public function resolve($value) { if ($value !== $this->value) { throw new \LogicException("Cannot resolve a fulfilled promise"); } } public function reject($reason) { throw new \LogicException("Cannot reject a fulfilled promise"); } public function cancel() { // pass } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/functions_include.php000064400000000331147600374260024760 0ustar00waitFn = $waitFn; $this->cancelFn = $cancelFn; } public function then(callable $onFulfilled = null, callable $onRejected = null) { if ($this->state === self::PENDING) { $p = new Promise(null, [$this, 'cancel']); $this->handlers[] = [$p, $onFulfilled, $onRejected]; $p->waitList = $this->waitList; $p->waitList[] = $this; return $p; } // Return a fulfilled promise and immediately invoke any callbacks. if ($this->state === self::FULFILLED) { $promise = Create::promiseFor($this->result); return $onFulfilled ? $promise->then($onFulfilled) : $promise; } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. $rejection = Create::rejectionFor($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true) { $this->waitIfPending(); if ($this->result instanceof PromiseInterface) { return $this->result->wait($unwrap); } if ($unwrap) { if ($this->state === self::FULFILLED) { return $this->result; } // It's rejected so "unwrap" and throw an exception. throw Create::exceptionFor($this->result); } } public function getState() { return $this->state; } public function cancel() { if ($this->state !== self::PENDING) { return; } $this->waitFn = $this->waitList = null; if ($this->cancelFn) { $fn = $this->cancelFn; $this->cancelFn = null; try { $fn(); } catch (\Throwable $e) { $this->reject($e); } catch (\Exception $e) { $this->reject($e); } } // Reject the promise only if it wasn't rejected in a then callback. /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject(new CancellationException('VendorDuplicator\\Promise has been cancelled')); } } public function resolve($value) { $this->settle(self::FULFILLED, $value); } public function reject($reason) { $this->settle(self::REJECTED, $reason); } private function settle($state, $value) { if ($this->state !== self::PENDING) { // Ignore calls with the same resolution. if ($state === $this->state && $value === $this->result) { return; } throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); } if ($value === $this) { throw new \LogicException('Cannot fulfill or reject a promise with itself'); } // Clear out the state of the promise but stash the handlers. $this->state = $state; $this->result = $value; $handlers = $this->handlers; $this->handlers = null; $this->waitList = $this->waitFn = null; $this->cancelFn = null; if (!$handlers) { return; } // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. if (!\is_object($value) || !\method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. Utils::queue()->add(static function () use($id, $value, $handlers) { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); } elseif ($value instanceof Promise && Is::pending($value)) { // We can just merge our handlers onto the next promise. $value->handlers = \array_merge($value->handlers, $handlers); } else { // Resolve the handlers when the forwarded promise is resolved. $value->then(static function ($value) use($handlers) { foreach ($handlers as $handler) { self::callHandler(1, $value, $handler); } }, static function ($reason) use($handlers) { foreach ($handlers as $handler) { self::callHandler(2, $reason, $handler); } }); } } /** * Call a stack of handlers using a specific callback index and value. * * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). */ private static function callHandler($index, $value, array $handler) { /** @var PromiseInterface $promise */ $promise = $handler[0]; // The promise may have been cancelled or resolved before placing // this thunk in the queue. if (Is::settled($promise)) { return; } try { if (isset($handler[$index])) { /* * If $f throws an exception, then $handler will be in the exception * stack trace. Since $handler contains a reference to the callable * itself we get a circular reference. We clear the $handler * here to avoid that memory leak. */ $f = $handler[$index]; unset($handler); $promise->resolve($f($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); } else { // Forward rejections down the chain. $promise->reject($value); } } catch (\Throwable $reason) { $promise->reject($reason); } catch (\Exception $reason) { $promise->reject($reason); } } private function waitIfPending() { if ($this->state !== self::PENDING) { return; } elseif ($this->waitFn) { $this->invokeWaitFn(); } elseif ($this->waitList) { $this->invokeWaitList(); } else { // If there's no wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); } Utils::queue()->run(); /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } } private function invokeWaitFn() { try { $wfn = $this->waitFn; $this->waitFn = null; $wfn(\true); } catch (\Exception $reason) { if ($this->state === self::PENDING) { // The promise has not been resolved yet, so reject the promise // with the exception. $this->reject($reason); } else { // The promise was already resolved, so there's a problem in // the application. throw $reason; } } } private function invokeWaitList() { $waitList = $this->waitList; $this->waitList = null; foreach ($waitList as $result) { do { $result->waitIfPending(); $result = $result->result; } while ($result instanceof Promise); if ($result instanceof PromiseInterface) { $result->wait(\false); } } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/CancellationException.php000064400000000310147600374260025515 0ustar00then(function ($v) { echo $v; }); * * @param callable $generatorFn Generator function to wrap into a promise. * * @return Promise * * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration */ final class Coroutine implements PromiseInterface { /** * @var PromiseInterface|null */ private $currentPromise; /** * @var Generator */ private $generator; /** * @var Promise */ private $result; public function __construct(callable $generatorFn) { $this->generator = $generatorFn(); $this->result = new Promise(function () { while (isset($this->currentPromise)) { $this->currentPromise->wait(); } }); try { $this->nextCoroutine($this->generator->current()); } catch (\Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * Create a new coroutine. * * @return self */ public static function of(callable $generatorFn) { return new self($generatorFn); } public function then(callable $onFulfilled = null, callable $onRejected = null) { return $this->result->then($onFulfilled, $onRejected); } public function otherwise(callable $onRejected) { return $this->result->otherwise($onRejected); } public function wait($unwrap = \true) { return $this->result->wait($unwrap); } public function getState() { return $this->result->getState(); } public function resolve($value) { $this->result->resolve($value); } public function reject($reason) { $this->result->reject($reason); } public function cancel() { $this->currentPromise->cancel(); $this->result->cancel(); } private function nextCoroutine($yielded) { $this->currentPromise = Create::promiseFor($yielded)->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } /** * @internal */ public function _handleSuccess($value) { unset($this->currentPromise); try { $next = $this->generator->send($value); if ($this->generator->valid()) { $this->nextCoroutine($next); } else { $this->result->resolve($value); } } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * @internal */ public function _handleFailure($reason) { unset($this->currentPromise); try { $nextYield = $this->generator->throw(Create::exceptionFor($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/promises/src/EachPromise.php000064400000016437147600374260023462 0ustar00iterable = Create::iterFor($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; } if (isset($config['fulfilled'])) { $this->onFulfilled = $config['fulfilled']; } if (isset($config['rejected'])) { $this->onRejected = $config['rejected']; } } /** @psalm-suppress InvalidNullableReturnType */ public function promise() { if ($this->aggregate) { return $this->aggregate; } try { $this->createPromise(); /** @psalm-assert Promise $this->aggregate */ $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { $this->aggregate->reject($e); } catch (\Exception $e) { $this->aggregate->reject($e); } /** * @psalm-suppress NullableReturnStatement * @phpstan-ignore-next-line */ return $this->aggregate; } private function createPromise() { $this->mutex = \false; $this->aggregate = new Promise(function () { if ($this->checkIfFinished()) { return; } \reset($this->pending); // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = \current($this->pending)) { \next($this->pending); $promise->wait(); if (Is::settled($this->aggregate)) { return; } } }); // Clear the references when the promise is resolved. $clearFn = function () { $this->iterable = $this->concurrency = $this->pending = null; $this->onFulfilled = $this->onRejected = null; $this->nextPendingIndex = 0; }; $this->aggregate->then($clearFn, $clearFn); } private function refillPending() { if (!$this->concurrency) { // Add all pending promises. while ($this->addPending() && $this->advanceIterator()) { } return; } // Add only up to N pending promises. $concurrency = \is_callable($this->concurrency) ? \call_user_func($this->concurrency, \count($this->pending)) : $this->concurrency; $concurrency = \max($concurrency - \count($this->pending), 0); // Concurrency may be set to 0 to disallow new promises. if (!$concurrency) { return; } // Add the first pending promise. $this->addPending(); // Note this is special handling for concurrency=1 so that we do // not advance the iterator after adding the first promise. This // helps work around issues with generators that might not have the // next value to yield until promise callbacks are called. while (--$concurrency && $this->advanceIterator() && $this->addPending()) { } } private function addPending() { if (!$this->iterable || !$this->iterable->valid()) { return \false; } $promise = Create::promiseFor($this->iterable->current()); $key = $this->iterable->key(); // Iterable keys may not be unique, so we use a counter to // guarantee uniqueness $idx = $this->nextPendingIndex++; $this->pending[$idx] = $promise->then(function ($value) use($idx, $key) { if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value, $key, $this->aggregate); } $this->step($idx); }, function ($reason) use($idx, $key) { if ($this->onRejected) { \call_user_func($this->onRejected, $reason, $key, $this->aggregate); } $this->step($idx); }); return \true; } private function advanceIterator() { // Place a lock on the iterator so that we ensure to not recurse, // preventing fatal generator errors. if ($this->mutex) { return \false; } $this->mutex = \true; try { $this->iterable->next(); $this->mutex = \false; return \true; } catch (\Throwable $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } catch (\Exception $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } } private function step($idx) { // If the promise was already resolved, then ignore this step. if (Is::settled($this->aggregate)) { return; } unset($this->pending[$idx]); // Only refill pending promises if we are not locked, preventing the // EachPromise to recursively invoke the provided iterator, which // cause a fatal error: "Cannot resume an already running generator" if ($this->advanceIterator() && !$this->checkIfFinished()) { // Add more pending promises if possible. $this->refillPending(); } } private function checkIfFinished() { if (!$this->pending && !$this->iterable->valid()) { // Resolve the promise if there's nothing left to do. $this->aggregate->resolve(null); return \true; } return \false; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Stream.php000064400000015215147600374260021541 0ustar00size = $options['size']; } $this->customMetadata = isset($options['metadata']) ? $options['metadata'] : []; $this->stream = $stream; $meta = \stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } /** * Closes the stream when the destructed */ public function __destruct() { $this->close(); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { return ''; } } public function getContents() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $contents = \stream_get_contents($this->stream); if ($contents === \false) { throw new \RuntimeException('Unable to read stream contents'); } return $contents; } public function close() { if (isset($this->stream)) { if (\is_resource($this->stream)) { \fclose($this->stream); } $this->detach(); } } public function detach() { if (!isset($this->stream)) { return null; } $result = $this->stream; unset($this->stream); $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = \false; return $result; } public function getSize() { if ($this->size !== null) { return $this->size; } if (!isset($this->stream)) { return null; } // Clear the stat cache if the stream has a URI if ($this->uri) { \clearstatcache(\true, $this->uri); } $stats = \fstat($this->stream); if (isset($stats['size'])) { $this->size = $stats['size']; return $this->size; } return null; } public function isReadable() { return $this->readable; } public function isWritable() { return $this->writable; } public function isSeekable() { return $this->seekable; } public function eof() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } return \feof($this->stream); } public function tell() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $result = \ftell($this->stream); if ($result === \false) { throw new \RuntimeException('Unable to determine stream position'); } return $result; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $whence = (int) $whence; if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); } if (\fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); } } public function read($length) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } if ($length < 0) { throw new \RuntimeException('Length parameter cannot be negative'); } if (0 === $length) { return ''; } $string = \fread($this->stream, $length); if (\false === $string) { throw new \RuntimeException('Unable to read from stream'); } return $string; } public function write($string) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } // We can't know the size after writing anything $this->size = null; $result = \fwrite($this->stream, $string); if ($result === \false) { throw new \RuntimeException('Unable to write to stream'); } return $result; } public function getMetadata($key = null) { if (!isset($this->stream)) { return $key ? null : []; } elseif (!$key) { return $this->customMetadata + \stream_get_meta_data($this->stream); } elseif (isset($this->customMetadata[$key])) { return $this->customMetadata[$key]; } $meta = \stream_get_meta_data($this->stream); return isset($meta[$key]) ? $meta[$key] : null; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/LazyOpenStream.php000064400000001641147600374260023221 0ustar00filename = $filename; $this->mode = $mode; } /** * Creates the underlying stream lazily when required. * * @return StreamInterface */ protected function createStream() { return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Utils.php000064400000033714147600374260021412 0ustar00 $keys * * @return array */ public static function caselessRemove($keys, array $data) { $result = []; foreach ($keys as &$key) { $key = \strtolower($key); } foreach ($data as $k => $v) { if (!\in_array(\strtolower($k), $keys)) { $result[$k] = $v; } } return $result; } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ public static function copyToStream(StreamInterface $source, StreamInterface $dest, $maxLen = -1) { $bufferSize = 8192; if ($maxLen === -1) { while (!$source->eof()) { if (!$dest->write($source->read($bufferSize))) { break; } } } else { $remaining = $maxLen; while ($remaining > 0 && !$source->eof()) { $buf = $source->read(\min($bufferSize, $remaining)); $len = \strlen($buf); if (!$len) { break; } $remaining -= $len; $dest->write($buf); } } } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @return string * * @throws \RuntimeException on error. */ public static function copyToString(StreamInterface $stream, $maxLen = -1) { $buffer = ''; if ($maxLen === -1) { while (!$stream->eof()) { $buf = $stream->read(1048576); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; } return $buffer; } $len = 0; while (!$stream->eof() && $len < $maxLen) { $buf = $stream->read($maxLen - $len); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; $len = \strlen($buffer); } return $buffer; } /** * Calculate a hash of a stream. * * This method reads the entire stream to calculate a rolling hash, based * on PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream * * @throws \RuntimeException on error. */ public static function hash(StreamInterface $stream, $algo, $rawOutput = \false) { $pos = $stream->tell(); if ($pos > 0) { $stream->rewind(); } $ctx = \hash_init($algo); while (!$stream->eof()) { \hash_update($ctx, $stream->read(1048576)); } $out = \hash_final($ctx, (bool) $rawOutput); $stream->seek($pos); return $out; } /** * Clone and modify a request with the given changes. * * This method is useful for reducing the number of clones needed to mutate * a message. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. * * @return RequestInterface */ public static function modifyRequest(RequestInterface $request, array $changes) { if (!$changes) { return $request; } $headers = $request->getHeaders(); if (!isset($changes['uri'])) { $uri = $request->getUri(); } else { // Remove the host header if one is on the URI if ($host = $changes['uri']->getHost()) { $changes['set_headers']['Host'] = $host; if ($port = $changes['uri']->getPort()) { $standardPorts = ['http' => 80, 'https' => 443]; $scheme = $changes['uri']->getScheme(); if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { $changes['set_headers']['Host'] .= ':' . $port; } } } $uri = $changes['uri']; } if (!empty($changes['remove_headers'])) { $headers = self::caselessRemove($changes['remove_headers'], $headers); } if (!empty($changes['set_headers'])) { $headers = self::caselessRemove(\array_keys($changes['set_headers']), $headers); $headers = $changes['set_headers'] + $headers; } if (isset($changes['query'])) { $uri = $uri->withQuery($changes['query']); } if ($request instanceof ServerRequestInterface) { $new = (new ServerRequest(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion(), $request->getServerParams()))->withParsedBody($request->getParsedBody())->withQueryParams($request->getQueryParams())->withCookieParams($request->getCookieParams())->withUploadedFiles($request->getUploadedFiles()); foreach ($request->getAttributes() as $key => $value) { $new = $new->withAttribute($key, $value); } return $new; } return new Request(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion()); } /** * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from * @param int|null $maxLength Maximum buffer length * * @return string */ public static function readLine(StreamInterface $stream, $maxLength = null) { $buffer = ''; $size = 0; while (!$stream->eof()) { // Using a loose equality here to match on '' and false. if (null == ($byte = $stream->read(1))) { return $buffer; } $buffer .= $byte; // Break when a new line is found or the max length - 1 is reached if ($byte === "\n" || ++$size === $maxLength - 1) { break; } } return $buffer; } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * This method accepts the following `$resource` types: * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. * - `string`: Creates a stream object that uses the given string as the contents. * - `resource`: Creates a stream object that wraps the given PHP stream resource. * - `Iterator`: If the provided value implements `Iterator`, then a read-only * stream object will be created that wraps the given iterable. Each time the * stream is read from, data from the iterator will fill a buffer and will be * continuously called until the buffer is equal to the requested read size. * Subsequent read calls will first read from the buffer and then call `next` * on the underlying iterator until it is exhausted. * - `object` with `__toString()`: If the object has the `__toString()` method, * the object will be cast to a string and then a stream will be returned that * uses the string value. * - `NULL`: When `null` is passed, an empty stream object is returned. * - `callable` When a callable is passed, a read-only stream object will be * created that invokes the given callable. The callable is invoked with the * number of suggested bytes to read. The callable can return any number of * bytes, but MUST return `false` when there is no more data to return. The * stream object that wraps the callable will invoke the callable until the * number of requested bytes are available. Any additional bytes will be * buffered and used in subsequent reads. * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array $options Additional options * * @return StreamInterface * * @throws \InvalidArgumentException if the $resource arg is not valid. */ public static function streamFor($resource = '', array $options = []) { if (\is_scalar($resource)) { $stream = self::tryFopen('php://temp', 'r+'); if ($resource !== '') { \fwrite($stream, $resource); \fseek($stream, 0); } return new Stream($stream, $options); } switch (\gettype($resource)) { case 'resource': /* * The 'php://input' is a special stream with quirks and inconsistencies. * We avoid using that stream by reading it into php://temp */ $metaData = \stream_get_meta_data($resource); if (isset($metaData['uri']) && $metaData['uri'] === 'php://input') { $stream = self::tryFopen('php://temp', 'w+'); \fwrite($stream, \stream_get_contents($resource)); \fseek($stream, 0); $resource = $stream; } return new Stream($resource, $options); case 'object': if ($resource instanceof StreamInterface) { return $resource; } elseif ($resource instanceof \Iterator) { return new PumpStream(function () use($resource) { if (!$resource->valid()) { return \false; } $result = $resource->current(); $resource->next(); return $result; }, $options); } elseif (\method_exists($resource, '__toString')) { return Utils::streamFor((string) $resource, $options); } break; case 'NULL': return new Stream(self::tryFopen('php://temp', 'r+'), $options); } if (\is_callable($resource)) { return new PumpStream($resource, $options); } throw new \InvalidArgumentException('Invalid resource type: ' . \gettype($resource)); } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param string $filename File to open * @param string $mode Mode used to open the file * * @return resource * * @throws \RuntimeException if the file cannot be opened */ public static function tryFopen($filename, $mode) { $ex = null; \set_error_handler(function () use($filename, $mode, &$ex) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, \func_get_args()[1])); return \true; }); try { $handle = \fopen($filename, $mode); } catch (\Throwable $e) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage()), 0, $e); } \restore_error_handler(); if ($ex) { /** @var $ex \RuntimeException */ throw $ex; } return $handle; } /** * Returns a UriInterface for the given value. * * This function accepts a string or UriInterface and returns a * UriInterface for the given value. If the value is already a * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface * * @throws \InvalidArgumentException */ public static function uriFor($uri) { if ($uri instanceof UriInterface) { return $uri; } if (\is_string($uri)) { return new Uri($uri); } throw new \InvalidArgumentException('URI must be a string or UriInterface'); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Response.php000064400000010357147600374260022106 0ustar00 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required']; /** @var string */ private $reasonPhrase = ''; /** @var int */ private $statusCode = 200; /** * @param int $status Status code * @param array $headers Response headers * @param string|resource|StreamInterface|null $body Response body * @param string $version Protocol version * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { $this->assertStatusCodeIsInteger($status); $status = (int) $status; $this->assertStatusCodeRange($status); $this->statusCode = $status; if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } $this->setHeaders($headers); if ($reason == '' && isset(self::$phrases[$this->statusCode])) { $this->reasonPhrase = self::$phrases[$this->statusCode]; } else { $this->reasonPhrase = (string) $reason; } $this->protocol = $version; } public function getStatusCode() { return $this->statusCode; } public function getReasonPhrase() { return $this->reasonPhrase; } public function withStatus($code, $reasonPhrase = '') { $this->assertStatusCodeIsInteger($code); $code = (int) $code; $this->assertStatusCodeRange($code); $new = clone $this; $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { $reasonPhrase = self::$phrases[$new->statusCode]; } $new->reasonPhrase = (string) $reasonPhrase; return $new; } private function assertStatusCodeIsInteger($statusCode) { if (\filter_var($statusCode, \FILTER_VALIDATE_INT) === \false) { throw new \InvalidArgumentException('Status code must be an integer value.'); } } private function assertStatusCodeRange($statusCode) { if ($statusCode < 100 || $statusCode >= 600) { throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Rfc7230.php000064400000001271147600374260021331 0ustar00@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/functions.php000064400000032243147600374260022316 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array * * @deprecated parse_query will be removed in guzzlehttp/psr7:2.0. Use Query::parse instead. */ function parse_query($str, $urlEncoding = \true) { return Query::parse($str, $urlEncoding); } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse_query()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string * * @deprecated build_query will be removed in guzzlehttp/psr7:2.0. Use Query::build instead. */ function build_query(array $params, $encoding = \PHP_QUERY_RFC3986) { return Query::build($params, $encoding); } /** * Determines the mimetype of a file by looking at its extension. * * @param string $filename * * @return string|null * * @deprecated mimetype_from_filename will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromFilename instead. */ function mimetype_from_filename($filename) { return MimeType::fromFilename($filename); } /** * Maps a file extensions to a mimetype. * * @param $extension string The file extension. * * @return string|null * * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types * @deprecated mimetype_from_extension will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromExtension instead. */ function mimetype_from_extension($extension) { return MimeType::fromExtension($extension); } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array * * @internal * * @deprecated _parse_message will be removed in guzzlehttp/psr7:2.0. Use Message::parseMessage instead. */ function _parse_message($message) { return Message::parseMessage($message); } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string * * @internal * * @deprecated _parse_request_uri will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequestUri instead. */ function _parse_request_uri($path, array $headers) { return Message::parseRequestUri($path, $headers); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null * * @deprecated get_message_body_summary will be removed in guzzlehttp/psr7:2.0. Use Message::bodySummary instead. */ function get_message_body_summary(MessageInterface $message, $truncateAt = 120) { return Message::bodySummary($message, $truncateAt); } /** * Remove the items given by the keys, case insensitively from the data. * * @param iterable $keys * * @return array * * @internal * * @deprecated _caseless_remove will be removed in guzzlehttp/psr7:2.0. Use Utils::caselessRemove instead. */ function _caseless_remove($keys, array $data) { return Utils::caselessRemove($keys, $data); } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/PumpStream.php000064400000010005147600374260022373 0ustar00source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return Utils::copyToString($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = \false; $this->source = null; return null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return \false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return \true; } public function read($length) { $data = $this->buffer->read($length); $readLen = \strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += \strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = \call_user_func($this->source, $length); if ($data === \false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= \strlen($data); } while ($length > 0); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/FnStream.php000064400000007570147600374260022032 0ustar00methods = $methods; // Create the functions on the class foreach ($methods as $name => $fn) { $this->{'_fn_' . $name} = $fn; } } /** * Lazily determine which methods are not implemented. * * @throws \BadMethodCallException */ public function __get($name) { throw new \BadMethodCallException(\str_replace('_fn_', '', $name) . '() is not implemented in the FnStream'); } /** * The close method is called on the underlying stream only if possible. */ public function __destruct() { if (isset($this->_fn_close)) { \call_user_func($this->_fn_close); } } /** * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. * * @throws \LogicException */ public function __wakeup() { throw new \LogicException('FnStream should never be unserialized'); } /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. * * @param StreamInterface $stream Stream to decorate * @param array $methods Hash of method name to a closure * * @return FnStream */ public static function decorate(StreamInterface $stream, array $methods) { // If any of the required methods were not provided, then simply // proxy to the decorated stream. foreach (\array_diff(self::$slots, \array_keys($methods)) as $diff) { $methods[$diff] = [$stream, $diff]; } return new self($methods); } public function __toString() { return \call_user_func($this->_fn___toString); } public function close() { return \call_user_func($this->_fn_close); } public function detach() { return \call_user_func($this->_fn_detach); } public function getSize() { return \call_user_func($this->_fn_getSize); } public function tell() { return \call_user_func($this->_fn_tell); } public function eof() { return \call_user_func($this->_fn_eof); } public function isSeekable() { return \call_user_func($this->_fn_isSeekable); } public function rewind() { \call_user_func($this->_fn_rewind); } public function seek($offset, $whence = \SEEK_SET) { \call_user_func($this->_fn_seek, $offset, $whence); } public function isWritable() { return \call_user_func($this->_fn_isWritable); } public function write($string) { return \call_user_func($this->_fn_write, $string); } public function isReadable() { return \call_user_func($this->_fn_isReadable); } public function read($length) { return \call_user_func($this->_fn_read, $length); } public function getContents() { return \call_user_func($this->_fn_getContents); } public function getMetadata($key = null) { return \call_user_func($this->_fn_getMetadata, $key); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Uri.php000064400000053154147600374260021051 0ustar00 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389]; private static $charUnreserved = 'a-zA-Z0-9_\\-\\.~'; private static $charSubDelims = '!\\$&\'\\(\\)\\*\\+,;='; private static $replaceQuery = ['=' => '%3D', '&' => '%26']; /** @var string Uri scheme. */ private $scheme = ''; /** @var string Uri user info. */ private $userInfo = ''; /** @var string Uri host. */ private $host = ''; /** @var int|null Uri port. */ private $port; /** @var string Uri path. */ private $path = ''; /** @var string Uri query string. */ private $query = ''; /** @var string Uri fragment. */ private $fragment = ''; /** * @param string $uri URI to parse */ public function __construct($uri = '') { // weak type check to also accept null until we can add scalar type hints if ($uri != '') { $parts = self::parse($uri); if ($parts === \false) { throw new \InvalidArgumentException("Unable to parse URI: {$uri}"); } $this->applyParts($parts); } } /** * UTF-8 aware \parse_url() replacement. * * The internal function produces broken output for non ASCII domain names * (IDN) when used with locales other than "C". * * On the other hand, cURL understands IDN correctly only when UTF-8 locale * is configured ("C.UTF-8", "en_US.UTF-8", etc.). * * @see https://bugs.php.net/bug.php?id=52923 * @see https://www.php.net/manual/en/function.parse-url.php#114817 * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING * * @param string $url * * @return array|false */ private static function parse($url) { // If IPv6 $prefix = ''; if (\preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) { $prefix = $matches[1]; $url = $matches[2]; } $encodedUrl = \preg_replace_callback('%[^:/@?&=#]+%usD', static function ($matches) { return \urlencode($matches[0]); }, $url); $result = \parse_url($prefix . $encodedUrl); if ($result === \false) { return \false; } return \array_map('urldecode', $result); } public function __toString() { return self::composeComponents($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); } /** * Composes a URI reference string from its various components. * * Usually this method does not need to be called manually but instead is used indirectly via * `Psr\Http\Message\UriInterface::__toString`. * * PSR-7 UriInterface treats an empty component the same as a missing component as * getQuery(), getFragment() etc. always return a string. This explains the slight * difference to RFC 3986 Section 5.3. * * Another adjustment is that the authority separator is added even when the authority is missing/empty * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to * that format). * * @param string $scheme * @param string $authority * @param string $path * @param string $query * @param string $fragment * * @return string * * @link https://tools.ietf.org/html/rfc3986#section-5.3 */ public static function composeComponents($scheme, $authority, $path, $query, $fragment) { $uri = ''; // weak type checks to also accept null until we can add scalar type hints if ($scheme != '') { $uri .= $scheme . ':'; } if ($authority != '' || $scheme === 'file') { $uri .= '//' . $authority; } $uri .= $path; if ($query != '') { $uri .= '?' . $query; } if ($fragment != '') { $uri .= '#' . $fragment; } return $uri; } /** * Whether the URI has the default port of the current scheme. * * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used * independently of the implementation. * * @param UriInterface $uri * * @return bool */ public static function isDefaultPort(UriInterface $uri) { return $uri->getPort() === null || isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]; } /** * Whether the URI is absolute, i.e. it has a scheme. * * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative * to another URI, the base URI. Relative references can be divided into several forms: * - network-path references, e.g. '//example.com/path' * - absolute-path references, e.g. '/path' * - relative-path references, e.g. 'subpath' * * @param UriInterface $uri * * @return bool * * @see Uri::isNetworkPathReference * @see Uri::isAbsolutePathReference * @see Uri::isRelativePathReference * @link https://tools.ietf.org/html/rfc3986#section-4 */ public static function isAbsolute(UriInterface $uri) { return $uri->getScheme() !== ''; } /** * Whether the URI is a network-path reference. * * A relative reference that begins with two slash characters is termed an network-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isNetworkPathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() !== ''; } /** * Whether the URI is a absolute-path reference. * * A relative reference that begins with a single slash character is termed an absolute-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isAbsolutePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; } /** * Whether the URI is a relative-path reference. * * A relative reference that does not begin with a slash character is termed a relative-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isRelativePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); } /** * Whether the URI is a same-document reference. * * A same-document reference refers to a URI that is, aside from its fragment * component, identical to the base URI. When no base URI is given, only an empty * URI reference (apart from its fragment) is considered a same-document reference. * * @param UriInterface $uri The URI to check * @param UriInterface|null $base An optional base URI to compare against * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.4 */ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) { if ($base !== null) { $uri = UriResolver::resolve($base, $uri); return $uri->getScheme() === $base->getScheme() && $uri->getAuthority() === $base->getAuthority() && $uri->getPath() === $base->getPath() && $uri->getQuery() === $base->getQuery(); } return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; } /** * Removes dot segments from a path and returns the new path. * * @param string $path * * @return string * * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. * @see UriResolver::removeDotSegments */ public static function removeDotSegments($path) { return UriResolver::removeDotSegments($path); } /** * Converts the relative URI into a new URI that is resolved against the base URI. * * @param UriInterface $base Base URI * @param string|UriInterface $rel Relative URI * * @return UriInterface * * @deprecated since version 1.4. Use UriResolver::resolve instead. * @see UriResolver::resolve */ public static function resolve(UriInterface $base, $rel) { if (!$rel instanceof UriInterface) { $rel = new self($rel); } return UriResolver::resolve($base, $rel); } /** * Creates a new URI with a specific query string value removed. * * Any existing query string values that exactly match the provided key are * removed. * * @param UriInterface $uri URI to use as a base. * @param string $key Query string key to remove. * * @return UriInterface */ public static function withoutQueryValue(UriInterface $uri, $key) { $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with a specific query string value. * * Any existing query string values that exactly match the provided key are * removed and replaced with the given key value pair. * * A value of null will set the query string key without a value, e.g. "key" * instead of "key=value". * * @param UriInterface $uri URI to use as a base. * @param string $key Key to set. * @param string|null $value Value to set * * @return UriInterface */ public static function withQueryValue(UriInterface $uri, $key, $value) { $result = self::getFilteredQueryString($uri, [$key]); $result[] = self::generateQueryString($key, $value); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with multiple specific query string values. * * It has the same behavior as withQueryValue() but for an associative array of key => value. * * @param UriInterface $uri URI to use as a base. * @param array $keyValueArray Associative array of key and values * * @return UriInterface */ public static function withQueryValues(UriInterface $uri, array $keyValueArray) { $result = self::getFilteredQueryString($uri, \array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(\implode('&', $result)); } /** * Creates a URI from a hash of `parse_url` components. * * @param array $parts * * @return UriInterface * * @link http://php.net/manual/en/function.parse-url.php * * @throws \InvalidArgumentException If the components do not form a valid URI. */ public static function fromParts(array $parts) { $uri = new self(); $uri->applyParts($parts); $uri->validateState(); return $uri; } public function getScheme() { return $this->scheme; } public function getAuthority() { $authority = $this->host; if ($this->userInfo !== '') { $authority = $this->userInfo . '@' . $authority; } if ($this->port !== null) { $authority .= ':' . $this->port; } return $authority; } public function getUserInfo() { return $this->userInfo; } public function getHost() { return $this->host; } public function getPort() { return $this->port; } public function getPath() { return $this->path; } public function getQuery() { return $this->query; } public function getFragment() { return $this->fragment; } public function withScheme($scheme) { $scheme = $this->filterScheme($scheme); if ($this->scheme === $scheme) { return $this; } $new = clone $this; $new->scheme = $scheme; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withUserInfo($user, $password = null) { $info = $this->filterUserInfoComponent($user); if ($password !== null) { $info .= ':' . $this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { return $this; } $new = clone $this; $new->userInfo = $info; $new->validateState(); return $new; } public function withHost($host) { $host = $this->filterHost($host); if ($this->host === $host) { return $this; } $new = clone $this; $new->host = $host; $new->validateState(); return $new; } public function withPort($port) { $port = $this->filterPort($port); if ($this->port === $port) { return $this; } $new = clone $this; $new->port = $port; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withPath($path) { $path = $this->filterPath($path); if ($this->path === $path) { return $this; } $new = clone $this; $new->path = $path; $new->validateState(); return $new; } public function withQuery($query) { $query = $this->filterQueryAndFragment($query); if ($this->query === $query) { return $this; } $new = clone $this; $new->query = $query; return $new; } public function withFragment($fragment) { $fragment = $this->filterQueryAndFragment($fragment); if ($this->fragment === $fragment) { return $this; } $new = clone $this; $new->fragment = $fragment; return $new; } /** * Apply parse_url parts to a URI. * * @param array $parts Array of parse_url parts to apply. */ private function applyParts(array $parts) { $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); } /** * @param string $scheme * * @return string * * @throws \InvalidArgumentException If the scheme is invalid. */ private function filterScheme($scheme) { if (!\is_string($scheme)) { throw new \InvalidArgumentException('Scheme must be a string'); } return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param string $component * * @return string * * @throws \InvalidArgumentException If the user info is invalid. */ private function filterUserInfoComponent($component) { if (!\is_string($component)) { throw new \InvalidArgumentException('User info must be a string'); } return \preg_replace_callback('/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component); } /** * @param string $host * * @return string * * @throws \InvalidArgumentException If the host is invalid. */ private function filterHost($host) { if (!\is_string($host)) { throw new \InvalidArgumentException('Host must be a string'); } return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param int|null $port * * @return int|null * * @throws \InvalidArgumentException If the port is invalid. */ private function filterPort($port) { if ($port === null) { return null; } $port = (int) $port; if (0 > $port || 0xffff < $port) { throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); } return $port; } /** * @param UriInterface $uri * @param array $keys * * @return array */ private static function getFilteredQueryString(UriInterface $uri, array $keys) { $current = $uri->getQuery(); if ($current === '') { return []; } $decodedKeys = \array_map('rawurldecode', $keys); return \array_filter(\explode('&', $current), function ($part) use($decodedKeys) { return !\in_array(\rawurldecode(\explode('=', $part)[0]), $decodedKeys, \true); }); } /** * @param string $key * @param string|null $value * * @return string */ private static function generateQueryString($key, $value) { // Query string separators ("=", "&") within the key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = \strtr($key, self::$replaceQuery); if ($value !== null) { $queryString .= '=' . \strtr($value, self::$replaceQuery); } return $queryString; } private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { $this->port = null; } } /** * Filters the path of a URI * * @param string $path * * @return string * * @throws \InvalidArgumentException If the path is invalid. */ private function filterPath($path) { if (!\is_string($path)) { throw new \InvalidArgumentException('Path must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path); } /** * Filters the query string or fragment of a URI. * * @param string $str * * @return string * * @throws \InvalidArgumentException If the query or fragment is invalid. */ private function filterQueryAndFragment($str) { if (!\is_string($str)) { throw new \InvalidArgumentException('Query and fragment must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str); } private function rawurlencodeMatchZero(array $match) { return \rawurlencode($match[0]); } private function validateState() { if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { $this->host = self::HTTP_DEFAULT_HOST; } if ($this->getAuthority() === '') { if (0 === \strpos($this->path, '//')) { throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); } if ($this->scheme === '' && \false !== \strpos(\explode('/', $this->path, 2)[0], ':')) { throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); } } elseif (isset($this->path[0]) && $this->path[0] !== '/') { @\trigger_error('The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', \E_USER_DEPRECATED); $this->path = '/' . $this->path; //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/UploadedFile.php000064400000016331147600374260022643 0ustar00setError($errorStatus); $this->setSize($size); $this->setClientFilename($clientFilename); $this->setClientMediaType($clientMediaType); if ($this->isOk()) { $this->setStreamOrFile($streamOrFile); } } /** * Depending on the value set file or stream variable * * @param mixed $streamOrFile * * @throws InvalidArgumentException */ private function setStreamOrFile($streamOrFile) { if (\is_string($streamOrFile)) { $this->file = $streamOrFile; } elseif (\is_resource($streamOrFile)) { $this->stream = new Stream($streamOrFile); } elseif ($streamOrFile instanceof StreamInterface) { $this->stream = $streamOrFile; } else { throw new InvalidArgumentException('Invalid stream or file provided for UploadedFile'); } } /** * @param int $error * * @throws InvalidArgumentException */ private function setError($error) { if (\false === \is_int($error)) { throw new InvalidArgumentException('Upload file error status must be an integer'); } if (\false === \in_array($error, UploadedFile::$errors)) { throw new InvalidArgumentException('Invalid error status for UploadedFile'); } $this->error = $error; } /** * @param int $size * * @throws InvalidArgumentException */ private function setSize($size) { if (\false === \is_int($size)) { throw new InvalidArgumentException('Upload file size must be an integer'); } $this->size = $size; } /** * @param mixed $param * * @return bool */ private function isStringOrNull($param) { return \in_array(\gettype($param), ['string', 'NULL']); } /** * @param mixed $param * * @return bool */ private function isStringNotEmpty($param) { return \is_string($param) && \false === empty($param); } /** * @param string|null $clientFilename * * @throws InvalidArgumentException */ private function setClientFilename($clientFilename) { if (\false === $this->isStringOrNull($clientFilename)) { throw new InvalidArgumentException('Upload file client filename must be a string or null'); } $this->clientFilename = $clientFilename; } /** * @param string|null $clientMediaType * * @throws InvalidArgumentException */ private function setClientMediaType($clientMediaType) { if (\false === $this->isStringOrNull($clientMediaType)) { throw new InvalidArgumentException('Upload file client media type must be a string or null'); } $this->clientMediaType = $clientMediaType; } /** * Return true if there is no upload error * * @return bool */ private function isOk() { return $this->error === \UPLOAD_ERR_OK; } /** * @return bool */ public function isMoved() { return $this->moved; } /** * @throws RuntimeException if is moved or not ok */ private function validateActive() { if (\false === $this->isOk()) { throw new RuntimeException('Cannot retrieve stream due to upload error'); } if ($this->isMoved()) { throw new RuntimeException('Cannot retrieve stream after it has already been moved'); } } /** * {@inheritdoc} * * @throws RuntimeException if the upload was not successful. */ public function getStream() { $this->validateActive(); if ($this->stream instanceof StreamInterface) { return $this->stream; } return new LazyOpenStream($this->file, 'r+'); } /** * {@inheritdoc} * * @see http://php.net/is_uploaded_file * @see http://php.net/move_uploaded_file * * @param string $targetPath Path to which to move the uploaded file. * * @throws RuntimeException if the upload was not successful. * @throws InvalidArgumentException if the $path specified is invalid. * @throws RuntimeException on any error during the move operation, or on * the second or subsequent call to the method. */ public function moveTo($targetPath) { $this->validateActive(); if (\false === $this->isStringNotEmpty($targetPath)) { throw new InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); } if ($this->file) { $this->moved = \php_sapi_name() == 'cli' ? \rename($this->file, $targetPath) : \move_uploaded_file($this->file, $targetPath); } else { Utils::copyToStream($this->getStream(), new LazyOpenStream($targetPath, 'w')); $this->moved = \true; } if (\false === $this->moved) { throw new RuntimeException(\sprintf('Uploaded file could not be moved to %s', $targetPath)); } } /** * {@inheritdoc} * * @return int|null The file size in bytes or null if unknown. */ public function getSize() { return $this->size; } /** * {@inheritdoc} * * @see http://php.net/manual/en/features.file-upload.errors.php * * @return int One of PHP's UPLOAD_ERR_XXX constants. */ public function getError() { return $this->error; } /** * {@inheritdoc} * * @return string|null The filename sent by the client or null if none * was provided. */ public function getClientFilename() { return $this->clientFilename; } /** * {@inheritdoc} */ public function getClientMediaType() { return $this->clientMediaType; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/NoSeekStream.php000064400000000730147600374260022642 0ustar00getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { $uri = $uri->withPath('/'); } if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { $uri = $uri->withHost(''); } if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { $uri = $uri->withPort(null); } if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { $queryKeyValues = \explode('&', $uri->getQuery()); \sort($queryKeyValues); $uri = $uri->withQuery(\implode('&', $queryKeyValues)); } return $uri; } /** * Whether two URIs can be considered equivalent. * * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be * resolved against the same base URI. If this is not the case, determination of equivalence or difference of * relative references does not mean anything. * * @param UriInterface $uri1 An URI to compare * @param UriInterface $uri2 An URI to compare * @param int $normalizations A bitmask of normalizations to apply, see constants * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-6.1 */ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) { return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); } private static function capitalizePercentEncoding(UriInterface $uri) { $regex = '/(?:%[A-Fa-f0-9]{2})++/'; $callback = function (array $match) { return \strtoupper($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private static function decodeUnreservedCharacters(UriInterface $uri) { $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; $callback = function (array $match) { return \rawurldecode($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private function __construct() { // cannot be instantiated } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php000064400000006336147600374260024414 0ustar00stream = $stream; } /** * Magic method used to create a new stream if streams are not added in * the constructor of a decorator (e.g., LazyOpenStream). * * @param string $name Name of the property (allows "stream" only). * * @return StreamInterface */ public function __get($name) { if ($name == 'stream') { $this->stream = $this->createStream(); return $this->stream; } throw new \UnexpectedValueException("{$name} not found on class"); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { // Really, PHP? https://bugs.php.net/bug.php?id=53648 \trigger_error('StreamDecorator::__toString exception: ' . (string) $e, \E_USER_ERROR); return ''; } } public function getContents() { return Utils::copyToString($this); } /** * Allow decorators to implement custom methods * * @param string $method Missing method name * @param array $args Method arguments * * @return mixed */ public function __call($method, array $args) { $result = \call_user_func_array([$this->stream, $method], $args); // Always return the wrapped object if the result is a return $this return $result === $this->stream ? $this : $result; } public function close() { $this->stream->close(); } public function getMetadata($key = null) { return $this->stream->getMetadata($key); } public function detach() { return $this->stream->detach(); } public function getSize() { return $this->stream->getSize(); } public function eof() { return $this->stream->eof(); } public function tell() { return $this->stream->tell(); } public function isReadable() { return $this->stream->isReadable(); } public function isWritable() { return $this->stream->isWritable(); } public function isSeekable() { return $this->stream->isSeekable(); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $this->stream->seek($offset, $whence); } public function read($length) { return $this->stream->read($length); } public function write($string) { return $this->stream->write($string); } /** * Implement in subclasses to dynamically create streams when requested. * * @return StreamInterface * * @throws \BadMethodCallException */ protected function createStream() { throw new \BadMethodCallException('Not implemented'); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/MimeType.php000064400000007447147600374260022047 0ustar00 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aac' => 'audio/x-aac', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'asc' => 'text/plain', 'asf' => 'video/x-ms-asf', 'atom' => 'application/atom+xml', 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'bz2' => 'application/x-bzip2', 'cer' => 'application/pkix-cert', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'css' => 'text/css', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'deb' => 'application/x-debian-package', 'doc' => 'application/msword', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dvi' => 'application/x-dvi', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'etx' => 'text/x-setext', 'flac' => 'audio/flac', 'flv' => 'video/x-flv', 'gif' => 'image/gif', 'gz' => 'application/gzip', 'htm' => 'text/html', 'html' => 'text/html', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ini' => 'text/plain', 'iso' => 'application/x-iso9660-image', 'jar' => 'application/java-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'text/javascript', 'json' => 'application/json', 'latex' => 'application/x-latex', 'log' => 'text/plain', 'm4a' => 'audio/mp4', 'm4v' => 'video/mp4', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mov' => 'video/quicktime', 'mkv' => 'video/x-matroska', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4v' => 'video/mp4', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'pbm' => 'image/x-portable-bitmap', 'pdf' => 'application/pdf', 'pgm' => 'image/x-portable-graymap', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/vnd.ms-powerpoint', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'svg' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 'tar' => 'application/x-tar', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'torrent' => 'application/x-bittorrent', 'ttf' => 'application/x-font-ttf', 'txt' => 'text/plain', 'wav' => 'audio/x-wav', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wma' => 'audio/x-ms-wma', 'wmv' => 'video/x-ms-wmv', 'woff' => 'application/x-font-woff', 'wsdl' => 'application/wsdl+xml', 'xbm' => 'image/x-xbitmap', 'xls' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xml' => 'application/xml', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'yaml' => 'text/yaml', 'yml' => 'text/yaml', 'zip' => 'application/zip']; $extension = \strtolower($extension); return isset($mimetypes[$extension]) ? $mimetypes[$extension] : null; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/AppendStream.php000064400000013145147600374260022671 0ustar00addStream($stream); } } public function __toString() { try { $this->rewind(); return $this->getContents(); } catch (\Exception $e) { return ''; } } /** * Add a stream to the AppendStream * * @param StreamInterface $stream Stream to append. Must be readable. * * @throws \InvalidArgumentException if the stream is not readable */ public function addStream(StreamInterface $stream) { if (!$stream->isReadable()) { throw new \InvalidArgumentException('Each stream must be readable'); } // The stream is only seekable if all streams are seekable if (!$stream->isSeekable()) { $this->seekable = \false; } $this->streams[] = $stream; } public function getContents() { return Utils::copyToString($this); } /** * Closes each attached stream. * * {@inheritdoc} */ public function close() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->close(); } $this->streams = []; } /** * Detaches each attached stream. * * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->detach(); } $this->streams = []; return null; } public function tell() { return $this->pos; } /** * Tries to calculate the size by adding the size of each stream. * * If any of the streams do not return a valid number, then the size of the * append stream cannot be determined and null is returned. * * {@inheritdoc} */ public function getSize() { $size = 0; foreach ($this->streams as $stream) { $s = $stream->getSize(); if ($s === null) { return null; } $size += $s; } return $size; } public function eof() { return !$this->streams || $this->current >= \count($this->streams) - 1 && $this->streams[$this->current]->eof(); } public function rewind() { $this->seek(0); } /** * Attempts to seek to the given position. Only supports SEEK_SET. * * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if (!$this->seekable) { throw new \RuntimeException('This AppendStream is not seekable'); } elseif ($whence !== \SEEK_SET) { throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); } $this->pos = $this->current = 0; // Rewind each stream foreach ($this->streams as $i => $stream) { try { $stream->rewind(); } catch (\Exception $e) { throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(\min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. * * {@inheritdoc} */ public function read($length) { $buffer = ''; $total = \count($this->streams) - 1; $remaining = $length; $progressToNext = \false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = \false; if ($this->current === $total) { break; } $this->current++; } $result = $this->streams[$this->current]->read($remaining); // Using a loose comparison here to match on '', false, and null if ($result == null) { $progressToNext = \true; continue; } $buffer .= $result; $remaining = $length - \strlen($buffer); } $this->pos += \strlen($buffer); return $buffer; } public function isReadable() { return \true; } public function isWritable() { return \false; } public function isSeekable() { return $this->seekable; } public function write($string) { throw new \RuntimeException('Cannot write to an AppendStream'); } public function getMetadata($key = null) { return $key ? null : []; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/LimitStream.php000064400000010076147600374260022540 0ustar00stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof() { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return \true; } // No limit and the underlying stream is not at EOF if ($this->limit == -1) { return \false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data * {@inheritdoc} */ public function getSize() { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit == -1) { return $length - $this->offset; } else { return \min($this->limit, $length - $this->offset); } } /** * Allow for a bounded seek on the read limited stream * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if ($whence !== \SEEK_SET || $offset < 0) { throw new \RuntimeException(\sprintf('Cannot seek to offset %s with whence %s', $offset, $whence)); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() * {@inheritdoc} */ public function tell() { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset($offset) { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset {$offset}"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param int $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit($limit) { $this->limit = $limit; } public function read($length) { if ($this->limit == -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = $this->offset + $this->limit - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(\min($remaining, $length)); } return ''; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/MessageTrait.php000064400000017046147600374260022702 0ustar00 array of values */ private $headers = []; /** @var array Map of lowercase header name => original name at registration */ private $headerNames = []; /** @var string */ private $protocol = '1.1'; /** @var StreamInterface|null */ private $stream; public function getProtocolVersion() { return $this->protocol; } public function withProtocolVersion($version) { if ($this->protocol === $version) { return $this; } $new = clone $this; $new->protocol = $version; return $new; } public function getHeaders() { return $this->headers; } public function hasHeader($header) { return isset($this->headerNames[\strtolower($header)]); } public function getHeader($header) { $header = \strtolower($header); if (!isset($this->headerNames[$header])) { return []; } $header = $this->headerNames[$header]; return $this->headers[$header]; } public function getHeaderLine($header) { return \implode(', ', $this->getHeader($header)); } public function withHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { unset($new->headers[$new->headerNames[$normalized]]); } $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; return $new; } public function withAddedHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $new->headers[$header] = \array_merge($this->headers[$header], $value); } else { $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; } return $new; } public function withoutHeader($header) { $normalized = \strtolower($header); if (!isset($this->headerNames[$normalized])) { return $this; } $header = $this->headerNames[$normalized]; $new = clone $this; unset($new->headers[$header], $new->headerNames[$normalized]); return $new; } public function getBody() { if (!$this->stream) { $this->stream = Utils::streamFor(''); } return $this->stream; } public function withBody(StreamInterface $body) { if ($body === $this->stream) { return $this; } $new = clone $this; $new->stream = $body; return $new; } private function setHeaders(array $headers) { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { if (\is_int($header)) { // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. $header = (string) $header; } $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $this->headers[$header] = \array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; } } } /** * @param mixed $value * * @return string[] */ private function normalizeHeaderValue($value) { if (!\is_array($value)) { return $this->trimAndValidateHeaderValues([$value]); } if (\count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } return $this->trimAndValidateHeaderValues($value); } /** * Trims whitespace from the header values. * * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. * * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * * @param mixed[] $values Header values * * @return string[] Trimmed header values * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ private function trimAndValidateHeaderValues(array $values) { return \array_map(function ($value) { if (!\is_scalar($value) && null !== $value) { throw new \InvalidArgumentException(\sprintf('Header value must be scalar or null but %s provided.', \is_object($value) ? \get_class($value) : \gettype($value))); } $trimmed = \trim((string) $value, " \t"); $this->assertValue($trimmed); return $trimmed; }, \array_values($values)); } /** * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * @param mixed $header * * @return void */ private function assertHeader($header) { if (!\is_string($header)) { throw new \InvalidArgumentException(\sprintf('Header name must be a string but %s provided.', \is_object($header) ? \get_class($header) : \gettype($header))); } if ($header === '') { throw new \InvalidArgumentException('Header name can not be empty.'); } if (!\preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header name.', $header)); } } /** * @param string $value * * @return void * * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * field-value = *( field-content / obs-fold ) * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text * VCHAR = %x21-7E * obs-text = %x80-FF * obs-fold = CRLF 1*( SP / HTAB ) */ private function assertValue($value) { // The regular expression intentionally does not support the obs-fold production, because as // per RFC 7230#3.2.4: // // A sender MUST NOT generate a message that includes // line folding (i.e., that has any field-value that contains a match to // the obs-fold rule) unless the message is intended for packaging // within the message/http media type. // // Clients must not send a request with line folding and a server sending folded headers is // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting // folding is not likely to break any legitimate use case. if (!\preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header value.', $value)); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/InflateStream.php000064400000003527147600374260023047 0ustar00read(10); $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); // Skip the header, that is 10 + length of filename + 1 (nil) bytes $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); $resource = StreamWrapper::getResource($stream); \stream_filter_append($resource, 'zlib.inflate', \STREAM_FILTER_READ); $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** * @param StreamInterface $stream * @param $header * * @return int */ private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) { $filename_header_length = 0; if (\substr(\bin2hex($header), 6, 2) === '08') { // we have a filename, read until nil $filename_header_length = 1; while ($stream->read(1) !== \chr(0)) { $filename_header_length++; } } return $filename_header_length; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Message.php000064400000017657147600374260021706 0ustar00getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion(); if (!$message->hasHeader('host')) { $msg .= "\r\nHost: " . $message->getUri()->getHost(); } } elseif ($message instanceof ResponseInterface) { $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase(); } else { throw new \InvalidArgumentException('Unknown message type'); } foreach ($message->getHeaders() as $name => $values) { if (\strtolower($name) === 'set-cookie') { foreach ($values as $value) { $msg .= "\r\n{$name}: " . $value; } } else { $msg .= "\r\n{$name}: " . \implode(', ', $values); } } return "{$msg}\r\n\r\n" . $message->getBody(); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null */ public static function bodySummary(MessageInterface $message, $truncateAt = 120) { $body = $message->getBody(); if (!$body->isSeekable() || !$body->isReadable()) { return null; } $size = $body->getSize(); if ($size === 0) { return null; } $summary = $body->read($truncateAt); $body->rewind(); if ($size > $truncateAt) { $summary .= ' (truncated...)'; } // Matches any printable character, including unicode characters: // letters, marks, numbers, punctuation, spacing, and separators. if (\preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary)) { return null; } return $summary; } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` * returns a value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException */ public static function rewindBody(MessageInterface $message) { $body = $message->getBody(); if ($body->tell()) { $body->rewind(); } } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array */ public static function parseMessage($message) { if (!$message) { throw new \InvalidArgumentException('Invalid message'); } $message = \ltrim($message, "\r\n"); $messageParts = \preg_split("/\r?\n\r?\n/", $message, 2); if ($messageParts === \false || \count($messageParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } list($rawHeaders, $body) = $messageParts; $rawHeaders .= "\r\n"; // Put back the delimiter we split previously $headerParts = \preg_split("/\r?\n/", $rawHeaders, 2); if ($headerParts === \false || \count($headerParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing status line'); } list($startLine, $rawHeaders) = $headerParts; if (\preg_match("/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 $rawHeaders = \preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); } /** @var array[] $headerLines */ $count = \preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, \PREG_SET_ORDER); // If these aren't the same, then one line didn't match and there's an invalid header. if ($count !== \substr_count($rawHeaders, "\n")) { // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 if (\preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); } throw new \InvalidArgumentException('Invalid header syntax'); } $headers = []; foreach ($headerLines as $headerLine) { $headers[$headerLine[1]][] = $headerLine[2]; } return ['start-line' => $startLine, 'headers' => $headers, 'body' => $body]; } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string */ public static function parseRequestUri($path, array $headers) { $hostKey = \array_filter(\array_keys($headers), function ($k) { return \strtolower($k) === 'host'; }); // If no host is found, then a full URI cannot be constructed. if (!$hostKey) { return $path; } $host = $headers[\reset($hostKey)][0]; $scheme = \substr($host, -4) === ':443' ? 'https' : 'http'; return $scheme . '://' . $host . '/' . \ltrim($path, '/'); } /** * Parses a request message string into a request object. * * @param string $message Request message string. * * @return Request */ public static function parseRequest($message) { $data = self::parseMessage($message); $matches = []; if (!\preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) { throw new \InvalidArgumentException('Invalid request string'); } $parts = \explode(' ', $data['start-line'], 3); $version = isset($parts[2]) ? \explode('/', $parts[2])[1] : '1.1'; $request = new Request($parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version); return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); } /** * Parses a response message string into a response object. * * @param string $message Response message string. * * @return Response */ public static function parseResponse($message) { $data = self::parseMessage($message); // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space // between status-code and reason-phrase is required. But browsers accept // responses without space and reason as well. if (!\preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); } $parts = \explode(' ', $data['start-line'], 3); return new Response((int) $parts[1], $data['headers'], $data['body'], \explode('/', $parts[0])[1], isset($parts[2]) ? $parts[2] : null); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/functions_include.php000064400000000316147600374260024015 0ustar00stream = $stream; $this->maxLength = $maxLength; } public function write($string) { $diff = $this->maxLength - $this->stream->getSize(); // Begin returning 0 when the underlying stream is too large. if ($diff <= 0) { return 0; } // Write the stream or a subset of the stream if needed. if (\strlen($string) < $diff) { return $this->stream->write($string); } return $this->stream->write(\substr($string, 0, $diff)); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/UriResolver.php000064400000021036147600374260022565 0ustar00getScheme() != '') { return $rel->withPath(self::removeDotSegments($rel->getPath())); } if ($rel->getAuthority() != '') { $targetAuthority = $rel->getAuthority(); $targetPath = self::removeDotSegments($rel->getPath()); $targetQuery = $rel->getQuery(); } else { $targetAuthority = $base->getAuthority(); if ($rel->getPath() === '') { $targetPath = $base->getPath(); $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); } else { if ($rel->getPath()[0] === '/') { $targetPath = $rel->getPath(); } else { if ($targetAuthority != '' && $base->getPath() === '') { $targetPath = '/' . $rel->getPath(); } else { $lastSlashPos = \strrpos($base->getPath(), '/'); if ($lastSlashPos === \false) { $targetPath = $rel->getPath(); } else { $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); } } } $targetPath = self::removeDotSegments($targetPath); $targetQuery = $rel->getQuery(); } } return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); } /** * Returns the target URI as a relative reference from the base URI. * * This method is the counterpart to resolve(): * * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) * * One use-case is to use the current request URI as base URI and then generate relative links in your documents * to reduce the document size or offer self-contained downloadable document archives. * * $base = new Uri('http://example.com/a/b/'); * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. * * This method also accepts a target that is already relative and will try to relativize it further. Only a * relative-path reference will be returned as-is. * * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well * * @param UriInterface $base Base URI * @param UriInterface $target Target URI * * @return UriInterface The relative URI reference */ public static function relativize(UriInterface $base, UriInterface $target) { if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { return $target; } if (Uri::isRelativePathReference($target)) { // As the target is already highly relative we return it as-is. It would be possible to resolve // the target with `$target = self::resolve($base, $target);` and then try make it more relative // by removing a duplicate query. But let's not do that automatically. return $target; } if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { return $target->withScheme(''); } // We must remove the path before removing the authority because if the path starts with two slashes, the URI // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also // invalid. $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); if ($base->getPath() !== $target->getPath()) { return $emptyPathUri->withPath(self::getRelativePath($base, $target)); } if ($base->getQuery() === $target->getQuery()) { // Only the target fragment is left. And it must be returned even if base and target fragment are the same. return $emptyPathUri->withQuery(''); } // If the base URI has a query but the target has none, we cannot return an empty path reference as it would // inherit the base query component when resolving. if ($target->getQuery() === '') { $segments = \explode('/', $target->getPath()); $lastSegment = \end($segments); return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); } return $emptyPathUri; } private static function getRelativePath(UriInterface $base, UriInterface $target) { $sourceSegments = \explode('/', $base->getPath()); $targetSegments = \explode('/', $target->getPath()); \array_pop($sourceSegments); $targetLastSegment = \array_pop($targetSegments); foreach ($sourceSegments as $i => $segment) { if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { unset($sourceSegments[$i], $targetSegments[$i]); } else { break; } } $targetSegments[] = $targetLastSegment; $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { $relativePath = "./{$relativePath}"; } elseif ('/' === $relativePath[0]) { if ($base->getAuthority() != '' && $base->getPath() === '') { // In this case an extra slash is added by resolve() automatically. So we must not add one here. $relativePath = ".{$relativePath}"; } else { $relativePath = "./{$relativePath}"; } } return $relativePath; } private function __construct() { // cannot be instantiated } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/StreamWrapper.php000064400000006330147600374260023100 0ustar00isReadable()) { $mode = $stream->isWritable() ? 'r+' : 'r'; } elseif ($stream->isWritable()) { $mode = 'w'; } else { throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.'); } return \fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); } /** * Creates a stream context that can be used to open a stream as a php stream resource. * * @param StreamInterface $stream * * @return resource */ public static function createStreamContext(StreamInterface $stream) { return \stream_context_create(['guzzle' => ['stream' => $stream]]); } /** * Registers the stream wrapper if needed */ public static function register() { if (!\in_array('guzzle', \stream_get_wrappers())) { \stream_wrapper_register('guzzle', __CLASS__); } } public function stream_open($path, $mode, $options, &$opened_path) { $options = \stream_context_get_options($this->context); if (!isset($options['guzzle']['stream'])) { return \false; } $this->mode = $mode; $this->stream = $options['guzzle']['stream']; return \true; } public function stream_read($count) { return $this->stream->read($count); } public function stream_write($data) { return (int) $this->stream->write($data); } public function stream_tell() { return $this->stream->tell(); } public function stream_eof() { return $this->stream->eof(); } public function stream_seek($offset, $whence) { $this->stream->seek($offset, $whence); return \true; } public function stream_cast($cast_as) { $stream = clone $this->stream; return $stream->detach(); } public function stream_stat() { static $modeMap = ['r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188]; return ['dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } public function url_stat($path, $flags) { return ['dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Query.php000064400000006672147600374260021422 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array */ public static function parse($str, $urlEncoding = \true) { $result = []; if ($str === '') { return $result; } if ($urlEncoding === \true) { $decoder = function ($value) { return \rawurldecode(\str_replace('+', ' ', $value)); }; } elseif ($urlEncoding === \PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; } elseif ($urlEncoding === \PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; } foreach (\explode('&', $str) as $kvp) { $parts = \explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; if (!isset($result[$key])) { $result[$key] = $value; } else { if (!\is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } } return $result; } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string */ public static function build(array $params, $encoding = \PHP_QUERY_RFC3986) { if (!$params) { return ''; } if ($encoding === \false) { $encoder = function ($str) { return $str; }; } elseif ($encoding === \PHP_QUERY_RFC3986) { $encoder = 'rawurlencode'; } elseif ($encoding === \PHP_QUERY_RFC1738) { $encoder = 'urlencode'; } else { throw new \InvalidArgumentException('Invalid type'); } $qs = ''; foreach ($params as $k => $v) { $k = $encoder($k); if (!\is_array($v)) { $qs .= $k; if ($v !== null) { $qs .= '=' . $encoder($v); } $qs .= '&'; } else { foreach ($v as $vv) { $qs .= $k; if ($vv !== null) { $qs .= '=' . $encoder($vv); } $qs .= '&'; } } } return $qs ? (string) \substr($qs, 0, -1) : ''; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/BufferStream.php000064400000006035147600374260022673 0ustar00hwm = $hwm; } public function __toString() { return $this->getContents(); } public function getContents() { $buffer = $this->buffer; $this->buffer = ''; return $buffer; } public function close() { $this->buffer = ''; } public function detach() { $this->close(); return null; } public function getSize() { return \strlen($this->buffer); } public function isReadable() { return \true; } public function isWritable() { return \true; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a BufferStream'); } public function eof() { return \strlen($this->buffer) === 0; } public function tell() { throw new \RuntimeException('Cannot determine the position of a BufferStream'); } /** * Reads data from the buffer. */ public function read($length) { $currentLength = \strlen($this->buffer); if ($length >= $currentLength) { // No need to slice the buffer because we don't have enough data. $result = $this->buffer; $this->buffer = ''; } else { // Slice up the result to provide a subset of the buffer. $result = \substr($this->buffer, 0, $length); $this->buffer = \substr($this->buffer, $length); } return $result; } /** * Writes data to the buffer. */ public function write($string) { $this->buffer .= $string; // TODO: What should happen here? if (\strlen($this->buffer) >= $this->hwm) { return \false; } return \strlen($string); } public function getMetadata($key = null) { if ($key == 'hwm') { return $this->hwm; } return $key ? null : []; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/ServerRequest.php000064400000022625147600374260023130 0ustar00serverParams = $serverParams; parent::__construct($method, $uri, $headers, $body, $version); } /** * Return an UploadedFile instance array. * * @param array $files A array which respect $_FILES structure * * @return array * * @throws InvalidArgumentException for unrecognized values */ public static function normalizeFiles(array $files) { $normalized = []; foreach ($files as $key => $value) { if ($value instanceof UploadedFileInterface) { $normalized[$key] = $value; } elseif (\is_array($value) && isset($value['tmp_name'])) { $normalized[$key] = self::createUploadedFileFromSpec($value); } elseif (\is_array($value)) { $normalized[$key] = self::normalizeFiles($value); continue; } else { throw new InvalidArgumentException('Invalid value in files specification'); } } return $normalized; } /** * Create and return an UploadedFile instance from a $_FILES specification. * * If the specification represents an array of values, this method will * delegate to normalizeNestedFileSpec() and return that return value. * * @param array $value $_FILES struct * * @return array|UploadedFileInterface */ private static function createUploadedFileFromSpec(array $value) { if (\is_array($value['tmp_name'])) { return self::normalizeNestedFileSpec($value); } return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); } /** * Normalize an array of file specifications. * * Loops through all nested files and returns a normalized array of * UploadedFileInterface instances. * * @param array $files * * @return UploadedFileInterface[] */ private static function normalizeNestedFileSpec(array $files = []) { $normalizedFiles = []; foreach (\array_keys($files['tmp_name']) as $key) { $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key], 'error' => $files['error'][$key], 'name' => $files['name'][$key], 'type' => $files['type'][$key]]; $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); } return $normalizedFiles; } /** * Return a ServerRequest populated with superglobals: * $_GET * $_POST * $_COOKIE * $_FILES * $_SERVER * * @return ServerRequestInterface */ public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; $headers = \getallheaders(); $uri = self::getUriFromGlobals(); $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); } private static function extractHostAndPortFromAuthority($authority) { $uri = 'http://' . $authority; $parts = \parse_url($uri); if (\false === $parts) { return [null, null]; } $host = isset($parts['host']) ? $parts['host'] : null; $port = isset($parts['port']) ? $parts['port'] : null; return [$host, $port]; } /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ public static function getUriFromGlobals() { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = \false; if (isset($_SERVER['HTTP_HOST'])) { list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); if ($host !== null) { $uri = $uri->withHost($host); } if ($port !== null) { $hasPort = \true; $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); } elseif (isset($_SERVER['SERVER_ADDR'])) { $uri = $uri->withHost($_SERVER['SERVER_ADDR']); } if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { $uri = $uri->withPort($_SERVER['SERVER_PORT']); } $hasQuery = \false; if (isset($_SERVER['REQUEST_URI'])) { $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = \true; $uri = $uri->withQuery($requestUriParts[1]); } } if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { $uri = $uri->withQuery($_SERVER['QUERY_STRING']); } return $uri; } /** * {@inheritdoc} */ public function getServerParams() { return $this->serverParams; } /** * {@inheritdoc} */ public function getUploadedFiles() { return $this->uploadedFiles; } /** * {@inheritdoc} */ public function withUploadedFiles(array $uploadedFiles) { $new = clone $this; $new->uploadedFiles = $uploadedFiles; return $new; } /** * {@inheritdoc} */ public function getCookieParams() { return $this->cookieParams; } /** * {@inheritdoc} */ public function withCookieParams(array $cookies) { $new = clone $this; $new->cookieParams = $cookies; return $new; } /** * {@inheritdoc} */ public function getQueryParams() { return $this->queryParams; } /** * {@inheritdoc} */ public function withQueryParams(array $query) { $new = clone $this; $new->queryParams = $query; return $new; } /** * {@inheritdoc} */ public function getParsedBody() { return $this->parsedBody; } /** * {@inheritdoc} */ public function withParsedBody($data) { $new = clone $this; $new->parsedBody = $data; return $new; } /** * {@inheritdoc} */ public function getAttributes() { return $this->attributes; } /** * {@inheritdoc} */ public function getAttribute($attribute, $default = null) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $default; } return $this->attributes[$attribute]; } /** * {@inheritdoc} */ public function withAttribute($attribute, $value) { $new = clone $this; $new->attributes[$attribute] = $value; return $new; } /** * {@inheritdoc} */ public function withoutAttribute($attribute) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $this; } $new = clone $this; unset($new->attributes[$attribute]); return $new; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/MultipartStream.php000064400000011016147600374260023436 0ustar00boundary = $boundary ?: \sha1(\uniqid('', \true)); $this->stream = $this->createStream($elements); } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } public function isWritable() { return \false; } /** * Get the headers needed before transferring the content of a POST file */ private function getHeaders(array $headers) { $str = ''; foreach ($headers as $key => $value) { $str .= "{$key}: {$value}\r\n"; } return "--{$this->boundary}\r\n" . \trim($str) . "\r\n\r\n"; } /** * Create the aggregate stream that will be used to upload the POST data */ protected function createStream(array $elements) { $stream = new AppendStream(); foreach ($elements as $element) { $this->addElement($stream, $element); } // Add the trailing boundary with CRLF $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); return $stream; } private function addElement(AppendStream $stream, array $element) { foreach (['contents', 'name'] as $key) { if (!\array_key_exists($key, $element)) { throw new \InvalidArgumentException("A '{$key}' key is required"); } } $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); if (\substr($uri, 0, 6) !== 'php://') { $element['filename'] = $uri; } } list($body, $headers) = $this->createElement($element['name'], $element['contents'], isset($element['filename']) ? $element['filename'] : null, isset($element['headers']) ? $element['headers'] : []); $stream->addStream(Utils::streamFor($this->getHeaders($headers))); $stream->addStream($body); $stream->addStream(Utils::streamFor("\r\n")); } /** * @return array */ private function createElement($name, StreamInterface $stream, $filename, array $headers) { // Set a default content-disposition header if one was no provided $disposition = $this->getHeader($headers, 'content-disposition'); if (!$disposition) { $headers['Content-Disposition'] = $filename === '0' || $filename ? \sprintf('form-data; name="%s"; filename="%s"', $name, \basename($filename)) : "form-data; name=\"{$name}\""; } // Set a default content-length header if one was no provided $length = $this->getHeader($headers, 'content-length'); if (!$length) { if ($length = $stream->getSize()) { $headers['Content-Length'] = (string) $length; } } // Set a default Content-Type if one was not supplied $type = $this->getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { if ($type = MimeType::fromFilename($filename)) { $headers['Content-Type'] = $type; } } return [$stream, $headers]; } private function getHeader(array $headers, $key) { $lowercaseHeader = \strtolower($key); foreach ($headers as $k => $v) { if (\strtolower($k) === $lowercaseHeader) { return $v; } } return null; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/CachingStream.php000064400000010506147600374260023014 0ustar00remoteStream = $stream; $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); } public function getSize() { $remoteSize = $this->remoteStream->getSize(); if (null === $remoteSize) { return null; } return \max($this->stream->getSize(), $remoteSize); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { if ($whence == \SEEK_SET) { $byte = $offset; } elseif ($whence == \SEEK_CUR) { $byte = $offset + $this->tell(); } elseif ($whence == \SEEK_END) { $size = $this->remoteStream->getSize(); if ($size === null) { $size = $this->cacheEntireStream(); } $byte = $size + $offset; } else { throw new \InvalidArgumentException('Invalid whence'); } $diff = $byte - $this->stream->getSize(); if ($diff > 0) { // Read the remoteStream until we have read in at least the amount // of bytes requested, or we reach the end of the file. while ($diff > 0 && !$this->remoteStream->eof()) { $this->read($diff); $diff = $byte - $this->stream->getSize(); } } else { // We can just do a normal seek since we've already seen this byte. $this->stream->seek($byte); } } public function read($length) { // Perform a regular read on any previously read data from the buffer $data = $this->stream->read($length); $remaining = $length - \strlen($data); // More data was requested so read from the remote stream if ($remaining) { // If data was written to the buffer in a position that would have // been filled from the remote stream, then we must skip bytes on // the remote stream to emulate overwriting bytes from that // position. This mimics the behavior of other PHP stream wrappers. $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); if ($this->skipReadBytes) { $len = \strlen($remoteData); $remoteData = \substr($remoteData, $this->skipReadBytes); $this->skipReadBytes = \max(0, $this->skipReadBytes - $len); } $data .= $remoteData; $this->stream->write($remoteData); } return $data; } public function write($string) { // When appending to the end of the currently read stream, you'll want // to skip bytes from being read from the remote stream to emulate // other stream wrappers. Basically replacing bytes of data of a fixed // length. $overflow = \strlen($string) + $this->tell() - $this->remoteStream->tell(); if ($overflow > 0) { $this->skipReadBytes += $overflow; } return $this->stream->write($string); } public function eof() { return $this->stream->eof() && $this->remoteStream->eof(); } /** * Close both the remote stream and buffer stream */ public function close() { $this->remoteStream->close() && $this->stream->close(); } private function cacheEntireStream() { $target = new FnStream(['write' => 'strlen']); Utils::copyToStream($this, $target); return $this->tell(); } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Header.php000064400000004232147600374260021473 0ustar00]+>|[^=]+/', $kvp, $matches)) { $m = $matches[0]; if (isset($m[1])) { $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed); } else { $part[] = \trim($m[0], $trimmed); } } } if ($part) { $params[] = $part; } } return $params; } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. */ public static function normalize($header) { if (!\is_array($header)) { return \array_map('trim', \explode(',', $header)); } $result = []; foreach ($header as $value) { foreach ((array) $value as $v) { if (\strpos($v, ',') === \false) { $result[] = $v; continue; } foreach (\preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { $result[] = \trim($vv); } } } return $result; } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/Request.php000064400000007156147600374260021743 0ustar00assertMethod($method); if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } $this->method = \strtoupper($method); $this->uri = $uri; $this->setHeaders($headers); $this->protocol = $version; if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } } public function getRequestTarget() { if ($this->requestTarget !== null) { return $this->requestTarget; } $target = $this->uri->getPath(); if ($target == '') { $target = '/'; } if ($this->uri->getQuery() != '') { $target .= '?' . $this->uri->getQuery(); } return $target; } public function withRequestTarget($requestTarget) { if (\preg_match('#\\s#', $requestTarget)) { throw new InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); } $new = clone $this; $new->requestTarget = $requestTarget; return $new; } public function getMethod() { return $this->method; } public function withMethod($method) { $this->assertMethod($method); $new = clone $this; $new->method = \strtoupper($method); return $new; } public function getUri() { return $this->uri; } public function withUri(UriInterface $uri, $preserveHost = \false) { if ($uri === $this->uri) { return $this; } $new = clone $this; $new->uri = $uri; if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } return $new; } private function updateHostFromUri() { $host = $this->uri->getHost(); if ($host == '') { return; } if (($port = $this->uri->getPort()) !== null) { $host .= ':' . $port; } if (isset($this->headerNames['host'])) { $header = $this->headerNames['host']; } else { $header = 'Host'; $this->headerNames['host'] = 'Host'; } // Ensure Host is the first header. // See: http://tools.ietf.org/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } private function assertMethod($method) { if (!\is_string($method) || $method === '') { throw new \InvalidArgumentException('Method must be a non-empty string.'); } } } addons/amazons3addon/vendor-prefixed/guzzlehttp/psr7/src/UriComparator.php000064400000002265147600374260023076 0ustar00getHost(), $modified->getHost()) !== 0) { return \true; } if ($original->getScheme() !== $modified->getScheme()) { return \true; } if (self::computePort($original) !== self::computePort($modified)) { return \true; } return \false; } /** * @return int */ private static function computePort(UriInterface $uri) { $port = $uri->getPort(); if (null !== $port) { return $port; } return 'https' === $uri->getScheme() ? 443 : 80; } private function __construct() { // cannot be instantiated } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/Parser.php000064400000030531147600374260023032 0ustar00 T::T_EOF]; private static $currentNode = ['type' => T::T_CURRENT]; private static $bp = [T::T_EOF => 0, T::T_QUOTED_IDENTIFIER => 0, T::T_IDENTIFIER => 0, T::T_RBRACKET => 0, T::T_RPAREN => 0, T::T_COMMA => 0, T::T_RBRACE => 0, T::T_NUMBER => 0, T::T_CURRENT => 0, T::T_EXPREF => 0, T::T_COLON => 0, T::T_PIPE => 1, T::T_OR => 2, T::T_AND => 3, T::T_COMPARATOR => 5, T::T_FLATTEN => 9, T::T_STAR => 20, T::T_FILTER => 21, T::T_DOT => 40, T::T_NOT => 45, T::T_LBRACE => 50, T::T_LBRACKET => 55, T::T_LPAREN => 60]; /** @var array Acceptable tokens after a dot token */ private static $afterDot = [ T::T_IDENTIFIER => \true, // foo.bar T::T_QUOTED_IDENTIFIER => \true, // foo."bar" T::T_STAR => \true, // foo.* T::T_LBRACE => \true, // foo[1] T::T_LBRACKET => \true, // foo{a: 0} T::T_FILTER => \true, ]; /** * @param Lexer|null $lexer Lexer used to tokenize expressions */ public function __construct(Lexer $lexer = null) { $this->lexer = $lexer ?: new Lexer(); } /** * Parses a JMESPath expression into an AST * * @param string $expression JMESPath expression to compile * * @return array Returns an array based AST * @throws SyntaxErrorException */ public function parse($expression) { $this->expression = $expression; $this->tokens = $this->lexer->tokenize($expression); $this->tpos = -1; $this->next(); $result = $this->expr(); if ($this->token['type'] === T::T_EOF) { return $result; } throw $this->syntax('Did not reach the end of the token stream'); } /** * Parses an expression while rbp < lbp. * * @param int $rbp Right bound precedence * * @return array */ private function expr($rbp = 0) { $left = $this->{"nud_{$this->token['type']}"}(); while ($rbp < self::$bp[$this->token['type']]) { $left = $this->{"led_{$this->token['type']}"}($left); } return $left; } private function nud_identifier() { $token = $this->token; $this->next(); return ['type' => 'field', 'value' => $token['value']]; } private function nud_quoted_identifier() { $token = $this->token; $this->next(); $this->assertNotToken(T::T_LPAREN); return ['type' => 'field', 'value' => $token['value']]; } private function nud_current() { $this->next(); return self::$currentNode; } private function nud_literal() { $token = $this->token; $this->next(); return ['type' => 'literal', 'value' => $token['value']]; } private function nud_expref() { $this->next(); return ['type' => T::T_EXPREF, 'children' => [$this->expr(self::$bp[T::T_EXPREF])]]; } private function nud_not() { $this->next(); return ['type' => T::T_NOT, 'children' => [$this->expr(self::$bp[T::T_NOT])]]; } private function nud_lparen() { $this->next(); $result = $this->expr(0); if ($this->token['type'] !== T::T_RPAREN) { throw $this->syntax('Unclosed `(`'); } $this->next(); return $result; } private function nud_lbrace() { static $validKeys = [T::T_QUOTED_IDENTIFIER => \true, T::T_IDENTIFIER => \true]; $this->next($validKeys); $pairs = []; do { $pairs[] = $this->parseKeyValuePair(); if ($this->token['type'] == T::T_COMMA) { $this->next($validKeys); } } while ($this->token['type'] !== T::T_RBRACE); $this->next(); return ['type' => 'multi_select_hash', 'children' => $pairs]; } private function nud_flatten() { return $this->led_flatten(self::$currentNode); } private function nud_filter() { return $this->led_filter(self::$currentNode); } private function nud_star() { return $this->parseWildcardObject(self::$currentNode); } private function nud_lbracket() { $this->next(); $type = $this->token['type']; if ($type == T::T_NUMBER || $type == T::T_COLON) { return $this->parseArrayIndexExpression(); } elseif ($type == T::T_STAR && $this->lookahead() == T::T_RBRACKET) { return $this->parseWildcardArray(); } else { return $this->parseMultiSelectList(); } } private function led_lbracket(array $left) { static $nextTypes = [T::T_NUMBER => \true, T::T_COLON => \true, T::T_STAR => \true]; $this->next($nextTypes); switch ($this->token['type']) { case T::T_NUMBER: case T::T_COLON: return ['type' => 'subexpression', 'children' => [$left, $this->parseArrayIndexExpression()]]; default: return $this->parseWildcardArray($left); } } private function led_flatten(array $left) { $this->next(); return ['type' => 'projection', 'from' => 'array', 'children' => [['type' => T::T_FLATTEN, 'children' => [$left]], $this->parseProjection(self::$bp[T::T_FLATTEN])]]; } private function led_dot(array $left) { $this->next(self::$afterDot); if ($this->token['type'] == T::T_STAR) { return $this->parseWildcardObject($left); } return ['type' => 'subexpression', 'children' => [$left, $this->parseDot(self::$bp[T::T_DOT])]]; } private function led_or(array $left) { $this->next(); return ['type' => T::T_OR, 'children' => [$left, $this->expr(self::$bp[T::T_OR])]]; } private function led_and(array $left) { $this->next(); return ['type' => T::T_AND, 'children' => [$left, $this->expr(self::$bp[T::T_AND])]]; } private function led_pipe(array $left) { $this->next(); return ['type' => T::T_PIPE, 'children' => [$left, $this->expr(self::$bp[T::T_PIPE])]]; } private function led_lparen(array $left) { $args = []; $this->next(); while ($this->token['type'] != T::T_RPAREN) { $args[] = $this->expr(0); if ($this->token['type'] == T::T_COMMA) { $this->next(); } } $this->next(); return ['type' => 'function', 'value' => $left['value'], 'children' => $args]; } private function led_filter(array $left) { $this->next(); $expression = $this->expr(); if ($this->token['type'] != T::T_RBRACKET) { throw $this->syntax('Expected a closing rbracket for the filter'); } $this->next(); $rhs = $this->parseProjection(self::$bp[T::T_FILTER]); return ['type' => 'projection', 'from' => 'array', 'children' => [$left ?: self::$currentNode, ['type' => 'condition', 'children' => [$expression, $rhs]]]]; } private function led_comparator(array $left) { $token = $this->token; $this->next(); return ['type' => T::T_COMPARATOR, 'value' => $token['value'], 'children' => [$left, $this->expr(self::$bp[T::T_COMPARATOR])]]; } private function parseProjection($bp) { $type = $this->token['type']; if (self::$bp[$type] < 10) { return self::$currentNode; } elseif ($type == T::T_DOT) { $this->next(self::$afterDot); return $this->parseDot($bp); } elseif ($type == T::T_LBRACKET || $type == T::T_FILTER) { return $this->expr($bp); } throw $this->syntax('Syntax error after projection'); } private function parseDot($bp) { if ($this->token['type'] == T::T_LBRACKET) { $this->next(); return $this->parseMultiSelectList(); } return $this->expr($bp); } private function parseKeyValuePair() { static $validColon = [T::T_COLON => \true]; $key = $this->token['value']; $this->next($validColon); $this->next(); return ['type' => 'key_val_pair', 'value' => $key, 'children' => [$this->expr()]]; } private function parseWildcardObject(array $left = null) { $this->next(); return ['type' => 'projection', 'from' => 'object', 'children' => [$left ?: self::$currentNode, $this->parseProjection(self::$bp[T::T_STAR])]]; } private function parseWildcardArray(array $left = null) { static $getRbracket = [T::T_RBRACKET => \true]; $this->next($getRbracket); $this->next(); return ['type' => 'projection', 'from' => 'array', 'children' => [$left ?: self::$currentNode, $this->parseProjection(self::$bp[T::T_STAR])]]; } /** * Parses an array index expression (e.g., [0], [1:2:3] */ private function parseArrayIndexExpression() { static $matchNext = [T::T_NUMBER => \true, T::T_COLON => \true, T::T_RBRACKET => \true]; $pos = 0; $parts = [null, null, null]; $expected = $matchNext; do { if ($this->token['type'] == T::T_COLON) { $pos++; $expected = $matchNext; } elseif ($this->token['type'] == T::T_NUMBER) { $parts[$pos] = $this->token['value']; $expected = [T::T_COLON => \true, T::T_RBRACKET => \true]; } $this->next($expected); } while ($this->token['type'] != T::T_RBRACKET); // Consume the closing bracket $this->next(); if ($pos === 0) { // No colons were found so this is a simple index extraction return ['type' => 'index', 'value' => $parts[0]]; } if ($pos > 2) { throw $this->syntax('Invalid array slice syntax: too many colons'); } // Sliced array from start (e.g., [2:]) return ['type' => 'projection', 'from' => 'array', 'children' => [['type' => 'slice', 'value' => $parts], $this->parseProjection(self::$bp[T::T_STAR])]]; } private function parseMultiSelectList() { $nodes = []; do { $nodes[] = $this->expr(); if ($this->token['type'] == T::T_COMMA) { $this->next(); $this->assertNotToken(T::T_RBRACKET); } } while ($this->token['type'] !== T::T_RBRACKET); $this->next(); return ['type' => 'multi_select_list', 'children' => $nodes]; } private function syntax($msg) { return new SyntaxErrorException($msg, $this->token, $this->expression); } private function lookahead() { return !isset($this->tokens[$this->tpos + 1]) ? T::T_EOF : $this->tokens[$this->tpos + 1]['type']; } private function next(array $match = null) { if (!isset($this->tokens[$this->tpos + 1])) { $this->token = self::$nullToken; } else { $this->token = $this->tokens[++$this->tpos]; } if ($match && !isset($match[$this->token['type']])) { throw $this->syntax($match); } } private function assertNotToken($type) { if ($this->token['type'] == $type) { throw $this->syntax("Token {$this->tpos} not allowed to be {$type}"); } } /** * @internal Handles undefined tokens without paying the cost of validation */ public function __call($method, $args) { $prefix = \substr($method, 0, 4); if ($prefix == 'nud_' || $prefix == 'led_') { $token = \substr($method, 4); $message = "Unexpected \"{$token}\" token ({$method}). Expected one of" . " the following tokens: " . \implode(', ', \array_map(function ($i) { return '"' . \substr($i, 4) . '"'; }, \array_filter(\get_class_methods($this), function ($i) use($prefix) { return \strpos($i, $prefix) === 0; }))); throw $this->syntax($message); } throw new \BadMethodCallException("Call to undefined method {$method}"); } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/DebugRuntime.php000064400000005735147600374260024200 0ustar00runtime = $runtime; $this->out = $output ?: \STDOUT; $this->lexer = new Lexer(); $this->parser = new Parser($this->lexer); } public function __invoke($expression, $data) { if ($this->runtime instanceof CompilerRuntime) { return $this->debugCompiled($expression, $data); } return $this->debugInterpreted($expression, $data); } private function debugInterpreted($expression, $data) { return $this->debugCallback(function () use($expression, $data) { $runtime = $this->runtime; return $runtime($expression, $data); }, $expression, $data); } private function debugCompiled($expression, $data) { $result = $this->debugCallback(function () use($expression, $data) { $runtime = $this->runtime; return $runtime($expression, $data); }, $expression, $data); $this->dumpCompiledCode($expression); return $result; } private function dumpTokens($expression) { $lexer = new Lexer(); \fwrite($this->out, "Tokens\n======\n\n"); $tokens = $lexer->tokenize($expression); foreach ($tokens as $t) { \fprintf($this->out, "%3d %-13s %s\n", $t['pos'], $t['type'], \json_encode($t['value'])); } \fwrite($this->out, "\n"); } private function dumpAst($expression) { $parser = new Parser(); $ast = $parser->parse($expression); \fwrite($this->out, "AST\n========\n\n"); \fwrite($this->out, \json_encode($ast, \JSON_PRETTY_PRINT) . "\n"); } private function dumpCompiledCode($expression) { \fwrite($this->out, "Code\n========\n\n"); $dir = \sys_get_temp_dir(); $hash = \md5($expression); $functionName = "jmespath_{$hash}"; $filename = "{$dir}/{$functionName}.php"; \fwrite($this->out, "File: {$filename}\n\n"); \fprintf($this->out, \file_get_contents($filename)); } private function debugCallback(callable $debugFn, $expression, $data) { \fprintf($this->out, "Expression\n==========\n\n%s\n\n", $expression); $this->dumpTokens($expression); $this->dumpAst($expression); \fprintf($this->out, "\nData\n====\n\n%s\n\n", \json_encode($data, \JSON_PRETTY_PRINT)); $startTime = \microtime(\true); $result = $debugFn(); $total = \microtime(\true) - $startTime; \fprintf($this->out, "\nResult\n======\n\n%s\n\n", \json_encode($result, \JSON_PRETTY_PRINT)); \fwrite($this->out, "Time\n====\n\n"); \fprintf($this->out, "Total time: %f ms\n\n", $total); return $result; } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/Utils.php000064400000016162147600374260022702 0ustar00 'boolean', 'string' => 'string', 'NULL' => 'null', 'double' => 'number', 'float' => 'number', 'integer' => 'number']; /** * Returns true if the value is truthy * * @param mixed $value Value to check * * @return bool */ public static function isTruthy($value) { if (!$value) { return $value === 0 || $value === '0'; } elseif ($value instanceof \stdClass) { return (bool) \get_object_vars($value); } else { return \true; } } /** * Gets the JMESPath type equivalent of a PHP variable. * * @param mixed $arg PHP variable * @return string Returns the JSON data type * @throws \InvalidArgumentException when an unknown type is given. */ public static function type($arg) { $type = \gettype($arg); if (isset(self::$typeMap[$type])) { return self::$typeMap[$type]; } elseif ($type === 'array') { if (empty($arg)) { return 'array'; } \reset($arg); return \key($arg) === 0 ? 'array' : 'object'; } elseif ($arg instanceof \stdClass) { return 'object'; } elseif ($arg instanceof \Closure) { return 'expression'; } elseif ($arg instanceof \ArrayAccess && $arg instanceof \Countable) { return \count($arg) == 0 || $arg->offsetExists(0) ? 'array' : 'object'; } elseif (\method_exists($arg, '__toString')) { return 'string'; } throw new \InvalidArgumentException('Unable to determine JMESPath type from ' . \get_class($arg)); } /** * Determine if the provided value is a JMESPath compatible object. * * @param mixed $value * * @return bool */ public static function isObject($value) { if (\is_array($value)) { return !$value || \array_keys($value)[0] !== 0; } // Handle array-like values. Must be empty or offset 0 does not exist return $value instanceof \Countable && $value instanceof \ArrayAccess ? \count($value) == 0 || !$value->offsetExists(0) : $value instanceof \stdClass; } /** * Determine if the provided value is a JMESPath compatible array. * * @param mixed $value * * @return bool */ public static function isArray($value) { if (\is_array($value)) { return !$value || \array_keys($value)[0] === 0; } // Handle array-like values. Must be empty or offset 0 exists. return $value instanceof \Countable && $value instanceof \ArrayAccess ? \count($value) == 0 || $value->offsetExists(0) : \false; } /** * JSON aware value comparison function. * * @param mixed $a First value to compare * @param mixed $b Second value to compare * * @return bool */ public static function isEqual($a, $b) { if ($a === $b) { return \true; } elseif ($a instanceof \stdClass) { return self::isEqual((array) $a, $b); } elseif ($b instanceof \stdClass) { return self::isEqual($a, (array) $b); } else { return \false; } } /** * Safely add together two values. * * @param mixed $a First value to add * @param mixed $b Second value to add * * @return int|float */ public static function add($a, $b) { if (\is_numeric($a)) { if (\is_numeric($b)) { return $a + $b; } else { return $a; } } else { if (\is_numeric($b)) { return $b; } else { return 0; } } } /** * JMESPath requires a stable sorting algorithm, so here we'll implement * a simple Schwartzian transform that uses array index positions as tie * breakers. * * @param array $data List or map of data to sort * @param callable $sortFn Callable used to sort values * * @return array Returns the sorted array * @link http://en.wikipedia.org/wiki/Schwartzian_transform */ public static function stableSort(array $data, callable $sortFn) { // Decorate each item by creating an array of [value, index] \array_walk($data, function (&$v, $k) { $v = [$v, $k]; }); // Sort by the sort function and use the index as a tie-breaker \uasort($data, function ($a, $b) use($sortFn) { return $sortFn($a[0], $b[0]) ?: ($a[1] < $b[1] ? -1 : 1); }); // Undecorate each item and return the resulting sorted array return \array_map(function ($v) { return $v[0]; }, \array_values($data)); } /** * Creates a Python-style slice of a string or array. * * @param array|string $value Value to slice * @param int|null $start Starting position * @param int|null $stop Stop position * @param int $step Step (1, 2, -1, -2, etc.) * * @return array|string * @throws \InvalidArgumentException */ public static function slice($value, $start = null, $stop = null, $step = 1) { if (!\is_array($value) && !\is_string($value)) { throw new \InvalidArgumentException('Expects string or array'); } return self::sliceIndices($value, $start, $stop, $step); } private static function adjustEndpoint($length, $endpoint, $step) { if ($endpoint < 0) { $endpoint += $length; if ($endpoint < 0) { $endpoint = $step < 0 ? -1 : 0; } } elseif ($endpoint >= $length) { $endpoint = $step < 0 ? $length - 1 : $length; } return $endpoint; } private static function adjustSlice($length, $start, $stop, $step) { if ($step === null) { $step = 1; } elseif ($step === 0) { throw new \RuntimeException('step cannot be 0'); } if ($start === null) { $start = $step < 0 ? $length - 1 : 0; } else { $start = self::adjustEndpoint($length, $start, $step); } if ($stop === null) { $stop = $step < 0 ? -1 : $length; } else { $stop = self::adjustEndpoint($length, $stop, $step); } return [$start, $stop, $step]; } private static function sliceIndices($subject, $start, $stop, $step) { $type = \gettype($subject); $len = $type == 'string' ? \mb_strlen($subject, 'UTF-8') : \count($subject); list($start, $stop, $step) = self::adjustSlice($len, $start, $stop, $step); $result = []; if ($step > 0) { for ($i = $start; $i < $stop; $i += $step) { $result[] = $subject[$i]; } } else { for ($i = $start; $i > $stop; $i += $step) { $result[] = $subject[$i]; } } return $type == 'string' ? \implode('', $result) : $result; } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/SyntaxErrorException.php000064400000002015147600374260025751 0ustar00createTokenMessage($token, $expectedTypesOrMessage); parent::__construct($message); } private function createTokenMessage(array $token, array $valid) { return \sprintf('Expected one of the following: %s; found %s "%s"', \implode(', ', \array_keys($valid)), $token['type'], $token['value']); } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/FnDispatcher.php000064400000027532147600374260024157 0ustar00{'fn_' . $fn}($args); } private function fn_abs(array $args) { $this->validate('abs', $args, [['number']]); return \abs($args[0]); } private function fn_avg(array $args) { $this->validate('avg', $args, [['array']]); $sum = $this->reduce('avg:0', $args[0], ['number'], function ($a, $b) { return Utils::add($a, $b); }); return $args[0] ? $sum / \count($args[0]) : null; } private function fn_ceil(array $args) { $this->validate('ceil', $args, [['number']]); return \ceil($args[0]); } private function fn_contains(array $args) { $this->validate('contains', $args, [['string', 'array'], ['any']]); if (\is_array($args[0])) { return \in_array($args[1], $args[0]); } elseif (\is_string($args[1])) { return \mb_strpos($args[0], $args[1], 0, 'UTF-8') !== \false; } else { return null; } } private function fn_ends_with(array $args) { $this->validate('ends_with', $args, [['string'], ['string']]); list($search, $suffix) = $args; return $suffix === '' || \mb_substr($search, -\mb_strlen($suffix, 'UTF-8'), null, 'UTF-8') === $suffix; } private function fn_floor(array $args) { $this->validate('floor', $args, [['number']]); return \floor($args[0]); } private function fn_not_null(array $args) { if (!$args) { throw new \RuntimeException("not_null() expects 1 or more arguments, 0 were provided"); } return \array_reduce($args, function ($carry, $item) { return $carry !== null ? $carry : $item; }); } private function fn_join(array $args) { $this->validate('join', $args, [['string'], ['array']]); $fn = function ($a, $b, $i) use($args) { return $i ? $a . $args[0] . $b : $b; }; return $this->reduce('join:0', $args[1], ['string'], $fn); } private function fn_keys(array $args) { $this->validate('keys', $args, [['object']]); return \array_keys((array) $args[0]); } private function fn_length(array $args) { $this->validate('length', $args, [['string', 'array', 'object']]); return \is_string($args[0]) ? \mb_strlen($args[0], 'UTF-8') : \count((array) $args[0]); } private function fn_max(array $args) { $this->validate('max', $args, [['array']]); $fn = function ($a, $b) { return $a >= $b ? $a : $b; }; return $this->reduce('max:0', $args[0], ['number', 'string'], $fn); } private function fn_max_by(array $args) { $this->validate('max_by', $args, [['array'], ['expression']]); $expr = $this->wrapExpression('max_by:1', $args[1], ['number', 'string']); $fn = function ($carry, $item, $index) use($expr) { return $index ? $expr($carry) >= $expr($item) ? $carry : $item : $item; }; return $this->reduce('max_by:1', $args[0], ['any'], $fn); } private function fn_min(array $args) { $this->validate('min', $args, [['array']]); $fn = function ($a, $b, $i) { return $i && $a <= $b ? $a : $b; }; return $this->reduce('min:0', $args[0], ['number', 'string'], $fn); } private function fn_min_by(array $args) { $this->validate('min_by', $args, [['array'], ['expression']]); $expr = $this->wrapExpression('min_by:1', $args[1], ['number', 'string']); $i = -1; $fn = function ($a, $b) use($expr, &$i) { return ++$i ? $expr($a) <= $expr($b) ? $a : $b : $b; }; return $this->reduce('min_by:1', $args[0], ['any'], $fn); } private function fn_reverse(array $args) { $this->validate('reverse', $args, [['array', 'string']]); if (\is_array($args[0])) { return \array_reverse($args[0]); } elseif (\is_string($args[0])) { return \strrev($args[0]); } else { throw new \RuntimeException('Cannot reverse provided argument'); } } private function fn_sum(array $args) { $this->validate('sum', $args, [['array']]); $fn = function ($a, $b) { return Utils::add($a, $b); }; return $this->reduce('sum:0', $args[0], ['number'], $fn); } private function fn_sort(array $args) { $this->validate('sort', $args, [['array']]); $valid = ['string', 'number']; return Utils::stableSort($args[0], function ($a, $b) use($valid) { $this->validateSeq('sort:0', $valid, $a, $b); return \strnatcmp($a, $b); }); } private function fn_sort_by(array $args) { $this->validate('sort_by', $args, [['array'], ['expression']]); $expr = $args[1]; $valid = ['string', 'number']; return Utils::stableSort($args[0], function ($a, $b) use($expr, $valid) { $va = $expr($a); $vb = $expr($b); $this->validateSeq('sort_by:0', $valid, $va, $vb); return \strnatcmp($va, $vb); }); } private function fn_starts_with(array $args) { $this->validate('starts_with', $args, [['string'], ['string']]); list($search, $prefix) = $args; return $prefix === '' || \mb_strpos($search, $prefix, 0, 'UTF-8') === 0; } private function fn_type(array $args) { $this->validateArity('type', \count($args), 1); return Utils::type($args[0]); } private function fn_to_string(array $args) { $this->validateArity('to_string', \count($args), 1); $v = $args[0]; if (\is_string($v)) { return $v; } elseif (\is_object($v) && !$v instanceof \JsonSerializable && \method_exists($v, '__toString')) { return (string) $v; } return \json_encode($v); } private function fn_to_number(array $args) { $this->validateArity('to_number', \count($args), 1); $value = $args[0]; $type = Utils::type($value); if ($type == 'number') { return $value; } elseif ($type == 'string' && \is_numeric($value)) { return \mb_strpos($value, '.', 0, 'UTF-8') ? (float) $value : (int) $value; } else { return null; } } private function fn_values(array $args) { $this->validate('values', $args, [['array', 'object']]); return \array_values((array) $args[0]); } private function fn_merge(array $args) { if (!$args) { throw new \RuntimeException("merge() expects 1 or more arguments, 0 were provided"); } return \call_user_func_array('VendorDuplicator\\array_replace', $args); } private function fn_to_array(array $args) { $this->validate('to_array', $args, [['any']]); return Utils::isArray($args[0]) ? $args[0] : [$args[0]]; } private function fn_map(array $args) { $this->validate('map', $args, [['expression'], ['any']]); $result = []; foreach ($args[1] as $a) { $result[] = $args[0]($a); } return $result; } private function typeError($from, $msg) { if (\mb_strpos($from, ':', 0, 'UTF-8')) { list($fn, $pos) = \explode(':', $from); throw new \RuntimeException(\sprintf('Argument %d of %s %s', $pos, $fn, $msg)); } else { throw new \RuntimeException(\sprintf('Type error: %s %s', $from, $msg)); } } private function validateArity($from, $given, $expected) { if ($given != $expected) { $err = "%s() expects {$expected} arguments, {$given} were provided"; throw new \RuntimeException(\sprintf($err, $from)); } } private function validate($from, $args, $types = []) { $this->validateArity($from, \count($args), \count($types)); foreach ($args as $index => $value) { if (!isset($types[$index]) || !$types[$index]) { continue; } $this->validateType("{$from}:{$index}", $value, $types[$index]); } } private function validateType($from, $value, array $types) { if ($types[0] == 'any' || \in_array(Utils::type($value), $types) || $value === [] && \in_array('object', $types)) { return; } $msg = 'must be one of the following types: ' . \implode(', ', $types) . '. ' . Utils::type($value) . ' found'; $this->typeError($from, $msg); } /** * Validates value A and B, ensures they both are correctly typed, and of * the same type. * * @param string $from String of function:argument_position * @param array $types Array of valid value types. * @param mixed $a Value A * @param mixed $b Value B */ private function validateSeq($from, array $types, $a, $b) { $ta = Utils::type($a); $tb = Utils::type($b); if ($ta !== $tb) { $msg = "encountered a type mismatch in sequence: {$ta}, {$tb}"; $this->typeError($from, $msg); } $typeMatch = $types && $types[0] == 'any' || \in_array($ta, $types); if (!$typeMatch) { $msg = 'encountered a type error in sequence. The argument must be ' . 'an array of ' . \implode('|', $types) . ' types. ' . "Found {$ta}, {$tb}."; $this->typeError($from, $msg); } } /** * Reduces and validates an array of values to a single value using a fn. * * @param string $from String of function:argument_position * @param array $values Values to reduce. * @param array $types Array of valid value types. * @param callable $reduce Reduce function that accepts ($carry, $item). * * @return mixed */ private function reduce($from, array $values, array $types, callable $reduce) { $i = -1; return \array_reduce($values, function ($carry, $item) use($from, $types, $reduce, &$i) { if (++$i > 0) { $this->validateSeq($from, $types, $carry, $item); } return $reduce($carry, $item, $i); }); } /** * Validates the return values of expressions as they are applied. * * @param string $from Function name : position * @param callable $expr Expression function to validate. * @param array $types Array of acceptable return type values. * * @return callable Returns a wrapped function */ private function wrapExpression($from, callable $expr, array $types) { list($fn, $pos) = \explode(':', $from); $from = "The expression return value of argument {$pos} of {$fn}"; return function ($value) use($from, $expr, $types) { $value = $expr($value); $this->validateType($from, $value, $types); return $value; }; } /** @internal Pass function name validation off to runtime */ public function __call($name, $args) { $name = \str_replace('fn_', '', $name); throw new \RuntimeException("Call to undefined function {$name}"); } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/TreeCompiler.php000064400000024746147600374260024203 0ustar00vars = []; $this->source = $this->indentation = ''; $this->write("write('use JmesPath\\TreeInterpreter as Ti;')->write('use JmesPath\\FnDispatcher as Fd;')->write('use JmesPath\\Utils;')->write('')->write('function %s(Ti $interpreter, $value) {', $fnName)->indent()->dispatch($ast)->write('')->write('return $value;')->outdent()->write('}'); return $this->source; } /** * @param array $node * @return mixed */ private function dispatch(array $node) { return $this->{"visit_{$node['type']}"}($node); } /** * Creates a monotonically incrementing unique variable name by prefix. * * @param string $prefix Variable name prefix * * @return string */ private function makeVar($prefix) { if (!isset($this->vars[$prefix])) { $this->vars[$prefix] = 0; return '$' . $prefix; } return '$' . $prefix . ++$this->vars[$prefix]; } /** * Writes the given line of source code. Pass positional arguments to write * that match the format of sprintf. * * @param string $str String to write * @return $this */ private function write($str) { $this->source .= $this->indentation; if (\func_num_args() == 1) { $this->source .= $str . "\n"; return $this; } $this->source .= \vsprintf($str, \array_slice(\func_get_args(), 1)) . "\n"; return $this; } /** * Decreases the indentation level of code being written * @return $this */ private function outdent() { $this->indentation = \substr($this->indentation, 0, -4); return $this; } /** * Increases the indentation level of code being written * @return $this */ private function indent() { $this->indentation .= ' '; return $this; } private function visit_or(array $node) { $a = $this->makeVar('beforeOr'); return $this->write('%s = $value;', $a)->dispatch($node['children'][0])->write('if (!$value && $value !== "0" && $value !== 0) {')->indent()->write('$value = %s;', $a)->dispatch($node['children'][1])->outdent()->write('}'); } private function visit_and(array $node) { $a = $this->makeVar('beforeAnd'); return $this->write('%s = $value;', $a)->dispatch($node['children'][0])->write('if ($value || $value === "0" || $value === 0) {')->indent()->write('$value = %s;', $a)->dispatch($node['children'][1])->outdent()->write('}'); } private function visit_not(array $node) { return $this->write('// Visiting not node')->dispatch($node['children'][0])->write('// Applying boolean not to result of not node')->write('$value = !Utils::isTruthy($value);'); } private function visit_subexpression(array $node) { return $this->dispatch($node['children'][0])->write('if ($value !== null) {')->indent()->dispatch($node['children'][1])->outdent()->write('}'); } private function visit_field(array $node) { $arr = '$value[' . \var_export($node['value'], \true) . ']'; $obj = '$value->{' . \var_export($node['value'], \true) . '}'; $this->write('if (is_array($value) || $value instanceof \\ArrayAccess) {')->indent()->write('$value = isset(%s) ? %s : null;', $arr, $arr)->outdent()->write('} elseif ($value instanceof \\stdClass) {')->indent()->write('$value = isset(%s) ? %s : null;', $obj, $obj)->outdent()->write("} else {")->indent()->write('$value = null;')->outdent()->write("}"); return $this; } private function visit_index(array $node) { if ($node['value'] >= 0) { $check = '$value[' . $node['value'] . ']'; return $this->write('$value = (is_array($value) || $value instanceof \\ArrayAccess)' . ' && isset(%s) ? %s : null;', $check, $check); } $a = $this->makeVar('count'); return $this->write('if (is_array($value) || ($value instanceof \\ArrayAccess && $value instanceof \\Countable)) {')->indent()->write('%s = count($value) + %s;', $a, $node['value'])->write('$value = isset($value[%s]) ? $value[%s] : null;', $a, $a)->outdent()->write('} else {')->indent()->write('$value = null;')->outdent()->write('}'); } private function visit_literal(array $node) { return $this->write('$value = %s;', \var_export($node['value'], \true)); } private function visit_pipe(array $node) { return $this->dispatch($node['children'][0])->dispatch($node['children'][1]); } private function visit_multi_select_list(array $node) { return $this->visit_multi_select_hash($node); } private function visit_multi_select_hash(array $node) { $listVal = $this->makeVar('list'); $value = $this->makeVar('prev'); $this->write('if ($value !== null) {')->indent()->write('%s = [];', $listVal)->write('%s = $value;', $value); $first = \true; foreach ($node['children'] as $child) { if (!$first) { $this->write('$value = %s;', $value); } $first = \false; if ($node['type'] == 'multi_select_hash') { $this->dispatch($child['children'][0]); $key = \var_export($child['value'], \true); $this->write('%s[%s] = $value;', $listVal, $key); } else { $this->dispatch($child); $this->write('%s[] = $value;', $listVal); } } return $this->write('$value = %s;', $listVal)->outdent()->write('}'); } private function visit_function(array $node) { $value = $this->makeVar('val'); $args = $this->makeVar('args'); $this->write('%s = $value;', $value)->write('%s = [];', $args); foreach ($node['children'] as $arg) { $this->dispatch($arg); $this->write('%s[] = $value;', $args)->write('$value = %s;', $value); } return $this->write('$value = Fd::getInstance()->__invoke("%s", %s);', $node['value'], $args); } private function visit_slice(array $node) { return $this->write('$value = !is_string($value) && !Utils::isArray($value)')->write(' ? null : Utils::slice($value, %s, %s, %s);', \var_export($node['value'][0], \true), \var_export($node['value'][1], \true), \var_export($node['value'][2], \true)); } private function visit_current(array $node) { return $this->write('// Visiting current node (no-op)'); } private function visit_expref(array $node) { $child = \var_export($node['children'][0], \true); return $this->write('$value = function ($value) use ($interpreter) {')->indent()->write('return $interpreter->visit(%s, $value);', $child)->outdent()->write('};'); } private function visit_flatten(array $node) { $this->dispatch($node['children'][0]); $merged = $this->makeVar('merged'); $val = $this->makeVar('val'); $this->write('// Visiting merge node')->write('if (!Utils::isArray($value)) {')->indent()->write('$value = null;')->outdent()->write('} else {')->indent()->write('%s = [];', $merged)->write('foreach ($value as %s) {', $val)->indent()->write('if (is_array(%s) && isset(%s[0])) {', $val, $val)->indent()->write('%s = array_merge(%s, %s);', $merged, $merged, $val)->outdent()->write('} elseif (%s !== []) {', $val)->indent()->write('%s[] = %s;', $merged, $val)->outdent()->write('}')->outdent()->write('}')->write('$value = %s;', $merged)->outdent()->write('}'); return $this; } private function visit_projection(array $node) { $val = $this->makeVar('val'); $collected = $this->makeVar('collected'); $this->write('// Visiting projection node')->dispatch($node['children'][0])->write(''); if (!isset($node['from'])) { $this->write('if (!is_array($value) || !($value instanceof \\stdClass)) { $value = null; }'); } elseif ($node['from'] == 'object') { $this->write('if (!Utils::isObject($value)) { $value = null; }'); } elseif ($node['from'] == 'array') { $this->write('if (!Utils::isArray($value)) { $value = null; }'); } $this->write('if ($value !== null) {')->indent()->write('%s = [];', $collected)->write('foreach ((array) $value as %s) {', $val)->indent()->write('$value = %s;', $val)->dispatch($node['children'][1])->write('if ($value !== null) {')->indent()->write('%s[] = $value;', $collected)->outdent()->write('}')->outdent()->write('}')->write('$value = %s;', $collected)->outdent()->write('}'); return $this; } private function visit_condition(array $node) { $value = $this->makeVar('beforeCondition'); return $this->write('%s = $value;', $value)->write('// Visiting condition node')->dispatch($node['children'][0])->write('// Checking result of condition node')->write('if (Utils::isTruthy($value)) {')->indent()->write('$value = %s;', $value)->dispatch($node['children'][1])->outdent()->write('} else {')->indent()->write('$value = null;')->outdent()->write('}'); } private function visit_comparator(array $node) { $value = $this->makeVar('val'); $a = $this->makeVar('left'); $b = $this->makeVar('right'); $this->write('// Visiting comparator node')->write('%s = $value;', $value)->dispatch($node['children'][0])->write('%s = $value;', $a)->write('$value = %s;', $value)->dispatch($node['children'][1])->write('%s = $value;', $b); if ($node['value'] == '==') { $this->write('$value = Utils::isEqual(%s, %s);', $a, $b); } elseif ($node['value'] == '!=') { $this->write('$value = !Utils::isEqual(%s, %s);', $a, $b); } else { $this->write('$value = (is_int(%s) || is_float(%s)) && (is_int(%s) || is_float(%s)) && %s %s %s;', $a, $a, $b, $b, $a, $node['value'], $b); } return $this; } /** @internal */ public function __call($method, $args) { throw new \RuntimeException(\sprintf('Invalid node encountered: %s', \json_encode($args[0]))); } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/JmesPath.php000064400000000611147600374260023305 0ustar00parser = $parser ?: new Parser(); $this->compiler = new TreeCompiler(); $dir = $dir ?: \sys_get_temp_dir(); if (!\is_dir($dir) && !\mkdir($dir, 0755, \true)) { throw new \RuntimeException("Unable to create cache directory: {$dir}"); } $this->cacheDir = \realpath($dir); $this->interpreter = new TreeInterpreter(); } /** * Returns data from the provided input that matches a given JMESPath * expression. * * @param string $expression JMESPath expression to evaluate * @param mixed $data Data to search. This data should be data that * is similar to data returned from json_decode * using associative arrays rather than objects. * * @return mixed Returns the matching data or null * @throws \RuntimeException */ public function __invoke($expression, $data) { $functionName = 'jmespath_' . \md5($expression); if (!\function_exists($functionName)) { $filename = "{$this->cacheDir}/{$functionName}.php"; if (!\file_exists($filename)) { $this->compile($filename, $expression, $functionName); } require $filename; } return $functionName($this->interpreter, $data); } private function compile($filename, $expression, $functionName) { $code = $this->compiler->visit($this->parser->parse($expression), $functionName, $expression); if (!\file_put_contents($filename, $code)) { throw new \RuntimeException(\sprintf('Unable to write the compiled PHP code to: %s (%s)', $filename, \var_export(\error_get_last(), \true))); } } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/Lexer.php000064400000032233147600374260022656 0ustar00 self::STATE_LT, '>' => self::STATE_GT, '=' => self::STATE_EQ, '!' => self::STATE_NOT, '[' => self::STATE_LBRACKET, '|' => self::STATE_PIPE, '&' => self::STATE_AND, '`' => self::STATE_JSON_LITERAL, '"' => self::STATE_QUOTED_STRING, "'" => self::STATE_STRING_LITERAL, '-' => self::STATE_NUMBER, '0' => self::STATE_NUMBER, '1' => self::STATE_NUMBER, '2' => self::STATE_NUMBER, '3' => self::STATE_NUMBER, '4' => self::STATE_NUMBER, '5' => self::STATE_NUMBER, '6' => self::STATE_NUMBER, '7' => self::STATE_NUMBER, '8' => self::STATE_NUMBER, '9' => self::STATE_NUMBER, ' ' => self::STATE_WHITESPACE, "\t" => self::STATE_WHITESPACE, "\n" => self::STATE_WHITESPACE, "\r" => self::STATE_WHITESPACE, '.' => self::STATE_SINGLE_CHAR, '*' => self::STATE_SINGLE_CHAR, ']' => self::STATE_SINGLE_CHAR, ',' => self::STATE_SINGLE_CHAR, ':' => self::STATE_SINGLE_CHAR, '@' => self::STATE_SINGLE_CHAR, '(' => self::STATE_SINGLE_CHAR, ')' => self::STATE_SINGLE_CHAR, '{' => self::STATE_SINGLE_CHAR, '}' => self::STATE_SINGLE_CHAR, '_' => self::STATE_IDENTIFIER, 'A' => self::STATE_IDENTIFIER, 'B' => self::STATE_IDENTIFIER, 'C' => self::STATE_IDENTIFIER, 'D' => self::STATE_IDENTIFIER, 'E' => self::STATE_IDENTIFIER, 'F' => self::STATE_IDENTIFIER, 'G' => self::STATE_IDENTIFIER, 'H' => self::STATE_IDENTIFIER, 'I' => self::STATE_IDENTIFIER, 'J' => self::STATE_IDENTIFIER, 'K' => self::STATE_IDENTIFIER, 'L' => self::STATE_IDENTIFIER, 'M' => self::STATE_IDENTIFIER, 'N' => self::STATE_IDENTIFIER, 'O' => self::STATE_IDENTIFIER, 'P' => self::STATE_IDENTIFIER, 'Q' => self::STATE_IDENTIFIER, 'R' => self::STATE_IDENTIFIER, 'S' => self::STATE_IDENTIFIER, 'T' => self::STATE_IDENTIFIER, 'U' => self::STATE_IDENTIFIER, 'V' => self::STATE_IDENTIFIER, 'W' => self::STATE_IDENTIFIER, 'X' => self::STATE_IDENTIFIER, 'Y' => self::STATE_IDENTIFIER, 'Z' => self::STATE_IDENTIFIER, 'a' => self::STATE_IDENTIFIER, 'b' => self::STATE_IDENTIFIER, 'c' => self::STATE_IDENTIFIER, 'd' => self::STATE_IDENTIFIER, 'e' => self::STATE_IDENTIFIER, 'f' => self::STATE_IDENTIFIER, 'g' => self::STATE_IDENTIFIER, 'h' => self::STATE_IDENTIFIER, 'i' => self::STATE_IDENTIFIER, 'j' => self::STATE_IDENTIFIER, 'k' => self::STATE_IDENTIFIER, 'l' => self::STATE_IDENTIFIER, 'm' => self::STATE_IDENTIFIER, 'n' => self::STATE_IDENTIFIER, 'o' => self::STATE_IDENTIFIER, 'p' => self::STATE_IDENTIFIER, 'q' => self::STATE_IDENTIFIER, 'r' => self::STATE_IDENTIFIER, 's' => self::STATE_IDENTIFIER, 't' => self::STATE_IDENTIFIER, 'u' => self::STATE_IDENTIFIER, 'v' => self::STATE_IDENTIFIER, 'w' => self::STATE_IDENTIFIER, 'x' => self::STATE_IDENTIFIER, 'y' => self::STATE_IDENTIFIER, 'z' => self::STATE_IDENTIFIER]; /** @var array Valid identifier characters after first character */ private $validIdentifier = ['A' => \true, 'B' => \true, 'C' => \true, 'D' => \true, 'E' => \true, 'F' => \true, 'G' => \true, 'H' => \true, 'I' => \true, 'J' => \true, 'K' => \true, 'L' => \true, 'M' => \true, 'N' => \true, 'O' => \true, 'P' => \true, 'Q' => \true, 'R' => \true, 'S' => \true, 'T' => \true, 'U' => \true, 'V' => \true, 'W' => \true, 'X' => \true, 'Y' => \true, 'Z' => \true, 'a' => \true, 'b' => \true, 'c' => \true, 'd' => \true, 'e' => \true, 'f' => \true, 'g' => \true, 'h' => \true, 'i' => \true, 'j' => \true, 'k' => \true, 'l' => \true, 'm' => \true, 'n' => \true, 'o' => \true, 'p' => \true, 'q' => \true, 'r' => \true, 's' => \true, 't' => \true, 'u' => \true, 'v' => \true, 'w' => \true, 'x' => \true, 'y' => \true, 'z' => \true, '_' => \true, '0' => \true, '1' => \true, '2' => \true, '3' => \true, '4' => \true, '5' => \true, '6' => \true, '7' => \true, '8' => \true, '9' => \true]; /** @var array Valid number characters after the first character */ private $numbers = ['0' => \true, '1' => \true, '2' => \true, '3' => \true, '4' => \true, '5' => \true, '6' => \true, '7' => \true, '8' => \true, '9' => \true]; /** @var array Map of simple single character tokens */ private $simpleTokens = ['.' => self::T_DOT, '*' => self::T_STAR, ']' => self::T_RBRACKET, ',' => self::T_COMMA, ':' => self::T_COLON, '@' => self::T_CURRENT, '(' => self::T_LPAREN, ')' => self::T_RPAREN, '{' => self::T_LBRACE, '}' => self::T_RBRACE]; /** * Tokenize the JMESPath expression into an array of tokens hashes that * contain a 'type', 'value', and 'key'. * * @param string $input JMESPath input * * @return array * @throws SyntaxErrorException */ public function tokenize($input) { $tokens = []; if ($input === '') { goto eof; } $chars = \str_split($input); while (\false !== ($current = \current($chars))) { // Every character must be in the transition character table. if (!isset(self::$transitionTable[$current])) { $tokens[] = ['type' => self::T_UNKNOWN, 'pos' => \key($chars), 'value' => $current]; \next($chars); continue; } $state = self::$transitionTable[$current]; if ($state === self::STATE_SINGLE_CHAR) { // Consume simple tokens like ".", ",", "@", etc. $tokens[] = ['type' => $this->simpleTokens[$current], 'pos' => \key($chars), 'value' => $current]; \next($chars); } elseif ($state === self::STATE_IDENTIFIER) { // Consume identifiers $start = \key($chars); $buffer = ''; do { $buffer .= $current; $current = \next($chars); } while ($current !== \false && isset($this->validIdentifier[$current])); $tokens[] = ['type' => self::T_IDENTIFIER, 'value' => $buffer, 'pos' => $start]; } elseif ($state === self::STATE_WHITESPACE) { // Skip whitespace \next($chars); } elseif ($state === self::STATE_LBRACKET) { // Consume "[", "[?", and "[]" $position = \key($chars); $actual = \next($chars); if ($actual === ']') { \next($chars); $tokens[] = ['type' => self::T_FLATTEN, 'pos' => $position, 'value' => '[]']; } elseif ($actual === '?') { \next($chars); $tokens[] = ['type' => self::T_FILTER, 'pos' => $position, 'value' => '[?']; } else { $tokens[] = ['type' => self::T_LBRACKET, 'pos' => $position, 'value' => '[']; } } elseif ($state === self::STATE_STRING_LITERAL) { // Consume raw string literals $t = $this->inside($chars, "'", self::T_LITERAL); $t['value'] = \str_replace("\\'", "'", $t['value']); $tokens[] = $t; } elseif ($state === self::STATE_PIPE) { // Consume pipe and OR $tokens[] = $this->matchOr($chars, '|', '|', self::T_OR, self::T_PIPE); } elseif ($state == self::STATE_JSON_LITERAL) { // Consume JSON literals $token = $this->inside($chars, '`', self::T_LITERAL); if ($token['type'] === self::T_LITERAL) { $token['value'] = \str_replace('\\`', '`', $token['value']); $token = $this->parseJson($token); } $tokens[] = $token; } elseif ($state == self::STATE_NUMBER) { // Consume numbers $start = \key($chars); $buffer = ''; do { $buffer .= $current; $current = \next($chars); } while ($current !== \false && isset($this->numbers[$current])); $tokens[] = ['type' => self::T_NUMBER, 'value' => (int) $buffer, 'pos' => $start]; } elseif ($state === self::STATE_QUOTED_STRING) { // Consume quoted identifiers $token = $this->inside($chars, '"', self::T_QUOTED_IDENTIFIER); if ($token['type'] === self::T_QUOTED_IDENTIFIER) { $token['value'] = '"' . $token['value'] . '"'; $token = $this->parseJson($token); } $tokens[] = $token; } elseif ($state === self::STATE_EQ) { // Consume equals $tokens[] = $this->matchOr($chars, '=', '=', self::T_COMPARATOR, self::T_UNKNOWN); } elseif ($state == self::STATE_AND) { $tokens[] = $this->matchOr($chars, '&', '&', self::T_AND, self::T_EXPREF); } elseif ($state === self::STATE_NOT) { // Consume not equal $tokens[] = $this->matchOr($chars, '!', '=', self::T_COMPARATOR, self::T_NOT); } else { // either '<' or '>' // Consume less than and greater than $tokens[] = $this->matchOr($chars, $current, '=', self::T_COMPARATOR, self::T_COMPARATOR); } } eof: $tokens[] = ['type' => self::T_EOF, 'pos' => \mb_strlen($input, 'UTF-8'), 'value' => null]; return $tokens; } /** * Returns a token based on whether or not the next token matches the * expected value. If it does, a token of "$type" is returned. Otherwise, * a token of "$orElse" type is returned. * * @param array $chars Array of characters by reference. * @param string $current The current character. * @param string $expected Expected character. * @param string $type Expected result type. * @param string $orElse Otherwise return a token of this type. * * @return array Returns a conditional token. */ private function matchOr(array &$chars, $current, $expected, $type, $orElse) { if (\next($chars) === $expected) { \next($chars); return ['type' => $type, 'pos' => \key($chars) - 1, 'value' => $current . $expected]; } return ['type' => $orElse, 'pos' => \key($chars) - 1, 'value' => $current]; } /** * Returns a token the is the result of consuming inside of delimiter * characters. Escaped delimiters will be adjusted before returning a * value. If the token is not closed, "unknown" is returned. * * @param array $chars Array of characters by reference. * @param string $delim The delimiter character. * @param string $type Token type. * * @return array Returns the consumed token. */ private function inside(array &$chars, $delim, $type) { $position = \key($chars); $current = \next($chars); $buffer = ''; while ($current !== $delim) { if ($current === '\\') { $buffer .= '\\'; $current = \next($chars); } if ($current === \false) { // Unclosed delimiter return ['type' => self::T_UNKNOWN, 'value' => $buffer, 'pos' => $position]; } $buffer .= $current; $current = \next($chars); } \next($chars); return ['type' => $type, 'value' => $buffer, 'pos' => $position]; } /** * Parses a JSON token or sets the token type to "unknown" on error. * * @param array $token Token that needs parsing. * * @return array Returns a token with a parsed value. */ private function parseJson(array $token) { $value = \json_decode($token['value'], \true); if ($error = \json_last_error()) { // Legacy support for elided quotes. Try to parse again by adding // quotes around the bad input value. $value = \json_decode('"' . $token['value'] . '"', \true); if ($error = \json_last_error()) { $token['type'] = self::T_UNKNOWN; return $token; } } $token['value'] = $value; return $token; } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/AstRuntime.php000064400000002663147600374260023676 0ustar00interpreter = new TreeInterpreter($fnDispatcher); $this->parser = $parser ?: new Parser(); } /** * Returns data from the provided input that matches a given JMESPath * expression. * * @param string $expression JMESPath expression to evaluate * @param mixed $data Data to search. This data should be data that * is similar to data returned from json_decode * using associative arrays rather than objects. * * @return mixed Returns the matching data or null */ public function __invoke($expression, $data) { if (!isset($this->cache[$expression])) { // Clear the AST cache when it hits 1024 entries if (++$this->cachedCount > 1024) { $this->cache = []; $this->cachedCount = 0; } $this->cache[$expression] = $this->parser->parse($expression); } return $this->interpreter->visit($this->cache[$expression], $data); } } addons/amazons3addon/vendor-prefixed/mtdowling/jmespath.php/src/Env.php000064400000004756147600374260022340 0ustar00fnDispatcher = $fnDispatcher ?: FnDispatcher::getInstance(); } /** * Visits each node in a JMESPath AST and returns the evaluated result. * * @param array $node JMESPath AST node * @param mixed $data Data to evaluate * * @return mixed */ public function visit(array $node, $data) { return $this->dispatch($node, $data); } /** * Recursively traverses an AST using depth-first, pre-order traversal. * The evaluation logic for each node type is embedded into a large switch * statement to avoid the cost of "double dispatch". * @return mixed */ private function dispatch(array $node, $value) { $dispatcher = $this->fnDispatcher; switch ($node['type']) { case 'field': if (\is_array($value) || $value instanceof \ArrayAccess) { return isset($value[$node['value']]) ? $value[$node['value']] : null; } elseif ($value instanceof \stdClass) { return isset($value->{$node['value']}) ? $value->{$node['value']} : null; } return null; case 'subexpression': return $this->dispatch($node['children'][1], $this->dispatch($node['children'][0], $value)); case 'index': if (!Utils::isArray($value)) { return null; } $idx = $node['value'] >= 0 ? $node['value'] : $node['value'] + \count($value); return isset($value[$idx]) ? $value[$idx] : null; case 'projection': $left = $this->dispatch($node['children'][0], $value); switch ($node['from']) { case 'object': if (!Utils::isObject($left)) { return null; } break; case 'array': if (!Utils::isArray($left)) { return null; } break; default: if (!\is_array($left) || !$left instanceof \stdClass) { return null; } } $collected = []; foreach ((array) $left as $val) { $result = $this->dispatch($node['children'][1], $val); if ($result !== null) { $collected[] = $result; } } return $collected; case 'flatten': static $skipElement = []; $value = $this->dispatch($node['children'][0], $value); if (!Utils::isArray($value)) { return null; } $merged = []; foreach ($value as $values) { // Only merge up arrays lists and not hashes if (\is_array($values) && isset($values[0])) { $merged = \array_merge($merged, $values); } elseif ($values !== $skipElement) { $merged[] = $values; } } return $merged; case 'literal': return $node['value']; case 'current': return $value; case 'or': $result = $this->dispatch($node['children'][0], $value); return Utils::isTruthy($result) ? $result : $this->dispatch($node['children'][1], $value); case 'and': $result = $this->dispatch($node['children'][0], $value); return Utils::isTruthy($result) ? $this->dispatch($node['children'][1], $value) : $result; case 'not': return !Utils::isTruthy($this->dispatch($node['children'][0], $value)); case 'pipe': return $this->dispatch($node['children'][1], $this->dispatch($node['children'][0], $value)); case 'multi_select_list': if ($value === null) { return null; } $collected = []; foreach ($node['children'] as $node) { $collected[] = $this->dispatch($node, $value); } return $collected; case 'multi_select_hash': if ($value === null) { return null; } $collected = []; foreach ($node['children'] as $node) { $collected[$node['value']] = $this->dispatch($node['children'][0], $value); } return $collected; case 'comparator': $left = $this->dispatch($node['children'][0], $value); $right = $this->dispatch($node['children'][1], $value); if ($node['value'] == '==') { return Utils::isEqual($left, $right); } elseif ($node['value'] == '!=') { return !Utils::isEqual($left, $right); } else { return self::relativeCmp($left, $right, $node['value']); } case 'condition': return Utils::isTruthy($this->dispatch($node['children'][0], $value)) ? $this->dispatch($node['children'][1], $value) : null; case 'function': $args = []; foreach ($node['children'] as $arg) { $args[] = $this->dispatch($arg, $value); } return $dispatcher($node['value'], $args); case 'slice': return \is_string($value) || Utils::isArray($value) ? Utils::slice($value, $node['value'][0], $node['value'][1], $node['value'][2]) : null; case 'expref': $apply = $node['children'][0]; return function ($value) use($apply) { return $this->visit($apply, $value); }; default: throw new \RuntimeException("Unknown node type: {$node['type']}"); } } /** * @return bool */ private static function relativeCmp($left, $right, $cmp) { if (!(\is_int($left) || \is_float($left)) || !(\is_int($right) || \is_float($right))) { return \false; } switch ($cmp) { case '>': return $left > $right; case '>=': return $left >= $right; case '<': return $left < $right; case '<=': return $left <= $right; default: throw new \RuntimeException("Invalid comparison: {$cmp}"); } } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/dist/random_compat.phar.pubkey000064400000000327147600374260026421 0ustar00-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEEd+wCqJDrx5B4OldM0dQE0ZMX+lx1ZWm pui0SUqD4G29L3NGsz9UhJ/0HjBdbnkhIK5xviT0X5vtjacF6ajgcCArbTB+ds+p +h7Q084NuSuIpNb6YPfoUFgC/CL9kAoc -----END PUBLIC KEY----- addons/amazons3addon/vendor-prefixed/paragonie/random_compat/dist/random_compat.phar.pubkey.asc000064400000000750147600374260027166 0ustar00-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (MingW32) iQEcBAABAgAGBQJWtW1hAAoJEGuXocKCZATaJf0H+wbZGgskK1dcRTsuVJl9IWip QwGw/qIKI280SD6/ckoUMxKDCJiFuPR14zmqnS36k7N5UNPnpdTJTS8T11jttSpg 1LCmgpbEIpgaTah+cELDqFCav99fS+bEiAL5lWDAHBTE/XPjGVCqeehyPYref4IW NDBIEsvnHPHPLsn6X5jq4+Yj5oUixgxaMPiR+bcO4Sh+RzOVB6i2D0upWfRXBFXA NNnsg9/zjvoC7ZW73y9uSH+dPJTt/Vgfeiv52/v41XliyzbUyLalf02GNPY+9goV JHG1ulEEBJOCiUD9cE1PUIJwHA/HqyhHIvV350YoEFiHl8iSwm7SiZu5kPjaq74= =B6+8 -----END PGP SIGNATURE----- addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_bytes_dev_urandom.php000064400000014402147600374260027010 0ustar00 $st */ $st = \fstat($fp); if (($st['mode'] & 0170000) !== 020000) { \fclose($fp); $fp = \false; } } } if (\is_resource($fp)) { /** * stream_set_read_buffer() does not exist in HHVM * * If we don't set the stream's read buffer to 0, PHP will * internally buffer 8192 bytes, which can waste entropy * * stream_set_read_buffer returns 0 on success */ if (\is_callable('VendorDuplicator\\stream_set_read_buffer')) { \stream_set_read_buffer($fp, \RANDOM_COMPAT_READ_BUFFER); } if (\is_callable('VendorDuplicator\\stream_set_chunk_size')) { \stream_set_chunk_size($fp, \RANDOM_COMPAT_READ_BUFFER); } } } try { /** @var int $bytes */ $bytes = RandomCompat_intval($bytes); } catch (\TypeError $ex) { throw new \TypeError('random_bytes(): $bytes must be an integer'); } if ($bytes < 1) { throw new \Error('Length must be greater than 0'); } /** * This if() block only runs if we managed to open a file handle * * It does not belong in an else {} block, because the above * if (empty($fp)) line is logic that should only be run once per * page load. */ if (\is_resource($fp)) { /** * @var int */ $remaining = $bytes; /** * @var string|bool */ $buf = ''; /** * We use fread() in a loop to protect against partial reads */ do { /** * @var string|bool */ $read = \fread($fp, $remaining); if (!\is_string($read)) { /** * We cannot safely read from the file. Exit the * do-while loop and trigger the exception condition * * @var string|bool */ $buf = \false; break; } /** * Decrease the number of bytes returned from remaining */ $remaining -= RandomCompat_strlen($read); /** * @var string $buf */ $buf .= $read; } while ($remaining > 0); /** * Is our result valid? * @var string|bool $buf */ if (\is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { /** * Return our random entropy buffer here: */ return $buf; } } } /** * If we reach here, PHP has failed us. */ throw new \Exception('Error reading from source device'); } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_bytes_mcrypt.php000064400000004735147600374260026033 0ustar00 RandomCompat_strlen($binary_string)) { return ''; } return (string) \mb_substr((string) $binary_string, (int) $start, (int) $length, '8bit'); } } else { /** * substr() implementation that isn't brittle to mbstring.func_overload * * This version just uses the default substr() * * @param string $binary_string * @param int $start * @param int|null $length (optional) * * @throws TypeError * * @return string */ function RandomCompat_substr($binary_string, $start, $length = null) { if (!\is_string($binary_string)) { throw new \TypeError('RandomCompat_substr(): First argument should be a string'); } if (!\is_int($start)) { throw new \TypeError('RandomCompat_substr(): Second argument should be an integer'); } if ($length !== null) { if (!\is_int($length)) { throw new \TypeError('RandomCompat_substr(): Third argument should be an integer, or omitted'); } return (string) \substr((string) $binary_string, (int) $start, (int) $length); } return (string) \substr((string) $binary_string, (int) $start); } } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_bytes_libsodium.php000064400000005466147600374260026506 0ustar00 2147483647) { $buf = ''; for ($i = 0; $i < $bytes; $i += 1073741824) { $n = $bytes - $i > 1073741824 ? 1073741824 : $bytes - $i; $buf .= \Sodium\randombytes_buf($n); } } else { /** @var string|bool $buf */ $buf = \Sodium\randombytes_buf($bytes); } if (\is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new \Exception('Could not gather sufficient random data'); } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random.php000064400000016665147600374260023234 0ustar00= 70000) { return; } if (!\defined('RANDOM_COMPAT_READ_BUFFER')) { \define('RANDOM_COMPAT_READ_BUFFER', 8); } $RandomCompatDIR = \dirname(__FILE__); require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'byte_safe_strings.php'; require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'cast_to_int.php'; require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'error_polyfill.php'; if (!\is_callable('VendorDuplicator\\random_bytes')) { /** * PHP 5.2.0 - 5.6.x way to implement random_bytes() * * We use conditional statements here to define the function in accordance * to the operating environment. It's a micro-optimization. * * In order of preference: * 1. Use libsodium if available. * 2. fread() /dev/urandom if available (never on Windows) * 3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM) * 4. COM('CAPICOM.Utilities.1')->GetRandom() * * See RATIONALE.md for our reasoning behind this particular order */ if (\extension_loaded('libsodium')) { // See random_bytes_libsodium.php if (\PHP_VERSION_ID >= 50300 && \is_callable('VendorDuplicator\\Sodium\\randombytes_buf')) { require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php'; } elseif (\method_exists('Sodium', 'randombytes_buf')) { require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php'; } } /** * Reading directly from /dev/urandom: */ if (\DIRECTORY_SEPARATOR === '/') { // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast // way to exclude Windows. $RandomCompatUrandom = \true; $RandomCompat_basedir = \ini_get('open_basedir'); if (!empty($RandomCompat_basedir)) { $RandomCompat_open_basedir = \explode(\PATH_SEPARATOR, \strtolower($RandomCompat_basedir)); $RandomCompatUrandom = array() !== \array_intersect(array('/dev', '/dev/', '/dev/urandom'), $RandomCompat_open_basedir); $RandomCompat_open_basedir = null; } if (!\is_callable('VendorDuplicator\\random_bytes') && $RandomCompatUrandom && @\is_readable('/dev/urandom')) { // Error suppression on is_readable() in case of an open_basedir // or safe_mode failure. All we care about is whether or not we // can read it at this point. If the PHP environment is going to // panic over trying to see if the file can be read in the first // place, that is not helpful to us here. // See random_bytes_dev_urandom.php require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php'; } // Unset variables after use $RandomCompat_basedir = null; } else { $RandomCompatUrandom = \false; } /** * mcrypt_create_iv() * * We only want to use mcypt_create_iv() if: * * - random_bytes() hasn't already been defined * - the mcrypt extensions is loaded * - One of these two conditions is true: * - We're on Windows (DIRECTORY_SEPARATOR !== '/') * - We're not on Windows and /dev/urandom is readabale * (i.e. we're not in a chroot jail) * - Special case: * - If we're not on Windows, but the PHP version is between * 5.6.10 and 5.6.12, we don't want to use mcrypt. It will * hang indefinitely. This is bad. * - If we're on Windows, we want to use PHP >= 5.3.7 or else * we get insufficient entropy errors. */ if (!\is_callable('VendorDuplicator\\random_bytes') && (\DIRECTORY_SEPARATOR === '/' || \PHP_VERSION_ID >= 50307) && (\DIRECTORY_SEPARATOR !== '/' || (\PHP_VERSION_ID <= 50609 || \PHP_VERSION_ID >= 50613)) && \extension_loaded('mcrypt')) { // See random_bytes_mcrypt.php require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php'; } $RandomCompatUrandom = null; /** * This is a Windows-specific fallback, for when the mcrypt extension * isn't loaded. */ if (!\is_callable('VendorDuplicator\\random_bytes') && \extension_loaded('com_dotnet') && \class_exists('COM')) { $RandomCompat_disabled_classes = \preg_split('#\\s*,\\s*#', \strtolower(\ini_get('disable_classes'))); if (!\in_array('com', $RandomCompat_disabled_classes)) { try { $RandomCompatCOMtest = new \COM('CAPICOM.Utilities.1'); /** @psalm-suppress TypeDoesNotContainType */ if (\is_callable(array($RandomCompatCOMtest, 'GetRandom'))) { // See random_bytes_com_dotnet.php require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php'; } } catch (\com_exception $e) { // Don't try to use it. } } $RandomCompat_disabled_classes = null; $RandomCompatCOMtest = null; } /** * throw new Exception */ if (!\is_callable('VendorDuplicator\\random_bytes')) { /** * We don't have any more options, so let's throw an exception right now * and hope the developer won't let it fail silently. * * @param mixed $length * @psalm-suppress InvalidReturnType * @throws Exception * @return string */ function random_bytes($length) { unset($length); // Suppress "variable not used" warnings. throw new \Exception('There is no suitable CSPRNG installed on your system'); return ''; } } } if (!\is_callable('VendorDuplicator\\random_int')) { require_once $RandomCompatDIR . \DIRECTORY_SEPARATOR . 'random_int.php'; } $RandomCompatDIR = null; addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php000064400000005440147600374260030022 0ustar00 2147483647) { for ($i = 0; $i < $bytes; $i += 1073741824) { $n = $bytes - $i > 1073741824 ? 1073741824 : $bytes - $i; $buf .= Sodium::randombytes_buf((int) $n); } } else { $buf .= Sodium::randombytes_buf((int) $bytes); } if (\is_string($buf)) { if (RandomCompat_strlen($buf) === $bytes) { return $buf; } } /** * If we reach here, PHP has failed us. */ throw new \Exception('Could not gather sufficient random data'); } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_int.php000064400000014745147600374260024103 0ustar00 operators might accidentally let a float * through. */ try { /** @var int $min */ $min = RandomCompat_intval($min); } catch (\TypeError $ex) { throw new \TypeError('random_int(): $min must be an integer'); } try { /** @var int $max */ $max = RandomCompat_intval($max); } catch (\TypeError $ex) { throw new \TypeError('random_int(): $max must be an integer'); } /** * Now that we've verified our weak typing system has given us an integer, * let's validate the logic then we can move forward with generating random * integers along a given range. */ if ($min > $max) { throw new \Error('Minimum value must be less than or equal to the maximum value'); } if ($max === $min) { return (int) $min; } /** * Initialize variables to 0 * * We want to store: * $bytes => the number of random bytes we need * $mask => an integer bitmask (for use with the &) operator * so we can minimize the number of discards */ $attempts = $bits = $bytes = $mask = $valueShift = 0; /** @var int $attempts */ /** @var int $bits */ /** @var int $bytes */ /** @var int $mask */ /** @var int $valueShift */ /** * At this point, $range is a positive number greater than 0. It might * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to * a float and we will lose some precision. * * @var int|float $range */ $range = $max - $min; /** * Test for integer overflow: */ if (!\is_int($range)) { /** * Still safely calculate wider ranges. * Provided by @CodesInChaos, @oittaa * * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435 * * We use ~0 as a mask in this case because it generates all 1s * * @ref https://eval.in/400356 (32-bit) * @ref http://3v4l.org/XX9r5 (64-bit) */ $bytes = \PHP_INT_SIZE; /** @var int $mask */ $mask = ~0; } else { /** * $bits is effectively ceil(log($range, 2)) without dealing with * type juggling */ while ($range > 0) { if ($bits % 8 === 0) { ++$bytes; } ++$bits; $range >>= 1; /** @var int $mask */ $mask = $mask << 1 | 1; } $valueShift = $min; } /** @var int $val */ $val = 0; /** * Now that we have our parameters set up, let's begin generating * random integers until one falls between $min and $max */ /** @psalm-suppress RedundantCondition */ do { /** * The rejection probability is at most 0.5, so this corresponds * to a failure probability of 2^-128 for a working RNG */ if ($attempts > 128) { throw new \Exception('random_int: RNG is broken - too many rejections'); } /** * Let's grab the necessary number of random bytes */ $randomByteString = \random_bytes($bytes); /** * Let's turn $randomByteString into an integer * * This uses bitwise operators (<< and |) to build an integer * out of the values extracted from ord() * * Example: [9F] | [6D] | [32] | [0C] => * 159 + 27904 + 3276800 + 201326592 => * 204631455 */ $val &= 0; for ($i = 0; $i < $bytes; ++$i) { $val |= \ord($randomByteString[$i]) << $i * 8; } /** @var int $val */ /** * Apply mask */ $val &= $mask; $val += $valueShift; ++$attempts; /** * If $val overflows to a floating point number, * ... or is larger than $max, * ... or smaller than $min, * then try again. */ } while (!\is_int($val) || $val > $max || $val < $min); return (int) $val; } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/cast_to_int.php000064400000005151147600374260024246 0ustar00 operators might accidentally let a float * through. * * @param int|float $number The number we want to convert to an int * @param bool $fail_open Set to true to not throw an exception * * @return float|int * @psalm-suppress InvalidReturnType * * @throws TypeError */ function RandomCompat_intval($number, $fail_open = \false) { if (\is_int($number) || \is_float($number)) { $number += 0; } elseif (\is_numeric($number)) { /** @psalm-suppress InvalidOperand */ $number += 0; } /** @var int|float $number */ if (\is_float($number) && $number > ~\PHP_INT_MAX && $number < \PHP_INT_MAX) { $number = (int) $number; } if (\is_int($number)) { return (int) $number; } elseif (!$fail_open) { throw new \TypeError('Expected an integer.'); } return $number; } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/random_bytes_com_dotnet.php000064400000005611147600374260026642 0ustar00GetRandom($bytes, 0)); if (RandomCompat_strlen($buf) >= $bytes) { /** * Return our random entropy buffer here: */ return (string) RandomCompat_substr($buf, 0, $bytes); } ++$execCount; } while ($execCount < $bytes); /** * If we reach here, PHP has failed us. */ throw new \Exception('Could not gather sufficient random data'); } } addons/amazons3addon/vendor-prefixed/paragonie/random_compat/lib/error_polyfill.php000064400000003237147600374260025006 0ustar00 * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } addons/amazons3addon/vendor-prefixed/psr/http-message/src/UploadedFileInterface.php000064400000011115147600374260024551 0ustar00getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute($name); } addons/amazons3addon/vendor-prefixed/psr/http-message/src/MessageInterface.php000064400000015405147600374260023606 0ustar00getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } addons/amazons3addon/vendor-prefixed/psr/http-message/src/RequestInterface.php000064400000011333147600374260023646 0ustar00 ". * * Example ->error('Foo') would yield "error Foo". * * @return string[] */ public abstract function getLogs(); public function testImplements() { $this->assertInstanceOf('VendorDuplicator\\Psr\\Log\\LoggerInterface', $this->getLogger()); } /** * @dataProvider provideLevelsAndMessages */ public function testLogsAtAllLevels($level, $message) { $logger = $this->getLogger(); $logger->{$level}($message, array('user' => 'Bob')); $logger->log($level, $message, array('user' => 'Bob')); $expected = array($level . ' message of level ' . $level . ' with context: Bob', $level . ' message of level ' . $level . ' with context: Bob'); $this->assertEquals($expected, $this->getLogs()); } public function provideLevelsAndMessages() { return array(LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}')); } /** * @expectedException \Psr\Log\InvalidArgumentException */ public function testThrowsOnInvalidLevel() { $logger = $this->getLogger(); $logger->log('invalid level', 'Foo'); } public function testContextReplacement() { $logger = $this->getLogger(); $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); $expected = array('info {Message {nothing} Bob Bar a}'); $this->assertEquals($expected, $this->getLogs()); } public function testObjectCastToString() { if (\method_exists($this, 'createPartialMock')) { $dummy = $this->createPartialMock('VendorDuplicator\\Psr\\Log\\Test\\DummyTest', array('__toString')); } else { $dummy = $this->getMock('VendorDuplicator\\Psr\\Log\\Test\\DummyTest', array('__toString')); } $dummy->expects($this->once())->method('__toString')->will($this->returnValue('DUMMY')); $this->getLogger()->warning($dummy); $expected = array('warning DUMMY'); $this->assertEquals($expected, $this->getLogs()); } public function testContextCanContainAnything() { $closed = \fopen('php://memory', 'r'); \fclose($closed); $context = array('bool' => \true, 'null' => null, 'string' => 'Foo', 'int' => 0, 'float' => 0.5, 'nested' => array('with object' => new DummyTest()), 'object' => new \DateTime(), 'resource' => \fopen('php://memory', 'r'), 'closed' => $closed); $this->getLogger()->warning('Crazy context data', $context); $expected = array('warning Crazy context data'); $this->assertEquals($expected, $this->getLogs()); } public function testContextExceptionKeyCanBeExceptionOrOtherValues() { $logger = $this->getLogger(); $logger->warning('Random message', array('exception' => 'oops')); $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); $expected = array('warning Random message', 'critical Uncaught Exception!'); $this->assertEquals($expected, $this->getLogs()); } } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/Test/DummyTest.php000064400000000414147600374260022123 0ustar00 $level, 'message' => $message, 'context' => $context]; $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } public function hasRecord($record, $level) { if (\is_string($record)) { $record = ['message' => $record]; } return $this->hasRecordThatPasses(function ($rec) use($record) { if ($rec['message'] !== $record['message']) { return \false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return \false; } return \true; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use($message) { return \strpos($rec['message'], $message) !== \false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use($regex) { return \preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses(callable $predicate, $level) { if (!isset($this->recordsByLevel[$level])) { return \false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (\call_user_func($predicate, $rec, $i)) { return \true; } } return \false; } public function __call($method, $args) { if (\preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = \strtolower($matches[2]); if (\method_exists($this, $genericMethod)) { $args[] = $level; return \call_user_func_array([$this, $genericMethod], $args); } } throw new \BadMethodCallException('Call to undefined method ' . \get_class($this) . '::' . $method . '()'); } public function reset() { $this->records = []; $this->recordsByLevel = []; } } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/LoggerAwareTrait.php000064400000000642147600374260022457 0ustar00logger = $logger; } } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/AbstractLogger.php000064400000006052147600374260022160 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param mixed[] $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param mixed[] $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param mixed[] $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param mixed[] $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param mixed[] $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param mixed[] $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/NullLogger.php000064400000001345147600374260021327 0ustar00logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \VendorDuplicator\Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { // noop } } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/LoggerTrait.php000064400000006561147600374260021505 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \VendorDuplicator\Psr\Log\InvalidArgumentException */ public abstract function log($level, $message, array $context = array()); } addons/amazons3addon/vendor-prefixed/psr/log/Psr/Log/InvalidArgumentException.php000064400000000161147600374260024220 0ustar00 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5'); foreach ($_SERVER as $key => $value) { if (\substr($key, 0, 5) === 'HTTP_') { $key = \substr($key, 5); if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { $key = \str_replace(' ', '-', \ucwords(\strtolower(\str_replace('_', ' ', $key)))); $headers[$key] = $value; } } elseif (isset($copy_server[$key])) { $headers[$copy_server[$key]] = $value; } } if (!isset($headers['Authorization'])) { if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; } elseif (isset($_SERVER['PHP_AUTH_USER'])) { $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; $headers['Authorization'] = 'Basic ' . \base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; } } return $headers; } } amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php000064400000001632147600374260031077 0ustar00addons \true, 1 => \true, 2 => \true, 3 => \true, 4 => \true, 5 => \true, 6 => \true, 7 => \true, 8 => \true, 9 => \true, 10 => \true, 11 => \true, 12 => \true, 13 => \true, 14 => \true, 15 => \true, 16 => \true, 17 => \true, 18 => \true, 19 => \true, 20 => \true, 21 => \true, 22 => \true, 23 => \true, 24 => \true, 25 => \true, 26 => \true, 27 => \true, 28 => \true, 29 => \true, 30 => \true, 31 => \true, 32 => \true, 33 => \true, 34 => \true, 35 => \true, 36 => \true, 37 => \true, 38 => \true, 39 => \true, 40 => \true, 41 => \true, 42 => \true, 43 => \true, 44 => \true, 47 => \true, 58 => \true, 59 => \true, 60 => \true, 61 => \true, 62 => \true, 63 => \true, 64 => \true, 91 => \true, 92 => \true, 93 => \true, 94 => \true, 95 => \true, 96 => \true, 123 => \true, 124 => \true, 125 => \true, 126 => \true, 127 => \true, 8800 => \true, 8814 => \true, 8815 => \true); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php000064400000121633147600374260027206 0ustar00 \true, 889 => \true, 896 => \true, 897 => \true, 898 => \true, 899 => \true, 907 => \true, 909 => \true, 930 => \true, 1216 => \true, 1328 => \true, 1367 => \true, 1368 => \true, 1419 => \true, 1420 => \true, 1424 => \true, 1480 => \true, 1481 => \true, 1482 => \true, 1483 => \true, 1484 => \true, 1485 => \true, 1486 => \true, 1487 => \true, 1515 => \true, 1516 => \true, 1517 => \true, 1518 => \true, 1525 => \true, 1526 => \true, 1527 => \true, 1528 => \true, 1529 => \true, 1530 => \true, 1531 => \true, 1532 => \true, 1533 => \true, 1534 => \true, 1535 => \true, 1536 => \true, 1537 => \true, 1538 => \true, 1539 => \true, 1540 => \true, 1541 => \true, 1564 => \true, 1565 => \true, 1757 => \true, 1806 => \true, 1807 => \true, 1867 => \true, 1868 => \true, 1970 => \true, 1971 => \true, 1972 => \true, 1973 => \true, 1974 => \true, 1975 => \true, 1976 => \true, 1977 => \true, 1978 => \true, 1979 => \true, 1980 => \true, 1981 => \true, 1982 => \true, 1983 => \true, 2043 => \true, 2044 => \true, 2094 => \true, 2095 => \true, 2111 => \true, 2140 => \true, 2141 => \true, 2143 => \true, 2229 => \true, 2248 => \true, 2249 => \true, 2250 => \true, 2251 => \true, 2252 => \true, 2253 => \true, 2254 => \true, 2255 => \true, 2256 => \true, 2257 => \true, 2258 => \true, 2274 => \true, 2436 => \true, 2445 => \true, 2446 => \true, 2449 => \true, 2450 => \true, 2473 => \true, 2481 => \true, 2483 => \true, 2484 => \true, 2485 => \true, 2490 => \true, 2491 => \true, 2501 => \true, 2502 => \true, 2505 => \true, 2506 => \true, 2511 => \true, 2512 => \true, 2513 => \true, 2514 => \true, 2515 => \true, 2516 => \true, 2517 => \true, 2518 => \true, 2520 => \true, 2521 => \true, 2522 => \true, 2523 => \true, 2526 => \true, 2532 => \true, 2533 => \true, 2559 => \true, 2560 => \true, 2564 => \true, 2571 => \true, 2572 => \true, 2573 => \true, 2574 => \true, 2577 => \true, 2578 => \true, 2601 => \true, 2609 => \true, 2612 => \true, 2615 => \true, 2618 => \true, 2619 => \true, 2621 => \true, 2627 => \true, 2628 => \true, 2629 => \true, 2630 => \true, 2633 => \true, 2634 => \true, 2638 => \true, 2639 => \true, 2640 => \true, 2642 => \true, 2643 => \true, 2644 => \true, 2645 => \true, 2646 => \true, 2647 => \true, 2648 => \true, 2653 => \true, 2655 => \true, 2656 => \true, 2657 => \true, 2658 => \true, 2659 => \true, 2660 => \true, 2661 => \true, 2679 => \true, 2680 => \true, 2681 => \true, 2682 => \true, 2683 => \true, 2684 => \true, 2685 => \true, 2686 => \true, 2687 => \true, 2688 => \true, 2692 => \true, 2702 => \true, 2706 => \true, 2729 => \true, 2737 => \true, 2740 => \true, 2746 => \true, 2747 => \true, 2758 => \true, 2762 => \true, 2766 => \true, 2767 => \true, 2769 => \true, 2770 => \true, 2771 => \true, 2772 => \true, 2773 => \true, 2774 => \true, 2775 => \true, 2776 => \true, 2777 => \true, 2778 => \true, 2779 => \true, 2780 => \true, 2781 => \true, 2782 => \true, 2783 => \true, 2788 => \true, 2789 => \true, 2802 => \true, 2803 => \true, 2804 => \true, 2805 => \true, 2806 => \true, 2807 => \true, 2808 => \true, 2816 => \true, 2820 => \true, 2829 => \true, 2830 => \true, 2833 => \true, 2834 => \true, 2857 => \true, 2865 => \true, 2868 => \true, 2874 => \true, 2875 => \true, 2885 => \true, 2886 => \true, 2889 => \true, 2890 => \true, 2894 => \true, 2895 => \true, 2896 => \true, 2897 => \true, 2898 => \true, 2899 => \true, 2900 => \true, 2904 => \true, 2905 => \true, 2906 => \true, 2907 => \true, 2910 => \true, 2916 => \true, 2917 => \true, 2936 => \true, 2937 => \true, 2938 => \true, 2939 => \true, 2940 => \true, 2941 => \true, 2942 => \true, 2943 => \true, 2944 => \true, 2945 => \true, 2948 => \true, 2955 => \true, 2956 => \true, 2957 => \true, 2961 => \true, 2966 => \true, 2967 => \true, 2968 => \true, 2971 => \true, 2973 => \true, 2976 => \true, 2977 => \true, 2978 => \true, 2981 => \true, 2982 => \true, 2983 => \true, 2987 => \true, 2988 => \true, 2989 => \true, 3002 => \true, 3003 => \true, 3004 => \true, 3005 => \true, 3011 => \true, 3012 => \true, 3013 => \true, 3017 => \true, 3022 => \true, 3023 => \true, 3025 => \true, 3026 => \true, 3027 => \true, 3028 => \true, 3029 => \true, 3030 => \true, 3032 => \true, 3033 => \true, 3034 => \true, 3035 => \true, 3036 => \true, 3037 => \true, 3038 => \true, 3039 => \true, 3040 => \true, 3041 => \true, 3042 => \true, 3043 => \true, 3044 => \true, 3045 => \true, 3067 => \true, 3068 => \true, 3069 => \true, 3070 => \true, 3071 => \true, 3085 => \true, 3089 => \true, 3113 => \true, 3130 => \true, 3131 => \true, 3132 => \true, 3141 => \true, 3145 => \true, 3150 => \true, 3151 => \true, 3152 => \true, 3153 => \true, 3154 => \true, 3155 => \true, 3156 => \true, 3159 => \true, 3163 => \true, 3164 => \true, 3165 => \true, 3166 => \true, 3167 => \true, 3172 => \true, 3173 => \true, 3184 => \true, 3185 => \true, 3186 => \true, 3187 => \true, 3188 => \true, 3189 => \true, 3190 => \true, 3213 => \true, 3217 => \true, 3241 => \true, 3252 => \true, 3258 => \true, 3259 => \true, 3269 => \true, 3273 => \true, 3278 => \true, 3279 => \true, 3280 => \true, 3281 => \true, 3282 => \true, 3283 => \true, 3284 => \true, 3287 => \true, 3288 => \true, 3289 => \true, 3290 => \true, 3291 => \true, 3292 => \true, 3293 => \true, 3295 => \true, 3300 => \true, 3301 => \true, 3312 => \true, 3315 => \true, 3316 => \true, 3317 => \true, 3318 => \true, 3319 => \true, 3320 => \true, 3321 => \true, 3322 => \true, 3323 => \true, 3324 => \true, 3325 => \true, 3326 => \true, 3327 => \true, 3341 => \true, 3345 => \true, 3397 => \true, 3401 => \true, 3408 => \true, 3409 => \true, 3410 => \true, 3411 => \true, 3428 => \true, 3429 => \true, 3456 => \true, 3460 => \true, 3479 => \true, 3480 => \true, 3481 => \true, 3506 => \true, 3516 => \true, 3518 => \true, 3519 => \true, 3527 => \true, 3528 => \true, 3529 => \true, 3531 => \true, 3532 => \true, 3533 => \true, 3534 => \true, 3541 => \true, 3543 => \true, 3552 => \true, 3553 => \true, 3554 => \true, 3555 => \true, 3556 => \true, 3557 => \true, 3568 => \true, 3569 => \true, 3573 => \true, 3574 => \true, 3575 => \true, 3576 => \true, 3577 => \true, 3578 => \true, 3579 => \true, 3580 => \true, 3581 => \true, 3582 => \true, 3583 => \true, 3584 => \true, 3643 => \true, 3644 => \true, 3645 => \true, 3646 => \true, 3715 => \true, 3717 => \true, 3723 => \true, 3748 => \true, 3750 => \true, 3774 => \true, 3775 => \true, 3781 => \true, 3783 => \true, 3790 => \true, 3791 => \true, 3802 => \true, 3803 => \true, 3912 => \true, 3949 => \true, 3950 => \true, 3951 => \true, 3952 => \true, 3992 => \true, 4029 => \true, 4045 => \true, 4294 => \true, 4296 => \true, 4297 => \true, 4298 => \true, 4299 => \true, 4300 => \true, 4302 => \true, 4303 => \true, 4447 => \true, 4448 => \true, 4681 => \true, 4686 => \true, 4687 => \true, 4695 => \true, 4697 => \true, 4702 => \true, 4703 => \true, 4745 => \true, 4750 => \true, 4751 => \true, 4785 => \true, 4790 => \true, 4791 => \true, 4799 => \true, 4801 => \true, 4806 => \true, 4807 => \true, 4823 => \true, 4881 => \true, 4886 => \true, 4887 => \true, 4955 => \true, 4956 => \true, 4989 => \true, 4990 => \true, 4991 => \true, 5018 => \true, 5019 => \true, 5020 => \true, 5021 => \true, 5022 => \true, 5023 => \true, 5110 => \true, 5111 => \true, 5118 => \true, 5119 => \true, 5760 => \true, 5789 => \true, 5790 => \true, 5791 => \true, 5881 => \true, 5882 => \true, 5883 => \true, 5884 => \true, 5885 => \true, 5886 => \true, 5887 => \true, 5901 => \true, 5909 => \true, 5910 => \true, 5911 => \true, 5912 => \true, 5913 => \true, 5914 => \true, 5915 => \true, 5916 => \true, 5917 => \true, 5918 => \true, 5919 => \true, 5943 => \true, 5944 => \true, 5945 => \true, 5946 => \true, 5947 => \true, 5948 => \true, 5949 => \true, 5950 => \true, 5951 => \true, 5972 => \true, 5973 => \true, 5974 => \true, 5975 => \true, 5976 => \true, 5977 => \true, 5978 => \true, 5979 => \true, 5980 => \true, 5981 => \true, 5982 => \true, 5983 => \true, 5997 => \true, 6001 => \true, 6004 => \true, 6005 => \true, 6006 => \true, 6007 => \true, 6008 => \true, 6009 => \true, 6010 => \true, 6011 => \true, 6012 => \true, 6013 => \true, 6014 => \true, 6015 => \true, 6068 => \true, 6069 => \true, 6110 => \true, 6111 => \true, 6122 => \true, 6123 => \true, 6124 => \true, 6125 => \true, 6126 => \true, 6127 => \true, 6138 => \true, 6139 => \true, 6140 => \true, 6141 => \true, 6142 => \true, 6143 => \true, 6150 => \true, 6158 => \true, 6159 => \true, 6170 => \true, 6171 => \true, 6172 => \true, 6173 => \true, 6174 => \true, 6175 => \true, 6265 => \true, 6266 => \true, 6267 => \true, 6268 => \true, 6269 => \true, 6270 => \true, 6271 => \true, 6315 => \true, 6316 => \true, 6317 => \true, 6318 => \true, 6319 => \true, 6390 => \true, 6391 => \true, 6392 => \true, 6393 => \true, 6394 => \true, 6395 => \true, 6396 => \true, 6397 => \true, 6398 => \true, 6399 => \true, 6431 => \true, 6444 => \true, 6445 => \true, 6446 => \true, 6447 => \true, 6460 => \true, 6461 => \true, 6462 => \true, 6463 => \true, 6465 => \true, 6466 => \true, 6467 => \true, 6510 => \true, 6511 => \true, 6517 => \true, 6518 => \true, 6519 => \true, 6520 => \true, 6521 => \true, 6522 => \true, 6523 => \true, 6524 => \true, 6525 => \true, 6526 => \true, 6527 => \true, 6572 => \true, 6573 => \true, 6574 => \true, 6575 => \true, 6602 => \true, 6603 => \true, 6604 => \true, 6605 => \true, 6606 => \true, 6607 => \true, 6619 => \true, 6620 => \true, 6621 => \true, 6684 => \true, 6685 => \true, 6751 => \true, 6781 => \true, 6782 => \true, 6794 => \true, 6795 => \true, 6796 => \true, 6797 => \true, 6798 => \true, 6799 => \true, 6810 => \true, 6811 => \true, 6812 => \true, 6813 => \true, 6814 => \true, 6815 => \true, 6830 => \true, 6831 => \true, 6988 => \true, 6989 => \true, 6990 => \true, 6991 => \true, 7037 => \true, 7038 => \true, 7039 => \true, 7156 => \true, 7157 => \true, 7158 => \true, 7159 => \true, 7160 => \true, 7161 => \true, 7162 => \true, 7163 => \true, 7224 => \true, 7225 => \true, 7226 => \true, 7242 => \true, 7243 => \true, 7244 => \true, 7305 => \true, 7306 => \true, 7307 => \true, 7308 => \true, 7309 => \true, 7310 => \true, 7311 => \true, 7355 => \true, 7356 => \true, 7368 => \true, 7369 => \true, 7370 => \true, 7371 => \true, 7372 => \true, 7373 => \true, 7374 => \true, 7375 => \true, 7419 => \true, 7420 => \true, 7421 => \true, 7422 => \true, 7423 => \true, 7674 => \true, 7958 => \true, 7959 => \true, 7966 => \true, 7967 => \true, 8006 => \true, 8007 => \true, 8014 => \true, 8015 => \true, 8024 => \true, 8026 => \true, 8028 => \true, 8030 => \true, 8062 => \true, 8063 => \true, 8117 => \true, 8133 => \true, 8148 => \true, 8149 => \true, 8156 => \true, 8176 => \true, 8177 => \true, 8181 => \true, 8191 => \true, 8206 => \true, 8207 => \true, 8228 => \true, 8229 => \true, 8230 => \true, 8232 => \true, 8233 => \true, 8234 => \true, 8235 => \true, 8236 => \true, 8237 => \true, 8238 => \true, 8289 => \true, 8290 => \true, 8291 => \true, 8293 => \true, 8294 => \true, 8295 => \true, 8296 => \true, 8297 => \true, 8298 => \true, 8299 => \true, 8300 => \true, 8301 => \true, 8302 => \true, 8303 => \true, 8306 => \true, 8307 => \true, 8335 => \true, 8349 => \true, 8350 => \true, 8351 => \true, 8384 => \true, 8385 => \true, 8386 => \true, 8387 => \true, 8388 => \true, 8389 => \true, 8390 => \true, 8391 => \true, 8392 => \true, 8393 => \true, 8394 => \true, 8395 => \true, 8396 => \true, 8397 => \true, 8398 => \true, 8399 => \true, 8433 => \true, 8434 => \true, 8435 => \true, 8436 => \true, 8437 => \true, 8438 => \true, 8439 => \true, 8440 => \true, 8441 => \true, 8442 => \true, 8443 => \true, 8444 => \true, 8445 => \true, 8446 => \true, 8447 => \true, 8498 => \true, 8579 => \true, 8588 => \true, 8589 => \true, 8590 => \true, 8591 => \true, 9255 => \true, 9256 => \true, 9257 => \true, 9258 => \true, 9259 => \true, 9260 => \true, 9261 => \true, 9262 => \true, 9263 => \true, 9264 => \true, 9265 => \true, 9266 => \true, 9267 => \true, 9268 => \true, 9269 => \true, 9270 => \true, 9271 => \true, 9272 => \true, 9273 => \true, 9274 => \true, 9275 => \true, 9276 => \true, 9277 => \true, 9278 => \true, 9279 => \true, 9291 => \true, 9292 => \true, 9293 => \true, 9294 => \true, 9295 => \true, 9296 => \true, 9297 => \true, 9298 => \true, 9299 => \true, 9300 => \true, 9301 => \true, 9302 => \true, 9303 => \true, 9304 => \true, 9305 => \true, 9306 => \true, 9307 => \true, 9308 => \true, 9309 => \true, 9310 => \true, 9311 => \true, 9352 => \true, 9353 => \true, 9354 => \true, 9355 => \true, 9356 => \true, 9357 => \true, 9358 => \true, 9359 => \true, 9360 => \true, 9361 => \true, 9362 => \true, 9363 => \true, 9364 => \true, 9365 => \true, 9366 => \true, 9367 => \true, 9368 => \true, 9369 => \true, 9370 => \true, 9371 => \true, 11124 => \true, 11125 => \true, 11158 => \true, 11311 => \true, 11359 => \true, 11508 => \true, 11509 => \true, 11510 => \true, 11511 => \true, 11512 => \true, 11558 => \true, 11560 => \true, 11561 => \true, 11562 => \true, 11563 => \true, 11564 => \true, 11566 => \true, 11567 => \true, 11624 => \true, 11625 => \true, 11626 => \true, 11627 => \true, 11628 => \true, 11629 => \true, 11630 => \true, 11633 => \true, 11634 => \true, 11635 => \true, 11636 => \true, 11637 => \true, 11638 => \true, 11639 => \true, 11640 => \true, 11641 => \true, 11642 => \true, 11643 => \true, 11644 => \true, 11645 => \true, 11646 => \true, 11671 => \true, 11672 => \true, 11673 => \true, 11674 => \true, 11675 => \true, 11676 => \true, 11677 => \true, 11678 => \true, 11679 => \true, 11687 => \true, 11695 => \true, 11703 => \true, 11711 => \true, 11719 => \true, 11727 => \true, 11735 => \true, 11743 => \true, 11930 => \true, 12020 => \true, 12021 => \true, 12022 => \true, 12023 => \true, 12024 => \true, 12025 => \true, 12026 => \true, 12027 => \true, 12028 => \true, 12029 => \true, 12030 => \true, 12031 => \true, 12246 => \true, 12247 => \true, 12248 => \true, 12249 => \true, 12250 => \true, 12251 => \true, 12252 => \true, 12253 => \true, 12254 => \true, 12255 => \true, 12256 => \true, 12257 => \true, 12258 => \true, 12259 => \true, 12260 => \true, 12261 => \true, 12262 => \true, 12263 => \true, 12264 => \true, 12265 => \true, 12266 => \true, 12267 => \true, 12268 => \true, 12269 => \true, 12270 => \true, 12271 => \true, 12272 => \true, 12273 => \true, 12274 => \true, 12275 => \true, 12276 => \true, 12277 => \true, 12278 => \true, 12279 => \true, 12280 => \true, 12281 => \true, 12282 => \true, 12283 => \true, 12284 => \true, 12285 => \true, 12286 => \true, 12287 => \true, 12352 => \true, 12439 => \true, 12440 => \true, 12544 => \true, 12545 => \true, 12546 => \true, 12547 => \true, 12548 => \true, 12592 => \true, 12644 => \true, 12687 => \true, 12772 => \true, 12773 => \true, 12774 => \true, 12775 => \true, 12776 => \true, 12777 => \true, 12778 => \true, 12779 => \true, 12780 => \true, 12781 => \true, 12782 => \true, 12783 => \true, 12831 => \true, 13250 => \true, 13255 => \true, 13272 => \true, 40957 => \true, 40958 => \true, 40959 => \true, 42125 => \true, 42126 => \true, 42127 => \true, 42183 => \true, 42184 => \true, 42185 => \true, 42186 => \true, 42187 => \true, 42188 => \true, 42189 => \true, 42190 => \true, 42191 => \true, 42540 => \true, 42541 => \true, 42542 => \true, 42543 => \true, 42544 => \true, 42545 => \true, 42546 => \true, 42547 => \true, 42548 => \true, 42549 => \true, 42550 => \true, 42551 => \true, 42552 => \true, 42553 => \true, 42554 => \true, 42555 => \true, 42556 => \true, 42557 => \true, 42558 => \true, 42559 => \true, 42744 => \true, 42745 => \true, 42746 => \true, 42747 => \true, 42748 => \true, 42749 => \true, 42750 => \true, 42751 => \true, 42944 => \true, 42945 => \true, 43053 => \true, 43054 => \true, 43055 => \true, 43066 => \true, 43067 => \true, 43068 => \true, 43069 => \true, 43070 => \true, 43071 => \true, 43128 => \true, 43129 => \true, 43130 => \true, 43131 => \true, 43132 => \true, 43133 => \true, 43134 => \true, 43135 => \true, 43206 => \true, 43207 => \true, 43208 => \true, 43209 => \true, 43210 => \true, 43211 => \true, 43212 => \true, 43213 => \true, 43226 => \true, 43227 => \true, 43228 => \true, 43229 => \true, 43230 => \true, 43231 => \true, 43348 => \true, 43349 => \true, 43350 => \true, 43351 => \true, 43352 => \true, 43353 => \true, 43354 => \true, 43355 => \true, 43356 => \true, 43357 => \true, 43358 => \true, 43389 => \true, 43390 => \true, 43391 => \true, 43470 => \true, 43482 => \true, 43483 => \true, 43484 => \true, 43485 => \true, 43519 => \true, 43575 => \true, 43576 => \true, 43577 => \true, 43578 => \true, 43579 => \true, 43580 => \true, 43581 => \true, 43582 => \true, 43583 => \true, 43598 => \true, 43599 => \true, 43610 => \true, 43611 => \true, 43715 => \true, 43716 => \true, 43717 => \true, 43718 => \true, 43719 => \true, 43720 => \true, 43721 => \true, 43722 => \true, 43723 => \true, 43724 => \true, 43725 => \true, 43726 => \true, 43727 => \true, 43728 => \true, 43729 => \true, 43730 => \true, 43731 => \true, 43732 => \true, 43733 => \true, 43734 => \true, 43735 => \true, 43736 => \true, 43737 => \true, 43738 => \true, 43767 => \true, 43768 => \true, 43769 => \true, 43770 => \true, 43771 => \true, 43772 => \true, 43773 => \true, 43774 => \true, 43775 => \true, 43776 => \true, 43783 => \true, 43784 => \true, 43791 => \true, 43792 => \true, 43799 => \true, 43800 => \true, 43801 => \true, 43802 => \true, 43803 => \true, 43804 => \true, 43805 => \true, 43806 => \true, 43807 => \true, 43815 => \true, 43823 => \true, 43884 => \true, 43885 => \true, 43886 => \true, 43887 => \true, 44014 => \true, 44015 => \true, 44026 => \true, 44027 => \true, 44028 => \true, 44029 => \true, 44030 => \true, 44031 => \true, 55204 => \true, 55205 => \true, 55206 => \true, 55207 => \true, 55208 => \true, 55209 => \true, 55210 => \true, 55211 => \true, 55212 => \true, 55213 => \true, 55214 => \true, 55215 => \true, 55239 => \true, 55240 => \true, 55241 => \true, 55242 => \true, 55292 => \true, 55293 => \true, 55294 => \true, 55295 => \true, 64110 => \true, 64111 => \true, 64263 => \true, 64264 => \true, 64265 => \true, 64266 => \true, 64267 => \true, 64268 => \true, 64269 => \true, 64270 => \true, 64271 => \true, 64272 => \true, 64273 => \true, 64274 => \true, 64280 => \true, 64281 => \true, 64282 => \true, 64283 => \true, 64284 => \true, 64311 => \true, 64317 => \true, 64319 => \true, 64322 => \true, 64325 => \true, 64450 => \true, 64451 => \true, 64452 => \true, 64453 => \true, 64454 => \true, 64455 => \true, 64456 => \true, 64457 => \true, 64458 => \true, 64459 => \true, 64460 => \true, 64461 => \true, 64462 => \true, 64463 => \true, 64464 => \true, 64465 => \true, 64466 => \true, 64832 => \true, 64833 => \true, 64834 => \true, 64835 => \true, 64836 => \true, 64837 => \true, 64838 => \true, 64839 => \true, 64840 => \true, 64841 => \true, 64842 => \true, 64843 => \true, 64844 => \true, 64845 => \true, 64846 => \true, 64847 => \true, 64912 => \true, 64913 => \true, 64968 => \true, 64969 => \true, 64970 => \true, 64971 => \true, 64972 => \true, 64973 => \true, 64974 => \true, 64975 => \true, 65022 => \true, 65023 => \true, 65042 => \true, 65049 => \true, 65050 => \true, 65051 => \true, 65052 => \true, 65053 => \true, 65054 => \true, 65055 => \true, 65072 => \true, 65106 => \true, 65107 => \true, 65127 => \true, 65132 => \true, 65133 => \true, 65134 => \true, 65135 => \true, 65141 => \true, 65277 => \true, 65278 => \true, 65280 => \true, 65440 => \true, 65471 => \true, 65472 => \true, 65473 => \true, 65480 => \true, 65481 => \true, 65488 => \true, 65489 => \true, 65496 => \true, 65497 => \true, 65501 => \true, 65502 => \true, 65503 => \true, 65511 => \true, 65519 => \true, 65520 => \true, 65521 => \true, 65522 => \true, 65523 => \true, 65524 => \true, 65525 => \true, 65526 => \true, 65527 => \true, 65528 => \true, 65529 => \true, 65530 => \true, 65531 => \true, 65532 => \true, 65533 => \true, 65534 => \true, 65535 => \true, 65548 => \true, 65575 => \true, 65595 => \true, 65598 => \true, 65614 => \true, 65615 => \true, 65787 => \true, 65788 => \true, 65789 => \true, 65790 => \true, 65791 => \true, 65795 => \true, 65796 => \true, 65797 => \true, 65798 => \true, 65844 => \true, 65845 => \true, 65846 => \true, 65935 => \true, 65949 => \true, 65950 => \true, 65951 => \true, 66205 => \true, 66206 => \true, 66207 => \true, 66257 => \true, 66258 => \true, 66259 => \true, 66260 => \true, 66261 => \true, 66262 => \true, 66263 => \true, 66264 => \true, 66265 => \true, 66266 => \true, 66267 => \true, 66268 => \true, 66269 => \true, 66270 => \true, 66271 => \true, 66300 => \true, 66301 => \true, 66302 => \true, 66303 => \true, 66340 => \true, 66341 => \true, 66342 => \true, 66343 => \true, 66344 => \true, 66345 => \true, 66346 => \true, 66347 => \true, 66348 => \true, 66379 => \true, 66380 => \true, 66381 => \true, 66382 => \true, 66383 => \true, 66427 => \true, 66428 => \true, 66429 => \true, 66430 => \true, 66431 => \true, 66462 => \true, 66500 => \true, 66501 => \true, 66502 => \true, 66503 => \true, 66718 => \true, 66719 => \true, 66730 => \true, 66731 => \true, 66732 => \true, 66733 => \true, 66734 => \true, 66735 => \true, 66772 => \true, 66773 => \true, 66774 => \true, 66775 => \true, 66812 => \true, 66813 => \true, 66814 => \true, 66815 => \true, 66856 => \true, 66857 => \true, 66858 => \true, 66859 => \true, 66860 => \true, 66861 => \true, 66862 => \true, 66863 => \true, 66916 => \true, 66917 => \true, 66918 => \true, 66919 => \true, 66920 => \true, 66921 => \true, 66922 => \true, 66923 => \true, 66924 => \true, 66925 => \true, 66926 => \true, 67383 => \true, 67384 => \true, 67385 => \true, 67386 => \true, 67387 => \true, 67388 => \true, 67389 => \true, 67390 => \true, 67391 => \true, 67414 => \true, 67415 => \true, 67416 => \true, 67417 => \true, 67418 => \true, 67419 => \true, 67420 => \true, 67421 => \true, 67422 => \true, 67423 => \true, 67590 => \true, 67591 => \true, 67593 => \true, 67638 => \true, 67641 => \true, 67642 => \true, 67643 => \true, 67645 => \true, 67646 => \true, 67670 => \true, 67743 => \true, 67744 => \true, 67745 => \true, 67746 => \true, 67747 => \true, 67748 => \true, 67749 => \true, 67750 => \true, 67827 => \true, 67830 => \true, 67831 => \true, 67832 => \true, 67833 => \true, 67834 => \true, 67868 => \true, 67869 => \true, 67870 => \true, 67898 => \true, 67899 => \true, 67900 => \true, 67901 => \true, 67902 => \true, 68024 => \true, 68025 => \true, 68026 => \true, 68027 => \true, 68048 => \true, 68049 => \true, 68100 => \true, 68103 => \true, 68104 => \true, 68105 => \true, 68106 => \true, 68107 => \true, 68116 => \true, 68120 => \true, 68150 => \true, 68151 => \true, 68155 => \true, 68156 => \true, 68157 => \true, 68158 => \true, 68169 => \true, 68170 => \true, 68171 => \true, 68172 => \true, 68173 => \true, 68174 => \true, 68175 => \true, 68185 => \true, 68186 => \true, 68187 => \true, 68188 => \true, 68189 => \true, 68190 => \true, 68191 => \true, 68327 => \true, 68328 => \true, 68329 => \true, 68330 => \true, 68343 => \true, 68344 => \true, 68345 => \true, 68346 => \true, 68347 => \true, 68348 => \true, 68349 => \true, 68350 => \true, 68351 => \true, 68406 => \true, 68407 => \true, 68408 => \true, 68438 => \true, 68439 => \true, 68467 => \true, 68468 => \true, 68469 => \true, 68470 => \true, 68471 => \true, 68498 => \true, 68499 => \true, 68500 => \true, 68501 => \true, 68502 => \true, 68503 => \true, 68504 => \true, 68509 => \true, 68510 => \true, 68511 => \true, 68512 => \true, 68513 => \true, 68514 => \true, 68515 => \true, 68516 => \true, 68517 => \true, 68518 => \true, 68519 => \true, 68520 => \true, 68787 => \true, 68788 => \true, 68789 => \true, 68790 => \true, 68791 => \true, 68792 => \true, 68793 => \true, 68794 => \true, 68795 => \true, 68796 => \true, 68797 => \true, 68798 => \true, 68799 => \true, 68851 => \true, 68852 => \true, 68853 => \true, 68854 => \true, 68855 => \true, 68856 => \true, 68857 => \true, 68904 => \true, 68905 => \true, 68906 => \true, 68907 => \true, 68908 => \true, 68909 => \true, 68910 => \true, 68911 => \true, 69247 => \true, 69290 => \true, 69294 => \true, 69295 => \true, 69416 => \true, 69417 => \true, 69418 => \true, 69419 => \true, 69420 => \true, 69421 => \true, 69422 => \true, 69423 => \true, 69580 => \true, 69581 => \true, 69582 => \true, 69583 => \true, 69584 => \true, 69585 => \true, 69586 => \true, 69587 => \true, 69588 => \true, 69589 => \true, 69590 => \true, 69591 => \true, 69592 => \true, 69593 => \true, 69594 => \true, 69595 => \true, 69596 => \true, 69597 => \true, 69598 => \true, 69599 => \true, 69623 => \true, 69624 => \true, 69625 => \true, 69626 => \true, 69627 => \true, 69628 => \true, 69629 => \true, 69630 => \true, 69631 => \true, 69710 => \true, 69711 => \true, 69712 => \true, 69713 => \true, 69744 => \true, 69745 => \true, 69746 => \true, 69747 => \true, 69748 => \true, 69749 => \true, 69750 => \true, 69751 => \true, 69752 => \true, 69753 => \true, 69754 => \true, 69755 => \true, 69756 => \true, 69757 => \true, 69758 => \true, 69821 => \true, 69826 => \true, 69827 => \true, 69828 => \true, 69829 => \true, 69830 => \true, 69831 => \true, 69832 => \true, 69833 => \true, 69834 => \true, 69835 => \true, 69836 => \true, 69837 => \true, 69838 => \true, 69839 => \true, 69865 => \true, 69866 => \true, 69867 => \true, 69868 => \true, 69869 => \true, 69870 => \true, 69871 => \true, 69882 => \true, 69883 => \true, 69884 => \true, 69885 => \true, 69886 => \true, 69887 => \true, 69941 => \true, 69960 => \true, 69961 => \true, 69962 => \true, 69963 => \true, 69964 => \true, 69965 => \true, 69966 => \true, 69967 => \true, 70007 => \true, 70008 => \true, 70009 => \true, 70010 => \true, 70011 => \true, 70012 => \true, 70013 => \true, 70014 => \true, 70015 => \true, 70112 => \true, 70133 => \true, 70134 => \true, 70135 => \true, 70136 => \true, 70137 => \true, 70138 => \true, 70139 => \true, 70140 => \true, 70141 => \true, 70142 => \true, 70143 => \true, 70162 => \true, 70279 => \true, 70281 => \true, 70286 => \true, 70302 => \true, 70314 => \true, 70315 => \true, 70316 => \true, 70317 => \true, 70318 => \true, 70319 => \true, 70379 => \true, 70380 => \true, 70381 => \true, 70382 => \true, 70383 => \true, 70394 => \true, 70395 => \true, 70396 => \true, 70397 => \true, 70398 => \true, 70399 => \true, 70404 => \true, 70413 => \true, 70414 => \true, 70417 => \true, 70418 => \true, 70441 => \true, 70449 => \true, 70452 => \true, 70458 => \true, 70469 => \true, 70470 => \true, 70473 => \true, 70474 => \true, 70478 => \true, 70479 => \true, 70481 => \true, 70482 => \true, 70483 => \true, 70484 => \true, 70485 => \true, 70486 => \true, 70488 => \true, 70489 => \true, 70490 => \true, 70491 => \true, 70492 => \true, 70500 => \true, 70501 => \true, 70509 => \true, 70510 => \true, 70511 => \true, 70748 => \true, 70754 => \true, 70755 => \true, 70756 => \true, 70757 => \true, 70758 => \true, 70759 => \true, 70760 => \true, 70761 => \true, 70762 => \true, 70763 => \true, 70764 => \true, 70765 => \true, 70766 => \true, 70767 => \true, 70768 => \true, 70769 => \true, 70770 => \true, 70771 => \true, 70772 => \true, 70773 => \true, 70774 => \true, 70775 => \true, 70776 => \true, 70777 => \true, 70778 => \true, 70779 => \true, 70780 => \true, 70781 => \true, 70782 => \true, 70783 => \true, 70856 => \true, 70857 => \true, 70858 => \true, 70859 => \true, 70860 => \true, 70861 => \true, 70862 => \true, 70863 => \true, 71094 => \true, 71095 => \true, 71237 => \true, 71238 => \true, 71239 => \true, 71240 => \true, 71241 => \true, 71242 => \true, 71243 => \true, 71244 => \true, 71245 => \true, 71246 => \true, 71247 => \true, 71258 => \true, 71259 => \true, 71260 => \true, 71261 => \true, 71262 => \true, 71263 => \true, 71277 => \true, 71278 => \true, 71279 => \true, 71280 => \true, 71281 => \true, 71282 => \true, 71283 => \true, 71284 => \true, 71285 => \true, 71286 => \true, 71287 => \true, 71288 => \true, 71289 => \true, 71290 => \true, 71291 => \true, 71292 => \true, 71293 => \true, 71294 => \true, 71295 => \true, 71353 => \true, 71354 => \true, 71355 => \true, 71356 => \true, 71357 => \true, 71358 => \true, 71359 => \true, 71451 => \true, 71452 => \true, 71468 => \true, 71469 => \true, 71470 => \true, 71471 => \true, 71923 => \true, 71924 => \true, 71925 => \true, 71926 => \true, 71927 => \true, 71928 => \true, 71929 => \true, 71930 => \true, 71931 => \true, 71932 => \true, 71933 => \true, 71934 => \true, 71943 => \true, 71944 => \true, 71946 => \true, 71947 => \true, 71956 => \true, 71959 => \true, 71990 => \true, 71993 => \true, 71994 => \true, 72007 => \true, 72008 => \true, 72009 => \true, 72010 => \true, 72011 => \true, 72012 => \true, 72013 => \true, 72014 => \true, 72015 => \true, 72104 => \true, 72105 => \true, 72152 => \true, 72153 => \true, 72165 => \true, 72166 => \true, 72167 => \true, 72168 => \true, 72169 => \true, 72170 => \true, 72171 => \true, 72172 => \true, 72173 => \true, 72174 => \true, 72175 => \true, 72176 => \true, 72177 => \true, 72178 => \true, 72179 => \true, 72180 => \true, 72181 => \true, 72182 => \true, 72183 => \true, 72184 => \true, 72185 => \true, 72186 => \true, 72187 => \true, 72188 => \true, 72189 => \true, 72190 => \true, 72191 => \true, 72264 => \true, 72265 => \true, 72266 => \true, 72267 => \true, 72268 => \true, 72269 => \true, 72270 => \true, 72271 => \true, 72355 => \true, 72356 => \true, 72357 => \true, 72358 => \true, 72359 => \true, 72360 => \true, 72361 => \true, 72362 => \true, 72363 => \true, 72364 => \true, 72365 => \true, 72366 => \true, 72367 => \true, 72368 => \true, 72369 => \true, 72370 => \true, 72371 => \true, 72372 => \true, 72373 => \true, 72374 => \true, 72375 => \true, 72376 => \true, 72377 => \true, 72378 => \true, 72379 => \true, 72380 => \true, 72381 => \true, 72382 => \true, 72383 => \true, 72713 => \true, 72759 => \true, 72774 => \true, 72775 => \true, 72776 => \true, 72777 => \true, 72778 => \true, 72779 => \true, 72780 => \true, 72781 => \true, 72782 => \true, 72783 => \true, 72813 => \true, 72814 => \true, 72815 => \true, 72848 => \true, 72849 => \true, 72872 => \true, 72967 => \true, 72970 => \true, 73015 => \true, 73016 => \true, 73017 => \true, 73019 => \true, 73022 => \true, 73032 => \true, 73033 => \true, 73034 => \true, 73035 => \true, 73036 => \true, 73037 => \true, 73038 => \true, 73039 => \true, 73050 => \true, 73051 => \true, 73052 => \true, 73053 => \true, 73054 => \true, 73055 => \true, 73062 => \true, 73065 => \true, 73103 => \true, 73106 => \true, 73113 => \true, 73114 => \true, 73115 => \true, 73116 => \true, 73117 => \true, 73118 => \true, 73119 => \true, 73649 => \true, 73650 => \true, 73651 => \true, 73652 => \true, 73653 => \true, 73654 => \true, 73655 => \true, 73656 => \true, 73657 => \true, 73658 => \true, 73659 => \true, 73660 => \true, 73661 => \true, 73662 => \true, 73663 => \true, 73714 => \true, 73715 => \true, 73716 => \true, 73717 => \true, 73718 => \true, 73719 => \true, 73720 => \true, 73721 => \true, 73722 => \true, 73723 => \true, 73724 => \true, 73725 => \true, 73726 => \true, 74863 => \true, 74869 => \true, 74870 => \true, 74871 => \true, 74872 => \true, 74873 => \true, 74874 => \true, 74875 => \true, 74876 => \true, 74877 => \true, 74878 => \true, 74879 => \true, 78895 => \true, 78896 => \true, 78897 => \true, 78898 => \true, 78899 => \true, 78900 => \true, 78901 => \true, 78902 => \true, 78903 => \true, 78904 => \true, 92729 => \true, 92730 => \true, 92731 => \true, 92732 => \true, 92733 => \true, 92734 => \true, 92735 => \true, 92767 => \true, 92778 => \true, 92779 => \true, 92780 => \true, 92781 => \true, 92910 => \true, 92911 => \true, 92918 => \true, 92919 => \true, 92920 => \true, 92921 => \true, 92922 => \true, 92923 => \true, 92924 => \true, 92925 => \true, 92926 => \true, 92927 => \true, 92998 => \true, 92999 => \true, 93000 => \true, 93001 => \true, 93002 => \true, 93003 => \true, 93004 => \true, 93005 => \true, 93006 => \true, 93007 => \true, 93018 => \true, 93026 => \true, 93048 => \true, 93049 => \true, 93050 => \true, 93051 => \true, 93052 => \true, 94027 => \true, 94028 => \true, 94029 => \true, 94030 => \true, 94088 => \true, 94089 => \true, 94090 => \true, 94091 => \true, 94092 => \true, 94093 => \true, 94094 => \true, 94181 => \true, 94182 => \true, 94183 => \true, 94184 => \true, 94185 => \true, 94186 => \true, 94187 => \true, 94188 => \true, 94189 => \true, 94190 => \true, 94191 => \true, 94194 => \true, 94195 => \true, 94196 => \true, 94197 => \true, 94198 => \true, 94199 => \true, 94200 => \true, 94201 => \true, 94202 => \true, 94203 => \true, 94204 => \true, 94205 => \true, 94206 => \true, 94207 => \true, 100344 => \true, 100345 => \true, 100346 => \true, 100347 => \true, 100348 => \true, 100349 => \true, 100350 => \true, 100351 => \true, 110931 => \true, 110932 => \true, 110933 => \true, 110934 => \true, 110935 => \true, 110936 => \true, 110937 => \true, 110938 => \true, 110939 => \true, 110940 => \true, 110941 => \true, 110942 => \true, 110943 => \true, 110944 => \true, 110945 => \true, 110946 => \true, 110947 => \true, 110952 => \true, 110953 => \true, 110954 => \true, 110955 => \true, 110956 => \true, 110957 => \true, 110958 => \true, 110959 => \true, 113771 => \true, 113772 => \true, 113773 => \true, 113774 => \true, 113775 => \true, 113789 => \true, 113790 => \true, 113791 => \true, 113801 => \true, 113802 => \true, 113803 => \true, 113804 => \true, 113805 => \true, 113806 => \true, 113807 => \true, 113818 => \true, 113819 => \true, 119030 => \true, 119031 => \true, 119032 => \true, 119033 => \true, 119034 => \true, 119035 => \true, 119036 => \true, 119037 => \true, 119038 => \true, 119039 => \true, 119079 => \true, 119080 => \true, 119155 => \true, 119156 => \true, 119157 => \true, 119158 => \true, 119159 => \true, 119160 => \true, 119161 => \true, 119162 => \true, 119273 => \true, 119274 => \true, 119275 => \true, 119276 => \true, 119277 => \true, 119278 => \true, 119279 => \true, 119280 => \true, 119281 => \true, 119282 => \true, 119283 => \true, 119284 => \true, 119285 => \true, 119286 => \true, 119287 => \true, 119288 => \true, 119289 => \true, 119290 => \true, 119291 => \true, 119292 => \true, 119293 => \true, 119294 => \true, 119295 => \true, 119540 => \true, 119541 => \true, 119542 => \true, 119543 => \true, 119544 => \true, 119545 => \true, 119546 => \true, 119547 => \true, 119548 => \true, 119549 => \true, 119550 => \true, 119551 => \true, 119639 => \true, 119640 => \true, 119641 => \true, 119642 => \true, 119643 => \true, 119644 => \true, 119645 => \true, 119646 => \true, 119647 => \true, 119893 => \true, 119965 => \true, 119968 => \true, 119969 => \true, 119971 => \true, 119972 => \true, 119975 => \true, 119976 => \true, 119981 => \true, 119994 => \true, 119996 => \true, 120004 => \true, 120070 => \true, 120075 => \true, 120076 => \true, 120085 => \true, 120093 => \true, 120122 => \true, 120127 => \true, 120133 => \true, 120135 => \true, 120136 => \true, 120137 => \true, 120145 => \true, 120486 => \true, 120487 => \true, 120780 => \true, 120781 => \true, 121484 => \true, 121485 => \true, 121486 => \true, 121487 => \true, 121488 => \true, 121489 => \true, 121490 => \true, 121491 => \true, 121492 => \true, 121493 => \true, 121494 => \true, 121495 => \true, 121496 => \true, 121497 => \true, 121498 => \true, 121504 => \true, 122887 => \true, 122905 => \true, 122906 => \true, 122914 => \true, 122917 => \true, 123181 => \true, 123182 => \true, 123183 => \true, 123198 => \true, 123199 => \true, 123210 => \true, 123211 => \true, 123212 => \true, 123213 => \true, 123642 => \true, 123643 => \true, 123644 => \true, 123645 => \true, 123646 => \true, 125125 => \true, 125126 => \true, 125260 => \true, 125261 => \true, 125262 => \true, 125263 => \true, 125274 => \true, 125275 => \true, 125276 => \true, 125277 => \true, 126468 => \true, 126496 => \true, 126499 => \true, 126501 => \true, 126502 => \true, 126504 => \true, 126515 => \true, 126520 => \true, 126522 => \true, 126524 => \true, 126525 => \true, 126526 => \true, 126527 => \true, 126528 => \true, 126529 => \true, 126531 => \true, 126532 => \true, 126533 => \true, 126534 => \true, 126536 => \true, 126538 => \true, 126540 => \true, 126544 => \true, 126547 => \true, 126549 => \true, 126550 => \true, 126552 => \true, 126554 => \true, 126556 => \true, 126558 => \true, 126560 => \true, 126563 => \true, 126565 => \true, 126566 => \true, 126571 => \true, 126579 => \true, 126584 => \true, 126589 => \true, 126591 => \true, 126602 => \true, 126620 => \true, 126621 => \true, 126622 => \true, 126623 => \true, 126624 => \true, 126628 => \true, 126634 => \true, 127020 => \true, 127021 => \true, 127022 => \true, 127023 => \true, 127124 => \true, 127125 => \true, 127126 => \true, 127127 => \true, 127128 => \true, 127129 => \true, 127130 => \true, 127131 => \true, 127132 => \true, 127133 => \true, 127134 => \true, 127135 => \true, 127151 => \true, 127152 => \true, 127168 => \true, 127184 => \true, 127222 => \true, 127223 => \true, 127224 => \true, 127225 => \true, 127226 => \true, 127227 => \true, 127228 => \true, 127229 => \true, 127230 => \true, 127231 => \true, 127232 => \true, 127491 => \true, 127492 => \true, 127493 => \true, 127494 => \true, 127495 => \true, 127496 => \true, 127497 => \true, 127498 => \true, 127499 => \true, 127500 => \true, 127501 => \true, 127502 => \true, 127503 => \true, 127548 => \true, 127549 => \true, 127550 => \true, 127551 => \true, 127561 => \true, 127562 => \true, 127563 => \true, 127564 => \true, 127565 => \true, 127566 => \true, 127567 => \true, 127570 => \true, 127571 => \true, 127572 => \true, 127573 => \true, 127574 => \true, 127575 => \true, 127576 => \true, 127577 => \true, 127578 => \true, 127579 => \true, 127580 => \true, 127581 => \true, 127582 => \true, 127583 => \true, 128728 => \true, 128729 => \true, 128730 => \true, 128731 => \true, 128732 => \true, 128733 => \true, 128734 => \true, 128735 => \true, 128749 => \true, 128750 => \true, 128751 => \true, 128765 => \true, 128766 => \true, 128767 => \true, 128884 => \true, 128885 => \true, 128886 => \true, 128887 => \true, 128888 => \true, 128889 => \true, 128890 => \true, 128891 => \true, 128892 => \true, 128893 => \true, 128894 => \true, 128895 => \true, 128985 => \true, 128986 => \true, 128987 => \true, 128988 => \true, 128989 => \true, 128990 => \true, 128991 => \true, 129004 => \true, 129005 => \true, 129006 => \true, 129007 => \true, 129008 => \true, 129009 => \true, 129010 => \true, 129011 => \true, 129012 => \true, 129013 => \true, 129014 => \true, 129015 => \true, 129016 => \true, 129017 => \true, 129018 => \true, 129019 => \true, 129020 => \true, 129021 => \true, 129022 => \true, 129023 => \true, 129036 => \true, 129037 => \true, 129038 => \true, 129039 => \true, 129096 => \true, 129097 => \true, 129098 => \true, 129099 => \true, 129100 => \true, 129101 => \true, 129102 => \true, 129103 => \true, 129114 => \true, 129115 => \true, 129116 => \true, 129117 => \true, 129118 => \true, 129119 => \true, 129160 => \true, 129161 => \true, 129162 => \true, 129163 => \true, 129164 => \true, 129165 => \true, 129166 => \true, 129167 => \true, 129198 => \true, 129199 => \true, 129401 => \true, 129484 => \true, 129620 => \true, 129621 => \true, 129622 => \true, 129623 => \true, 129624 => \true, 129625 => \true, 129626 => \true, 129627 => \true, 129628 => \true, 129629 => \true, 129630 => \true, 129631 => \true, 129646 => \true, 129647 => \true, 129653 => \true, 129654 => \true, 129655 => \true, 129659 => \true, 129660 => \true, 129661 => \true, 129662 => \true, 129663 => \true, 129671 => \true, 129672 => \true, 129673 => \true, 129674 => \true, 129675 => \true, 129676 => \true, 129677 => \true, 129678 => \true, 129679 => \true, 129705 => \true, 129706 => \true, 129707 => \true, 129708 => \true, 129709 => \true, 129710 => \true, 129711 => \true, 129719 => \true, 129720 => \true, 129721 => \true, 129722 => \true, 129723 => \true, 129724 => \true, 129725 => \true, 129726 => \true, 129727 => \true, 129731 => \true, 129732 => \true, 129733 => \true, 129734 => \true, 129735 => \true, 129736 => \true, 129737 => \true, 129738 => \true, 129739 => \true, 129740 => \true, 129741 => \true, 129742 => \true, 129743 => \true, 129939 => \true, 131070 => \true, 131071 => \true, 177973 => \true, 177974 => \true, 177975 => \true, 177976 => \true, 177977 => \true, 177978 => \true, 177979 => \true, 177980 => \true, 177981 => \true, 177982 => \true, 177983 => \true, 178206 => \true, 178207 => \true, 183970 => \true, 183971 => \true, 183972 => \true, 183973 => \true, 183974 => \true, 183975 => \true, 183976 => \true, 183977 => \true, 183978 => \true, 183979 => \true, 183980 => \true, 183981 => \true, 183982 => \true, 183983 => \true, 194664 => \true, 194676 => \true, 194847 => \true, 194911 => \true, 195007 => \true, 196606 => \true, 196607 => \true, 262142 => \true, 262143 => \true, 327678 => \true, 327679 => \true, 393214 => \true, 393215 => \true, 458750 => \true, 458751 => \true, 524286 => \true, 524287 => \true, 589822 => \true, 589823 => \true, 655358 => \true, 655359 => \true, 720894 => \true, 720895 => \true, 786430 => \true, 786431 => \true, 851966 => \true, 851967 => \true, 917502 => \true, 917503 => \true, 917504 => \true, 917505 => \true, 917506 => \true, 917507 => \true, 917508 => \true, 917509 => \true, 917510 => \true, 917511 => \true, 917512 => \true, 917513 => \true, 917514 => \true, 917515 => \true, 917516 => \true, 917517 => \true, 917518 => \true, 917519 => \true, 917520 => \true, 917521 => \true, 917522 => \true, 917523 => \true, 917524 => \true, 917525 => \true, 917526 => \true, 917527 => \true, 917528 => \true, 917529 => \true, 917530 => \true, 917531 => \true, 917532 => \true, 917533 => \true, 917534 => \true, 917535 => \true, 983038 => \true, 983039 => \true, 1048574 => \true, 1048575 => \true, 1114110 => \true, 1114111 => \true); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/virama.php000064400000001364147600374260026334 0ustar00 9, 2509 => 9, 2637 => 9, 2765 => 9, 2893 => 9, 3021 => 9, 3149 => 9, 3277 => 9, 3387 => 9, 3388 => 9, 3405 => 9, 3530 => 9, 3642 => 9, 3770 => 9, 3972 => 9, 4153 => 9, 4154 => 9, 5908 => 9, 5940 => 9, 6098 => 9, 6752 => 9, 6980 => 9, 7082 => 9, 7083 => 9, 7154 => 9, 7155 => 9, 11647 => 9, 43014 => 9, 43052 => 9, 43204 => 9, 43347 => 9, 43456 => 9, 43766 => 9, 44013 => 9, 68159 => 9, 69702 => 9, 69759 => 9, 69817 => 9, 69939 => 9, 69940 => 9, 70080 => 9, 70197 => 9, 70378 => 9, 70477 => 9, 70722 => 9, 70850 => 9, 71103 => 9, 71231 => 9, 71350 => 9, 71467 => 9, 71737 => 9, 71997 => 9, 71998 => 9, 72160 => 9, 72244 => 9, 72263 => 9, 72345 => 9, 72767 => 9, 73028 => 9, 73029 => 9, 73111 => 9); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/mapped.php000064400000263110147600374260026322 0ustar00 'a', 66 => 'b', 67 => 'c', 68 => 'd', 69 => 'e', 70 => 'f', 71 => 'g', 72 => 'h', 73 => 'i', 74 => 'j', 75 => 'k', 76 => 'l', 77 => 'm', 78 => 'n', 79 => 'o', 80 => 'p', 81 => 'q', 82 => 'r', 83 => 's', 84 => 't', 85 => 'u', 86 => 'v', 87 => 'w', 88 => 'x', 89 => 'y', 90 => 'z', 170 => 'a', 178 => '2', 179 => '3', 181 => 'μ', 185 => '1', 186 => 'o', 188 => '1â„4', 189 => '1â„2', 190 => '3â„4', 192 => 'à', 193 => 'á', 194 => 'â', 195 => 'ã', 196 => 'ä', 197 => 'Ã¥', 198 => 'æ', 199 => 'ç', 200 => 'è', 201 => 'é', 202 => 'ê', 203 => 'ë', 204 => 'ì', 205 => 'í', 206 => 'î', 207 => 'ï', 208 => 'ð', 209 => 'ñ', 210 => 'ò', 211 => 'ó', 212 => 'ô', 213 => 'õ', 214 => 'ö', 216 => 'ø', 217 => 'ù', 218 => 'ú', 219 => 'û', 220 => 'ü', 221 => 'ý', 222 => 'þ', 256 => 'Ä', 258 => 'ă', 260 => 'Ä…', 262 => 'ć', 264 => 'ĉ', 266 => 'Ä‹', 268 => 'Ä', 270 => 'Ä', 272 => 'Ä‘', 274 => 'Ä“', 276 => 'Ä•', 278 => 'Ä—', 280 => 'Ä™', 282 => 'Ä›', 284 => 'Ä', 286 => 'ÄŸ', 288 => 'Ä¡', 290 => 'Ä£', 292 => 'Ä¥', 294 => 'ħ', 296 => 'Ä©', 298 => 'Ä«', 300 => 'Ä­', 302 => 'į', 304 => 'i̇', 306 => 'ij', 307 => 'ij', 308 => 'ĵ', 310 => 'Ä·', 313 => 'ĺ', 315 => 'ļ', 317 => 'ľ', 319 => 'l·', 320 => 'l·', 321 => 'Å‚', 323 => 'Å„', 325 => 'ņ', 327 => 'ň', 329 => 'ʼn', 330 => 'Å‹', 332 => 'Å', 334 => 'Å', 336 => 'Å‘', 338 => 'Å“', 340 => 'Å•', 342 => 'Å—', 344 => 'Å™', 346 => 'Å›', 348 => 'Å', 350 => 'ÅŸ', 352 => 'Å¡', 354 => 'Å£', 356 => 'Å¥', 358 => 'ŧ', 360 => 'Å©', 362 => 'Å«', 364 => 'Å­', 366 => 'ů', 368 => 'ű', 370 => 'ų', 372 => 'ŵ', 374 => 'Å·', 376 => 'ÿ', 377 => 'ź', 379 => 'ż', 381 => 'ž', 383 => 's', 385 => 'É“', 386 => 'ƃ', 388 => 'Æ…', 390 => 'É”', 391 => 'ƈ', 393 => 'É–', 394 => 'É—', 395 => 'ÆŒ', 398 => 'Ç', 399 => 'É™', 400 => 'É›', 401 => 'Æ’', 403 => 'É ', 404 => 'É£', 406 => 'É©', 407 => 'ɨ', 408 => 'Æ™', 412 => 'ɯ', 413 => 'ɲ', 415 => 'ɵ', 416 => 'Æ¡', 418 => 'Æ£', 420 => 'Æ¥', 422 => 'Ê€', 423 => 'ƨ', 425 => 'ʃ', 428 => 'Æ­', 430 => 'ʈ', 431 => 'Æ°', 433 => 'ÊŠ', 434 => 'Ê‹', 435 => 'Æ´', 437 => 'ƶ', 439 => 'Ê’', 440 => 'ƹ', 444 => 'ƽ', 452 => 'dž', 453 => 'dž', 454 => 'dž', 455 => 'lj', 456 => 'lj', 457 => 'lj', 458 => 'nj', 459 => 'nj', 460 => 'nj', 461 => 'ÇŽ', 463 => 'Ç', 465 => 'Ç’', 467 => 'Ç”', 469 => 'Ç–', 471 => 'ǘ', 473 => 'Çš', 475 => 'Çœ', 478 => 'ÇŸ', 480 => 'Ç¡', 482 => 'Ç£', 484 => 'Ç¥', 486 => 'ǧ', 488 => 'Ç©', 490 => 'Ç«', 492 => 'Ç­', 494 => 'ǯ', 497 => 'dz', 498 => 'dz', 499 => 'dz', 500 => 'ǵ', 502 => 'Æ•', 503 => 'Æ¿', 504 => 'ǹ', 506 => 'Ç»', 508 => 'ǽ', 510 => 'Ç¿', 512 => 'È', 514 => 'ȃ', 516 => 'È…', 518 => 'ȇ', 520 => 'ȉ', 522 => 'È‹', 524 => 'È', 526 => 'È', 528 => 'È‘', 530 => 'È“', 532 => 'È•', 534 => 'È—', 536 => 'È™', 538 => 'È›', 540 => 'È', 542 => 'ÈŸ', 544 => 'Æž', 546 => 'È£', 548 => 'È¥', 550 => 'ȧ', 552 => 'È©', 554 => 'È«', 556 => 'È­', 558 => 'ȯ', 560 => 'ȱ', 562 => 'ȳ', 570 => 'â±¥', 571 => 'ȼ', 573 => 'Æš', 574 => 'ⱦ', 577 => 'É‚', 579 => 'Æ€', 580 => 'ʉ', 581 => 'ÊŒ', 582 => 'ɇ', 584 => 'ɉ', 586 => 'É‹', 588 => 'É', 590 => 'É', 688 => 'h', 689 => 'ɦ', 690 => 'j', 691 => 'r', 692 => 'ɹ', 693 => 'É»', 694 => 'Ê', 695 => 'w', 696 => 'y', 736 => 'É£', 737 => 'l', 738 => 's', 739 => 'x', 740 => 'Ê•', 832 => 'Ì€', 833 => 'Ì', 835 => 'Ì“', 836 => '̈Ì', 837 => 'ι', 880 => 'ͱ', 882 => 'ͳ', 884 => 'ʹ', 886 => 'Í·', 895 => 'ϳ', 902 => 'ά', 903 => '·', 904 => 'έ', 905 => 'ή', 906 => 'ί', 908 => 'ÏŒ', 910 => 'Ï', 911 => 'ÏŽ', 913 => 'α', 914 => 'β', 915 => 'γ', 916 => 'δ', 917 => 'ε', 918 => 'ζ', 919 => 'η', 920 => 'θ', 921 => 'ι', 922 => 'κ', 923 => 'λ', 924 => 'μ', 925 => 'ν', 926 => 'ξ', 927 => 'ο', 928 => 'Ï€', 929 => 'Ï', 931 => 'σ', 932 => 'Ï„', 933 => 'Ï…', 934 => 'φ', 935 => 'χ', 936 => 'ψ', 937 => 'ω', 938 => 'ÏŠ', 939 => 'Ï‹', 975 => 'Ï—', 976 => 'β', 977 => 'θ', 978 => 'Ï…', 979 => 'Ï', 980 => 'Ï‹', 981 => 'φ', 982 => 'Ï€', 984 => 'Ï™', 986 => 'Ï›', 988 => 'Ï', 990 => 'ÏŸ', 992 => 'Ï¡', 994 => 'Ï£', 996 => 'Ï¥', 998 => 'ϧ', 1000 => 'Ï©', 1002 => 'Ï«', 1004 => 'Ï­', 1006 => 'ϯ', 1008 => 'κ', 1009 => 'Ï', 1010 => 'σ', 1012 => 'θ', 1013 => 'ε', 1015 => 'ϸ', 1017 => 'σ', 1018 => 'Ï»', 1021 => 'Í»', 1022 => 'ͼ', 1023 => 'ͽ', 1024 => 'Ñ', 1025 => 'Ñ‘', 1026 => 'Ñ’', 1027 => 'Ñ“', 1028 => 'Ñ”', 1029 => 'Ñ•', 1030 => 'Ñ–', 1031 => 'Ñ—', 1032 => 'ј', 1033 => 'Ñ™', 1034 => 'Ñš', 1035 => 'Ñ›', 1036 => 'Ñœ', 1037 => 'Ñ', 1038 => 'Ñž', 1039 => 'ÑŸ', 1040 => 'а', 1041 => 'б', 1042 => 'в', 1043 => 'г', 1044 => 'д', 1045 => 'е', 1046 => 'ж', 1047 => 'з', 1048 => 'и', 1049 => 'й', 1050 => 'к', 1051 => 'л', 1052 => 'м', 1053 => 'н', 1054 => 'о', 1055 => 'п', 1056 => 'Ñ€', 1057 => 'Ñ', 1058 => 'Ñ‚', 1059 => 'у', 1060 => 'Ñ„', 1061 => 'Ñ…', 1062 => 'ц', 1063 => 'ч', 1064 => 'ш', 1065 => 'щ', 1066 => 'ÑŠ', 1067 => 'Ñ‹', 1068 => 'ÑŒ', 1069 => 'Ñ', 1070 => 'ÑŽ', 1071 => 'Ñ', 1120 => 'Ñ¡', 1122 => 'Ñ£', 1124 => 'Ñ¥', 1126 => 'ѧ', 1128 => 'Ñ©', 1130 => 'Ñ«', 1132 => 'Ñ­', 1134 => 'ѯ', 1136 => 'ѱ', 1138 => 'ѳ', 1140 => 'ѵ', 1142 => 'Ñ·', 1144 => 'ѹ', 1146 => 'Ñ»', 1148 => 'ѽ', 1150 => 'Ñ¿', 1152 => 'Ò', 1162 => 'Ò‹', 1164 => 'Ò', 1166 => 'Ò', 1168 => 'Ò‘', 1170 => 'Ò“', 1172 => 'Ò•', 1174 => 'Ò—', 1176 => 'Ò™', 1178 => 'Ò›', 1180 => 'Ò', 1182 => 'ÒŸ', 1184 => 'Ò¡', 1186 => 'Ò£', 1188 => 'Ò¥', 1190 => 'Ò§', 1192 => 'Ò©', 1194 => 'Ò«', 1196 => 'Ò­', 1198 => 'Ò¯', 1200 => 'Ò±', 1202 => 'Ò³', 1204 => 'Òµ', 1206 => 'Ò·', 1208 => 'Ò¹', 1210 => 'Ò»', 1212 => 'Ò½', 1214 => 'Ò¿', 1217 => 'Ó‚', 1219 => 'Ó„', 1221 => 'Ó†', 1223 => 'Óˆ', 1225 => 'ÓŠ', 1227 => 'ÓŒ', 1229 => 'ÓŽ', 1232 => 'Ó‘', 1234 => 'Ó“', 1236 => 'Ó•', 1238 => 'Ó—', 1240 => 'Ó™', 1242 => 'Ó›', 1244 => 'Ó', 1246 => 'ÓŸ', 1248 => 'Ó¡', 1250 => 'Ó£', 1252 => 'Ó¥', 1254 => 'Ó§', 1256 => 'Ó©', 1258 => 'Ó«', 1260 => 'Ó­', 1262 => 'Ó¯', 1264 => 'Ó±', 1266 => 'Ó³', 1268 => 'Óµ', 1270 => 'Ó·', 1272 => 'Ó¹', 1274 => 'Ó»', 1276 => 'Ó½', 1278 => 'Ó¿', 1280 => 'Ô', 1282 => 'Ôƒ', 1284 => 'Ô…', 1286 => 'Ô‡', 1288 => 'Ô‰', 1290 => 'Ô‹', 1292 => 'Ô', 1294 => 'Ô', 1296 => 'Ô‘', 1298 => 'Ô“', 1300 => 'Ô•', 1302 => 'Ô—', 1304 => 'Ô™', 1306 => 'Ô›', 1308 => 'Ô', 1310 => 'ÔŸ', 1312 => 'Ô¡', 1314 => 'Ô£', 1316 => 'Ô¥', 1318 => 'Ô§', 1320 => 'Ô©', 1322 => 'Ô«', 1324 => 'Ô­', 1326 => 'Ô¯', 1329 => 'Õ¡', 1330 => 'Õ¢', 1331 => 'Õ£', 1332 => 'Õ¤', 1333 => 'Õ¥', 1334 => 'Õ¦', 1335 => 'Õ§', 1336 => 'Õ¨', 1337 => 'Õ©', 1338 => 'Õª', 1339 => 'Õ«', 1340 => 'Õ¬', 1341 => 'Õ­', 1342 => 'Õ®', 1343 => 'Õ¯', 1344 => 'Õ°', 1345 => 'Õ±', 1346 => 'Õ²', 1347 => 'Õ³', 1348 => 'Õ´', 1349 => 'Õµ', 1350 => 'Õ¶', 1351 => 'Õ·', 1352 => 'Õ¸', 1353 => 'Õ¹', 1354 => 'Õº', 1355 => 'Õ»', 1356 => 'Õ¼', 1357 => 'Õ½', 1358 => 'Õ¾', 1359 => 'Õ¿', 1360 => 'Ö€', 1361 => 'Ö', 1362 => 'Ö‚', 1363 => 'Öƒ', 1364 => 'Ö„', 1365 => 'Ö…', 1366 => 'Ö†', 1415 => 'Õ¥Ö‚', 1653 => 'اٴ', 1654 => 'وٴ', 1655 => 'Û‡Ù´', 1656 => 'يٴ', 2392 => 'क़', 2393 => 'ख़', 2394 => 'ग़', 2395 => 'ज़', 2396 => 'ड़', 2397 => 'ढ़', 2398 => 'फ़', 2399 => 'य़', 2524 => 'ড়', 2525 => 'ঢ়', 2527 => 'য়', 2611 => 'ਲ਼', 2614 => 'ਸ਼', 2649 => 'ਖ਼', 2650 => 'ਗ਼', 2651 => 'ਜ਼', 2654 => 'ਫ਼', 2908 => 'ଡ଼', 2909 => 'ଢ଼', 3635 => 'à¹à¸²', 3763 => 'à»àº²', 3804 => 'ຫນ', 3805 => 'ຫມ', 3852 => '་', 3907 => 'གྷ', 3917 => 'ཌྷ', 3922 => 'དྷ', 3927 => 'བྷ', 3932 => 'ཛྷ', 3945 => 'ཀྵ', 3955 => 'ཱི', 3957 => 'ཱུ', 3958 => 'ྲྀ', 3959 => 'ྲཱྀ', 3960 => 'ླྀ', 3961 => 'ླཱྀ', 3969 => 'ཱྀ', 3987 => 'ྒྷ', 3997 => 'ྜྷ', 4002 => 'ྡྷ', 4007 => 'ྦྷ', 4012 => 'ྫྷ', 4025 => 'à¾à¾µ', 4295 => 'â´§', 4301 => 'â´­', 4348 => 'ნ', 5112 => 'á°', 5113 => 'á±', 5114 => 'á²', 5115 => 'á³', 5116 => 'á´', 5117 => 'áµ', 7296 => 'в', 7297 => 'д', 7298 => 'о', 7299 => 'Ñ', 7300 => 'Ñ‚', 7301 => 'Ñ‚', 7302 => 'ÑŠ', 7303 => 'Ñ£', 7304 => 'ꙋ', 7312 => 'áƒ', 7313 => 'ბ', 7314 => 'გ', 7315 => 'დ', 7316 => 'ე', 7317 => 'ვ', 7318 => 'ზ', 7319 => 'თ', 7320 => 'ი', 7321 => 'კ', 7322 => 'ლ', 7323 => 'მ', 7324 => 'ნ', 7325 => 'áƒ', 7326 => 'პ', 7327 => 'ჟ', 7328 => 'რ', 7329 => 'ს', 7330 => 'ტ', 7331 => 'უ', 7332 => 'ფ', 7333 => 'ქ', 7334 => 'ღ', 7335 => 'ყ', 7336 => 'შ', 7337 => 'ჩ', 7338 => 'ც', 7339 => 'ძ', 7340 => 'წ', 7341 => 'ჭ', 7342 => 'ხ', 7343 => 'ჯ', 7344 => 'ჰ', 7345 => 'ჱ', 7346 => 'ჲ', 7347 => 'ჳ', 7348 => 'ჴ', 7349 => 'ჵ', 7350 => 'ჶ', 7351 => 'ჷ', 7352 => 'ჸ', 7353 => 'ჹ', 7354 => 'ჺ', 7357 => 'ჽ', 7358 => 'ჾ', 7359 => 'ჿ', 7468 => 'a', 7469 => 'æ', 7470 => 'b', 7472 => 'd', 7473 => 'e', 7474 => 'Ç', 7475 => 'g', 7476 => 'h', 7477 => 'i', 7478 => 'j', 7479 => 'k', 7480 => 'l', 7481 => 'm', 7482 => 'n', 7484 => 'o', 7485 => 'È£', 7486 => 'p', 7487 => 'r', 7488 => 't', 7489 => 'u', 7490 => 'w', 7491 => 'a', 7492 => 'É', 7493 => 'É‘', 7494 => 'á´‚', 7495 => 'b', 7496 => 'd', 7497 => 'e', 7498 => 'É™', 7499 => 'É›', 7500 => 'Éœ', 7501 => 'g', 7503 => 'k', 7504 => 'm', 7505 => 'Å‹', 7506 => 'o', 7507 => 'É”', 7508 => 'á´–', 7509 => 'á´—', 7510 => 'p', 7511 => 't', 7512 => 'u', 7513 => 'á´', 7514 => 'ɯ', 7515 => 'v', 7516 => 'á´¥', 7517 => 'β', 7518 => 'γ', 7519 => 'δ', 7520 => 'φ', 7521 => 'χ', 7522 => 'i', 7523 => 'r', 7524 => 'u', 7525 => 'v', 7526 => 'β', 7527 => 'γ', 7528 => 'Ï', 7529 => 'φ', 7530 => 'χ', 7544 => 'н', 7579 => 'É’', 7580 => 'c', 7581 => 'É•', 7582 => 'ð', 7583 => 'Éœ', 7584 => 'f', 7585 => 'ÉŸ', 7586 => 'É¡', 7587 => 'É¥', 7588 => 'ɨ', 7589 => 'É©', 7590 => 'ɪ', 7591 => 'áµ»', 7592 => 'Ê', 7593 => 'É­', 7594 => 'ᶅ', 7595 => 'ÊŸ', 7596 => 'ɱ', 7597 => 'É°', 7598 => 'ɲ', 7599 => 'ɳ', 7600 => 'É´', 7601 => 'ɵ', 7602 => 'ɸ', 7603 => 'Ê‚', 7604 => 'ʃ', 7605 => 'Æ«', 7606 => 'ʉ', 7607 => 'ÊŠ', 7608 => 'á´œ', 7609 => 'Ê‹', 7610 => 'ÊŒ', 7611 => 'z', 7612 => 'Ê', 7613 => 'Ê‘', 7614 => 'Ê’', 7615 => 'θ', 7680 => 'á¸', 7682 => 'ḃ', 7684 => 'ḅ', 7686 => 'ḇ', 7688 => 'ḉ', 7690 => 'ḋ', 7692 => 'á¸', 7694 => 'á¸', 7696 => 'ḑ', 7698 => 'ḓ', 7700 => 'ḕ', 7702 => 'ḗ', 7704 => 'ḙ', 7706 => 'ḛ', 7708 => 'á¸', 7710 => 'ḟ', 7712 => 'ḡ', 7714 => 'ḣ', 7716 => 'ḥ', 7718 => 'ḧ', 7720 => 'ḩ', 7722 => 'ḫ', 7724 => 'ḭ', 7726 => 'ḯ', 7728 => 'ḱ', 7730 => 'ḳ', 7732 => 'ḵ', 7734 => 'ḷ', 7736 => 'ḹ', 7738 => 'ḻ', 7740 => 'ḽ', 7742 => 'ḿ', 7744 => 'á¹', 7746 => 'ṃ', 7748 => 'á¹…', 7750 => 'ṇ', 7752 => 'ṉ', 7754 => 'ṋ', 7756 => 'á¹', 7758 => 'á¹', 7760 => 'ṑ', 7762 => 'ṓ', 7764 => 'ṕ', 7766 => 'á¹—', 7768 => 'á¹™', 7770 => 'á¹›', 7772 => 'á¹', 7774 => 'ṟ', 7776 => 'ṡ', 7778 => 'á¹£', 7780 => 'á¹¥', 7782 => 'ṧ', 7784 => 'ṩ', 7786 => 'ṫ', 7788 => 'á¹­', 7790 => 'ṯ', 7792 => 'á¹±', 7794 => 'á¹³', 7796 => 'á¹µ', 7798 => 'á¹·', 7800 => 'á¹¹', 7802 => 'á¹»', 7804 => 'á¹½', 7806 => 'ṿ', 7808 => 'áº', 7810 => 'ẃ', 7812 => 'ẅ', 7814 => 'ẇ', 7816 => 'ẉ', 7818 => 'ẋ', 7820 => 'áº', 7822 => 'áº', 7824 => 'ẑ', 7826 => 'ẓ', 7828 => 'ẕ', 7834 => 'aʾ', 7835 => 'ṡ', 7838 => 'ss', 7840 => 'ạ', 7842 => 'ả', 7844 => 'ấ', 7846 => 'ầ', 7848 => 'ẩ', 7850 => 'ẫ', 7852 => 'ậ', 7854 => 'ắ', 7856 => 'ằ', 7858 => 'ẳ', 7860 => 'ẵ', 7862 => 'ặ', 7864 => 'ẹ', 7866 => 'ẻ', 7868 => 'ẽ', 7870 => 'ế', 7872 => 'á»', 7874 => 'ể', 7876 => 'á»…', 7878 => 'ệ', 7880 => 'ỉ', 7882 => 'ị', 7884 => 'á»', 7886 => 'á»', 7888 => 'ố', 7890 => 'ồ', 7892 => 'ổ', 7894 => 'á»—', 7896 => 'á»™', 7898 => 'á»›', 7900 => 'á»', 7902 => 'ở', 7904 => 'ỡ', 7906 => 'ợ', 7908 => 'ụ', 7910 => 'ủ', 7912 => 'ứ', 7914 => 'ừ', 7916 => 'á»­', 7918 => 'ữ', 7920 => 'á»±', 7922 => 'ỳ', 7924 => 'ỵ', 7926 => 'á»·', 7928 => 'ỹ', 7930 => 'á»»', 7932 => 'ỽ', 7934 => 'ỿ', 7944 => 'á¼€', 7945 => 'á¼', 7946 => 'ἂ', 7947 => 'ἃ', 7948 => 'ἄ', 7949 => 'á¼…', 7950 => 'ἆ', 7951 => 'ἇ', 7960 => 'á¼', 7961 => 'ἑ', 7962 => 'á¼’', 7963 => 'ἓ', 7964 => 'á¼”', 7965 => 'ἕ', 7976 => 'á¼ ', 7977 => 'ἡ', 7978 => 'á¼¢', 7979 => 'á¼£', 7980 => 'ἤ', 7981 => 'á¼¥', 7982 => 'ἦ', 7983 => 'ἧ', 7992 => 'á¼°', 7993 => 'á¼±', 7994 => 'á¼²', 7995 => 'á¼³', 7996 => 'á¼´', 7997 => 'á¼µ', 7998 => 'ἶ', 7999 => 'á¼·', 8008 => 'á½€', 8009 => 'á½', 8010 => 'ὂ', 8011 => 'ὃ', 8012 => 'ὄ', 8013 => 'á½…', 8025 => 'ὑ', 8027 => 'ὓ', 8029 => 'ὕ', 8031 => 'á½—', 8040 => 'á½ ', 8041 => 'ὡ', 8042 => 'á½¢', 8043 => 'á½£', 8044 => 'ὤ', 8045 => 'á½¥', 8046 => 'ὦ', 8047 => 'ὧ', 8049 => 'ά', 8051 => 'έ', 8053 => 'ή', 8055 => 'ί', 8057 => 'ÏŒ', 8059 => 'Ï', 8061 => 'ÏŽ', 8064 => 'ἀι', 8065 => 'á¼Î¹', 8066 => 'ἂι', 8067 => 'ἃι', 8068 => 'ἄι', 8069 => 'ἅι', 8070 => 'ἆι', 8071 => 'ἇι', 8072 => 'ἀι', 8073 => 'á¼Î¹', 8074 => 'ἂι', 8075 => 'ἃι', 8076 => 'ἄι', 8077 => 'ἅι', 8078 => 'ἆι', 8079 => 'ἇι', 8080 => 'ἠι', 8081 => 'ἡι', 8082 => 'ἢι', 8083 => 'ἣι', 8084 => 'ἤι', 8085 => 'ἥι', 8086 => 'ἦι', 8087 => 'ἧι', 8088 => 'ἠι', 8089 => 'ἡι', 8090 => 'ἢι', 8091 => 'ἣι', 8092 => 'ἤι', 8093 => 'ἥι', 8094 => 'ἦι', 8095 => 'ἧι', 8096 => 'ὠι', 8097 => 'ὡι', 8098 => 'ὢι', 8099 => 'ὣι', 8100 => 'ὤι', 8101 => 'ὥι', 8102 => 'ὦι', 8103 => 'ὧι', 8104 => 'ὠι', 8105 => 'ὡι', 8106 => 'ὢι', 8107 => 'ὣι', 8108 => 'ὤι', 8109 => 'ὥι', 8110 => 'ὦι', 8111 => 'ὧι', 8114 => 'ὰι', 8115 => 'αι', 8116 => 'άι', 8119 => 'ᾶι', 8120 => 'á¾°', 8121 => 'á¾±', 8122 => 'á½°', 8123 => 'ά', 8124 => 'αι', 8126 => 'ι', 8130 => 'ὴι', 8131 => 'ηι', 8132 => 'ήι', 8135 => 'ῆι', 8136 => 'á½²', 8137 => 'έ', 8138 => 'á½´', 8139 => 'ή', 8140 => 'ηι', 8147 => 'Î', 8152 => 'á¿', 8153 => 'á¿‘', 8154 => 'ὶ', 8155 => 'ί', 8163 => 'ΰ', 8168 => 'á¿ ', 8169 => 'á¿¡', 8170 => 'ὺ', 8171 => 'Ï', 8172 => 'á¿¥', 8178 => 'ὼι', 8179 => 'ωι', 8180 => 'ώι', 8183 => 'ῶι', 8184 => 'ὸ', 8185 => 'ÏŒ', 8186 => 'á½¼', 8187 => 'ÏŽ', 8188 => 'ωι', 8209 => 'â€', 8243 => '′′', 8244 => '′′′', 8246 => '‵‵', 8247 => '‵‵‵', 8279 => '′′′′', 8304 => '0', 8305 => 'i', 8308 => '4', 8309 => '5', 8310 => '6', 8311 => '7', 8312 => '8', 8313 => '9', 8315 => '−', 8319 => 'n', 8320 => '0', 8321 => '1', 8322 => '2', 8323 => '3', 8324 => '4', 8325 => '5', 8326 => '6', 8327 => '7', 8328 => '8', 8329 => '9', 8331 => '−', 8336 => 'a', 8337 => 'e', 8338 => 'o', 8339 => 'x', 8340 => 'É™', 8341 => 'h', 8342 => 'k', 8343 => 'l', 8344 => 'm', 8345 => 'n', 8346 => 'p', 8347 => 's', 8348 => 't', 8360 => 'rs', 8450 => 'c', 8451 => '°c', 8455 => 'É›', 8457 => '°f', 8458 => 'g', 8459 => 'h', 8460 => 'h', 8461 => 'h', 8462 => 'h', 8463 => 'ħ', 8464 => 'i', 8465 => 'i', 8466 => 'l', 8467 => 'l', 8469 => 'n', 8470 => 'no', 8473 => 'p', 8474 => 'q', 8475 => 'r', 8476 => 'r', 8477 => 'r', 8480 => 'sm', 8481 => 'tel', 8482 => 'tm', 8484 => 'z', 8486 => 'ω', 8488 => 'z', 8490 => 'k', 8491 => 'Ã¥', 8492 => 'b', 8493 => 'c', 8495 => 'e', 8496 => 'e', 8497 => 'f', 8499 => 'm', 8500 => 'o', 8501 => '×', 8502 => 'ב', 8503 => '×’', 8504 => 'ד', 8505 => 'i', 8507 => 'fax', 8508 => 'Ï€', 8509 => 'γ', 8510 => 'γ', 8511 => 'Ï€', 8512 => '∑', 8517 => 'd', 8518 => 'd', 8519 => 'e', 8520 => 'i', 8521 => 'j', 8528 => '1â„7', 8529 => '1â„9', 8530 => '1â„10', 8531 => '1â„3', 8532 => '2â„3', 8533 => '1â„5', 8534 => '2â„5', 8535 => '3â„5', 8536 => '4â„5', 8537 => '1â„6', 8538 => '5â„6', 8539 => '1â„8', 8540 => '3â„8', 8541 => '5â„8', 8542 => '7â„8', 8543 => '1â„', 8544 => 'i', 8545 => 'ii', 8546 => 'iii', 8547 => 'iv', 8548 => 'v', 8549 => 'vi', 8550 => 'vii', 8551 => 'viii', 8552 => 'ix', 8553 => 'x', 8554 => 'xi', 8555 => 'xii', 8556 => 'l', 8557 => 'c', 8558 => 'd', 8559 => 'm', 8560 => 'i', 8561 => 'ii', 8562 => 'iii', 8563 => 'iv', 8564 => 'v', 8565 => 'vi', 8566 => 'vii', 8567 => 'viii', 8568 => 'ix', 8569 => 'x', 8570 => 'xi', 8571 => 'xii', 8572 => 'l', 8573 => 'c', 8574 => 'd', 8575 => 'm', 8585 => '0â„3', 8748 => '∫∫', 8749 => '∫∫∫', 8751 => '∮∮', 8752 => '∮∮∮', 9001 => '〈', 9002 => '〉', 9312 => '1', 9313 => '2', 9314 => '3', 9315 => '4', 9316 => '5', 9317 => '6', 9318 => '7', 9319 => '8', 9320 => '9', 9321 => '10', 9322 => '11', 9323 => '12', 9324 => '13', 9325 => '14', 9326 => '15', 9327 => '16', 9328 => '17', 9329 => '18', 9330 => '19', 9331 => '20', 9398 => 'a', 9399 => 'b', 9400 => 'c', 9401 => 'd', 9402 => 'e', 9403 => 'f', 9404 => 'g', 9405 => 'h', 9406 => 'i', 9407 => 'j', 9408 => 'k', 9409 => 'l', 9410 => 'm', 9411 => 'n', 9412 => 'o', 9413 => 'p', 9414 => 'q', 9415 => 'r', 9416 => 's', 9417 => 't', 9418 => 'u', 9419 => 'v', 9420 => 'w', 9421 => 'x', 9422 => 'y', 9423 => 'z', 9424 => 'a', 9425 => 'b', 9426 => 'c', 9427 => 'd', 9428 => 'e', 9429 => 'f', 9430 => 'g', 9431 => 'h', 9432 => 'i', 9433 => 'j', 9434 => 'k', 9435 => 'l', 9436 => 'm', 9437 => 'n', 9438 => 'o', 9439 => 'p', 9440 => 'q', 9441 => 'r', 9442 => 's', 9443 => 't', 9444 => 'u', 9445 => 'v', 9446 => 'w', 9447 => 'x', 9448 => 'y', 9449 => 'z', 9450 => '0', 10764 => '∫∫∫∫', 10972 => 'â«Ì¸', 11264 => 'â°°', 11265 => 'â°±', 11266 => 'â°²', 11267 => 'â°³', 11268 => 'â°´', 11269 => 'â°µ', 11270 => 'â°¶', 11271 => 'â°·', 11272 => 'â°¸', 11273 => 'â°¹', 11274 => 'â°º', 11275 => 'â°»', 11276 => 'â°¼', 11277 => 'â°½', 11278 => 'â°¾', 11279 => 'â°¿', 11280 => 'â±€', 11281 => 'â±', 11282 => 'ⱂ', 11283 => 'ⱃ', 11284 => 'ⱄ', 11285 => 'â±…', 11286 => 'ⱆ', 11287 => 'ⱇ', 11288 => 'ⱈ', 11289 => 'ⱉ', 11290 => 'ⱊ', 11291 => 'ⱋ', 11292 => 'ⱌ', 11293 => 'â±', 11294 => 'ⱎ', 11295 => 'â±', 11296 => 'â±', 11297 => 'ⱑ', 11298 => 'â±’', 11299 => 'ⱓ', 11300 => 'â±”', 11301 => 'ⱕ', 11302 => 'â±–', 11303 => 'â±—', 11304 => 'ⱘ', 11305 => 'â±™', 11306 => 'ⱚ', 11307 => 'â±›', 11308 => 'ⱜ', 11309 => 'â±', 11310 => 'ⱞ', 11360 => 'ⱡ', 11362 => 'É«', 11363 => 'áµ½', 11364 => 'ɽ', 11367 => 'ⱨ', 11369 => 'ⱪ', 11371 => 'ⱬ', 11373 => 'É‘', 11374 => 'ɱ', 11375 => 'É', 11376 => 'É’', 11378 => 'â±³', 11381 => 'ⱶ', 11388 => 'j', 11389 => 'v', 11390 => 'È¿', 11391 => 'É€', 11392 => 'â²', 11394 => 'ⲃ', 11396 => 'â²…', 11398 => 'ⲇ', 11400 => 'ⲉ', 11402 => 'ⲋ', 11404 => 'â²', 11406 => 'â²', 11408 => 'ⲑ', 11410 => 'ⲓ', 11412 => 'ⲕ', 11414 => 'â²—', 11416 => 'â²™', 11418 => 'â²›', 11420 => 'â²', 11422 => 'ⲟ', 11424 => 'ⲡ', 11426 => 'â²£', 11428 => 'â²¥', 11430 => 'ⲧ', 11432 => 'ⲩ', 11434 => 'ⲫ', 11436 => 'â²­', 11438 => 'ⲯ', 11440 => 'â²±', 11442 => 'â²³', 11444 => 'â²µ', 11446 => 'â²·', 11448 => 'â²¹', 11450 => 'â²»', 11452 => 'â²½', 11454 => 'ⲿ', 11456 => 'â³', 11458 => 'ⳃ', 11460 => 'â³…', 11462 => 'ⳇ', 11464 => 'ⳉ', 11466 => 'ⳋ', 11468 => 'â³', 11470 => 'â³', 11472 => 'ⳑ', 11474 => 'ⳓ', 11476 => 'ⳕ', 11478 => 'â³—', 11480 => 'â³™', 11482 => 'â³›', 11484 => 'â³', 11486 => 'ⳟ', 11488 => 'ⳡ', 11490 => 'â³£', 11499 => 'ⳬ', 11501 => 'â³®', 11506 => 'â³³', 11631 => 'ⵡ', 11935 => 'æ¯', 12019 => '龟', 12032 => '一', 12033 => '丨', 12034 => '丶', 12035 => '丿', 12036 => 'ä¹™', 12037 => '亅', 12038 => '二', 12039 => '亠', 12040 => '人', 12041 => 'å„¿', 12042 => 'å…¥', 12043 => 'å…«', 12044 => '冂', 12045 => '冖', 12046 => '冫', 12047 => '几', 12048 => '凵', 12049 => '刀', 12050 => '力', 12051 => '勹', 12052 => '匕', 12053 => '匚', 12054 => '匸', 12055 => 'å', 12056 => 'åœ', 12057 => 'å©', 12058 => '厂', 12059 => '厶', 12060 => 'åˆ', 12061 => 'å£', 12062 => 'å›—', 12063 => '土', 12064 => '士', 12065 => '夂', 12066 => '夊', 12067 => '夕', 12068 => '大', 12069 => '女', 12070 => 'å­', 12071 => '宀', 12072 => '寸', 12073 => 'å°', 12074 => 'å°¢', 12075 => 'å°¸', 12076 => 'å±®', 12077 => 'å±±', 12078 => 'å·›', 12079 => 'å·¥', 12080 => 'å·±', 12081 => 'å·¾', 12082 => 'å¹²', 12083 => '幺', 12084 => '广', 12085 => 'å»´', 12086 => '廾', 12087 => '弋', 12088 => '弓', 12089 => 'å½', 12090 => '彡', 12091 => 'å½³', 12092 => '心', 12093 => '戈', 12094 => '戶', 12095 => '手', 12096 => '支', 12097 => 'æ”´', 12098 => 'æ–‡', 12099 => 'æ–—', 12100 => 'æ–¤', 12101 => 'æ–¹', 12102 => 'æ— ', 12103 => 'æ—¥', 12104 => 'æ›°', 12105 => '月', 12106 => '木', 12107 => '欠', 12108 => 'æ­¢', 12109 => 'æ­¹', 12110 => '殳', 12111 => '毋', 12112 => '比', 12113 => '毛', 12114 => 'æ°', 12115 => 'æ°”', 12116 => 'æ°´', 12117 => 'ç«', 12118 => '爪', 12119 => '父', 12120 => '爻', 12121 => '爿', 12122 => '片', 12123 => '牙', 12124 => '牛', 12125 => '犬', 12126 => '玄', 12127 => '玉', 12128 => 'ç“œ', 12129 => '瓦', 12130 => '甘', 12131 => '生', 12132 => '用', 12133 => 'ç”°', 12134 => 'ç–‹', 12135 => 'ç–’', 12136 => '癶', 12137 => '白', 12138 => 'çš®', 12139 => 'çš¿', 12140 => 'ç›®', 12141 => '矛', 12142 => '矢', 12143 => '石', 12144 => '示', 12145 => '禸', 12146 => '禾', 12147 => 'ç©´', 12148 => 'ç«‹', 12149 => '竹', 12150 => 'ç±³', 12151 => '糸', 12152 => '缶', 12153 => '网', 12154 => '羊', 12155 => 'ç¾½', 12156 => 'è€', 12157 => '而', 12158 => '耒', 12159 => '耳', 12160 => 'è¿', 12161 => '肉', 12162 => '臣', 12163 => '自', 12164 => '至', 12165 => '臼', 12166 => '舌', 12167 => '舛', 12168 => '舟', 12169 => '艮', 12170 => '色', 12171 => '艸', 12172 => 'è™', 12173 => '虫', 12174 => 'è¡€', 12175 => 'è¡Œ', 12176 => 'è¡£', 12177 => '襾', 12178 => '見', 12179 => '角', 12180 => '言', 12181 => 'è°·', 12182 => '豆', 12183 => '豕', 12184 => '豸', 12185 => 'è²', 12186 => '赤', 12187 => 'èµ°', 12188 => '足', 12189 => '身', 12190 => '車', 12191 => 'è¾›', 12192 => 'è¾°', 12193 => 'è¾µ', 12194 => 'é‚‘', 12195 => 'é…‰', 12196 => '釆', 12197 => '里', 12198 => '金', 12199 => 'é•·', 12200 => 'é–€', 12201 => '阜', 12202 => '隶', 12203 => 'éš¹', 12204 => '雨', 12205 => 'é‘', 12206 => 'éž', 12207 => 'é¢', 12208 => 'é©', 12209 => '韋', 12210 => '韭', 12211 => '音', 12212 => 'é ', 12213 => '風', 12214 => '飛', 12215 => '食', 12216 => '首', 12217 => '香', 12218 => '馬', 12219 => '骨', 12220 => '高', 12221 => 'é«Ÿ', 12222 => '鬥', 12223 => '鬯', 12224 => '鬲', 12225 => '鬼', 12226 => 'é­š', 12227 => 'é³¥', 12228 => 'é¹µ', 12229 => '鹿', 12230 => '麥', 12231 => '麻', 12232 => '黃', 12233 => 'é»', 12234 => '黑', 12235 => '黹', 12236 => '黽', 12237 => '鼎', 12238 => '鼓', 12239 => 'é¼ ', 12240 => 'é¼»', 12241 => '齊', 12242 => 'é½’', 12243 => 'é¾', 12244 => '龜', 12245 => 'é¾ ', 12290 => '.', 12342 => '〒', 12344 => 'å', 12345 => 'å„', 12346 => 'å…', 12447 => 'より', 12543 => 'コト', 12593 => 'á„€', 12594 => 'á„', 12595 => 'ᆪ', 12596 => 'á„‚', 12597 => 'ᆬ', 12598 => 'ᆭ', 12599 => 'ᄃ', 12600 => 'á„„', 12601 => 'á„…', 12602 => 'ᆰ', 12603 => 'ᆱ', 12604 => 'ᆲ', 12605 => 'ᆳ', 12606 => 'ᆴ', 12607 => 'ᆵ', 12608 => 'á„š', 12609 => 'ᄆ', 12610 => 'ᄇ', 12611 => 'ᄈ', 12612 => 'á„¡', 12613 => 'ᄉ', 12614 => 'á„Š', 12615 => 'á„‹', 12616 => 'á„Œ', 12617 => 'á„', 12618 => 'á„Ž', 12619 => 'á„', 12620 => 'á„', 12621 => 'á„‘', 12622 => 'á„’', 12623 => 'á…¡', 12624 => 'á…¢', 12625 => 'á…£', 12626 => 'á…¤', 12627 => 'á…¥', 12628 => 'á…¦', 12629 => 'á…§', 12630 => 'á…¨', 12631 => 'á…©', 12632 => 'á…ª', 12633 => 'á…«', 12634 => 'á…¬', 12635 => 'á…­', 12636 => 'á…®', 12637 => 'á…¯', 12638 => 'á…°', 12639 => 'á…±', 12640 => 'á…²', 12641 => 'á…³', 12642 => 'á…´', 12643 => 'á…µ', 12645 => 'á„”', 12646 => 'á„•', 12647 => 'ᇇ', 12648 => 'ᇈ', 12649 => 'ᇌ', 12650 => 'ᇎ', 12651 => 'ᇓ', 12652 => 'ᇗ', 12653 => 'ᇙ', 12654 => 'á„œ', 12655 => 'á‡', 12656 => 'ᇟ', 12657 => 'á„', 12658 => 'á„ž', 12659 => 'á„ ', 12660 => 'á„¢', 12661 => 'á„£', 12662 => 'ᄧ', 12663 => 'á„©', 12664 => 'á„«', 12665 => 'ᄬ', 12666 => 'á„­', 12667 => 'á„®', 12668 => 'ᄯ', 12669 => 'ᄲ', 12670 => 'ᄶ', 12671 => 'á…€', 12672 => 'á…‡', 12673 => 'á…Œ', 12674 => 'ᇱ', 12675 => 'ᇲ', 12676 => 'á…—', 12677 => 'á…˜', 12678 => 'á…™', 12679 => 'ᆄ', 12680 => 'ᆅ', 12681 => 'ᆈ', 12682 => 'ᆑ', 12683 => 'ᆒ', 12684 => 'ᆔ', 12685 => 'ᆞ', 12686 => 'ᆡ', 12690 => '一', 12691 => '二', 12692 => '三', 12693 => 'å››', 12694 => '上', 12695 => '中', 12696 => '下', 12697 => '甲', 12698 => 'ä¹™', 12699 => '丙', 12700 => 'ä¸', 12701 => '天', 12702 => '地', 12703 => '人', 12868 => 'å•', 12869 => 'å¹¼', 12870 => 'æ–‡', 12871 => 'ç®', 12880 => 'pte', 12881 => '21', 12882 => '22', 12883 => '23', 12884 => '24', 12885 => '25', 12886 => '26', 12887 => '27', 12888 => '28', 12889 => '29', 12890 => '30', 12891 => '31', 12892 => '32', 12893 => '33', 12894 => '34', 12895 => '35', 12896 => 'á„€', 12897 => 'á„‚', 12898 => 'ᄃ', 12899 => 'á„…', 12900 => 'ᄆ', 12901 => 'ᄇ', 12902 => 'ᄉ', 12903 => 'á„‹', 12904 => 'á„Œ', 12905 => 'á„Ž', 12906 => 'á„', 12907 => 'á„', 12908 => 'á„‘', 12909 => 'á„’', 12910 => 'ê°€', 12911 => '나', 12912 => '다', 12913 => 'ë¼', 12914 => '마', 12915 => 'ë°”', 12916 => '사', 12917 => 'ì•„', 12918 => 'ìž', 12919 => 'ì°¨', 12920 => 'ì¹´', 12921 => '타', 12922 => '파', 12923 => '하', 12924 => '참고', 12925 => '주ì˜', 12926 => 'ìš°', 12928 => '一', 12929 => '二', 12930 => '三', 12931 => 'å››', 12932 => '五', 12933 => 'å…­', 12934 => '七', 12935 => 'å…«', 12936 => 'ä¹', 12937 => 'å', 12938 => '月', 12939 => 'ç«', 12940 => 'æ°´', 12941 => '木', 12942 => '金', 12943 => '土', 12944 => 'æ—¥', 12945 => 'æ ª', 12946 => '有', 12947 => '社', 12948 => 'å', 12949 => '特', 12950 => '財', 12951 => 'ç¥', 12952 => '労', 12953 => '秘', 12954 => 'ç”·', 12955 => '女', 12956 => 'é©', 12957 => '優', 12958 => 'å°', 12959 => '注', 12960 => 'é …', 12961 => '休', 12962 => '写', 12963 => 'æ­£', 12964 => '上', 12965 => '中', 12966 => '下', 12967 => 'å·¦', 12968 => 'å³', 12969 => '医', 12970 => 'å®—', 12971 => 'å­¦', 12972 => '監', 12973 => 'ä¼', 12974 => '資', 12975 => 'å”', 12976 => '夜', 12977 => '36', 12978 => '37', 12979 => '38', 12980 => '39', 12981 => '40', 12982 => '41', 12983 => '42', 12984 => '43', 12985 => '44', 12986 => '45', 12987 => '46', 12988 => '47', 12989 => '48', 12990 => '49', 12991 => '50', 12992 => '1月', 12993 => '2月', 12994 => '3月', 12995 => '4月', 12996 => '5月', 12997 => '6月', 12998 => '7月', 12999 => '8月', 13000 => '9月', 13001 => '10月', 13002 => '11月', 13003 => '12月', 13004 => 'hg', 13005 => 'erg', 13006 => 'ev', 13007 => 'ltd', 13008 => 'ã‚¢', 13009 => 'イ', 13010 => 'ウ', 13011 => 'エ', 13012 => 'オ', 13013 => 'ã‚«', 13014 => 'ã‚­', 13015 => 'ク', 13016 => 'ケ', 13017 => 'コ', 13018 => 'サ', 13019 => 'ã‚·', 13020 => 'ス', 13021 => 'ã‚»', 13022 => 'ソ', 13023 => 'ã‚¿', 13024 => 'ãƒ', 13025 => 'ツ', 13026 => 'テ', 13027 => 'ト', 13028 => 'ナ', 13029 => 'ニ', 13030 => 'ヌ', 13031 => 'ãƒ', 13032 => 'ノ', 13033 => 'ãƒ', 13034 => 'ヒ', 13035 => 'フ', 13036 => 'ヘ', 13037 => 'ホ', 13038 => 'マ', 13039 => 'ミ', 13040 => 'ム', 13041 => 'メ', 13042 => 'モ', 13043 => 'ヤ', 13044 => 'ユ', 13045 => 'ヨ', 13046 => 'ラ', 13047 => 'リ', 13048 => 'ル', 13049 => 'レ', 13050 => 'ロ', 13051 => 'ワ', 13052 => 'ヰ', 13053 => 'ヱ', 13054 => 'ヲ', 13055 => '令和', 13056 => 'アパート', 13057 => 'アルファ', 13058 => 'アンペア', 13059 => 'アール', 13060 => 'イニング', 13061 => 'インãƒ', 13062 => 'ウォン', 13063 => 'エスクード', 13064 => 'エーカー', 13065 => 'オンス', 13066 => 'オーム', 13067 => 'カイリ', 13068 => 'カラット', 13069 => 'カロリー', 13070 => 'ガロン', 13071 => 'ガンマ', 13072 => 'ギガ', 13073 => 'ギニー', 13074 => 'キュリー', 13075 => 'ギルダー', 13076 => 'キロ', 13077 => 'キログラム', 13078 => 'キロメートル', 13079 => 'キロワット', 13080 => 'グラム', 13081 => 'グラムトン', 13082 => 'クルゼイロ', 13083 => 'クローãƒ', 13084 => 'ケース', 13085 => 'コルナ', 13086 => 'コーãƒ', 13087 => 'サイクル', 13088 => 'サンãƒãƒ¼ãƒ ', 13089 => 'シリング', 13090 => 'センãƒ', 13091 => 'セント', 13092 => 'ダース', 13093 => 'デシ', 13094 => 'ドル', 13095 => 'トン', 13096 => 'ナノ', 13097 => 'ノット', 13098 => 'ãƒã‚¤ãƒ„', 13099 => 'パーセント', 13100 => 'パーツ', 13101 => 'ãƒãƒ¼ãƒ¬ãƒ«', 13102 => 'ピアストル', 13103 => 'ピクル', 13104 => 'ピコ', 13105 => 'ビル', 13106 => 'ファラッド', 13107 => 'フィート', 13108 => 'ブッシェル', 13109 => 'フラン', 13110 => 'ヘクタール', 13111 => 'ペソ', 13112 => 'ペニヒ', 13113 => 'ヘルツ', 13114 => 'ペンス', 13115 => 'ページ', 13116 => 'ベータ', 13117 => 'ãƒã‚¤ãƒ³ãƒˆ', 13118 => 'ボルト', 13119 => 'ホン', 13120 => 'ãƒãƒ³ãƒ‰', 13121 => 'ホール', 13122 => 'ホーン', 13123 => 'マイクロ', 13124 => 'マイル', 13125 => 'マッãƒ', 13126 => 'マルク', 13127 => 'マンション', 13128 => 'ミクロン', 13129 => 'ミリ', 13130 => 'ミリãƒãƒ¼ãƒ«', 13131 => 'メガ', 13132 => 'メガトン', 13133 => 'メートル', 13134 => 'ヤード', 13135 => 'ヤール', 13136 => 'ユアン', 13137 => 'リットル', 13138 => 'リラ', 13139 => 'ルピー', 13140 => 'ルーブル', 13141 => 'レム', 13142 => 'レントゲン', 13143 => 'ワット', 13144 => '0点', 13145 => '1点', 13146 => '2点', 13147 => '3点', 13148 => '4点', 13149 => '5点', 13150 => '6点', 13151 => '7点', 13152 => '8点', 13153 => '9点', 13154 => '10点', 13155 => '11点', 13156 => '12点', 13157 => '13点', 13158 => '14点', 13159 => '15点', 13160 => '16点', 13161 => '17点', 13162 => '18点', 13163 => '19点', 13164 => '20点', 13165 => '21点', 13166 => '22点', 13167 => '23点', 13168 => '24点', 13169 => 'hpa', 13170 => 'da', 13171 => 'au', 13172 => 'bar', 13173 => 'ov', 13174 => 'pc', 13175 => 'dm', 13176 => 'dm2', 13177 => 'dm3', 13178 => 'iu', 13179 => 'å¹³æˆ', 13180 => '昭和', 13181 => '大正', 13182 => '明治', 13183 => 'æ ªå¼ä¼šç¤¾', 13184 => 'pa', 13185 => 'na', 13186 => 'μa', 13187 => 'ma', 13188 => 'ka', 13189 => 'kb', 13190 => 'mb', 13191 => 'gb', 13192 => 'cal', 13193 => 'kcal', 13194 => 'pf', 13195 => 'nf', 13196 => 'μf', 13197 => 'μg', 13198 => 'mg', 13199 => 'kg', 13200 => 'hz', 13201 => 'khz', 13202 => 'mhz', 13203 => 'ghz', 13204 => 'thz', 13205 => 'μl', 13206 => 'ml', 13207 => 'dl', 13208 => 'kl', 13209 => 'fm', 13210 => 'nm', 13211 => 'μm', 13212 => 'mm', 13213 => 'cm', 13214 => 'km', 13215 => 'mm2', 13216 => 'cm2', 13217 => 'm2', 13218 => 'km2', 13219 => 'mm3', 13220 => 'cm3', 13221 => 'm3', 13222 => 'km3', 13223 => 'm∕s', 13224 => 'm∕s2', 13225 => 'pa', 13226 => 'kpa', 13227 => 'mpa', 13228 => 'gpa', 13229 => 'rad', 13230 => 'rad∕s', 13231 => 'rad∕s2', 13232 => 'ps', 13233 => 'ns', 13234 => 'μs', 13235 => 'ms', 13236 => 'pv', 13237 => 'nv', 13238 => 'μv', 13239 => 'mv', 13240 => 'kv', 13241 => 'mv', 13242 => 'pw', 13243 => 'nw', 13244 => 'μw', 13245 => 'mw', 13246 => 'kw', 13247 => 'mw', 13248 => 'kω', 13249 => 'mω', 13251 => 'bq', 13252 => 'cc', 13253 => 'cd', 13254 => 'c∕kg', 13256 => 'db', 13257 => 'gy', 13258 => 'ha', 13259 => 'hp', 13260 => 'in', 13261 => 'kk', 13262 => 'km', 13263 => 'kt', 13264 => 'lm', 13265 => 'ln', 13266 => 'log', 13267 => 'lx', 13268 => 'mb', 13269 => 'mil', 13270 => 'mol', 13271 => 'ph', 13273 => 'ppm', 13274 => 'pr', 13275 => 'sr', 13276 => 'sv', 13277 => 'wb', 13278 => 'v∕m', 13279 => 'a∕m', 13280 => '1æ—¥', 13281 => '2æ—¥', 13282 => '3æ—¥', 13283 => '4æ—¥', 13284 => '5æ—¥', 13285 => '6æ—¥', 13286 => '7æ—¥', 13287 => '8æ—¥', 13288 => '9æ—¥', 13289 => '10æ—¥', 13290 => '11æ—¥', 13291 => '12æ—¥', 13292 => '13æ—¥', 13293 => '14æ—¥', 13294 => '15æ—¥', 13295 => '16æ—¥', 13296 => '17æ—¥', 13297 => '18æ—¥', 13298 => '19æ—¥', 13299 => '20æ—¥', 13300 => '21æ—¥', 13301 => '22æ—¥', 13302 => '23æ—¥', 13303 => '24æ—¥', 13304 => '25æ—¥', 13305 => '26æ—¥', 13306 => '27æ—¥', 13307 => '28æ—¥', 13308 => '29æ—¥', 13309 => '30æ—¥', 13310 => '31æ—¥', 13311 => 'gal', 42560 => 'ê™', 42562 => 'ꙃ', 42564 => 'ê™…', 42566 => 'ꙇ', 42568 => 'ꙉ', 42570 => 'ꙋ', 42572 => 'ê™', 42574 => 'ê™', 42576 => 'ꙑ', 42578 => 'ꙓ', 42580 => 'ꙕ', 42582 => 'ê™—', 42584 => 'ê™™', 42586 => 'ê™›', 42588 => 'ê™', 42590 => 'ꙟ', 42592 => 'ꙡ', 42594 => 'ꙣ', 42596 => 'ꙥ', 42598 => 'ꙧ', 42600 => 'ꙩ', 42602 => 'ꙫ', 42604 => 'ê™­', 42624 => 'êš', 42626 => 'ꚃ', 42628 => 'êš…', 42630 => 'ꚇ', 42632 => 'ꚉ', 42634 => 'êš‹', 42636 => 'êš', 42638 => 'êš', 42640 => 'êš‘', 42642 => 'êš“', 42644 => 'êš•', 42646 => 'êš—', 42648 => 'êš™', 42650 => 'êš›', 42652 => 'ÑŠ', 42653 => 'ÑŒ', 42786 => 'ꜣ', 42788 => 'ꜥ', 42790 => 'ꜧ', 42792 => 'ꜩ', 42794 => 'ꜫ', 42796 => 'ꜭ', 42798 => 'ꜯ', 42802 => 'ꜳ', 42804 => 'ꜵ', 42806 => 'ꜷ', 42808 => 'ꜹ', 42810 => 'ꜻ', 42812 => 'ꜽ', 42814 => 'ꜿ', 42816 => 'ê', 42818 => 'êƒ', 42820 => 'ê…', 42822 => 'ê‡', 42824 => 'ê‰', 42826 => 'ê‹', 42828 => 'ê', 42830 => 'ê', 42832 => 'ê‘', 42834 => 'ê“', 42836 => 'ê•', 42838 => 'ê—', 42840 => 'ê™', 42842 => 'ê›', 42844 => 'ê', 42846 => 'êŸ', 42848 => 'ê¡', 42850 => 'ê£', 42852 => 'ê¥', 42854 => 'ê§', 42856 => 'ê©', 42858 => 'ê«', 42860 => 'ê­', 42862 => 'ê¯', 42864 => 'ê¯', 42873 => 'êº', 42875 => 'ê¼', 42877 => 'áµ¹', 42878 => 'ê¿', 42880 => 'êž', 42882 => 'ꞃ', 42884 => 'êž…', 42886 => 'ꞇ', 42891 => 'ꞌ', 42893 => 'É¥', 42896 => 'êž‘', 42898 => 'êž“', 42902 => 'êž—', 42904 => 'êž™', 42906 => 'êž›', 42908 => 'êž', 42910 => 'ꞟ', 42912 => 'êž¡', 42914 => 'ꞣ', 42916 => 'ꞥ', 42918 => 'ꞧ', 42920 => 'êž©', 42922 => 'ɦ', 42923 => 'Éœ', 42924 => 'É¡', 42925 => 'ɬ', 42926 => 'ɪ', 42928 => 'Êž', 42929 => 'ʇ', 42930 => 'Ê', 42931 => 'ê­“', 42932 => 'êžµ', 42934 => 'êž·', 42936 => 'êž¹', 42938 => 'êž»', 42940 => 'êž½', 42942 => 'êž¿', 42946 => 'ꟃ', 42948 => 'êž”', 42949 => 'Ê‚', 42950 => 'ᶎ', 42951 => 'ꟈ', 42953 => 'ꟊ', 42997 => 'ꟶ', 43000 => 'ħ', 43001 => 'Å“', 43868 => 'ꜧ', 43869 => 'ꬷ', 43870 => 'É«', 43871 => 'ê­’', 43881 => 'Ê', 43888 => 'Ꭰ', 43889 => 'Ꭱ', 43890 => 'Ꭲ', 43891 => 'Ꭳ', 43892 => 'Ꭴ', 43893 => 'Ꭵ', 43894 => 'Ꭶ', 43895 => 'Ꭷ', 43896 => 'Ꭸ', 43897 => 'Ꭹ', 43898 => 'Ꭺ', 43899 => 'Ꭻ', 43900 => 'Ꭼ', 43901 => 'Ꭽ', 43902 => 'Ꭾ', 43903 => 'Ꭿ', 43904 => 'Ꮀ', 43905 => 'Ꮁ', 43906 => 'Ꮂ', 43907 => 'Ꮃ', 43908 => 'Ꮄ', 43909 => 'Ꮅ', 43910 => 'Ꮆ', 43911 => 'Ꮇ', 43912 => 'Ꮈ', 43913 => 'Ꮉ', 43914 => 'Ꮊ', 43915 => 'Ꮋ', 43916 => 'Ꮌ', 43917 => 'Ꮍ', 43918 => 'Ꮎ', 43919 => 'Ꮏ', 43920 => 'á€', 43921 => 'á', 43922 => 'á‚', 43923 => 'áƒ', 43924 => 'á„', 43925 => 'á…', 43926 => 'á†', 43927 => 'á‡', 43928 => 'áˆ', 43929 => 'á‰', 43930 => 'áŠ', 43931 => 'á‹', 43932 => 'áŒ', 43933 => 'á', 43934 => 'áŽ', 43935 => 'á', 43936 => 'á', 43937 => 'á‘', 43938 => 'á’', 43939 => 'á“', 43940 => 'á”', 43941 => 'á•', 43942 => 'á–', 43943 => 'á—', 43944 => 'á˜', 43945 => 'á™', 43946 => 'áš', 43947 => 'á›', 43948 => 'áœ', 43949 => 'á', 43950 => 'áž', 43951 => 'áŸ', 43952 => 'á ', 43953 => 'á¡', 43954 => 'á¢', 43955 => 'á£', 43956 => 'á¤', 43957 => 'á¥', 43958 => 'á¦', 43959 => 'á§', 43960 => 'á¨', 43961 => 'á©', 43962 => 'áª', 43963 => 'á«', 43964 => 'á¬', 43965 => 'á­', 43966 => 'á®', 43967 => 'á¯', 63744 => '豈', 63745 => 'æ›´', 63746 => '車', 63747 => '賈', 63748 => '滑', 63749 => '串', 63750 => 'å¥', 63751 => '龜', 63752 => '龜', 63753 => '契', 63754 => '金', 63755 => 'å–‡', 63756 => '奈', 63757 => '懶', 63758 => '癩', 63759 => 'ç¾…', 63760 => '蘿', 63761 => '螺', 63762 => '裸', 63763 => 'é‚', 63764 => '樂', 63765 => 'æ´›', 63766 => '烙', 63767 => 'çž', 63768 => 'è½', 63769 => 'é…ª', 63770 => '駱', 63771 => '亂', 63772 => 'åµ', 63773 => '欄', 63774 => '爛', 63775 => '蘭', 63776 => '鸞', 63777 => 'åµ', 63778 => 'æ¿«', 63779 => 'è—', 63780 => '襤', 63781 => '拉', 63782 => '臘', 63783 => 'è Ÿ', 63784 => '廊', 63785 => '朗', 63786 => '浪', 63787 => '狼', 63788 => '郎', 63789 => '來', 63790 => '冷', 63791 => 'å‹ž', 63792 => 'æ“„', 63793 => 'æ«“', 63794 => 'çˆ', 63795 => '盧', 63796 => 'è€', 63797 => '蘆', 63798 => '虜', 63799 => 'è·¯', 63800 => '露', 63801 => 'é­¯', 63802 => 'é·º', 63803 => '碌', 63804 => '祿', 63805 => '綠', 63806 => 'è‰', 63807 => '錄', 63808 => '鹿', 63809 => 'è«–', 63810 => '壟', 63811 => '弄', 63812 => 'ç± ', 63813 => 'è¾', 63814 => '牢', 63815 => '磊', 63816 => '賂', 63817 => 'é›·', 63818 => '壘', 63819 => 'å±¢', 63820 => '樓', 63821 => 'æ·š', 63822 => 'æ¼', 63823 => 'ç´¯', 63824 => '縷', 63825 => '陋', 63826 => 'å‹’', 63827 => 'è‚‹', 63828 => '凜', 63829 => '凌', 63830 => '稜', 63831 => '綾', 63832 => 'è±', 63833 => '陵', 63834 => '讀', 63835 => 'æ‹', 63836 => '樂', 63837 => '諾', 63838 => '丹', 63839 => '寧', 63840 => '怒', 63841 => '率', 63842 => 'ç•°', 63843 => '北', 63844 => '磻', 63845 => '便', 63846 => '復', 63847 => 'ä¸', 63848 => '泌', 63849 => '數', 63850 => 'ç´¢', 63851 => 'åƒ', 63852 => 'å¡ž', 63853 => 'çœ', 63854 => '葉', 63855 => '說', 63856 => '殺', 63857 => 'è¾°', 63858 => '沈', 63859 => '拾', 63860 => 'è‹¥', 63861 => '掠', 63862 => 'ç•¥', 63863 => '亮', 63864 => 'å…©', 63865 => '凉', 63866 => 'æ¢', 63867 => '糧', 63868 => '良', 63869 => 'è«’', 63870 => 'é‡', 63871 => '勵', 63872 => 'å‘‚', 63873 => '女', 63874 => '廬', 63875 => 'æ—…', 63876 => '濾', 63877 => '礪', 63878 => 'é–­', 63879 => '驪', 63880 => '麗', 63881 => '黎', 63882 => '力', 63883 => '曆', 63884 => 'æ­·', 63885 => 'è½¢', 63886 => 'å¹´', 63887 => 'æ†', 63888 => '戀', 63889 => 'æ’š', 63890 => 'æ¼£', 63891 => 'ç…‰', 63892 => 'ç’‰', 63893 => '秊', 63894 => 'ç·´', 63895 => 'è¯', 63896 => '輦', 63897 => 'è“®', 63898 => '連', 63899 => 'éŠ', 63900 => '列', 63901 => '劣', 63902 => 'å’½', 63903 => '烈', 63904 => '裂', 63905 => '說', 63906 => '廉', 63907 => '念', 63908 => 'æ»', 63909 => 'æ®®', 63910 => 'ç°¾', 63911 => 'çµ', 63912 => '令', 63913 => '囹', 63914 => '寧', 63915 => '嶺', 63916 => '怜', 63917 => '玲', 63918 => 'ç‘©', 63919 => '羚', 63920 => 'è†', 63921 => '鈴', 63922 => '零', 63923 => 'éˆ', 63924 => 'é ˜', 63925 => '例', 63926 => '禮', 63927 => '醴', 63928 => '隸', 63929 => '惡', 63930 => '了', 63931 => '僚', 63932 => '寮', 63933 => 'å°¿', 63934 => 'æ–™', 63935 => '樂', 63936 => '燎', 63937 => '療', 63938 => '蓼', 63939 => 'é¼', 63940 => 'é¾', 63941 => '暈', 63942 => '阮', 63943 => '劉', 63944 => 'æ»', 63945 => '柳', 63946 => 'æµ', 63947 => '溜', 63948 => 'ç‰', 63949 => 'ç•™', 63950 => 'ç¡«', 63951 => 'ç´', 63952 => 'é¡ž', 63953 => 'å…­', 63954 => '戮', 63955 => '陸', 63956 => '倫', 63957 => 'å´™', 63958 => 'æ·ª', 63959 => '輪', 63960 => '律', 63961 => 'æ…„', 63962 => 'æ —', 63963 => '率', 63964 => '隆', 63965 => '利', 63966 => 'å', 63967 => 'å±¥', 63968 => '易', 63969 => 'æŽ', 63970 => '梨', 63971 => 'æ³¥', 63972 => 'ç†', 63973 => 'ç—¢', 63974 => 'ç½¹', 63975 => 'è£', 63976 => '裡', 63977 => '里', 63978 => '離', 63979 => '匿', 63980 => '溺', 63981 => 'å', 63982 => 'ç‡', 63983 => 'ç’˜', 63984 => 'è—º', 63985 => '隣', 63986 => 'é±—', 63987 => '麟', 63988 => 'æž—', 63989 => 'æ·‹', 63990 => '臨', 63991 => 'ç«‹', 63992 => '笠', 63993 => 'ç²’', 63994 => 'ç‹€', 63995 => 'ç‚™', 63996 => 'è­˜', 63997 => '什', 63998 => '茶', 63999 => '刺', 64000 => '切', 64001 => '度', 64002 => 'æ‹“', 64003 => 'ç³–', 64004 => 'å®…', 64005 => 'æ´ž', 64006 => 'æš´', 64007 => 'è¼»', 64008 => 'è¡Œ', 64009 => 'é™', 64010 => '見', 64011 => '廓', 64012 => 'å…€', 64013 => 'å—€', 64016 => 'å¡š', 64018 => 'æ™´', 64021 => '凞', 64022 => '猪', 64023 => '益', 64024 => '礼', 64025 => '神', 64026 => '祥', 64027 => 'ç¦', 64028 => 'é–', 64029 => 'ç²¾', 64030 => 'ç¾½', 64032 => '蘒', 64034 => '諸', 64037 => '逸', 64038 => '都', 64042 => '飯', 64043 => '飼', 64044 => '館', 64045 => '鶴', 64046 => '郞', 64047 => 'éš·', 64048 => 'ä¾®', 64049 => '僧', 64050 => 'å…', 64051 => '勉', 64052 => '勤', 64053 => 'å‘', 64054 => 'å–', 64055 => '嘆', 64056 => '器', 64057 => 'å¡€', 64058 => '墨', 64059 => '層', 64060 => 'å±®', 64061 => 'æ‚”', 64062 => 'æ…¨', 64063 => '憎', 64064 => '懲', 64065 => 'æ•', 64066 => 'æ—¢', 64067 => 'æš‘', 64068 => '梅', 64069 => 'æµ·', 64070 => '渚', 64071 => 'æ¼¢', 64072 => 'ç…®', 64073 => '爫', 64074 => 'ç¢', 64075 => '碑', 64076 => '社', 64077 => '祉', 64078 => '祈', 64079 => 'ç¥', 64080 => '祖', 64081 => 'ç¥', 64082 => 'ç¦', 64083 => '禎', 64084 => 'ç©€', 64085 => 'çª', 64086 => '節', 64087 => 'ç·´', 64088 => '縉', 64089 => 'ç¹', 64090 => 'ç½²', 64091 => '者', 64092 => '臭', 64093 => '艹', 64094 => '艹', 64095 => 'è‘—', 64096 => 'è¤', 64097 => '視', 64098 => 'è¬', 64099 => '謹', 64100 => '賓', 64101 => 'è´ˆ', 64102 => '辶', 64103 => '逸', 64104 => '難', 64105 => '響', 64106 => 'é »', 64107 => 'æµ', 64108 => '𤋮', 64109 => '舘', 64112 => '並', 64113 => '况', 64114 => 'å…¨', 64115 => 'ä¾€', 64116 => 'å……', 64117 => '冀', 64118 => '勇', 64119 => '勺', 64120 => 'å–', 64121 => 'å••', 64122 => 'å–™', 64123 => 'å—¢', 64124 => 'å¡š', 64125 => '墳', 64126 => '奄', 64127 => '奔', 64128 => 'å©¢', 64129 => '嬨', 64130 => 'å»’', 64131 => 'å»™', 64132 => '彩', 64133 => 'å¾­', 64134 => '惘', 64135 => 'æ…Ž', 64136 => '愈', 64137 => '憎', 64138 => 'æ… ', 64139 => '懲', 64140 => '戴', 64141 => 'æ„', 64142 => 'æœ', 64143 => 'æ‘’', 64144 => 'æ•–', 64145 => 'æ™´', 64146 => '朗', 64147 => '望', 64148 => 'æ–', 64149 => 'æ­¹', 64150 => '殺', 64151 => 'æµ', 64152 => 'æ»›', 64153 => '滋', 64154 => 'æ¼¢', 64155 => '瀞', 64156 => 'ç…®', 64157 => '瞧', 64158 => '爵', 64159 => '犯', 64160 => '猪', 64161 => '瑱', 64162 => '甆', 64163 => 'ç”»', 64164 => 'ç˜', 64165 => '瘟', 64166 => '益', 64167 => 'ç››', 64168 => 'ç›´', 64169 => 'çŠ', 64170 => 'ç€', 64171 => '磌', 64172 => '窱', 64173 => '節', 64174 => 'ç±»', 64175 => 'çµ›', 64176 => 'ç·´', 64177 => 'ç¼¾', 64178 => '者', 64179 => 'è’', 64180 => 'è¯', 64181 => 'è¹', 64182 => 'è¥', 64183 => '覆', 64184 => '視', 64185 => '調', 64186 => '諸', 64187 => 'è«‹', 64188 => 'è¬', 64189 => '諾', 64190 => 'è«­', 64191 => '謹', 64192 => '變', 64193 => 'è´ˆ', 64194 => '輸', 64195 => 'é²', 64196 => '醙', 64197 => '鉶', 64198 => '陼', 64199 => '難', 64200 => 'é–', 64201 => '韛', 64202 => '響', 64203 => 'é ‹', 64204 => 'é »', 64205 => '鬒', 64206 => '龜', 64207 => '𢡊', 64208 => '𢡄', 64209 => 'ð£•', 64210 => 'ã®', 64211 => '䀘', 64212 => '䀹', 64213 => '𥉉', 64214 => 'ð¥³', 64215 => '𧻓', 64216 => '齃', 64217 => '龎', 64256 => 'ff', 64257 => 'fi', 64258 => 'fl', 64259 => 'ffi', 64260 => 'ffl', 64261 => 'st', 64262 => 'st', 64275 => 'Õ´Õ¶', 64276 => 'Õ´Õ¥', 64277 => 'Õ´Õ«', 64278 => 'Õ¾Õ¶', 64279 => 'Õ´Õ­', 64285 => '×™Ö´', 64287 => 'ײַ', 64288 => '×¢', 64289 => '×', 64290 => 'ד', 64291 => '×”', 64292 => '×›', 64293 => 'ל', 64294 => '×', 64295 => 'ר', 64296 => 'ת', 64298 => 'ש×', 64299 => 'שׂ', 64300 => 'שּ×', 64301 => 'שּׂ', 64302 => '×Ö·', 64303 => '×Ö¸', 64304 => '×Ö¼', 64305 => 'בּ', 64306 => '×’Ö¼', 64307 => 'דּ', 64308 => '×”Ö¼', 64309 => 'וּ', 64310 => '×–Ö¼', 64312 => 'טּ', 64313 => '×™Ö¼', 64314 => 'ךּ', 64315 => '×›Ö¼', 64316 => 'לּ', 64318 => 'מּ', 64320 => '× Ö¼', 64321 => 'סּ', 64323 => '×£Ö¼', 64324 => 'פּ', 64326 => 'צּ', 64327 => 'קּ', 64328 => 'רּ', 64329 => 'שּ', 64330 => 'תּ', 64331 => 'וֹ', 64332 => 'בֿ', 64333 => '×›Ö¿', 64334 => 'פֿ', 64335 => '×ל', 64336 => 'Ù±', 64337 => 'Ù±', 64338 => 'Ù»', 64339 => 'Ù»', 64340 => 'Ù»', 64341 => 'Ù»', 64342 => 'Ù¾', 64343 => 'Ù¾', 64344 => 'Ù¾', 64345 => 'Ù¾', 64346 => 'Ú€', 64347 => 'Ú€', 64348 => 'Ú€', 64349 => 'Ú€', 64350 => 'Ùº', 64351 => 'Ùº', 64352 => 'Ùº', 64353 => 'Ùº', 64354 => 'Ù¿', 64355 => 'Ù¿', 64356 => 'Ù¿', 64357 => 'Ù¿', 64358 => 'Ù¹', 64359 => 'Ù¹', 64360 => 'Ù¹', 64361 => 'Ù¹', 64362 => 'Ú¤', 64363 => 'Ú¤', 64364 => 'Ú¤', 64365 => 'Ú¤', 64366 => 'Ú¦', 64367 => 'Ú¦', 64368 => 'Ú¦', 64369 => 'Ú¦', 64370 => 'Ú„', 64371 => 'Ú„', 64372 => 'Ú„', 64373 => 'Ú„', 64374 => 'Úƒ', 64375 => 'Úƒ', 64376 => 'Úƒ', 64377 => 'Úƒ', 64378 => 'Ú†', 64379 => 'Ú†', 64380 => 'Ú†', 64381 => 'Ú†', 64382 => 'Ú‡', 64383 => 'Ú‡', 64384 => 'Ú‡', 64385 => 'Ú‡', 64386 => 'Ú', 64387 => 'Ú', 64388 => 'ÚŒ', 64389 => 'ÚŒ', 64390 => 'ÚŽ', 64391 => 'ÚŽ', 64392 => 'Úˆ', 64393 => 'Úˆ', 64394 => 'Ú˜', 64395 => 'Ú˜', 64396 => 'Ú‘', 64397 => 'Ú‘', 64398 => 'Ú©', 64399 => 'Ú©', 64400 => 'Ú©', 64401 => 'Ú©', 64402 => 'Ú¯', 64403 => 'Ú¯', 64404 => 'Ú¯', 64405 => 'Ú¯', 64406 => 'Ú³', 64407 => 'Ú³', 64408 => 'Ú³', 64409 => 'Ú³', 64410 => 'Ú±', 64411 => 'Ú±', 64412 => 'Ú±', 64413 => 'Ú±', 64414 => 'Úº', 64415 => 'Úº', 64416 => 'Ú»', 64417 => 'Ú»', 64418 => 'Ú»', 64419 => 'Ú»', 64420 => 'Û€', 64421 => 'Û€', 64422 => 'Û', 64423 => 'Û', 64424 => 'Û', 64425 => 'Û', 64426 => 'Ú¾', 64427 => 'Ú¾', 64428 => 'Ú¾', 64429 => 'Ú¾', 64430 => 'Û’', 64431 => 'Û’', 64432 => 'Û“', 64433 => 'Û“', 64467 => 'Ú­', 64468 => 'Ú­', 64469 => 'Ú­', 64470 => 'Ú­', 64471 => 'Û‡', 64472 => 'Û‡', 64473 => 'Û†', 64474 => 'Û†', 64475 => 'Ûˆ', 64476 => 'Ûˆ', 64477 => 'Û‡Ù´', 64478 => 'Û‹', 64479 => 'Û‹', 64480 => 'Û…', 64481 => 'Û…', 64482 => 'Û‰', 64483 => 'Û‰', 64484 => 'Û', 64485 => 'Û', 64486 => 'Û', 64487 => 'Û', 64488 => 'Ù‰', 64489 => 'Ù‰', 64490 => 'ئا', 64491 => 'ئا', 64492 => 'ئە', 64493 => 'ئە', 64494 => 'ئو', 64495 => 'ئو', 64496 => 'ئۇ', 64497 => 'ئۇ', 64498 => 'ئۆ', 64499 => 'ئۆ', 64500 => 'ئۈ', 64501 => 'ئۈ', 64502 => 'ئÛ', 64503 => 'ئÛ', 64504 => 'ئÛ', 64505 => 'ئى', 64506 => 'ئى', 64507 => 'ئى', 64508 => 'ÛŒ', 64509 => 'ÛŒ', 64510 => 'ÛŒ', 64511 => 'ÛŒ', 64512 => 'ئج', 64513 => 'ئح', 64514 => 'ئم', 64515 => 'ئى', 64516 => 'ئي', 64517 => 'بج', 64518 => 'بح', 64519 => 'بخ', 64520 => 'بم', 64521 => 'بى', 64522 => 'بي', 64523 => 'تج', 64524 => 'تح', 64525 => 'تخ', 64526 => 'تم', 64527 => 'تى', 64528 => 'تي', 64529 => 'ثج', 64530 => 'ثم', 64531 => 'ثى', 64532 => 'ثي', 64533 => 'جح', 64534 => 'جم', 64535 => 'حج', 64536 => 'حم', 64537 => 'خج', 64538 => 'خح', 64539 => 'خم', 64540 => 'سج', 64541 => 'سح', 64542 => 'سخ', 64543 => 'سم', 64544 => 'صح', 64545 => 'صم', 64546 => 'ضج', 64547 => 'ضح', 64548 => 'ضخ', 64549 => 'ضم', 64550 => 'طح', 64551 => 'طم', 64552 => 'ظم', 64553 => 'عج', 64554 => 'عم', 64555 => 'غج', 64556 => 'غم', 64557 => 'Ùج', 64558 => 'ÙØ­', 64559 => 'ÙØ®', 64560 => 'ÙÙ…', 64561 => 'ÙÙ‰', 64562 => 'ÙÙŠ', 64563 => 'قح', 64564 => 'قم', 64565 => 'قى', 64566 => 'قي', 64567 => 'كا', 64568 => 'كج', 64569 => 'كح', 64570 => 'كخ', 64571 => 'كل', 64572 => 'كم', 64573 => 'كى', 64574 => 'كي', 64575 => 'لج', 64576 => 'لح', 64577 => 'لخ', 64578 => 'لم', 64579 => 'لى', 64580 => 'لي', 64581 => 'مج', 64582 => 'مح', 64583 => 'مخ', 64584 => 'مم', 64585 => 'مى', 64586 => 'مي', 64587 => 'نج', 64588 => 'نح', 64589 => 'نخ', 64590 => 'نم', 64591 => 'نى', 64592 => 'ني', 64593 => 'هج', 64594 => 'هم', 64595 => 'هى', 64596 => 'هي', 64597 => 'يج', 64598 => 'يح', 64599 => 'يخ', 64600 => 'يم', 64601 => 'يى', 64602 => 'يي', 64603 => 'ذٰ', 64604 => 'رٰ', 64605 => 'ىٰ', 64612 => 'ئر', 64613 => 'ئز', 64614 => 'ئم', 64615 => 'ئن', 64616 => 'ئى', 64617 => 'ئي', 64618 => 'بر', 64619 => 'بز', 64620 => 'بم', 64621 => 'بن', 64622 => 'بى', 64623 => 'بي', 64624 => 'تر', 64625 => 'تز', 64626 => 'تم', 64627 => 'تن', 64628 => 'تى', 64629 => 'تي', 64630 => 'ثر', 64631 => 'ثز', 64632 => 'ثم', 64633 => 'ثن', 64634 => 'ثى', 64635 => 'ثي', 64636 => 'ÙÙ‰', 64637 => 'ÙÙŠ', 64638 => 'قى', 64639 => 'قي', 64640 => 'كا', 64641 => 'كل', 64642 => 'كم', 64643 => 'كى', 64644 => 'كي', 64645 => 'لم', 64646 => 'لى', 64647 => 'لي', 64648 => 'ما', 64649 => 'مم', 64650 => 'نر', 64651 => 'نز', 64652 => 'نم', 64653 => 'نن', 64654 => 'نى', 64655 => 'ني', 64656 => 'ىٰ', 64657 => 'ير', 64658 => 'يز', 64659 => 'يم', 64660 => 'ين', 64661 => 'يى', 64662 => 'يي', 64663 => 'ئج', 64664 => 'ئح', 64665 => 'ئخ', 64666 => 'ئم', 64667 => 'ئه', 64668 => 'بج', 64669 => 'بح', 64670 => 'بخ', 64671 => 'بم', 64672 => 'به', 64673 => 'تج', 64674 => 'تح', 64675 => 'تخ', 64676 => 'تم', 64677 => 'ته', 64678 => 'ثم', 64679 => 'جح', 64680 => 'جم', 64681 => 'حج', 64682 => 'حم', 64683 => 'خج', 64684 => 'خم', 64685 => 'سج', 64686 => 'سح', 64687 => 'سخ', 64688 => 'سم', 64689 => 'صح', 64690 => 'صخ', 64691 => 'صم', 64692 => 'ضج', 64693 => 'ضح', 64694 => 'ضخ', 64695 => 'ضم', 64696 => 'طح', 64697 => 'ظم', 64698 => 'عج', 64699 => 'عم', 64700 => 'غج', 64701 => 'غم', 64702 => 'Ùج', 64703 => 'ÙØ­', 64704 => 'ÙØ®', 64705 => 'ÙÙ…', 64706 => 'قح', 64707 => 'قم', 64708 => 'كج', 64709 => 'كح', 64710 => 'كخ', 64711 => 'كل', 64712 => 'كم', 64713 => 'لج', 64714 => 'لح', 64715 => 'لخ', 64716 => 'لم', 64717 => 'له', 64718 => 'مج', 64719 => 'مح', 64720 => 'مخ', 64721 => 'مم', 64722 => 'نج', 64723 => 'نح', 64724 => 'نخ', 64725 => 'نم', 64726 => 'نه', 64727 => 'هج', 64728 => 'هم', 64729 => 'هٰ', 64730 => 'يج', 64731 => 'يح', 64732 => 'يخ', 64733 => 'يم', 64734 => 'يه', 64735 => 'ئم', 64736 => 'ئه', 64737 => 'بم', 64738 => 'به', 64739 => 'تم', 64740 => 'ته', 64741 => 'ثم', 64742 => 'ثه', 64743 => 'سم', 64744 => 'سه', 64745 => 'شم', 64746 => 'شه', 64747 => 'كل', 64748 => 'كم', 64749 => 'لم', 64750 => 'نم', 64751 => 'نه', 64752 => 'يم', 64753 => 'يه', 64754 => 'Ù€ÙŽÙ‘', 64755 => 'Ù€ÙÙ‘', 64756 => 'Ù€ÙÙ‘', 64757 => 'طى', 64758 => 'طي', 64759 => 'عى', 64760 => 'عي', 64761 => 'غى', 64762 => 'غي', 64763 => 'سى', 64764 => 'سي', 64765 => 'شى', 64766 => 'شي', 64767 => 'حى', 64768 => 'حي', 64769 => 'جى', 64770 => 'جي', 64771 => 'خى', 64772 => 'خي', 64773 => 'صى', 64774 => 'صي', 64775 => 'ضى', 64776 => 'ضي', 64777 => 'شج', 64778 => 'شح', 64779 => 'شخ', 64780 => 'شم', 64781 => 'شر', 64782 => 'سر', 64783 => 'صر', 64784 => 'ضر', 64785 => 'طى', 64786 => 'طي', 64787 => 'عى', 64788 => 'عي', 64789 => 'غى', 64790 => 'غي', 64791 => 'سى', 64792 => 'سي', 64793 => 'شى', 64794 => 'شي', 64795 => 'حى', 64796 => 'حي', 64797 => 'جى', 64798 => 'جي', 64799 => 'خى', 64800 => 'خي', 64801 => 'صى', 64802 => 'صي', 64803 => 'ضى', 64804 => 'ضي', 64805 => 'شج', 64806 => 'شح', 64807 => 'شخ', 64808 => 'شم', 64809 => 'شر', 64810 => 'سر', 64811 => 'صر', 64812 => 'ضر', 64813 => 'شج', 64814 => 'شح', 64815 => 'شخ', 64816 => 'شم', 64817 => 'سه', 64818 => 'شه', 64819 => 'طم', 64820 => 'سج', 64821 => 'سح', 64822 => 'سخ', 64823 => 'شج', 64824 => 'شح', 64825 => 'شخ', 64826 => 'طم', 64827 => 'ظم', 64828 => 'اً', 64829 => 'اً', 64848 => 'تجم', 64849 => 'تحج', 64850 => 'تحج', 64851 => 'تحم', 64852 => 'تخم', 64853 => 'تمج', 64854 => 'تمح', 64855 => 'تمخ', 64856 => 'جمح', 64857 => 'جمح', 64858 => 'حمي', 64859 => 'حمى', 64860 => 'سحج', 64861 => 'سجح', 64862 => 'سجى', 64863 => 'سمح', 64864 => 'سمح', 64865 => 'سمج', 64866 => 'سمم', 64867 => 'سمم', 64868 => 'صحح', 64869 => 'صحح', 64870 => 'صمم', 64871 => 'شحم', 64872 => 'شحم', 64873 => 'شجي', 64874 => 'شمخ', 64875 => 'شمخ', 64876 => 'شمم', 64877 => 'شمم', 64878 => 'ضحى', 64879 => 'ضخم', 64880 => 'ضخم', 64881 => 'طمح', 64882 => 'طمح', 64883 => 'طمم', 64884 => 'طمي', 64885 => 'عجم', 64886 => 'عمم', 64887 => 'عمم', 64888 => 'عمى', 64889 => 'غمم', 64890 => 'غمي', 64891 => 'غمى', 64892 => 'Ùخم', 64893 => 'Ùخم', 64894 => 'قمح', 64895 => 'قمم', 64896 => 'لحم', 64897 => 'لحي', 64898 => 'لحى', 64899 => 'لجج', 64900 => 'لجج', 64901 => 'لخم', 64902 => 'لخم', 64903 => 'لمح', 64904 => 'لمح', 64905 => 'محج', 64906 => 'محم', 64907 => 'محي', 64908 => 'مجح', 64909 => 'مجم', 64910 => 'مخج', 64911 => 'مخم', 64914 => 'مجخ', 64915 => 'همج', 64916 => 'همم', 64917 => 'نحم', 64918 => 'نحى', 64919 => 'نجم', 64920 => 'نجم', 64921 => 'نجى', 64922 => 'نمي', 64923 => 'نمى', 64924 => 'يمم', 64925 => 'يمم', 64926 => 'بخي', 64927 => 'تجي', 64928 => 'تجى', 64929 => 'تخي', 64930 => 'تخى', 64931 => 'تمي', 64932 => 'تمى', 64933 => 'جمي', 64934 => 'جحى', 64935 => 'جمى', 64936 => 'سخى', 64937 => 'صحي', 64938 => 'شحي', 64939 => 'ضحي', 64940 => 'لجي', 64941 => 'لمي', 64942 => 'يحي', 64943 => 'يجي', 64944 => 'يمي', 64945 => 'ممي', 64946 => 'قمي', 64947 => 'نحي', 64948 => 'قمح', 64949 => 'لحم', 64950 => 'عمي', 64951 => 'كمي', 64952 => 'نجح', 64953 => 'مخي', 64954 => 'لجم', 64955 => 'كمم', 64956 => 'لجم', 64957 => 'نجح', 64958 => 'جحي', 64959 => 'حجي', 64960 => 'مجي', 64961 => 'Ùمي', 64962 => 'بحي', 64963 => 'كمم', 64964 => 'عجم', 64965 => 'صمم', 64966 => 'سخي', 64967 => 'نجي', 65008 => 'صلے', 65009 => 'قلے', 65010 => 'الله', 65011 => 'اكبر', 65012 => 'محمد', 65013 => 'صلعم', 65014 => 'رسول', 65015 => 'عليه', 65016 => 'وسلم', 65017 => 'صلى', 65020 => 'ریال', 65041 => 'ã€', 65047 => '〖', 65048 => '〗', 65073 => '—', 65074 => '–', 65081 => '〔', 65082 => '〕', 65083 => 'ã€', 65084 => '】', 65085 => '《', 65086 => '》', 65087 => '〈', 65088 => '〉', 65089 => '「', 65090 => 'ã€', 65091 => '『', 65092 => 'ã€', 65105 => 'ã€', 65112 => '—', 65117 => '〔', 65118 => '〕', 65123 => '-', 65137 => 'ـً', 65143 => 'Ù€ÙŽ', 65145 => 'Ù€Ù', 65147 => 'Ù€Ù', 65149 => 'ـّ', 65151 => 'ـْ', 65152 => 'Ø¡', 65153 => 'Ø¢', 65154 => 'Ø¢', 65155 => 'Ø£', 65156 => 'Ø£', 65157 => 'ؤ', 65158 => 'ؤ', 65159 => 'Ø¥', 65160 => 'Ø¥', 65161 => 'ئ', 65162 => 'ئ', 65163 => 'ئ', 65164 => 'ئ', 65165 => 'ا', 65166 => 'ا', 65167 => 'ب', 65168 => 'ب', 65169 => 'ب', 65170 => 'ب', 65171 => 'Ø©', 65172 => 'Ø©', 65173 => 'ت', 65174 => 'ت', 65175 => 'ت', 65176 => 'ت', 65177 => 'Ø«', 65178 => 'Ø«', 65179 => 'Ø«', 65180 => 'Ø«', 65181 => 'ج', 65182 => 'ج', 65183 => 'ج', 65184 => 'ج', 65185 => 'Ø­', 65186 => 'Ø­', 65187 => 'Ø­', 65188 => 'Ø­', 65189 => 'Ø®', 65190 => 'Ø®', 65191 => 'Ø®', 65192 => 'Ø®', 65193 => 'د', 65194 => 'د', 65195 => 'Ø°', 65196 => 'Ø°', 65197 => 'ر', 65198 => 'ر', 65199 => 'ز', 65200 => 'ز', 65201 => 'س', 65202 => 'س', 65203 => 'س', 65204 => 'س', 65205 => 'Ø´', 65206 => 'Ø´', 65207 => 'Ø´', 65208 => 'Ø´', 65209 => 'ص', 65210 => 'ص', 65211 => 'ص', 65212 => 'ص', 65213 => 'ض', 65214 => 'ض', 65215 => 'ض', 65216 => 'ض', 65217 => 'Ø·', 65218 => 'Ø·', 65219 => 'Ø·', 65220 => 'Ø·', 65221 => 'ظ', 65222 => 'ظ', 65223 => 'ظ', 65224 => 'ظ', 65225 => 'ع', 65226 => 'ع', 65227 => 'ع', 65228 => 'ع', 65229 => 'غ', 65230 => 'غ', 65231 => 'غ', 65232 => 'غ', 65233 => 'Ù', 65234 => 'Ù', 65235 => 'Ù', 65236 => 'Ù', 65237 => 'Ù‚', 65238 => 'Ù‚', 65239 => 'Ù‚', 65240 => 'Ù‚', 65241 => 'Ùƒ', 65242 => 'Ùƒ', 65243 => 'Ùƒ', 65244 => 'Ùƒ', 65245 => 'Ù„', 65246 => 'Ù„', 65247 => 'Ù„', 65248 => 'Ù„', 65249 => 'Ù…', 65250 => 'Ù…', 65251 => 'Ù…', 65252 => 'Ù…', 65253 => 'Ù†', 65254 => 'Ù†', 65255 => 'Ù†', 65256 => 'Ù†', 65257 => 'Ù‡', 65258 => 'Ù‡', 65259 => 'Ù‡', 65260 => 'Ù‡', 65261 => 'Ùˆ', 65262 => 'Ùˆ', 65263 => 'Ù‰', 65264 => 'Ù‰', 65265 => 'ÙŠ', 65266 => 'ÙŠ', 65267 => 'ÙŠ', 65268 => 'ÙŠ', 65269 => 'لآ', 65270 => 'لآ', 65271 => 'لأ', 65272 => 'لأ', 65273 => 'لإ', 65274 => 'لإ', 65275 => 'لا', 65276 => 'لا', 65293 => '-', 65294 => '.', 65296 => '0', 65297 => '1', 65298 => '2', 65299 => '3', 65300 => '4', 65301 => '5', 65302 => '6', 65303 => '7', 65304 => '8', 65305 => '9', 65313 => 'a', 65314 => 'b', 65315 => 'c', 65316 => 'd', 65317 => 'e', 65318 => 'f', 65319 => 'g', 65320 => 'h', 65321 => 'i', 65322 => 'j', 65323 => 'k', 65324 => 'l', 65325 => 'm', 65326 => 'n', 65327 => 'o', 65328 => 'p', 65329 => 'q', 65330 => 'r', 65331 => 's', 65332 => 't', 65333 => 'u', 65334 => 'v', 65335 => 'w', 65336 => 'x', 65337 => 'y', 65338 => 'z', 65345 => 'a', 65346 => 'b', 65347 => 'c', 65348 => 'd', 65349 => 'e', 65350 => 'f', 65351 => 'g', 65352 => 'h', 65353 => 'i', 65354 => 'j', 65355 => 'k', 65356 => 'l', 65357 => 'm', 65358 => 'n', 65359 => 'o', 65360 => 'p', 65361 => 'q', 65362 => 'r', 65363 => 's', 65364 => 't', 65365 => 'u', 65366 => 'v', 65367 => 'w', 65368 => 'x', 65369 => 'y', 65370 => 'z', 65375 => '⦅', 65376 => '⦆', 65377 => '.', 65378 => '「', 65379 => 'ã€', 65380 => 'ã€', 65381 => '・', 65382 => 'ヲ', 65383 => 'ã‚¡', 65384 => 'ã‚£', 65385 => 'ã‚¥', 65386 => 'ェ', 65387 => 'ã‚©', 65388 => 'ャ', 65389 => 'ュ', 65390 => 'ョ', 65391 => 'ッ', 65392 => 'ー', 65393 => 'ã‚¢', 65394 => 'イ', 65395 => 'ウ', 65396 => 'エ', 65397 => 'オ', 65398 => 'ã‚«', 65399 => 'ã‚­', 65400 => 'ク', 65401 => 'ケ', 65402 => 'コ', 65403 => 'サ', 65404 => 'ã‚·', 65405 => 'ス', 65406 => 'ã‚»', 65407 => 'ソ', 65408 => 'ã‚¿', 65409 => 'ãƒ', 65410 => 'ツ', 65411 => 'テ', 65412 => 'ト', 65413 => 'ナ', 65414 => 'ニ', 65415 => 'ヌ', 65416 => 'ãƒ', 65417 => 'ノ', 65418 => 'ãƒ', 65419 => 'ヒ', 65420 => 'フ', 65421 => 'ヘ', 65422 => 'ホ', 65423 => 'マ', 65424 => 'ミ', 65425 => 'ム', 65426 => 'メ', 65427 => 'モ', 65428 => 'ヤ', 65429 => 'ユ', 65430 => 'ヨ', 65431 => 'ラ', 65432 => 'リ', 65433 => 'ル', 65434 => 'レ', 65435 => 'ロ', 65436 => 'ワ', 65437 => 'ン', 65438 => 'ã‚™', 65439 => 'ã‚š', 65441 => 'á„€', 65442 => 'á„', 65443 => 'ᆪ', 65444 => 'á„‚', 65445 => 'ᆬ', 65446 => 'ᆭ', 65447 => 'ᄃ', 65448 => 'á„„', 65449 => 'á„…', 65450 => 'ᆰ', 65451 => 'ᆱ', 65452 => 'ᆲ', 65453 => 'ᆳ', 65454 => 'ᆴ', 65455 => 'ᆵ', 65456 => 'á„š', 65457 => 'ᄆ', 65458 => 'ᄇ', 65459 => 'ᄈ', 65460 => 'á„¡', 65461 => 'ᄉ', 65462 => 'á„Š', 65463 => 'á„‹', 65464 => 'á„Œ', 65465 => 'á„', 65466 => 'á„Ž', 65467 => 'á„', 65468 => 'á„', 65469 => 'á„‘', 65470 => 'á„’', 65474 => 'á…¡', 65475 => 'á…¢', 65476 => 'á…£', 65477 => 'á…¤', 65478 => 'á…¥', 65479 => 'á…¦', 65482 => 'á…§', 65483 => 'á…¨', 65484 => 'á…©', 65485 => 'á…ª', 65486 => 'á…«', 65487 => 'á…¬', 65490 => 'á…­', 65491 => 'á…®', 65492 => 'á…¯', 65493 => 'á…°', 65494 => 'á…±', 65495 => 'á…²', 65498 => 'á…³', 65499 => 'á…´', 65500 => 'á…µ', 65504 => '¢', 65505 => '£', 65506 => '¬', 65508 => '¦', 65509 => 'Â¥', 65510 => 'â‚©', 65512 => '│', 65513 => 'â†', 65514 => '↑', 65515 => '→', 65516 => '↓', 65517 => 'â– ', 65518 => 'â—‹', 66560 => 'ð¨', 66561 => 'ð©', 66562 => 'ðª', 66563 => 'ð«', 66564 => 'ð¬', 66565 => 'ð­', 66566 => 'ð®', 66567 => 'ð¯', 66568 => 'ð°', 66569 => 'ð±', 66570 => 'ð²', 66571 => 'ð³', 66572 => 'ð´', 66573 => 'ðµ', 66574 => 'ð¶', 66575 => 'ð·', 66576 => 'ð¸', 66577 => 'ð¹', 66578 => 'ðº', 66579 => 'ð»', 66580 => 'ð¼', 66581 => 'ð½', 66582 => 'ð¾', 66583 => 'ð¿', 66584 => 'ð‘€', 66585 => 'ð‘', 66586 => 'ð‘‚', 66587 => 'ð‘ƒ', 66588 => 'ð‘„', 66589 => 'ð‘…', 66590 => 'ð‘†', 66591 => 'ð‘‡', 66592 => 'ð‘ˆ', 66593 => 'ð‘‰', 66594 => 'ð‘Š', 66595 => 'ð‘‹', 66596 => 'ð‘Œ', 66597 => 'ð‘', 66598 => 'ð‘Ž', 66599 => 'ð‘', 66736 => 'ð“˜', 66737 => 'ð“™', 66738 => 'ð“š', 66739 => 'ð“›', 66740 => 'ð“œ', 66741 => 'ð“', 66742 => 'ð“ž', 66743 => 'ð“Ÿ', 66744 => 'ð“ ', 66745 => 'ð“¡', 66746 => 'ð“¢', 66747 => 'ð“£', 66748 => 'ð“¤', 66749 => 'ð“¥', 66750 => 'ð“¦', 66751 => 'ð“§', 66752 => 'ð“¨', 66753 => 'ð“©', 66754 => 'ð“ª', 66755 => 'ð“«', 66756 => 'ð“¬', 66757 => 'ð“­', 66758 => 'ð“®', 66759 => 'ð“¯', 66760 => 'ð“°', 66761 => 'ð“±', 66762 => 'ð“²', 66763 => 'ð“³', 66764 => 'ð“´', 66765 => 'ð“µ', 66766 => 'ð“¶', 66767 => 'ð“·', 66768 => 'ð“¸', 66769 => 'ð“¹', 66770 => 'ð“º', 66771 => 'ð“»', 68736 => 'ð³€', 68737 => 'ð³', 68738 => 'ð³‚', 68739 => 'ð³ƒ', 68740 => 'ð³„', 68741 => 'ð³…', 68742 => 'ð³†', 68743 => 'ð³‡', 68744 => 'ð³ˆ', 68745 => 'ð³‰', 68746 => 'ð³Š', 68747 => 'ð³‹', 68748 => 'ð³Œ', 68749 => 'ð³', 68750 => 'ð³Ž', 68751 => 'ð³', 68752 => 'ð³', 68753 => 'ð³‘', 68754 => 'ð³’', 68755 => 'ð³“', 68756 => 'ð³”', 68757 => 'ð³•', 68758 => 'ð³–', 68759 => 'ð³—', 68760 => 'ð³˜', 68761 => 'ð³™', 68762 => 'ð³š', 68763 => 'ð³›', 68764 => 'ð³œ', 68765 => 'ð³', 68766 => 'ð³ž', 68767 => 'ð³Ÿ', 68768 => 'ð³ ', 68769 => 'ð³¡', 68770 => 'ð³¢', 68771 => 'ð³£', 68772 => 'ð³¤', 68773 => 'ð³¥', 68774 => 'ð³¦', 68775 => 'ð³§', 68776 => 'ð³¨', 68777 => 'ð³©', 68778 => 'ð³ª', 68779 => 'ð³«', 68780 => 'ð³¬', 68781 => 'ð³­', 68782 => 'ð³®', 68783 => 'ð³¯', 68784 => 'ð³°', 68785 => 'ð³±', 68786 => 'ð³²', 71840 => 'ð‘£€', 71841 => 'ð‘£', 71842 => '𑣂', 71843 => '𑣃', 71844 => '𑣄', 71845 => 'ð‘£…', 71846 => '𑣆', 71847 => '𑣇', 71848 => '𑣈', 71849 => '𑣉', 71850 => '𑣊', 71851 => '𑣋', 71852 => '𑣌', 71853 => 'ð‘£', 71854 => '𑣎', 71855 => 'ð‘£', 71856 => 'ð‘£', 71857 => '𑣑', 71858 => 'ð‘£’', 71859 => '𑣓', 71860 => 'ð‘£”', 71861 => '𑣕', 71862 => 'ð‘£–', 71863 => 'ð‘£—', 71864 => '𑣘', 71865 => 'ð‘£™', 71866 => '𑣚', 71867 => 'ð‘£›', 71868 => '𑣜', 71869 => 'ð‘£', 71870 => '𑣞', 71871 => '𑣟', 93760 => 'ð–¹ ', 93761 => '𖹡', 93762 => 'ð–¹¢', 93763 => 'ð–¹£', 93764 => '𖹤', 93765 => 'ð–¹¥', 93766 => '𖹦', 93767 => '𖹧', 93768 => '𖹨', 93769 => '𖹩', 93770 => '𖹪', 93771 => '𖹫', 93772 => '𖹬', 93773 => 'ð–¹­', 93774 => 'ð–¹®', 93775 => '𖹯', 93776 => 'ð–¹°', 93777 => 'ð–¹±', 93778 => 'ð–¹²', 93779 => 'ð–¹³', 93780 => 'ð–¹´', 93781 => 'ð–¹µ', 93782 => '𖹶', 93783 => 'ð–¹·', 93784 => '𖹸', 93785 => 'ð–¹¹', 93786 => '𖹺', 93787 => 'ð–¹»', 93788 => 'ð–¹¼', 93789 => 'ð–¹½', 93790 => 'ð–¹¾', 93791 => '𖹿', 119134 => 'ð…—ð…¥', 119135 => 'ð…˜ð…¥', 119136 => 'ð…˜ð…¥ð…®', 119137 => 'ð…˜ð…¥ð…¯', 119138 => 'ð…˜ð…¥ð…°', 119139 => 'ð…˜ð…¥ð…±', 119140 => 'ð…˜ð…¥ð…²', 119227 => 'ð†¹ð…¥', 119228 => 'ð†ºð…¥', 119229 => 'ð†¹ð…¥ð…®', 119230 => 'ð†ºð…¥ð…®', 119231 => 'ð†¹ð…¥ð…¯', 119232 => 'ð†ºð…¥ð…¯', 119808 => 'a', 119809 => 'b', 119810 => 'c', 119811 => 'd', 119812 => 'e', 119813 => 'f', 119814 => 'g', 119815 => 'h', 119816 => 'i', 119817 => 'j', 119818 => 'k', 119819 => 'l', 119820 => 'm', 119821 => 'n', 119822 => 'o', 119823 => 'p', 119824 => 'q', 119825 => 'r', 119826 => 's', 119827 => 't', 119828 => 'u', 119829 => 'v', 119830 => 'w', 119831 => 'x', 119832 => 'y', 119833 => 'z', 119834 => 'a', 119835 => 'b', 119836 => 'c', 119837 => 'd', 119838 => 'e', 119839 => 'f', 119840 => 'g', 119841 => 'h', 119842 => 'i', 119843 => 'j', 119844 => 'k', 119845 => 'l', 119846 => 'm', 119847 => 'n', 119848 => 'o', 119849 => 'p', 119850 => 'q', 119851 => 'r', 119852 => 's', 119853 => 't', 119854 => 'u', 119855 => 'v', 119856 => 'w', 119857 => 'x', 119858 => 'y', 119859 => 'z', 119860 => 'a', 119861 => 'b', 119862 => 'c', 119863 => 'd', 119864 => 'e', 119865 => 'f', 119866 => 'g', 119867 => 'h', 119868 => 'i', 119869 => 'j', 119870 => 'k', 119871 => 'l', 119872 => 'm', 119873 => 'n', 119874 => 'o', 119875 => 'p', 119876 => 'q', 119877 => 'r', 119878 => 's', 119879 => 't', 119880 => 'u', 119881 => 'v', 119882 => 'w', 119883 => 'x', 119884 => 'y', 119885 => 'z', 119886 => 'a', 119887 => 'b', 119888 => 'c', 119889 => 'd', 119890 => 'e', 119891 => 'f', 119892 => 'g', 119894 => 'i', 119895 => 'j', 119896 => 'k', 119897 => 'l', 119898 => 'm', 119899 => 'n', 119900 => 'o', 119901 => 'p', 119902 => 'q', 119903 => 'r', 119904 => 's', 119905 => 't', 119906 => 'u', 119907 => 'v', 119908 => 'w', 119909 => 'x', 119910 => 'y', 119911 => 'z', 119912 => 'a', 119913 => 'b', 119914 => 'c', 119915 => 'd', 119916 => 'e', 119917 => 'f', 119918 => 'g', 119919 => 'h', 119920 => 'i', 119921 => 'j', 119922 => 'k', 119923 => 'l', 119924 => 'm', 119925 => 'n', 119926 => 'o', 119927 => 'p', 119928 => 'q', 119929 => 'r', 119930 => 's', 119931 => 't', 119932 => 'u', 119933 => 'v', 119934 => 'w', 119935 => 'x', 119936 => 'y', 119937 => 'z', 119938 => 'a', 119939 => 'b', 119940 => 'c', 119941 => 'd', 119942 => 'e', 119943 => 'f', 119944 => 'g', 119945 => 'h', 119946 => 'i', 119947 => 'j', 119948 => 'k', 119949 => 'l', 119950 => 'm', 119951 => 'n', 119952 => 'o', 119953 => 'p', 119954 => 'q', 119955 => 'r', 119956 => 's', 119957 => 't', 119958 => 'u', 119959 => 'v', 119960 => 'w', 119961 => 'x', 119962 => 'y', 119963 => 'z', 119964 => 'a', 119966 => 'c', 119967 => 'd', 119970 => 'g', 119973 => 'j', 119974 => 'k', 119977 => 'n', 119978 => 'o', 119979 => 'p', 119980 => 'q', 119982 => 's', 119983 => 't', 119984 => 'u', 119985 => 'v', 119986 => 'w', 119987 => 'x', 119988 => 'y', 119989 => 'z', 119990 => 'a', 119991 => 'b', 119992 => 'c', 119993 => 'd', 119995 => 'f', 119997 => 'h', 119998 => 'i', 119999 => 'j', 120000 => 'k', 120001 => 'l', 120002 => 'm', 120003 => 'n', 120005 => 'p', 120006 => 'q', 120007 => 'r', 120008 => 's', 120009 => 't', 120010 => 'u', 120011 => 'v', 120012 => 'w', 120013 => 'x', 120014 => 'y', 120015 => 'z', 120016 => 'a', 120017 => 'b', 120018 => 'c', 120019 => 'd', 120020 => 'e', 120021 => 'f', 120022 => 'g', 120023 => 'h', 120024 => 'i', 120025 => 'j', 120026 => 'k', 120027 => 'l', 120028 => 'm', 120029 => 'n', 120030 => 'o', 120031 => 'p', 120032 => 'q', 120033 => 'r', 120034 => 's', 120035 => 't', 120036 => 'u', 120037 => 'v', 120038 => 'w', 120039 => 'x', 120040 => 'y', 120041 => 'z', 120042 => 'a', 120043 => 'b', 120044 => 'c', 120045 => 'd', 120046 => 'e', 120047 => 'f', 120048 => 'g', 120049 => 'h', 120050 => 'i', 120051 => 'j', 120052 => 'k', 120053 => 'l', 120054 => 'm', 120055 => 'n', 120056 => 'o', 120057 => 'p', 120058 => 'q', 120059 => 'r', 120060 => 's', 120061 => 't', 120062 => 'u', 120063 => 'v', 120064 => 'w', 120065 => 'x', 120066 => 'y', 120067 => 'z', 120068 => 'a', 120069 => 'b', 120071 => 'd', 120072 => 'e', 120073 => 'f', 120074 => 'g', 120077 => 'j', 120078 => 'k', 120079 => 'l', 120080 => 'm', 120081 => 'n', 120082 => 'o', 120083 => 'p', 120084 => 'q', 120086 => 's', 120087 => 't', 120088 => 'u', 120089 => 'v', 120090 => 'w', 120091 => 'x', 120092 => 'y', 120094 => 'a', 120095 => 'b', 120096 => 'c', 120097 => 'd', 120098 => 'e', 120099 => 'f', 120100 => 'g', 120101 => 'h', 120102 => 'i', 120103 => 'j', 120104 => 'k', 120105 => 'l', 120106 => 'm', 120107 => 'n', 120108 => 'o', 120109 => 'p', 120110 => 'q', 120111 => 'r', 120112 => 's', 120113 => 't', 120114 => 'u', 120115 => 'v', 120116 => 'w', 120117 => 'x', 120118 => 'y', 120119 => 'z', 120120 => 'a', 120121 => 'b', 120123 => 'd', 120124 => 'e', 120125 => 'f', 120126 => 'g', 120128 => 'i', 120129 => 'j', 120130 => 'k', 120131 => 'l', 120132 => 'm', 120134 => 'o', 120138 => 's', 120139 => 't', 120140 => 'u', 120141 => 'v', 120142 => 'w', 120143 => 'x', 120144 => 'y', 120146 => 'a', 120147 => 'b', 120148 => 'c', 120149 => 'd', 120150 => 'e', 120151 => 'f', 120152 => 'g', 120153 => 'h', 120154 => 'i', 120155 => 'j', 120156 => 'k', 120157 => 'l', 120158 => 'm', 120159 => 'n', 120160 => 'o', 120161 => 'p', 120162 => 'q', 120163 => 'r', 120164 => 's', 120165 => 't', 120166 => 'u', 120167 => 'v', 120168 => 'w', 120169 => 'x', 120170 => 'y', 120171 => 'z', 120172 => 'a', 120173 => 'b', 120174 => 'c', 120175 => 'd', 120176 => 'e', 120177 => 'f', 120178 => 'g', 120179 => 'h', 120180 => 'i', 120181 => 'j', 120182 => 'k', 120183 => 'l', 120184 => 'm', 120185 => 'n', 120186 => 'o', 120187 => 'p', 120188 => 'q', 120189 => 'r', 120190 => 's', 120191 => 't', 120192 => 'u', 120193 => 'v', 120194 => 'w', 120195 => 'x', 120196 => 'y', 120197 => 'z', 120198 => 'a', 120199 => 'b', 120200 => 'c', 120201 => 'd', 120202 => 'e', 120203 => 'f', 120204 => 'g', 120205 => 'h', 120206 => 'i', 120207 => 'j', 120208 => 'k', 120209 => 'l', 120210 => 'm', 120211 => 'n', 120212 => 'o', 120213 => 'p', 120214 => 'q', 120215 => 'r', 120216 => 's', 120217 => 't', 120218 => 'u', 120219 => 'v', 120220 => 'w', 120221 => 'x', 120222 => 'y', 120223 => 'z', 120224 => 'a', 120225 => 'b', 120226 => 'c', 120227 => 'd', 120228 => 'e', 120229 => 'f', 120230 => 'g', 120231 => 'h', 120232 => 'i', 120233 => 'j', 120234 => 'k', 120235 => 'l', 120236 => 'm', 120237 => 'n', 120238 => 'o', 120239 => 'p', 120240 => 'q', 120241 => 'r', 120242 => 's', 120243 => 't', 120244 => 'u', 120245 => 'v', 120246 => 'w', 120247 => 'x', 120248 => 'y', 120249 => 'z', 120250 => 'a', 120251 => 'b', 120252 => 'c', 120253 => 'd', 120254 => 'e', 120255 => 'f', 120256 => 'g', 120257 => 'h', 120258 => 'i', 120259 => 'j', 120260 => 'k', 120261 => 'l', 120262 => 'm', 120263 => 'n', 120264 => 'o', 120265 => 'p', 120266 => 'q', 120267 => 'r', 120268 => 's', 120269 => 't', 120270 => 'u', 120271 => 'v', 120272 => 'w', 120273 => 'x', 120274 => 'y', 120275 => 'z', 120276 => 'a', 120277 => 'b', 120278 => 'c', 120279 => 'd', 120280 => 'e', 120281 => 'f', 120282 => 'g', 120283 => 'h', 120284 => 'i', 120285 => 'j', 120286 => 'k', 120287 => 'l', 120288 => 'm', 120289 => 'n', 120290 => 'o', 120291 => 'p', 120292 => 'q', 120293 => 'r', 120294 => 's', 120295 => 't', 120296 => 'u', 120297 => 'v', 120298 => 'w', 120299 => 'x', 120300 => 'y', 120301 => 'z', 120302 => 'a', 120303 => 'b', 120304 => 'c', 120305 => 'd', 120306 => 'e', 120307 => 'f', 120308 => 'g', 120309 => 'h', 120310 => 'i', 120311 => 'j', 120312 => 'k', 120313 => 'l', 120314 => 'm', 120315 => 'n', 120316 => 'o', 120317 => 'p', 120318 => 'q', 120319 => 'r', 120320 => 's', 120321 => 't', 120322 => 'u', 120323 => 'v', 120324 => 'w', 120325 => 'x', 120326 => 'y', 120327 => 'z', 120328 => 'a', 120329 => 'b', 120330 => 'c', 120331 => 'd', 120332 => 'e', 120333 => 'f', 120334 => 'g', 120335 => 'h', 120336 => 'i', 120337 => 'j', 120338 => 'k', 120339 => 'l', 120340 => 'm', 120341 => 'n', 120342 => 'o', 120343 => 'p', 120344 => 'q', 120345 => 'r', 120346 => 's', 120347 => 't', 120348 => 'u', 120349 => 'v', 120350 => 'w', 120351 => 'x', 120352 => 'y', 120353 => 'z', 120354 => 'a', 120355 => 'b', 120356 => 'c', 120357 => 'd', 120358 => 'e', 120359 => 'f', 120360 => 'g', 120361 => 'h', 120362 => 'i', 120363 => 'j', 120364 => 'k', 120365 => 'l', 120366 => 'm', 120367 => 'n', 120368 => 'o', 120369 => 'p', 120370 => 'q', 120371 => 'r', 120372 => 's', 120373 => 't', 120374 => 'u', 120375 => 'v', 120376 => 'w', 120377 => 'x', 120378 => 'y', 120379 => 'z', 120380 => 'a', 120381 => 'b', 120382 => 'c', 120383 => 'd', 120384 => 'e', 120385 => 'f', 120386 => 'g', 120387 => 'h', 120388 => 'i', 120389 => 'j', 120390 => 'k', 120391 => 'l', 120392 => 'm', 120393 => 'n', 120394 => 'o', 120395 => 'p', 120396 => 'q', 120397 => 'r', 120398 => 's', 120399 => 't', 120400 => 'u', 120401 => 'v', 120402 => 'w', 120403 => 'x', 120404 => 'y', 120405 => 'z', 120406 => 'a', 120407 => 'b', 120408 => 'c', 120409 => 'd', 120410 => 'e', 120411 => 'f', 120412 => 'g', 120413 => 'h', 120414 => 'i', 120415 => 'j', 120416 => 'k', 120417 => 'l', 120418 => 'm', 120419 => 'n', 120420 => 'o', 120421 => 'p', 120422 => 'q', 120423 => 'r', 120424 => 's', 120425 => 't', 120426 => 'u', 120427 => 'v', 120428 => 'w', 120429 => 'x', 120430 => 'y', 120431 => 'z', 120432 => 'a', 120433 => 'b', 120434 => 'c', 120435 => 'd', 120436 => 'e', 120437 => 'f', 120438 => 'g', 120439 => 'h', 120440 => 'i', 120441 => 'j', 120442 => 'k', 120443 => 'l', 120444 => 'm', 120445 => 'n', 120446 => 'o', 120447 => 'p', 120448 => 'q', 120449 => 'r', 120450 => 's', 120451 => 't', 120452 => 'u', 120453 => 'v', 120454 => 'w', 120455 => 'x', 120456 => 'y', 120457 => 'z', 120458 => 'a', 120459 => 'b', 120460 => 'c', 120461 => 'd', 120462 => 'e', 120463 => 'f', 120464 => 'g', 120465 => 'h', 120466 => 'i', 120467 => 'j', 120468 => 'k', 120469 => 'l', 120470 => 'm', 120471 => 'n', 120472 => 'o', 120473 => 'p', 120474 => 'q', 120475 => 'r', 120476 => 's', 120477 => 't', 120478 => 'u', 120479 => 'v', 120480 => 'w', 120481 => 'x', 120482 => 'y', 120483 => 'z', 120484 => 'ı', 120485 => 'È·', 120488 => 'α', 120489 => 'β', 120490 => 'γ', 120491 => 'δ', 120492 => 'ε', 120493 => 'ζ', 120494 => 'η', 120495 => 'θ', 120496 => 'ι', 120497 => 'κ', 120498 => 'λ', 120499 => 'μ', 120500 => 'ν', 120501 => 'ξ', 120502 => 'ο', 120503 => 'Ï€', 120504 => 'Ï', 120505 => 'θ', 120506 => 'σ', 120507 => 'Ï„', 120508 => 'Ï…', 120509 => 'φ', 120510 => 'χ', 120511 => 'ψ', 120512 => 'ω', 120513 => '∇', 120514 => 'α', 120515 => 'β', 120516 => 'γ', 120517 => 'δ', 120518 => 'ε', 120519 => 'ζ', 120520 => 'η', 120521 => 'θ', 120522 => 'ι', 120523 => 'κ', 120524 => 'λ', 120525 => 'μ', 120526 => 'ν', 120527 => 'ξ', 120528 => 'ο', 120529 => 'Ï€', 120530 => 'Ï', 120531 => 'σ', 120532 => 'σ', 120533 => 'Ï„', 120534 => 'Ï…', 120535 => 'φ', 120536 => 'χ', 120537 => 'ψ', 120538 => 'ω', 120539 => '∂', 120540 => 'ε', 120541 => 'θ', 120542 => 'κ', 120543 => 'φ', 120544 => 'Ï', 120545 => 'Ï€', 120546 => 'α', 120547 => 'β', 120548 => 'γ', 120549 => 'δ', 120550 => 'ε', 120551 => 'ζ', 120552 => 'η', 120553 => 'θ', 120554 => 'ι', 120555 => 'κ', 120556 => 'λ', 120557 => 'μ', 120558 => 'ν', 120559 => 'ξ', 120560 => 'ο', 120561 => 'Ï€', 120562 => 'Ï', 120563 => 'θ', 120564 => 'σ', 120565 => 'Ï„', 120566 => 'Ï…', 120567 => 'φ', 120568 => 'χ', 120569 => 'ψ', 120570 => 'ω', 120571 => '∇', 120572 => 'α', 120573 => 'β', 120574 => 'γ', 120575 => 'δ', 120576 => 'ε', 120577 => 'ζ', 120578 => 'η', 120579 => 'θ', 120580 => 'ι', 120581 => 'κ', 120582 => 'λ', 120583 => 'μ', 120584 => 'ν', 120585 => 'ξ', 120586 => 'ο', 120587 => 'Ï€', 120588 => 'Ï', 120589 => 'σ', 120590 => 'σ', 120591 => 'Ï„', 120592 => 'Ï…', 120593 => 'φ', 120594 => 'χ', 120595 => 'ψ', 120596 => 'ω', 120597 => '∂', 120598 => 'ε', 120599 => 'θ', 120600 => 'κ', 120601 => 'φ', 120602 => 'Ï', 120603 => 'Ï€', 120604 => 'α', 120605 => 'β', 120606 => 'γ', 120607 => 'δ', 120608 => 'ε', 120609 => 'ζ', 120610 => 'η', 120611 => 'θ', 120612 => 'ι', 120613 => 'κ', 120614 => 'λ', 120615 => 'μ', 120616 => 'ν', 120617 => 'ξ', 120618 => 'ο', 120619 => 'Ï€', 120620 => 'Ï', 120621 => 'θ', 120622 => 'σ', 120623 => 'Ï„', 120624 => 'Ï…', 120625 => 'φ', 120626 => 'χ', 120627 => 'ψ', 120628 => 'ω', 120629 => '∇', 120630 => 'α', 120631 => 'β', 120632 => 'γ', 120633 => 'δ', 120634 => 'ε', 120635 => 'ζ', 120636 => 'η', 120637 => 'θ', 120638 => 'ι', 120639 => 'κ', 120640 => 'λ', 120641 => 'μ', 120642 => 'ν', 120643 => 'ξ', 120644 => 'ο', 120645 => 'Ï€', 120646 => 'Ï', 120647 => 'σ', 120648 => 'σ', 120649 => 'Ï„', 120650 => 'Ï…', 120651 => 'φ', 120652 => 'χ', 120653 => 'ψ', 120654 => 'ω', 120655 => '∂', 120656 => 'ε', 120657 => 'θ', 120658 => 'κ', 120659 => 'φ', 120660 => 'Ï', 120661 => 'Ï€', 120662 => 'α', 120663 => 'β', 120664 => 'γ', 120665 => 'δ', 120666 => 'ε', 120667 => 'ζ', 120668 => 'η', 120669 => 'θ', 120670 => 'ι', 120671 => 'κ', 120672 => 'λ', 120673 => 'μ', 120674 => 'ν', 120675 => 'ξ', 120676 => 'ο', 120677 => 'Ï€', 120678 => 'Ï', 120679 => 'θ', 120680 => 'σ', 120681 => 'Ï„', 120682 => 'Ï…', 120683 => 'φ', 120684 => 'χ', 120685 => 'ψ', 120686 => 'ω', 120687 => '∇', 120688 => 'α', 120689 => 'β', 120690 => 'γ', 120691 => 'δ', 120692 => 'ε', 120693 => 'ζ', 120694 => 'η', 120695 => 'θ', 120696 => 'ι', 120697 => 'κ', 120698 => 'λ', 120699 => 'μ', 120700 => 'ν', 120701 => 'ξ', 120702 => 'ο', 120703 => 'Ï€', 120704 => 'Ï', 120705 => 'σ', 120706 => 'σ', 120707 => 'Ï„', 120708 => 'Ï…', 120709 => 'φ', 120710 => 'χ', 120711 => 'ψ', 120712 => 'ω', 120713 => '∂', 120714 => 'ε', 120715 => 'θ', 120716 => 'κ', 120717 => 'φ', 120718 => 'Ï', 120719 => 'Ï€', 120720 => 'α', 120721 => 'β', 120722 => 'γ', 120723 => 'δ', 120724 => 'ε', 120725 => 'ζ', 120726 => 'η', 120727 => 'θ', 120728 => 'ι', 120729 => 'κ', 120730 => 'λ', 120731 => 'μ', 120732 => 'ν', 120733 => 'ξ', 120734 => 'ο', 120735 => 'Ï€', 120736 => 'Ï', 120737 => 'θ', 120738 => 'σ', 120739 => 'Ï„', 120740 => 'Ï…', 120741 => 'φ', 120742 => 'χ', 120743 => 'ψ', 120744 => 'ω', 120745 => '∇', 120746 => 'α', 120747 => 'β', 120748 => 'γ', 120749 => 'δ', 120750 => 'ε', 120751 => 'ζ', 120752 => 'η', 120753 => 'θ', 120754 => 'ι', 120755 => 'κ', 120756 => 'λ', 120757 => 'μ', 120758 => 'ν', 120759 => 'ξ', 120760 => 'ο', 120761 => 'Ï€', 120762 => 'Ï', 120763 => 'σ', 120764 => 'σ', 120765 => 'Ï„', 120766 => 'Ï…', 120767 => 'φ', 120768 => 'χ', 120769 => 'ψ', 120770 => 'ω', 120771 => '∂', 120772 => 'ε', 120773 => 'θ', 120774 => 'κ', 120775 => 'φ', 120776 => 'Ï', 120777 => 'Ï€', 120778 => 'Ï', 120779 => 'Ï', 120782 => '0', 120783 => '1', 120784 => '2', 120785 => '3', 120786 => '4', 120787 => '5', 120788 => '6', 120789 => '7', 120790 => '8', 120791 => '9', 120792 => '0', 120793 => '1', 120794 => '2', 120795 => '3', 120796 => '4', 120797 => '5', 120798 => '6', 120799 => '7', 120800 => '8', 120801 => '9', 120802 => '0', 120803 => '1', 120804 => '2', 120805 => '3', 120806 => '4', 120807 => '5', 120808 => '6', 120809 => '7', 120810 => '8', 120811 => '9', 120812 => '0', 120813 => '1', 120814 => '2', 120815 => '3', 120816 => '4', 120817 => '5', 120818 => '6', 120819 => '7', 120820 => '8', 120821 => '9', 120822 => '0', 120823 => '1', 120824 => '2', 120825 => '3', 120826 => '4', 120827 => '5', 120828 => '6', 120829 => '7', 120830 => '8', 120831 => '9', 125184 => '𞤢', 125185 => '𞤣', 125186 => '𞤤', 125187 => '𞤥', 125188 => '𞤦', 125189 => '𞤧', 125190 => '𞤨', 125191 => '𞤩', 125192 => '𞤪', 125193 => '𞤫', 125194 => '𞤬', 125195 => '𞤭', 125196 => '𞤮', 125197 => '𞤯', 125198 => '𞤰', 125199 => '𞤱', 125200 => '𞤲', 125201 => '𞤳', 125202 => '𞤴', 125203 => '𞤵', 125204 => '𞤶', 125205 => '𞤷', 125206 => '𞤸', 125207 => '𞤹', 125208 => '𞤺', 125209 => '𞤻', 125210 => '𞤼', 125211 => '𞤽', 125212 => '𞤾', 125213 => '𞤿', 125214 => '𞥀', 125215 => 'ðž¥', 125216 => '𞥂', 125217 => '𞥃', 126464 => 'ا', 126465 => 'ب', 126466 => 'ج', 126467 => 'د', 126469 => 'Ùˆ', 126470 => 'ز', 126471 => 'Ø­', 126472 => 'Ø·', 126473 => 'ÙŠ', 126474 => 'Ùƒ', 126475 => 'Ù„', 126476 => 'Ù…', 126477 => 'Ù†', 126478 => 'س', 126479 => 'ع', 126480 => 'Ù', 126481 => 'ص', 126482 => 'Ù‚', 126483 => 'ر', 126484 => 'Ø´', 126485 => 'ت', 126486 => 'Ø«', 126487 => 'Ø®', 126488 => 'Ø°', 126489 => 'ض', 126490 => 'ظ', 126491 => 'غ', 126492 => 'Ù®', 126493 => 'Úº', 126494 => 'Ú¡', 126495 => 'Ù¯', 126497 => 'ب', 126498 => 'ج', 126500 => 'Ù‡', 126503 => 'Ø­', 126505 => 'ÙŠ', 126506 => 'Ùƒ', 126507 => 'Ù„', 126508 => 'Ù…', 126509 => 'Ù†', 126510 => 'س', 126511 => 'ع', 126512 => 'Ù', 126513 => 'ص', 126514 => 'Ù‚', 126516 => 'Ø´', 126517 => 'ت', 126518 => 'Ø«', 126519 => 'Ø®', 126521 => 'ض', 126523 => 'غ', 126530 => 'ج', 126535 => 'Ø­', 126537 => 'ÙŠ', 126539 => 'Ù„', 126541 => 'Ù†', 126542 => 'س', 126543 => 'ع', 126545 => 'ص', 126546 => 'Ù‚', 126548 => 'Ø´', 126551 => 'Ø®', 126553 => 'ض', 126555 => 'غ', 126557 => 'Úº', 126559 => 'Ù¯', 126561 => 'ب', 126562 => 'ج', 126564 => 'Ù‡', 126567 => 'Ø­', 126568 => 'Ø·', 126569 => 'ÙŠ', 126570 => 'Ùƒ', 126572 => 'Ù…', 126573 => 'Ù†', 126574 => 'س', 126575 => 'ع', 126576 => 'Ù', 126577 => 'ص', 126578 => 'Ù‚', 126580 => 'Ø´', 126581 => 'ت', 126582 => 'Ø«', 126583 => 'Ø®', 126585 => 'ض', 126586 => 'ظ', 126587 => 'غ', 126588 => 'Ù®', 126590 => 'Ú¡', 126592 => 'ا', 126593 => 'ب', 126594 => 'ج', 126595 => 'د', 126596 => 'Ù‡', 126597 => 'Ùˆ', 126598 => 'ز', 126599 => 'Ø­', 126600 => 'Ø·', 126601 => 'ÙŠ', 126603 => 'Ù„', 126604 => 'Ù…', 126605 => 'Ù†', 126606 => 'س', 126607 => 'ع', 126608 => 'Ù', 126609 => 'ص', 126610 => 'Ù‚', 126611 => 'ر', 126612 => 'Ø´', 126613 => 'ت', 126614 => 'Ø«', 126615 => 'Ø®', 126616 => 'Ø°', 126617 => 'ض', 126618 => 'ظ', 126619 => 'غ', 126625 => 'ب', 126626 => 'ج', 126627 => 'د', 126629 => 'Ùˆ', 126630 => 'ز', 126631 => 'Ø­', 126632 => 'Ø·', 126633 => 'ÙŠ', 126635 => 'Ù„', 126636 => 'Ù…', 126637 => 'Ù†', 126638 => 'س', 126639 => 'ع', 126640 => 'Ù', 126641 => 'ص', 126642 => 'Ù‚', 126643 => 'ر', 126644 => 'Ø´', 126645 => 'ت', 126646 => 'Ø«', 126647 => 'Ø®', 126648 => 'Ø°', 126649 => 'ض', 126650 => 'ظ', 126651 => 'غ', 127274 => '〔s〕', 127275 => 'c', 127276 => 'r', 127277 => 'cd', 127278 => 'wz', 127280 => 'a', 127281 => 'b', 127282 => 'c', 127283 => 'd', 127284 => 'e', 127285 => 'f', 127286 => 'g', 127287 => 'h', 127288 => 'i', 127289 => 'j', 127290 => 'k', 127291 => 'l', 127292 => 'm', 127293 => 'n', 127294 => 'o', 127295 => 'p', 127296 => 'q', 127297 => 'r', 127298 => 's', 127299 => 't', 127300 => 'u', 127301 => 'v', 127302 => 'w', 127303 => 'x', 127304 => 'y', 127305 => 'z', 127306 => 'hv', 127307 => 'mv', 127308 => 'sd', 127309 => 'ss', 127310 => 'ppv', 127311 => 'wc', 127338 => 'mc', 127339 => 'md', 127340 => 'mr', 127376 => 'dj', 127488 => 'ã»ã‹', 127489 => 'ココ', 127490 => 'サ', 127504 => '手', 127505 => 'å­—', 127506 => 'åŒ', 127507 => 'デ', 127508 => '二', 127509 => '多', 127510 => '解', 127511 => '天', 127512 => '交', 127513 => '映', 127514 => 'ç„¡', 127515 => 'æ–™', 127516 => 'å‰', 127517 => '後', 127518 => 'å†', 127519 => 'æ–°', 127520 => 'åˆ', 127521 => '終', 127522 => '生', 127523 => '販', 127524 => '声', 127525 => 'å¹', 127526 => 'æ¼”', 127527 => '投', 127528 => 'æ•', 127529 => '一', 127530 => '三', 127531 => 'éŠ', 127532 => 'å·¦', 127533 => '中', 127534 => 'å³', 127535 => '指', 127536 => 'èµ°', 127537 => '打', 127538 => 'ç¦', 127539 => '空', 127540 => 'åˆ', 127541 => '満', 127542 => '有', 127543 => '月', 127544 => '申', 127545 => '割', 127546 => 'å–¶', 127547 => 'é…', 127552 => '〔本〕', 127553 => '〔三〕', 127554 => '〔二〕', 127555 => '〔安〕', 127556 => '〔点〕', 127557 => '〔打〕', 127558 => '〔盗〕', 127559 => '〔å‹ã€•', 127560 => '〔敗〕', 127568 => 'å¾—', 127569 => 'å¯', 130032 => '0', 130033 => '1', 130034 => '2', 130035 => '3', 130036 => '4', 130037 => '5', 130038 => '6', 130039 => '7', 130040 => '8', 130041 => '9', 194560 => '丽', 194561 => '丸', 194562 => 'ä¹', 194563 => 'ð „¢', 194564 => 'ä½ ', 194565 => 'ä¾®', 194566 => 'ä¾»', 194567 => '倂', 194568 => 'åº', 194569 => 'å‚™', 194570 => '僧', 194571 => 'åƒ', 194572 => 'ã’ž', 194573 => '𠘺', 194574 => 'å…', 194575 => 'å…”', 194576 => 'å…¤', 194577 => 'å…·', 194578 => '𠔜', 194579 => 'ã’¹', 194580 => 'å…§', 194581 => 'å†', 194582 => 'ð •‹', 194583 => '冗', 194584 => '冤', 194585 => '仌', 194586 => '冬', 194587 => '况', 194588 => '𩇟', 194589 => '凵', 194590 => '刃', 194591 => 'ã“Ÿ', 194592 => '刻', 194593 => '剆', 194594 => '割', 194595 => '剷', 194596 => '㔕', 194597 => '勇', 194598 => '勉', 194599 => '勤', 194600 => '勺', 194601 => '包', 194602 => '匆', 194603 => '北', 194604 => 'å‰', 194605 => 'å‘', 194606 => 'åš', 194607 => 'å³', 194608 => 'å½', 194609 => 'å¿', 194610 => 'å¿', 194611 => 'å¿', 194612 => '𠨬', 194613 => 'ç°', 194614 => 'åŠ', 194615 => 'åŸ', 194616 => 'ð ­£', 194617 => 'å«', 194618 => 'å±', 194619 => 'å†', 194620 => 'å’ž', 194621 => 'å¸', 194622 => '呈', 194623 => '周', 194624 => 'å’¢', 194625 => '哶', 194626 => 'å”', 194627 => 'å•“', 194628 => 'å•£', 194629 => 'å–„', 194630 => 'å–„', 194631 => 'å–™', 194632 => 'å–«', 194633 => 'å–³', 194634 => 'å—‚', 194635 => '圖', 194636 => '嘆', 194637 => '圗', 194638 => '噑', 194639 => 'å™´', 194640 => '切', 194641 => '壮', 194642 => '城', 194643 => '埴', 194644 => 'å ', 194645 => 'åž‹', 194646 => 'å ²', 194647 => 'å ±', 194648 => '墬', 194649 => '𡓤', 194650 => '売', 194651 => '壷', 194652 => '夆', 194653 => '多', 194654 => '夢', 194655 => '奢', 194656 => '𡚨', 194657 => '𡛪', 194658 => '姬', 194659 => '娛', 194660 => '娧', 194661 => '姘', 194662 => '婦', 194663 => 'ã›®', 194665 => '嬈', 194666 => '嬾', 194667 => '嬾', 194668 => '𡧈', 194669 => '寃', 194670 => '寘', 194671 => '寧', 194672 => '寳', 194673 => '𡬘', 194674 => '寿', 194675 => 'å°†', 194677 => 'å°¢', 194678 => 'ãž', 194679 => 'å± ', 194680 => 'å±®', 194681 => 'å³€', 194682 => 'å²', 194683 => 'ð¡·¤', 194684 => '嵃', 194685 => 'ð¡·¦', 194686 => 'åµ®', 194687 => '嵫', 194688 => 'åµ¼', 194689 => 'å·¡', 194690 => 'å·¢', 194691 => 'ã ¯', 194692 => 'å·½', 194693 => '帨', 194694 => '帽', 194695 => '幩', 194696 => 'ã¡¢', 194697 => '𢆃', 194698 => '㡼', 194699 => '庰', 194700 => '庳', 194701 => '庶', 194702 => '廊', 194703 => '𪎒', 194704 => '廾', 194705 => '𢌱', 194706 => '𢌱', 194707 => 'èˆ', 194708 => 'å¼¢', 194709 => 'å¼¢', 194710 => '㣇', 194711 => '𣊸', 194712 => '𦇚', 194713 => 'å½¢', 194714 => '彫', 194715 => '㣣', 194716 => '徚', 194717 => 'å¿', 194718 => 'å¿—', 194719 => '忹', 194720 => 'æ‚', 194721 => '㤺', 194722 => '㤜', 194723 => 'æ‚”', 194724 => '𢛔', 194725 => '惇', 194726 => 'æ…ˆ', 194727 => 'æ…Œ', 194728 => 'æ…Ž', 194729 => 'æ…Œ', 194730 => 'æ…º', 194731 => '憎', 194732 => '憲', 194733 => '憤', 194734 => '憯', 194735 => '懞', 194736 => '懲', 194737 => '懶', 194738 => 'æˆ', 194739 => '戛', 194740 => 'æ‰', 194741 => '抱', 194742 => 'æ‹”', 194743 => 'æ', 194744 => '𢬌', 194745 => '挽', 194746 => '拼', 194747 => 'æ¨', 194748 => '掃', 194749 => 'æ¤', 194750 => '𢯱', 194751 => 'æ¢', 194752 => 'æ…', 194753 => '掩', 194754 => '㨮', 194755 => 'æ‘©', 194756 => '摾', 194757 => 'æ’', 194758 => 'æ‘·', 194759 => '㩬', 194760 => 'æ•', 194761 => '敬', 194762 => '𣀊', 194763 => 'æ—£', 194764 => '書', 194765 => '晉', 194766 => '㬙', 194767 => 'æš‘', 194768 => '㬈', 194769 => '㫤', 194770 => '冒', 194771 => '冕', 194772 => '最', 194773 => 'æšœ', 194774 => 'è‚­', 194775 => 'ä™', 194776 => '朗', 194777 => '望', 194778 => '朡', 194779 => 'æž', 194780 => 'æ“', 194781 => 'ð£ƒ', 194782 => 'ã­‰', 194783 => '柺', 194784 => 'æž…', 194785 => 'æ¡’', 194786 => '梅', 194787 => '𣑭', 194788 => '梎', 194789 => 'æ Ÿ', 194790 => '椔', 194791 => 'ã®', 194792 => '楂', 194793 => '榣', 194794 => '槪', 194795 => '檨', 194796 => '𣚣', 194797 => 'æ«›', 194798 => 'ã°˜', 194799 => '次', 194800 => '𣢧', 194801 => 'æ­”', 194802 => '㱎', 194803 => 'æ­²', 194804 => '殟', 194805 => '殺', 194806 => 'æ®»', 194807 => 'ð£ª', 194808 => 'ð¡´‹', 194809 => '𣫺', 194810 => '汎', 194811 => '𣲼', 194812 => '沿', 194813 => 'æ³', 194814 => '汧', 194815 => 'æ´–', 194816 => 'æ´¾', 194817 => 'æµ·', 194818 => 'æµ', 194819 => '浩', 194820 => '浸', 194821 => '涅', 194822 => '𣴞', 194823 => 'æ´´', 194824 => '港', 194825 => 'æ¹®', 194826 => 'ã´³', 194827 => '滋', 194828 => '滇', 194829 => '𣻑', 194830 => 'æ·¹', 194831 => 'æ½®', 194832 => '𣽞', 194833 => '𣾎', 194834 => '濆', 194835 => '瀹', 194836 => '瀞', 194837 => '瀛', 194838 => '㶖', 194839 => 'çŠ', 194840 => 'ç½', 194841 => 'ç·', 194842 => 'ç‚­', 194843 => '𠔥', 194844 => 'ç……', 194845 => '𤉣', 194846 => '熜', 194848 => '爨', 194849 => '爵', 194850 => 'ç‰', 194851 => '𤘈', 194852 => '犀', 194853 => '犕', 194854 => '𤜵', 194855 => '𤠔', 194856 => 'çº', 194857 => '王', 194858 => '㺬', 194859 => '玥', 194860 => '㺸', 194861 => '㺸', 194862 => '瑇', 194863 => 'ç‘œ', 194864 => '瑱', 194865 => 'ç’…', 194866 => 'ç“Š', 194867 => 'ã¼›', 194868 => '甤', 194869 => '𤰶', 194870 => '甾', 194871 => '𤲒', 194872 => 'ç•°', 194873 => '𢆟', 194874 => 'ç˜', 194875 => '𤾡', 194876 => '𤾸', 194877 => 'ð¥„', 194878 => '㿼', 194879 => '䀈', 194880 => 'ç›´', 194881 => '𥃳', 194882 => '𥃲', 194883 => '𥄙', 194884 => '𥄳', 194885 => '眞', 194886 => '真', 194887 => '真', 194888 => 'çŠ', 194889 => '䀹', 194890 => 'çž‹', 194891 => 'ä†', 194892 => 'ä‚–', 194893 => 'ð¥', 194894 => 'ç¡Ž', 194895 => '碌', 194896 => '磌', 194897 => '䃣', 194898 => '𥘦', 194899 => '祖', 194900 => '𥚚', 194901 => '𥛅', 194902 => 'ç¦', 194903 => '秫', 194904 => '䄯', 194905 => 'ç©€', 194906 => 'ç©Š', 194907 => 'ç©', 194908 => '𥥼', 194909 => '𥪧', 194910 => '𥪧', 194912 => '䈂', 194913 => '𥮫', 194914 => '篆', 194915 => '築', 194916 => '䈧', 194917 => '𥲀', 194918 => 'ç³’', 194919 => '䊠', 194920 => '糨', 194921 => 'ç³£', 194922 => 'ç´€', 194923 => '𥾆', 194924 => 'çµ£', 194925 => 'äŒ', 194926 => 'ç·‡', 194927 => '縂', 194928 => 'ç¹…', 194929 => '䌴', 194930 => '𦈨', 194931 => '𦉇', 194932 => 'ä™', 194933 => '𦋙', 194934 => '罺', 194935 => '𦌾', 194936 => '羕', 194937 => '翺', 194938 => '者', 194939 => '𦓚', 194940 => '𦔣', 194941 => 'è ', 194942 => '𦖨', 194943 => 'è°', 194944 => 'ð£Ÿ', 194945 => 'ä•', 194946 => '育', 194947 => '脃', 194948 => 'ä‹', 194949 => '脾', 194950 => '媵', 194951 => '𦞧', 194952 => '𦞵', 194953 => '𣎓', 194954 => '𣎜', 194955 => 'èˆ', 194956 => '舄', 194957 => '辞', 194958 => 'ä‘«', 194959 => '芑', 194960 => '芋', 194961 => 'èŠ', 194962 => '劳', 194963 => '花', 194964 => '芳', 194965 => '芽', 194966 => '苦', 194967 => '𦬼', 194968 => 'è‹¥', 194969 => 'èŒ', 194970 => 'è£', 194971 => '莭', 194972 => '茣', 194973 => '莽', 194974 => 'è§', 194975 => 'è‘—', 194976 => 'è“', 194977 => 'èŠ', 194978 => 'èŒ', 194979 => 'èœ', 194980 => '𦰶', 194981 => '𦵫', 194982 => '𦳕', 194983 => '䔫', 194984 => '蓱', 194985 => '蓳', 194986 => 'è”–', 194987 => 'ð§Š', 194988 => '蕤', 194989 => '𦼬', 194990 => 'ä•', 194991 => 'ä•¡', 194992 => '𦾱', 194993 => '𧃒', 194994 => 'ä•«', 194995 => 'è™', 194996 => '虜', 194997 => '虧', 194998 => '虩', 194999 => 'èš©', 195000 => '蚈', 195001 => '蜎', 195002 => '蛢', 195003 => 'è¹', 195004 => '蜨', 195005 => 'è«', 195006 => '螆', 195008 => '蟡', 195009 => 'è ', 195010 => 'ä—¹', 195011 => 'è¡ ', 195012 => 'è¡£', 195013 => '𧙧', 195014 => '裗', 195015 => '裞', 195016 => '䘵', 195017 => '裺', 195018 => 'ã’»', 195019 => '𧢮', 195020 => '𧥦', 195021 => 'äš¾', 195022 => '䛇', 195023 => '誠', 195024 => 'è«­', 195025 => '變', 195026 => '豕', 195027 => '𧲨', 195028 => '貫', 195029 => 'è³', 195030 => 'è´›', 195031 => 'èµ·', 195032 => '𧼯', 195033 => 'ð  „', 195034 => 'è·‹', 195035 => '趼', 195036 => 'è·°', 195037 => '𠣞', 195038 => 'è»”', 195039 => '輸', 195040 => '𨗒', 195041 => '𨗭', 195042 => 'é‚”', 195043 => '郱', 195044 => 'é„‘', 195045 => '𨜮', 195046 => 'é„›', 195047 => '鈸', 195048 => 'é‹—', 195049 => '鋘', 195050 => '鉼', 195051 => 'é¹', 195052 => 'é•', 195053 => '𨯺', 195054 => 'é–‹', 195055 => '䦕', 195056 => 'é–·', 195057 => '𨵷', 195058 => '䧦', 195059 => '雃', 195060 => '嶲', 195061 => '霣', 195062 => 'ð©……', 195063 => '𩈚', 195064 => 'ä©®', 195065 => '䩶', 195066 => '韠', 195067 => 'ð©Š', 195068 => '䪲', 195069 => 'ð©’–', 195070 => 'é ‹', 195071 => 'é ‹', 195072 => 'é ©', 195073 => 'ð©–¶', 195074 => '飢', 195075 => '䬳', 195076 => '餩', 195077 => '馧', 195078 => '駂', 195079 => '駾', 195080 => '䯎', 195081 => '𩬰', 195082 => '鬒', 195083 => 'é±€', 195084 => 'é³½', 195085 => '䳎', 195086 => 'ä³­', 195087 => '鵧', 195088 => '𪃎', 195089 => '䳸', 195090 => '𪄅', 195091 => '𪈎', 195092 => '𪊑', 195093 => '麻', 195094 => 'äµ–', 195095 => '黹', 195096 => '黾', 195097 => 'é¼…', 195098 => 'é¼', 195099 => 'é¼–', 195100 => 'é¼»', 195101 => '𪘀'); amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php000064400000011373147600374260031251 0ustar00addons ' ', 168 => ' ̈', 175 => ' Ì„', 180 => ' Ì', 184 => ' ̧', 728 => ' ̆', 729 => ' ̇', 730 => ' ÌŠ', 731 => ' ̨', 732 => ' ̃', 733 => ' Ì‹', 890 => ' ι', 894 => ';', 900 => ' Ì', 901 => ' ̈Ì', 8125 => ' Ì“', 8127 => ' Ì“', 8128 => ' Í‚', 8129 => ' ̈͂', 8141 => ' Ì“Ì€', 8142 => ' Ì“Ì', 8143 => ' Ì“Í‚', 8157 => ' ̔̀', 8158 => ' Ì”Ì', 8159 => ' ̔͂', 8173 => ' ̈̀', 8174 => ' ̈Ì', 8175 => '`', 8189 => ' Ì', 8190 => ' Ì”', 8192 => ' ', 8193 => ' ', 8194 => ' ', 8195 => ' ', 8196 => ' ', 8197 => ' ', 8198 => ' ', 8199 => ' ', 8200 => ' ', 8201 => ' ', 8202 => ' ', 8215 => ' ̳', 8239 => ' ', 8252 => '!!', 8254 => ' Ì…', 8263 => '??', 8264 => '?!', 8265 => '!?', 8287 => ' ', 8314 => '+', 8316 => '=', 8317 => '(', 8318 => ')', 8330 => '+', 8332 => '=', 8333 => '(', 8334 => ')', 8448 => 'a/c', 8449 => 'a/s', 8453 => 'c/o', 8454 => 'c/u', 9332 => '(1)', 9333 => '(2)', 9334 => '(3)', 9335 => '(4)', 9336 => '(5)', 9337 => '(6)', 9338 => '(7)', 9339 => '(8)', 9340 => '(9)', 9341 => '(10)', 9342 => '(11)', 9343 => '(12)', 9344 => '(13)', 9345 => '(14)', 9346 => '(15)', 9347 => '(16)', 9348 => '(17)', 9349 => '(18)', 9350 => '(19)', 9351 => '(20)', 9372 => '(a)', 9373 => '(b)', 9374 => '(c)', 9375 => '(d)', 9376 => '(e)', 9377 => '(f)', 9378 => '(g)', 9379 => '(h)', 9380 => '(i)', 9381 => '(j)', 9382 => '(k)', 9383 => '(l)', 9384 => '(m)', 9385 => '(n)', 9386 => '(o)', 9387 => '(p)', 9388 => '(q)', 9389 => '(r)', 9390 => '(s)', 9391 => '(t)', 9392 => '(u)', 9393 => '(v)', 9394 => '(w)', 9395 => '(x)', 9396 => '(y)', 9397 => '(z)', 10868 => '::=', 10869 => '==', 10870 => '===', 12288 => ' ', 12443 => ' ã‚™', 12444 => ' ã‚š', 12800 => '(á„€)', 12801 => '(á„‚)', 12802 => '(ᄃ)', 12803 => '(á„…)', 12804 => '(ᄆ)', 12805 => '(ᄇ)', 12806 => '(ᄉ)', 12807 => '(á„‹)', 12808 => '(á„Œ)', 12809 => '(á„Ž)', 12810 => '(á„)', 12811 => '(á„)', 12812 => '(á„‘)', 12813 => '(á„’)', 12814 => '(ê°€)', 12815 => '(나)', 12816 => '(다)', 12817 => '(ë¼)', 12818 => '(마)', 12819 => '(ë°”)', 12820 => '(사)', 12821 => '(ì•„)', 12822 => '(ìž)', 12823 => '(ì°¨)', 12824 => '(ì¹´)', 12825 => '(타)', 12826 => '(파)', 12827 => '(하)', 12828 => '(주)', 12829 => '(오전)', 12830 => '(오후)', 12832 => '(一)', 12833 => '(二)', 12834 => '(三)', 12835 => '(å››)', 12836 => '(五)', 12837 => '(å…­)', 12838 => '(七)', 12839 => '(å…«)', 12840 => '(ä¹)', 12841 => '(å)', 12842 => '(月)', 12843 => '(ç«)', 12844 => '(æ°´)', 12845 => '(木)', 12846 => '(金)', 12847 => '(土)', 12848 => '(æ—¥)', 12849 => '(æ ª)', 12850 => '(有)', 12851 => '(社)', 12852 => '(å)', 12853 => '(特)', 12854 => '(財)', 12855 => '(ç¥)', 12856 => '(労)', 12857 => '(代)', 12858 => '(呼)', 12859 => '(å­¦)', 12860 => '(監)', 12861 => '(ä¼)', 12862 => '(資)', 12863 => '(å”)', 12864 => '(祭)', 12865 => '(休)', 12866 => '(自)', 12867 => '(至)', 64297 => '+', 64606 => ' ٌّ', 64607 => ' ÙÙ‘', 64608 => ' ÙŽÙ‘', 64609 => ' ÙÙ‘', 64610 => ' ÙÙ‘', 64611 => ' ّٰ', 65018 => 'صلى الله عليه وسلم', 65019 => 'جل جلاله', 65040 => ',', 65043 => ':', 65044 => ';', 65045 => '!', 65046 => '?', 65075 => '_', 65076 => '_', 65077 => '(', 65078 => ')', 65079 => '{', 65080 => '}', 65095 => '[', 65096 => ']', 65097 => ' Ì…', 65098 => ' Ì…', 65099 => ' Ì…', 65100 => ' Ì…', 65101 => '_', 65102 => '_', 65103 => '_', 65104 => ',', 65108 => ';', 65109 => ':', 65110 => '?', 65111 => '!', 65113 => '(', 65114 => ')', 65115 => '{', 65116 => '}', 65119 => '#', 65120 => '&', 65121 => '*', 65122 => '+', 65124 => '<', 65125 => '>', 65126 => '=', 65128 => '\\', 65129 => '$', 65130 => '%', 65131 => '@', 65136 => ' Ù‹', 65138 => ' ÙŒ', 65140 => ' Ù', 65142 => ' ÙŽ', 65144 => ' Ù', 65146 => ' Ù', 65148 => ' Ù‘', 65150 => ' Ù’', 65281 => '!', 65282 => '"', 65283 => '#', 65284 => '$', 65285 => '%', 65286 => '&', 65287 => '\'', 65288 => '(', 65289 => ')', 65290 => '*', 65291 => '+', 65292 => ',', 65295 => '/', 65306 => ':', 65307 => ';', 65308 => '<', 65309 => '=', 65310 => '>', 65311 => '?', 65312 => '@', 65339 => '[', 65340 => '\\', 65341 => ']', 65342 => '^', 65343 => '_', 65344 => '`', 65371 => '{', 65372 => '|', 65373 => '}', 65374 => '~', 65507 => ' Ì„', 127233 => '0,', 127234 => '1,', 127235 => '2,', 127236 => '3,', 127237 => '4,', 127238 => '5,', 127239 => '6,', 127240 => '7,', 127241 => '8,', 127242 => '9,', 127248 => '(a)', 127249 => '(b)', 127250 => '(c)', 127251 => '(d)', 127252 => '(e)', 127253 => '(f)', 127254 => '(g)', 127255 => '(h)', 127256 => '(i)', 127257 => '(j)', 127258 => '(k)', 127259 => '(l)', 127260 => '(m)', 127261 => '(n)', 127262 => '(o)', 127263 => '(p)', 127264 => '(q)', 127265 => '(r)', 127266 => '(s)', 127267 => '(t)', 127268 => '(u)', 127269 => '(v)', 127270 => '(w)', 127271 => '(x)', 127272 => '(y)', 127273 => '(z)'); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/ignored.php000064400000010754147600374260026507 0ustar00 \true, 847 => \true, 6155 => \true, 6156 => \true, 6157 => \true, 8203 => \true, 8288 => \true, 8292 => \true, 65024 => \true, 65025 => \true, 65026 => \true, 65027 => \true, 65028 => \true, 65029 => \true, 65030 => \true, 65031 => \true, 65032 => \true, 65033 => \true, 65034 => \true, 65035 => \true, 65036 => \true, 65037 => \true, 65038 => \true, 65039 => \true, 65279 => \true, 113824 => \true, 113825 => \true, 113826 => \true, 113827 => \true, 917760 => \true, 917761 => \true, 917762 => \true, 917763 => \true, 917764 => \true, 917765 => \true, 917766 => \true, 917767 => \true, 917768 => \true, 917769 => \true, 917770 => \true, 917771 => \true, 917772 => \true, 917773 => \true, 917774 => \true, 917775 => \true, 917776 => \true, 917777 => \true, 917778 => \true, 917779 => \true, 917780 => \true, 917781 => \true, 917782 => \true, 917783 => \true, 917784 => \true, 917785 => \true, 917786 => \true, 917787 => \true, 917788 => \true, 917789 => \true, 917790 => \true, 917791 => \true, 917792 => \true, 917793 => \true, 917794 => \true, 917795 => \true, 917796 => \true, 917797 => \true, 917798 => \true, 917799 => \true, 917800 => \true, 917801 => \true, 917802 => \true, 917803 => \true, 917804 => \true, 917805 => \true, 917806 => \true, 917807 => \true, 917808 => \true, 917809 => \true, 917810 => \true, 917811 => \true, 917812 => \true, 917813 => \true, 917814 => \true, 917815 => \true, 917816 => \true, 917817 => \true, 917818 => \true, 917819 => \true, 917820 => \true, 917821 => \true, 917822 => \true, 917823 => \true, 917824 => \true, 917825 => \true, 917826 => \true, 917827 => \true, 917828 => \true, 917829 => \true, 917830 => \true, 917831 => \true, 917832 => \true, 917833 => \true, 917834 => \true, 917835 => \true, 917836 => \true, 917837 => \true, 917838 => \true, 917839 => \true, 917840 => \true, 917841 => \true, 917842 => \true, 917843 => \true, 917844 => \true, 917845 => \true, 917846 => \true, 917847 => \true, 917848 => \true, 917849 => \true, 917850 => \true, 917851 => \true, 917852 => \true, 917853 => \true, 917854 => \true, 917855 => \true, 917856 => \true, 917857 => \true, 917858 => \true, 917859 => \true, 917860 => \true, 917861 => \true, 917862 => \true, 917863 => \true, 917864 => \true, 917865 => \true, 917866 => \true, 917867 => \true, 917868 => \true, 917869 => \true, 917870 => \true, 917871 => \true, 917872 => \true, 917873 => \true, 917874 => \true, 917875 => \true, 917876 => \true, 917877 => \true, 917878 => \true, 917879 => \true, 917880 => \true, 917881 => \true, 917882 => \true, 917883 => \true, 917884 => \true, 917885 => \true, 917886 => \true, 917887 => \true, 917888 => \true, 917889 => \true, 917890 => \true, 917891 => \true, 917892 => \true, 917893 => \true, 917894 => \true, 917895 => \true, 917896 => \true, 917897 => \true, 917898 => \true, 917899 => \true, 917900 => \true, 917901 => \true, 917902 => \true, 917903 => \true, 917904 => \true, 917905 => \true, 917906 => \true, 917907 => \true, 917908 => \true, 917909 => \true, 917910 => \true, 917911 => \true, 917912 => \true, 917913 => \true, 917914 => \true, 917915 => \true, 917916 => \true, 917917 => \true, 917918 => \true, 917919 => \true, 917920 => \true, 917921 => \true, 917922 => \true, 917923 => \true, 917924 => \true, 917925 => \true, 917926 => \true, 917927 => \true, 917928 => \true, 917929 => \true, 917930 => \true, 917931 => \true, 917932 => \true, 917933 => \true, 917934 => \true, 917935 => \true, 917936 => \true, 917937 => \true, 917938 => \true, 917939 => \true, 917940 => \true, 917941 => \true, 917942 => \true, 917943 => \true, 917944 => \true, 917945 => \true, 917946 => \true, 917947 => \true, 917948 => \true, 917949 => \true, 917950 => \true, 917951 => \true, 917952 => \true, 917953 => \true, 917954 => \true, 917955 => \true, 917956 => \true, 917957 => \true, 917958 => \true, 917959 => \true, 917960 => \true, 917961 => \true, 917962 => \true, 917963 => \true, 917964 => \true, 917965 => \true, 917966 => \true, 917967 => \true, 917968 => \true, 917969 => \true, 917970 => \true, 917971 => \true, 917972 => \true, 917973 => \true, 917974 => \true, 917975 => \true, 917976 => \true, 917977 => \true, 917978 => \true, 917979 => \true, 917980 => \true, 917981 => \true, 917982 => \true, 917983 => \true, 917984 => \true, 917985 => \true, 917986 => \true, 917987 => \true, 917988 => \true, 917989 => \true, 917990 => \true, 917991 => \true, 917992 => \true, 917993 => \true, 917994 => \true, 917995 => \true, 917996 => \true, 917997 => \true, 917998 => \true, 917999 => \true); amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php000064400000021025147600374260030221 0ustar00addons= 128 && $codePoint <= 159) { return \true; } if ($codePoint >= 2155 && $codePoint <= 2207) { return \true; } if ($codePoint >= 3676 && $codePoint <= 3712) { return \true; } if ($codePoint >= 3808 && $codePoint <= 3839) { return \true; } if ($codePoint >= 4059 && $codePoint <= 4095) { return \true; } if ($codePoint >= 4256 && $codePoint <= 4293) { return \true; } if ($codePoint >= 6849 && $codePoint <= 6911) { return \true; } if ($codePoint >= 11859 && $codePoint <= 11903) { return \true; } if ($codePoint >= 42955 && $codePoint <= 42996) { return \true; } if ($codePoint >= 55296 && $codePoint <= 57343) { return \true; } if ($codePoint >= 57344 && $codePoint <= 63743) { return \true; } if ($codePoint >= 64218 && $codePoint <= 64255) { return \true; } if ($codePoint >= 64976 && $codePoint <= 65007) { return \true; } if ($codePoint >= 65630 && $codePoint <= 65663) { return \true; } if ($codePoint >= 65953 && $codePoint <= 65999) { return \true; } if ($codePoint >= 66046 && $codePoint <= 66175) { return \true; } if ($codePoint >= 66518 && $codePoint <= 66559) { return \true; } if ($codePoint >= 66928 && $codePoint <= 67071) { return \true; } if ($codePoint >= 67432 && $codePoint <= 67583) { return \true; } if ($codePoint >= 67760 && $codePoint <= 67807) { return \true; } if ($codePoint >= 67904 && $codePoint <= 67967) { return \true; } if ($codePoint >= 68256 && $codePoint <= 68287) { return \true; } if ($codePoint >= 68528 && $codePoint <= 68607) { return \true; } if ($codePoint >= 68681 && $codePoint <= 68735) { return \true; } if ($codePoint >= 68922 && $codePoint <= 69215) { return \true; } if ($codePoint >= 69298 && $codePoint <= 69375) { return \true; } if ($codePoint >= 69466 && $codePoint <= 69551) { return \true; } if ($codePoint >= 70207 && $codePoint <= 70271) { return \true; } if ($codePoint >= 70517 && $codePoint <= 70655) { return \true; } if ($codePoint >= 70874 && $codePoint <= 71039) { return \true; } if ($codePoint >= 71134 && $codePoint <= 71167) { return \true; } if ($codePoint >= 71370 && $codePoint <= 71423) { return \true; } if ($codePoint >= 71488 && $codePoint <= 71679) { return \true; } if ($codePoint >= 71740 && $codePoint <= 71839) { return \true; } if ($codePoint >= 72026 && $codePoint <= 72095) { return \true; } if ($codePoint >= 72441 && $codePoint <= 72703) { return \true; } if ($codePoint >= 72887 && $codePoint <= 72959) { return \true; } if ($codePoint >= 73130 && $codePoint <= 73439) { return \true; } if ($codePoint >= 73465 && $codePoint <= 73647) { return \true; } if ($codePoint >= 74650 && $codePoint <= 74751) { return \true; } if ($codePoint >= 75076 && $codePoint <= 77823) { return \true; } if ($codePoint >= 78905 && $codePoint <= 82943) { return \true; } if ($codePoint >= 83527 && $codePoint <= 92159) { return \true; } if ($codePoint >= 92784 && $codePoint <= 92879) { return \true; } if ($codePoint >= 93072 && $codePoint <= 93759) { return \true; } if ($codePoint >= 93851 && $codePoint <= 93951) { return \true; } if ($codePoint >= 94112 && $codePoint <= 94175) { return \true; } if ($codePoint >= 101590 && $codePoint <= 101631) { return \true; } if ($codePoint >= 101641 && $codePoint <= 110591) { return \true; } if ($codePoint >= 110879 && $codePoint <= 110927) { return \true; } if ($codePoint >= 111356 && $codePoint <= 113663) { return \true; } if ($codePoint >= 113828 && $codePoint <= 118783) { return \true; } if ($codePoint >= 119366 && $codePoint <= 119519) { return \true; } if ($codePoint >= 119673 && $codePoint <= 119807) { return \true; } if ($codePoint >= 121520 && $codePoint <= 122879) { return \true; } if ($codePoint >= 122923 && $codePoint <= 123135) { return \true; } if ($codePoint >= 123216 && $codePoint <= 123583) { return \true; } if ($codePoint >= 123648 && $codePoint <= 124927) { return \true; } if ($codePoint >= 125143 && $codePoint <= 125183) { return \true; } if ($codePoint >= 125280 && $codePoint <= 126064) { return \true; } if ($codePoint >= 126133 && $codePoint <= 126208) { return \true; } if ($codePoint >= 126270 && $codePoint <= 126463) { return \true; } if ($codePoint >= 126652 && $codePoint <= 126703) { return \true; } if ($codePoint >= 126706 && $codePoint <= 126975) { return \true; } if ($codePoint >= 127406 && $codePoint <= 127461) { return \true; } if ($codePoint >= 127590 && $codePoint <= 127743) { return \true; } if ($codePoint >= 129202 && $codePoint <= 129279) { return \true; } if ($codePoint >= 129751 && $codePoint <= 129791) { return \true; } if ($codePoint >= 129995 && $codePoint <= 130031) { return \true; } if ($codePoint >= 130042 && $codePoint <= 131069) { return \true; } if ($codePoint >= 173790 && $codePoint <= 173823) { return \true; } if ($codePoint >= 191457 && $codePoint <= 194559) { return \true; } if ($codePoint >= 195102 && $codePoint <= 196605) { return \true; } if ($codePoint >= 201547 && $codePoint <= 262141) { return \true; } if ($codePoint >= 262144 && $codePoint <= 327677) { return \true; } if ($codePoint >= 327680 && $codePoint <= 393213) { return \true; } if ($codePoint >= 393216 && $codePoint <= 458749) { return \true; } if ($codePoint >= 458752 && $codePoint <= 524285) { return \true; } if ($codePoint >= 524288 && $codePoint <= 589821) { return \true; } if ($codePoint >= 589824 && $codePoint <= 655357) { return \true; } if ($codePoint >= 655360 && $codePoint <= 720893) { return \true; } if ($codePoint >= 720896 && $codePoint <= 786429) { return \true; } if ($codePoint >= 786432 && $codePoint <= 851965) { return \true; } if ($codePoint >= 851968 && $codePoint <= 917501) { return \true; } if ($codePoint >= 917536 && $codePoint <= 917631) { return \true; } if ($codePoint >= 917632 && $codePoint <= 917759) { return \true; } if ($codePoint >= 918000 && $codePoint <= 983037) { return \true; } if ($codePoint >= 983040 && $codePoint <= 1048573) { return \true; } if ($codePoint >= 1048576 && $codePoint <= 1114109) { return \true; } return \false; } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/deviation.php000064400000000144147600374260027032 0ustar00 'ss', 962 => 'σ', 8204 => '', 8205 => ''); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php000064400000332151147600374260026130 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn; /** * @internal */ class Info { public $bidiDomain = \false; public $errors = 0; public $validBidiDomain = \true; public $transitionalDifferent = \false; } addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/Idn.php000064400000072057147600374260022177 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn; use Exception; use Normalizer; use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex; /** * @see https://www.unicode.org/reports/tr46/ * * @internal */ final class Idn { const ERROR_EMPTY_LABEL = 1; const ERROR_LABEL_TOO_LONG = 2; const ERROR_DOMAIN_NAME_TOO_LONG = 4; const ERROR_LEADING_HYPHEN = 8; const ERROR_TRAILING_HYPHEN = 0x10; const ERROR_HYPHEN_3_4 = 0x20; const ERROR_LEADING_COMBINING_MARK = 0x40; const ERROR_DISALLOWED = 0x80; const ERROR_PUNYCODE = 0x100; const ERROR_LABEL_HAS_DOT = 0x200; const ERROR_INVALID_ACE_LABEL = 0x400; const ERROR_BIDI = 0x800; const ERROR_CONTEXTJ = 0x1000; const ERROR_CONTEXTO_PUNCTUATION = 0x2000; const ERROR_CONTEXTO_DIGITS = 0x4000; const INTL_IDNA_VARIANT_2003 = 0; const INTL_IDNA_VARIANT_UTS46 = 1; const IDNA_DEFAULT = 0; const IDNA_ALLOW_UNASSIGNED = 1; const IDNA_USE_STD3_RULES = 2; const IDNA_CHECK_BIDI = 4; const IDNA_CHECK_CONTEXTJ = 8; const IDNA_NONTRANSITIONAL_TO_ASCII = 16; const IDNA_NONTRANSITIONAL_TO_UNICODE = 32; const MAX_DOMAIN_SIZE = 253; const MAX_LABEL_SIZE = 63; const BASE = 36; const TMIN = 1; const TMAX = 26; const SKEW = 38; const DAMP = 700; const INITIAL_BIAS = 72; const INITIAL_N = 128; const DELIMITER = '-'; const MAX_INT = 2147483647; /** * Contains the numeric value of a basic code point (for use in representing integers) in the * range 0 to BASE-1, or -1 if b is does not represent a value. * * @var array */ private static $basicToDigit = array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); /** * @var array */ private static $virama; /** * @var array */ private static $mapped; /** * @var array */ private static $ignored; /** * @var array */ private static $deviation; /** * @var array */ private static $disallowed; /** * @var array */ private static $disallowed_STD3_mapped; /** * @var array */ private static $disallowed_STD3_valid; /** * @var bool */ private static $mappingTableLoaded = \false; /** * @see https://www.unicode.org/reports/tr46/#ToASCII * * @param string $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $options = array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_ASCII), 'VerifyDnsLength' => \true); $info = new Info(); $labels = self::process((string) $domainName, $options, $info); foreach ($labels as $i => $label) { // Only convert labels to punycode that contain non-ASCII code points if (1 === \preg_match('/[^\\x00-\\x7F]/', $label)) { try { $label = 'xn--' . self::punycodeEncode($label); } catch (Exception $e) { $info->errors |= self::ERROR_PUNYCODE; } $labels[$i] = $label; } } if ($options['VerifyDnsLength']) { self::validateDomainAndLabelLength($labels, $info); } $idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors); return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @see https://www.unicode.org/reports/tr46/#ToUnicode * * @param string $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $info = new Info(); $labels = self::process((string) $domainName, array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_UNICODE)), $info); $idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors); return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @param string $label * * @return bool */ private static function isValidContextJ(array $codePoints, $label) { if (!isset(self::$virama)) { self::$virama = (require __DIR__ . \DIRECTORY_SEPARATOR . 'Resources' . \DIRECTORY_SEPARATOR . 'unidata' . \DIRECTORY_SEPARATOR . 'virama.php'); } $offset = 0; foreach ($codePoints as $i => $codePoint) { if (0x200c !== $codePoint && 0x200d !== $codePoint) { continue; } if (!isset($codePoints[$i - 1])) { return \false; } // If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True; if (isset(self::$virama[$codePoints[$i - 1]])) { continue; } // If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C(Joining_Type:T)*(Joining_Type:{R,D})) Then // True; // Generated RegExp = ([Joining_Type:{L,D}][Joining_Type:T]*\u200C[Joining_Type:T]*)[Joining_Type:{R,D}] if (0x200c === $codePoint && 1 === \preg_match(Regex::ZWNJ, $label, $matches, \PREG_OFFSET_CAPTURE, $offset)) { $offset += \strlen($matches[1][0]); continue; } return \false; } return \true; } /** * @see https://www.unicode.org/reports/tr46/#ProcessingStepMap * * @param string $input * @param array $options * * @return string */ private static function mapCodePoints($input, array $options, Info $info) { $str = ''; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; $transitional = $options['Transitional_Processing']; foreach (self::utf8Decode($input) as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); switch ($data['status']) { case 'disallowed': $info->errors |= self::ERROR_DISALLOWED; // no break. case 'valid': $str .= \mb_chr($codePoint, 'utf-8'); break; case 'ignored': // Do nothing. break; case 'mapped': $str .= $data['mapping']; break; case 'deviation': $info->transitionalDifferent = \true; $str .= $transitional ? $data['mapping'] : \mb_chr($codePoint, 'utf-8'); break; } } return $str; } /** * @see https://www.unicode.org/reports/tr46/#Processing * * @param string $domain * @param array $options * * @return array */ private static function process($domain, array $options, Info $info) { // If VerifyDnsLength is not set, we are doing ToUnicode otherwise we are doing ToASCII and // we need to respect the VerifyDnsLength option. $checkForEmptyLabels = !isset($options['VerifyDnsLength']) || $options['VerifyDnsLength']; if ($checkForEmptyLabels && '' === $domain) { $info->errors |= self::ERROR_EMPTY_LABEL; return array($domain); } // Step 1. Map each code point in the domain name string $domain = self::mapCodePoints($domain, $options, $info); // Step 2. Normalize the domain name string to Unicode Normalization Form C. if (!Normalizer::isNormalized($domain, Normalizer::FORM_C)) { $domain = Normalizer::normalize($domain, Normalizer::FORM_C); } // Step 3. Break the string into labels at U+002E (.) FULL STOP. $labels = \explode('.', $domain); $lastLabelIndex = \count($labels) - 1; // Step 4. Convert and validate each label in the domain name string. foreach ($labels as $i => $label) { $validationOptions = $options; if ('xn--' === \substr($label, 0, 4)) { try { $label = self::punycodeDecode(\substr($label, 4)); } catch (Exception $e) { $info->errors |= self::ERROR_PUNYCODE; continue; } $validationOptions['Transitional_Processing'] = \false; $labels[$i] = $label; } self::validateLabel($label, $info, $validationOptions, $i > 0 && $i === $lastLabelIndex); } if ($info->bidiDomain && !$info->validBidiDomain) { $info->errors |= self::ERROR_BIDI; } // Any input domain name string that does not record an error has been successfully // processed according to this specification. Conversely, if an input domain_name string // causes an error, then the processing of the input domain_name string fails. Determining // what to do with error input is up to the caller, and not in the scope of this document. return $labels; } /** * @see https://tools.ietf.org/html/rfc5893#section-2 * * @param string $label */ private static function validateBidiLabel($label, Info $info) { if (1 === \preg_match(Regex::RTL_LABEL, $label)) { $info->bidiDomain = \true; // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the R or AL property, it is an RTL label if (1 !== \preg_match(Regex::BIDI_STEP_1_RTL, $label)) { $info->validBidiDomain = \false; return; } // Step 2. In an RTL label, only characters with the Bidi properties R, AL, AN, EN, ES, // CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_2, $label)) { $info->validBidiDomain = \false; return; } // Step 3. In an RTL label, the end of the label must be a character with Bidi property // R, AL, EN, or AN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_3, $label)) { $info->validBidiDomain = \false; return; } // Step 4. In an RTL label, if an EN is present, no AN may be present, and vice versa. if (1 === \preg_match(Regex::BIDI_STEP_4_AN, $label) && 1 === \preg_match(Regex::BIDI_STEP_4_EN, $label)) { $info->validBidiDomain = \false; return; } return; } // We are a LTR label // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the L property, it is an LTR label. if (1 !== \preg_match(Regex::BIDI_STEP_1_LTR, $label)) { $info->validBidiDomain = \false; return; } // Step 5. In an LTR label, only characters with the Bidi properties L, EN, // ES, CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_5, $label)) { $info->validBidiDomain = \false; return; } // Step 6.In an LTR label, the end of the label must be a character with Bidi property L or // EN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_6, $label)) { $info->validBidiDomain = \false; return; } } /** * @param array $labels */ private static function validateDomainAndLabelLength(array $labels, Info $info) { $maxDomainSize = self::MAX_DOMAIN_SIZE; $length = \count($labels); // Number of "." delimiters. $domainLength = $length - 1; // If the last label is empty and it is not the first label, then it is the root label. // Increase the max size by 1, making it 254, to account for the root label's "." // delimiter. This also means we don't need to check the last label's length for being too // long. if ($length > 1 && '' === $labels[$length - 1]) { ++$maxDomainSize; --$length; } for ($i = 0; $i < $length; ++$i) { $bytes = \strlen($labels[$i]); $domainLength += $bytes; if ($bytes > self::MAX_LABEL_SIZE) { $info->errors |= self::ERROR_LABEL_TOO_LONG; } } if ($domainLength > $maxDomainSize) { $info->errors |= self::ERROR_DOMAIN_NAME_TOO_LONG; } } /** * @see https://www.unicode.org/reports/tr46/#Validity_Criteria * * @param string $label * @param array $options * @param bool $canBeEmpty */ private static function validateLabel($label, Info $info, array $options, $canBeEmpty) { if ('' === $label) { if (!$canBeEmpty && (!isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'])) { $info->errors |= self::ERROR_EMPTY_LABEL; } return; } // Step 1. The label must be in Unicode Normalization Form C. if (!Normalizer::isNormalized($label, Normalizer::FORM_C)) { $info->errors |= self::ERROR_INVALID_ACE_LABEL; } $codePoints = self::utf8Decode($label); if ($options['CheckHyphens']) { // Step 2. If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character // in both the thrid and fourth positions. if (isset($codePoints[2], $codePoints[3]) && 0x2d === $codePoints[2] && 0x2d === $codePoints[3]) { $info->errors |= self::ERROR_HYPHEN_3_4; } // Step 3. If CheckHyphens, the label must neither begin nor end with a U+002D // HYPHEN-MINUS character. if ('-' === \substr($label, 0, 1)) { $info->errors |= self::ERROR_LEADING_HYPHEN; } if ('-' === \substr($label, -1, 1)) { $info->errors |= self::ERROR_TRAILING_HYPHEN; } } // Step 4. The label must not contain a U+002E (.) FULL STOP. if (\false !== \strpos($label, '.')) { $info->errors |= self::ERROR_LABEL_HAS_DOT; } // Step 5. The label must not begin with a combining mark, that is: General_Category=Mark. if (1 === \preg_match(Regex::COMBINING_MARK, $label)) { $info->errors |= self::ERROR_LEADING_COMBINING_MARK; } // Step 6. Each code point in the label must only have certain status values according to // Section 5, IDNA Mapping Table: $transitional = $options['Transitional_Processing']; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; foreach ($codePoints as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); $status = $data['status']; if ('valid' === $status || !$transitional && 'deviation' === $status) { continue; } $info->errors |= self::ERROR_DISALLOWED; break; } // Step 7. If CheckJoiners, the label must satisify the ContextJ rules from Appendix A, in // The Unicode Code Points and Internationalized Domain Names for Applications (IDNA) // [IDNA2008]. if ($options['CheckJoiners'] && !self::isValidContextJ($codePoints, $label)) { $info->errors |= self::ERROR_CONTEXTJ; } // Step 8. If CheckBidi, and if the domain name is a Bidi domain name, then the label must // satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2. if ($options['CheckBidi'] && (!$info->bidiDomain || $info->validBidiDomain)) { self::validateBidiLabel($label, $info); } } /** * @see https://tools.ietf.org/html/rfc3492#section-6.2 * * @param string $input * * @return string */ private static function punycodeDecode($input) { $n = self::INITIAL_N; $out = 0; $i = 0; $bias = self::INITIAL_BIAS; $lastDelimIndex = \strrpos($input, self::DELIMITER); $b = \false === $lastDelimIndex ? 0 : $lastDelimIndex; $inputLength = \strlen($input); $output = array(); $bytes = \array_map('ord', \str_split($input)); for ($j = 0; $j < $b; ++$j) { if ($bytes[$j] > 0x7f) { throw new Exception('Invalid input'); } $output[$out++] = $input[$j]; } if ($b > 0) { ++$b; } for ($in = $b; $in < $inputLength; ++$out) { $oldi = $i; $w = 1; for ($k = self::BASE;; $k += self::BASE) { if ($in >= $inputLength) { throw new Exception('Invalid input'); } $digit = self::$basicToDigit[$bytes[$in++] & 0xff]; if ($digit < 0) { throw new Exception('Invalid input'); } if ($digit > \intdiv(self::MAX_INT - $i, $w)) { throw new Exception('Integer overflow'); } $i += $digit * $w; if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($digit < $t) { break; } $baseMinusT = self::BASE - $t; if ($w > \intdiv(self::MAX_INT, $baseMinusT)) { throw new Exception('Integer overflow'); } $w *= $baseMinusT; } $outPlusOne = $out + 1; $bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi); if (\intdiv($i, $outPlusOne) > self::MAX_INT - $n) { throw new Exception('Integer overflow'); } $n += \intdiv($i, $outPlusOne); $i %= $outPlusOne; \array_splice($output, $i++, 0, array(\mb_chr($n, 'utf-8'))); } return \implode('', $output); } /** * @see https://tools.ietf.org/html/rfc3492#section-6.3 * * @param string $input * * @return string */ private static function punycodeEncode($input) { $n = self::INITIAL_N; $delta = 0; $out = 0; $bias = self::INITIAL_BIAS; $inputLength = 0; $output = ''; $iter = self::utf8Decode($input); foreach ($iter as $codePoint) { ++$inputLength; if ($codePoint < 0x80) { $output .= \chr($codePoint); ++$out; } } $h = $out; $b = $out; if ($b > 0) { $output .= self::DELIMITER; ++$out; } while ($h < $inputLength) { $m = self::MAX_INT; foreach ($iter as $codePoint) { if ($codePoint >= $n && $codePoint < $m) { $m = $codePoint; } } if ($m - $n > \intdiv(self::MAX_INT - $delta, $h + 1)) { throw new Exception('Integer overflow'); } $delta += ($m - $n) * ($h + 1); $n = $m; foreach ($iter as $codePoint) { if ($codePoint < $n && 0 === ++$delta) { throw new Exception('Integer overflow'); } elseif ($codePoint === $n) { $q = $delta; for ($k = self::BASE;; $k += self::BASE) { if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($q < $t) { break; } $qMinusT = $q - $t; $baseMinusT = self::BASE - $t; $output .= self::encodeDigit($t + $qMinusT % $baseMinusT, \false); ++$out; $q = \intdiv($qMinusT, $baseMinusT); } $output .= self::encodeDigit($q, \false); ++$out; $bias = self::adaptBias($delta, $h + 1, $h === $b); $delta = 0; ++$h; } } ++$delta; ++$n; } return $output; } /** * @see https://tools.ietf.org/html/rfc3492#section-6.1 * * @param int $delta * @param int $numPoints * @param bool $firstTime * * @return int */ private static function adaptBias($delta, $numPoints, $firstTime) { // xxx >> 1 is a faster way of doing intdiv(xxx, 2) $delta = $firstTime ? \intdiv($delta, self::DAMP) : $delta >> 1; $delta += \intdiv($delta, $numPoints); $k = 0; while ($delta > (self::BASE - self::TMIN) * self::TMAX >> 1) { $delta = \intdiv($delta, self::BASE - self::TMIN); $k += self::BASE; } return $k + \intdiv((self::BASE - self::TMIN + 1) * $delta, $delta + self::SKEW); } /** * @param int $d * @param bool $flag * * @return string */ private static function encodeDigit($d, $flag) { return \chr($d + 22 + 75 * ($d < 26 ? 1 : 0) - (($flag ? 1 : 0) << 5)); } /** * Takes a UTF-8 encoded string and converts it into a series of integer code points. Any * invalid byte sequences will be replaced by a U+FFFD replacement code point. * * @see https://encoding.spec.whatwg.org/#utf-8-decoder * * @param string $input * * @return array */ private static function utf8Decode($input) { $bytesSeen = 0; $bytesNeeded = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = 0; $codePoints = array(); $length = \strlen($input); for ($i = 0; $i < $length; ++$i) { $byte = \ord($input[$i]); if (0 === $bytesNeeded) { if ($byte >= 0x0 && $byte <= 0x7f) { $codePoints[] = $byte; continue; } if ($byte >= 0xc2 && $byte <= 0xdf) { $bytesNeeded = 1; $codePoint = $byte & 0x1f; } elseif ($byte >= 0xe0 && $byte <= 0xef) { if (0xe0 === $byte) { $lowerBoundary = 0xa0; } elseif (0xed === $byte) { $upperBoundary = 0x9f; } $bytesNeeded = 2; $codePoint = $byte & 0xf; } elseif ($byte >= 0xf0 && $byte <= 0xf4) { if (0xf0 === $byte) { $lowerBoundary = 0x90; } elseif (0xf4 === $byte) { $upperBoundary = 0x8f; } $bytesNeeded = 3; $codePoint = $byte & 0x7; } else { $codePoints[] = 0xfffd; } continue; } if ($byte < $lowerBoundary || $byte > $upperBoundary) { $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; --$i; $codePoints[] = 0xfffd; continue; } $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = $codePoint << 6 | $byte & 0x3f; if (++$bytesSeen !== $bytesNeeded) { continue; } $codePoints[] = $codePoint; $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; } // String unexpectedly ended, so append a U+FFFD code point. if (0 !== $bytesNeeded) { $codePoints[] = 0xfffd; } return $codePoints; } /** * @param int $codePoint * @param bool $useSTD3ASCIIRules * * @return array{status: string, mapping?: string} */ private static function lookupCodePointStatus($codePoint, $useSTD3ASCIIRules) { if (!self::$mappingTableLoaded) { self::$mappingTableLoaded = \true; self::$mapped = (require __DIR__ . '/Resources/unidata/mapped.php'); self::$ignored = (require __DIR__ . '/Resources/unidata/ignored.php'); self::$deviation = (require __DIR__ . '/Resources/unidata/deviation.php'); self::$disallowed = (require __DIR__ . '/Resources/unidata/disallowed.php'); self::$disallowed_STD3_mapped = (require __DIR__ . '/Resources/unidata/disallowed_STD3_mapped.php'); self::$disallowed_STD3_valid = (require __DIR__ . '/Resources/unidata/disallowed_STD3_valid.php'); } if (isset(self::$mapped[$codePoint])) { return array('status' => 'mapped', 'mapping' => self::$mapped[$codePoint]); } if (isset(self::$ignored[$codePoint])) { return array('status' => 'ignored'); } if (isset(self::$deviation[$codePoint])) { return array('status' => 'deviation', 'mapping' => self::$deviation[$codePoint]); } if (isset(self::$disallowed[$codePoint]) || DisallowedRanges::inRange($codePoint)) { return array('status' => 'disallowed'); } $isDisallowedMapped = isset(self::$disallowed_STD3_mapped[$codePoint]); if ($isDisallowedMapped || isset(self::$disallowed_STD3_valid[$codePoint])) { $status = 'disallowed'; if (!$useSTD3ASCIIRules) { $status = $isDisallowedMapped ? 'mapped' : 'valid'; } if ($isDisallowedMapped) { return array('status' => $status, 'mapping' => self::$disallowed_STD3_mapped[$codePoint]); } return array('status' => $status); } return array('status' => 'valid'); } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-idn/bootstrap.php000064400000011502147600374260023466 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Intl\Idn as p; if (\extension_loaded('intl')) { return; } if (!\defined('U_IDNA_PROHIBITED_ERROR')) { \define('U_IDNA_PROHIBITED_ERROR', 66560); } if (!\defined('U_IDNA_ERROR_START')) { \define('U_IDNA_ERROR_START', 66560); } if (!\defined('U_IDNA_UNASSIGNED_ERROR')) { \define('U_IDNA_UNASSIGNED_ERROR', 66561); } if (!\defined('U_IDNA_CHECK_BIDI_ERROR')) { \define('U_IDNA_CHECK_BIDI_ERROR', 66562); } if (!\defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { \define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); } if (!\defined('U_IDNA_ACE_PREFIX_ERROR')) { \define('U_IDNA_ACE_PREFIX_ERROR', 66564); } if (!\defined('U_IDNA_VERIFICATION_ERROR')) { \define('U_IDNA_VERIFICATION_ERROR', 66565); } if (!\defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { \define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); } if (!\defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { \define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); } if (!\defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { \define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); } if (!\defined('U_IDNA_ERROR_LIMIT')) { \define('U_IDNA_ERROR_LIMIT', 66569); } if (!\defined('U_STRINGPREP_PROHIBITED_ERROR')) { \define('U_STRINGPREP_PROHIBITED_ERROR', 66560); } if (!\defined('U_STRINGPREP_UNASSIGNED_ERROR')) { \define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); } if (!\defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { \define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); } if (!\defined('IDNA_DEFAULT')) { \define('IDNA_DEFAULT', 0); } if (!\defined('IDNA_ALLOW_UNASSIGNED')) { \define('IDNA_ALLOW_UNASSIGNED', 1); } if (!\defined('IDNA_USE_STD3_RULES')) { \define('IDNA_USE_STD3_RULES', 2); } if (!\defined('IDNA_CHECK_BIDI')) { \define('IDNA_CHECK_BIDI', 4); } if (!\defined('IDNA_CHECK_CONTEXTJ')) { \define('IDNA_CHECK_CONTEXTJ', 8); } if (!\defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { \define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); } if (!\defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { \define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); } if (!\defined('INTL_IDNA_VARIANT_2003')) { \define('INTL_IDNA_VARIANT_2003', 0); } if (!\defined('INTL_IDNA_VARIANT_UTS46')) { \define('INTL_IDNA_VARIANT_UTS46', 1); } if (!\defined('IDNA_ERROR_EMPTY_LABEL')) { \define('IDNA_ERROR_EMPTY_LABEL', 1); } if (!\defined('IDNA_ERROR_LABEL_TOO_LONG')) { \define('IDNA_ERROR_LABEL_TOO_LONG', 2); } if (!\defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { \define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); } if (!\defined('IDNA_ERROR_LEADING_HYPHEN')) { \define('IDNA_ERROR_LEADING_HYPHEN', 8); } if (!\defined('IDNA_ERROR_TRAILING_HYPHEN')) { \define('IDNA_ERROR_TRAILING_HYPHEN', 16); } if (!\defined('IDNA_ERROR_HYPHEN_3_4')) { \define('IDNA_ERROR_HYPHEN_3_4', 32); } if (!\defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { \define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); } if (!\defined('IDNA_ERROR_DISALLOWED')) { \define('IDNA_ERROR_DISALLOWED', 128); } if (!\defined('IDNA_ERROR_PUNYCODE')) { \define('IDNA_ERROR_PUNYCODE', 256); } if (!\defined('IDNA_ERROR_LABEL_HAS_DOT')) { \define('IDNA_ERROR_LABEL_HAS_DOT', 512); } if (!\defined('IDNA_ERROR_INVALID_ACE_LABEL')) { \define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); } if (!\defined('IDNA_ERROR_BIDI')) { \define('IDNA_ERROR_BIDI', 2048); } if (!\defined('IDNA_ERROR_CONTEXTJ')) { \define('IDNA_ERROR_CONTEXTJ', 4096); } if (\PHP_VERSION_ID < 70400) { if (!\function_exists('\\VendorDuplicator\\idn_to_ascii')) { function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!\function_exists('\\VendorDuplicator\\idn_to_utf8')) { function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } else { if (!\function_exists('\\VendorDuplicator\\idn_to_ascii')) { function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!\function_exists('\\VendorDuplicator\\idn_to_utf8')) { function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php000064400000000662147600374260030322 0ustar00 ' ', '¨' => ' ̈', 'ª' => 'a', '¯' => ' Ì„', '²' => '2', '³' => '3', '´' => ' Ì', 'µ' => 'μ', '¸' => ' ̧', '¹' => '1', 'º' => 'o', '¼' => '1â„4', '½' => '1â„2', '¾' => '3â„4', 'IJ' => 'IJ', 'ij' => 'ij', 'Ä¿' => 'L·', 'Å€' => 'l·', 'ʼn' => 'ʼn', 'Å¿' => 's', 'Ç„' => 'DZÌŒ', 'Ç…' => 'DzÌŒ', 'dž' => 'dzÌŒ', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'ÇŠ' => 'NJ', 'Ç‹' => 'Nj', 'ÇŒ' => 'nj', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'Ê°' => 'h', 'ʱ' => 'ɦ', 'ʲ' => 'j', 'ʳ' => 'r', 'Ê´' => 'ɹ', 'ʵ' => 'É»', 'ʶ' => 'Ê', 'Ê·' => 'w', 'ʸ' => 'y', '˘' => ' ̆', 'Ë™' => ' ̇', 'Ëš' => ' ÌŠ', 'Ë›' => ' ̨', 'Ëœ' => ' ̃', 'Ë' => ' Ì‹', 'Ë ' => 'É£', 'Ë¡' => 'l', 'Ë¢' => 's', 'Ë£' => 'x', 'ˤ' => 'Ê•', 'ͺ' => ' Í…', '΄' => ' Ì', 'Î…' => ' ̈Ì', 'Ï' => 'β', 'Ï‘' => 'θ', 'Ï’' => 'Î¥', 'Ï“' => 'Î¥Ì', 'Ï”' => 'Ϋ', 'Ï•' => 'φ', 'Ï–' => 'Ï€', 'Ï°' => 'κ', 'ϱ' => 'Ï', 'ϲ' => 'Ï‚', 'Ï´' => 'Θ', 'ϵ' => 'ε', 'Ϲ' => 'Σ', 'Ö‡' => 'Õ¥Ö‚', 'Ùµ' => 'اٴ', 'Ù¶' => 'وٴ', 'Ù·' => 'Û‡Ù´', 'Ù¸' => 'يٴ', 'ำ' => 'à¹à¸²', 'ຳ' => 'à»àº²', 'ໜ' => 'ຫນ', 'à»' => 'ຫມ', '༌' => '་', 'ཷ' => 'ྲཱྀ', 'ཹ' => 'ླཱྀ', 'ჼ' => 'ნ', 'á´¬' => 'A', 'á´­' => 'Æ', 'á´®' => 'B', 'á´°' => 'D', 'á´±' => 'E', 'á´²' => 'ÆŽ', 'á´³' => 'G', 'á´´' => 'H', 'á´µ' => 'I', 'á´¶' => 'J', 'á´·' => 'K', 'á´¸' => 'L', 'á´¹' => 'M', 'á´º' => 'N', 'á´¼' => 'O', 'á´½' => 'È¢', 'á´¾' => 'P', 'á´¿' => 'R', 'áµ€' => 'T', 'áµ' => 'U', 'ᵂ' => 'W', 'ᵃ' => 'a', 'ᵄ' => 'É', 'áµ…' => 'É‘', 'ᵆ' => 'á´‚', 'ᵇ' => 'b', 'ᵈ' => 'd', 'ᵉ' => 'e', 'ᵊ' => 'É™', 'ᵋ' => 'É›', 'ᵌ' => 'Éœ', 'áµ' => 'g', 'áµ' => 'k', 'áµ' => 'm', 'ᵑ' => 'Å‹', 'áµ’' => 'o', 'ᵓ' => 'É”', 'áµ”' => 'á´–', 'ᵕ' => 'á´—', 'áµ–' => 'p', 'áµ—' => 't', 'ᵘ' => 'u', 'áµ™' => 'á´', 'ᵚ' => 'ɯ', 'áµ›' => 'v', 'ᵜ' => 'á´¥', 'áµ' => 'β', 'ᵞ' => 'γ', 'ᵟ' => 'δ', 'áµ ' => 'φ', 'ᵡ' => 'χ', 'áµ¢' => 'i', 'áµ£' => 'r', 'ᵤ' => 'u', 'áµ¥' => 'v', 'ᵦ' => 'β', 'ᵧ' => 'γ', 'ᵨ' => 'Ï', 'ᵩ' => 'φ', 'ᵪ' => 'χ', 'ᵸ' => 'н', 'ᶛ' => 'É’', 'ᶜ' => 'c', 'á¶' => 'É•', 'ᶞ' => 'ð', 'ᶟ' => 'Éœ', 'ᶠ' => 'f', 'ᶡ' => 'ÉŸ', 'ᶢ' => 'É¡', 'ᶣ' => 'É¥', 'ᶤ' => 'ɨ', 'ᶥ' => 'É©', 'ᶦ' => 'ɪ', 'ᶧ' => 'áµ»', 'ᶨ' => 'Ê', 'ᶩ' => 'É­', 'ᶪ' => 'ᶅ', 'ᶫ' => 'ÊŸ', 'ᶬ' => 'ɱ', 'ᶭ' => 'É°', 'ᶮ' => 'ɲ', 'ᶯ' => 'ɳ', 'ᶰ' => 'É´', 'ᶱ' => 'ɵ', 'ᶲ' => 'ɸ', 'ᶳ' => 'Ê‚', 'ᶴ' => 'ʃ', 'ᶵ' => 'Æ«', 'ᶶ' => 'ʉ', 'ᶷ' => 'ÊŠ', 'ᶸ' => 'á´œ', 'ᶹ' => 'Ê‹', 'ᶺ' => 'ÊŒ', 'ᶻ' => 'z', 'ᶼ' => 'Ê', 'ᶽ' => 'Ê‘', 'ᶾ' => 'Ê’', 'ᶿ' => 'θ', 'ẚ' => 'aʾ', 'ẛ' => 'ṡ', 'á¾½' => ' Ì“', '᾿' => ' Ì“', 'á¿€' => ' Í‚', 'á¿' => ' ̈͂', 'á¿' => ' Ì“Ì€', 'á¿Ž' => ' Ì“Ì', 'á¿' => ' Ì“Í‚', 'á¿' => ' ̔̀', 'á¿ž' => ' Ì”Ì', 'á¿Ÿ' => ' ̔͂', 'á¿­' => ' ̈̀', 'á¿®' => ' ̈Ì', '´' => ' Ì', '῾' => ' Ì”', ' ' => ' ', 'â€' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '‑' => 'â€', '‗' => ' ̳', '․' => '.', '‥' => '..', '…' => '...', ' ' => ' ', '″' => '′′', '‴' => '′′′', '‶' => '‵‵', '‷' => '‵‵‵', '‼' => '!!', '‾' => ' Ì…', 'â‡' => '??', 'âˆ' => '?!', 'â‰' => '!?', 'â—' => '′′′′', 'âŸ' => ' ', 'â°' => '0', 'â±' => 'i', 'â´' => '4', 'âµ' => '5', 'â¶' => '6', 'â·' => '7', 'â¸' => '8', 'â¹' => '9', 'âº' => '+', 'â»' => '−', 'â¼' => '=', 'â½' => '(', 'â¾' => ')', 'â¿' => 'n', 'â‚€' => '0', 'â‚' => '1', 'â‚‚' => '2', '₃' => '3', 'â‚„' => '4', 'â‚…' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', 'â‚Š' => '+', 'â‚‹' => '−', 'â‚Œ' => '=', 'â‚' => '(', 'â‚Ž' => ')', 'â‚' => 'a', 'â‚‘' => 'e', 'â‚’' => 'o', 'â‚“' => 'x', 'â‚”' => 'É™', 'â‚•' => 'h', 'â‚–' => 'k', 'â‚—' => 'l', 'ₘ' => 'm', 'â‚™' => 'n', 'â‚š' => 'p', 'â‚›' => 's', 'â‚œ' => 't', '₨' => 'Rs', 'â„€' => 'a/c', 'â„' => 'a/s', 'â„‚' => 'C', '℃' => '°C', 'â„…' => 'c/o', '℆' => 'c/u', 'ℇ' => 'Æ', '℉' => '°F', 'â„Š' => 'g', 'â„‹' => 'H', 'â„Œ' => 'H', 'â„' => 'H', 'â„Ž' => 'h', 'â„' => 'ħ', 'â„' => 'I', 'â„‘' => 'I', 'â„’' => 'L', 'â„“' => 'l', 'â„•' => 'N', 'â„–' => 'No', 'â„™' => 'P', 'â„š' => 'Q', 'â„›' => 'R', 'â„œ' => 'R', 'â„' => 'R', 'â„ ' => 'SM', 'â„¡' => 'TEL', 'â„¢' => 'TM', 'ℤ' => 'Z', 'ℨ' => 'Z', 'ℬ' => 'B', 'â„­' => 'C', 'ℯ' => 'e', 'â„°' => 'E', 'ℱ' => 'F', 'ℳ' => 'M', 'â„´' => 'o', 'ℵ' => '×', 'ℶ' => 'ב', 'â„·' => '×’', 'ℸ' => 'ד', 'ℹ' => 'i', 'â„»' => 'FAX', 'ℼ' => 'Ï€', 'ℽ' => 'γ', 'ℾ' => 'Γ', 'â„¿' => 'Π', 'â…€' => '∑', 'â……' => 'D', 'â…†' => 'd', 'â…‡' => 'e', 'â…ˆ' => 'i', 'â…‰' => 'j', 'â…' => '1â„7', 'â…‘' => '1â„9', 'â…’' => '1â„10', 'â…“' => '1â„3', 'â…”' => '2â„3', 'â…•' => '1â„5', 'â…–' => '2â„5', 'â…—' => '3â„5', 'â…˜' => '4â„5', 'â…™' => '1â„6', 'â…š' => '5â„6', 'â…›' => '1â„8', 'â…œ' => '3â„8', 'â…' => '5â„8', 'â…ž' => '7â„8', 'â…Ÿ' => '1â„', 'â… ' => 'I', 'â…¡' => 'II', 'â…¢' => 'III', 'â…£' => 'IV', 'â…¤' => 'V', 'â…¥' => 'VI', 'â…¦' => 'VII', 'â…§' => 'VIII', 'â…¨' => 'IX', 'â…©' => 'X', 'â…ª' => 'XI', 'â…«' => 'XII', 'â…¬' => 'L', 'â…­' => 'C', 'â…®' => 'D', 'â…¯' => 'M', 'â…°' => 'i', 'â…±' => 'ii', 'â…²' => 'iii', 'â…³' => 'iv', 'â…´' => 'v', 'â…µ' => 'vi', 'â…¶' => 'vii', 'â…·' => 'viii', 'â…¸' => 'ix', 'â…¹' => 'x', 'â…º' => 'xi', 'â…»' => 'xii', 'â…¼' => 'l', 'â…½' => 'c', 'â…¾' => 'd', 'â…¿' => 'm', '↉' => '0â„3', '∬' => '∫∫', '∭' => '∫∫∫', '∯' => '∮∮', '∰' => '∮∮∮', 'â‘ ' => '1', 'â‘¡' => '2', 'â‘¢' => '3', 'â‘£' => '4', '⑤' => '5', 'â‘¥' => '6', '⑦' => '7', '⑧' => '8', '⑨' => '9', 'â‘©' => '10', '⑪' => '11', 'â‘«' => '12', '⑬' => '13', 'â‘­' => '14', 'â‘®' => '15', '⑯' => '16', 'â‘°' => '17', '⑱' => '18', '⑲' => '19', '⑳' => '20', 'â‘´' => '(1)', '⑵' => '(2)', '⑶' => '(3)', 'â‘·' => '(4)', '⑸' => '(5)', '⑹' => '(6)', '⑺' => '(7)', 'â‘»' => '(8)', '⑼' => '(9)', '⑽' => '(10)', '⑾' => '(11)', 'â‘¿' => '(12)', 'â’€' => '(13)', 'â’' => '(14)', 'â’‚' => '(15)', 'â’ƒ' => '(16)', 'â’„' => '(17)', 'â’…' => '(18)', 'â’†' => '(19)', 'â’‡' => '(20)', 'â’ˆ' => '1.', 'â’‰' => '2.', 'â’Š' => '3.', 'â’‹' => '4.', 'â’Œ' => '5.', 'â’' => '6.', 'â’Ž' => '7.', 'â’' => '8.', 'â’' => '9.', 'â’‘' => '10.', 'â’’' => '11.', 'â’“' => '12.', 'â’”' => '13.', 'â’•' => '14.', 'â’–' => '15.', 'â’—' => '16.', 'â’˜' => '17.', 'â’™' => '18.', 'â’š' => '19.', 'â’›' => '20.', 'â’œ' => '(a)', 'â’' => '(b)', 'â’ž' => '(c)', 'â’Ÿ' => '(d)', 'â’ ' => '(e)', 'â’¡' => '(f)', 'â’¢' => '(g)', 'â’£' => '(h)', 'â’¤' => '(i)', 'â’¥' => '(j)', 'â’¦' => '(k)', 'â’§' => '(l)', 'â’¨' => '(m)', 'â’©' => '(n)', 'â’ª' => '(o)', 'â’«' => '(p)', 'â’¬' => '(q)', 'â’­' => '(r)', 'â’®' => '(s)', 'â’¯' => '(t)', 'â’°' => '(u)', 'â’±' => '(v)', 'â’²' => '(w)', 'â’³' => '(x)', 'â’´' => '(y)', 'â’µ' => '(z)', 'â’¶' => 'A', 'â’·' => 'B', 'â’¸' => 'C', 'â’¹' => 'D', 'â’º' => 'E', 'â’»' => 'F', 'â’¼' => 'G', 'â’½' => 'H', 'â’¾' => 'I', 'â’¿' => 'J', 'â“€' => 'K', 'â“' => 'L', 'â“‚' => 'M', 'Ⓝ' => 'N', 'â“„' => 'O', 'â“…' => 'P', 'Ⓠ' => 'Q', 'Ⓡ' => 'R', 'Ⓢ' => 'S', 'Ⓣ' => 'T', 'â“Š' => 'U', 'â“‹' => 'V', 'â“Œ' => 'W', 'â“' => 'X', 'â“Ž' => 'Y', 'â“' => 'Z', 'â“' => 'a', 'â“‘' => 'b', 'â“’' => 'c', 'â““' => 'd', 'â“”' => 'e', 'â“•' => 'f', 'â“–' => 'g', 'â“—' => 'h', 'ⓘ' => 'i', 'â“™' => 'j', 'â“š' => 'k', 'â“›' => 'l', 'â“œ' => 'm', 'â“' => 'n', 'â“ž' => 'o', 'â“Ÿ' => 'p', 'â“ ' => 'q', 'â“¡' => 'r', 'â“¢' => 's', 'â“£' => 't', 'ⓤ' => 'u', 'â“¥' => 'v', 'ⓦ' => 'w', 'ⓧ' => 'x', 'ⓨ' => 'y', 'â“©' => 'z', '⓪' => '0', '⨌' => '∫∫∫∫', 'â©´' => '::=', '⩵' => '==', '⩶' => '===', 'â±¼' => 'j', 'â±½' => 'V', 'ⵯ' => 'ⵡ', '⺟' => 'æ¯', '⻳' => '龟', 'â¼€' => '一', 'â¼' => '丨', '⼂' => '丶', '⼃' => '丿', '⼄' => 'ä¹™', 'â¼…' => '亅', '⼆' => '二', '⼇' => '亠', '⼈' => '人', '⼉' => 'å„¿', '⼊' => 'å…¥', '⼋' => 'å…«', '⼌' => '冂', 'â¼' => '冖', '⼎' => '冫', 'â¼' => '几', 'â¼' => '凵', '⼑' => '刀', 'â¼’' => '力', '⼓' => '勹', 'â¼”' => '匕', '⼕' => '匚', 'â¼–' => '匸', 'â¼—' => 'å', '⼘' => 'åœ', 'â¼™' => 'å©', '⼚' => '厂', 'â¼›' => '厶', '⼜' => 'åˆ', 'â¼' => 'å£', '⼞' => 'å›—', '⼟' => '土', 'â¼ ' => '士', '⼡' => '夂', 'â¼¢' => '夊', 'â¼£' => '夕', '⼤' => '大', 'â¼¥' => '女', '⼦' => 'å­', '⼧' => '宀', '⼨' => '寸', '⼩' => 'å°', '⼪' => 'å°¢', '⼫' => 'å°¸', '⼬' => 'å±®', 'â¼­' => 'å±±', 'â¼®' => 'å·›', '⼯' => 'å·¥', 'â¼°' => 'å·±', 'â¼±' => 'å·¾', 'â¼²' => 'å¹²', 'â¼³' => '幺', 'â¼´' => '广', 'â¼µ' => 'å»´', '⼶' => '廾', 'â¼·' => '弋', '⼸' => '弓', 'â¼¹' => 'å½', '⼺' => '彡', 'â¼»' => 'å½³', 'â¼¼' => '心', 'â¼½' => '戈', 'â¼¾' => '戶', '⼿' => '手', 'â½€' => '支', 'â½' => 'æ”´', '⽂' => 'æ–‡', '⽃' => 'æ–—', '⽄' => 'æ–¤', 'â½…' => 'æ–¹', '⽆' => 'æ— ', '⽇' => 'æ—¥', '⽈' => 'æ›°', '⽉' => '月', '⽊' => '木', '⽋' => '欠', '⽌' => 'æ­¢', 'â½' => 'æ­¹', '⽎' => '殳', 'â½' => '毋', 'â½' => '比', '⽑' => '毛', 'â½’' => 'æ°', '⽓' => 'æ°”', 'â½”' => 'æ°´', '⽕' => 'ç«', 'â½–' => '爪', 'â½—' => '父', '⽘' => '爻', 'â½™' => '爿', '⽚' => '片', 'â½›' => '牙', '⽜' => '牛', 'â½' => '犬', '⽞' => '玄', '⽟' => '玉', 'â½ ' => 'ç“œ', '⽡' => '瓦', 'â½¢' => '甘', 'â½£' => '生', '⽤' => '用', 'â½¥' => 'ç”°', '⽦' => 'ç–‹', '⽧' => 'ç–’', '⽨' => '癶', '⽩' => '白', '⽪' => 'çš®', '⽫' => 'çš¿', '⽬' => 'ç›®', 'â½­' => '矛', 'â½®' => '矢', '⽯' => '石', 'â½°' => '示', 'â½±' => '禸', 'â½²' => '禾', 'â½³' => 'ç©´', 'â½´' => 'ç«‹', 'â½µ' => '竹', '⽶' => 'ç±³', 'â½·' => '糸', '⽸' => '缶', 'â½¹' => '网', '⽺' => '羊', 'â½»' => 'ç¾½', 'â½¼' => 'è€', 'â½½' => '而', 'â½¾' => '耒', '⽿' => '耳', 'â¾€' => 'è¿', 'â¾' => '肉', '⾂' => '臣', '⾃' => '自', '⾄' => '至', 'â¾…' => '臼', '⾆' => '舌', '⾇' => '舛', '⾈' => '舟', '⾉' => '艮', '⾊' => '色', '⾋' => '艸', '⾌' => 'è™', 'â¾' => '虫', '⾎' => 'è¡€', 'â¾' => 'è¡Œ', 'â¾' => 'è¡£', '⾑' => '襾', 'â¾’' => '見', '⾓' => '角', 'â¾”' => '言', '⾕' => 'è°·', 'â¾–' => '豆', 'â¾—' => '豕', '⾘' => '豸', 'â¾™' => 'è²', '⾚' => '赤', 'â¾›' => 'èµ°', '⾜' => '足', 'â¾' => '身', '⾞' => '車', '⾟' => 'è¾›', 'â¾ ' => 'è¾°', '⾡' => 'è¾µ', 'â¾¢' => 'é‚‘', 'â¾£' => 'é…‰', '⾤' => '釆', 'â¾¥' => '里', '⾦' => '金', '⾧' => 'é•·', '⾨' => 'é–€', '⾩' => '阜', '⾪' => '隶', '⾫' => 'éš¹', '⾬' => '雨', 'â¾­' => 'é‘', 'â¾®' => 'éž', '⾯' => 'é¢', 'â¾°' => 'é©', 'â¾±' => '韋', 'â¾²' => '韭', 'â¾³' => '音', 'â¾´' => 'é ', 'â¾µ' => '風', '⾶' => '飛', 'â¾·' => '食', '⾸' => '首', 'â¾¹' => '香', '⾺' => '馬', 'â¾»' => '骨', 'â¾¼' => '高', 'â¾½' => 'é«Ÿ', 'â¾¾' => '鬥', '⾿' => '鬯', 'â¿€' => '鬲', 'â¿' => '鬼', 'â¿‚' => 'é­š', '⿃' => 'é³¥', 'â¿„' => 'é¹µ', 'â¿…' => '鹿', '⿆' => '麥', '⿇' => '麻', '⿈' => '黃', '⿉' => 'é»', 'â¿Š' => '黑', 'â¿‹' => '黹', 'â¿Œ' => '黽', 'â¿' => '鼎', 'â¿Ž' => '鼓', 'â¿' => 'é¼ ', 'â¿' => 'é¼»', 'â¿‘' => '齊', 'â¿’' => 'é½’', 'â¿“' => 'é¾', 'â¿”' => '龜', 'â¿•' => 'é¾ ', ' ' => ' ', '〶' => '〒', '〸' => 'å', '〹' => 'å„', '〺' => 'å…', 'ã‚›' => ' ã‚™', 'ã‚œ' => ' ã‚š', 'ã‚Ÿ' => 'より', 'ヿ' => 'コト', 'ㄱ' => 'á„€', 'ㄲ' => 'á„', 'ㄳ' => 'ᆪ', 'ã„´' => 'á„‚', 'ㄵ' => 'ᆬ', 'ㄶ' => 'ᆭ', 'ã„·' => 'ᄃ', 'ㄸ' => 'á„„', 'ㄹ' => 'á„…', 'ㄺ' => 'ᆰ', 'ã„»' => 'ᆱ', 'ㄼ' => 'ᆲ', 'ㄽ' => 'ᆳ', 'ㄾ' => 'ᆴ', 'ã„¿' => 'ᆵ', 'ã…€' => 'á„š', 'ã…' => 'ᄆ', 'ã…‚' => 'ᄇ', 'ã…ƒ' => 'ᄈ', 'ã…„' => 'á„¡', 'ã……' => 'ᄉ', 'ã…†' => 'á„Š', 'ã…‡' => 'á„‹', 'ã…ˆ' => 'á„Œ', 'ã…‰' => 'á„', 'ã…Š' => 'á„Ž', 'ã…‹' => 'á„', 'ã…Œ' => 'á„', 'ã…' => 'á„‘', 'ã…Ž' => 'á„’', 'ã…' => 'á…¡', 'ã…' => 'á…¢', 'ã…‘' => 'á…£', 'ã…’' => 'á…¤', 'ã…“' => 'á…¥', 'ã…”' => 'á…¦', 'ã…•' => 'á…§', 'ã…–' => 'á…¨', 'ã…—' => 'á…©', 'ã…˜' => 'á…ª', 'ã…™' => 'á…«', 'ã…š' => 'á…¬', 'ã…›' => 'á…­', 'ã…œ' => 'á…®', 'ã…' => 'á…¯', 'ã…ž' => 'á…°', 'ã…Ÿ' => 'á…±', 'ã… ' => 'á…²', 'ã…¡' => 'á…³', 'ã…¢' => 'á…´', 'ã…£' => 'á…µ', 'ã…¤' => 'á… ', 'ã…¥' => 'á„”', 'ã…¦' => 'á„•', 'ã…§' => 'ᇇ', 'ã…¨' => 'ᇈ', 'ã…©' => 'ᇌ', 'ã…ª' => 'ᇎ', 'ã…«' => 'ᇓ', 'ã…¬' => 'ᇗ', 'ã…­' => 'ᇙ', 'ã…®' => 'á„œ', 'ã…¯' => 'á‡', 'ã…°' => 'ᇟ', 'ã…±' => 'á„', 'ã…²' => 'á„ž', 'ã…³' => 'á„ ', 'ã…´' => 'á„¢', 'ã…µ' => 'á„£', 'ã…¶' => 'ᄧ', 'ã…·' => 'á„©', 'ã…¸' => 'á„«', 'ã…¹' => 'ᄬ', 'ã…º' => 'á„­', 'ã…»' => 'á„®', 'ã…¼' => 'ᄯ', 'ã…½' => 'ᄲ', 'ã…¾' => 'ᄶ', 'ã…¿' => 'á…€', 'ㆀ' => 'á…‡', 'ã†' => 'á…Œ', 'ㆂ' => 'ᇱ', 'ㆃ' => 'ᇲ', 'ㆄ' => 'á…—', 'ㆅ' => 'á…˜', 'ㆆ' => 'á…™', 'ㆇ' => 'ᆄ', 'ㆈ' => 'ᆅ', 'ㆉ' => 'ᆈ', 'ㆊ' => 'ᆑ', 'ㆋ' => 'ᆒ', 'ㆌ' => 'ᆔ', 'ã†' => 'ᆞ', 'ㆎ' => 'ᆡ', '㆒' => '一', '㆓' => '二', '㆔' => '三', '㆕' => 'å››', '㆖' => '上', '㆗' => '中', '㆘' => '下', '㆙' => '甲', '㆚' => 'ä¹™', '㆛' => '丙', '㆜' => 'ä¸', 'ã†' => '天', '㆞' => '地', '㆟' => '人', '㈀' => '(á„€)', 'ãˆ' => '(á„‚)', '㈂' => '(ᄃ)', '㈃' => '(á„…)', '㈄' => '(ᄆ)', '㈅' => '(ᄇ)', '㈆' => '(ᄉ)', '㈇' => '(á„‹)', '㈈' => '(á„Œ)', '㈉' => '(á„Ž)', '㈊' => '(á„)', '㈋' => '(á„)', '㈌' => '(á„‘)', 'ãˆ' => '(á„’)', '㈎' => '(가)', 'ãˆ' => '(á„‚á…¡)', 'ãˆ' => '(다)', '㈑' => '(á„…á…¡)', '㈒' => '(마)', '㈓' => '(바)', '㈔' => '(사)', '㈕' => '(á„‹á…¡)', '㈖' => '(자)', '㈗' => '(á„Žá…¡)', '㈘' => '(á„á…¡)', '㈙' => '(á„á…¡)', '㈚' => '(á„‘á…¡)', '㈛' => '(á„’á…¡)', '㈜' => '(주)', 'ãˆ' => '(오전)', '㈞' => '(á„‹á…©á„’á…®)', '㈠' => '(一)', '㈡' => '(二)', '㈢' => '(三)', '㈣' => '(å››)', '㈤' => '(五)', '㈥' => '(å…­)', '㈦' => '(七)', '㈧' => '(å…«)', '㈨' => '(ä¹)', '㈩' => '(å)', '㈪' => '(月)', '㈫' => '(ç«)', '㈬' => '(æ°´)', '㈭' => '(木)', '㈮' => '(金)', '㈯' => '(土)', '㈰' => '(æ—¥)', '㈱' => '(æ ª)', '㈲' => '(有)', '㈳' => '(社)', '㈴' => '(å)', '㈵' => '(特)', '㈶' => '(財)', '㈷' => '(ç¥)', '㈸' => '(労)', '㈹' => '(代)', '㈺' => '(呼)', '㈻' => '(å­¦)', '㈼' => '(監)', '㈽' => '(ä¼)', '㈾' => '(資)', '㈿' => '(å”)', '㉀' => '(祭)', 'ã‰' => '(休)', '㉂' => '(自)', '㉃' => '(至)', '㉄' => 'å•', '㉅' => 'å¹¼', '㉆' => 'æ–‡', '㉇' => 'ç®', 'ã‰' => 'PTE', '㉑' => '21', '㉒' => '22', '㉓' => '23', '㉔' => '24', '㉕' => '25', '㉖' => '26', '㉗' => '27', '㉘' => '28', '㉙' => '29', '㉚' => '30', '㉛' => '31', '㉜' => '32', 'ã‰' => '33', '㉞' => '34', '㉟' => '35', '㉠' => 'á„€', '㉡' => 'á„‚', '㉢' => 'ᄃ', '㉣' => 'á„…', '㉤' => 'ᄆ', '㉥' => 'ᄇ', '㉦' => 'ᄉ', '㉧' => 'á„‹', '㉨' => 'á„Œ', '㉩' => 'á„Ž', '㉪' => 'á„', '㉫' => 'á„', '㉬' => 'á„‘', '㉭' => 'á„’', '㉮' => '가', '㉯' => 'á„‚á…¡', '㉰' => '다', '㉱' => 'á„…á…¡', '㉲' => '마', '㉳' => '바', '㉴' => '사', '㉵' => 'á„‹á…¡', '㉶' => '자', '㉷' => 'á„Žá…¡', '㉸' => 'á„á…¡', '㉹' => 'á„á…¡', '㉺' => 'á„‘á…¡', '㉻' => 'á„’á…¡', '㉼' => '참고', '㉽' => '주의', '㉾' => 'á„‹á…®', '㊀' => '一', 'ãŠ' => '二', '㊂' => '三', '㊃' => 'å››', '㊄' => '五', '㊅' => 'å…­', '㊆' => '七', '㊇' => 'å…«', '㊈' => 'ä¹', '㊉' => 'å', '㊊' => '月', '㊋' => 'ç«', '㊌' => 'æ°´', 'ãŠ' => '木', '㊎' => '金', 'ãŠ' => '土', 'ãŠ' => 'æ—¥', '㊑' => 'æ ª', '㊒' => '有', '㊓' => '社', '㊔' => 'å', '㊕' => '特', '㊖' => '財', '㊗' => 'ç¥', '㊘' => '労', '㊙' => '秘', '㊚' => 'ç”·', '㊛' => '女', '㊜' => 'é©', 'ãŠ' => '優', '㊞' => 'å°', '㊟' => '注', '㊠' => 'é …', '㊡' => '休', '㊢' => '写', '㊣' => 'æ­£', '㊤' => '上', '㊥' => '中', '㊦' => '下', '㊧' => 'å·¦', '㊨' => 'å³', '㊩' => '医', '㊪' => 'å®—', '㊫' => 'å­¦', '㊬' => '監', '㊭' => 'ä¼', '㊮' => '資', '㊯' => 'å”', '㊰' => '夜', '㊱' => '36', '㊲' => '37', '㊳' => '38', '㊴' => '39', '㊵' => '40', '㊶' => '41', '㊷' => '42', '㊸' => '43', '㊹' => '44', '㊺' => '45', '㊻' => '46', '㊼' => '47', '㊽' => '48', '㊾' => '49', '㊿' => '50', 'ã‹€' => '1月', 'ã‹' => '2月', 'ã‹‚' => '3月', '㋃' => '4月', 'ã‹„' => '5月', 'ã‹…' => '6月', '㋆' => '7月', '㋇' => '8月', '㋈' => '9月', '㋉' => '10月', 'ã‹Š' => '11月', 'ã‹‹' => '12月', 'ã‹Œ' => 'Hg', 'ã‹' => 'erg', 'ã‹Ž' => 'eV', 'ã‹' => 'LTD', 'ã‹' => 'ã‚¢', 'ã‹‘' => 'イ', 'ã‹’' => 'ウ', 'ã‹“' => 'エ', 'ã‹”' => 'オ', 'ã‹•' => 'ã‚«', 'ã‹–' => 'ã‚­', 'ã‹—' => 'ク', '㋘' => 'ケ', 'ã‹™' => 'コ', 'ã‹š' => 'サ', 'ã‹›' => 'ã‚·', 'ã‹œ' => 'ス', 'ã‹' => 'ã‚»', 'ã‹ž' => 'ソ', 'ã‹Ÿ' => 'ã‚¿', 'ã‹ ' => 'ãƒ', 'ã‹¡' => 'ツ', 'ã‹¢' => 'テ', 'ã‹£' => 'ト', '㋤' => 'ナ', 'ã‹¥' => 'ニ', '㋦' => 'ヌ', '㋧' => 'ãƒ', '㋨' => 'ノ', 'ã‹©' => 'ãƒ', '㋪' => 'ヒ', 'ã‹«' => 'フ', '㋬' => 'ヘ', 'ã‹­' => 'ホ', 'ã‹®' => 'マ', '㋯' => 'ミ', 'ã‹°' => 'ム', '㋱' => 'メ', '㋲' => 'モ', '㋳' => 'ヤ', 'ã‹´' => 'ユ', '㋵' => 'ヨ', '㋶' => 'ラ', 'ã‹·' => 'リ', '㋸' => 'ル', '㋹' => 'レ', '㋺' => 'ロ', 'ã‹»' => 'ワ', '㋼' => 'ヰ', '㋽' => 'ヱ', '㋾' => 'ヲ', 'ã‹¿' => '令和', '㌀' => 'ã‚¢ãƒã‚šãƒ¼ãƒˆ', 'ãŒ' => 'アルファ', '㌂' => 'アンペア', '㌃' => 'アール', '㌄' => 'イニング', '㌅' => 'インãƒ', '㌆' => 'ウォン', '㌇' => 'エスクード', '㌈' => 'エーカー', '㌉' => 'オンス', '㌊' => 'オーム', '㌋' => 'カイリ', '㌌' => 'カラット', 'ãŒ' => 'カロリー', '㌎' => 'ガロン', 'ãŒ' => 'ガンマ', 'ãŒ' => 'ギガ', '㌑' => 'ギニー', '㌒' => 'キュリー', '㌓' => 'ギルダー', '㌔' => 'キロ', '㌕' => 'キログラム', '㌖' => 'キロメートル', '㌗' => 'キロワット', '㌘' => 'グラム', '㌙' => 'グラムトン', '㌚' => 'クルゼイロ', '㌛' => 'クローãƒ', '㌜' => 'ケース', 'ãŒ' => 'コルナ', '㌞' => 'コーポ', '㌟' => 'サイクル', '㌠' => 'サンãƒãƒ¼ãƒ ', '㌡' => 'シリング', '㌢' => 'センãƒ', '㌣' => 'セント', '㌤' => 'ダース', '㌥' => 'デシ', '㌦' => 'ドル', '㌧' => 'トン', '㌨' => 'ナノ', '㌩' => 'ノット', '㌪' => 'ãƒã‚¤ãƒ„', '㌫' => 'ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ', '㌬' => 'ãƒã‚šãƒ¼ãƒ„', '㌭' => 'ãƒã‚™ãƒ¼ãƒ¬ãƒ«', '㌮' => 'ピアストル', '㌯' => 'ピクル', '㌰' => 'ピコ', '㌱' => 'ビル', '㌲' => 'ファラッド', '㌳' => 'フィート', '㌴' => 'ブッシェル', '㌵' => 'フラン', '㌶' => 'ヘクタール', '㌷' => 'ペソ', '㌸' => 'ペニヒ', '㌹' => 'ヘルツ', '㌺' => 'ペンス', '㌻' => 'ページ', '㌼' => 'ベータ', '㌽' => 'ポイント', '㌾' => 'ボルト', '㌿' => 'ホン', 'ã€' => 'ポンド', 'ã' => 'ホール', 'ã‚' => 'ホーン', 'ãƒ' => 'マイクロ', 'ã„' => 'マイル', 'ã…' => 'マッãƒ', 'ã†' => 'マルク', 'ã‡' => 'マンション', 'ãˆ' => 'ミクロン', 'ã‰' => 'ミリ', 'ãŠ' => 'ミリãƒã‚™ãƒ¼ãƒ«', 'ã‹' => 'メガ', 'ãŒ' => 'メガトン', 'ã' => 'メートル', 'ãŽ' => 'ヤード', 'ã' => 'ヤール', 'ã' => 'ユアン', 'ã‘' => 'リットル', 'ã’' => 'リラ', 'ã“' => 'ルピー', 'ã”' => 'ルーブル', 'ã•' => 'レム', 'ã–' => 'レントゲン', 'ã—' => 'ワット', 'ã˜' => '0点', 'ã™' => '1点', 'ãš' => '2点', 'ã›' => '3点', 'ãœ' => '4点', 'ã' => '5点', 'ãž' => '6点', 'ãŸ' => '7点', 'ã ' => '8点', 'ã¡' => '9点', 'ã¢' => '10点', 'ã£' => '11点', 'ã¤' => '12点', 'ã¥' => '13点', 'ã¦' => '14点', 'ã§' => '15点', 'ã¨' => '16点', 'ã©' => '17点', 'ãª' => '18点', 'ã«' => '19点', 'ã¬' => '20点', 'ã­' => '21点', 'ã®' => '22点', 'ã¯' => '23点', 'ã°' => '24点', 'ã±' => 'hPa', 'ã²' => 'da', 'ã³' => 'AU', 'ã´' => 'bar', 'ãµ' => 'oV', 'ã¶' => 'pc', 'ã·' => 'dm', 'ã¸' => 'dm2', 'ã¹' => 'dm3', 'ãº' => 'IU', 'ã»' => 'å¹³æˆ', 'ã¼' => '昭和', 'ã½' => '大正', 'ã¾' => '明治', 'ã¿' => 'æ ªå¼ä¼šç¤¾', '㎀' => 'pA', 'ãŽ' => 'nA', '㎂' => 'μA', '㎃' => 'mA', '㎄' => 'kA', '㎅' => 'KB', '㎆' => 'MB', '㎇' => 'GB', '㎈' => 'cal', '㎉' => 'kcal', '㎊' => 'pF', '㎋' => 'nF', '㎌' => 'μF', 'ãŽ' => 'μg', '㎎' => 'mg', 'ãŽ' => 'kg', 'ãŽ' => 'Hz', '㎑' => 'kHz', '㎒' => 'MHz', '㎓' => 'GHz', '㎔' => 'THz', '㎕' => 'μl', '㎖' => 'ml', '㎗' => 'dl', '㎘' => 'kl', '㎙' => 'fm', '㎚' => 'nm', '㎛' => 'μm', '㎜' => 'mm', 'ãŽ' => 'cm', '㎞' => 'km', '㎟' => 'mm2', '㎠' => 'cm2', '㎡' => 'm2', '㎢' => 'km2', '㎣' => 'mm3', '㎤' => 'cm3', '㎥' => 'm3', '㎦' => 'km3', '㎧' => 'm∕s', '㎨' => 'm∕s2', '㎩' => 'Pa', '㎪' => 'kPa', '㎫' => 'MPa', '㎬' => 'GPa', '㎭' => 'rad', '㎮' => 'rad∕s', '㎯' => 'rad∕s2', '㎰' => 'ps', '㎱' => 'ns', '㎲' => 'μs', '㎳' => 'ms', '㎴' => 'pV', '㎵' => 'nV', '㎶' => 'μV', '㎷' => 'mV', '㎸' => 'kV', '㎹' => 'MV', '㎺' => 'pW', '㎻' => 'nW', '㎼' => 'μW', '㎽' => 'mW', '㎾' => 'kW', '㎿' => 'MW', 'ã€' => 'kΩ', 'ã' => 'MΩ', 'ã‚' => 'a.m.', 'ãƒ' => 'Bq', 'ã„' => 'cc', 'ã…' => 'cd', 'ã†' => 'C∕kg', 'ã‡' => 'Co.', 'ãˆ' => 'dB', 'ã‰' => 'Gy', 'ãŠ' => 'ha', 'ã‹' => 'HP', 'ãŒ' => 'in', 'ã' => 'KK', 'ãŽ' => 'KM', 'ã' => 'kt', 'ã' => 'lm', 'ã‘' => 'ln', 'ã’' => 'log', 'ã“' => 'lx', 'ã”' => 'mb', 'ã•' => 'mil', 'ã–' => 'mol', 'ã—' => 'PH', 'ã˜' => 'p.m.', 'ã™' => 'PPM', 'ãš' => 'PR', 'ã›' => 'sr', 'ãœ' => 'Sv', 'ã' => 'Wb', 'ãž' => 'V∕m', 'ãŸ' => 'A∕m', 'ã ' => '1æ—¥', 'ã¡' => '2æ—¥', 'ã¢' => '3æ—¥', 'ã£' => '4æ—¥', 'ã¤' => '5æ—¥', 'ã¥' => '6æ—¥', 'ã¦' => '7æ—¥', 'ã§' => '8æ—¥', 'ã¨' => '9æ—¥', 'ã©' => '10æ—¥', 'ãª' => '11æ—¥', 'ã«' => '12æ—¥', 'ã¬' => '13æ—¥', 'ã­' => '14æ—¥', 'ã®' => '15æ—¥', 'ã¯' => '16æ—¥', 'ã°' => '17æ—¥', 'ã±' => '18æ—¥', 'ã²' => '19æ—¥', 'ã³' => '20æ—¥', 'ã´' => '21æ—¥', 'ãµ' => '22æ—¥', 'ã¶' => '23æ—¥', 'ã·' => '24æ—¥', 'ã¸' => '25æ—¥', 'ã¹' => '26æ—¥', 'ãº' => '27æ—¥', 'ã»' => '28æ—¥', 'ã¼' => '29æ—¥', 'ã½' => '30æ—¥', 'ã¾' => '31æ—¥', 'ã¿' => 'gal', 'êšœ' => 'ÑŠ', 'êš' => 'ÑŒ', 'ê°' => 'ê¯', 'ꟸ' => 'Ħ', 'ꟹ' => 'Å“', 'ê­œ' => 'ꜧ', 'ê­' => 'ꬷ', 'ê­ž' => 'É«', 'ê­Ÿ' => 'ê­’', 'ê­©' => 'Ê', 'ff' => 'ff', 'ï¬' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'Õ´Õ¶', 'ﬔ' => 'Õ´Õ¥', 'ﬕ' => 'Õ´Õ«', 'ﬖ' => 'Õ¾Õ¶', 'ﬗ' => 'Õ´Õ­', 'ﬠ' => '×¢', 'ﬡ' => '×', 'ﬢ' => 'ד', 'ﬣ' => '×”', 'ﬤ' => '×›', 'ﬥ' => 'ל', 'ﬦ' => '×', 'ﬧ' => 'ר', 'ﬨ' => 'ת', '﬩' => '+', 'ï­' => '×ל', 'ï­' => 'Ù±', 'ï­‘' => 'Ù±', 'ï­’' => 'Ù»', 'ï­“' => 'Ù»', 'ï­”' => 'Ù»', 'ï­•' => 'Ù»', 'ï­–' => 'Ù¾', 'ï­—' => 'Ù¾', 'ï­˜' => 'Ù¾', 'ï­™' => 'Ù¾', 'ï­š' => 'Ú€', 'ï­›' => 'Ú€', 'ï­œ' => 'Ú€', 'ï­' => 'Ú€', 'ï­ž' => 'Ùº', 'ï­Ÿ' => 'Ùº', 'ï­ ' => 'Ùº', 'ï­¡' => 'Ùº', 'ï­¢' => 'Ù¿', 'ï­£' => 'Ù¿', 'ï­¤' => 'Ù¿', 'ï­¥' => 'Ù¿', 'ï­¦' => 'Ù¹', 'ï­§' => 'Ù¹', 'ï­¨' => 'Ù¹', 'ï­©' => 'Ù¹', 'ï­ª' => 'Ú¤', 'ï­«' => 'Ú¤', 'ï­¬' => 'Ú¤', 'ï­­' => 'Ú¤', 'ï­®' => 'Ú¦', 'ï­¯' => 'Ú¦', 'ï­°' => 'Ú¦', 'ï­±' => 'Ú¦', 'ï­²' => 'Ú„', 'ï­³' => 'Ú„', 'ï­´' => 'Ú„', 'ï­µ' => 'Ú„', 'ï­¶' => 'Úƒ', 'ï­·' => 'Úƒ', 'ï­¸' => 'Úƒ', 'ï­¹' => 'Úƒ', 'ï­º' => 'Ú†', 'ï­»' => 'Ú†', 'ï­¼' => 'Ú†', 'ï­½' => 'Ú†', 'ï­¾' => 'Ú‡', 'ï­¿' => 'Ú‡', 'ﮀ' => 'Ú‡', 'ï®' => 'Ú‡', 'ﮂ' => 'Ú', 'ﮃ' => 'Ú', 'ﮄ' => 'ÚŒ', 'ï®…' => 'ÚŒ', 'ﮆ' => 'ÚŽ', 'ﮇ' => 'ÚŽ', 'ﮈ' => 'Úˆ', 'ﮉ' => 'Úˆ', 'ﮊ' => 'Ú˜', 'ﮋ' => 'Ú˜', 'ﮌ' => 'Ú‘', 'ï®' => 'Ú‘', 'ﮎ' => 'Ú©', 'ï®' => 'Ú©', 'ï®' => 'Ú©', 'ﮑ' => 'Ú©', 'ï®’' => 'Ú¯', 'ﮓ' => 'Ú¯', 'ï®”' => 'Ú¯', 'ﮕ' => 'Ú¯', 'ï®–' => 'Ú³', 'ï®—' => 'Ú³', 'ﮘ' => 'Ú³', 'ï®™' => 'Ú³', 'ﮚ' => 'Ú±', 'ï®›' => 'Ú±', 'ﮜ' => 'Ú±', 'ï®' => 'Ú±', 'ﮞ' => 'Úº', 'ﮟ' => 'Úº', 'ï® ' => 'Ú»', 'ﮡ' => 'Ú»', 'ﮢ' => 'Ú»', 'ﮣ' => 'Ú»', 'ﮤ' => 'Û•Ù”', 'ﮥ' => 'Û•Ù”', 'ﮦ' => 'Û', 'ﮧ' => 'Û', 'ﮨ' => 'Û', 'ﮩ' => 'Û', 'ﮪ' => 'Ú¾', 'ﮫ' => 'Ú¾', 'ﮬ' => 'Ú¾', 'ï®­' => 'Ú¾', 'ï®®' => 'Û’', 'ﮯ' => 'Û’', 'ï®°' => 'Û’Ù”', 'ï®±' => 'Û’Ù”', 'ﯓ' => 'Ú­', 'ﯔ' => 'Ú­', 'ﯕ' => 'Ú­', 'ﯖ' => 'Ú­', 'ﯗ' => 'Û‡', 'ﯘ' => 'Û‡', 'ﯙ' => 'Û†', 'ﯚ' => 'Û†', 'ﯛ' => 'Ûˆ', 'ﯜ' => 'Ûˆ', 'ï¯' => 'Û‡Ù´', 'ﯞ' => 'Û‹', 'ﯟ' => 'Û‹', 'ﯠ' => 'Û…', 'ﯡ' => 'Û…', 'ﯢ' => 'Û‰', 'ﯣ' => 'Û‰', 'ﯤ' => 'Û', 'ﯥ' => 'Û', 'ﯦ' => 'Û', 'ﯧ' => 'Û', 'ﯨ' => 'Ù‰', 'ﯩ' => 'Ù‰', 'ﯪ' => 'ئا', 'ﯫ' => 'ئا', 'ﯬ' => 'ÙŠÙ”Û•', 'ﯭ' => 'ÙŠÙ”Û•', 'ﯮ' => 'ÙŠÙ”Ùˆ', 'ﯯ' => 'ÙŠÙ”Ùˆ', 'ﯰ' => 'ÙŠÙ”Û‡', 'ﯱ' => 'ÙŠÙ”Û‡', 'ﯲ' => 'ÙŠÙ”Û†', 'ﯳ' => 'ÙŠÙ”Û†', 'ﯴ' => 'ÙŠÙ”Ûˆ', 'ﯵ' => 'ÙŠÙ”Ûˆ', 'ﯶ' => 'ÙŠÙ”Û', 'ﯷ' => 'ÙŠÙ”Û', 'ﯸ' => 'ÙŠÙ”Û', 'ﯹ' => 'ÙŠÙ”Ù‰', 'ﯺ' => 'ÙŠÙ”Ù‰', 'ﯻ' => 'ÙŠÙ”Ù‰', 'ﯼ' => 'ÛŒ', 'ﯽ' => 'ÛŒ', 'ﯾ' => 'ÛŒ', 'ﯿ' => 'ÛŒ', 'ï°€' => 'ئج', 'ï°' => 'ئح', 'ï°‚' => 'ÙŠÙ”Ù…', 'ï°ƒ' => 'ÙŠÙ”Ù‰', 'ï°„' => 'ÙŠÙ”ÙŠ', 'ï°…' => 'بج', 'ï°†' => 'بح', 'ï°‡' => 'بخ', 'ï°ˆ' => 'بم', 'ï°‰' => 'بى', 'ï°Š' => 'بي', 'ï°‹' => 'تج', 'ï°Œ' => 'تح', 'ï°' => 'تخ', 'ï°Ž' => 'تم', 'ï°' => 'تى', 'ï°' => 'تي', 'ï°‘' => 'ثج', 'ï°’' => 'ثم', 'ï°“' => 'ثى', 'ï°”' => 'ثي', 'ï°•' => 'جح', 'ï°–' => 'جم', 'ï°—' => 'حج', 'ï°˜' => 'حم', 'ï°™' => 'خج', 'ï°š' => 'خح', 'ï°›' => 'خم', 'ï°œ' => 'سج', 'ï°' => 'سح', 'ï°ž' => 'سخ', 'ï°Ÿ' => 'سم', 'ï° ' => 'صح', 'ï°¡' => 'صم', 'ï°¢' => 'ضج', 'ï°£' => 'ضح', 'ï°¤' => 'ضخ', 'ï°¥' => 'ضم', 'ï°¦' => 'طح', 'ï°§' => 'طم', 'ï°¨' => 'ظم', 'ï°©' => 'عج', 'ï°ª' => 'عم', 'ï°«' => 'غج', 'ï°¬' => 'غم', 'ï°­' => 'Ùج', 'ï°®' => 'ÙØ­', 'ï°¯' => 'ÙØ®', 'ï°°' => 'ÙÙ…', 'ï°±' => 'ÙÙ‰', 'ï°²' => 'ÙÙŠ', 'ï°³' => 'قح', 'ï°´' => 'قم', 'ï°µ' => 'قى', 'ï°¶' => 'قي', 'ï°·' => 'كا', 'ï°¸' => 'كج', 'ï°¹' => 'كح', 'ï°º' => 'كخ', 'ï°»' => 'كل', 'ï°¼' => 'كم', 'ï°½' => 'كى', 'ï°¾' => 'كي', 'ï°¿' => 'لج', 'ï±€' => 'لح', 'ï±' => 'لخ', 'ﱂ' => 'لم', 'ﱃ' => 'لى', 'ﱄ' => 'لي', 'ï±…' => 'مج', 'ﱆ' => 'مح', 'ﱇ' => 'مخ', 'ﱈ' => 'مم', 'ﱉ' => 'مى', 'ﱊ' => 'مي', 'ﱋ' => 'نج', 'ﱌ' => 'نح', 'ï±' => 'نخ', 'ﱎ' => 'نم', 'ï±' => 'نى', 'ï±' => 'ني', 'ﱑ' => 'هج', 'ï±’' => 'هم', 'ﱓ' => 'هى', 'ï±”' => 'هي', 'ﱕ' => 'يج', 'ï±–' => 'يح', 'ï±—' => 'يخ', 'ﱘ' => 'يم', 'ï±™' => 'يى', 'ﱚ' => 'يي', 'ï±›' => 'ذٰ', 'ﱜ' => 'رٰ', 'ï±' => 'ىٰ', 'ﱞ' => ' ٌّ', 'ﱟ' => ' ÙÙ‘', 'ï± ' => ' ÙŽÙ‘', 'ﱡ' => ' ÙÙ‘', 'ï±¢' => ' ÙÙ‘', 'ï±£' => ' ّٰ', 'ﱤ' => 'ئر', 'ï±¥' => 'ئز', 'ﱦ' => 'ÙŠÙ”Ù…', 'ﱧ' => 'ÙŠÙ”Ù†', 'ﱨ' => 'ÙŠÙ”Ù‰', 'ﱩ' => 'ÙŠÙ”ÙŠ', 'ﱪ' => 'بر', 'ﱫ' => 'بز', 'ﱬ' => 'بم', 'ï±­' => 'بن', 'ï±®' => 'بى', 'ﱯ' => 'بي', 'ï±°' => 'تر', 'ï±±' => 'تز', 'ï±²' => 'تم', 'ï±³' => 'تن', 'ï±´' => 'تى', 'ï±µ' => 'تي', 'ﱶ' => 'ثر', 'ï±·' => 'ثز', 'ﱸ' => 'ثم', 'ï±¹' => 'ثن', 'ﱺ' => 'ثى', 'ï±»' => 'ثي', 'ï±¼' => 'ÙÙ‰', 'ï±½' => 'ÙÙŠ', 'ï±¾' => 'قى', 'ﱿ' => 'قي', 'ï²€' => 'كا', 'ï²' => 'كل', 'ﲂ' => 'كم', 'ﲃ' => 'كى', 'ﲄ' => 'كي', 'ï²…' => 'لم', 'ﲆ' => 'لى', 'ﲇ' => 'لي', 'ﲈ' => 'ما', 'ﲉ' => 'مم', 'ﲊ' => 'نر', 'ﲋ' => 'نز', 'ﲌ' => 'نم', 'ï²' => 'نن', 'ﲎ' => 'نى', 'ï²' => 'ني', 'ï²' => 'ىٰ', 'ﲑ' => 'ير', 'ï²’' => 'يز', 'ﲓ' => 'يم', 'ï²”' => 'ين', 'ﲕ' => 'يى', 'ï²–' => 'يي', 'ï²—' => 'ئج', 'ﲘ' => 'ئح', 'ï²™' => 'ئخ', 'ﲚ' => 'ÙŠÙ”Ù…', 'ï²›' => 'ÙŠÙ”Ù‡', 'ﲜ' => 'بج', 'ï²' => 'بح', 'ﲞ' => 'بخ', 'ﲟ' => 'بم', 'ï² ' => 'به', 'ﲡ' => 'تج', 'ï²¢' => 'تح', 'ï²£' => 'تخ', 'ﲤ' => 'تم', 'ï²¥' => 'ته', 'ﲦ' => 'ثم', 'ﲧ' => 'جح', 'ﲨ' => 'جم', 'ﲩ' => 'حج', 'ﲪ' => 'حم', 'ﲫ' => 'خج', 'ﲬ' => 'خم', 'ï²­' => 'سج', 'ï²®' => 'سح', 'ﲯ' => 'سخ', 'ï²°' => 'سم', 'ï²±' => 'صح', 'ï²²' => 'صخ', 'ï²³' => 'صم', 'ï²´' => 'ضج', 'ï²µ' => 'ضح', 'ﲶ' => 'ضخ', 'ï²·' => 'ضم', 'ﲸ' => 'طح', 'ï²¹' => 'ظم', 'ﲺ' => 'عج', 'ï²»' => 'عم', 'ï²¼' => 'غج', 'ï²½' => 'غم', 'ï²¾' => 'Ùج', 'ﲿ' => 'ÙØ­', 'ï³€' => 'ÙØ®', 'ï³' => 'ÙÙ…', 'ﳂ' => 'قح', 'ﳃ' => 'قم', 'ﳄ' => 'كج', 'ï³…' => 'كح', 'ﳆ' => 'كخ', 'ﳇ' => 'كل', 'ﳈ' => 'كم', 'ﳉ' => 'لج', 'ﳊ' => 'لح', 'ﳋ' => 'لخ', 'ﳌ' => 'لم', 'ï³' => 'له', 'ﳎ' => 'مج', 'ï³' => 'مح', 'ï³' => 'مخ', 'ﳑ' => 'مم', 'ï³’' => 'نج', 'ﳓ' => 'نح', 'ï³”' => 'نخ', 'ﳕ' => 'نم', 'ï³–' => 'نه', 'ï³—' => 'هج', 'ﳘ' => 'هم', 'ï³™' => 'هٰ', 'ﳚ' => 'يج', 'ï³›' => 'يح', 'ﳜ' => 'يخ', 'ï³' => 'يم', 'ﳞ' => 'يه', 'ﳟ' => 'ÙŠÙ”Ù…', 'ï³ ' => 'ÙŠÙ”Ù‡', 'ﳡ' => 'بم', 'ï³¢' => 'به', 'ï³£' => 'تم', 'ﳤ' => 'ته', 'ï³¥' => 'ثم', 'ﳦ' => 'ثه', 'ﳧ' => 'سم', 'ﳨ' => 'سه', 'ﳩ' => 'شم', 'ﳪ' => 'شه', 'ﳫ' => 'كل', 'ﳬ' => 'كم', 'ï³­' => 'لم', 'ï³®' => 'نم', 'ﳯ' => 'نه', 'ï³°' => 'يم', 'ï³±' => 'يه', 'ï³²' => 'Ù€ÙŽÙ‘', 'ï³³' => 'Ù€ÙÙ‘', 'ï³´' => 'Ù€ÙÙ‘', 'ï³µ' => 'طى', 'ﳶ' => 'طي', 'ï³·' => 'عى', 'ﳸ' => 'عي', 'ï³¹' => 'غى', 'ﳺ' => 'غي', 'ï³»' => 'سى', 'ï³¼' => 'سي', 'ï³½' => 'شى', 'ï³¾' => 'شي', 'ﳿ' => 'حى', 'ï´€' => 'حي', 'ï´' => 'جى', 'ï´‚' => 'جي', 'ï´ƒ' => 'خى', 'ï´„' => 'خي', 'ï´…' => 'صى', 'ï´†' => 'صي', 'ï´‡' => 'ضى', 'ï´ˆ' => 'ضي', 'ï´‰' => 'شج', 'ï´Š' => 'شح', 'ï´‹' => 'شخ', 'ï´Œ' => 'شم', 'ï´' => 'شر', 'ï´Ž' => 'سر', 'ï´' => 'صر', 'ï´' => 'ضر', 'ï´‘' => 'طى', 'ï´’' => 'طي', 'ï´“' => 'عى', 'ï´”' => 'عي', 'ï´•' => 'غى', 'ï´–' => 'غي', 'ï´—' => 'سى', 'ï´˜' => 'سي', 'ï´™' => 'شى', 'ï´š' => 'شي', 'ï´›' => 'حى', 'ï´œ' => 'حي', 'ï´' => 'جى', 'ï´ž' => 'جي', 'ï´Ÿ' => 'خى', 'ï´ ' => 'خي', 'ï´¡' => 'صى', 'ï´¢' => 'صي', 'ï´£' => 'ضى', 'ï´¤' => 'ضي', 'ï´¥' => 'شج', 'ï´¦' => 'شح', 'ï´§' => 'شخ', 'ï´¨' => 'شم', 'ï´©' => 'شر', 'ï´ª' => 'سر', 'ï´«' => 'صر', 'ï´¬' => 'ضر', 'ï´­' => 'شج', 'ï´®' => 'شح', 'ï´¯' => 'شخ', 'ï´°' => 'شم', 'ï´±' => 'سه', 'ï´²' => 'شه', 'ï´³' => 'طم', 'ï´´' => 'سج', 'ï´µ' => 'سح', 'ï´¶' => 'سخ', 'ï´·' => 'شج', 'ï´¸' => 'شح', 'ï´¹' => 'شخ', 'ï´º' => 'طم', 'ï´»' => 'ظم', 'ï´¼' => 'اً', 'ï´½' => 'اً', 'ïµ' => 'تجم', 'ﵑ' => 'تحج', 'ïµ’' => 'تحج', 'ﵓ' => 'تحم', 'ïµ”' => 'تخم', 'ﵕ' => 'تمج', 'ïµ–' => 'تمح', 'ïµ—' => 'تمخ', 'ﵘ' => 'جمح', 'ïµ™' => 'جمح', 'ﵚ' => 'حمي', 'ïµ›' => 'حمى', 'ﵜ' => 'سحج', 'ïµ' => 'سجح', 'ﵞ' => 'سجى', 'ﵟ' => 'سمح', 'ïµ ' => 'سمح', 'ﵡ' => 'سمج', 'ïµ¢' => 'سمم', 'ïµ£' => 'سمم', 'ﵤ' => 'صحح', 'ïµ¥' => 'صحح', 'ﵦ' => 'صمم', 'ﵧ' => 'شحم', 'ﵨ' => 'شحم', 'ﵩ' => 'شجي', 'ﵪ' => 'شمخ', 'ﵫ' => 'شمخ', 'ﵬ' => 'شمم', 'ïµ­' => 'شمم', 'ïµ®' => 'ضحى', 'ﵯ' => 'ضخم', 'ïµ°' => 'ضخم', 'ïµ±' => 'طمح', 'ïµ²' => 'طمح', 'ïµ³' => 'طمم', 'ïµ´' => 'طمي', 'ïµµ' => 'عجم', 'ﵶ' => 'عمم', 'ïµ·' => 'عمم', 'ﵸ' => 'عمى', 'ïµ¹' => 'غمم', 'ﵺ' => 'غمي', 'ïµ»' => 'غمى', 'ïµ¼' => 'Ùخم', 'ïµ½' => 'Ùخم', 'ïµ¾' => 'قمح', 'ﵿ' => 'قمم', 'ﶀ' => 'لحم', 'ï¶' => 'لحي', 'ﶂ' => 'لحى', 'ﶃ' => 'لجج', 'ﶄ' => 'لجج', 'ﶅ' => 'لخم', 'ﶆ' => 'لخم', 'ﶇ' => 'لمح', 'ﶈ' => 'لمح', 'ﶉ' => 'محج', 'ﶊ' => 'محم', 'ﶋ' => 'محي', 'ﶌ' => 'مجح', 'ï¶' => 'مجم', 'ﶎ' => 'مخج', 'ï¶' => 'مخم', 'ﶒ' => 'مجخ', 'ﶓ' => 'همج', 'ﶔ' => 'همم', 'ﶕ' => 'نحم', 'ﶖ' => 'نحى', 'ﶗ' => 'نجم', 'ﶘ' => 'نجم', 'ﶙ' => 'نجى', 'ﶚ' => 'نمي', 'ﶛ' => 'نمى', 'ﶜ' => 'يمم', 'ï¶' => 'يمم', 'ﶞ' => 'بخي', 'ﶟ' => 'تجي', 'ﶠ' => 'تجى', 'ﶡ' => 'تخي', 'ﶢ' => 'تخى', 'ﶣ' => 'تمي', 'ﶤ' => 'تمى', 'ﶥ' => 'جمي', 'ﶦ' => 'جحى', 'ﶧ' => 'جمى', 'ﶨ' => 'سخى', 'ﶩ' => 'صحي', 'ﶪ' => 'شحي', 'ﶫ' => 'ضحي', 'ﶬ' => 'لجي', 'ﶭ' => 'لمي', 'ﶮ' => 'يحي', 'ﶯ' => 'يجي', 'ﶰ' => 'يمي', 'ﶱ' => 'ممي', 'ﶲ' => 'قمي', 'ﶳ' => 'نحي', 'ﶴ' => 'قمح', 'ﶵ' => 'لحم', 'ﶶ' => 'عمي', 'ﶷ' => 'كمي', 'ﶸ' => 'نجح', 'ﶹ' => 'مخي', 'ﶺ' => 'لجم', 'ﶻ' => 'كمم', 'ﶼ' => 'لجم', 'ﶽ' => 'نجح', 'ﶾ' => 'جحي', 'ﶿ' => 'حجي', 'ï·€' => 'مجي', 'ï·' => 'Ùمي', 'ï·‚' => 'بحي', 'ï·ƒ' => 'كمم', 'ï·„' => 'عجم', 'ï·…' => 'صمم', 'ï·†' => 'سخي', 'ï·‡' => 'نجي', 'ï·°' => 'صلے', 'ï·±' => 'قلے', 'ï·²' => 'الله', 'ï·³' => 'اكبر', 'ï·´' => 'محمد', 'ï·µ' => 'صلعم', 'ï·¶' => 'رسول', 'ï··' => 'عليه', 'ï·¸' => 'وسلم', 'ï·¹' => 'صلى', 'ï·º' => 'صلى الله عليه وسلم', 'ï·»' => 'جل جلاله', 'ï·¼' => 'ریال', 'ï¸' => ',', '︑' => 'ã€', '︒' => '。', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︗' => '〖', '︘' => '〗', '︙' => '...', '︰' => '..', '︱' => '—', '︲' => '–', '︳' => '_', '︴' => '_', '︵' => '(', '︶' => ')', '︷' => '{', '︸' => '}', '︹' => '〔', '︺' => '〕', '︻' => 'ã€', '︼' => '】', '︽' => '《', '︾' => '》', '︿' => '〈', 'ï¹€' => '〉', 'ï¹' => '「', '﹂' => 'ã€', '﹃' => '『', '﹄' => 'ã€', '﹇' => '[', '﹈' => ']', '﹉' => ' Ì…', '﹊' => ' Ì…', '﹋' => ' Ì…', '﹌' => ' Ì…', 'ï¹' => '_', '﹎' => '_', 'ï¹' => '_', 'ï¹' => ',', '﹑' => 'ã€', 'ï¹’' => '.', 'ï¹”' => ';', '﹕' => ':', 'ï¹–' => '?', 'ï¹—' => '!', '﹘' => '—', 'ï¹™' => '(', '﹚' => ')', 'ï¹›' => '{', '﹜' => '}', 'ï¹' => '〔', '﹞' => '〕', '﹟' => '#', 'ï¹ ' => '&', '﹡' => '*', 'ï¹¢' => '+', 'ï¹£' => '-', '﹤' => '<', 'ï¹¥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', 'ï¹°' => ' Ù‹', 'ï¹±' => 'ـً', 'ï¹²' => ' ÙŒ', 'ï¹´' => ' Ù', 'ﹶ' => ' ÙŽ', 'ï¹·' => 'Ù€ÙŽ', 'ﹸ' => ' Ù', 'ï¹¹' => 'Ù€Ù', 'ﹺ' => ' Ù', 'ï¹»' => 'Ù€Ù', 'ï¹¼' => ' Ù‘', 'ï¹½' => 'ـّ', 'ï¹¾' => ' Ù’', 'ﹿ' => 'ـْ', 'ﺀ' => 'Ø¡', 'ïº' => 'آ', 'ﺂ' => 'آ', 'ﺃ' => 'أ', 'ﺄ' => 'أ', 'ﺅ' => 'ÙˆÙ”', 'ﺆ' => 'ÙˆÙ”', 'ﺇ' => 'إ', 'ﺈ' => 'إ', 'ﺉ' => 'ÙŠÙ”', 'ﺊ' => 'ÙŠÙ”', 'ﺋ' => 'ÙŠÙ”', 'ﺌ' => 'ÙŠÙ”', 'ïº' => 'ا', 'ﺎ' => 'ا', 'ïº' => 'ب', 'ïº' => 'ب', 'ﺑ' => 'ب', 'ﺒ' => 'ب', 'ﺓ' => 'Ø©', 'ﺔ' => 'Ø©', 'ﺕ' => 'ت', 'ﺖ' => 'ت', 'ﺗ' => 'ت', 'ﺘ' => 'ت', 'ﺙ' => 'Ø«', 'ﺚ' => 'Ø«', 'ﺛ' => 'Ø«', 'ﺜ' => 'Ø«', 'ïº' => 'ج', 'ﺞ' => 'ج', 'ﺟ' => 'ج', 'ﺠ' => 'ج', 'ﺡ' => 'Ø­', 'ﺢ' => 'Ø­', 'ﺣ' => 'Ø­', 'ﺤ' => 'Ø­', 'ﺥ' => 'Ø®', 'ﺦ' => 'Ø®', 'ﺧ' => 'Ø®', 'ﺨ' => 'Ø®', 'ﺩ' => 'د', 'ﺪ' => 'د', 'ﺫ' => 'Ø°', 'ﺬ' => 'Ø°', 'ﺭ' => 'ر', 'ﺮ' => 'ر', 'ﺯ' => 'ز', 'ﺰ' => 'ز', 'ﺱ' => 'س', 'ﺲ' => 'س', 'ﺳ' => 'س', 'ﺴ' => 'س', 'ﺵ' => 'Ø´', 'ﺶ' => 'Ø´', 'ﺷ' => 'Ø´', 'ﺸ' => 'Ø´', 'ﺹ' => 'ص', 'ﺺ' => 'ص', 'ﺻ' => 'ص', 'ﺼ' => 'ص', 'ﺽ' => 'ض', 'ﺾ' => 'ض', 'ﺿ' => 'ض', 'ﻀ' => 'ض', 'ï»' => 'Ø·', 'ﻂ' => 'Ø·', 'ﻃ' => 'Ø·', 'ﻄ' => 'Ø·', 'ï»…' => 'ظ', 'ﻆ' => 'ظ', 'ﻇ' => 'ظ', 'ﻈ' => 'ظ', 'ﻉ' => 'ع', 'ﻊ' => 'ع', 'ﻋ' => 'ع', 'ﻌ' => 'ع', 'ï»' => 'غ', 'ﻎ' => 'غ', 'ï»' => 'غ', 'ï»' => 'غ', 'ﻑ' => 'Ù', 'ï»’' => 'Ù', 'ﻓ' => 'Ù', 'ï»”' => 'Ù', 'ﻕ' => 'Ù‚', 'ï»–' => 'Ù‚', 'ï»—' => 'Ù‚', 'ﻘ' => 'Ù‚', 'ï»™' => 'Ùƒ', 'ﻚ' => 'Ùƒ', 'ï»›' => 'Ùƒ', 'ﻜ' => 'Ùƒ', 'ï»' => 'Ù„', 'ﻞ' => 'Ù„', 'ﻟ' => 'Ù„', 'ï» ' => 'Ù„', 'ﻡ' => 'Ù…', 'ﻢ' => 'Ù…', 'ﻣ' => 'Ù…', 'ﻤ' => 'Ù…', 'ﻥ' => 'Ù†', 'ﻦ' => 'Ù†', 'ﻧ' => 'Ù†', 'ﻨ' => 'Ù†', 'ﻩ' => 'Ù‡', 'ﻪ' => 'Ù‡', 'ﻫ' => 'Ù‡', 'ﻬ' => 'Ù‡', 'ï»­' => 'Ùˆ', 'ï»®' => 'Ùˆ', 'ﻯ' => 'Ù‰', 'ï»°' => 'Ù‰', 'ï»±' => 'ÙŠ', 'ﻲ' => 'ÙŠ', 'ﻳ' => 'ÙŠ', 'ï»´' => 'ÙŠ', 'ﻵ' => 'لآ', 'ﻶ' => 'لآ', 'ï»·' => 'لأ', 'ﻸ' => 'لأ', 'ﻹ' => 'لإ', 'ﻺ' => 'لإ', 'ï»»' => 'لا', 'ﻼ' => 'لا', 'ï¼' => '!', '"' => '"', '#' => '#', '$' => '$', 'ï¼…' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', 'ï¼' => '-', '.' => '.', 'ï¼' => '/', 'ï¼' => '0', '1' => '1', 'ï¼’' => '2', '3' => '3', 'ï¼”' => '4', '5' => '5', 'ï¼–' => '6', 'ï¼—' => '7', '8' => '8', 'ï¼™' => '9', ':' => ':', 'ï¼›' => ';', '<' => '<', 'ï¼' => '=', '>' => '>', '?' => '?', 'ï¼ ' => '@', 'A' => 'A', 'ï¼¢' => 'B', 'ï¼£' => 'C', 'D' => 'D', 'ï¼¥' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'ï¼­' => 'M', 'ï¼®' => 'N', 'O' => 'O', 'ï¼°' => 'P', 'ï¼±' => 'Q', 'ï¼²' => 'R', 'ï¼³' => 'S', 'ï¼´' => 'T', 'ï¼µ' => 'U', 'V' => 'V', 'ï¼·' => 'W', 'X' => 'X', 'ï¼¹' => 'Y', 'Z' => 'Z', 'ï¼»' => '[', 'ï¼¼' => '\\', 'ï¼½' => ']', 'ï¼¾' => '^', '_' => '_', 'ï½€' => '`', 'ï½' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'ï½…' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'ï½' => 'm', 'n' => 'n', 'ï½' => 'o', 'ï½' => 'p', 'q' => 'q', 'ï½’' => 'r', 's' => 's', 'ï½”' => 't', 'u' => 'u', 'ï½–' => 'v', 'ï½—' => 'w', 'x' => 'x', 'ï½™' => 'y', 'z' => 'z', 'ï½›' => '{', '|' => '|', 'ï½' => '}', '~' => '~', '⦅' => '⦅', 'ï½ ' => '⦆', '。' => '。', 'ï½¢' => '「', 'ï½£' => 'ã€', '、' => 'ã€', 'ï½¥' => '・', 'ヲ' => 'ヲ', 'ァ' => 'ã‚¡', 'ィ' => 'ã‚£', 'ゥ' => 'ã‚¥', 'ェ' => 'ェ', 'ォ' => 'ã‚©', 'ャ' => 'ャ', 'ï½­' => 'ュ', 'ï½®' => 'ョ', 'ッ' => 'ッ', 'ï½°' => 'ー', 'ï½±' => 'ã‚¢', 'ï½²' => 'イ', 'ï½³' => 'ウ', 'ï½´' => 'エ', 'ï½µ' => 'オ', 'カ' => 'ã‚«', 'ï½·' => 'ã‚­', 'ク' => 'ク', 'ï½¹' => 'ケ', 'コ' => 'コ', 'ï½»' => 'サ', 'ï½¼' => 'ã‚·', 'ï½½' => 'ス', 'ï½¾' => 'ã‚»', 'ソ' => 'ソ', 'ï¾€' => 'ã‚¿', 'ï¾' => 'ãƒ', 'ツ' => 'ツ', 'テ' => 'テ', 'ト' => 'ト', 'ï¾…' => 'ナ', 'ニ' => 'ニ', 'ヌ' => 'ヌ', 'ネ' => 'ãƒ', 'ノ' => 'ノ', 'ハ' => 'ãƒ', 'ヒ' => 'ヒ', 'フ' => 'フ', 'ï¾' => 'ヘ', 'ホ' => 'ホ', 'ï¾' => 'マ', 'ï¾' => 'ミ', 'ム' => 'ム', 'ï¾’' => 'メ', 'モ' => 'モ', 'ï¾”' => 'ヤ', 'ユ' => 'ユ', 'ï¾–' => 'ヨ', 'ï¾—' => 'ラ', 'リ' => 'リ', 'ï¾™' => 'ル', 'レ' => 'レ', 'ï¾›' => 'ロ', 'ワ' => 'ワ', 'ï¾' => 'ン', '゙' => 'ã‚™', '゚' => 'ã‚š', 'ï¾ ' => 'á… ', 'ᄀ' => 'á„€', 'ï¾¢' => 'á„', 'ï¾£' => 'ᆪ', 'ᄂ' => 'á„‚', 'ï¾¥' => 'ᆬ', 'ᆭ' => 'ᆭ', 'ᄃ' => 'ᄃ', 'ᄄ' => 'á„„', 'ᄅ' => 'á„…', 'ᆰ' => 'ᆰ', 'ᆱ' => 'ᆱ', 'ᆲ' => 'ᆲ', 'ï¾­' => 'ᆳ', 'ï¾®' => 'ᆴ', 'ᆵ' => 'ᆵ', 'ï¾°' => 'á„š', 'ï¾±' => 'ᄆ', 'ï¾²' => 'ᄇ', 'ï¾³' => 'ᄈ', 'ï¾´' => 'á„¡', 'ï¾µ' => 'ᄉ', 'ᄊ' => 'á„Š', 'ï¾·' => 'á„‹', 'ᄌ' => 'á„Œ', 'ï¾¹' => 'á„', 'ᄎ' => 'á„Ž', 'ï¾»' => 'á„', 'ï¾¼' => 'á„', 'ï¾½' => 'á„‘', 'ï¾¾' => 'á„’', 'ï¿‚' => 'á…¡', 'ᅢ' => 'á…¢', 'ï¿„' => 'á…£', 'ï¿…' => 'á…¤', 'ᅥ' => 'á…¥', 'ᅦ' => 'á…¦', 'ï¿Š' => 'á…§', 'ï¿‹' => 'á…¨', 'ï¿Œ' => 'á…©', 'ï¿' => 'á…ª', 'ï¿Ž' => 'á…«', 'ï¿' => 'á…¬', 'ï¿’' => 'á…­', 'ï¿“' => 'á…®', 'ï¿”' => 'á…¯', 'ï¿•' => 'á…°', 'ï¿–' => 'á…±', 'ï¿—' => 'á…²', 'ï¿š' => 'á…³', 'ï¿›' => 'á…´', 'ï¿œ' => 'á…µ', 'ï¿ ' => '¢', 'ï¿¡' => '£', 'ï¿¢' => '¬', 'ï¿£' => ' Ì„', '¦' => '¦', 'ï¿¥' => 'Â¥', '₩' => 'â‚©', '│' => '│', 'ï¿©' => 'â†', '↑' => '↑', 'ï¿«' => '→', '↓' => '↓', 'ï¿­' => 'â– ', 'ï¿®' => 'â—‹', 'ð€' => 'A', 'ð' => 'B', 'ð‚' => 'C', 'ðƒ' => 'D', 'ð„' => 'E', 'ð…' => 'F', 'ð†' => 'G', 'ð‡' => 'H', 'ðˆ' => 'I', 'ð‰' => 'J', 'ðŠ' => 'K', 'ð‹' => 'L', 'ðŒ' => 'M', 'ð' => 'N', 'ðŽ' => 'O', 'ð' => 'P', 'ð' => 'Q', 'ð‘' => 'R', 'ð’' => 'S', 'ð“' => 'T', 'ð”' => 'U', 'ð•' => 'V', 'ð–' => 'W', 'ð—' => 'X', 'ð˜' => 'Y', 'ð™' => 'Z', 'ðš' => 'a', 'ð›' => 'b', 'ðœ' => 'c', 'ð' => 'd', 'ðž' => 'e', 'ðŸ' => 'f', 'ð ' => 'g', 'ð¡' => 'h', 'ð¢' => 'i', 'ð£' => 'j', 'ð¤' => 'k', 'ð¥' => 'l', 'ð¦' => 'm', 'ð§' => 'n', 'ð¨' => 'o', 'ð©' => 'p', 'ðª' => 'q', 'ð«' => 'r', 'ð¬' => 's', 'ð­' => 't', 'ð®' => 'u', 'ð¯' => 'v', 'ð°' => 'w', 'ð±' => 'x', 'ð²' => 'y', 'ð³' => 'z', 'ð´' => 'A', 'ðµ' => 'B', 'ð¶' => 'C', 'ð·' => 'D', 'ð¸' => 'E', 'ð¹' => 'F', 'ðº' => 'G', 'ð»' => 'H', 'ð¼' => 'I', 'ð½' => 'J', 'ð¾' => 'K', 'ð¿' => 'L', 'ð‘€' => 'M', 'ð‘' => 'N', 'ð‘‚' => 'O', 'ð‘ƒ' => 'P', 'ð‘„' => 'Q', 'ð‘…' => 'R', 'ð‘†' => 'S', 'ð‘‡' => 'T', 'ð‘ˆ' => 'U', 'ð‘‰' => 'V', 'ð‘Š' => 'W', 'ð‘‹' => 'X', 'ð‘Œ' => 'Y', 'ð‘' => 'Z', 'ð‘Ž' => 'a', 'ð‘' => 'b', 'ð‘' => 'c', 'ð‘‘' => 'd', 'ð‘’' => 'e', 'ð‘“' => 'f', 'ð‘”' => 'g', 'ð‘–' => 'i', 'ð‘—' => 'j', 'ð‘˜' => 'k', 'ð‘™' => 'l', 'ð‘š' => 'm', 'ð‘›' => 'n', 'ð‘œ' => 'o', 'ð‘' => 'p', 'ð‘ž' => 'q', 'ð‘Ÿ' => 'r', 'ð‘ ' => 's', 'ð‘¡' => 't', 'ð‘¢' => 'u', 'ð‘£' => 'v', 'ð‘¤' => 'w', 'ð‘¥' => 'x', 'ð‘¦' => 'y', 'ð‘§' => 'z', 'ð‘¨' => 'A', 'ð‘©' => 'B', 'ð‘ª' => 'C', 'ð‘«' => 'D', 'ð‘¬' => 'E', 'ð‘­' => 'F', 'ð‘®' => 'G', 'ð‘¯' => 'H', 'ð‘°' => 'I', 'ð‘±' => 'J', 'ð‘²' => 'K', 'ð‘³' => 'L', 'ð‘´' => 'M', 'ð‘µ' => 'N', 'ð‘¶' => 'O', 'ð‘·' => 'P', 'ð‘¸' => 'Q', 'ð‘¹' => 'R', 'ð‘º' => 'S', 'ð‘»' => 'T', 'ð‘¼' => 'U', 'ð‘½' => 'V', 'ð‘¾' => 'W', 'ð‘¿' => 'X', 'ð’€' => 'Y', 'ð’' => 'Z', 'ð’‚' => 'a', 'ð’ƒ' => 'b', 'ð’„' => 'c', 'ð’…' => 'd', 'ð’†' => 'e', 'ð’‡' => 'f', 'ð’ˆ' => 'g', 'ð’‰' => 'h', 'ð’Š' => 'i', 'ð’‹' => 'j', 'ð’Œ' => 'k', 'ð’' => 'l', 'ð’Ž' => 'm', 'ð’' => 'n', 'ð’' => 'o', 'ð’‘' => 'p', 'ð’’' => 'q', 'ð’“' => 'r', 'ð’”' => 's', 'ð’•' => 't', 'ð’–' => 'u', 'ð’—' => 'v', 'ð’˜' => 'w', 'ð’™' => 'x', 'ð’š' => 'y', 'ð’›' => 'z', 'ð’œ' => 'A', 'ð’ž' => 'C', 'ð’Ÿ' => 'D', 'ð’¢' => 'G', 'ð’¥' => 'J', 'ð’¦' => 'K', 'ð’©' => 'N', 'ð’ª' => 'O', 'ð’«' => 'P', 'ð’¬' => 'Q', 'ð’®' => 'S', 'ð’¯' => 'T', 'ð’°' => 'U', 'ð’±' => 'V', 'ð’²' => 'W', 'ð’³' => 'X', 'ð’´' => 'Y', 'ð’µ' => 'Z', 'ð’¶' => 'a', 'ð’·' => 'b', 'ð’¸' => 'c', 'ð’¹' => 'd', 'ð’»' => 'f', 'ð’½' => 'h', 'ð’¾' => 'i', 'ð’¿' => 'j', 'ð“€' => 'k', 'ð“' => 'l', 'ð“‚' => 'm', 'ð“ƒ' => 'n', 'ð“…' => 'p', 'ð“†' => 'q', 'ð“‡' => 'r', 'ð“ˆ' => 's', 'ð“‰' => 't', 'ð“Š' => 'u', 'ð“‹' => 'v', 'ð“Œ' => 'w', 'ð“' => 'x', 'ð“Ž' => 'y', 'ð“' => 'z', 'ð“' => 'A', 'ð“‘' => 'B', 'ð“’' => 'C', 'ð““' => 'D', 'ð“”' => 'E', 'ð“•' => 'F', 'ð“–' => 'G', 'ð“—' => 'H', 'ð“˜' => 'I', 'ð“™' => 'J', 'ð“š' => 'K', 'ð“›' => 'L', 'ð“œ' => 'M', 'ð“' => 'N', 'ð“ž' => 'O', 'ð“Ÿ' => 'P', 'ð“ ' => 'Q', 'ð“¡' => 'R', 'ð“¢' => 'S', 'ð“£' => 'T', 'ð“¤' => 'U', 'ð“¥' => 'V', 'ð“¦' => 'W', 'ð“§' => 'X', 'ð“¨' => 'Y', 'ð“©' => 'Z', 'ð“ª' => 'a', 'ð“«' => 'b', 'ð“¬' => 'c', 'ð“­' => 'd', 'ð“®' => 'e', 'ð“¯' => 'f', 'ð“°' => 'g', 'ð“±' => 'h', 'ð“²' => 'i', 'ð“³' => 'j', 'ð“´' => 'k', 'ð“µ' => 'l', 'ð“¶' => 'm', 'ð“·' => 'n', 'ð“¸' => 'o', 'ð“¹' => 'p', 'ð“º' => 'q', 'ð“»' => 'r', 'ð“¼' => 's', 'ð“½' => 't', 'ð“¾' => 'u', 'ð“¿' => 'v', 'ð”€' => 'w', 'ð”' => 'x', 'ð”‚' => 'y', 'ð”ƒ' => 'z', 'ð”„' => 'A', 'ð”…' => 'B', 'ð”‡' => 'D', 'ð”ˆ' => 'E', 'ð”‰' => 'F', 'ð”Š' => 'G', 'ð”' => 'J', 'ð”Ž' => 'K', 'ð”' => 'L', 'ð”' => 'M', 'ð”‘' => 'N', 'ð”’' => 'O', 'ð”“' => 'P', 'ð””' => 'Q', 'ð”–' => 'S', 'ð”—' => 'T', 'ð”˜' => 'U', 'ð”™' => 'V', 'ð”š' => 'W', 'ð”›' => 'X', 'ð”œ' => 'Y', 'ð”ž' => 'a', 'ð”Ÿ' => 'b', 'ð” ' => 'c', 'ð”¡' => 'd', 'ð”¢' => 'e', 'ð”£' => 'f', 'ð”¤' => 'g', 'ð”¥' => 'h', 'ð”¦' => 'i', 'ð”§' => 'j', 'ð”¨' => 'k', 'ð”©' => 'l', 'ð”ª' => 'm', 'ð”«' => 'n', 'ð”¬' => 'o', 'ð”­' => 'p', 'ð”®' => 'q', 'ð”¯' => 'r', 'ð”°' => 's', 'ð”±' => 't', 'ð”²' => 'u', 'ð”³' => 'v', 'ð”´' => 'w', 'ð”µ' => 'x', 'ð”¶' => 'y', 'ð”·' => 'z', 'ð”¸' => 'A', 'ð”¹' => 'B', 'ð”»' => 'D', 'ð”¼' => 'E', 'ð”½' => 'F', 'ð”¾' => 'G', 'ð•€' => 'I', 'ð•' => 'J', 'ð•‚' => 'K', 'ð•ƒ' => 'L', 'ð•„' => 'M', 'ð•†' => 'O', 'ð•Š' => 'S', 'ð•‹' => 'T', 'ð•Œ' => 'U', 'ð•' => 'V', 'ð•Ž' => 'W', 'ð•' => 'X', 'ð•' => 'Y', 'ð•’' => 'a', 'ð•“' => 'b', 'ð•”' => 'c', 'ð••' => 'd', 'ð•–' => 'e', 'ð•—' => 'f', 'ð•˜' => 'g', 'ð•™' => 'h', 'ð•š' => 'i', 'ð•›' => 'j', 'ð•œ' => 'k', 'ð•' => 'l', 'ð•ž' => 'm', 'ð•Ÿ' => 'n', 'ð• ' => 'o', 'ð•¡' => 'p', 'ð•¢' => 'q', 'ð•£' => 'r', 'ð•¤' => 's', 'ð•¥' => 't', 'ð•¦' => 'u', 'ð•§' => 'v', 'ð•¨' => 'w', 'ð•©' => 'x', 'ð•ª' => 'y', 'ð•«' => 'z', 'ð•¬' => 'A', 'ð•­' => 'B', 'ð•®' => 'C', 'ð•¯' => 'D', 'ð•°' => 'E', 'ð•±' => 'F', 'ð•²' => 'G', 'ð•³' => 'H', 'ð•´' => 'I', 'ð•µ' => 'J', 'ð•¶' => 'K', 'ð•·' => 'L', 'ð•¸' => 'M', 'ð•¹' => 'N', 'ð•º' => 'O', 'ð•»' => 'P', 'ð•¼' => 'Q', 'ð•½' => 'R', 'ð•¾' => 'S', 'ð•¿' => 'T', 'ð–€' => 'U', 'ð–' => 'V', 'ð–‚' => 'W', 'ð–ƒ' => 'X', 'ð–„' => 'Y', 'ð–…' => 'Z', 'ð–†' => 'a', 'ð–‡' => 'b', 'ð–ˆ' => 'c', 'ð–‰' => 'd', 'ð–Š' => 'e', 'ð–‹' => 'f', 'ð–Œ' => 'g', 'ð–' => 'h', 'ð–Ž' => 'i', 'ð–' => 'j', 'ð–' => 'k', 'ð–‘' => 'l', 'ð–’' => 'm', 'ð–“' => 'n', 'ð–”' => 'o', 'ð–•' => 'p', 'ð––' => 'q', 'ð–—' => 'r', 'ð–˜' => 's', 'ð–™' => 't', 'ð–š' => 'u', 'ð–›' => 'v', 'ð–œ' => 'w', 'ð–' => 'x', 'ð–ž' => 'y', 'ð–Ÿ' => 'z', 'ð– ' => 'A', 'ð–¡' => 'B', 'ð–¢' => 'C', 'ð–£' => 'D', 'ð–¤' => 'E', 'ð–¥' => 'F', 'ð–¦' => 'G', 'ð–§' => 'H', 'ð–¨' => 'I', 'ð–©' => 'J', 'ð–ª' => 'K', 'ð–«' => 'L', 'ð–¬' => 'M', 'ð–­' => 'N', 'ð–®' => 'O', 'ð–¯' => 'P', 'ð–°' => 'Q', 'ð–±' => 'R', 'ð–²' => 'S', 'ð–³' => 'T', 'ð–´' => 'U', 'ð–µ' => 'V', 'ð–¶' => 'W', 'ð–·' => 'X', 'ð–¸' => 'Y', 'ð–¹' => 'Z', 'ð–º' => 'a', 'ð–»' => 'b', 'ð–¼' => 'c', 'ð–½' => 'd', 'ð–¾' => 'e', 'ð–¿' => 'f', 'ð—€' => 'g', 'ð—' => 'h', 'ð—‚' => 'i', 'ð—ƒ' => 'j', 'ð—„' => 'k', 'ð—…' => 'l', 'ð—†' => 'm', 'ð—‡' => 'n', 'ð—ˆ' => 'o', 'ð—‰' => 'p', 'ð—Š' => 'q', 'ð—‹' => 'r', 'ð—Œ' => 's', 'ð—' => 't', 'ð—Ž' => 'u', 'ð—' => 'v', 'ð—' => 'w', 'ð—‘' => 'x', 'ð—’' => 'y', 'ð—“' => 'z', 'ð—”' => 'A', 'ð—•' => 'B', 'ð—–' => 'C', 'ð——' => 'D', 'ð—˜' => 'E', 'ð—™' => 'F', 'ð—š' => 'G', 'ð—›' => 'H', 'ð—œ' => 'I', 'ð—' => 'J', 'ð—ž' => 'K', 'ð—Ÿ' => 'L', 'ð— ' => 'M', 'ð—¡' => 'N', 'ð—¢' => 'O', 'ð—£' => 'P', 'ð—¤' => 'Q', 'ð—¥' => 'R', 'ð—¦' => 'S', 'ð—§' => 'T', 'ð—¨' => 'U', 'ð—©' => 'V', 'ð—ª' => 'W', 'ð—«' => 'X', 'ð—¬' => 'Y', 'ð—­' => 'Z', 'ð—®' => 'a', 'ð—¯' => 'b', 'ð—°' => 'c', 'ð—±' => 'd', 'ð—²' => 'e', 'ð—³' => 'f', 'ð—´' => 'g', 'ð—µ' => 'h', 'ð—¶' => 'i', 'ð—·' => 'j', 'ð—¸' => 'k', 'ð—¹' => 'l', 'ð—º' => 'm', 'ð—»' => 'n', 'ð—¼' => 'o', 'ð—½' => 'p', 'ð—¾' => 'q', 'ð—¿' => 'r', 'ð˜€' => 's', 'ð˜' => 't', 'ð˜‚' => 'u', 'ð˜ƒ' => 'v', 'ð˜„' => 'w', 'ð˜…' => 'x', 'ð˜†' => 'y', 'ð˜‡' => 'z', 'ð˜ˆ' => 'A', 'ð˜‰' => 'B', 'ð˜Š' => 'C', 'ð˜‹' => 'D', 'ð˜Œ' => 'E', 'ð˜' => 'F', 'ð˜Ž' => 'G', 'ð˜' => 'H', 'ð˜' => 'I', 'ð˜‘' => 'J', 'ð˜’' => 'K', 'ð˜“' => 'L', 'ð˜”' => 'M', 'ð˜•' => 'N', 'ð˜–' => 'O', 'ð˜—' => 'P', 'ð˜˜' => 'Q', 'ð˜™' => 'R', 'ð˜š' => 'S', 'ð˜›' => 'T', 'ð˜œ' => 'U', 'ð˜' => 'V', 'ð˜ž' => 'W', 'ð˜Ÿ' => 'X', 'ð˜ ' => 'Y', 'ð˜¡' => 'Z', 'ð˜¢' => 'a', 'ð˜£' => 'b', 'ð˜¤' => 'c', 'ð˜¥' => 'd', 'ð˜¦' => 'e', 'ð˜§' => 'f', 'ð˜¨' => 'g', 'ð˜©' => 'h', 'ð˜ª' => 'i', 'ð˜«' => 'j', 'ð˜¬' => 'k', 'ð˜­' => 'l', 'ð˜®' => 'm', 'ð˜¯' => 'n', 'ð˜°' => 'o', 'ð˜±' => 'p', 'ð˜²' => 'q', 'ð˜³' => 'r', 'ð˜´' => 's', 'ð˜µ' => 't', 'ð˜¶' => 'u', 'ð˜·' => 'v', 'ð˜¸' => 'w', 'ð˜¹' => 'x', 'ð˜º' => 'y', 'ð˜»' => 'z', 'ð˜¼' => 'A', 'ð˜½' => 'B', 'ð˜¾' => 'C', 'ð˜¿' => 'D', 'ð™€' => 'E', 'ð™' => 'F', 'ð™‚' => 'G', 'ð™ƒ' => 'H', 'ð™„' => 'I', 'ð™…' => 'J', 'ð™†' => 'K', 'ð™‡' => 'L', 'ð™ˆ' => 'M', 'ð™‰' => 'N', 'ð™Š' => 'O', 'ð™‹' => 'P', 'ð™Œ' => 'Q', 'ð™' => 'R', 'ð™Ž' => 'S', 'ð™' => 'T', 'ð™' => 'U', 'ð™‘' => 'V', 'ð™’' => 'W', 'ð™“' => 'X', 'ð™”' => 'Y', 'ð™•' => 'Z', 'ð™–' => 'a', 'ð™—' => 'b', 'ð™˜' => 'c', 'ð™™' => 'd', 'ð™š' => 'e', 'ð™›' => 'f', 'ð™œ' => 'g', 'ð™' => 'h', 'ð™ž' => 'i', 'ð™Ÿ' => 'j', 'ð™ ' => 'k', 'ð™¡' => 'l', 'ð™¢' => 'm', 'ð™£' => 'n', 'ð™¤' => 'o', 'ð™¥' => 'p', 'ð™¦' => 'q', 'ð™§' => 'r', 'ð™¨' => 's', 'ð™©' => 't', 'ð™ª' => 'u', 'ð™«' => 'v', 'ð™¬' => 'w', 'ð™­' => 'x', 'ð™®' => 'y', 'ð™¯' => 'z', 'ð™°' => 'A', 'ð™±' => 'B', 'ð™²' => 'C', 'ð™³' => 'D', 'ð™´' => 'E', 'ð™µ' => 'F', 'ð™¶' => 'G', 'ð™·' => 'H', 'ð™¸' => 'I', 'ð™¹' => 'J', 'ð™º' => 'K', 'ð™»' => 'L', 'ð™¼' => 'M', 'ð™½' => 'N', 'ð™¾' => 'O', 'ð™¿' => 'P', 'ðš€' => 'Q', 'ðš' => 'R', 'ðš‚' => 'S', 'ðšƒ' => 'T', 'ðš„' => 'U', 'ðš…' => 'V', 'ðš†' => 'W', 'ðš‡' => 'X', 'ðšˆ' => 'Y', 'ðš‰' => 'Z', 'ðšŠ' => 'a', 'ðš‹' => 'b', 'ðšŒ' => 'c', 'ðš' => 'd', 'ðšŽ' => 'e', 'ðš' => 'f', 'ðš' => 'g', 'ðš‘' => 'h', 'ðš’' => 'i', 'ðš“' => 'j', 'ðš”' => 'k', 'ðš•' => 'l', 'ðš–' => 'm', 'ðš—' => 'n', 'ðš˜' => 'o', 'ðš™' => 'p', 'ðšš' => 'q', 'ðš›' => 'r', 'ðšœ' => 's', 'ðš' => 't', 'ðšž' => 'u', 'ðšŸ' => 'v', 'ðš ' => 'w', 'ðš¡' => 'x', 'ðš¢' => 'y', 'ðš£' => 'z', 'ðš¤' => 'ı', 'ðš¥' => 'È·', 'ðš¨' => 'Α', 'ðš©' => 'Î’', 'ðšª' => 'Γ', 'ðš«' => 'Δ', 'ðš¬' => 'Ε', 'ðš­' => 'Ζ', 'ðš®' => 'Η', 'ðš¯' => 'Θ', 'ðš°' => 'Ι', 'ðš±' => 'Κ', 'ðš²' => 'Λ', 'ðš³' => 'Îœ', 'ðš´' => 'Î', 'ðšµ' => 'Ξ', 'ðš¶' => 'Ο', 'ðš·' => 'Π', 'ðš¸' => 'Ρ', 'ðš¹' => 'Θ', 'ðšº' => 'Σ', 'ðš»' => 'Τ', 'ðš¼' => 'Î¥', 'ðš½' => 'Φ', 'ðš¾' => 'Χ', 'ðš¿' => 'Ψ', 'ð›€' => 'Ω', 'ð›' => '∇', 'ð›‚' => 'α', 'ð›ƒ' => 'β', 'ð›„' => 'γ', 'ð›…' => 'δ', 'ð›†' => 'ε', 'ð›‡' => 'ζ', 'ð›ˆ' => 'η', 'ð›‰' => 'θ', 'ð›Š' => 'ι', 'ð›‹' => 'κ', 'ð›Œ' => 'λ', 'ð›' => 'μ', 'ð›Ž' => 'ν', 'ð›' => 'ξ', 'ð›' => 'ο', 'ð›‘' => 'Ï€', 'ð›’' => 'Ï', 'ð›“' => 'Ï‚', 'ð›”' => 'σ', 'ð›•' => 'Ï„', 'ð›–' => 'Ï…', 'ð›—' => 'φ', 'ð›˜' => 'χ', 'ð›™' => 'ψ', 'ð›š' => 'ω', 'ð››' => '∂', 'ð›œ' => 'ε', 'ð›' => 'θ', 'ð›ž' => 'κ', 'ð›Ÿ' => 'φ', 'ð› ' => 'Ï', 'ð›¡' => 'Ï€', 'ð›¢' => 'Α', 'ð›£' => 'Î’', 'ð›¤' => 'Γ', 'ð›¥' => 'Δ', 'ð›¦' => 'Ε', 'ð›§' => 'Ζ', 'ð›¨' => 'Η', 'ð›©' => 'Θ', 'ð›ª' => 'Ι', 'ð›«' => 'Κ', 'ð›¬' => 'Λ', 'ð›­' => 'Îœ', 'ð›®' => 'Î', 'ð›¯' => 'Ξ', 'ð›°' => 'Ο', 'ð›±' => 'Π', 'ð›²' => 'Ρ', 'ð›³' => 'Θ', 'ð›´' => 'Σ', 'ð›µ' => 'Τ', 'ð›¶' => 'Î¥', 'ð›·' => 'Φ', 'ð›¸' => 'Χ', 'ð›¹' => 'Ψ', 'ð›º' => 'Ω', 'ð›»' => '∇', 'ð›¼' => 'α', 'ð›½' => 'β', 'ð›¾' => 'γ', 'ð›¿' => 'δ', 'ðœ€' => 'ε', 'ðœ' => 'ζ', 'ðœ‚' => 'η', 'ðœƒ' => 'θ', 'ðœ„' => 'ι', 'ðœ…' => 'κ', 'ðœ†' => 'λ', 'ðœ‡' => 'μ', 'ðœˆ' => 'ν', 'ðœ‰' => 'ξ', 'ðœŠ' => 'ο', 'ðœ‹' => 'Ï€', 'ðœŒ' => 'Ï', 'ðœ' => 'Ï‚', 'ðœŽ' => 'σ', 'ðœ' => 'Ï„', 'ðœ' => 'Ï…', 'ðœ‘' => 'φ', 'ðœ’' => 'χ', 'ðœ“' => 'ψ', 'ðœ”' => 'ω', 'ðœ•' => '∂', 'ðœ–' => 'ε', 'ðœ—' => 'θ', 'ðœ˜' => 'κ', 'ðœ™' => 'φ', 'ðœš' => 'Ï', 'ðœ›' => 'Ï€', 'ðœœ' => 'Α', 'ðœ' => 'Î’', 'ðœž' => 'Γ', 'ðœŸ' => 'Δ', 'ðœ ' => 'Ε', 'ðœ¡' => 'Ζ', 'ðœ¢' => 'Η', 'ðœ£' => 'Θ', 'ðœ¤' => 'Ι', 'ðœ¥' => 'Κ', 'ðœ¦' => 'Λ', 'ðœ§' => 'Îœ', 'ðœ¨' => 'Î', 'ðœ©' => 'Ξ', 'ðœª' => 'Ο', 'ðœ«' => 'Π', 'ðœ¬' => 'Ρ', 'ðœ­' => 'Θ', 'ðœ®' => 'Σ', 'ðœ¯' => 'Τ', 'ðœ°' => 'Î¥', 'ðœ±' => 'Φ', 'ðœ²' => 'Χ', 'ðœ³' => 'Ψ', 'ðœ´' => 'Ω', 'ðœµ' => '∇', 'ðœ¶' => 'α', 'ðœ·' => 'β', 'ðœ¸' => 'γ', 'ðœ¹' => 'δ', 'ðœº' => 'ε', 'ðœ»' => 'ζ', 'ðœ¼' => 'η', 'ðœ½' => 'θ', 'ðœ¾' => 'ι', 'ðœ¿' => 'κ', 'ð€' => 'λ', 'ð' => 'μ', 'ð‚' => 'ν', 'ðƒ' => 'ξ', 'ð„' => 'ο', 'ð…' => 'Ï€', 'ð†' => 'Ï', 'ð‡' => 'Ï‚', 'ðˆ' => 'σ', 'ð‰' => 'Ï„', 'ðŠ' => 'Ï…', 'ð‹' => 'φ', 'ðŒ' => 'χ', 'ð' => 'ψ', 'ðŽ' => 'ω', 'ð' => '∂', 'ð' => 'ε', 'ð‘' => 'θ', 'ð’' => 'κ', 'ð“' => 'φ', 'ð”' => 'Ï', 'ð•' => 'Ï€', 'ð–' => 'Α', 'ð—' => 'Î’', 'ð˜' => 'Γ', 'ð™' => 'Δ', 'ðš' => 'Ε', 'ð›' => 'Ζ', 'ðœ' => 'Η', 'ð' => 'Θ', 'ðž' => 'Ι', 'ðŸ' => 'Κ', 'ð ' => 'Λ', 'ð¡' => 'Îœ', 'ð¢' => 'Î', 'ð£' => 'Ξ', 'ð¤' => 'Ο', 'ð¥' => 'Π', 'ð¦' => 'Ρ', 'ð§' => 'Θ', 'ð¨' => 'Σ', 'ð©' => 'Τ', 'ðª' => 'Î¥', 'ð«' => 'Φ', 'ð¬' => 'Χ', 'ð­' => 'Ψ', 'ð®' => 'Ω', 'ð¯' => '∇', 'ð°' => 'α', 'ð±' => 'β', 'ð²' => 'γ', 'ð³' => 'δ', 'ð´' => 'ε', 'ðµ' => 'ζ', 'ð¶' => 'η', 'ð·' => 'θ', 'ð¸' => 'ι', 'ð¹' => 'κ', 'ðº' => 'λ', 'ð»' => 'μ', 'ð¼' => 'ν', 'ð½' => 'ξ', 'ð¾' => 'ο', 'ð¿' => 'Ï€', 'ðž€' => 'Ï', 'ðž' => 'Ï‚', 'ðž‚' => 'σ', 'ðžƒ' => 'Ï„', 'ðž„' => 'Ï…', 'ðž…' => 'φ', 'ðž†' => 'χ', 'ðž‡' => 'ψ', 'ðžˆ' => 'ω', 'ðž‰' => '∂', 'ðžŠ' => 'ε', 'ðž‹' => 'θ', 'ðžŒ' => 'κ', 'ðž' => 'φ', 'ðžŽ' => 'Ï', 'ðž' => 'Ï€', 'ðž' => 'Α', 'ðž‘' => 'Î’', 'ðž’' => 'Γ', 'ðž“' => 'Δ', 'ðž”' => 'Ε', 'ðž•' => 'Ζ', 'ðž–' => 'Η', 'ðž—' => 'Θ', 'ðž˜' => 'Ι', 'ðž™' => 'Κ', 'ðžš' => 'Λ', 'ðž›' => 'Îœ', 'ðžœ' => 'Î', 'ðž' => 'Ξ', 'ðžž' => 'Ο', 'ðžŸ' => 'Π', 'ðž ' => 'Ρ', 'ðž¡' => 'Θ', 'ðž¢' => 'Σ', 'ðž£' => 'Τ', 'ðž¤' => 'Î¥', 'ðž¥' => 'Φ', 'ðž¦' => 'Χ', 'ðž§' => 'Ψ', 'ðž¨' => 'Ω', 'ðž©' => '∇', 'ðžª' => 'α', 'ðž«' => 'β', 'ðž¬' => 'γ', 'ðž­' => 'δ', 'ðž®' => 'ε', 'ðž¯' => 'ζ', 'ðž°' => 'η', 'ðž±' => 'θ', 'ðž²' => 'ι', 'ðž³' => 'κ', 'ðž´' => 'λ', 'ðžµ' => 'μ', 'ðž¶' => 'ν', 'ðž·' => 'ξ', 'ðž¸' => 'ο', 'ðž¹' => 'Ï€', 'ðžº' => 'Ï', 'ðž»' => 'Ï‚', 'ðž¼' => 'σ', 'ðž½' => 'Ï„', 'ðž¾' => 'Ï…', 'ðž¿' => 'φ', 'ðŸ€' => 'χ', 'ðŸ' => 'ψ', 'ðŸ‚' => 'ω', 'ðŸƒ' => '∂', 'ðŸ„' => 'ε', 'ðŸ…' => 'θ', 'ðŸ†' => 'κ', 'ðŸ‡' => 'φ', 'ðŸˆ' => 'Ï', 'ðŸ‰' => 'Ï€', 'ðŸŠ' => 'Ïœ', 'ðŸ‹' => 'Ï', 'ðŸŽ' => '0', 'ðŸ' => '1', 'ðŸ' => '2', 'ðŸ‘' => '3', 'ðŸ’' => '4', 'ðŸ“' => '5', 'ðŸ”' => '6', 'ðŸ•' => '7', 'ðŸ–' => '8', 'ðŸ—' => '9', 'ðŸ˜' => '0', 'ðŸ™' => '1', 'ðŸš' => '2', 'ðŸ›' => '3', 'ðŸœ' => '4', 'ðŸ' => '5', 'ðŸž' => '6', 'ðŸŸ' => '7', 'ðŸ ' => '8', 'ðŸ¡' => '9', 'ðŸ¢' => '0', 'ðŸ£' => '1', 'ðŸ¤' => '2', 'ðŸ¥' => '3', 'ðŸ¦' => '4', 'ðŸ§' => '5', 'ðŸ¨' => '6', 'ðŸ©' => '7', 'ðŸª' => '8', 'ðŸ«' => '9', 'ðŸ¬' => '0', 'ðŸ­' => '1', 'ðŸ®' => '2', 'ðŸ¯' => '3', 'ðŸ°' => '4', 'ðŸ±' => '5', 'ðŸ²' => '6', 'ðŸ³' => '7', 'ðŸ´' => '8', 'ðŸµ' => '9', 'ðŸ¶' => '0', 'ðŸ·' => '1', 'ðŸ¸' => '2', 'ðŸ¹' => '3', 'ðŸº' => '4', 'ðŸ»' => '5', 'ðŸ¼' => '6', 'ðŸ½' => '7', 'ðŸ¾' => '8', 'ðŸ¿' => '9', '𞸀' => 'ا', 'ðž¸' => 'ب', '𞸂' => 'ج', '𞸃' => 'د', '𞸅' => 'Ùˆ', '𞸆' => 'ز', '𞸇' => 'Ø­', '𞸈' => 'Ø·', '𞸉' => 'ÙŠ', '𞸊' => 'Ùƒ', '𞸋' => 'Ù„', '𞸌' => 'Ù…', 'ðž¸' => 'Ù†', '𞸎' => 'س', 'ðž¸' => 'ع', 'ðž¸' => 'Ù', '𞸑' => 'ص', '𞸒' => 'Ù‚', '𞸓' => 'ر', '𞸔' => 'Ø´', '𞸕' => 'ت', '𞸖' => 'Ø«', '𞸗' => 'Ø®', '𞸘' => 'Ø°', '𞸙' => 'ض', '𞸚' => 'ظ', '𞸛' => 'غ', '𞸜' => 'Ù®', 'ðž¸' => 'Úº', '𞸞' => 'Ú¡', '𞸟' => 'Ù¯', '𞸡' => 'ب', '𞸢' => 'ج', '𞸤' => 'Ù‡', '𞸧' => 'Ø­', '𞸩' => 'ÙŠ', '𞸪' => 'Ùƒ', '𞸫' => 'Ù„', '𞸬' => 'Ù…', '𞸭' => 'Ù†', '𞸮' => 'س', '𞸯' => 'ع', '𞸰' => 'Ù', '𞸱' => 'ص', '𞸲' => 'Ù‚', '𞸴' => 'Ø´', '𞸵' => 'ت', '𞸶' => 'Ø«', '𞸷' => 'Ø®', '𞸹' => 'ض', '𞸻' => 'غ', '𞹂' => 'ج', '𞹇' => 'Ø­', '𞹉' => 'ÙŠ', '𞹋' => 'Ù„', 'ðž¹' => 'Ù†', '𞹎' => 'س', 'ðž¹' => 'ع', '𞹑' => 'ص', 'ðž¹’' => 'Ù‚', 'ðž¹”' => 'Ø´', 'ðž¹—' => 'Ø®', 'ðž¹™' => 'ض', 'ðž¹›' => 'غ', 'ðž¹' => 'Úº', '𞹟' => 'Ù¯', '𞹡' => 'ب', 'ðž¹¢' => 'ج', '𞹤' => 'Ù‡', '𞹧' => 'Ø­', '𞹨' => 'Ø·', '𞹩' => 'ÙŠ', '𞹪' => 'Ùƒ', '𞹬' => 'Ù…', 'ðž¹­' => 'Ù†', 'ðž¹®' => 'س', '𞹯' => 'ع', 'ðž¹°' => 'Ù', 'ðž¹±' => 'ص', 'ðž¹²' => 'Ù‚', 'ðž¹´' => 'Ø´', 'ðž¹µ' => 'ت', '𞹶' => 'Ø«', 'ðž¹·' => 'Ø®', 'ðž¹¹' => 'ض', '𞹺' => 'ظ', 'ðž¹»' => 'غ', 'ðž¹¼' => 'Ù®', 'ðž¹¾' => 'Ú¡', '𞺀' => 'ا', 'ðžº' => 'ب', '𞺂' => 'ج', '𞺃' => 'د', '𞺄' => 'Ù‡', '𞺅' => 'Ùˆ', '𞺆' => 'ز', '𞺇' => 'Ø­', '𞺈' => 'Ø·', '𞺉' => 'ÙŠ', '𞺋' => 'Ù„', '𞺌' => 'Ù…', 'ðžº' => 'Ù†', '𞺎' => 'س', 'ðžº' => 'ع', 'ðžº' => 'Ù', '𞺑' => 'ص', '𞺒' => 'Ù‚', '𞺓' => 'ر', '𞺔' => 'Ø´', '𞺕' => 'ت', '𞺖' => 'Ø«', '𞺗' => 'Ø®', '𞺘' => 'Ø°', '𞺙' => 'ض', '𞺚' => 'ظ', '𞺛' => 'غ', '𞺡' => 'ب', '𞺢' => 'ج', '𞺣' => 'د', '𞺥' => 'Ùˆ', '𞺦' => 'ز', '𞺧' => 'Ø­', '𞺨' => 'Ø·', '𞺩' => 'ÙŠ', '𞺫' => 'Ù„', '𞺬' => 'Ù…', '𞺭' => 'Ù†', '𞺮' => 'س', '𞺯' => 'ع', '𞺰' => 'Ù', '𞺱' => 'ص', '𞺲' => 'Ù‚', '𞺳' => 'ر', '𞺴' => 'Ø´', '𞺵' => 'ت', '𞺶' => 'Ø«', '𞺷' => 'Ø®', '𞺸' => 'Ø°', '𞺹' => 'ض', '𞺺' => 'ظ', '𞺻' => 'غ', '🄀' => '0.', 'ðŸ„' => '0,', '🄂' => '1,', '🄃' => '2,', '🄄' => '3,', '🄅' => '4,', '🄆' => '5,', '🄇' => '6,', '🄈' => '7,', '🄉' => '8,', '🄊' => '9,', 'ðŸ„' => '(A)', '🄑' => '(B)', '🄒' => '(C)', '🄓' => '(D)', '🄔' => '(E)', '🄕' => '(F)', '🄖' => '(G)', '🄗' => '(H)', '🄘' => '(I)', '🄙' => '(J)', '🄚' => '(K)', '🄛' => '(L)', '🄜' => '(M)', 'ðŸ„' => '(N)', '🄞' => '(O)', '🄟' => '(P)', '🄠' => '(Q)', '🄡' => '(R)', '🄢' => '(S)', '🄣' => '(T)', '🄤' => '(U)', '🄥' => '(V)', '🄦' => '(W)', '🄧' => '(X)', '🄨' => '(Y)', '🄩' => '(Z)', '🄪' => '〔S〕', '🄫' => 'C', '🄬' => 'R', '🄭' => 'CD', '🄮' => 'WZ', '🄰' => 'A', '🄱' => 'B', '🄲' => 'C', '🄳' => 'D', '🄴' => 'E', '🄵' => 'F', '🄶' => 'G', '🄷' => 'H', '🄸' => 'I', '🄹' => 'J', '🄺' => 'K', '🄻' => 'L', '🄼' => 'M', '🄽' => 'N', '🄾' => 'O', '🄿' => 'P', '🅀' => 'Q', 'ðŸ…' => 'R', '🅂' => 'S', '🅃' => 'T', '🅄' => 'U', '🅅' => 'V', '🅆' => 'W', '🅇' => 'X', '🅈' => 'Y', '🅉' => 'Z', '🅊' => 'HV', '🅋' => 'MV', '🅌' => 'SD', 'ðŸ…' => 'SS', '🅎' => 'PPV', 'ðŸ…' => 'WC', '🅪' => 'MC', '🅫' => 'MD', '🅬' => 'MR', 'ðŸ†' => 'DJ', '🈀' => 'ã»ã‹', 'ðŸˆ' => 'ココ', '🈂' => 'サ', 'ðŸˆ' => '手', '🈑' => 'å­—', '🈒' => 'åŒ', '🈓' => 'デ', '🈔' => '二', '🈕' => '多', '🈖' => '解', '🈗' => '天', '🈘' => '交', '🈙' => '映', '🈚' => 'ç„¡', '🈛' => 'æ–™', '🈜' => 'å‰', 'ðŸˆ' => '後', '🈞' => 'å†', '🈟' => 'æ–°', '🈠' => 'åˆ', '🈡' => '終', '🈢' => '生', '🈣' => '販', '🈤' => '声', '🈥' => 'å¹', '🈦' => 'æ¼”', '🈧' => '投', '🈨' => 'æ•', '🈩' => '一', '🈪' => '三', '🈫' => 'éŠ', '🈬' => 'å·¦', '🈭' => '中', '🈮' => 'å³', '🈯' => '指', '🈰' => 'èµ°', '🈱' => '打', '🈲' => 'ç¦', '🈳' => '空', '🈴' => 'åˆ', '🈵' => '満', '🈶' => '有', '🈷' => '月', '🈸' => '申', '🈹' => '割', '🈺' => 'å–¶', '🈻' => 'é…', '🉀' => '〔本〕', 'ðŸ‰' => '〔三〕', '🉂' => '〔二〕', '🉃' => '〔安〕', '🉄' => '〔点〕', '🉅' => '〔打〕', '🉆' => '〔盗〕', '🉇' => '〔å‹ã€•', '🉈' => '〔敗〕', 'ðŸ‰' => 'å¾—', '🉑' => 'å¯', '🯰' => '0', '🯱' => '1', '🯲' => '2', '🯳' => '3', '🯴' => '4', '🯵' => '5', '🯶' => '6', '🯷' => '7', '🯸' => '8', '🯹' => '9'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php000064400000036642147600374260032570 0ustar00addons/amazons3addon 'À', 'AÌ' => 'Ã', 'AÌ‚' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'AÌŠ' => 'Ã…', 'Ç' => 'Ç', 'EÌ€' => 'È', 'EÌ' => 'É', 'EÌ‚' => 'Ê', 'Ë' => 'Ë', 'IÌ€' => 'ÃŒ', 'IÌ' => 'Ã', 'IÌ‚' => 'ÃŽ', 'Ï' => 'Ã', 'Ñ' => 'Ñ', 'OÌ€' => 'Ã’', 'OÌ' => 'Ó', 'OÌ‚' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'UÌ€' => 'Ù', 'UÌ' => 'Ú', 'UÌ‚' => 'Û', 'Ü' => 'Ãœ', 'YÌ' => 'Ã', 'aÌ€' => 'à', 'aÌ' => 'á', 'aÌ‚' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'aÌŠ' => 'Ã¥', 'ç' => 'ç', 'eÌ€' => 'è', 'eÌ' => 'é', 'eÌ‚' => 'ê', 'ë' => 'ë', 'iÌ€' => 'ì', 'iÌ' => 'í', 'iÌ‚' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'oÌ€' => 'ò', 'oÌ' => 'ó', 'oÌ‚' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'uÌ€' => 'ù', 'uÌ' => 'ú', 'uÌ‚' => 'û', 'ü' => 'ü', 'yÌ' => 'ý', 'ÿ' => 'ÿ', 'AÌ„' => 'Ä€', 'aÌ„' => 'Ä', 'Ă' => 'Ä‚', 'ă' => 'ă', 'Ą' => 'Ä„', 'ą' => 'Ä…', 'CÌ' => 'Ć', 'cÌ' => 'ć', 'CÌ‚' => 'Ĉ', 'cÌ‚' => 'ĉ', 'Ċ' => 'ÄŠ', 'ċ' => 'Ä‹', 'CÌŒ' => 'ÄŒ', 'cÌŒ' => 'Ä', 'DÌŒ' => 'ÄŽ', 'dÌŒ' => 'Ä', 'EÌ„' => 'Ä’', 'eÌ„' => 'Ä“', 'Ĕ' => 'Ä”', 'ĕ' => 'Ä•', 'Ė' => 'Ä–', 'ė' => 'Ä—', 'Ę' => 'Ę', 'ę' => 'Ä™', 'EÌŒ' => 'Äš', 'eÌŒ' => 'Ä›', 'GÌ‚' => 'Äœ', 'gÌ‚' => 'Ä', 'Ğ' => 'Äž', 'ğ' => 'ÄŸ', 'Ġ' => 'Ä ', 'ġ' => 'Ä¡', 'Ģ' => 'Ä¢', 'ģ' => 'Ä£', 'HÌ‚' => 'Ĥ', 'hÌ‚' => 'Ä¥', 'Ĩ' => 'Ĩ', 'ĩ' => 'Ä©', 'IÌ„' => 'Ī', 'iÌ„' => 'Ä«', 'Ĭ' => 'Ĭ', 'ĭ' => 'Ä­', 'Į' => 'Ä®', 'į' => 'į', 'İ' => 'Ä°', 'JÌ‚' => 'Ä´', 'jÌ‚' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'Ä·', 'LÌ' => 'Ĺ', 'lÌ' => 'ĺ', 'Ļ' => 'Ä»', 'ļ' => 'ļ', 'LÌŒ' => 'Ľ', 'lÌŒ' => 'ľ', 'NÌ' => 'Ń', 'nÌ' => 'Å„', 'Ņ' => 'Å…', 'ņ' => 'ņ', 'NÌŒ' => 'Ň', 'nÌŒ' => 'ň', 'OÌ„' => 'ÅŒ', 'oÌ„' => 'Å', 'Ŏ' => 'ÅŽ', 'ŏ' => 'Å', 'OÌ‹' => 'Å', 'oÌ‹' => 'Å‘', 'RÌ' => 'Å”', 'rÌ' => 'Å•', 'Ŗ' => 'Å–', 'ŗ' => 'Å—', 'RÌŒ' => 'Ř', 'rÌŒ' => 'Å™', 'SÌ' => 'Åš', 'sÌ' => 'Å›', 'SÌ‚' => 'Åœ', 'sÌ‚' => 'Å', 'Ş' => 'Åž', 'ş' => 'ÅŸ', 'SÌŒ' => 'Å ', 'sÌŒ' => 'Å¡', 'Ţ' => 'Å¢', 'ţ' => 'Å£', 'TÌŒ' => 'Ť', 'tÌŒ' => 'Å¥', 'Ũ' => 'Ũ', 'ũ' => 'Å©', 'UÌ„' => 'Ū', 'uÌ„' => 'Å«', 'Ŭ' => 'Ŭ', 'ŭ' => 'Å­', 'UÌŠ' => 'Å®', 'uÌŠ' => 'ů', 'UÌ‹' => 'Å°', 'uÌ‹' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'WÌ‚' => 'Å´', 'wÌ‚' => 'ŵ', 'YÌ‚' => 'Ŷ', 'yÌ‚' => 'Å·', 'Ÿ' => 'Ÿ', 'ZÌ' => 'Ź', 'zÌ' => 'ź', 'Ż' => 'Å»', 'ż' => 'ż', 'ZÌŒ' => 'Ž', 'zÌŒ' => 'ž', 'OÌ›' => 'Æ ', 'oÌ›' => 'Æ¡', 'UÌ›' => 'Ư', 'uÌ›' => 'Æ°', 'AÌŒ' => 'Ç', 'aÌŒ' => 'ÇŽ', 'IÌŒ' => 'Ç', 'iÌŒ' => 'Ç', 'OÌŒ' => 'Ç‘', 'oÌŒ' => 'Ç’', 'UÌŒ' => 'Ç“', 'uÌŒ' => 'Ç”', 'Ǖ' => 'Ç•', 'ǖ' => 'Ç–', 'ÃœÌ' => 'Ç—', 'üÌ' => 'ǘ', 'Ǚ' => 'Ç™', 'ǚ' => 'Çš', 'Ǜ' => 'Ç›', 'ǜ' => 'Çœ', 'Ǟ' => 'Çž', 'ǟ' => 'ÇŸ', 'Ǡ' => 'Ç ', 'ǡ' => 'Ç¡', 'Ǣ' => 'Ç¢', 'ǣ' => 'Ç£', 'GÌŒ' => 'Ǧ', 'gÌŒ' => 'ǧ', 'KÌŒ' => 'Ǩ', 'kÌŒ' => 'Ç©', 'Ǫ' => 'Ǫ', 'ǫ' => 'Ç«', 'Ǭ' => 'Ǭ', 'Ç«Ì„' => 'Ç­', 'Æ·ÌŒ' => 'Ç®', 'Ê’ÌŒ' => 'ǯ', 'jÌŒ' => 'Ç°', 'GÌ' => 'Ç´', 'gÌ' => 'ǵ', 'NÌ€' => 'Ǹ', 'nÌ€' => 'ǹ', 'Ã…Ì' => 'Ǻ', 'Ã¥Ì' => 'Ç»', 'ÆÌ' => 'Ǽ', 'æÌ' => 'ǽ', 'ØÌ' => 'Ǿ', 'øÌ' => 'Ç¿', 'AÌ' => 'È€', 'aÌ' => 'È', 'AÌ‘' => 'È‚', 'aÌ‘' => 'ȃ', 'EÌ' => 'È„', 'eÌ' => 'È…', 'EÌ‘' => 'Ȇ', 'eÌ‘' => 'ȇ', 'IÌ' => 'Ȉ', 'iÌ' => 'ȉ', 'IÌ‘' => 'ÈŠ', 'iÌ‘' => 'È‹', 'OÌ' => 'ÈŒ', 'oÌ' => 'È', 'OÌ‘' => 'ÈŽ', 'oÌ‘' => 'È', 'RÌ' => 'È', 'rÌ' => 'È‘', 'RÌ‘' => 'È’', 'rÌ‘' => 'È“', 'UÌ' => 'È”', 'uÌ' => 'È•', 'UÌ‘' => 'È–', 'uÌ‘' => 'È—', 'Ș' => 'Ș', 'ș' => 'È™', 'Ț' => 'Èš', 'ț' => 'È›', 'HÌŒ' => 'Èž', 'hÌŒ' => 'ÈŸ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'È©', 'Ȫ' => 'Ȫ', 'ȫ' => 'È«', 'Ȭ' => 'Ȭ', 'ȭ' => 'È­', 'Ȯ' => 'È®', 'ȯ' => 'ȯ', 'Ȱ' => 'È°', 'ȱ' => 'ȱ', 'YÌ„' => 'Ȳ', 'yÌ„' => 'ȳ', '¨Ì' => 'Î…', 'ΑÌ' => 'Ά', 'ΕÌ' => 'Έ', 'ΗÌ' => 'Ή', 'ΙÌ' => 'Ί', 'ΟÌ' => 'ÎŒ', 'Î¥Ì' => 'ÎŽ', 'ΩÌ' => 'Î', 'ÏŠÌ' => 'Î', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'αÌ' => 'ά', 'εÌ' => 'έ', 'ηÌ' => 'ή', 'ιÌ' => 'ί', 'Ï‹Ì' => 'ΰ', 'ϊ' => 'ÏŠ', 'ϋ' => 'Ï‹', 'οÌ' => 'ÏŒ', 'Ï…Ì' => 'Ï', 'ωÌ' => 'ÏŽ', 'Ï’Ì' => 'Ï“', 'ϔ' => 'Ï”', 'Ѐ' => 'Ѐ', 'Ё' => 'Ð', 'ГÌ' => 'Ѓ', 'Ї' => 'Ї', 'КÌ' => 'ÐŒ', 'Ѝ' => 'Ð', 'Ў' => 'ÐŽ', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'Ñ', 'ё' => 'Ñ‘', 'гÌ' => 'Ñ“', 'ї' => 'Ñ—', 'кÌ' => 'Ñœ', 'ѝ' => 'Ñ', 'ў' => 'Ñž', 'Ñ´Ì' => 'Ѷ', 'ѵÌ' => 'Ñ·', 'Ӂ' => 'Ó', 'ӂ' => 'Ó‚', 'Ð̆' => 'Ó', 'ӑ' => 'Ó‘', 'Ð̈' => 'Ó’', 'ӓ' => 'Ó“', 'Ӗ' => 'Ó–', 'ӗ' => 'Ó—', 'Ӛ' => 'Óš', 'ӛ' => 'Ó›', 'Ӝ' => 'Óœ', 'ӝ' => 'Ó', 'Ӟ' => 'Óž', 'ӟ' => 'ÓŸ', 'Ӣ' => 'Ó¢', 'ӣ' => 'Ó£', 'Ӥ' => 'Ó¤', 'ӥ' => 'Ó¥', 'Ӧ' => 'Ó¦', 'ӧ' => 'Ó§', 'Ӫ' => 'Óª', 'ӫ' => 'Ó«', 'Ӭ' => 'Ó¬', 'Ñ̈' => 'Ó­', 'Ӯ' => 'Ó®', 'ӯ' => 'Ó¯', 'Ӱ' => 'Ó°', 'ӱ' => 'Ó±', 'Ӳ' => 'Ó²', 'ӳ' => 'Ó³', 'Ӵ' => 'Ó´', 'ӵ' => 'Óµ', 'Ӹ' => 'Ó¸', 'ӹ' => 'Ó¹', 'آ' => 'Ø¢', 'أ' => 'Ø£', 'ÙˆÙ”' => 'ؤ', 'إ' => 'Ø¥', 'ÙŠÙ”' => 'ئ', 'Û•Ù”' => 'Û€', 'ÛÙ”' => 'Û‚', 'Û’Ù”' => 'Û“', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ୈ' => 'à­ˆ', 'ୋ' => 'à­‹', 'ୌ' => 'à­Œ', 'ஔ' => 'à®”', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'à³€', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'à·š', 'à·™à·' => 'à·œ', 'ෝ' => 'à·', 'ෞ' => 'à·ž', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'á¬á¬µ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'á­€', 'ᭁ' => 'á­', 'ᭃ' => 'á­ƒ', 'AÌ¥' => 'Ḁ', 'aÌ¥' => 'á¸', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'BÌ£' => 'Ḅ', 'bÌ£' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'ÇÌ' => 'Ḉ', 'çÌ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'DÌ£' => 'Ḍ', 'dÌ£' => 'á¸', 'Ḏ' => 'Ḏ', 'ḏ' => 'á¸', 'Ḑ' => 'á¸', 'ḑ' => 'ḑ', 'DÌ­' => 'Ḓ', 'dÌ­' => 'ḓ', 'Ä’Ì€' => 'Ḕ', 'Ä“Ì€' => 'ḕ', 'Ä’Ì' => 'Ḗ', 'Ä“Ì' => 'ḗ', 'EÌ­' => 'Ḙ', 'eÌ­' => 'ḙ', 'EÌ°' => 'Ḛ', 'eÌ°' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'á¸', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'GÌ„' => 'Ḡ', 'gÌ„' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'HÌ£' => 'Ḥ', 'hÌ£' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'HÌ®' => 'Ḫ', 'hÌ®' => 'ḫ', 'IÌ°' => 'Ḭ', 'iÌ°' => 'ḭ', 'ÃÌ' => 'Ḯ', 'ïÌ' => 'ḯ', 'KÌ' => 'Ḱ', 'kÌ' => 'ḱ', 'KÌ£' => 'Ḳ', 'kÌ£' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'LÌ£' => 'Ḷ', 'lÌ£' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'LÌ­' => 'Ḽ', 'lÌ­' => 'ḽ', 'MÌ' => 'Ḿ', 'mÌ' => 'ḿ', 'Ṁ' => 'á¹€', 'ṁ' => 'á¹', 'MÌ£' => 'Ṃ', 'mÌ£' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'á¹…', 'NÌ£' => 'Ṇ', 'nÌ£' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'NÌ­' => 'Ṋ', 'nÌ­' => 'ṋ', 'ÕÌ' => 'Ṍ', 'õÌ' => 'á¹', 'Ṏ' => 'Ṏ', 'ṏ' => 'á¹', 'Ṑ' => 'á¹', 'ÅÌ€' => 'ṑ', 'ÅŒÌ' => 'á¹’', 'ÅÌ' => 'ṓ', 'PÌ' => 'á¹”', 'pÌ' => 'ṕ', 'Ṗ' => 'á¹–', 'ṗ' => 'á¹—', 'Ṙ' => 'Ṙ', 'ṙ' => 'á¹™', 'RÌ£' => 'Ṛ', 'rÌ£' => 'á¹›', 'Ṝ' => 'Ṝ', 'ṝ' => 'á¹', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'á¹ ', 'ṡ' => 'ṡ', 'SÌ£' => 'á¹¢', 'sÌ£' => 'á¹£', 'Ṥ' => 'Ṥ', 'ṥ' => 'á¹¥', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'TÌ£' => 'Ṭ', 'tÌ£' => 'á¹­', 'Ṯ' => 'á¹®', 'ṯ' => 'ṯ', 'TÌ­' => 'á¹°', 'tÌ­' => 'á¹±', 'Ṳ' => 'á¹²', 'ṳ' => 'á¹³', 'UÌ°' => 'á¹´', 'uÌ°' => 'á¹µ', 'UÌ­' => 'Ṷ', 'uÌ­' => 'á¹·', 'ŨÌ' => 'Ṹ', 'Å©Ì' => 'á¹¹', 'Ṻ' => 'Ṻ', 'ṻ' => 'á¹»', 'Ṽ' => 'á¹¼', 'ṽ' => 'á¹½', 'VÌ£' => 'á¹¾', 'vÌ£' => 'ṿ', 'WÌ€' => 'Ẁ', 'wÌ€' => 'áº', 'WÌ' => 'Ẃ', 'wÌ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'WÌ£' => 'Ẉ', 'wÌ£' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'áº', 'Ẏ' => 'Ẏ', 'ẏ' => 'áº', 'ZÌ‚' => 'áº', 'zÌ‚' => 'ẑ', 'ZÌ£' => 'Ẓ', 'zÌ£' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'wÌŠ' => 'ẘ', 'yÌŠ' => 'ẙ', 'ẛ' => 'ẛ', 'AÌ£' => 'Ạ', 'aÌ£' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'ÂÌ' => 'Ấ', 'âÌ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ä‚Ì' => 'Ắ', 'ăÌ' => 'ắ', 'Ä‚Ì€' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'EÌ£' => 'Ẹ', 'eÌ£' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'ÊÌ' => 'Ế', 'êÌ' => 'ế', 'Ề' => 'Ề', 'ề' => 'á»', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'á»…', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'IÌ£' => 'Ị', 'iÌ£' => 'ị', 'OÌ£' => 'Ọ', 'oÌ£' => 'á»', 'Ỏ' => 'Ỏ', 'ỏ' => 'á»', 'ÔÌ' => 'á»', 'ôÌ' => 'ố', 'Ồ' => 'á»’', 'ồ' => 'ồ', 'Ổ' => 'á»”', 'ổ' => 'ổ', 'Ỗ' => 'á»–', 'ỗ' => 'á»—', 'Ộ' => 'Ộ', 'á»Ì‚' => 'á»™', 'Æ Ì' => 'Ớ', 'Æ¡Ì' => 'á»›', 'Ờ' => 'Ờ', 'Æ¡Ì€' => 'á»', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'á» ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'Æ¡Ì£' => 'ợ', 'UÌ£' => 'Ụ', 'uÌ£' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'ƯÌ' => 'Ứ', 'Æ°Ì' => 'ứ', 'Ừ' => 'Ừ', 'Æ°Ì€' => 'ừ', 'Ử' => 'Ử', 'ử' => 'á»­', 'Ữ' => 'á»®', 'ữ' => 'ữ', 'Ự' => 'á»°', 'Æ°Ì£' => 'á»±', 'YÌ€' => 'Ỳ', 'yÌ€' => 'ỳ', 'YÌ£' => 'á»´', 'yÌ£' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'á»·', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'á¼€', 'ἁ' => 'á¼', 'ἂ' => 'ἂ', 'á¼Ì€' => 'ἃ', 'á¼€Ì' => 'ἄ', 'á¼Ì' => 'á¼…', 'ἆ' => 'ἆ', 'á¼Í‚' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'ἈÌ' => 'Ἄ', 'ἉÌ' => 'á¼', 'Ἆ' => 'Ἆ', 'Ἇ' => 'á¼', 'ἐ' => 'á¼', 'ἑ' => 'ἑ', 'á¼Ì€' => 'á¼’', 'ἓ' => 'ἓ', 'á¼Ì' => 'á¼”', 'ἑÌ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'á¼™', 'Ἒ' => 'Ἒ', 'Ἓ' => 'á¼›', 'ἘÌ' => 'Ἔ', 'á¼™Ì' => 'á¼', 'ἠ' => 'á¼ ', 'ἡ' => 'ἡ', 'ἢ' => 'á¼¢', 'ἣ' => 'á¼£', 'á¼ Ì' => 'ἤ', 'ἡÌ' => 'á¼¥', 'á¼ Í‚' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'ἨÌ' => 'Ἤ', 'ἩÌ' => 'á¼­', 'Ἦ' => 'á¼®', 'Ἧ' => 'Ἧ', 'ἰ' => 'á¼°', 'ἱ' => 'á¼±', 'á¼°Ì€' => 'á¼²', 'ἳ' => 'á¼³', 'á¼°Ì' => 'á¼´', 'á¼±Ì' => 'á¼µ', 'á¼°Í‚' => 'ἶ', 'ἷ' => 'á¼·', 'Ἰ' => 'Ἰ', 'Ἱ' => 'á¼¹', 'Ἲ' => 'Ἲ', 'Ἳ' => 'á¼»', 'ἸÌ' => 'á¼¼', 'á¼¹Ì' => 'á¼½', 'Ἶ' => 'á¼¾', 'Ἷ' => 'Ἷ', 'ὀ' => 'á½€', 'ὁ' => 'á½', 'ὂ' => 'ὂ', 'á½Ì€' => 'ὃ', 'á½€Ì' => 'ὄ', 'á½Ì' => 'á½…', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'ὈÌ' => 'Ὄ', 'ὉÌ' => 'á½', 'Ï…Ì“' => 'á½', 'Ï…Ì”' => 'ὑ', 'á½Ì€' => 'á½’', 'ὓ' => 'ὓ', 'á½Ì' => 'á½”', 'ὑÌ' => 'ὕ', 'á½Í‚' => 'á½–', 'ὗ' => 'á½—', 'Ὑ' => 'á½™', 'Ὓ' => 'á½›', 'á½™Ì' => 'á½', 'Ὗ' => 'Ὗ', 'ὠ' => 'á½ ', 'ὡ' => 'ὡ', 'ὢ' => 'á½¢', 'ὣ' => 'á½£', 'á½ Ì' => 'ὤ', 'ὡÌ' => 'á½¥', 'á½ Í‚' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'ὨÌ' => 'Ὤ', 'ὩÌ' => 'á½­', 'Ὦ' => 'á½®', 'Ὧ' => 'Ὧ', 'ὰ' => 'á½°', 'ὲ' => 'á½²', 'ὴ' => 'á½´', 'ὶ' => 'ὶ', 'ὸ' => 'ὸ', 'Ï…Ì€' => 'ὺ', 'ὼ' => 'á½¼', 'ᾀ' => 'á¾€', 'á¼Í…' => 'á¾', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'á¼…Í…' => 'á¾…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'á¼Í…' => 'á¾', 'ᾎ' => 'ᾎ', 'á¼Í…' => 'á¾', 'á¼ Í…' => 'á¾', 'ᾑ' => 'ᾑ', 'ᾒ' => 'á¾’', 'ᾓ' => 'ᾓ', 'ᾔ' => 'á¾”', 'ᾕ' => 'ᾕ', 'ᾖ' => 'á¾–', 'ᾗ' => 'á¾—', 'ᾘ' => 'ᾘ', 'ᾙ' => 'á¾™', 'ᾚ' => 'ᾚ', 'ᾛ' => 'á¾›', 'ᾜ' => 'ᾜ', 'á¼­Í…' => 'á¾', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á½ Í…' => 'á¾ ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'á¾¢', 'ᾣ' => 'á¾£', 'ᾤ' => 'ᾤ', 'ᾥ' => 'á¾¥', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'á½­Í…' => 'á¾­', 'ᾮ' => 'á¾®', 'ᾯ' => 'ᾯ', 'ᾰ' => 'á¾°', 'ᾱ' => 'á¾±', 'á½°Í…' => 'á¾²', 'ᾳ' => 'á¾³', 'ᾴ' => 'á¾´', 'ᾶ' => 'ᾶ', 'ᾷ' => 'á¾·', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'á¾¹', 'Ὰ' => 'Ὰ', 'ᾼ' => 'á¾¼', '῁' => 'á¿', 'á½´Í…' => 'á¿‚', 'ῃ' => 'ῃ', 'ῄ' => 'á¿„', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Ὴ' => 'á¿Š', 'ῌ' => 'á¿Œ', '῍' => 'á¿', '᾿Ì' => 'á¿Ž', '῏' => 'á¿', 'ῐ' => 'á¿', 'ῑ' => 'á¿‘', 'ÏŠÌ€' => 'á¿’', 'ῖ' => 'á¿–', 'ÏŠÍ‚' => 'á¿—', 'Ῐ' => 'Ῐ', 'Ῑ' => 'á¿™', 'Ὶ' => 'á¿š', '῝' => 'á¿', '῾Ì' => 'á¿ž', '῟' => 'á¿Ÿ', 'ῠ' => 'á¿ ', 'Ï…Ì„' => 'á¿¡', 'Ï‹Ì€' => 'á¿¢', 'ÏÌ“' => 'ῤ', 'ÏÌ”' => 'á¿¥', 'Ï…Í‚' => 'ῦ', 'Ï‹Í‚' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'á¿©', 'Ὺ' => 'Ὺ', 'Ῥ' => 'Ῥ', '῭' => 'á¿­', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ÏŽÍ…' => 'á¿´', 'ῶ' => 'ῶ', 'ῷ' => 'á¿·', 'Ὸ' => 'Ὸ', 'Ὼ' => 'Ὼ', 'ῼ' => 'ῼ', 'â†Ì¸' => '↚', '↛' => '↛', '↮' => '↮', 'â‡Ì¸' => 'â‡', '⇎' => '⇎', '⇏' => 'â‡', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => 'â‰', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', 'â‰Ì¸' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => 'âŠ', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => 'â‹ ', '⋡' => 'â‹¡', '⋢' => 'â‹¢', '⋣' => 'â‹£', '⋪' => '⋪', '⋫' => 'â‹«', '⋬' => '⋬', '⋭' => 'â‹­', 'ã‹ã‚™' => 'ãŒ', 'ãã‚™' => 'ãŽ', 'ãã‚™' => 'ã', 'ã‘ã‚™' => 'ã’', 'ã“ã‚™' => 'ã”', 'ã•ã‚™' => 'ã–', 'ã—ã‚™' => 'ã˜', 'ã™ã‚™' => 'ãš', 'ã›ã‚™' => 'ãœ', 'ãã‚™' => 'ãž', 'ãŸã‚™' => 'ã ', 'ã¡ã‚™' => 'ã¢', 'ã¤ã‚™' => 'ã¥', 'ã¦ã‚™' => 'ã§', 'ã¨ã‚™' => 'ã©', 'ã¯ã‚™' => 'ã°', 'ã¯ã‚š' => 'ã±', 'ã²ã‚™' => 'ã³', 'ã²ã‚š' => 'ã´', 'ãµã‚™' => 'ã¶', 'ãµã‚š' => 'ã·', 'ã¸ã‚™' => 'ã¹', 'ã¸ã‚š' => 'ãº', 'ã»ã‚™' => 'ã¼', 'ã»ã‚š' => 'ã½', 'ã†ã‚™' => 'ã‚”', 'ã‚ã‚™' => 'ã‚ž', 'ã‚«ã‚™' => 'ガ', 'ã‚­ã‚™' => 'ã‚®', 'グ' => 'ã‚°', 'ゲ' => 'ゲ', 'ゴ' => 'ã‚´', 'ザ' => 'ザ', 'ã‚·ã‚™' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ã‚¿ã‚™' => 'ダ', 'ãƒã‚™' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒã‚™' => 'ãƒ', 'ãƒã‚š' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ãƒ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '𑂚' => 'ð‘‚š', '𑂜' => 'ð‘‚œ', '𑂫' => 'ð‘‚«', '𑄮' => 'ð‘„®', '𑄯' => '𑄯', 'ð‘‡ð‘Œ¾' => 'ð‘‹', 'ð‘‡ð‘—' => 'ð‘Œ', '𑒻' => 'ð‘’»', '𑒼' => 'ð‘’¼', '𑒾' => 'ð‘’¾', '𑖺' => 'ð‘–º', '𑖻' => 'ð‘–»', '𑤸' => '𑤸'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php000064400000104172147600374260033073 0ustar00addons/amazons3addon 'AÌ€', 'Ã' => 'AÌ', 'Â' => 'AÌ‚', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Ã…' => 'AÌŠ', 'Ç' => 'Ç', 'È' => 'EÌ€', 'É' => 'EÌ', 'Ê' => 'EÌ‚', 'Ë' => 'Ë', 'ÃŒ' => 'IÌ€', 'Ã' => 'IÌ', 'ÃŽ' => 'IÌ‚', 'Ã' => 'Ï', 'Ñ' => 'Ñ', 'Ã’' => 'OÌ€', 'Ó' => 'OÌ', 'Ô' => 'OÌ‚', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'UÌ€', 'Ú' => 'UÌ', 'Û' => 'UÌ‚', 'Ãœ' => 'Ü', 'Ã' => 'YÌ', 'à' => 'aÌ€', 'á' => 'aÌ', 'â' => 'aÌ‚', 'ã' => 'ã', 'ä' => 'ä', 'Ã¥' => 'aÌŠ', 'ç' => 'ç', 'è' => 'eÌ€', 'é' => 'eÌ', 'ê' => 'eÌ‚', 'ë' => 'ë', 'ì' => 'iÌ€', 'í' => 'iÌ', 'î' => 'iÌ‚', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'oÌ€', 'ó' => 'oÌ', 'ô' => 'oÌ‚', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'uÌ€', 'ú' => 'uÌ', 'û' => 'uÌ‚', 'ü' => 'ü', 'ý' => 'yÌ', 'ÿ' => 'ÿ', 'Ä€' => 'AÌ„', 'Ä' => 'aÌ„', 'Ä‚' => 'Ă', 'ă' => 'ă', 'Ä„' => 'Ą', 'Ä…' => 'ą', 'Ć' => 'CÌ', 'ć' => 'cÌ', 'Ĉ' => 'CÌ‚', 'ĉ' => 'cÌ‚', 'ÄŠ' => 'Ċ', 'Ä‹' => 'ċ', 'ÄŒ' => 'CÌŒ', 'Ä' => 'cÌŒ', 'ÄŽ' => 'DÌŒ', 'Ä' => 'dÌŒ', 'Ä’' => 'EÌ„', 'Ä“' => 'eÌ„', 'Ä”' => 'Ĕ', 'Ä•' => 'ĕ', 'Ä–' => 'Ė', 'Ä—' => 'ė', 'Ę' => 'Ę', 'Ä™' => 'ę', 'Äš' => 'EÌŒ', 'Ä›' => 'eÌŒ', 'Äœ' => 'GÌ‚', 'Ä' => 'gÌ‚', 'Äž' => 'Ğ', 'ÄŸ' => 'ğ', 'Ä ' => 'Ġ', 'Ä¡' => 'ġ', 'Ä¢' => 'Ģ', 'Ä£' => 'ģ', 'Ĥ' => 'HÌ‚', 'Ä¥' => 'hÌ‚', 'Ĩ' => 'Ĩ', 'Ä©' => 'ĩ', 'Ī' => 'IÌ„', 'Ä«' => 'iÌ„', 'Ĭ' => 'Ĭ', 'Ä­' => 'ĭ', 'Ä®' => 'Į', 'į' => 'į', 'Ä°' => 'İ', 'Ä´' => 'JÌ‚', 'ĵ' => 'jÌ‚', 'Ķ' => 'Ķ', 'Ä·' => 'ķ', 'Ĺ' => 'LÌ', 'ĺ' => 'lÌ', 'Ä»' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'LÌŒ', 'ľ' => 'lÌŒ', 'Ń' => 'NÌ', 'Å„' => 'nÌ', 'Å…' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'NÌŒ', 'ň' => 'nÌŒ', 'ÅŒ' => 'OÌ„', 'Å' => 'oÌ„', 'ÅŽ' => 'Ŏ', 'Å' => 'ŏ', 'Å' => 'OÌ‹', 'Å‘' => 'oÌ‹', 'Å”' => 'RÌ', 'Å•' => 'rÌ', 'Å–' => 'Ŗ', 'Å—' => 'ŗ', 'Ř' => 'RÌŒ', 'Å™' => 'rÌŒ', 'Åš' => 'SÌ', 'Å›' => 'sÌ', 'Åœ' => 'SÌ‚', 'Å' => 'sÌ‚', 'Åž' => 'Ş', 'ÅŸ' => 'ş', 'Å ' => 'SÌŒ', 'Å¡' => 'sÌŒ', 'Å¢' => 'Ţ', 'Å£' => 'ţ', 'Ť' => 'TÌŒ', 'Å¥' => 'tÌŒ', 'Ũ' => 'Ũ', 'Å©' => 'ũ', 'Ū' => 'UÌ„', 'Å«' => 'uÌ„', 'Ŭ' => 'Ŭ', 'Å­' => 'ŭ', 'Å®' => 'UÌŠ', 'ů' => 'uÌŠ', 'Å°' => 'UÌ‹', 'ű' => 'uÌ‹', 'Ų' => 'Ų', 'ų' => 'ų', 'Å´' => 'WÌ‚', 'ŵ' => 'wÌ‚', 'Ŷ' => 'YÌ‚', 'Å·' => 'yÌ‚', 'Ÿ' => 'Ÿ', 'Ź' => 'ZÌ', 'ź' => 'zÌ', 'Å»' => 'Ż', 'ż' => 'ż', 'Ž' => 'ZÌŒ', 'ž' => 'zÌŒ', 'Æ ' => 'OÌ›', 'Æ¡' => 'oÌ›', 'Ư' => 'UÌ›', 'Æ°' => 'uÌ›', 'Ç' => 'AÌŒ', 'ÇŽ' => 'aÌŒ', 'Ç' => 'IÌŒ', 'Ç' => 'iÌŒ', 'Ç‘' => 'OÌŒ', 'Ç’' => 'oÌŒ', 'Ç“' => 'UÌŒ', 'Ç”' => 'uÌŒ', 'Ç•' => 'Ǖ', 'Ç–' => 'ǖ', 'Ç—' => 'ÜÌ', 'ǘ' => 'üÌ', 'Ç™' => 'Ǚ', 'Çš' => 'ǚ', 'Ç›' => 'Ǜ', 'Çœ' => 'ǜ', 'Çž' => 'Ǟ', 'ÇŸ' => 'ǟ', 'Ç ' => 'Ǡ', 'Ç¡' => 'ǡ', 'Ç¢' => 'Ǣ', 'Ç£' => 'ǣ', 'Ǧ' => 'GÌŒ', 'ǧ' => 'gÌŒ', 'Ǩ' => 'KÌŒ', 'Ç©' => 'kÌŒ', 'Ǫ' => 'Ǫ', 'Ç«' => 'ǫ', 'Ǭ' => 'Ǭ', 'Ç­' => 'ǭ', 'Ç®' => 'Æ·ÌŒ', 'ǯ' => 'Ê’ÌŒ', 'Ç°' => 'jÌŒ', 'Ç´' => 'GÌ', 'ǵ' => 'gÌ', 'Ǹ' => 'NÌ€', 'ǹ' => 'nÌ€', 'Ǻ' => 'AÌŠÌ', 'Ç»' => 'aÌŠÌ', 'Ǽ' => 'ÆÌ', 'ǽ' => 'æÌ', 'Ǿ' => 'ØÌ', 'Ç¿' => 'øÌ', 'È€' => 'AÌ', 'È' => 'aÌ', 'È‚' => 'AÌ‘', 'ȃ' => 'aÌ‘', 'È„' => 'EÌ', 'È…' => 'eÌ', 'Ȇ' => 'EÌ‘', 'ȇ' => 'eÌ‘', 'Ȉ' => 'IÌ', 'ȉ' => 'iÌ', 'ÈŠ' => 'IÌ‘', 'È‹' => 'iÌ‘', 'ÈŒ' => 'OÌ', 'È' => 'oÌ', 'ÈŽ' => 'OÌ‘', 'È' => 'oÌ‘', 'È' => 'RÌ', 'È‘' => 'rÌ', 'È’' => 'RÌ‘', 'È“' => 'rÌ‘', 'È”' => 'UÌ', 'È•' => 'uÌ', 'È–' => 'UÌ‘', 'È—' => 'uÌ‘', 'Ș' => 'Ș', 'È™' => 'ș', 'Èš' => 'Ț', 'È›' => 'ț', 'Èž' => 'HÌŒ', 'ÈŸ' => 'hÌŒ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'È©' => 'ȩ', 'Ȫ' => 'Ȫ', 'È«' => 'ȫ', 'Ȭ' => 'Ȭ', 'È­' => 'ȭ', 'È®' => 'Ȯ', 'ȯ' => 'ȯ', 'È°' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'YÌ„', 'ȳ' => 'yÌ„', 'Í€' => 'Ì€', 'Í' => 'Ì', '̓' => 'Ì“', 'Í„' => '̈Ì', 'Í´' => 'ʹ', ';' => ';', 'Î…' => '¨Ì', 'Ά' => 'ΑÌ', '·' => '·', 'Έ' => 'ΕÌ', 'Ή' => 'ΗÌ', 'Ί' => 'ΙÌ', 'ÎŒ' => 'ΟÌ', 'ÎŽ' => 'Î¥Ì', 'Î' => 'ΩÌ', 'Î' => 'ϊÌ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'αÌ', 'έ' => 'εÌ', 'ή' => 'ηÌ', 'ί' => 'ιÌ', 'ΰ' => 'ϋÌ', 'ÏŠ' => 'ϊ', 'Ï‹' => 'ϋ', 'ÏŒ' => 'οÌ', 'Ï' => 'Ï…Ì', 'ÏŽ' => 'ωÌ', 'Ï“' => 'Ï’Ì', 'Ï”' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ð' => 'Ё', 'Ѓ' => 'ГÌ', 'Ї' => 'Ї', 'ÐŒ' => 'КÌ', 'Ð' => 'Ѝ', 'ÐŽ' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'Ñ' => 'ѐ', 'Ñ‘' => 'ё', 'Ñ“' => 'гÌ', 'Ñ—' => 'ї', 'Ñœ' => 'кÌ', 'Ñ' => 'ѝ', 'Ñž' => 'ў', 'Ѷ' => 'Ñ´Ì', 'Ñ·' => 'ѵÌ', 'Ó' => 'Ӂ', 'Ó‚' => 'ӂ', 'Ó' => 'Ð̆', 'Ó‘' => 'ӑ', 'Ó’' => 'Ð̈', 'Ó“' => 'ӓ', 'Ó–' => 'Ӗ', 'Ó—' => 'ӗ', 'Óš' => 'Ӛ', 'Ó›' => 'ӛ', 'Óœ' => 'Ӝ', 'Ó' => 'ӝ', 'Óž' => 'Ӟ', 'ÓŸ' => 'ӟ', 'Ó¢' => 'Ӣ', 'Ó£' => 'ӣ', 'Ó¤' => 'Ӥ', 'Ó¥' => 'ӥ', 'Ó¦' => 'Ӧ', 'Ó§' => 'ӧ', 'Óª' => 'Ӫ', 'Ó«' => 'ӫ', 'Ó¬' => 'Ӭ', 'Ó­' => 'Ñ̈', 'Ó®' => 'Ӯ', 'Ó¯' => 'ӯ', 'Ó°' => 'Ӱ', 'Ó±' => 'ӱ', 'Ó²' => 'Ӳ', 'Ó³' => 'ӳ', 'Ó´' => 'Ӵ', 'Óµ' => 'ӵ', 'Ó¸' => 'Ӹ', 'Ó¹' => 'ӹ', 'Ø¢' => 'آ', 'Ø£' => 'أ', 'ؤ' => 'ÙˆÙ”', 'Ø¥' => 'إ', 'ئ' => 'ÙŠÙ”', 'Û€' => 'Û•Ù”', 'Û‚' => 'ÛÙ”', 'Û“' => 'Û’Ù”', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'क़' => 'क़', 'ख़' => 'ख़', 'ग़' => 'ग़', 'ज़' => 'ज़', 'ड़' => 'ड़', 'à¥' => 'ढ़', 'फ़' => 'फ़', 'य़' => 'य़', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ড়' => 'ড়', 'à§' => 'ঢ়', 'য়' => 'য়', 'ਲ਼' => 'ਲ਼', 'ਸ਼' => 'ਸ਼', 'à©™' => 'ਖ਼', 'à©š' => 'ਗ਼', 'à©›' => 'ਜ਼', 'à©ž' => 'ਫ਼', 'à­ˆ' => 'ୈ', 'à­‹' => 'ୋ', 'à­Œ' => 'ୌ', 'à­œ' => 'ଡ଼', 'à­' => 'ଢ଼', 'à®”' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'à³€' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'à·š' => 'ේ', 'à·œ' => 'à·™à·', 'à·' => 'à·™à·à·Š', 'à·ž' => 'ෞ', 'གྷ' => 'གྷ', 'à½' => 'ཌྷ', 'དྷ' => 'དྷ', 'བྷ' => 'བྷ', 'ཛྷ' => 'ཛྷ', 'ཀྵ' => 'ཀྵ', 'ཱི' => 'ཱི', 'ཱུ' => 'ཱུ', 'ྲྀ' => 'ྲྀ', 'ླྀ' => 'ླྀ', 'à¾' => 'ཱྀ', 'ྒྷ' => 'ྒྷ', 'à¾' => 'ྜྷ', 'ྡྷ' => 'ྡྷ', 'ྦྷ' => 'ྦྷ', 'ྫྷ' => 'ྫྷ', 'ྐྵ' => 'à¾à¾µ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'á¬á¬µ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'á­€' => 'ᭀ', 'á­' => 'ᭁ', 'á­ƒ' => 'ᭃ', 'Ḁ' => 'AÌ¥', 'á¸' => 'aÌ¥', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'BÌ£', 'ḅ' => 'bÌ£', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'ÇÌ', 'ḉ' => 'çÌ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'DÌ£', 'á¸' => 'dÌ£', 'Ḏ' => 'Ḏ', 'á¸' => 'ḏ', 'á¸' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'DÌ­', 'ḓ' => 'dÌ­', 'Ḕ' => 'EÌ„Ì€', 'ḕ' => 'eÌ„Ì€', 'Ḗ' => 'EÌ„Ì', 'ḗ' => 'eÌ„Ì', 'Ḙ' => 'EÌ­', 'ḙ' => 'eÌ­', 'Ḛ' => 'EÌ°', 'ḛ' => 'eÌ°', 'Ḝ' => 'Ḝ', 'á¸' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'GÌ„', 'ḡ' => 'gÌ„', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'HÌ£', 'ḥ' => 'hÌ£', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'HÌ®', 'ḫ' => 'hÌ®', 'Ḭ' => 'IÌ°', 'ḭ' => 'iÌ°', 'Ḯ' => 'ÏÌ', 'ḯ' => 'ïÌ', 'Ḱ' => 'KÌ', 'ḱ' => 'kÌ', 'Ḳ' => 'KÌ£', 'ḳ' => 'kÌ£', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'LÌ£', 'ḷ' => 'lÌ£', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'LÌ­', 'ḽ' => 'lÌ­', 'Ḿ' => 'MÌ', 'ḿ' => 'mÌ', 'á¹€' => 'Ṁ', 'á¹' => 'ṁ', 'Ṃ' => 'MÌ£', 'ṃ' => 'mÌ£', 'Ṅ' => 'Ṅ', 'á¹…' => 'ṅ', 'Ṇ' => 'NÌ£', 'ṇ' => 'nÌ£', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'NÌ­', 'ṋ' => 'nÌ­', 'Ṍ' => 'ÕÌ', 'á¹' => 'õÌ', 'Ṏ' => 'Ṏ', 'á¹' => 'ṏ', 'á¹' => 'OÌ„Ì€', 'ṑ' => 'oÌ„Ì€', 'á¹’' => 'OÌ„Ì', 'ṓ' => 'oÌ„Ì', 'á¹”' => 'PÌ', 'ṕ' => 'pÌ', 'á¹–' => 'Ṗ', 'á¹—' => 'ṗ', 'Ṙ' => 'Ṙ', 'á¹™' => 'ṙ', 'Ṛ' => 'RÌ£', 'á¹›' => 'rÌ£', 'Ṝ' => 'Ṝ', 'á¹' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'á¹ ' => 'Ṡ', 'ṡ' => 'ṡ', 'á¹¢' => 'SÌ£', 'á¹£' => 'sÌ£', 'Ṥ' => 'SÌ̇', 'á¹¥' => 'sÌ̇', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'TÌ£', 'á¹­' => 'tÌ£', 'á¹®' => 'Ṯ', 'ṯ' => 'ṯ', 'á¹°' => 'TÌ­', 'á¹±' => 'tÌ­', 'á¹²' => 'Ṳ', 'á¹³' => 'ṳ', 'á¹´' => 'UÌ°', 'á¹µ' => 'uÌ°', 'Ṷ' => 'UÌ­', 'á¹·' => 'uÌ­', 'Ṹ' => 'ŨÌ', 'á¹¹' => 'ũÌ', 'Ṻ' => 'Ṻ', 'á¹»' => 'ṻ', 'á¹¼' => 'Ṽ', 'á¹½' => 'ṽ', 'á¹¾' => 'VÌ£', 'ṿ' => 'vÌ£', 'Ẁ' => 'WÌ€', 'áº' => 'wÌ€', 'Ẃ' => 'WÌ', 'ẃ' => 'wÌ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'WÌ£', 'ẉ' => 'wÌ£', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'áº' => 'ẍ', 'Ẏ' => 'Ẏ', 'áº' => 'ẏ', 'áº' => 'ZÌ‚', 'ẑ' => 'zÌ‚', 'Ẓ' => 'ZÌ£', 'ẓ' => 'zÌ£', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'wÌŠ', 'ẙ' => 'yÌŠ', 'ẛ' => 'ẛ', 'Ạ' => 'AÌ£', 'ạ' => 'aÌ£', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'AÌ‚Ì', 'ấ' => 'aÌ‚Ì', 'Ầ' => 'AÌ‚Ì€', 'ầ' => 'aÌ‚Ì€', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'ĂÌ', 'ắ' => 'ăÌ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'EÌ£', 'ẹ' => 'eÌ£', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'EÌ‚Ì', 'ế' => 'eÌ‚Ì', 'Ề' => 'EÌ‚Ì€', 'á»' => 'eÌ‚Ì€', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'á»…' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'IÌ£', 'ị' => 'iÌ£', 'Ọ' => 'OÌ£', 'á»' => 'oÌ£', 'Ỏ' => 'Ỏ', 'á»' => 'ỏ', 'á»' => 'OÌ‚Ì', 'ố' => 'oÌ‚Ì', 'á»’' => 'OÌ‚Ì€', 'ồ' => 'oÌ‚Ì€', 'á»”' => 'Ổ', 'ổ' => 'ổ', 'á»–' => 'Ỗ', 'á»—' => 'ỗ', 'Ộ' => 'Ộ', 'á»™' => 'ộ', 'Ớ' => 'OÌ›Ì', 'á»›' => 'oÌ›Ì', 'Ờ' => 'Ờ', 'á»' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'á» ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'UÌ£', 'ụ' => 'uÌ£', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'UÌ›Ì', 'ứ' => 'uÌ›Ì', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'á»­' => 'ử', 'á»®' => 'Ữ', 'ữ' => 'ữ', 'á»°' => 'Ự', 'á»±' => 'ự', 'Ỳ' => 'YÌ€', 'ỳ' => 'yÌ€', 'á»´' => 'YÌ£', 'ỵ' => 'yÌ£', 'Ỷ' => 'Ỷ', 'á»·' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'á¼€' => 'ἀ', 'á¼' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἀÌ', 'á¼…' => 'ἁÌ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'ἈÌ', 'á¼' => 'ἉÌ', 'Ἆ' => 'Ἆ', 'á¼' => 'Ἇ', 'á¼' => 'ἐ', 'ἑ' => 'ἑ', 'á¼’' => 'ἒ', 'ἓ' => 'ἓ', 'á¼”' => 'ἐÌ', 'ἕ' => 'ἑÌ', 'Ἐ' => 'Ἐ', 'á¼™' => 'Ἑ', 'Ἒ' => 'Ἒ', 'á¼›' => 'Ἓ', 'Ἔ' => 'ἘÌ', 'á¼' => 'ἙÌ', 'á¼ ' => 'ἠ', 'ἡ' => 'ἡ', 'á¼¢' => 'ἢ', 'á¼£' => 'ἣ', 'ἤ' => 'ἠÌ', 'á¼¥' => 'ἡÌ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'ἨÌ', 'á¼­' => 'ἩÌ', 'á¼®' => 'Ἦ', 'Ἧ' => 'Ἧ', 'á¼°' => 'ἰ', 'á¼±' => 'ἱ', 'á¼²' => 'ἲ', 'á¼³' => 'ἳ', 'á¼´' => 'ἰÌ', 'á¼µ' => 'ἱÌ', 'ἶ' => 'ἶ', 'á¼·' => 'ἷ', 'Ἰ' => 'Ἰ', 'á¼¹' => 'Ἱ', 'Ἲ' => 'Ἲ', 'á¼»' => 'Ἳ', 'á¼¼' => 'ἸÌ', 'á¼½' => 'ἹÌ', 'á¼¾' => 'Ἶ', 'Ἷ' => 'Ἷ', 'á½€' => 'ὀ', 'á½' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὀÌ', 'á½…' => 'ὁÌ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'ὈÌ', 'á½' => 'ὉÌ', 'á½' => 'Ï…Ì“', 'ὑ' => 'Ï…Ì”', 'á½’' => 'Ï…Ì“Ì€', 'ὓ' => 'ὓ', 'á½”' => 'Ï…Ì“Ì', 'ὕ' => 'Ï…Ì”Ì', 'á½–' => 'Ï…Ì“Í‚', 'á½—' => 'ὗ', 'á½™' => 'Ὑ', 'á½›' => 'Ὓ', 'á½' => 'ὙÌ', 'Ὗ' => 'Ὗ', 'á½ ' => 'ὠ', 'ὡ' => 'ὡ', 'á½¢' => 'ὢ', 'á½£' => 'ὣ', 'ὤ' => 'ὠÌ', 'á½¥' => 'ὡÌ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'ὨÌ', 'á½­' => 'ὩÌ', 'á½®' => 'Ὦ', 'Ὧ' => 'Ὧ', 'á½°' => 'ὰ', 'á½±' => 'αÌ', 'á½²' => 'ὲ', 'á½³' => 'εÌ', 'á½´' => 'ὴ', 'á½µ' => 'ηÌ', 'ὶ' => 'ὶ', 'á½·' => 'ιÌ', 'ὸ' => 'ὸ', 'á½¹' => 'οÌ', 'ὺ' => 'Ï…Ì€', 'á½»' => 'Ï…Ì', 'á½¼' => 'ὼ', 'á½½' => 'ωÌ', 'á¾€' => 'ᾀ', 'á¾' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ἀÌÍ…', 'á¾…' => 'ἁÌÍ…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ἈÌÍ…', 'á¾' => 'ἉÌÍ…', 'ᾎ' => 'ᾎ', 'á¾' => 'ᾏ', 'á¾' => 'ᾐ', 'ᾑ' => 'ᾑ', 'á¾’' => 'ᾒ', 'ᾓ' => 'ᾓ', 'á¾”' => 'ἠÌÍ…', 'ᾕ' => 'ἡÌÍ…', 'á¾–' => 'ᾖ', 'á¾—' => 'ᾗ', 'ᾘ' => 'ᾘ', 'á¾™' => 'ᾙ', 'ᾚ' => 'ᾚ', 'á¾›' => 'ᾛ', 'ᾜ' => 'ἨÌÍ…', 'á¾' => 'ἩÌÍ…', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á¾ ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'á¾¢' => 'ᾢ', 'á¾£' => 'ᾣ', 'ᾤ' => 'ὠÌÍ…', 'á¾¥' => 'ὡÌÍ…', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ὨÌÍ…', 'á¾­' => 'ὩÌÍ…', 'á¾®' => 'ᾮ', 'ᾯ' => 'ᾯ', 'á¾°' => 'ᾰ', 'á¾±' => 'ᾱ', 'á¾²' => 'ᾲ', 'á¾³' => 'ᾳ', 'á¾´' => 'αÌÍ…', 'ᾶ' => 'ᾶ', 'á¾·' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'á¾¹' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'á¾»' => 'ΑÌ', 'á¾¼' => 'ᾼ', 'á¾¾' => 'ι', 'á¿' => '῁', 'á¿‚' => 'ῂ', 'ῃ' => 'ῃ', 'á¿„' => 'ηÌÍ…', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Έ' => 'ΕÌ', 'á¿Š' => 'Ὴ', 'á¿‹' => 'ΗÌ', 'á¿Œ' => 'ῌ', 'á¿' => '῍', 'á¿Ž' => '᾿Ì', 'á¿' => '῏', 'á¿' => 'ῐ', 'á¿‘' => 'ῑ', 'á¿’' => 'ῒ', 'á¿“' => 'ϊÌ', 'á¿–' => 'ῖ', 'á¿—' => 'ῗ', 'Ῐ' => 'Ῐ', 'á¿™' => 'Ῑ', 'á¿š' => 'Ὶ', 'á¿›' => 'ΙÌ', 'á¿' => '῝', 'á¿ž' => '῾Ì', 'á¿Ÿ' => '῟', 'á¿ ' => 'ῠ', 'á¿¡' => 'Ï…Ì„', 'á¿¢' => 'ῢ', 'á¿£' => 'ϋÌ', 'ῤ' => 'ÏÌ“', 'á¿¥' => 'ÏÌ”', 'ῦ' => 'Ï…Í‚', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'á¿©' => 'Ῡ', 'Ὺ' => 'Ὺ', 'á¿«' => 'Î¥Ì', 'Ῥ' => 'Ῥ', 'á¿­' => '῭', 'á¿®' => '¨Ì', '`' => '`', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'á¿´' => 'ωÌÍ…', 'ῶ' => 'ῶ', 'á¿·' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ό' => 'ΟÌ', 'Ὼ' => 'Ὼ', 'á¿»' => 'ΩÌ', 'ῼ' => 'ῼ', '´' => '´', ' ' => ' ', 'â€' => ' ', 'Ω' => 'Ω', 'K' => 'K', 'â„«' => 'AÌŠ', '↚' => 'â†Ì¸', '↛' => '↛', '↮' => '↮', 'â‡' => 'â‡Ì¸', '⇎' => '⇎', 'â‡' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', 'â‰' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => 'â‰Ì¸', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', 'âŠ' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', 'â‹ ' => '⋠', 'â‹¡' => '⋡', 'â‹¢' => '⋢', 'â‹£' => '⋣', '⋪' => '⋪', 'â‹«' => '⋫', '⋬' => '⋬', 'â‹­' => '⋭', '〈' => '〈', '〉' => '〉', 'â«œ' => 'â«Ì¸', 'ãŒ' => 'ã‹ã‚™', 'ãŽ' => 'ãã‚™', 'ã' => 'ãã‚™', 'ã’' => 'ã‘ã‚™', 'ã”' => 'ã“ã‚™', 'ã–' => 'ã•ã‚™', 'ã˜' => 'ã—ã‚™', 'ãš' => 'ã™ã‚™', 'ãœ' => 'ã›ã‚™', 'ãž' => 'ãã‚™', 'ã ' => 'ãŸã‚™', 'ã¢' => 'ã¡ã‚™', 'ã¥' => 'ã¤ã‚™', 'ã§' => 'ã¦ã‚™', 'ã©' => 'ã¨ã‚™', 'ã°' => 'ã¯ã‚™', 'ã±' => 'ã¯ã‚š', 'ã³' => 'ã²ã‚™', 'ã´' => 'ã²ã‚š', 'ã¶' => 'ãµã‚™', 'ã·' => 'ãµã‚š', 'ã¹' => 'ã¸ã‚™', 'ãº' => 'ã¸ã‚š', 'ã¼' => 'ã»ã‚™', 'ã½' => 'ã»ã‚š', 'ã‚”' => 'ã†ã‚™', 'ã‚ž' => 'ã‚ã‚™', 'ガ' => 'ã‚«ã‚™', 'ã‚®' => 'ã‚­ã‚™', 'ã‚°' => 'グ', 'ゲ' => 'ゲ', 'ã‚´' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ã‚·ã‚™', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ã‚¿ã‚™', 'ヂ' => 'ãƒã‚™', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒ' => 'ãƒã‚™', 'パ' => 'ãƒã‚š', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ãƒ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '豈' => '豈', 'ï¤' => 'æ›´', '車' => '車', '賈' => '賈', '滑' => '滑', '串' => '串', '句' => 'å¥', '龜' => '龜', '龜' => '龜', '契' => '契', '金' => '金', '喇' => 'å–‡', '奈' => '奈', 'ï¤' => '懶', '癩' => '癩', 'ï¤' => 'ç¾…', 'ï¤' => '蘿', '螺' => '螺', '裸' => '裸', '邏' => 'é‚', '樂' => '樂', '洛' => 'æ´›', '烙' => '烙', '珞' => 'çž', '落' => 'è½', '酪' => 'é…ª', '駱' => '駱', '亂' => '亂', '卵' => 'åµ', 'ï¤' => '欄', '爛' => '爛', '蘭' => '蘭', '鸞' => '鸞', '嵐' => 'åµ', '濫' => 'æ¿«', '藍' => 'è—', '襤' => '襤', '拉' => '拉', '臘' => '臘', '蠟' => 'è Ÿ', '廊' => '廊', '朗' => '朗', '浪' => '浪', '狼' => '狼', '郎' => '郎', '來' => '來', '冷' => '冷', '勞' => 'å‹ž', '擄' => 'æ“„', '櫓' => 'æ«“', '爐' => 'çˆ', '盧' => '盧', '老' => 'è€', '蘆' => '蘆', '虜' => '虜', '路' => 'è·¯', '露' => '露', '魯' => 'é­¯', '鷺' => 'é·º', '碌' => '碌', '祿' => '祿', '綠' => '綠', '菉' => 'è‰', '錄' => '錄', '鹿' => '鹿', 'ï¥' => 'è«–', '壟' => '壟', '弄' => '弄', '籠' => 'ç± ', '聾' => 'è¾', '牢' => '牢', '磊' => '磊', '賂' => '賂', '雷' => 'é›·', '壘' => '壘', '屢' => 'å±¢', '樓' => '樓', 'ï¥' => 'æ·š', '漏' => 'æ¼', 'ï¥' => 'ç´¯', 'ï¥' => '縷', '陋' => '陋', '勒' => 'å‹’', '肋' => 'è‚‹', '凜' => '凜', '凌' => '凌', '稜' => '稜', '綾' => '綾', '菱' => 'è±', '陵' => '陵', '讀' => '讀', '拏' => 'æ‹', '樂' => '樂', 'ï¥' => '諾', '丹' => '丹', '寧' => '寧', '怒' => '怒', '率' => '率', '異' => 'ç•°', '北' => '北', '磻' => '磻', '便' => '便', '復' => '復', '不' => 'ä¸', '泌' => '泌', '數' => '數', '索' => 'ç´¢', '參' => 'åƒ', '塞' => 'å¡ž', '省' => 'çœ', '葉' => '葉', '說' => '說', '殺' => '殺', '辰' => 'è¾°', '沈' => '沈', '拾' => '拾', '若' => 'è‹¥', '掠' => '掠', '略' => 'ç•¥', '亮' => '亮', '兩' => 'å…©', '凉' => '凉', '梁' => 'æ¢', '糧' => '糧', '良' => '良', '諒' => 'è«’', '量' => 'é‡', '勵' => '勵', '呂' => 'å‘‚', 'ï¦' => '女', '廬' => '廬', '旅' => 'æ—…', '濾' => '濾', '礪' => '礪', '閭' => 'é–­', '驪' => '驪', '麗' => '麗', '黎' => '黎', '力' => '力', '曆' => '曆', '歷' => 'æ­·', 'ï¦' => 'è½¢', '年' => 'å¹´', 'ï¦' => 'æ†', 'ï¦' => '戀', '撚' => 'æ’š', '漣' => 'æ¼£', '煉' => 'ç…‰', '璉' => 'ç’‰', '秊' => '秊', '練' => 'ç·´', '聯' => 'è¯', '輦' => '輦', '蓮' => 'è“®', '連' => '連', '鍊' => 'éŠ', '列' => '列', 'ï¦' => '劣', '咽' => 'å’½', '烈' => '烈', '裂' => '裂', '說' => '說', '廉' => '廉', '念' => '念', '捻' => 'æ»', '殮' => 'æ®®', '簾' => 'ç°¾', '獵' => 'çµ', '令' => '令', '囹' => '囹', '寧' => '寧', '嶺' => '嶺', '怜' => '怜', '玲' => '玲', '瑩' => 'ç‘©', '羚' => '羚', '聆' => 'è†', '鈴' => '鈴', '零' => '零', '靈' => 'éˆ', '領' => 'é ˜', '例' => '例', '禮' => '禮', '醴' => '醴', '隸' => '隸', '惡' => '惡', '了' => '了', '僚' => '僚', '寮' => '寮', '尿' => 'å°¿', '料' => 'æ–™', '樂' => '樂', '燎' => '燎', 'ï§' => '療', '蓼' => '蓼', '遼' => 'é¼', '龍' => 'é¾', '暈' => '暈', '阮' => '阮', '劉' => '劉', '杻' => 'æ»', '柳' => '柳', '流' => 'æµ', '溜' => '溜', '琉' => 'ç‰', 'ï§' => 'ç•™', '硫' => 'ç¡«', 'ï§' => 'ç´', 'ï§' => 'é¡ž', '六' => 'å…­', '戮' => '戮', '陸' => '陸', '倫' => '倫', '崙' => 'å´™', '淪' => 'æ·ª', '輪' => '輪', '律' => '律', '慄' => 'æ…„', '栗' => 'æ —', '率' => '率', '隆' => '隆', 'ï§' => '利', '吏' => 'å', '履' => 'å±¥', '易' => '易', '李' => 'æŽ', '梨' => '梨', '泥' => 'æ³¥', '理' => 'ç†', '痢' => 'ç—¢', '罹' => 'ç½¹', '裏' => 'è£', '裡' => '裡', '里' => '里', '離' => '離', '匿' => '匿', '溺' => '溺', '吝' => 'å', '燐' => 'ç‡', '璘' => 'ç’˜', '藺' => 'è—º', '隣' => '隣', '鱗' => 'é±—', '麟' => '麟', '林' => 'æž—', '淋' => 'æ·‹', '臨' => '臨', '立' => 'ç«‹', '笠' => '笠', '粒' => 'ç²’', '狀' => 'ç‹€', '炙' => 'ç‚™', '識' => 'è­˜', '什' => '什', '茶' => '茶', '刺' => '刺', '切' => '切', 'ï¨' => '度', '拓' => 'æ‹“', '糖' => 'ç³–', '宅' => 'å®…', '洞' => 'æ´ž', '暴' => 'æš´', '輻' => 'è¼»', '行' => 'è¡Œ', '降' => 'é™', '見' => '見', '廓' => '廓', '兀' => 'å…€', 'ï¨' => 'å—€', 'ï¨' => 'å¡š', '晴' => 'æ™´', '凞' => '凞', '猪' => '猪', '益' => '益', '礼' => '礼', '神' => '神', '祥' => '祥', '福' => 'ç¦', '靖' => 'é–', 'ï¨' => 'ç²¾', '羽' => 'ç¾½', '蘒' => '蘒', '諸' => '諸', '逸' => '逸', '都' => '都', '飯' => '飯', '飼' => '飼', '館' => '館', '鶴' => '鶴', '郞' => '郞', '隷' => 'éš·', '侮' => 'ä¾®', '僧' => '僧', '免' => 'å…', '勉' => '勉', '勤' => '勤', '卑' => 'å‘', '喝' => 'å–', '嘆' => '嘆', '器' => '器', '塀' => 'å¡€', '墨' => '墨', '層' => '層', '屮' => 'å±®', '悔' => 'æ‚”', '慨' => 'æ…¨', '憎' => '憎', 'ï©€' => '懲', 'ï©' => 'æ•', 'ï©‚' => 'æ—¢', '暑' => 'æš‘', 'ï©„' => '梅', 'ï©…' => 'æµ·', '渚' => '渚', '漢' => 'æ¼¢', '煮' => 'ç…®', '爫' => '爫', 'ï©Š' => 'ç¢', 'ï©‹' => '碑', 'ï©Œ' => '社', 'ï©' => '祉', 'ï©Ž' => '祈', 'ï©' => 'ç¥', 'ï©' => '祖', 'ï©‘' => 'ç¥', 'ï©’' => 'ç¦', 'ï©“' => '禎', 'ï©”' => 'ç©€', 'ï©•' => 'çª', 'ï©–' => '節', 'ï©—' => 'ç·´', '縉' => '縉', 'ï©™' => 'ç¹', 'ï©š' => 'ç½²', 'ï©›' => '者', 'ï©œ' => '臭', 'ï©' => '艹', 'ï©ž' => '艹', 'ï©Ÿ' => 'è‘—', 'ï© ' => 'è¤', 'ï©¡' => '視', 'ï©¢' => 'è¬', 'ï©£' => '謹', '賓' => '賓', 'ï©¥' => 'è´ˆ', '辶' => '辶', '逸' => '逸', '難' => '難', 'ï©©' => '響', '頻' => 'é »', 'ï©«' => 'æµ', '𤋮' => '𤋮', 'ï©­' => '舘', 'ï©°' => '並', '况' => '况', '全' => 'å…¨', '侀' => 'ä¾€', 'ï©´' => 'å……', '冀' => '冀', '勇' => '勇', 'ï©·' => '勺', '喝' => 'å–', '啕' => 'å••', '喙' => 'å–™', 'ï©»' => 'å—¢', '塚' => 'å¡š', '墳' => '墳', '奄' => '奄', 'ï©¿' => '奔', '婢' => 'å©¢', 'ïª' => '嬨', '廒' => 'å»’', '廙' => 'å»™', '彩' => '彩', '徭' => 'å¾­', '惘' => '惘', '慎' => 'æ…Ž', '愈' => '愈', '憎' => '憎', '慠' => 'æ… ', '懲' => '懲', '戴' => '戴', 'ïª' => 'æ„', '搜' => 'æœ', 'ïª' => 'æ‘’', 'ïª' => 'æ•–', '晴' => 'æ™´', '朗' => '朗', '望' => '望', '杖' => 'æ–', '歹' => 'æ­¹', '殺' => '殺', '流' => 'æµ', '滛' => 'æ»›', '滋' => '滋', '漢' => 'æ¼¢', '瀞' => '瀞', '煮' => 'ç…®', 'ïª' => '瞧', '爵' => '爵', '犯' => '犯', '猪' => '猪', '瑱' => '瑱', '甆' => '甆', '画' => 'ç”»', '瘝' => 'ç˜', '瘟' => '瘟', '益' => '益', '盛' => 'ç››', '直' => 'ç›´', '睊' => 'çŠ', '着' => 'ç€', '磌' => '磌', '窱' => '窱', '節' => '節', '类' => 'ç±»', '絛' => 'çµ›', '練' => 'ç·´', '缾' => 'ç¼¾', '者' => '者', '荒' => 'è’', '華' => 'è¯', '蝹' => 'è¹', '襁' => 'è¥', '覆' => '覆', '視' => '視', '調' => '調', '諸' => '諸', '請' => 'è«‹', '謁' => 'è¬', '諾' => '諾', '諭' => 'è«­', '謹' => '謹', 'ï«€' => '變', 'ï«' => 'è´ˆ', 'ï«‚' => '輸', '遲' => 'é²', 'ï«„' => '醙', 'ï«…' => '鉶', '陼' => '陼', '難' => '難', '靖' => 'é–', '韛' => '韛', 'ï«Š' => '響', 'ï«‹' => 'é ‹', 'ï«Œ' => 'é »', 'ï«' => '鬒', 'ï«Ž' => '龜', 'ï«' => '𢡊', 'ï«' => '𢡄', 'ï«‘' => 'ð£•', 'ï«’' => 'ã®', 'ï«“' => '䀘', 'ï«”' => '䀹', 'ï«•' => '𥉉', 'ï«–' => 'ð¥³', 'ï«—' => '𧻓', '齃' => '齃', 'ï«™' => '龎', 'ï¬' => '×™Ö´', 'ײַ' => 'ײַ', 'שׁ' => 'ש×', 'שׂ' => 'שׂ', 'שּׁ' => 'שּ×', 'שּׂ' => 'שּׂ', 'אַ' => '×Ö·', 'אָ' => '×Ö¸', 'אּ' => '×Ö¼', 'בּ' => 'בּ', 'גּ' => '×’Ö¼', 'דּ' => 'דּ', 'הּ' => '×”Ö¼', 'וּ' => 'וּ', 'זּ' => '×–Ö¼', 'טּ' => 'טּ', 'יּ' => '×™Ö¼', 'ךּ' => 'ךּ', 'כּ' => '×›Ö¼', 'לּ' => 'לּ', 'מּ' => 'מּ', 'ï­€' => '× Ö¼', 'ï­' => 'סּ', 'ï­ƒ' => '×£Ö¼', 'ï­„' => 'פּ', 'ï­†' => 'צּ', 'ï­‡' => 'קּ', 'ï­ˆ' => 'רּ', 'ï­‰' => 'שּ', 'ï­Š' => 'תּ', 'ï­‹' => 'וֹ', 'ï­Œ' => 'בֿ', 'ï­' => '×›Ö¿', 'ï­Ž' => 'פֿ', 'ð‘‚š' => '𑂚', 'ð‘‚œ' => '𑂜', 'ð‘‚«' => '𑂫', 'ð‘„®' => '𑄮', '𑄯' => '𑄯', 'ð‘‹' => 'ð‘‡ð‘Œ¾', 'ð‘Œ' => 'ð‘‡ð‘—', 'ð‘’»' => '𑒻', 'ð‘’¼' => '𑒼', 'ð‘’¾' => '𑒾', 'ð‘–º' => '𑖺', 'ð‘–»' => '𑖻', '𑤸' => '𑤸', 'ð…ž' => 'ð…—ð…¥', 'ð…Ÿ' => 'ð…˜ð…¥', 'ð… ' => 'ð…˜ð…¥ð…®', 'ð…¡' => 'ð…˜ð…¥ð…¯', 'ð…¢' => 'ð…˜ð…¥ð…°', 'ð…£' => 'ð…˜ð…¥ð…±', 'ð…¤' => 'ð…˜ð…¥ð…²', 'ð†»' => 'ð†¹ð…¥', 'ð†¼' => 'ð†ºð…¥', 'ð†½' => 'ð†¹ð…¥ð…®', 'ð†¾' => 'ð†ºð…¥ð…®', 'ð†¿' => 'ð†¹ð…¥ð…¯', 'ð‡€' => 'ð†ºð…¥ð…¯', '丽' => '丽', 'ð¯ ' => '丸', '乁' => 'ä¹', '𠄢' => 'ð „¢', '你' => 'ä½ ', '侮' => 'ä¾®', '侻' => 'ä¾»', '倂' => '倂', '偺' => 'åº', '備' => 'å‚™', '僧' => '僧', '像' => 'åƒ', '㒞' => 'ã’ž', 'ð¯ ' => '𠘺', '免' => 'å…', 'ð¯ ' => 'å…”', 'ð¯ ' => 'å…¤', '具' => 'å…·', '𠔜' => '𠔜', '㒹' => 'ã’¹', '內' => 'å…§', '再' => 'å†', '𠕋' => 'ð •‹', '冗' => '冗', '冤' => '冤', '仌' => '仌', '冬' => '冬', '况' => '况', '𩇟' => '𩇟', 'ð¯ ' => '凵', '刃' => '刃', '㓟' => 'ã“Ÿ', '刻' => '刻', '剆' => '剆', '割' => '割', '剷' => '剷', '㔕' => '㔕', '勇' => '勇', '勉' => '勉', '勤' => '勤', '勺' => '勺', '包' => '包', '匆' => '匆', '北' => '北', '卉' => 'å‰', '卑' => 'å‘', '博' => 'åš', '即' => 'å³', '卽' => 'å½', '卿' => 'å¿', '卿' => 'å¿', '卿' => 'å¿', '𠨬' => '𠨬', '灰' => 'ç°', '及' => 'åŠ', '叟' => 'åŸ', '𠭣' => 'ð ­£', '叫' => 'å«', '叱' => 'å±', '吆' => 'å†', '咞' => 'å’ž', '吸' => 'å¸', '呈' => '呈', '周' => '周', '咢' => 'å’¢', 'ð¯¡' => '哶', '唐' => 'å”', '啓' => 'å•“', '啣' => 'å•£', '善' => 'å–„', '善' => 'å–„', '喙' => 'å–™', '喫' => 'å–«', '喳' => 'å–³', '嗂' => 'å—‚', '圖' => '圖', '嘆' => '嘆', 'ð¯¡' => '圗', '噑' => '噑', 'ð¯¡' => 'å™´', 'ð¯¡' => '切', '壮' => '壮', '城' => '城', '埴' => '埴', '堍' => 'å ', '型' => 'åž‹', '堲' => 'å ²', '報' => 'å ±', '墬' => '墬', '𡓤' => '𡓤', '売' => '売', '壷' => '壷', '夆' => '夆', 'ð¯¡' => '多', '夢' => '夢', '奢' => '奢', '𡚨' => '𡚨', '𡛪' => '𡛪', '姬' => '姬', '娛' => '娛', '娧' => '娧', '姘' => '姘', '婦' => '婦', '㛮' => 'ã›®', '㛼' => '㛼', '嬈' => '嬈', '嬾' => '嬾', '嬾' => '嬾', '𡧈' => '𡧈', '寃' => '寃', '寘' => '寘', '寧' => '寧', '寳' => '寳', '𡬘' => '𡬘', '寿' => '寿', '将' => 'å°†', '当' => '当', '尢' => 'å°¢', '㞁' => 'ãž', '屠' => 'å± ', '屮' => 'å±®', '峀' => 'å³€', '岍' => 'å²', '𡷤' => 'ð¡·¤', '嵃' => '嵃', '𡷦' => 'ð¡·¦', '嵮' => 'åµ®', '嵫' => '嵫', '嵼' => 'åµ¼', 'ð¯¢' => 'å·¡', '巢' => 'å·¢', '㠯' => 'ã ¯', '巽' => 'å·½', '帨' => '帨', '帽' => '帽', '幩' => '幩', '㡢' => 'ã¡¢', '𢆃' => '𢆃', '㡼' => '㡼', '庰' => '庰', '庳' => '庳', 'ð¯¢' => '庶', '廊' => '廊', 'ð¯¢' => '𪎒', 'ð¯¢' => '廾', '𢌱' => '𢌱', '𢌱' => '𢌱', '舁' => 'èˆ', '弢' => 'å¼¢', '弢' => 'å¼¢', '㣇' => '㣇', '𣊸' => '𣊸', '𦇚' => '𦇚', '形' => 'å½¢', '彫' => '彫', '㣣' => '㣣', '徚' => '徚', 'ð¯¢' => 'å¿', '志' => 'å¿—', '忹' => '忹', '悁' => 'æ‚', '㤺' => '㤺', '㤜' => '㤜', '悔' => 'æ‚”', '𢛔' => '𢛔', '惇' => '惇', '慈' => 'æ…ˆ', '慌' => 'æ…Œ', '慎' => 'æ…Ž', '慌' => 'æ…Œ', '慺' => 'æ…º', '憎' => '憎', '憲' => '憲', '憤' => '憤', '憯' => '憯', '懞' => '懞', '懲' => '懲', '懶' => '懶', '成' => 'æˆ', '戛' => '戛', '扝' => 'æ‰', '抱' => '抱', '拔' => 'æ‹”', '捐' => 'æ', '𢬌' => '𢬌', '挽' => '挽', '拼' => '拼', '捨' => 'æ¨', '掃' => '掃', '揤' => 'æ¤', '𢯱' => '𢯱', '搢' => 'æ¢', '揅' => 'æ…', 'ð¯£' => '掩', '㨮' => '㨮', '摩' => 'æ‘©', '摾' => '摾', '撝' => 'æ’', '摷' => 'æ‘·', '㩬' => '㩬', '敏' => 'æ•', '敬' => '敬', '𣀊' => '𣀊', '旣' => 'æ—£', '書' => '書', 'ð¯£' => '晉', '㬙' => '㬙', 'ð¯£' => 'æš‘', 'ð¯£' => '㬈', '㫤' => '㫤', '冒' => '冒', '冕' => '冕', '最' => '最', '暜' => 'æšœ', '肭' => 'è‚­', '䏙' => 'ä™', '朗' => '朗', '望' => '望', '朡' => '朡', '杞' => 'æž', '杓' => 'æ“', 'ð¯£' => 'ð£ƒ', '㭉' => 'ã­‰', '柺' => '柺', '枅' => 'æž…', '桒' => 'æ¡’', '梅' => '梅', '𣑭' => '𣑭', '梎' => '梎', '栟' => 'æ Ÿ', '椔' => '椔', '㮝' => 'ã®', '楂' => '楂', '榣' => '榣', '槪' => '槪', '檨' => '檨', '𣚣' => '𣚣', '櫛' => 'æ«›', '㰘' => 'ã°˜', '次' => '次', '𣢧' => '𣢧', '歔' => 'æ­”', '㱎' => '㱎', '歲' => 'æ­²', '殟' => '殟', '殺' => '殺', '殻' => 'æ®»', '𣪍' => 'ð£ª', '𡴋' => 'ð¡´‹', '𣫺' => '𣫺', '汎' => '汎', '𣲼' => '𣲼', '沿' => '沿', '泍' => 'æ³', '汧' => '汧', '洖' => 'æ´–', '派' => 'æ´¾', 'ð¯¤' => 'æµ·', '流' => 'æµ', '浩' => '浩', '浸' => '浸', '涅' => '涅', '𣴞' => '𣴞', '洴' => 'æ´´', '港' => '港', '湮' => 'æ¹®', '㴳' => 'ã´³', '滋' => '滋', '滇' => '滇', 'ð¯¤' => '𣻑', '淹' => 'æ·¹', 'ð¯¤' => 'æ½®', 'ð¯¤' => '𣽞', '𣾎' => '𣾎', '濆' => '濆', '瀹' => '瀹', '瀞' => '瀞', '瀛' => '瀛', '㶖' => '㶖', '灊' => 'çŠ', '災' => 'ç½', '灷' => 'ç·', '炭' => 'ç‚­', '𠔥' => '𠔥', '煅' => 'ç……', 'ð¯¤' => '𤉣', '熜' => '熜', '𤎫' => '𤎫', '爨' => '爨', '爵' => '爵', '牐' => 'ç‰', '𤘈' => '𤘈', '犀' => '犀', '犕' => '犕', '𤜵' => '𤜵', '𤠔' => '𤠔', '獺' => 'çº', '王' => '王', '㺬' => '㺬', '玥' => '玥', '㺸' => '㺸', '㺸' => '㺸', '瑇' => '瑇', '瑜' => 'ç‘œ', '瑱' => '瑱', '璅' => 'ç’…', '瓊' => 'ç“Š', '㼛' => 'ã¼›', '甤' => '甤', '𤰶' => '𤰶', '甾' => '甾', '𤲒' => '𤲒', '異' => 'ç•°', '𢆟' => '𢆟', '瘐' => 'ç˜', '𤾡' => '𤾡', '𤾸' => '𤾸', '𥁄' => 'ð¥„', '㿼' => '㿼', '䀈' => '䀈', '直' => 'ç›´', 'ð¯¥' => '𥃳', '𥃲' => '𥃲', '𥄙' => '𥄙', '𥄳' => '𥄳', '眞' => '眞', '真' => '真', '真' => '真', '睊' => 'çŠ', '䀹' => '䀹', '瞋' => 'çž‹', '䁆' => 'ä†', '䂖' => 'ä‚–', 'ð¯¥' => 'ð¥', '硎' => 'ç¡Ž', 'ð¯¥' => '碌', 'ð¯¥' => '磌', '䃣' => '䃣', '𥘦' => '𥘦', '祖' => '祖', '𥚚' => '𥚚', '𥛅' => '𥛅', '福' => 'ç¦', '秫' => '秫', '䄯' => '䄯', '穀' => 'ç©€', '穊' => 'ç©Š', '穏' => 'ç©', '𥥼' => '𥥼', 'ð¯¥' => '𥪧', '𥪧' => '𥪧', '竮' => 'ç«®', '䈂' => '䈂', '𥮫' => '𥮫', '篆' => '篆', '築' => '築', '䈧' => '䈧', '𥲀' => '𥲀', '糒' => 'ç³’', '䊠' => '䊠', '糨' => '糨', '糣' => 'ç³£', '紀' => 'ç´€', '𥾆' => '𥾆', '絣' => 'çµ£', '䌁' => 'äŒ', '緇' => 'ç·‡', '縂' => '縂', '繅' => 'ç¹…', '䌴' => '䌴', '𦈨' => '𦈨', '𦉇' => '𦉇', '䍙' => 'ä™', '𦋙' => '𦋙', '罺' => '罺', '𦌾' => '𦌾', '羕' => '羕', '翺' => '翺', '者' => '者', '𦓚' => '𦓚', '𦔣' => '𦔣', '聠' => 'è ', '𦖨' => '𦖨', '聰' => 'è°', '𣍟' => 'ð£Ÿ', 'ð¯¦' => 'ä•', '育' => '育', '脃' => '脃', '䐋' => 'ä‹', '脾' => '脾', '媵' => '媵', '𦞧' => '𦞧', '𦞵' => '𦞵', '𣎓' => '𣎓', '𣎜' => '𣎜', '舁' => 'èˆ', '舄' => '舄', 'ð¯¦' => '辞', '䑫' => 'ä‘«', 'ð¯¦' => '芑', 'ð¯¦' => '芋', '芝' => 'èŠ', '劳' => '劳', '花' => '花', '芳' => '芳', '芽' => '芽', '苦' => '苦', '𦬼' => '𦬼', '若' => 'è‹¥', '茝' => 'èŒ', '荣' => 'è£', '莭' => '莭', '茣' => '茣', 'ð¯¦' => '莽', '菧' => 'è§', '著' => 'è‘—', '荓' => 'è“', '菊' => 'èŠ', '菌' => 'èŒ', '菜' => 'èœ', '𦰶' => '𦰶', '𦵫' => '𦵫', '𦳕' => '𦳕', '䔫' => '䔫', '蓱' => '蓱', '蓳' => '蓳', '蔖' => 'è”–', '𧏊' => 'ð§Š', '蕤' => '蕤', '𦼬' => '𦼬', '䕝' => 'ä•', '䕡' => 'ä•¡', '𦾱' => '𦾱', '𧃒' => '𧃒', '䕫' => 'ä•«', '虐' => 'è™', '虜' => '虜', '虧' => '虧', '虩' => '虩', '蚩' => 'èš©', '蚈' => '蚈', '蜎' => '蜎', '蛢' => '蛢', '蝹' => 'è¹', '蜨' => '蜨', '蝫' => 'è«', '螆' => '螆', '䗗' => 'ä——', '蟡' => '蟡', 'ð¯§' => 'è ', '䗹' => 'ä—¹', '衠' => 'è¡ ', '衣' => 'è¡£', '𧙧' => '𧙧', '裗' => '裗', '裞' => '裞', '䘵' => '䘵', '裺' => '裺', '㒻' => 'ã’»', '𧢮' => '𧢮', '𧥦' => '𧥦', 'ð¯§' => 'äš¾', '䛇' => '䛇', 'ð¯§' => '誠', 'ð¯§' => 'è«­', '變' => '變', '豕' => '豕', '𧲨' => '𧲨', '貫' => '貫', '賁' => 'è³', '贛' => 'è´›', '起' => 'èµ·', '𧼯' => '𧼯', '𠠄' => 'ð  „', '跋' => 'è·‹', '趼' => '趼', '跰' => 'è·°', 'ð¯§' => '𠣞', '軔' => 'è»”', '輸' => '輸', '𨗒' => '𨗒', '𨗭' => '𨗭', '邔' => 'é‚”', '郱' => '郱', '鄑' => 'é„‘', '𨜮' => '𨜮', '鄛' => 'é„›', '鈸' => '鈸', '鋗' => 'é‹—', '鋘' => '鋘', '鉼' => '鉼', '鏹' => 'é¹', '鐕' => 'é•', '𨯺' => '𨯺', '開' => 'é–‹', '䦕' => '䦕', '閷' => 'é–·', '𨵷' => '𨵷', '䧦' => '䧦', '雃' => '雃', '嶲' => '嶲', '霣' => '霣', '𩅅' => 'ð©……', '𩈚' => '𩈚', '䩮' => 'ä©®', '䩶' => '䩶', '韠' => '韠', '𩐊' => 'ð©Š', '䪲' => '䪲', '𩒖' => 'ð©’–', '頋' => 'é ‹', '頋' => 'é ‹', '頩' => 'é ©', 'ð¯¨' => 'ð©–¶', '飢' => '飢', '䬳' => '䬳', '餩' => '餩', '馧' => '馧', '駂' => '駂', '駾' => '駾', '䯎' => '䯎', '𩬰' => '𩬰', '鬒' => '鬒', '鱀' => 'é±€', '鳽' => 'é³½', 'ð¯¨' => '䳎', '䳭' => 'ä³­', 'ð¯¨' => '鵧', 'ð¯¨' => '𪃎', '䳸' => '䳸', '𪄅' => '𪄅', '𪈎' => '𪈎', '𪊑' => '𪊑', '麻' => '麻', '䵖' => 'äµ–', '黹' => '黹', '黾' => '黾', '鼅' => 'é¼…', '鼏' => 'é¼', '鼖' => 'é¼–', '鼻' => 'é¼»', 'ð¯¨' => '𪘀'); amazons3addon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php000064400000027215147600374260031344 0ustar00addons 230, 'Ì' => 230, 'Ì‚' => 230, '̃' => 230, 'Ì„' => 230, 'Ì…' => 230, '̆' => 230, '̇' => 230, '̈' => 230, '̉' => 230, 'ÌŠ' => 230, 'Ì‹' => 230, 'ÌŒ' => 230, 'Ì' => 230, 'ÌŽ' => 230, 'Ì' => 230, 'Ì' => 230, 'Ì‘' => 230, 'Ì’' => 230, 'Ì“' => 230, 'Ì”' => 230, 'Ì•' => 232, 'Ì–' => 220, 'Ì—' => 220, '̘' => 220, 'Ì™' => 220, 'Ìš' => 232, 'Ì›' => 216, 'Ìœ' => 220, 'Ì' => 220, 'Ìž' => 220, 'ÌŸ' => 220, 'Ì ' => 220, 'Ì¡' => 202, 'Ì¢' => 202, 'Ì£' => 220, '̤' => 220, 'Ì¥' => 220, '̦' => 220, '̧' => 202, '̨' => 202, 'Ì©' => 220, '̪' => 220, 'Ì«' => 220, '̬' => 220, 'Ì­' => 220, 'Ì®' => 220, '̯' => 220, 'Ì°' => 220, '̱' => 220, '̲' => 220, '̳' => 220, 'Ì´' => 1, '̵' => 1, '̶' => 1, 'Ì·' => 1, '̸' => 1, '̹' => 220, '̺' => 220, 'Ì»' => 220, '̼' => 220, '̽' => 230, '̾' => 230, 'Ì¿' => 230, 'Í€' => 230, 'Í' => 230, 'Í‚' => 230, '̓' => 230, 'Í„' => 230, 'Í…' => 240, '͆' => 230, '͇' => 220, '͈' => 220, '͉' => 220, 'ÍŠ' => 230, 'Í‹' => 230, 'ÍŒ' => 230, 'Í' => 220, 'ÍŽ' => 220, 'Í' => 230, 'Í‘' => 230, 'Í’' => 230, 'Í“' => 220, 'Í”' => 220, 'Í•' => 220, 'Í–' => 220, 'Í—' => 230, '͘' => 232, 'Í™' => 220, 'Íš' => 220, 'Í›' => 230, 'Íœ' => 233, 'Í' => 234, 'Íž' => 234, 'ÍŸ' => 233, 'Í ' => 234, 'Í¡' => 234, 'Í¢' => 233, 'Í£' => 230, 'ͤ' => 230, 'Í¥' => 230, 'ͦ' => 230, 'ͧ' => 230, 'ͨ' => 230, 'Í©' => 230, 'ͪ' => 230, 'Í«' => 230, 'ͬ' => 230, 'Í­' => 230, 'Í®' => 230, 'ͯ' => 230, 'Òƒ' => 230, 'Ò„' => 230, 'Ò…' => 230, 'Ò†' => 230, 'Ò‡' => 230, 'Ö‘' => 220, 'Ö’' => 230, 'Ö“' => 230, 'Ö”' => 230, 'Ö•' => 230, 'Ö–' => 220, 'Ö—' => 230, 'Ö˜' => 230, 'Ö™' => 230, 'Öš' => 222, 'Ö›' => 220, 'Öœ' => 230, 'Ö' => 230, 'Öž' => 230, 'ÖŸ' => 230, 'Ö ' => 230, 'Ö¡' => 230, 'Ö¢' => 220, 'Ö£' => 220, 'Ö¤' => 220, 'Ö¥' => 220, 'Ö¦' => 220, 'Ö§' => 220, 'Ö¨' => 230, 'Ö©' => 230, 'Öª' => 220, 'Ö«' => 230, 'Ö¬' => 230, 'Ö­' => 222, 'Ö®' => 228, 'Ö¯' => 230, 'Ö°' => 10, 'Ö±' => 11, 'Ö²' => 12, 'Ö³' => 13, 'Ö´' => 14, 'Öµ' => 15, 'Ö¶' => 16, 'Ö·' => 17, 'Ö¸' => 18, 'Ö¹' => 19, 'Öº' => 19, 'Ö»' => 20, 'Ö¼' => 21, 'Ö½' => 22, 'Ö¿' => 23, '×' => 24, 'ׂ' => 25, 'ׄ' => 230, '×…' => 220, 'ׇ' => 18, 'Ø' => 230, 'Ø‘' => 230, 'Ø’' => 230, 'Ø“' => 230, 'Ø”' => 230, 'Ø•' => 230, 'Ø–' => 230, 'Ø—' => 230, 'ؘ' => 30, 'Ø™' => 31, 'Øš' => 32, 'Ù‹' => 27, 'ÙŒ' => 28, 'Ù' => 29, 'ÙŽ' => 30, 'Ù' => 31, 'Ù' => 32, 'Ù‘' => 33, 'Ù’' => 34, 'Ù“' => 230, 'Ù”' => 230, 'Ù•' => 220, 'Ù–' => 220, 'Ù—' => 230, 'Ù˜' => 230, 'Ù™' => 230, 'Ùš' => 230, 'Ù›' => 230, 'Ùœ' => 220, 'Ù' => 230, 'Ùž' => 230, 'ÙŸ' => 220, 'Ù°' => 35, 'Û–' => 230, 'Û—' => 230, 'Û˜' => 230, 'Û™' => 230, 'Ûš' => 230, 'Û›' => 230, 'Ûœ' => 230, 'ÛŸ' => 230, 'Û ' => 230, 'Û¡' => 230, 'Û¢' => 230, 'Û£' => 220, 'Û¤' => 230, 'Û§' => 230, 'Û¨' => 230, 'Ûª' => 220, 'Û«' => 230, 'Û¬' => 230, 'Û­' => 220, 'Ü‘' => 36, 'Ü°' => 230, 'ܱ' => 220, 'ܲ' => 230, 'ܳ' => 230, 'Ü´' => 220, 'ܵ' => 230, 'ܶ' => 230, 'Ü·' => 220, 'ܸ' => 220, 'ܹ' => 220, 'ܺ' => 230, 'Ü»' => 220, 'ܼ' => 220, 'ܽ' => 230, 'ܾ' => 220, 'Ü¿' => 230, 'Ý€' => 230, 'Ý' => 230, 'Ý‚' => 220, '݃' => 230, 'Ý„' => 220, 'Ý…' => 230, '݆' => 220, '݇' => 230, '݈' => 220, '݉' => 230, 'ÝŠ' => 230, 'ß«' => 230, '߬' => 230, 'ß­' => 230, 'ß®' => 230, '߯' => 230, 'ß°' => 230, 'ß±' => 230, 'ß²' => 220, 'ß³' => 230, 'ß½' => 220, 'à –' => 230, 'à —' => 230, 'à ˜' => 230, 'à ™' => 230, 'à ›' => 230, 'à œ' => 230, 'à ' => 230, 'à ž' => 230, 'à Ÿ' => 230, 'à  ' => 230, 'à ¡' => 230, 'à ¢' => 230, 'à £' => 230, 'à ¥' => 230, 'à ¦' => 230, 'à §' => 230, 'à ©' => 230, 'à ª' => 230, 'à «' => 230, 'à ¬' => 230, 'à ­' => 230, 'à¡™' => 220, 'à¡š' => 220, 'à¡›' => 220, '࣓' => 220, 'ࣔ' => 230, 'ࣕ' => 230, 'ࣖ' => 230, 'ࣗ' => 230, 'ࣘ' => 230, 'ࣙ' => 230, 'ࣚ' => 230, 'ࣛ' => 230, 'ࣜ' => 230, 'à£' => 230, 'ࣞ' => 230, 'ࣟ' => 230, '࣠' => 230, '࣡' => 230, 'ࣣ' => 220, 'ࣤ' => 230, 'ࣥ' => 230, 'ࣦ' => 220, 'ࣧ' => 230, 'ࣨ' => 230, 'ࣩ' => 220, '࣪' => 230, '࣫' => 230, '࣬' => 230, '࣭' => 220, '࣮' => 220, '࣯' => 220, 'ࣰ' => 27, 'ࣱ' => 28, 'ࣲ' => 29, 'ࣳ' => 230, 'ࣴ' => 230, 'ࣵ' => 230, 'ࣶ' => 220, 'ࣷ' => 230, 'ࣸ' => 230, 'ࣹ' => 220, 'ࣺ' => 220, 'ࣻ' => 230, 'ࣼ' => 230, 'ࣽ' => 230, 'ࣾ' => 230, 'ࣿ' => 230, '़' => 7, 'à¥' => 9, '॑' => 230, '॒' => 220, '॓' => 230, '॔' => 230, '়' => 7, 'à§' => 9, '৾' => 230, '਼' => 7, 'à©' => 9, '઼' => 7, 'à«' => 9, '଼' => 7, 'à­' => 9, 'à¯' => 9, 'à±' => 9, 'ౕ' => 84, 'à±–' => 91, '಼' => 7, 'à³' => 9, 'à´»' => 9, 'à´¼' => 9, 'àµ' => 9, 'à·Š' => 9, 'ุ' => 103, 'ู' => 103, 'ฺ' => 9, '่' => 107, '้' => 107, '๊' => 107, '๋' => 107, 'ຸ' => 118, 'ູ' => 118, '຺' => 9, '່' => 122, '້' => 122, '໊' => 122, '໋' => 122, '༘' => 220, '༙' => 220, '༵' => 220, '༷' => 220, '༹' => 216, 'ཱ' => 129, 'ི' => 130, 'ུ' => 132, 'ེ' => 130, 'ཻ' => 130, 'ོ' => 130, 'ཽ' => 130, 'ྀ' => 130, 'ྂ' => 230, 'ྃ' => 230, '྄' => 9, '྆' => 230, '྇' => 230, '࿆' => 220, '့' => 7, '္' => 9, '်' => 9, 'á‚' => 220, 'á' => 230, 'áž' => 230, 'áŸ' => 230, '᜔' => 9, '᜴' => 9, '្' => 9, 'áŸ' => 230, 'ᢩ' => 228, '᤹' => 222, '᤺' => 230, '᤻' => 220, 'ᨗ' => 230, 'ᨘ' => 220, 'á© ' => 9, '᩵' => 230, '᩶' => 230, 'á©·' => 230, '᩸' => 230, '᩹' => 230, '᩺' => 230, 'á©»' => 230, '᩼' => 230, 'á©¿' => 220, '᪰' => 230, '᪱' => 230, '᪲' => 230, '᪳' => 230, '᪴' => 230, '᪵' => 220, '᪶' => 220, '᪷' => 220, '᪸' => 220, '᪹' => 220, '᪺' => 220, '᪻' => 230, '᪼' => 230, '᪽' => 220, 'ᪿ' => 220, 'á«€' => 220, '᬴' => 7, 'á­„' => 9, 'á­«' => 230, 'á­¬' => 220, 'á­­' => 230, 'á­®' => 230, 'á­¯' => 230, 'á­°' => 230, 'á­±' => 230, 'á­²' => 230, 'á­³' => 230, '᮪' => 9, '᮫' => 9, '᯦' => 7, '᯲' => 9, '᯳' => 9, 'á°·' => 7, 'á³' => 230, '᳑' => 230, 'á³’' => 230, 'á³”' => 1, '᳕' => 220, 'á³–' => 220, 'á³—' => 220, '᳘' => 220, 'á³™' => 220, '᳚' => 230, 'á³›' => 230, '᳜' => 220, 'á³' => 220, '᳞' => 220, '᳟' => 220, 'á³ ' => 230, 'á³¢' => 1, 'á³£' => 1, '᳤' => 1, 'á³¥' => 1, '᳦' => 1, '᳧' => 1, '᳨' => 1, 'á³­' => 220, 'á³´' => 230, '᳸' => 230, 'á³¹' => 230, 'á·€' => 230, 'á·' => 230, 'á·‚' => 220, 'á·ƒ' => 230, 'á·„' => 230, 'á·…' => 230, 'á·†' => 230, 'á·‡' => 230, 'á·ˆ' => 230, 'á·‰' => 230, 'á·Š' => 220, 'á·‹' => 230, 'á·Œ' => 230, 'á·' => 234, 'á·Ž' => 214, 'á·' => 220, 'á·' => 202, 'á·‘' => 230, 'á·’' => 230, 'á·“' => 230, 'á·”' => 230, 'á·•' => 230, 'á·–' => 230, 'á·—' => 230, 'á·˜' => 230, 'á·™' => 230, 'á·š' => 230, 'á·›' => 230, 'á·œ' => 230, 'á·' => 230, 'á·ž' => 230, 'á·Ÿ' => 230, 'á· ' => 230, 'á·¡' => 230, 'á·¢' => 230, 'á·£' => 230, 'á·¤' => 230, 'á·¥' => 230, 'á·¦' => 230, 'á·§' => 230, 'á·¨' => 230, 'á·©' => 230, 'á·ª' => 230, 'á·«' => 230, 'á·¬' => 230, 'á·­' => 230, 'á·®' => 230, 'á·¯' => 230, 'á·°' => 230, 'á·±' => 230, 'á·²' => 230, 'á·³' => 230, 'á·´' => 230, 'á·µ' => 230, 'á·¶' => 232, 'á··' => 228, 'á·¸' => 228, 'á·¹' => 220, 'á·»' => 230, 'á·¼' => 233, 'á·½' => 220, 'á·¾' => 230, 'á·¿' => 220, 'âƒ' => 230, '⃑' => 230, '⃒' => 1, '⃓' => 1, '⃔' => 230, '⃕' => 230, '⃖' => 230, '⃗' => 230, '⃘' => 1, '⃙' => 1, '⃚' => 1, '⃛' => 230, '⃜' => 230, '⃡' => 230, '⃥' => 1, '⃦' => 1, '⃧' => 230, '⃨' => 220, '⃩' => 230, '⃪' => 1, '⃫' => 1, '⃬' => 220, '⃭' => 220, '⃮' => 220, '⃯' => 220, '⃰' => 230, '⳯' => 230, 'â³°' => 230, 'â³±' => 230, '⵿' => 9, 'â· ' => 230, 'â·¡' => 230, 'â·¢' => 230, 'â·£' => 230, 'â·¤' => 230, 'â·¥' => 230, 'â·¦' => 230, 'â·§' => 230, 'â·¨' => 230, 'â·©' => 230, 'â·ª' => 230, 'â·«' => 230, 'â·¬' => 230, 'â·­' => 230, 'â·®' => 230, 'â·¯' => 230, 'â·°' => 230, 'â·±' => 230, 'â·²' => 230, 'â·³' => 230, 'â·´' => 230, 'â·µ' => 230, 'â·¶' => 230, 'â··' => 230, 'â·¸' => 230, 'â·¹' => 230, 'â·º' => 230, 'â·»' => 230, 'â·¼' => 230, 'â·½' => 230, 'â·¾' => 230, 'â·¿' => 230, '〪' => 218, '〫' => 228, '〬' => 232, '〭' => 222, '〮' => 224, '〯' => 224, 'ã‚™' => 8, 'ã‚š' => 8, '꙯' => 230, 'ê™´' => 230, 'ꙵ' => 230, 'ꙶ' => 230, 'ê™·' => 230, 'ꙸ' => 230, 'ꙹ' => 230, 'ꙺ' => 230, 'ê™»' => 230, '꙼' => 230, '꙽' => 230, 'êšž' => 230, 'ꚟ' => 230, 'ê›°' => 230, 'ê›±' => 230, 'ê †' => 9, 'ê ¬' => 9, '꣄' => 9, '꣠' => 230, '꣡' => 230, '꣢' => 230, '꣣' => 230, '꣤' => 230, '꣥' => 230, '꣦' => 230, '꣧' => 230, '꣨' => 230, '꣩' => 230, '꣪' => 230, '꣫' => 230, '꣬' => 230, '꣭' => 230, '꣮' => 230, '꣯' => 230, '꣰' => 230, '꣱' => 230, '꤫' => 220, '꤬' => 220, '꤭' => 220, '꥓' => 9, '꦳' => 7, '꧀' => 9, 'ꪰ' => 230, 'ꪲ' => 230, 'ꪳ' => 230, 'ꪴ' => 220, 'ꪷ' => 230, 'ꪸ' => 230, 'ꪾ' => 230, '꪿' => 230, 'ê«' => 230, '꫶' => 9, '꯭' => 9, 'ﬞ' => 26, '︠' => 230, '︡' => 230, '︢' => 230, '︣' => 230, '︤' => 230, '︥' => 230, '︦' => 230, '︧' => 220, '︨' => 220, '︩' => 220, '︪' => 220, '︫' => 220, '︬' => 220, '︭' => 220, '︮' => 230, '︯' => 230, 'ð‡½' => 220, 'ð‹ ' => 220, 'ð¶' => 230, 'ð·' => 230, 'ð¸' => 230, 'ð¹' => 230, 'ðº' => 230, 'ð¨' => 220, 'ð¨' => 230, 'ð¨¸' => 230, 'ð¨¹' => 1, 'ð¨º' => 220, 'ð¨¿' => 9, 'ð«¥' => 230, 'ð«¦' => 220, 'ð´¤' => 230, 'ð´¥' => 230, 'ð´¦' => 230, 'ð´§' => 230, 'ðº«' => 230, 'ðº¬' => 230, 'ð½†' => 220, 'ð½‡' => 220, 'ð½ˆ' => 230, 'ð½‰' => 230, 'ð½Š' => 230, 'ð½‹' => 220, 'ð½Œ' => 230, 'ð½' => 220, 'ð½Ž' => 220, 'ð½' => 220, 'ð½' => 220, 'ð‘†' => 9, 'ð‘¿' => 9, 'ð‘‚¹' => 9, '𑂺' => 7, 'ð‘„€' => 230, 'ð‘„' => 230, 'ð‘„‚' => 230, 'ð‘„³' => 9, 'ð‘„´' => 9, 'ð‘…³' => 7, '𑇀' => 9, '𑇊' => 7, '𑈵' => 9, '𑈶' => 7, 'ð‘‹©' => 7, '𑋪' => 9, '𑌻' => 7, '𑌼' => 7, 'ð‘' => 9, 'ð‘¦' => 230, 'ð‘§' => 230, 'ð‘¨' => 230, 'ð‘©' => 230, 'ð‘ª' => 230, 'ð‘«' => 230, 'ð‘¬' => 230, 'ð‘°' => 230, 'ð‘±' => 230, 'ð‘²' => 230, 'ð‘³' => 230, 'ð‘´' => 230, 'ð‘‘‚' => 9, '𑑆' => 7, 'ð‘‘ž' => 230, 'ð‘“‚' => 9, '𑓃' => 7, 'ð‘–¿' => 9, 'ð‘—€' => 7, '𑘿' => 9, '𑚶' => 9, 'ð‘š·' => 7, '𑜫' => 9, 'ð‘ ¹' => 9, 'ð‘ º' => 7, '𑤽' => 9, '𑤾' => 9, '𑥃' => 7, '𑧠' => 9, '𑨴' => 9, '𑩇' => 9, '𑪙' => 9, 'ð‘°¿' => 9, '𑵂' => 7, '𑵄' => 9, '𑵅' => 9, '𑶗' => 9, 'ð–«°' => 1, 'ð–«±' => 1, 'ð–«²' => 1, 'ð–«³' => 1, 'ð–«´' => 1, 'ð–¬°' => 230, '𖬱' => 230, '𖬲' => 230, '𖬳' => 230, 'ð–¬´' => 230, '𖬵' => 230, '𖬶' => 230, 'ð–¿°' => 6, 'ð–¿±' => 6, '𛲞' => 1, 'ð…¥' => 216, 'ð…¦' => 216, 'ð…§' => 1, 'ð…¨' => 1, 'ð…©' => 1, 'ð…­' => 226, 'ð…®' => 216, 'ð…¯' => 216, 'ð…°' => 216, 'ð…±' => 216, 'ð…²' => 216, 'ð…»' => 220, 'ð…¼' => 220, 'ð…½' => 220, 'ð…¾' => 220, 'ð…¿' => 220, 'ð†€' => 220, 'ð†' => 220, 'ð†‚' => 220, 'ð†…' => 230, 'ð††' => 230, 'ð†‡' => 230, 'ð†ˆ' => 230, 'ð†‰' => 230, 'ð†Š' => 220, 'ð†‹' => 220, 'ð†ª' => 230, 'ð†«' => 230, 'ð†¬' => 230, 'ð†­' => 230, 'ð‰‚' => 230, 'ð‰ƒ' => 230, 'ð‰„' => 230, '𞀀' => 230, 'ðž€' => 230, '𞀂' => 230, '𞀃' => 230, '𞀄' => 230, '𞀅' => 230, '𞀆' => 230, '𞀈' => 230, '𞀉' => 230, '𞀊' => 230, '𞀋' => 230, '𞀌' => 230, 'ðž€' => 230, '𞀎' => 230, 'ðž€' => 230, 'ðž€' => 230, '𞀑' => 230, '𞀒' => 230, '𞀓' => 230, '𞀔' => 230, '𞀕' => 230, '𞀖' => 230, '𞀗' => 230, '𞀘' => 230, '𞀛' => 230, '𞀜' => 230, 'ðž€' => 230, '𞀞' => 230, '𞀟' => 230, '𞀠' => 230, '𞀡' => 230, '𞀣' => 230, '𞀤' => 230, '𞀦' => 230, '𞀧' => 230, '𞀨' => 230, '𞀩' => 230, '𞀪' => 230, 'ðž„°' => 230, '𞄱' => 230, '𞄲' => 230, '𞄳' => 230, 'ðž„´' => 230, '𞄵' => 230, '𞄶' => 230, '𞋬' => 230, 'ðž‹­' => 230, 'ðž‹®' => 230, '𞋯' => 230, 'ðž£' => 220, '𞣑' => 220, '𞣒' => 220, '𞣓' => 220, '𞣔' => 220, '𞣕' => 220, '𞣖' => 220, '𞥄' => 230, '𞥅' => 230, '𞥆' => 230, '𞥇' => 230, '𞥈' => 230, '𞥉' => 230, '𞥊' => 7); addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-normalizer/Normalizer.php000064400000021722147600374260025210 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Normalizer; /** * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. * * It has been validated with Unicode 6.3 Normalization Conformance Test. * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. * * @author Nicolas Grekas * * @internal */ class Normalizer { const FORM_D = \Normalizer::FORM_D; const FORM_KD = \Normalizer::FORM_KD; const FORM_C = \Normalizer::FORM_C; const FORM_KC = \Normalizer::FORM_KC; const NFD = \Normalizer::NFD; const NFKD = \Normalizer::NFKD; const NFC = \Normalizer::NFC; const NFKC = \Normalizer::NFKC; private static $C; private static $D; private static $KD; private static $cC; private static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T $T && ($T += 0x40); $ulen += 3; } $L = 0xac00 + ($L * 21 + $V) * 28 + $T; $lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f); } $i += $ulen; } return $result . $lastUchr . $tail; } private static function decompose($s, $c) { $result = ''; $ASCII = self::$ASCII; $decompMap = self::$D; $combClass = self::$cC; $ulenMask = self::$ulenMask; if ($c) { $compatMap = self::$KD; } $c = array(); $i = 0; $len = \strlen($s); while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($c) { \ksort($c); $result .= \implode('', $c); $c = array(); } $j = 1 + \strspn($s, $ASCII, $i + 1); $result .= \substr($s, $i, $j); $i += $j; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if ($uchr < "ê°€" || "힣" < $uchr) { // Table lookup if ($uchr !== ($j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr))) { $uchr = $j; $j = \strlen($uchr); $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"]; if ($ulen != $j) { // Put trailing chars in $s $j -= $ulen; $i -= $j; if (0 > $i) { $s = \str_repeat(' ', -$i) . $s; $len -= $i; $i = 0; } while ($j--) { $s[$i + $j] = $uchr[$ulen + $j]; } $uchr = \substr($uchr, 0, $ulen); } } if (isset($combClass[$uchr])) { // Combining chars, for sorting if (!isset($c[$combClass[$uchr]])) { $c[$combClass[$uchr]] = ''; } $c[$combClass[$uchr]] .= $uchr; continue; } } else { // Hangul chars $uchr = \unpack('C*', $uchr); $j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80; $uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28)); if ($j %= 28) { $uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j); } } if ($c) { \ksort($c); $result .= \implode('', $c); $c = array(); } $result .= $uchr; } if ($c) { \ksort($c); $result .= \implode('', $c); } return $result; } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-intl-normalizer/bootstrap.php000064400000001357147600374260025105 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Intl\Normalizer as p; if (!\function_exists('\\VendorDuplicator\\normalizer_is_normalized')) { function normalizer_is_normalized($input, $form = p\Normalizer::NFC) { return p\Normalizer::isNormalized($input, $form); } } if (!\function_exists('\\VendorDuplicator\\normalizer_normalize')) { function normalizer_normalize($input, $form = p\Normalizer::NFC) { return p\Normalizer::normalize($input, $form); } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php000064400000015424147600374260030256 0ustar00 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Îœ', 'à' => 'À', 'á' => 'Ã', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'Ã¥' => 'Ã…', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'ÃŒ', 'í' => 'Ã', 'î' => 'ÃŽ', 'ï' => 'Ã', 'ð' => 'Ã', 'ñ' => 'Ñ', 'ò' => 'Ã’', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ãœ', 'ý' => 'Ã', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'Ä' => 'Ä€', 'ă' => 'Ä‚', 'Ä…' => 'Ä„', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'Ä‹' => 'ÄŠ', 'Ä' => 'ÄŒ', 'Ä' => 'ÄŽ', 'Ä‘' => 'Ä', 'Ä“' => 'Ä’', 'Ä•' => 'Ä”', 'Ä—' => 'Ä–', 'Ä™' => 'Ę', 'Ä›' => 'Äš', 'Ä' => 'Äœ', 'ÄŸ' => 'Äž', 'Ä¡' => 'Ä ', 'Ä£' => 'Ä¢', 'Ä¥' => 'Ĥ', 'ħ' => 'Ħ', 'Ä©' => 'Ĩ', 'Ä«' => 'Ī', 'Ä­' => 'Ĭ', 'į' => 'Ä®', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ä´', 'Ä·' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ä»', 'ľ' => 'Ľ', 'Å€' => 'Ä¿', 'Å‚' => 'Å', 'Å„' => 'Ń', 'ņ' => 'Å…', 'ň' => 'Ň', 'Å‹' => 'ÅŠ', 'Å' => 'ÅŒ', 'Å' => 'ÅŽ', 'Å‘' => 'Å', 'Å“' => 'Å’', 'Å•' => 'Å”', 'Å—' => 'Å–', 'Å™' => 'Ř', 'Å›' => 'Åš', 'Å' => 'Åœ', 'ÅŸ' => 'Åž', 'Å¡' => 'Å ', 'Å£' => 'Å¢', 'Å¥' => 'Ť', 'ŧ' => 'Ŧ', 'Å©' => 'Ũ', 'Å«' => 'Ū', 'Å­' => 'Ŭ', 'ů' => 'Å®', 'ű' => 'Å°', 'ų' => 'Ų', 'ŵ' => 'Å´', 'Å·' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Å»', 'ž' => 'Ž', 'Å¿' => 'S', 'Æ€' => 'Ƀ', 'ƃ' => 'Æ‚', 'Æ…' => 'Æ„', 'ƈ' => 'Ƈ', 'ÆŒ' => 'Æ‹', 'Æ’' => 'Æ‘', 'Æ•' => 'Ƕ', 'Æ™' => 'Ƙ', 'Æš' => 'Ƚ', 'Æž' => 'È ', 'Æ¡' => 'Æ ', 'Æ£' => 'Æ¢', 'Æ¥' => 'Ƥ', 'ƨ' => 'Ƨ', 'Æ­' => 'Ƭ', 'Æ°' => 'Ư', 'Æ´' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'Æ¿' => 'Ç·', 'Ç…' => 'Ç„', 'dž' => 'Ç„', 'Lj' => 'LJ', 'lj' => 'LJ', 'Ç‹' => 'ÇŠ', 'ÇŒ' => 'ÇŠ', 'ÇŽ' => 'Ç', 'Ç' => 'Ç', 'Ç’' => 'Ç‘', 'Ç”' => 'Ç“', 'Ç–' => 'Ç•', 'ǘ' => 'Ç—', 'Çš' => 'Ç™', 'Çœ' => 'Ç›', 'Ç' => 'ÆŽ', 'ÇŸ' => 'Çž', 'Ç¡' => 'Ç ', 'Ç£' => 'Ç¢', 'Ç¥' => 'Ǥ', 'ǧ' => 'Ǧ', 'Ç©' => 'Ǩ', 'Ç«' => 'Ǫ', 'Ç­' => 'Ǭ', 'ǯ' => 'Ç®', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ç´', 'ǹ' => 'Ǹ', 'Ç»' => 'Ǻ', 'ǽ' => 'Ǽ', 'Ç¿' => 'Ǿ', 'È' => 'È€', 'ȃ' => 'È‚', 'È…' => 'È„', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'È‹' => 'ÈŠ', 'È' => 'ÈŒ', 'È' => 'ÈŽ', 'È‘' => 'È', 'È“' => 'È’', 'È•' => 'È”', 'È—' => 'È–', 'È™' => 'Ș', 'È›' => 'Èš', 'È' => 'Èœ', 'ÈŸ' => 'Èž', 'È£' => 'È¢', 'È¥' => 'Ȥ', 'ȧ' => 'Ȧ', 'È©' => 'Ȩ', 'È«' => 'Ȫ', 'È­' => 'Ȭ', 'ȯ' => 'È®', 'ȱ' => 'È°', 'ȳ' => 'Ȳ', 'ȼ' => 'È»', 'È¿' => 'â±¾', 'É€' => 'Ɀ', 'É‚' => 'É', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'É‹' => 'ÉŠ', 'É' => 'ÉŒ', 'É' => 'ÉŽ', 'É' => 'Ɐ', 'É‘' => 'â±­', 'É’' => 'â±°', 'É“' => 'Æ', 'É”' => 'Ɔ', 'É–' => 'Ɖ', 'É—' => 'ÆŠ', 'É™' => 'Æ', 'É›' => 'Æ', 'Éœ' => 'êž«', 'É ' => 'Æ“', 'É¡' => 'Ɡ', 'É£' => 'Æ”', 'É¥' => 'êž', 'ɦ' => 'Ɦ', 'ɨ' => 'Æ—', 'É©' => 'Æ–', 'ɪ' => 'êž®', 'É«' => 'â±¢', 'ɬ' => 'êž­', 'ɯ' => 'Æœ', 'ɱ' => 'â±®', 'ɲ' => 'Æ', 'ɵ' => 'ÆŸ', 'ɽ' => 'Ɽ', 'Ê€' => 'Ʀ', 'Ê‚' => 'Ʂ', 'ʃ' => 'Æ©', 'ʇ' => 'êž±', 'ʈ' => 'Æ®', 'ʉ' => 'É„', 'ÊŠ' => 'Ʊ', 'Ê‹' => 'Ʋ', 'ÊŒ' => 'É…', 'Ê’' => 'Æ·', 'Ê' => 'êž²', 'Êž' => 'êž°', 'Í…' => 'Ι', 'ͱ' => 'Í°', 'ͳ' => 'Ͳ', 'Í·' => 'Ͷ', 'Í»' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ï¿', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Î’', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Îœ', 'ν' => 'Î', 'ξ' => 'Ξ', 'ο' => 'Ο', 'Ï€' => 'Π', 'Ï' => 'Ρ', 'Ï‚' => 'Σ', 'σ' => 'Σ', 'Ï„' => 'Τ', 'Ï…' => 'Î¥', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ÏŠ' => 'Ϊ', 'Ï‹' => 'Ϋ', 'ÏŒ' => 'ÎŒ', 'Ï' => 'ÎŽ', 'ÏŽ' => 'Î', 'Ï' => 'Î’', 'Ï‘' => 'Θ', 'Ï•' => 'Φ', 'Ï–' => 'Π', 'Ï—' => 'Ï', 'Ï™' => 'Ϙ', 'Ï›' => 'Ïš', 'Ï' => 'Ïœ', 'ÏŸ' => 'Ïž', 'Ï¡' => 'Ï ', 'Ï£' => 'Ï¢', 'Ï¥' => 'Ϥ', 'ϧ' => 'Ϧ', 'Ï©' => 'Ϩ', 'Ï«' => 'Ϫ', 'Ï­' => 'Ϭ', 'ϯ' => 'Ï®', 'Ï°' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Í¿', 'ϵ' => 'Ε', 'ϸ' => 'Ï·', 'Ï»' => 'Ϻ', 'а' => 'Ð', 'б' => 'Б', 'в' => 'Ð’', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'Ðœ', 'н' => 'Ð', 'о' => 'О', 'п' => 'П', 'Ñ€' => 'Р', 'Ñ' => 'С', 'Ñ‚' => 'Т', 'у' => 'У', 'Ñ„' => 'Ф', 'Ñ…' => 'Ð¥', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ÑŠ' => 'Ъ', 'Ñ‹' => 'Ы', 'ÑŒ' => 'Ь', 'Ñ' => 'Э', 'ÑŽ' => 'Ю', 'Ñ' => 'Я', 'Ñ' => 'Ѐ', 'Ñ‘' => 'Ð', 'Ñ’' => 'Ђ', 'Ñ“' => 'Ѓ', 'Ñ”' => 'Є', 'Ñ•' => 'Ð…', 'Ñ–' => 'І', 'Ñ—' => 'Ї', 'ј' => 'Ј', 'Ñ™' => 'Љ', 'Ñš' => 'Њ', 'Ñ›' => 'Ћ', 'Ñœ' => 'ÐŒ', 'Ñ' => 'Ð', 'Ñž' => 'ÐŽ', 'ÑŸ' => 'Ð', 'Ñ¡' => 'Ñ ', 'Ñ£' => 'Ñ¢', 'Ñ¥' => 'Ѥ', 'ѧ' => 'Ѧ', 'Ñ©' => 'Ѩ', 'Ñ«' => 'Ѫ', 'Ñ­' => 'Ѭ', 'ѯ' => 'Ñ®', 'ѱ' => 'Ñ°', 'ѳ' => 'Ѳ', 'ѵ' => 'Ñ´', 'Ñ·' => 'Ѷ', 'ѹ' => 'Ѹ', 'Ñ»' => 'Ѻ', 'ѽ' => 'Ѽ', 'Ñ¿' => 'Ѿ', 'Ò' => 'Ò€', 'Ò‹' => 'ÒŠ', 'Ò' => 'ÒŒ', 'Ò' => 'ÒŽ', 'Ò‘' => 'Ò', 'Ò“' => 'Ò’', 'Ò•' => 'Ò”', 'Ò—' => 'Ò–', 'Ò™' => 'Ò˜', 'Ò›' => 'Òš', 'Ò' => 'Òœ', 'ÒŸ' => 'Òž', 'Ò¡' => 'Ò ', 'Ò£' => 'Ò¢', 'Ò¥' => 'Ò¤', 'Ò§' => 'Ò¦', 'Ò©' => 'Ò¨', 'Ò«' => 'Òª', 'Ò­' => 'Ò¬', 'Ò¯' => 'Ò®', 'Ò±' => 'Ò°', 'Ò³' => 'Ò²', 'Òµ' => 'Ò´', 'Ò·' => 'Ò¶', 'Ò¹' => 'Ò¸', 'Ò»' => 'Òº', 'Ò½' => 'Ò¼', 'Ò¿' => 'Ò¾', 'Ó‚' => 'Ó', 'Ó„' => 'Óƒ', 'Ó†' => 'Ó…', 'Óˆ' => 'Ó‡', 'ÓŠ' => 'Ó‰', 'ÓŒ' => 'Ó‹', 'ÓŽ' => 'Ó', 'Ó' => 'Ó€', 'Ó‘' => 'Ó', 'Ó“' => 'Ó’', 'Ó•' => 'Ó”', 'Ó—' => 'Ó–', 'Ó™' => 'Ó˜', 'Ó›' => 'Óš', 'Ó' => 'Óœ', 'ÓŸ' => 'Óž', 'Ó¡' => 'Ó ', 'Ó£' => 'Ó¢', 'Ó¥' => 'Ó¤', 'Ó§' => 'Ó¦', 'Ó©' => 'Ó¨', 'Ó«' => 'Óª', 'Ó­' => 'Ó¬', 'Ó¯' => 'Ó®', 'Ó±' => 'Ó°', 'Ó³' => 'Ó²', 'Óµ' => 'Ó´', 'Ó·' => 'Ó¶', 'Ó¹' => 'Ó¸', 'Ó»' => 'Óº', 'Ó½' => 'Ó¼', 'Ó¿' => 'Ó¾', 'Ô' => 'Ô€', 'Ôƒ' => 'Ô‚', 'Ô…' => 'Ô„', 'Ô‡' => 'Ô†', 'Ô‰' => 'Ôˆ', 'Ô‹' => 'ÔŠ', 'Ô' => 'ÔŒ', 'Ô' => 'ÔŽ', 'Ô‘' => 'Ô', 'Ô“' => 'Ô’', 'Ô•' => 'Ô”', 'Ô—' => 'Ô–', 'Ô™' => 'Ô˜', 'Ô›' => 'Ôš', 'Ô' => 'Ôœ', 'ÔŸ' => 'Ôž', 'Ô¡' => 'Ô ', 'Ô£' => 'Ô¢', 'Ô¥' => 'Ô¤', 'Ô§' => 'Ô¦', 'Ô©' => 'Ô¨', 'Ô«' => 'Ôª', 'Ô­' => 'Ô¬', 'Ô¯' => 'Ô®', 'Õ¡' => 'Ô±', 'Õ¢' => 'Ô²', 'Õ£' => 'Ô³', 'Õ¤' => 'Ô´', 'Õ¥' => 'Ôµ', 'Õ¦' => 'Ô¶', 'Õ§' => 'Ô·', 'Õ¨' => 'Ô¸', 'Õ©' => 'Ô¹', 'Õª' => 'Ôº', 'Õ«' => 'Ô»', 'Õ¬' => 'Ô¼', 'Õ­' => 'Ô½', 'Õ®' => 'Ô¾', 'Õ¯' => 'Ô¿', 'Õ°' => 'Õ€', 'Õ±' => 'Õ', 'Õ²' => 'Õ‚', 'Õ³' => 'Õƒ', 'Õ´' => 'Õ„', 'Õµ' => 'Õ…', 'Õ¶' => 'Õ†', 'Õ·' => 'Õ‡', 'Õ¸' => 'Õˆ', 'Õ¹' => 'Õ‰', 'Õº' => 'ÕŠ', 'Õ»' => 'Õ‹', 'Õ¼' => 'ÕŒ', 'Õ½' => 'Õ', 'Õ¾' => 'ÕŽ', 'Õ¿' => 'Õ', 'Ö€' => 'Õ', 'Ö' => 'Õ‘', 'Ö‚' => 'Õ’', 'Öƒ' => 'Õ“', 'Ö„' => 'Õ”', 'Ö…' => 'Õ•', 'Ö†' => 'Õ–', 'áƒ' => 'á²', 'ბ' => 'Ბ', 'გ' => 'á²’', 'დ' => 'Დ', 'ე' => 'á²”', 'ვ' => 'Ვ', 'ზ' => 'á²–', 'თ' => 'á²—', 'ი' => 'Ი', 'კ' => 'á²™', 'ლ' => 'Ლ', 'მ' => 'á²›', 'ნ' => 'Ნ', 'áƒ' => 'á²', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'á² ', 'ს' => 'Ს', 'ტ' => 'á²¢', 'უ' => 'á²£', 'ფ' => 'Ფ', 'ქ' => 'á²¥', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'á²­', 'ხ' => 'á²®', 'ჯ' => 'Ჯ', 'ჰ' => 'á²°', 'ჱ' => 'á²±', 'ჲ' => 'á²²', 'ჳ' => 'á²³', 'ჴ' => 'á²´', 'ჵ' => 'á²µ', 'ჶ' => 'Ჶ', 'ჷ' => 'á²·', 'ჸ' => 'Ჸ', 'ჹ' => 'á²¹', 'ჺ' => 'Ჺ', 'ჽ' => 'á²½', 'ჾ' => 'á²¾', 'ჿ' => 'Ჿ', 'á¸' => 'á°', 'á¹' => 'á±', 'áº' => 'á²', 'á»' => 'á³', 'á¼' => 'á´', 'á½' => 'áµ', 'á²€' => 'Ð’', 'á²' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'á²…' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ñ¢', 'ᲈ' => 'Ꙋ', 'áµ¹' => 'ê½', 'áµ½' => 'â±£', 'ᶎ' => 'Ᶎ', 'á¸' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'á¸' => 'Ḍ', 'á¸' => 'Ḏ', 'ḑ' => 'á¸', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'á¸' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'á¹' => 'á¹€', 'ṃ' => 'Ṃ', 'á¹…' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'á¹' => 'Ṍ', 'á¹' => 'Ṏ', 'ṑ' => 'á¹', 'ṓ' => 'á¹’', 'ṕ' => 'á¹”', 'á¹—' => 'á¹–', 'á¹™' => 'Ṙ', 'á¹›' => 'Ṛ', 'á¹' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'á¹ ', 'á¹£' => 'á¹¢', 'á¹¥' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'á¹­' => 'Ṭ', 'ṯ' => 'á¹®', 'á¹±' => 'á¹°', 'á¹³' => 'á¹²', 'á¹µ' => 'á¹´', 'á¹·' => 'Ṷ', 'á¹¹' => 'Ṹ', 'á¹»' => 'Ṻ', 'á¹½' => 'á¹¼', 'ṿ' => 'á¹¾', 'áº' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'áº' => 'Ẍ', 'áº' => 'Ẏ', 'ẑ' => 'áº', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'á¹ ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'á»' => 'Ề', 'ể' => 'Ể', 'á»…' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'á»' => 'Ọ', 'á»' => 'Ỏ', 'ố' => 'á»', 'ồ' => 'á»’', 'ổ' => 'á»”', 'á»—' => 'á»–', 'á»™' => 'Ộ', 'á»›' => 'Ớ', 'á»' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'á» ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'á»­' => 'Ử', 'ữ' => 'á»®', 'á»±' => 'á»°', 'ỳ' => 'Ỳ', 'ỵ' => 'á»´', 'á»·' => 'Ỷ', 'ỹ' => 'Ỹ', 'á»»' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'á¼€' => 'Ἀ', 'á¼' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'á¼…' => 'á¼', 'ἆ' => 'Ἆ', 'ἇ' => 'á¼', 'á¼' => 'Ἐ', 'ἑ' => 'á¼™', 'á¼’' => 'Ἒ', 'ἓ' => 'á¼›', 'á¼”' => 'Ἔ', 'ἕ' => 'á¼', 'á¼ ' => 'Ἠ', 'ἡ' => 'Ἡ', 'á¼¢' => 'Ἢ', 'á¼£' => 'Ἣ', 'ἤ' => 'Ἤ', 'á¼¥' => 'á¼­', 'ἦ' => 'á¼®', 'ἧ' => 'Ἧ', 'á¼°' => 'Ἰ', 'á¼±' => 'á¼¹', 'á¼²' => 'Ἲ', 'á¼³' => 'á¼»', 'á¼´' => 'á¼¼', 'á¼µ' => 'á¼½', 'ἶ' => 'á¼¾', 'á¼·' => 'Ἷ', 'á½€' => 'Ὀ', 'á½' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'á½…' => 'á½', 'ὑ' => 'á½™', 'ὓ' => 'á½›', 'ὕ' => 'á½', 'á½—' => 'Ὗ', 'á½ ' => 'Ὠ', 'ὡ' => 'Ὡ', 'á½¢' => 'Ὢ', 'á½£' => 'Ὣ', 'ὤ' => 'Ὤ', 'á½¥' => 'á½­', 'ὦ' => 'á½®', 'ὧ' => 'Ὧ', 'á½°' => 'Ὰ', 'á½±' => 'á¾»', 'á½²' => 'Ὲ', 'á½³' => 'Έ', 'á½´' => 'á¿Š', 'á½µ' => 'á¿‹', 'ὶ' => 'á¿š', 'á½·' => 'á¿›', 'ὸ' => 'Ὸ', 'á½¹' => 'Ό', 'ὺ' => 'Ὺ', 'á½»' => 'á¿«', 'á½¼' => 'Ὼ', 'á½½' => 'á¿»', 'á¾€' => 'ᾈ', 'á¾' => 'ᾉ', 'ᾂ' => 'ᾊ', 'ᾃ' => 'ᾋ', 'ᾄ' => 'ᾌ', 'á¾…' => 'á¾', 'ᾆ' => 'ᾎ', 'ᾇ' => 'á¾', 'á¾' => 'ᾘ', 'ᾑ' => 'á¾™', 'á¾’' => 'ᾚ', 'ᾓ' => 'á¾›', 'á¾”' => 'ᾜ', 'ᾕ' => 'á¾', 'á¾–' => 'ᾞ', 'á¾—' => 'ᾟ', 'á¾ ' => 'ᾨ', 'ᾡ' => 'ᾩ', 'á¾¢' => 'ᾪ', 'á¾£' => 'ᾫ', 'ᾤ' => 'ᾬ', 'á¾¥' => 'á¾­', 'ᾦ' => 'á¾®', 'ᾧ' => 'ᾯ', 'á¾°' => 'Ᾰ', 'á¾±' => 'á¾¹', 'á¾³' => 'á¾¼', 'á¾¾' => 'Ι', 'ῃ' => 'á¿Œ', 'á¿' => 'Ῐ', 'á¿‘' => 'á¿™', 'á¿ ' => 'Ῠ', 'á¿¡' => 'á¿©', 'á¿¥' => 'Ῥ', 'ῳ' => 'ῼ', 'â…Ž' => 'Ⅎ', 'â…°' => 'â… ', 'â…±' => 'â…¡', 'â…²' => 'â…¢', 'â…³' => 'â…£', 'â…´' => 'â…¤', 'â…µ' => 'â…¥', 'â…¶' => 'â…¦', 'â…·' => 'â…§', 'â…¸' => 'â…¨', 'â…¹' => 'â…©', 'â…º' => 'â…ª', 'â…»' => 'â…«', 'â…¼' => 'â…¬', 'â…½' => 'â…­', 'â…¾' => 'â…®', 'â…¿' => 'â…¯', 'ↄ' => 'Ↄ', 'â“' => 'â’¶', 'â“‘' => 'â’·', 'â“’' => 'â’¸', 'â““' => 'â’¹', 'â“”' => 'â’º', 'â“•' => 'â’»', 'â“–' => 'â’¼', 'â“—' => 'â’½', 'ⓘ' => 'â’¾', 'â“™' => 'â’¿', 'â“š' => 'â“€', 'â“›' => 'â“', 'â“œ' => 'â“‚', 'â“' => 'Ⓝ', 'â“ž' => 'â“„', 'â“Ÿ' => 'â“…', 'â“ ' => 'Ⓠ', 'â“¡' => 'Ⓡ', 'â“¢' => 'Ⓢ', 'â“£' => 'Ⓣ', 'ⓤ' => 'â“Š', 'â“¥' => 'â“‹', 'ⓦ' => 'â“Œ', 'ⓧ' => 'â“', 'ⓨ' => 'â“Ž', 'â“©' => 'â“', 'â°°' => 'â°€', 'â°±' => 'â°', 'â°²' => 'â°‚', 'â°³' => 'â°ƒ', 'â°´' => 'â°„', 'â°µ' => 'â°…', 'â°¶' => 'â°†', 'â°·' => 'â°‡', 'â°¸' => 'â°ˆ', 'â°¹' => 'â°‰', 'â°º' => 'â°Š', 'â°»' => 'â°‹', 'â°¼' => 'â°Œ', 'â°½' => 'â°', 'â°¾' => 'â°Ž', 'â°¿' => 'â°', 'â±€' => 'â°', 'â±' => 'â°‘', 'ⱂ' => 'â°’', 'ⱃ' => 'â°“', 'ⱄ' => 'â°”', 'â±…' => 'â°•', 'ⱆ' => 'â°–', 'ⱇ' => 'â°—', 'ⱈ' => 'â°˜', 'ⱉ' => 'â°™', 'ⱊ' => 'â°š', 'ⱋ' => 'â°›', 'ⱌ' => 'â°œ', 'â±' => 'â°', 'ⱎ' => 'â°ž', 'â±' => 'â°Ÿ', 'â±' => 'â° ', 'ⱑ' => 'â°¡', 'â±’' => 'â°¢', 'ⱓ' => 'â°£', 'â±”' => 'â°¤', 'ⱕ' => 'â°¥', 'â±–' => 'â°¦', 'â±—' => 'â°§', 'ⱘ' => 'â°¨', 'â±™' => 'â°©', 'ⱚ' => 'â°ª', 'â±›' => 'â°«', 'ⱜ' => 'â°¬', 'â±' => 'â°­', 'ⱞ' => 'â°®', 'ⱡ' => 'â± ', 'â±¥' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'â±³' => 'â±²', 'ⱶ' => 'â±µ', 'â²' => 'â²€', 'ⲃ' => 'Ⲃ', 'â²…' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'â²' => 'Ⲍ', 'â²' => 'Ⲏ', 'ⲑ' => 'â²', 'ⲓ' => 'â²’', 'ⲕ' => 'â²”', 'â²—' => 'â²–', 'â²™' => 'Ⲙ', 'â²›' => 'Ⲛ', 'â²' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'â² ', 'â²£' => 'â²¢', 'â²¥' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'â²­' => 'Ⲭ', 'ⲯ' => 'â²®', 'â²±' => 'â²°', 'â²³' => 'â²²', 'â²µ' => 'â²´', 'â²·' => 'Ⲷ', 'â²¹' => 'Ⲹ', 'â²»' => 'Ⲻ', 'â²½' => 'â²¼', 'ⲿ' => 'â²¾', 'â³' => 'â³€', 'ⳃ' => 'Ⳃ', 'â³…' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'â³' => 'Ⳍ', 'â³' => 'Ⳏ', 'ⳑ' => 'â³', 'ⳓ' => 'â³’', 'ⳕ' => 'â³”', 'â³—' => 'â³–', 'â³™' => 'Ⳙ', 'â³›' => 'Ⳛ', 'â³' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'â³ ', 'â³£' => 'â³¢', 'ⳬ' => 'Ⳬ', 'â³®' => 'â³­', 'â³³' => 'â³²', 'â´€' => 'á‚ ', 'â´' => 'á‚¡', 'â´‚' => 'á‚¢', 'â´ƒ' => 'á‚£', 'â´„' => 'Ⴄ', 'â´…' => 'á‚¥', 'â´†' => 'Ⴆ', 'â´‡' => 'Ⴇ', 'â´ˆ' => 'Ⴈ', 'â´‰' => 'á‚©', 'â´Š' => 'Ⴊ', 'â´‹' => 'á‚«', 'â´Œ' => 'Ⴌ', 'â´' => 'á‚­', 'â´Ž' => 'á‚®', 'â´' => 'Ⴏ', 'â´' => 'á‚°', 'â´‘' => 'Ⴑ', 'â´’' => 'Ⴒ', 'â´“' => 'Ⴓ', 'â´”' => 'á‚´', 'â´•' => 'Ⴕ', 'â´–' => 'Ⴖ', 'â´—' => 'á‚·', 'â´˜' => 'Ⴘ', 'â´™' => 'Ⴙ', 'â´š' => 'Ⴚ', 'â´›' => 'á‚»', 'â´œ' => 'Ⴜ', 'â´' => 'Ⴝ', 'â´ž' => 'Ⴞ', 'â´Ÿ' => 'á‚¿', 'â´ ' => 'Ⴠ', 'â´¡' => 'áƒ', 'â´¢' => 'Ⴢ', 'â´£' => 'Ⴣ', 'â´¤' => 'Ⴤ', 'â´¥' => 'Ⴥ', 'â´§' => 'Ⴧ', 'â´­' => 'áƒ', 'ê™' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ê™…' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ê™' => 'Ꙍ', 'ê™' => 'Ꙏ', 'ꙑ' => 'ê™', 'ꙓ' => 'ê™’', 'ꙕ' => 'ê™”', 'ê™—' => 'ê™–', 'ê™™' => 'Ꙙ', 'ê™›' => 'Ꙛ', 'ê™' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'ê™ ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ê™­' => 'Ꙭ', 'êš' => 'Ꚁ', 'ꚃ' => 'êš‚', 'êš…' => 'êš„', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'êš‹' => 'Ꚋ', 'êš' => 'Ꚍ', 'êš' => 'Ꚏ', 'êš‘' => 'êš', 'êš“' => 'êš’', 'êš•' => 'êš”', 'êš—' => 'êš–', 'êš™' => 'Ꚙ', 'êš›' => 'êšš', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ê' => 'ê€', 'êƒ' => 'ê‚', 'ê…' => 'ê„', 'ê‡' => 'ê†', 'ê‰' => 'êˆ', 'ê‹' => 'êŠ', 'ê' => 'êŒ', 'ê' => 'êŽ', 'ê‘' => 'ê', 'ê“' => 'ê’', 'ê•' => 'ê”', 'ê—' => 'ê–', 'ê™' => 'ê˜', 'ê›' => 'êš', 'ê' => 'êœ', 'êŸ' => 'êž', 'ê¡' => 'ê ', 'ê£' => 'ê¢', 'ê¥' => 'ê¤', 'ê§' => 'ê¦', 'ê©' => 'ê¨', 'ê«' => 'êª', 'ê­' => 'ê¬', 'ê¯' => 'ê®', 'êº' => 'ê¹', 'ê¼' => 'ê»', 'ê¿' => 'ê¾', 'êž' => 'Ꞁ', 'ꞃ' => 'êž‚', 'êž…' => 'êž„', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'êž‹', 'êž‘' => 'êž', 'êž“' => 'êž’', 'êž”' => 'Ꞔ', 'êž—' => 'êž–', 'êž™' => 'Ꞙ', 'êž›' => 'êžš', 'êž' => 'êžœ', 'ꞟ' => 'êžž', 'êž¡' => 'êž ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'êž©' => 'Ꞩ', 'êžµ' => 'êž´', 'êž·' => 'Ꞷ', 'êž¹' => 'Ꞹ', 'êž»' => 'Ꞻ', 'êž½' => 'êž¼', 'êž¿' => 'êž¾', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ê­“' => 'êž³', 'ê­°' => 'Ꭰ', 'ê­±' => 'Ꭱ', 'ê­²' => 'Ꭲ', 'ê­³' => 'Ꭳ', 'ê­´' => 'Ꭴ', 'ê­µ' => 'Ꭵ', 'ê­¶' => 'Ꭶ', 'ê­·' => 'Ꭷ', 'ê­¸' => 'Ꭸ', 'ê­¹' => 'Ꭹ', 'ê­º' => 'Ꭺ', 'ê­»' => 'Ꭻ', 'ê­¼' => 'Ꭼ', 'ê­½' => 'Ꭽ', 'ê­¾' => 'Ꭾ', 'ê­¿' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ê®' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ê®…' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ê®' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ê®' => 'Ꮏ', 'ê®' => 'á€', 'ꮑ' => 'á', 'ê®’' => 'á‚', 'ꮓ' => 'áƒ', 'ê®”' => 'á„', 'ꮕ' => 'á…', 'ê®–' => 'á†', 'ê®—' => 'á‡', 'ꮘ' => 'áˆ', 'ê®™' => 'á‰', 'ꮚ' => 'áŠ', 'ê®›' => 'á‹', 'ꮜ' => 'áŒ', 'ê®' => 'á', 'ꮞ' => 'áŽ', 'ꮟ' => 'á', 'ê® ' => 'á', 'ꮡ' => 'á‘', 'ꮢ' => 'á’', 'ꮣ' => 'á“', 'ꮤ' => 'á”', 'ꮥ' => 'á•', 'ꮦ' => 'á–', 'ꮧ' => 'á—', 'ꮨ' => 'á˜', 'ꮩ' => 'á™', 'ꮪ' => 'áš', 'ꮫ' => 'á›', 'ꮬ' => 'áœ', 'ê®­' => 'á', 'ê®®' => 'áž', 'ꮯ' => 'áŸ', 'ê®°' => 'á ', 'ê®±' => 'á¡', 'ꮲ' => 'á¢', 'ꮳ' => 'á£', 'ê®´' => 'á¤', 'ꮵ' => 'á¥', 'ꮶ' => 'á¦', 'ê®·' => 'á§', 'ꮸ' => 'á¨', 'ꮹ' => 'á©', 'ꮺ' => 'áª', 'ê®»' => 'á«', 'ꮼ' => 'á¬', 'ꮽ' => 'á­', 'ꮾ' => 'á®', 'ꮿ' => 'á¯', 'ï½' => 'A', 'b' => 'ï¼¢', 'c' => 'ï¼£', 'd' => 'D', 'ï½…' => 'ï¼¥', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'ï½' => 'ï¼­', 'n' => 'ï¼®', 'ï½' => 'O', 'ï½' => 'ï¼°', 'q' => 'ï¼±', 'ï½’' => 'ï¼²', 's' => 'ï¼³', 'ï½”' => 'ï¼´', 'u' => 'ï¼µ', 'ï½–' => 'V', 'ï½—' => 'ï¼·', 'x' => 'X', 'ï½™' => 'ï¼¹', 'z' => 'Z', 'ð¨' => 'ð€', 'ð©' => 'ð', 'ðª' => 'ð‚', 'ð«' => 'ðƒ', 'ð¬' => 'ð„', 'ð­' => 'ð…', 'ð®' => 'ð†', 'ð¯' => 'ð‡', 'ð°' => 'ðˆ', 'ð±' => 'ð‰', 'ð²' => 'ðŠ', 'ð³' => 'ð‹', 'ð´' => 'ðŒ', 'ðµ' => 'ð', 'ð¶' => 'ðŽ', 'ð·' => 'ð', 'ð¸' => 'ð', 'ð¹' => 'ð‘', 'ðº' => 'ð’', 'ð»' => 'ð“', 'ð¼' => 'ð”', 'ð½' => 'ð•', 'ð¾' => 'ð–', 'ð¿' => 'ð—', 'ð‘€' => 'ð˜', 'ð‘' => 'ð™', 'ð‘‚' => 'ðš', 'ð‘ƒ' => 'ð›', 'ð‘„' => 'ðœ', 'ð‘…' => 'ð', 'ð‘†' => 'ðž', 'ð‘‡' => 'ðŸ', 'ð‘ˆ' => 'ð ', 'ð‘‰' => 'ð¡', 'ð‘Š' => 'ð¢', 'ð‘‹' => 'ð£', 'ð‘Œ' => 'ð¤', 'ð‘' => 'ð¥', 'ð‘Ž' => 'ð¦', 'ð‘' => 'ð§', 'ð“˜' => 'ð’°', 'ð“™' => 'ð’±', 'ð“š' => 'ð’²', 'ð“›' => 'ð’³', 'ð“œ' => 'ð’´', 'ð“' => 'ð’µ', 'ð“ž' => 'ð’¶', 'ð“Ÿ' => 'ð’·', 'ð“ ' => 'ð’¸', 'ð“¡' => 'ð’¹', 'ð“¢' => 'ð’º', 'ð“£' => 'ð’»', 'ð“¤' => 'ð’¼', 'ð“¥' => 'ð’½', 'ð“¦' => 'ð’¾', 'ð“§' => 'ð’¿', 'ð“¨' => 'ð“€', 'ð“©' => 'ð“', 'ð“ª' => 'ð“‚', 'ð“«' => 'ð“ƒ', 'ð“¬' => 'ð“„', 'ð“­' => 'ð“…', 'ð“®' => 'ð“†', 'ð“¯' => 'ð“‡', 'ð“°' => 'ð“ˆ', 'ð“±' => 'ð“‰', 'ð“²' => 'ð“Š', 'ð“³' => 'ð“‹', 'ð“´' => 'ð“Œ', 'ð“µ' => 'ð“', 'ð“¶' => 'ð“Ž', 'ð“·' => 'ð“', 'ð“¸' => 'ð“', 'ð“¹' => 'ð“‘', 'ð“º' => 'ð“’', 'ð“»' => 'ð““', 'ð³€' => 'ð²€', 'ð³' => 'ð²', 'ð³‚' => 'ð²‚', 'ð³ƒ' => 'ð²ƒ', 'ð³„' => 'ð²„', 'ð³…' => 'ð²…', 'ð³†' => 'ð²†', 'ð³‡' => 'ð²‡', 'ð³ˆ' => 'ð²ˆ', 'ð³‰' => 'ð²‰', 'ð³Š' => 'ð²Š', 'ð³‹' => 'ð²‹', 'ð³Œ' => 'ð²Œ', 'ð³' => 'ð²', 'ð³Ž' => 'ð²Ž', 'ð³' => 'ð²', 'ð³' => 'ð²', 'ð³‘' => 'ð²‘', 'ð³’' => 'ð²’', 'ð³“' => 'ð²“', 'ð³”' => 'ð²”', 'ð³•' => 'ð²•', 'ð³–' => 'ð²–', 'ð³—' => 'ð²—', 'ð³˜' => 'ð²˜', 'ð³™' => 'ð²™', 'ð³š' => 'ð²š', 'ð³›' => 'ð²›', 'ð³œ' => 'ð²œ', 'ð³' => 'ð²', 'ð³ž' => 'ð²ž', 'ð³Ÿ' => 'ð²Ÿ', 'ð³ ' => 'ð² ', 'ð³¡' => 'ð²¡', 'ð³¢' => 'ð²¢', 'ð³£' => 'ð²£', 'ð³¤' => 'ð²¤', 'ð³¥' => 'ð²¥', 'ð³¦' => 'ð²¦', 'ð³§' => 'ð²§', 'ð³¨' => 'ð²¨', 'ð³©' => 'ð²©', 'ð³ª' => 'ð²ª', 'ð³«' => 'ð²«', 'ð³¬' => 'ð²¬', 'ð³­' => 'ð²­', 'ð³®' => 'ð²®', 'ð³¯' => 'ð²¯', 'ð³°' => 'ð²°', 'ð³±' => 'ð²±', 'ð³²' => 'ð²²', 'ð‘£€' => 'ð‘¢ ', 'ð‘£' => '𑢡', '𑣂' => 'ð‘¢¢', '𑣃' => 'ð‘¢£', '𑣄' => '𑢤', 'ð‘£…' => 'ð‘¢¥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', 'ð‘£' => 'ð‘¢­', '𑣎' => 'ð‘¢®', 'ð‘£' => '𑢯', 'ð‘£' => 'ð‘¢°', '𑣑' => 'ð‘¢±', 'ð‘£’' => 'ð‘¢²', '𑣓' => 'ð‘¢³', 'ð‘£”' => 'ð‘¢´', '𑣕' => 'ð‘¢µ', 'ð‘£–' => '𑢶', 'ð‘£—' => 'ð‘¢·', '𑣘' => '𑢸', 'ð‘£™' => 'ð‘¢¹', '𑣚' => '𑢺', 'ð‘£›' => 'ð‘¢»', '𑣜' => 'ð‘¢¼', 'ð‘£' => 'ð‘¢½', '𑣞' => 'ð‘¢¾', '𑣟' => '𑢿', 'ð–¹ ' => 'ð–¹€', '𖹡' => 'ð–¹', 'ð–¹¢' => '𖹂', 'ð–¹£' => '𖹃', '𖹤' => '𖹄', 'ð–¹¥' => 'ð–¹…', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', 'ð–¹­' => 'ð–¹', 'ð–¹®' => '𖹎', '𖹯' => 'ð–¹', 'ð–¹°' => 'ð–¹', 'ð–¹±' => '𖹑', 'ð–¹²' => 'ð–¹’', 'ð–¹³' => '𖹓', 'ð–¹´' => 'ð–¹”', 'ð–¹µ' => '𖹕', '𖹶' => 'ð–¹–', 'ð–¹·' => 'ð–¹—', '𖹸' => '𖹘', 'ð–¹¹' => 'ð–¹™', '𖹺' => '𖹚', 'ð–¹»' => 'ð–¹›', 'ð–¹¼' => '𖹜', 'ð–¹½' => 'ð–¹', 'ð–¹¾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => 'ðž¤', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => 'ðž¤', '𞤰' => '𞤎', '𞤱' => 'ðž¤', '𞤲' => 'ðž¤', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => 'ðž¤', '𞥀' => '𞤞', 'ðž¥' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡'); addons/amazons3addon/vendor-prefixed/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php000064400000052420147600374260027107 0ustar00 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Ã' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Ã…' => 'Ã¥', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'ÃŒ' => 'ì', 'Ã' => 'í', 'ÃŽ' => 'î', 'Ã' => 'ï', 'Ã' => 'ð', 'Ñ' => 'ñ', 'Ã’' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ãœ' => 'ü', 'Ã' => 'ý', 'Þ' => 'þ', 'Ä€' => 'Ä', 'Ä‚' => 'ă', 'Ä„' => 'Ä…', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'ÄŠ' => 'Ä‹', 'ÄŒ' => 'Ä', 'ÄŽ' => 'Ä', 'Ä' => 'Ä‘', 'Ä’' => 'Ä“', 'Ä”' => 'Ä•', 'Ä–' => 'Ä—', 'Ę' => 'Ä™', 'Äš' => 'Ä›', 'Äœ' => 'Ä', 'Äž' => 'ÄŸ', 'Ä ' => 'Ä¡', 'Ä¢' => 'Ä£', 'Ĥ' => 'Ä¥', 'Ħ' => 'ħ', 'Ĩ' => 'Ä©', 'Ī' => 'Ä«', 'Ĭ' => 'Ä­', 'Ä®' => 'į', 'Ä°' => 'i', 'IJ' => 'ij', 'Ä´' => 'ĵ', 'Ķ' => 'Ä·', 'Ĺ' => 'ĺ', 'Ä»' => 'ļ', 'Ľ' => 'ľ', 'Ä¿' => 'Å€', 'Å' => 'Å‚', 'Ń' => 'Å„', 'Å…' => 'ņ', 'Ň' => 'ň', 'ÅŠ' => 'Å‹', 'ÅŒ' => 'Å', 'ÅŽ' => 'Å', 'Å' => 'Å‘', 'Å’' => 'Å“', 'Å”' => 'Å•', 'Å–' => 'Å—', 'Ř' => 'Å™', 'Åš' => 'Å›', 'Åœ' => 'Å', 'Åž' => 'ÅŸ', 'Å ' => 'Å¡', 'Å¢' => 'Å£', 'Ť' => 'Å¥', 'Ŧ' => 'ŧ', 'Ũ' => 'Å©', 'Ū' => 'Å«', 'Ŭ' => 'Å­', 'Å®' => 'ů', 'Å°' => 'ű', 'Ų' => 'ų', 'Å´' => 'ŵ', 'Ŷ' => 'Å·', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Å»' => 'ż', 'Ž' => 'ž', 'Æ' => 'É“', 'Æ‚' => 'ƃ', 'Æ„' => 'Æ…', 'Ɔ' => 'É”', 'Ƈ' => 'ƈ', 'Ɖ' => 'É–', 'ÆŠ' => 'É—', 'Æ‹' => 'ÆŒ', 'ÆŽ' => 'Ç', 'Æ' => 'É™', 'Æ' => 'É›', 'Æ‘' => 'Æ’', 'Æ“' => 'É ', 'Æ”' => 'É£', 'Æ–' => 'É©', 'Æ—' => 'ɨ', 'Ƙ' => 'Æ™', 'Æœ' => 'ɯ', 'Æ' => 'ɲ', 'ÆŸ' => 'ɵ', 'Æ ' => 'Æ¡', 'Æ¢' => 'Æ£', 'Ƥ' => 'Æ¥', 'Ʀ' => 'Ê€', 'Ƨ' => 'ƨ', 'Æ©' => 'ʃ', 'Ƭ' => 'Æ­', 'Æ®' => 'ʈ', 'Ư' => 'Æ°', 'Ʊ' => 'ÊŠ', 'Ʋ' => 'Ê‹', 'Ƴ' => 'Æ´', 'Ƶ' => 'ƶ', 'Æ·' => 'Ê’', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'Ç„' => 'dž', 'Ç…' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'ÇŠ' => 'ÇŒ', 'Ç‹' => 'ÇŒ', 'Ç' => 'ÇŽ', 'Ç' => 'Ç', 'Ç‘' => 'Ç’', 'Ç“' => 'Ç”', 'Ç•' => 'Ç–', 'Ç—' => 'ǘ', 'Ç™' => 'Çš', 'Ç›' => 'Çœ', 'Çž' => 'ÇŸ', 'Ç ' => 'Ç¡', 'Ç¢' => 'Ç£', 'Ǥ' => 'Ç¥', 'Ǧ' => 'ǧ', 'Ǩ' => 'Ç©', 'Ǫ' => 'Ç«', 'Ǭ' => 'Ç­', 'Ç®' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ç´' => 'ǵ', 'Ƕ' => 'Æ•', 'Ç·' => 'Æ¿', 'Ǹ' => 'ǹ', 'Ǻ' => 'Ç»', 'Ǽ' => 'ǽ', 'Ǿ' => 'Ç¿', 'È€' => 'È', 'È‚' => 'ȃ', 'È„' => 'È…', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'ÈŠ' => 'È‹', 'ÈŒ' => 'È', 'ÈŽ' => 'È', 'È' => 'È‘', 'È’' => 'È“', 'È”' => 'È•', 'È–' => 'È—', 'Ș' => 'È™', 'Èš' => 'È›', 'Èœ' => 'È', 'Èž' => 'ÈŸ', 'È ' => 'Æž', 'È¢' => 'È£', 'Ȥ' => 'È¥', 'Ȧ' => 'ȧ', 'Ȩ' => 'È©', 'Ȫ' => 'È«', 'Ȭ' => 'È­', 'È®' => 'ȯ', 'È°' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'â±¥', 'È»' => 'ȼ', 'Ƚ' => 'Æš', 'Ⱦ' => 'ⱦ', 'É' => 'É‚', 'Ƀ' => 'Æ€', 'É„' => 'ʉ', 'É…' => 'ÊŒ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'ÉŠ' => 'É‹', 'ÉŒ' => 'É', 'ÉŽ' => 'É', 'Í°' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'Í·', 'Í¿' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'ÎŒ' => 'ÏŒ', 'ÎŽ' => 'Ï', 'Î' => 'ÏŽ', 'Α' => 'α', 'Î’' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Îœ' => 'μ', 'Î' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'Ï€', 'Ρ' => 'Ï', 'Σ' => 'σ', 'Τ' => 'Ï„', 'Î¥' => 'Ï…', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ÏŠ', 'Ϋ' => 'Ï‹', 'Ï' => 'Ï—', 'Ϙ' => 'Ï™', 'Ïš' => 'Ï›', 'Ïœ' => 'Ï', 'Ïž' => 'ÏŸ', 'Ï ' => 'Ï¡', 'Ï¢' => 'Ï£', 'Ϥ' => 'Ï¥', 'Ϧ' => 'ϧ', 'Ϩ' => 'Ï©', 'Ϫ' => 'Ï«', 'Ϭ' => 'Ï­', 'Ï®' => 'ϯ', 'Ï´' => 'θ', 'Ï·' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'Ï»', 'Ͻ' => 'Í»', 'Ͼ' => 'ͼ', 'Ï¿' => 'ͽ', 'Ѐ' => 'Ñ', 'Ð' => 'Ñ‘', 'Ђ' => 'Ñ’', 'Ѓ' => 'Ñ“', 'Є' => 'Ñ”', 'Ð…' => 'Ñ•', 'І' => 'Ñ–', 'Ї' => 'Ñ—', 'Ј' => 'ј', 'Љ' => 'Ñ™', 'Њ' => 'Ñš', 'Ћ' => 'Ñ›', 'ÐŒ' => 'Ñœ', 'Ð' => 'Ñ', 'ÐŽ' => 'Ñž', 'Ð' => 'ÑŸ', 'Ð' => 'а', 'Б' => 'б', 'Ð’' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'Ðœ' => 'м', 'Ð' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'Ñ€', 'С' => 'Ñ', 'Т' => 'Ñ‚', 'У' => 'у', 'Ф' => 'Ñ„', 'Ð¥' => 'Ñ…', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ÑŠ', 'Ы' => 'Ñ‹', 'Ь' => 'ÑŒ', 'Э' => 'Ñ', 'Ю' => 'ÑŽ', 'Я' => 'Ñ', 'Ñ ' => 'Ñ¡', 'Ñ¢' => 'Ñ£', 'Ѥ' => 'Ñ¥', 'Ѧ' => 'ѧ', 'Ѩ' => 'Ñ©', 'Ѫ' => 'Ñ«', 'Ѭ' => 'Ñ­', 'Ñ®' => 'ѯ', 'Ñ°' => 'ѱ', 'Ѳ' => 'ѳ', 'Ñ´' => 'ѵ', 'Ѷ' => 'Ñ·', 'Ѹ' => 'ѹ', 'Ѻ' => 'Ñ»', 'Ѽ' => 'ѽ', 'Ѿ' => 'Ñ¿', 'Ò€' => 'Ò', 'ÒŠ' => 'Ò‹', 'ÒŒ' => 'Ò', 'ÒŽ' => 'Ò', 'Ò' => 'Ò‘', 'Ò’' => 'Ò“', 'Ò”' => 'Ò•', 'Ò–' => 'Ò—', 'Ò˜' => 'Ò™', 'Òš' => 'Ò›', 'Òœ' => 'Ò', 'Òž' => 'ÒŸ', 'Ò ' => 'Ò¡', 'Ò¢' => 'Ò£', 'Ò¤' => 'Ò¥', 'Ò¦' => 'Ò§', 'Ò¨' => 'Ò©', 'Òª' => 'Ò«', 'Ò¬' => 'Ò­', 'Ò®' => 'Ò¯', 'Ò°' => 'Ò±', 'Ò²' => 'Ò³', 'Ò´' => 'Òµ', 'Ò¶' => 'Ò·', 'Ò¸' => 'Ò¹', 'Òº' => 'Ò»', 'Ò¼' => 'Ò½', 'Ò¾' => 'Ò¿', 'Ó€' => 'Ó', 'Ó' => 'Ó‚', 'Óƒ' => 'Ó„', 'Ó…' => 'Ó†', 'Ó‡' => 'Óˆ', 'Ó‰' => 'ÓŠ', 'Ó‹' => 'ÓŒ', 'Ó' => 'ÓŽ', 'Ó' => 'Ó‘', 'Ó’' => 'Ó“', 'Ó”' => 'Ó•', 'Ó–' => 'Ó—', 'Ó˜' => 'Ó™', 'Óš' => 'Ó›', 'Óœ' => 'Ó', 'Óž' => 'ÓŸ', 'Ó ' => 'Ó¡', 'Ó¢' => 'Ó£', 'Ó¤' => 'Ó¥', 'Ó¦' => 'Ó§', 'Ó¨' => 'Ó©', 'Óª' => 'Ó«', 'Ó¬' => 'Ó­', 'Ó®' => 'Ó¯', 'Ó°' => 'Ó±', 'Ó²' => 'Ó³', 'Ó´' => 'Óµ', 'Ó¶' => 'Ó·', 'Ó¸' => 'Ó¹', 'Óº' => 'Ó»', 'Ó¼' => 'Ó½', 'Ó¾' => 'Ó¿', 'Ô€' => 'Ô', 'Ô‚' => 'Ôƒ', 'Ô„' => 'Ô…', 'Ô†' => 'Ô‡', 'Ôˆ' => 'Ô‰', 'ÔŠ' => 'Ô‹', 'ÔŒ' => 'Ô', 'ÔŽ' => 'Ô', 'Ô' => 'Ô‘', 'Ô’' => 'Ô“', 'Ô”' => 'Ô•', 'Ô–' => 'Ô—', 'Ô˜' => 'Ô™', 'Ôš' => 'Ô›', 'Ôœ' => 'Ô', 'Ôž' => 'ÔŸ', 'Ô ' => 'Ô¡', 'Ô¢' => 'Ô£', 'Ô¤' => 'Ô¥', 'Ô¦' => 'Ô§', 'Ô¨' => 'Ô©', 'Ôª' => 'Ô«', 'Ô¬' => 'Ô­', 'Ô®' => 'Ô¯', 'Ô±' => 'Õ¡', 'Ô²' => 'Õ¢', 'Ô³' => 'Õ£', 'Ô´' => 'Õ¤', 'Ôµ' => 'Õ¥', 'Ô¶' => 'Õ¦', 'Ô·' => 'Õ§', 'Ô¸' => 'Õ¨', 'Ô¹' => 'Õ©', 'Ôº' => 'Õª', 'Ô»' => 'Õ«', 'Ô¼' => 'Õ¬', 'Ô½' => 'Õ­', 'Ô¾' => 'Õ®', 'Ô¿' => 'Õ¯', 'Õ€' => 'Õ°', 'Õ' => 'Õ±', 'Õ‚' => 'Õ²', 'Õƒ' => 'Õ³', 'Õ„' => 'Õ´', 'Õ…' => 'Õµ', 'Õ†' => 'Õ¶', 'Õ‡' => 'Õ·', 'Õˆ' => 'Õ¸', 'Õ‰' => 'Õ¹', 'ÕŠ' => 'Õº', 'Õ‹' => 'Õ»', 'ÕŒ' => 'Õ¼', 'Õ' => 'Õ½', 'ÕŽ' => 'Õ¾', 'Õ' => 'Õ¿', 'Õ' => 'Ö€', 'Õ‘' => 'Ö', 'Õ’' => 'Ö‚', 'Õ“' => 'Öƒ', 'Õ”' => 'Ö„', 'Õ•' => 'Ö…', 'Õ–' => 'Ö†', 'á‚ ' => 'â´€', 'á‚¡' => 'â´', 'á‚¢' => 'â´‚', 'á‚£' => 'â´ƒ', 'Ⴄ' => 'â´„', 'á‚¥' => 'â´…', 'Ⴆ' => 'â´†', 'Ⴇ' => 'â´‡', 'Ⴈ' => 'â´ˆ', 'á‚©' => 'â´‰', 'Ⴊ' => 'â´Š', 'á‚«' => 'â´‹', 'Ⴌ' => 'â´Œ', 'á‚­' => 'â´', 'á‚®' => 'â´Ž', 'Ⴏ' => 'â´', 'á‚°' => 'â´', 'Ⴑ' => 'â´‘', 'Ⴒ' => 'â´’', 'Ⴓ' => 'â´“', 'á‚´' => 'â´”', 'Ⴕ' => 'â´•', 'Ⴖ' => 'â´–', 'á‚·' => 'â´—', 'Ⴘ' => 'â´˜', 'Ⴙ' => 'â´™', 'Ⴚ' => 'â´š', 'á‚»' => 'â´›', 'Ⴜ' => 'â´œ', 'Ⴝ' => 'â´', 'Ⴞ' => 'â´ž', 'á‚¿' => 'â´Ÿ', 'Ⴠ' => 'â´ ', 'áƒ' => 'â´¡', 'Ⴢ' => 'â´¢', 'Ⴣ' => 'â´£', 'Ⴤ' => 'â´¤', 'Ⴥ' => 'â´¥', 'Ⴧ' => 'â´§', 'áƒ' => 'â´­', 'Ꭰ' => 'ê­°', 'Ꭱ' => 'ê­±', 'Ꭲ' => 'ê­²', 'Ꭳ' => 'ê­³', 'Ꭴ' => 'ê­´', 'Ꭵ' => 'ê­µ', 'Ꭶ' => 'ê­¶', 'Ꭷ' => 'ê­·', 'Ꭸ' => 'ê­¸', 'Ꭹ' => 'ê­¹', 'Ꭺ' => 'ê­º', 'Ꭻ' => 'ê­»', 'Ꭼ' => 'ê­¼', 'Ꭽ' => 'ê­½', 'Ꭾ' => 'ê­¾', 'Ꭿ' => 'ê­¿', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ê®', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ê®…', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ê®', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ê®', 'á€' => 'ê®', 'á' => 'ꮑ', 'á‚' => 'ê®’', 'áƒ' => 'ꮓ', 'á„' => 'ê®”', 'á…' => 'ꮕ', 'á†' => 'ê®–', 'á‡' => 'ê®—', 'áˆ' => 'ꮘ', 'á‰' => 'ê®™', 'áŠ' => 'ꮚ', 'á‹' => 'ê®›', 'áŒ' => 'ꮜ', 'á' => 'ê®', 'áŽ' => 'ꮞ', 'á' => 'ꮟ', 'á' => 'ê® ', 'á‘' => 'ꮡ', 'á’' => 'ꮢ', 'á“' => 'ꮣ', 'á”' => 'ꮤ', 'á•' => 'ꮥ', 'á–' => 'ꮦ', 'á—' => 'ꮧ', 'á˜' => 'ꮨ', 'á™' => 'ꮩ', 'áš' => 'ꮪ', 'á›' => 'ꮫ', 'áœ' => 'ꮬ', 'á' => 'ê®­', 'áž' => 'ê®®', 'áŸ' => 'ꮯ', 'á ' => 'ê®°', 'á¡' => 'ê®±', 'á¢' => 'ꮲ', 'á£' => 'ꮳ', 'á¤' => 'ê®´', 'á¥' => 'ꮵ', 'á¦' => 'ꮶ', 'á§' => 'ê®·', 'á¨' => 'ꮸ', 'á©' => 'ꮹ', 'áª' => 'ꮺ', 'á«' => 'ê®»', 'á¬' => 'ꮼ', 'á­' => 'ꮽ', 'á®' => 'ꮾ', 'á¯' => 'ꮿ', 'á°' => 'á¸', 'á±' => 'á¹', 'á²' => 'áº', 'á³' => 'á»', 'á´' => 'á¼', 'áµ' => 'á½', 'á²' => 'áƒ', 'Ბ' => 'ბ', 'á²’' => 'გ', 'Დ' => 'დ', 'á²”' => 'ე', 'Ვ' => 'ვ', 'á²–' => 'ზ', 'á²—' => 'თ', 'Ი' => 'ი', 'á²™' => 'კ', 'Ლ' => 'ლ', 'á²›' => 'მ', 'Ნ' => 'ნ', 'á²' => 'áƒ', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'á² ' => 'რ', 'Ს' => 'ს', 'á²¢' => 'ტ', 'á²£' => 'უ', 'Ფ' => 'ფ', 'á²¥' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'á²­' => 'ჭ', 'á²®' => 'ხ', 'Ჯ' => 'ჯ', 'á²°' => 'ჰ', 'á²±' => 'ჱ', 'á²²' => 'ჲ', 'á²³' => 'ჳ', 'á²´' => 'ჴ', 'á²µ' => 'ჵ', 'Ჶ' => 'ჶ', 'á²·' => 'ჷ', 'Ჸ' => 'ჸ', 'á²¹' => 'ჹ', 'Ჺ' => 'ჺ', 'á²½' => 'ჽ', 'á²¾' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'á¸', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'á¸', 'Ḏ' => 'á¸', 'á¸' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'á¸', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'á¹€' => 'á¹', 'Ṃ' => 'ṃ', 'Ṅ' => 'á¹…', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'á¹', 'Ṏ' => 'á¹', 'á¹' => 'ṑ', 'á¹’' => 'ṓ', 'á¹”' => 'ṕ', 'á¹–' => 'á¹—', 'Ṙ' => 'á¹™', 'Ṛ' => 'á¹›', 'Ṝ' => 'á¹', 'Ṟ' => 'ṟ', 'á¹ ' => 'ṡ', 'á¹¢' => 'á¹£', 'Ṥ' => 'á¹¥', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'á¹­', 'á¹®' => 'ṯ', 'á¹°' => 'á¹±', 'á¹²' => 'á¹³', 'á¹´' => 'á¹µ', 'Ṷ' => 'á¹·', 'Ṹ' => 'á¹¹', 'Ṻ' => 'á¹»', 'á¹¼' => 'á¹½', 'á¹¾' => 'ṿ', 'Ẁ' => 'áº', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'áº', 'Ẏ' => 'áº', 'áº' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'á»', 'Ể' => 'ể', 'Ễ' => 'á»…', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'á»', 'Ỏ' => 'á»', 'á»' => 'ố', 'á»’' => 'ồ', 'á»”' => 'ổ', 'á»–' => 'á»—', 'Ộ' => 'á»™', 'Ớ' => 'á»›', 'Ờ' => 'á»', 'Ở' => 'ở', 'á» ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'á»­', 'á»®' => 'ữ', 'á»°' => 'á»±', 'Ỳ' => 'ỳ', 'á»´' => 'ỵ', 'Ỷ' => 'á»·', 'Ỹ' => 'ỹ', 'Ỻ' => 'á»»', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'á¼€', 'Ἁ' => 'á¼', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'á¼' => 'á¼…', 'Ἆ' => 'ἆ', 'á¼' => 'ἇ', 'Ἐ' => 'á¼', 'á¼™' => 'ἑ', 'Ἒ' => 'á¼’', 'á¼›' => 'ἓ', 'Ἔ' => 'á¼”', 'á¼' => 'ἕ', 'Ἠ' => 'á¼ ', 'Ἡ' => 'ἡ', 'Ἢ' => 'á¼¢', 'Ἣ' => 'á¼£', 'Ἤ' => 'ἤ', 'á¼­' => 'á¼¥', 'á¼®' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'á¼°', 'á¼¹' => 'á¼±', 'Ἲ' => 'á¼²', 'á¼»' => 'á¼³', 'á¼¼' => 'á¼´', 'á¼½' => 'á¼µ', 'á¼¾' => 'ἶ', 'Ἷ' => 'á¼·', 'Ὀ' => 'á½€', 'Ὁ' => 'á½', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'á½' => 'á½…', 'á½™' => 'ὑ', 'á½›' => 'ὓ', 'á½' => 'ὕ', 'Ὗ' => 'á½—', 'Ὠ' => 'á½ ', 'Ὡ' => 'ὡ', 'Ὢ' => 'á½¢', 'Ὣ' => 'á½£', 'Ὤ' => 'ὤ', 'á½­' => 'á½¥', 'á½®' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'á¾€', 'ᾉ' => 'á¾', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'á¾' => 'á¾…', 'ᾎ' => 'ᾆ', 'á¾' => 'ᾇ', 'ᾘ' => 'á¾', 'á¾™' => 'ᾑ', 'ᾚ' => 'á¾’', 'á¾›' => 'ᾓ', 'ᾜ' => 'á¾”', 'á¾' => 'ᾕ', 'ᾞ' => 'á¾–', 'ᾟ' => 'á¾—', 'ᾨ' => 'á¾ ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'á¾¢', 'ᾫ' => 'á¾£', 'ᾬ' => 'ᾤ', 'á¾­' => 'á¾¥', 'á¾®' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'á¾°', 'á¾¹' => 'á¾±', 'Ὰ' => 'á½°', 'á¾»' => 'á½±', 'á¾¼' => 'á¾³', 'Ὲ' => 'á½²', 'Έ' => 'á½³', 'á¿Š' => 'á½´', 'á¿‹' => 'á½µ', 'á¿Œ' => 'ῃ', 'Ῐ' => 'á¿', 'á¿™' => 'á¿‘', 'á¿š' => 'ὶ', 'á¿›' => 'á½·', 'Ῠ' => 'á¿ ', 'á¿©' => 'á¿¡', 'Ὺ' => 'ὺ', 'á¿«' => 'á½»', 'Ῥ' => 'á¿¥', 'Ὸ' => 'ὸ', 'Ό' => 'á½¹', 'Ὼ' => 'á½¼', 'á¿»' => 'á½½', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'â„«' => 'Ã¥', 'Ⅎ' => 'â…Ž', 'â… ' => 'â…°', 'â…¡' => 'â…±', 'â…¢' => 'â…²', 'â…£' => 'â…³', 'â…¤' => 'â…´', 'â…¥' => 'â…µ', 'â…¦' => 'â…¶', 'â…§' => 'â…·', 'â…¨' => 'â…¸', 'â…©' => 'â…¹', 'â…ª' => 'â…º', 'â…«' => 'â…»', 'â…¬' => 'â…¼', 'â…­' => 'â…½', 'â…®' => 'â…¾', 'â…¯' => 'â…¿', 'Ↄ' => 'ↄ', 'â’¶' => 'â“', 'â’·' => 'â“‘', 'â’¸' => 'â“’', 'â’¹' => 'â““', 'â’º' => 'â“”', 'â’»' => 'â“•', 'â’¼' => 'â“–', 'â’½' => 'â“—', 'â’¾' => 'ⓘ', 'â’¿' => 'â“™', 'â“€' => 'â“š', 'â“' => 'â“›', 'â“‚' => 'â“œ', 'Ⓝ' => 'â“', 'â“„' => 'â“ž', 'â“…' => 'â“Ÿ', 'Ⓠ' => 'â“ ', 'Ⓡ' => 'â“¡', 'Ⓢ' => 'â“¢', 'Ⓣ' => 'â“£', 'â“Š' => 'ⓤ', 'â“‹' => 'â“¥', 'â“Œ' => 'ⓦ', 'â“' => 'ⓧ', 'â“Ž' => 'ⓨ', 'â“' => 'â“©', 'â°€' => 'â°°', 'â°' => 'â°±', 'â°‚' => 'â°²', 'â°ƒ' => 'â°³', 'â°„' => 'â°´', 'â°…' => 'â°µ', 'â°†' => 'â°¶', 'â°‡' => 'â°·', 'â°ˆ' => 'â°¸', 'â°‰' => 'â°¹', 'â°Š' => 'â°º', 'â°‹' => 'â°»', 'â°Œ' => 'â°¼', 'â°' => 'â°½', 'â°Ž' => 'â°¾', 'â°' => 'â°¿', 'â°' => 'â±€', 'â°‘' => 'â±', 'â°’' => 'ⱂ', 'â°“' => 'ⱃ', 'â°”' => 'ⱄ', 'â°•' => 'â±…', 'â°–' => 'ⱆ', 'â°—' => 'ⱇ', 'â°˜' => 'ⱈ', 'â°™' => 'ⱉ', 'â°š' => 'ⱊ', 'â°›' => 'ⱋ', 'â°œ' => 'ⱌ', 'â°' => 'â±', 'â°ž' => 'ⱎ', 'â°Ÿ' => 'â±', 'â° ' => 'â±', 'â°¡' => 'ⱑ', 'â°¢' => 'â±’', 'â°£' => 'ⱓ', 'â°¤' => 'â±”', 'â°¥' => 'ⱕ', 'â°¦' => 'â±–', 'â°§' => 'â±—', 'â°¨' => 'ⱘ', 'â°©' => 'â±™', 'â°ª' => 'ⱚ', 'â°«' => 'â±›', 'â°¬' => 'ⱜ', 'â°­' => 'â±', 'â°®' => 'ⱞ', 'â± ' => 'ⱡ', 'â±¢' => 'É«', 'â±£' => 'áµ½', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'â±­' => 'É‘', 'â±®' => 'ɱ', 'Ɐ' => 'É', 'â±°' => 'É’', 'â±²' => 'â±³', 'â±µ' => 'ⱶ', 'â±¾' => 'È¿', 'Ɀ' => 'É€', 'â²€' => 'â²', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'â²…', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'â²', 'Ⲏ' => 'â²', 'â²' => 'ⲑ', 'â²’' => 'ⲓ', 'â²”' => 'ⲕ', 'â²–' => 'â²—', 'Ⲙ' => 'â²™', 'Ⲛ' => 'â²›', 'Ⲝ' => 'â²', 'Ⲟ' => 'ⲟ', 'â² ' => 'ⲡ', 'â²¢' => 'â²£', 'Ⲥ' => 'â²¥', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'â²­', 'â²®' => 'ⲯ', 'â²°' => 'â²±', 'â²²' => 'â²³', 'â²´' => 'â²µ', 'Ⲷ' => 'â²·', 'Ⲹ' => 'â²¹', 'Ⲻ' => 'â²»', 'â²¼' => 'â²½', 'â²¾' => 'ⲿ', 'â³€' => 'â³', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'â³…', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'â³', 'Ⳏ' => 'â³', 'â³' => 'ⳑ', 'â³’' => 'ⳓ', 'â³”' => 'ⳕ', 'â³–' => 'â³—', 'Ⳙ' => 'â³™', 'Ⳛ' => 'â³›', 'Ⳝ' => 'â³', 'Ⳟ' => 'ⳟ', 'â³ ' => 'ⳡ', 'â³¢' => 'â³£', 'Ⳬ' => 'ⳬ', 'â³­' => 'â³®', 'â³²' => 'â³³', 'Ꙁ' => 'ê™', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ê™…', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ê™', 'Ꙏ' => 'ê™', 'ê™' => 'ꙑ', 'ê™’' => 'ꙓ', 'ê™”' => 'ꙕ', 'ê™–' => 'ê™—', 'Ꙙ' => 'ê™™', 'Ꙛ' => 'ê™›', 'Ꙝ' => 'ê™', 'Ꙟ' => 'ꙟ', 'ê™ ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ê™­', 'Ꚁ' => 'êš', 'êš‚' => 'ꚃ', 'êš„' => 'êš…', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'êš‹', 'Ꚍ' => 'êš', 'Ꚏ' => 'êš', 'êš' => 'êš‘', 'êš’' => 'êš“', 'êš”' => 'êš•', 'êš–' => 'êš—', 'Ꚙ' => 'êš™', 'êšš' => 'êš›', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'ê€' => 'ê', 'ê‚' => 'êƒ', 'ê„' => 'ê…', 'ê†' => 'ê‡', 'êˆ' => 'ê‰', 'êŠ' => 'ê‹', 'êŒ' => 'ê', 'êŽ' => 'ê', 'ê' => 'ê‘', 'ê’' => 'ê“', 'ê”' => 'ê•', 'ê–' => 'ê—', 'ê˜' => 'ê™', 'êš' => 'ê›', 'êœ' => 'ê', 'êž' => 'êŸ', 'ê ' => 'ê¡', 'ê¢' => 'ê£', 'ê¤' => 'ê¥', 'ê¦' => 'ê§', 'ê¨' => 'ê©', 'êª' => 'ê«', 'ê¬' => 'ê­', 'ê®' => 'ê¯', 'ê¹' => 'êº', 'ê»' => 'ê¼', 'ê½' => 'áµ¹', 'ê¾' => 'ê¿', 'Ꞁ' => 'êž', 'êž‚' => 'ꞃ', 'êž„' => 'êž…', 'Ꞇ' => 'ꞇ', 'êž‹' => 'ꞌ', 'êž' => 'É¥', 'êž' => 'êž‘', 'êž’' => 'êž“', 'êž–' => 'êž—', 'Ꞙ' => 'êž™', 'êžš' => 'êž›', 'êžœ' => 'êž', 'êžž' => 'ꞟ', 'êž ' => 'êž¡', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'êž©', 'Ɦ' => 'ɦ', 'êž«' => 'Éœ', 'Ɡ' => 'É¡', 'êž­' => 'ɬ', 'êž®' => 'ɪ', 'êž°' => 'Êž', 'êž±' => 'ʇ', 'êž²' => 'Ê', 'êž³' => 'ê­“', 'êž´' => 'êžµ', 'Ꞷ' => 'êž·', 'Ꞹ' => 'êž¹', 'Ꞻ' => 'êž»', 'êž¼' => 'êž½', 'êž¾' => 'êž¿', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'êž”', 'Ʂ' => 'Ê‚', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'ï½', 'ï¼¢' => 'b', 'ï¼£' => 'c', 'D' => 'd', 'ï¼¥' => 'ï½…', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'ï¼­' => 'ï½', 'ï¼®' => 'n', 'O' => 'ï½', 'ï¼°' => 'ï½', 'ï¼±' => 'q', 'ï¼²' => 'ï½’', 'ï¼³' => 's', 'ï¼´' => 'ï½”', 'ï¼µ' => 'u', 'V' => 'ï½–', 'ï¼·' => 'ï½—', 'X' => 'x', 'ï¼¹' => 'ï½™', 'Z' => 'z', 'ð€' => 'ð¨', 'ð' => 'ð©', 'ð‚' => 'ðª', 'ðƒ' => 'ð«', 'ð„' => 'ð¬', 'ð…' => 'ð­', 'ð†' => 'ð®', 'ð‡' => 'ð¯', 'ðˆ' => 'ð°', 'ð‰' => 'ð±', 'ðŠ' => 'ð²', 'ð‹' => 'ð³', 'ðŒ' => 'ð´', 'ð' => 'ðµ', 'ðŽ' => 'ð¶', 'ð' => 'ð·', 'ð' => 'ð¸', 'ð‘' => 'ð¹', 'ð’' => 'ðº', 'ð“' => 'ð»', 'ð”' => 'ð¼', 'ð•' => 'ð½', 'ð–' => 'ð¾', 'ð—' => 'ð¿', 'ð˜' => 'ð‘€', 'ð™' => 'ð‘', 'ðš' => 'ð‘‚', 'ð›' => 'ð‘ƒ', 'ðœ' => 'ð‘„', 'ð' => 'ð‘…', 'ðž' => 'ð‘†', 'ðŸ' => 'ð‘‡', 'ð ' => 'ð‘ˆ', 'ð¡' => 'ð‘‰', 'ð¢' => 'ð‘Š', 'ð£' => 'ð‘‹', 'ð¤' => 'ð‘Œ', 'ð¥' => 'ð‘', 'ð¦' => 'ð‘Ž', 'ð§' => 'ð‘', 'ð’°' => 'ð“˜', 'ð’±' => 'ð“™', 'ð’²' => 'ð“š', 'ð’³' => 'ð“›', 'ð’´' => 'ð“œ', 'ð’µ' => 'ð“', 'ð’¶' => 'ð“ž', 'ð’·' => 'ð“Ÿ', 'ð’¸' => 'ð“ ', 'ð’¹' => 'ð“¡', 'ð’º' => 'ð“¢', 'ð’»' => 'ð“£', 'ð’¼' => 'ð“¤', 'ð’½' => 'ð“¥', 'ð’¾' => 'ð“¦', 'ð’¿' => 'ð“§', 'ð“€' => 'ð“¨', 'ð“' => 'ð“©', 'ð“‚' => 'ð“ª', 'ð“ƒ' => 'ð“«', 'ð“„' => 'ð“¬', 'ð“…' => 'ð“­', 'ð“†' => 'ð“®', 'ð“‡' => 'ð“¯', 'ð“ˆ' => 'ð“°', 'ð“‰' => 'ð“±', 'ð“Š' => 'ð“²', 'ð“‹' => 'ð“³', 'ð“Œ' => 'ð“´', 'ð“' => 'ð“µ', 'ð“Ž' => 'ð“¶', 'ð“' => 'ð“·', 'ð“' => 'ð“¸', 'ð“‘' => 'ð“¹', 'ð“’' => 'ð“º', 'ð““' => 'ð“»', 'ð²€' => 'ð³€', 'ð²' => 'ð³', 'ð²‚' => 'ð³‚', 'ð²ƒ' => 'ð³ƒ', 'ð²„' => 'ð³„', 'ð²…' => 'ð³…', 'ð²†' => 'ð³†', 'ð²‡' => 'ð³‡', 'ð²ˆ' => 'ð³ˆ', 'ð²‰' => 'ð³‰', 'ð²Š' => 'ð³Š', 'ð²‹' => 'ð³‹', 'ð²Œ' => 'ð³Œ', 'ð²' => 'ð³', 'ð²Ž' => 'ð³Ž', 'ð²' => 'ð³', 'ð²' => 'ð³', 'ð²‘' => 'ð³‘', 'ð²’' => 'ð³’', 'ð²“' => 'ð³“', 'ð²”' => 'ð³”', 'ð²•' => 'ð³•', 'ð²–' => 'ð³–', 'ð²—' => 'ð³—', 'ð²˜' => 'ð³˜', 'ð²™' => 'ð³™', 'ð²š' => 'ð³š', 'ð²›' => 'ð³›', 'ð²œ' => 'ð³œ', 'ð²' => 'ð³', 'ð²ž' => 'ð³ž', 'ð²Ÿ' => 'ð³Ÿ', 'ð² ' => 'ð³ ', 'ð²¡' => 'ð³¡', 'ð²¢' => 'ð³¢', 'ð²£' => 'ð³£', 'ð²¤' => 'ð³¤', 'ð²¥' => 'ð³¥', 'ð²¦' => 'ð³¦', 'ð²§' => 'ð³§', 'ð²¨' => 'ð³¨', 'ð²©' => 'ð³©', 'ð²ª' => 'ð³ª', 'ð²«' => 'ð³«', 'ð²¬' => 'ð³¬', 'ð²­' => 'ð³­', 'ð²®' => 'ð³®', 'ð²¯' => 'ð³¯', 'ð²°' => 'ð³°', 'ð²±' => 'ð³±', 'ð²²' => 'ð³²', 'ð‘¢ ' => 'ð‘£€', '𑢡' => 'ð‘£', 'ð‘¢¢' => '𑣂', 'ð‘¢£' => '𑣃', '𑢤' => '𑣄', 'ð‘¢¥' => 'ð‘£…', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', 'ð‘¢­' => 'ð‘£', 'ð‘¢®' => '𑣎', '𑢯' => 'ð‘£', 'ð‘¢°' => 'ð‘£', 'ð‘¢±' => '𑣑', 'ð‘¢²' => 'ð‘£’', 'ð‘¢³' => '𑣓', 'ð‘¢´' => 'ð‘£”', 'ð‘¢µ' => '𑣕', '𑢶' => 'ð‘£–', 'ð‘¢·' => 'ð‘£—', '𑢸' => '𑣘', 'ð‘¢¹' => 'ð‘£™', '𑢺' => '𑣚', 'ð‘¢»' => 'ð‘£›', 'ð‘¢¼' => '𑣜', 'ð‘¢½' => 'ð‘£', 'ð‘¢¾' => '𑣞', '𑢿' => '𑣟', 'ð–¹€' => 'ð–¹ ', 'ð–¹' => '𖹡', '𖹂' => 'ð–¹¢', '𖹃' => 'ð–¹£', '𖹄' => '𖹤', 'ð–¹…' => 'ð–¹¥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', 'ð–¹' => 'ð–¹­', '𖹎' => 'ð–¹®', 'ð–¹' => '𖹯', 'ð–¹' => 'ð–¹°', '𖹑' => 'ð–¹±', 'ð–¹’' => 'ð–¹²', '𖹓' => 'ð–¹³', 'ð–¹”' => 'ð–¹´', '𖹕' => 'ð–¹µ', 'ð–¹–' => '𖹶', 'ð–¹—' => 'ð–¹·', '𖹘' => '𖹸', 'ð–¹™' => 'ð–¹¹', '𖹚' => '𖹺', 'ð–¹›' => 'ð–¹»', '𖹜' => 'ð–¹¼', 'ð–¹' => 'ð–¹½', '𖹞' => 'ð–¹¾', '𖹟' => '𖹿', '𞤀' => '𞤢', 'ðž¤' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', 'ðž¤' => '𞤯', '𞤎' => '𞤰', 'ðž¤' => '𞤱', 'ðž¤' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', 'ðž¤' => '𞤿', '𞤞' => '𞥀', '𞤟' => 'ðž¥', '𞤠' => '𞥂', '𞤡' => '𞥃'); addons/amazons3addon/vendor-prefixed/symfony/polyfill-mbstring/Resources/mb_convert_variables.php8000064400000001477147600374260030022 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_variables')) { /** * Convert character code in variable(s) */ function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars) { $vars = [&$var, ...$vars]; $ok = true; array_walk_recursive($vars, function (&$v) use (&$ok, $to_encoding, $from_encoding) { if (false === $v = p\Mbstring::mb_convert_encoding($v, $to_encoding, $from_encoding)) { $ok = false; } }); return $ok ? $from_encoding : false; } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-mbstring/bootstrap.php000064400000021116147600374260023577 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Mbstring as p; if (!\function_exists('\\VendorDuplicator\\mb_convert_encoding')) { function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_decode_mimeheader')) { function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } } if (!\function_exists('\\VendorDuplicator\\mb_encode_mimeheader')) { function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } } if (!\function_exists('\\VendorDuplicator\\mb_decode_numericentity')) { function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_encode_numericentity')) { function mb_encode_numericentity($string, $map, $encoding = null, $hex = \false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } } if (!\function_exists('\\VendorDuplicator\\mb_convert_case')) { function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_language')) { function mb_language($language = null) { return p\Mbstring::mb_language($language); } } if (!\function_exists('\\VendorDuplicator\\mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!\function_exists('\\VendorDuplicator\\mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_check_encoding')) { function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_detect_encoding')) { function mb_detect_encoding($string, $encodings = null, $strict = \false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } } if (!\function_exists('\\VendorDuplicator\\mb_detect_order')) { function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_parse_str')) { function mb_parse_str($string, &$result = array()) { \parse_str($string, $result); } } if (!\function_exists('\\VendorDuplicator\\mb_strlen')) { function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strtolower')) { function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strtoupper')) { function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_substitute_character')) { function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!\function_exists('\\VendorDuplicator\\mb_substr')) { function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_stristr')) { function mb_stristr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strrchr')) { function mb_strrchr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strrichr')) { function mb_strrichr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strripos')) { function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strstr')) { function mb_strstr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!\function_exists('\\VendorDuplicator\\mb_http_output')) { function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_strwidth')) { function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_output_handler')) { function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } } if (!\function_exists('\\VendorDuplicator\\mb_http_input')) { function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } } if (\PHP_VERSION_ID >= 80000) { require_once __DIR__ . '/Resources/mb_convert_variables.php8'; } elseif (!\function_exists('\\VendorDuplicator\\mb_convert_variables')) { function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } } if (!\function_exists('\\VendorDuplicator\\mb_ord')) { function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_str_split')) { function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } if (\extension_loaded('mbstring')) { return; } if (!\defined('MB_CASE_UPPER')) { \define('MB_CASE_UPPER', 0); } if (!\defined('MB_CASE_LOWER')) { \define('MB_CASE_LOWER', 1); } if (!\defined('MB_CASE_TITLE')) { \define('MB_CASE_TITLE', 2); } addons/amazons3addon/vendor-prefixed/symfony/polyfill-mbstring/Mbstring.php000064400000066436147600374260023365 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas * * @internal */ final class Mbstring { const MB_CASE_FOLD = \PHP_INT_MAX; private static $encodingList = array('ASCII', 'UTF-8'); private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; private static $caseFold = array(array('µ', 'Å¿', "Í…", 'Ï‚', "Ï", "Ï‘", "Ï•", "Ï–", "Ï°", "ϱ", "ϵ", "ẛ", "á¾¾"), array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'Ï€', 'κ', 'Ï', 'ε', "ṡ", 'ι')); public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($fromEncoding) || \false !== \strpos($fromEncoding, ',')) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = \base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return \base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return \preg_replace_callback('/[\\x80-\\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); } if ('HTML-ENTITIES' === $fromEncoding) { $s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); $fromEncoding = 'UTF-8'; } return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { $vars = array(&$a, &$b, &$c, &$d, &$e, &$f); $ok = \true; \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) { if (\false === ($v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding))) { $ok = \false; } }); return $ok ? $fromEncoding : \false; } public static function mb_decode_mimeheader($s) { return \iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { \trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = \floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) { $c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return Mbstring::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { \trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); $cnt = \floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3]; $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return \iconv('UTF-8', $encoding . '//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = \preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); } else { if (\MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { $s = \str_replace(self::$caseFold[0], self::$caseFold[1], $s); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = \substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding || \false !== @\iconv($encoding, $encoding, ' ')) { self::$internalEncoding = $encoding; return \true; } return \false; } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($lang = \strtolower($lang)) { case 'uni': case 'neutral': self::$language = $lang; return \true; } return \false; } public static function mb_list_encodings() { return array('UTF-8'); } public static function mb_encoding_aliases($encoding) { switch (\strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return array('utf8'); } return \false; } public static function mb_check_encoding($var = null, $encoding = null) { if (null === $encoding) { if (null === $var) { return \false; } $encoding = self::$internalEncoding; } return self::mb_detect_encoding($var, array($encoding)) || \false !== @\iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = \false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!\preg_match('/[\\x80-\\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (\preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === \strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return \false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (\strncmp($enc, 'ISO-8859-', 9)) { return \false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return \true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } return @\iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING); return \false; } return \iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > ($offset += self::mb_strlen($needle))) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = \iconv_strrpos($haystack, $needle, $encoding); return \false !== $pos ? $offset + $pos : \false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { \trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING); return null; } if (1 > ($split_length = (int) $split_length)) { \trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); return \false; } if (null === $encoding) { $encoding = \mb_internal_encoding(); } if ('UTF-8' === ($encoding = self::getEncoding($encoding))) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{' . $split_length . '})/us'; return \preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = array(); $length = \mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = \mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (0 === \strcasecmp($c, 'none')) { return \true; } return null !== $c ? \false : 'none'; } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) \substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = \iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = \iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) \iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { $pos = \strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = \iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null) { $pos = \strpos($haystack, $needle); if (\false === $pos) { return \false; } if ($part) { return \substr($haystack, 0, $pos); } return \substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = array('internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off'); if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return \false; } public static function mb_http_input($type = '') { return \false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return \substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } private static function getSubpart($pos, $part, $haystack, $encoding) { if (\false === $pos) { return \false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xf0 <= $m[$i]) { $c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } elseif (0xe0 <= $m[$i]) { $c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } else { $c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80; } $entities .= '&#' . $c . ';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = \strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } return $encoding; } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-php70/Resources/stubs/Error.php000064400000000201147600374260025066 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Php70; /** * @author Nicolas Grekas * * @internal */ final class Php70 { public static function intdiv($dividend, $divisor) { $dividend = self::intArg($dividend, __FUNCTION__, 1); $divisor = self::intArg($divisor, __FUNCTION__, 2); if (0 === $divisor) { throw new \DivisionByZeroError('Division by zero'); } if (-1 === $divisor && ~\PHP_INT_MAX === $dividend) { throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer'); } return ($dividend - $dividend % $divisor) / $divisor; } public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { $count = 0; $result = (string) $subject; if (0 === ($limit = self::intArg($limit, __FUNCTION__, 3))) { return $result; } foreach ($patterns as $pattern => $callback) { $result = \preg_replace_callback($pattern, $callback, $result, $limit, $c); $count += $c; } return $result; } public static function error_clear_last() { static $handler; if (!$handler) { $handler = function () { return \false; }; } \set_error_handler($handler); @\trigger_error(''); \restore_error_handler(); } private static function intArg($value, $caller, $pos) { if (\is_int($value)) { return $value; } if (!\is_numeric($value) || \PHP_INT_MAX <= ($value += 0) || ~\PHP_INT_MAX >= $value) { throw new \TypeError(\sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value))); } return (int) $value; } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-php70/bootstrap.php000064400000002006147600374260022705 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Php70 as p; if (\PHP_VERSION_ID >= 70000) { return; } if (!\defined('PHP_INT_MIN')) { \define('PHP_INT_MIN', ~\PHP_INT_MAX); } if (!\function_exists('\\VendorDuplicator\\intdiv')) { function intdiv($num1, $num2) { return p\Php70::intdiv($num1, $num2); } } if (!\function_exists('\\VendorDuplicator\\preg_replace_callback_array')) { function preg_replace_callback_array(array $pattern, $subject, $limit = -1, &$count = 0, $flags = null) { return p\Php70::preg_replace_callback_array($pattern, $subject, $limit, $count); } } if (!\function_exists('\\VendorDuplicator\\error_clear_last')) { function error_clear_last() { return p\Php70::error_clear_last(); } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-php72/bootstrap.php000064400000004363147600374260022717 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Php72 as p; if (\PHP_VERSION_ID >= 70200) { return; } if (!\defined('PHP_FLOAT_DIG')) { \define('PHP_FLOAT_DIG', 15); } if (!\defined('PHP_FLOAT_EPSILON')) { \define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); } if (!\defined('PHP_FLOAT_MIN')) { \define('PHP_FLOAT_MIN', 2.2250738585072E-308); } if (!\defined('PHP_FLOAT_MAX')) { \define('PHP_FLOAT_MAX', 1.7976931348623157E+308); } if (!\defined('PHP_OS_FAMILY')) { \define('PHP_OS_FAMILY', p\Php72::php_os_family()); } if ('\\' === \DIRECTORY_SEPARATOR && !\function_exists('\\VendorDuplicator\\sapi_windows_vt100_support')) { function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } } if (!\function_exists('\\VendorDuplicator\\stream_isatty')) { function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } } if (!\function_exists('\\VendorDuplicator\\utf8_encode')) { function utf8_encode($string) { return p\Php72::utf8_encode($string); } } if (!\function_exists('\\VendorDuplicator\\utf8_decode')) { function utf8_decode($string) { return p\Php72::utf8_decode($string); } } if (!\function_exists('\\VendorDuplicator\\spl_object_id')) { function spl_object_id($object) { return p\Php72::spl_object_id($object); } } if (!\function_exists('\\VendorDuplicator\\mb_ord')) { function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } } if (!\function_exists('\\VendorDuplicator\\mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } addons/amazons3addon/vendor-prefixed/symfony/polyfill-php72/Php72.php000064400000015076147600374260021605 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Php72; /** * @author Nicolas Grekas * @author Dariusz RumiÅ„ski * * @internal */ final class Php72 { private static $hashMask; public static function utf8_encode($s) { $s .= $s; $len = \strlen($s); for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { switch (\true) { case $s[$i] < "\x80": $s[$j] = $s[$i]; break; case $s[$i] < "\xc0": $s[$j] = "\xc2"; $s[++$j] = $s[$i]; break; default: $s[$j] = "\xc3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; } } return \substr($s, 0, $j); } public static function utf8_decode($s) { $s = (string) $s; $len = \strlen($s); for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { switch ($s[$i] & "\xf0") { case "\xc0": case "\xd0": $c = \ord($s[$i] & "\x1f") << 6 | \ord($s[++$i] & "?"); $s[$j] = $c < 256 ? \chr($c) : '?'; break; case "\xf0": ++$i; // no break case "\xe0": $s[$j] = '?'; $i += 2; break; default: $s[$j] = $s[$i]; } } return \substr($s, 0, $j); } public static function php_os_family() { if ('\\' === \DIRECTORY_SEPARATOR) { return 'Windows'; } $map = array('Darwin' => 'Darwin', 'DragonFly' => 'BSD', 'FreeBSD' => 'BSD', 'NetBSD' => 'BSD', 'OpenBSD' => 'BSD', 'Linux' => 'Linux', 'SunOS' => 'Solaris'); return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown'; } public static function spl_object_id($object) { if (null === self::$hashMask) { self::initHashMask(); } if (null === ($hash = \spl_object_hash($object))) { return; } // On 32-bit systems, PHP_INT_SIZE is 4, return self::$hashMask ^ \hexdec(\substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function sapi_windows_vt100_support($stream, $enable = null) { if (!\is_resource($stream)) { \trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } $meta = \stream_get_meta_data($stream); if ('STDIO' !== $meta['stream_type']) { \trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', \E_USER_WARNING); return \false; } // We cannot actually disable vt100 support if it is set if (\false === $enable || !self::stream_isatty($stream)) { return \false; } // The native function does not apply to stdin $meta = \array_map('strtolower', $meta); $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; return !$stdin && (\false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM') || 'Hyper' === \getenv('TERM_PROGRAM')); } public static function stream_isatty($stream) { if (!\is_resource($stream)) { \trigger_error('stream_isatty() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } if ('\\' === \DIRECTORY_SEPARATOR) { $stat = @\fstat($stream); // Check if formatted mode is S_IFCHR return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; } return \function_exists('posix_isatty') && @\posix_isatty($stream); } private static function initHashMask() { $obj = (object) array(); self::$hashMask = -1; // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); foreach (\debug_backtrace(\PHP_VERSION_ID >= 50400 ? \DEBUG_BACKTRACE_IGNORE_ARGS : \false) as $frame) { if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { $frame['line'] = 0; break; } } if (!empty($frame['line'])) { \ob_start(); \debug_zval_dump($obj); self::$hashMask = (int) \substr(\ob_get_clean(), 17); } self::$hashMask ^= \hexdec(\substr(\spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== $encoding) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if (null === $encoding) { $s = \mb_convert_encoding($s, 'UTF-8'); } elseif ('UTF-8' !== $encoding) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } } addons/amazons3addon/vendor-prefixed/.htaccess000064400000000201147600374260015456 0ustar00 Order Deny,Allow Deny from all Order Allow,Deny Allow from all addons/amazons3addon/AmazonS3Addon.php000064400000011076147600374260013705 0ustar00 $storageNums Storages num * * @return array */ public static function getStorageUsageStats($storageNums) { if (($storages = AbstractStorageEntity::getAll()) === false) { $storages = []; } $storageNums['storages_s3_count'] = 0; $storageNums['storages_s3_compatible_count'] = 0; foreach ($storages as $index => $storage) { switch ($storage->getStype()) { case AmazonS3Storage::getSType(): $storageNums['storages_s3_count']++; break; case AmazonS3CompatibleStorage::getSType(): case GoogleCloudStorage::getSType(): case BackblazeStorage::getSType(): case DreamStorage::getSType(): case DigitalOceanStorage::getSType(): case VultrStorage::getSType(): case CloudflareStorage::getSType(): case WasabiStorage::getSType(): $storageNums['storages_s3_compatible_count']++; break; } } return $storageNums; } /** * Purge old S3 multipart uploads * * @return void */ public static function purgeOldS3MultipartUploads() { if (($storages = AbstractStorageEntity::getAll()) == false) { return; } foreach ($storages as $storage) { if (!$storage instanceof \Duplicator\Addons\AmazonS3Addon\Models\AmazonS3Storage) { continue; } $storage->purgeMultipartUpload(); } } /** * * @return string */ public static function getAddonPath() { return __DIR__; } /** * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/dropboxaddon/src/Models/DropboxAdapter.php000064400000050303147600374260016152 0ustar00accessToken = $accessToken; $this->storageFolder = '/' . trim($storageFolder, '/') . '/'; $this->sslVerify = $sslVerify; $this->sslCert = $sslCert; $this->ipv4Only = $ipv4Only; $this->client = new DropboxClient($accessToken, null, DropboxClient::MAX_CHUNK_SIZE, 0, $sslVerify, $sslCert, $ipv4Only); } /** * Get the Dropbox client. * * @return DropboxClient */ public function getClient() { return $this->client; } /** * Initialize the storage on creation. * * @param string $errorMsg The error message if storage is invalid. * * @return bool true on success or false on failure. */ public function initialize(&$errorMsg = '') { if (! $this->exists('/')) { try { $this->createDir('/'); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); $errorMsg = $e->getMessage(); return false; } } return true; } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { $this->delete('/', true); return true; } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { try { $this->client->getMetadata($this->storageFolder); } catch (Exception $e) { DUP_PRO_Log::trace("Dropbox storage is invalid: " . $e->getMessage()); $errorMsg = $e->getMessage(); return false; } return true; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The directory path. * * @return bool true on success or false on failure. */ protected function realCreateDir($path) { $path = $this->formatPath($path); try { $this->client->createFolder($path); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } return true; } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCreateFile($path, $content) { $path = $this->formatPath($path); try { $response = $this->client->upload($path, $content, 'overwrite'); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } return $response['size']; } /** * Delete relative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ protected function realDelete($path, $recursive = false) { $path = $this->formatPath($path); if (! $recursive) { try { $response = $this->client->listFolder($path); if (count($response['entries']) > 0) { return false; } } catch (Exception $e) { // Path is not a directory, so we can delete it. } } try { $this->client->delete($path); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } return true; } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { $content = ''; try { $stream = $this->client->download($this->formatPath($path)); while ($chunk = fgets($stream)) { $content .= $chunk; } } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } return $content; } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ protected function realMove($oldPath, $newPath) { $oldPath = $this->formatPath($oldPath); $newPath = $this->formatPath($newPath); try { $this->client->move($oldPath, $newPath); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } return true; } /** * Get path info. * * @param string $path Relative storage path, if empty, return root path info. * * @return StoragePathInfo The path info or false if path is invalid. */ protected function getRealPathInfo($path) { try { $response = $this->client->getMetadata($this->formatPath($path)); } catch (Exception $e) { $response = []; } return $this->buildPathInfo($response); } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { $path = rtrim($this->formatPath($path), '/') . '/'; $filterFunc = function ($entry) use ($files, $folders) { if ($entry['.tag'] === 'file' && $files) { return true; } if ($entry['.tag'] === 'folder' && $folders) { return true; } return false; }; try { $response = $this->client->listFolder($path); } catch (Exception $e) { DUP_PRO_Log::trace('[DropboxAddon] ' . $e->getMessage()); return []; } // We filter out the entries as needed, then only keep the path. // We do this early to keep the memory usage as low as possible. $entries = array_map(function ($entry) use ($path) { return substr($entry['path_display'], strlen($path)); }, array_filter($response['entries'], $filterFunc)); while ($response['has_more']) { $response = $this->client->listFolderContinue($response['cursor']); $entries = array_merge($entries, array_map(function ($entry) use ($path) { return substr($entry['path_display'], strlen($path)); }, array_filter($response['entries'], $filterFunc))); } return $entries; } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { $path = $this->formatPath($path); try { $response = $this->client->listFolder($path); } catch (Exception $e) { DUP_PRO_Log::trace($e->getMessage()); return false; } if (count($response['entries']) === 0) { return true; } elseif (empty($filters)) { // we have no filters, and the folder is not empty, so it must contain something return false; } $regexFilters = $normalFilters = []; foreach ($filters as $filter) { if ($filter[0] === '/' && substr($filter, -1) === '/') { $regexFilters[] = $filter; // It's a regex filter as it starts and ends with a slash } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { try { $storageFile = $this->formatPath($storageFile); $fileSize = filesize($sourceFile); $chunkSize = $length > 0 ? $length : 4 * MB_IN_BYTES; $fileKey = md5($sourceFile . $storageFile); $completeKey = $fileKey . '_complete'; $result = false; if (isset($extraData[$completeKey]) && $extraData[$completeKey] === true) { // The file is already uploaded return $fileSize; } // Check if we can read the source file if (!$handle = @fopen($sourceFile, 'rb')) { throw new Exception("Could not open source file: {$sourceFile}"); } if ($fileSize <= $chunkSize || $length < 0) { // We need to upload the whole file in one go if (($file = $this->uploadCompleteFile($handle, $storageFile, $chunkSize)) == false) { throw new Exception("Failed to upload file: " . $storageFile); } if (! isset($file['.tag']) || $file['.tag'] !== 'file') { throw new Exception("Failed to upload file: " . json_encode($file)); } $extraData[$completeKey] = true; $result = $fileSize; } else { // At this point we know we need to upload the file in sequential chunks. if (fseek($handle, $offset) !== 0) { throw new Exception("Could not seek to offset {$offset} in source file: {$sourceFile}"); } $cursor = null; if (!empty($extraData[$fileKey])) { $sessionId = $extraData[$fileKey]; $cursor = new UploadSessionCursor($sessionId, $offset); } $contents = @fread($handle, $chunkSize); if ($cursor === null) { // We need to start a new session as we don't have a cursor yet $cursor = $this->client->uploadSessionStart($contents); $extraData[$fileKey] = $cursor->session_id; } elseif (strlen($contents) < $chunkSize) { // As the content size is less than the chunk size, we need to finish the session $this->client->uploadSessionFinish($contents, $cursor, $storageFile, 'overwrite'); $extraData[$completeKey] = true; $cursor->offset += $chunkSize; } else { // A session is already started, we can append to it $cursor = $this->client->uploadSessionAppend($contents, $cursor); $extraData[$fileKey] = $cursor->session_id; } $result = $cursor->offset - $offset; } } catch (Exception $e) { $this->client->setTimeout(0); DUP_PRO_Log::infoTraceException($e, "[DROPBOX] CopyToStorage error"); return false; } catch (Error $e) { $this->client->setTimeout(0); DUP_PRO_Log::infoTraceException($e, "[DROPBOX] CopyToStorage error"); return false; } return $result; } /** * Upload a whole file in one go * * @param resource $sourceHandle Resource handle for the file we are uploading * @param string $storageFile Storage path for the uploaded file * @param int $chunkSize Chunk size to use when uploading * * @return array|false */ protected function uploadCompleteFile($sourceHandle, $storageFile, $chunkSize) { if (@fseek($sourceHandle, 0) !== 0) { DUP_PRO_Log::info("[DropboxAddon] Could not seek to start of source file for {$storageFile}"); return false; } $cursor = $this->client->uploadSessionStart(@fread($sourceHandle, $chunkSize)); $file = null; while (!feof($sourceHandle)) { $contents = @fread($sourceHandle, $chunkSize); if ($contents === false) { return false; } if (strlen($contents) < $chunkSize) { $file = $this->client->uploadSessionFinish($contents, $cursor, $storageFile, 'overwrite'); break; } $cursor = $this->client->uploadSessionAppend($contents, $cursor); } if ($file === null) { $file = $this->client->uploadSessionFinish('', $cursor, $storageFile, 'overwrite'); } return $file; } /** * Normalize path, add storage root path if needed. * * @param string $path Relative storage path. * * @return string */ protected function formatPath($path) { return $this->storageFolder . ltrim($path, '/'); } /** * Build StoragePathInfo object from Dropbox API response. * * @param array $response Dropbox API response. * * @return StoragePathInfo */ protected function buildPathInfo($response) { $info = new StoragePathInfo(); $info->exists = isset($response['.tag']); if (!$info->exists) { return $info; } $info->path = $this->getRelativeStoragePath($response['path_display']); $info->isDir = $response['.tag'] === 'folder'; $info->size = isset($response['size']) ? $response['size'] : 0; $info->created = isset($response['client_modified']) ? strtotime($response['client_modified']) : time(); $info->modified = isset($response['server_modified']) ? strtotime($response['server_modified']) : time(); return $info; } /** * Get relative storage path from Dropbox path display. * * @param string $path_display Dropbox path display. * @param string $subPath Sub path to remove from the path display. * * @return string */ protected function getRelativeStoragePath($path_display, $subPath = '') { $rootPath = $this->storageFolder; if (!empty($subPath)) { $rootPath .= trim($subPath) . '/'; } return substr($path_display, strlen($rootPath)); } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { if (! $this->exists($storageFile)) { DUP_PRO_Log::trace("[DropboxAddon] Storage file {$storageFile} does not exist"); return false; } if (! isset($extraData['resuming']) && file_put_contents($destFile, '') === false) { DUP_PRO_Log::trace("[DropboxAddon] Could not open destination file for writing. File: {$destFile}"); return false; } $extraData['resuming'] = true; if (!isset($extraData['fileSize'])) { $extraData['fileSize'] = $this->getPathInfo($storageFile)->size; } $this->client->setTimeout($timeout / SECONDS_IN_MICROSECONDS); $bytesWritten = $offset; $chunkSize = $length > 0 ? $length : 5 * MB_IN_BYTES; while ($bytesWritten < $extraData['fileSize'] && ($length < 0 || $bytesWritten < $offset + $length)) { try { $content = $this->client->downloadPartial($this->formatPath($storageFile), $bytesWritten, $chunkSize); } catch (Exception $e) { DUP_PRO_Log::info('[DropboxAddon] Failed to download file: ' . $e->getMessage()); break; } if (file_put_contents($destFile, $content, FILE_APPEND) === false) { DUP_PRO_Log::info("[DropboxAddon] Could not write to destination file. File: {$destFile}"); break; } $bytesWritten += strlen($content); } $this->client->setTimeout(0); if ($bytesWritten === $offset) { // nothing was downloaded return false; } return $length > 0 ? $length : $bytesWritten - $offset; } } addons/dropboxaddon/src/Models/DropboxStorage.php000064400000036105147600374260016202 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); return array_merge( $config, [ 'access_token' => '', 'access_token_secret' => '', 'v2_access_token' => '', 'authorized' => false, ] ); } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'access_token' => $this->dropbox_access_token, 'access_token_secret' => $this->dropbox_access_token_secret, 'v2_access_token' => $this->dropbox_v2_access_token, 'storage_folder' => ltrim($this->dropbox_storage_folder, '/\\'), 'max_packages' => $this->dropbox_max_files, 'authorized' => ($this->dropbox_authorization_state == 4), ]; // reset old values $this->dropbox_access_token = ''; $this->dropbox_access_token_secret = ''; $this->dropbox_v2_access_token = ''; $this->dropbox_storage_folder = ''; $this->dropbox_max_files = 10; $this->dropbox_authorization_state = 0; } } /** * Return the storage type * * @return int */ public static function getSType() { return 1; } /** * Returns the storage type icon. * * @return string Returns the storage icon */ public static function getStypeIcon() { return '' . esc_attr(static::getStypeName()) . ''; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('Dropbox', 'duplicator-pro'); } /** * Get storage location string * * @return string */ public function getLocationString() { $dropBoxInfo = $this->getAccountInfo(); if (!isset($dropBoxInfo['locale']) || $dropBoxInfo['locale'] == 'en') { return "https://dropbox.com/home/Apps/Duplicator%20Pro/" . ltrim($this->getStorageFolder(), '/'); } else { return "https://dropbox.com/home"; } } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->isAuthorized(); } /** * Is autorized * * @return bool */ public function isAuthorized() { return $this->config['authorized']; } /** * Authorized from HTTP request * * @param string $message Message * * @return bool True if authorized, false if failed */ public function authorizeFromRequest(&$message = '') { try { if (($authCode = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'auth_code')) === '') { throw new Exception(__('Authorization code is empty', 'duplicator-pro')); } $this->name = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'name', ''); $this->notes = SnapUtil::sanitizeDefaultInput(SnapUtil::INPUT_REQUEST, 'notes', ''); $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'max_packages', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('storage_folder', 'remove'); $this->revokeAuthorization(); $client = $this->getAdapter()->getClient(); if (($token = $client->authenticate($authCode, self::getApiKeySecret())) === false) { throw new Exception(__("Couldn't connect. Dropbox access token not found.", 'duplicator-pro')); } $this->config['v2_access_token'] = $token; $this->config['authorized'] = true; } catch (Exception $e) { DUP_PRO_Log::trace("Problem authorizing Dropbox access token msg: " . $e->getMessage()); $message = $e->getMessage(); return false; } $message = __('Dropbox is connected successfully and Storage Provider Updated.', 'duplicator-pro'); return true; } /** * Revokes authorization * * @param string $message Message * * @return bool True if authorized, false if failed */ public function revokeAuthorization(&$message = '') { if (!$this->isAuthorized()) { $message = __('Dropbox isn\'t authorized.', 'duplicator-pro'); return true; } try { $client = $this->getAdapter()->getClient(); if ($client->revokeToken() === false) { throw new Exception(__('Dropbox can\'t be unauthorized.', 'duplicator-pro')); } $this->config['v2_access_token'] = ''; $this->config['authorized'] = false; } catch (Exception $e) { DUP_PRO_Log::trace("Problem revoking Dropbox access token msg: " . $e->getMessage()); $message = $e->getMessage(); return false; } $message = __('Dropbox is disconnected successfully.', 'duplicator-pro'); return true; } /** * Get authorization URL * * @todo: This should be refactored to use the new TokenService class. * * @return string */ public function getAuthorizationUrl() { $config = self::getApiKeySecret(); return DropboxClient::OAUTH2_URL . 'authorize?client_id=' . $config['app_key'] . '&response_type=code'; } /** * Render form config fields * * @param bool $echo Echo or return * * @return string */ public function renderConfigFields($echo = true) { return TplMng::getInstance()->render( 'dropboxaddon/configs/dropbox', [ 'storage' => $this, 'accountInfo' => $this->getAccountInfo(), 'quotaInfo' => $this->getQuota(), 'storageFolder' => $this->config['storage_folder'], 'maxPackages' => $this->config['max_packages'], ], $echo ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'dropbox_max_files', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('_dropbox_storage_folder', 'remove'); $message = sprintf( __('Dropbox Storage Updated. Folder: %1$s', 'duplicator-pro'), $this->getStorageFolder() ); return true; } /** * Get the storage adapter * * @return DropboxAdapter */ public function getAdapter() { if (! $this->adapter) { $global = DUP_PRO_Global_Entity::getInstance(); $this->adapter = new DropboxAdapter( $this->setV2AccessTokenFromV1Client(), $this->getStorageFolder(), !$global->ssl_disableverify, ($global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH), $global->ipv4_only ); } return $this->adapter; } /** * Get dropbox api key and secret * * @return array{app_key:string,app_secret:string} */ protected static function getApiKeySecret() { $dk = self::getDk1(); $dk = self::getDk2() . $dk; $akey = CryptBlowfish::decryptIfAvaiable('EQNJ53++6/40fuF5ke+IaQ==', $dk); $asec = CryptBlowfish::decryptIfAvaiable('ui25chqoBexPt6QDi9qmGg==', $dk); $akey = trim($akey); $asec = trim($asec); if (($akey != $asec) || ($akey != "fdda100")) { $akey = self::getAk1() . self::getAk2(); $asec = self::getAs1() . self::getAs2(); } return [ 'app_key' => $asec, 'app_secret' => $akey, ]; } /** * Get dk1 * * @return string */ private static function getDk1() { return 'y8!!'; } /** * Get dk2 * * @return string */ private static function getDk2() { return '32897'; } /** * Get ak1 * * @return string */ private static function getAk1() { return strrev('i6gh72iv'); } /** * Get ak2 * * @return string */ private static function getAk2() { return strrev('1xgkhw2'); } /** * Get as1 * * @return string */ private static function getAs1() { return strrev('z7fl2twoo'); } /** * Get as2 * * @return string */ private static function getAs2() { return strrev('2z2bfm'); } /** * Set v2 access token from v1 client * * @return string V2 access token */ protected function setV2AccessTokenFromV1Client() { if (strlen($this->config['v2_access_token']) > 0) { return $this->config['v2_access_token']; } if (strlen($this->config['access_token']) == 0 || strlen($this->config['access_token_secret']) == 0) { return ''; } $oldToken = [ 't' => $this->config['access_token'], 's' => $this->config['access_token_secret'], ]; $accessToken = DropboxClient::accessTokenFromOauth1($oldToken, self::getApiKeySecret()); if ($accessToken) { $this->config['access_token'] = ''; $this->config['access_token_secret'] = ''; $this->config['v2_access_token'] = $accessToken; $this->save(); } else { DUP_PRO_Log::trace("Problem converting Dropbox access token"); $this->config['v2_access_token'] = ''; } return $this->config['v2_access_token']; } /** * Get account info * * @return false|array */ protected function getAccountInfo() { if (!$this->isAuthorized()) { return false; } try { return $this->getAdapter()->getClient()->getAccountInfo(); } catch (Exception $e) { DUP_PRO_Log::trace("Problem getting Dropbox account info. " . $e->getMessage()); } return false; } /** * Get dropbox quota * * @return false|array{used:int,total:int,perc:float,available:string} */ protected function getQuota() { if (!$this->isAuthorized()) { return false; } $quota = $this->getAdapter()->getClient()->getQuota(); if ( !isset($quota['used']) || !isset($quota['allocation']['allocated']) || $quota['allocation']['allocated'] <= 0 ) { return false; } $quota_used = $quota['used']; $quota_total = $quota['allocation']['allocated']; $used_perc = round($quota_used * 100 / $quota_total, 1); $available_quota = $quota_total - $quota_used; return [ 'used' => $quota_used, 'total' => $quota_total, 'perc' => $used_perc, 'available' => size_format($available_quota), ]; } /** * Get upload chunk size in bytes * * @return int bytes */ public function getUploadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); $size = (int) $dGlobal->getVal('dropbox_upload_chunksize_in_kb', 2000); return $size * KB_IN_BYTES; } /** * Get download chunk size in bytes * * @return int bytes */ public function getDownloadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('dropbox_download_chunksize_in_kb', 10000) * KB_IN_BYTES; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { $global = DUP_PRO_Global_Entity::getInstance(); return (int) ($global->php_max_worker_time_in_sec <= 0 ? 0 : $global->php_max_worker_time_in_sec * SECONDS_IN_MICROSECONDS); } /** * @return void */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } }); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return [ 'dropbox_upload_chunksize_in_kb' => 2000, 'dropbox_download_chunksize_in_kb' => 10000, 'dropbox_transfer_mode' => DUP_PRO_Dropbox_Transfer_Mode::Unconfigured, ]; } /** * @return void */ public static function renderGlobalOptions() { $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'dropboxaddon/configs/global_options', [ 'uploadChunkSize' => $dGlobal->getVal('dropbox_upload_chunksize_in_kb', 2000), 'downloadChunkSize' => $dGlobal->getVal('dropbox_dowload_chunksize_in_kb', 10000), ] ); } } addons/dropboxaddon/src/Utils/DropboxClient.php000064400000016534147600374260015675 0ustar00 30, 'headers' => [ 'Authorization' => 'Basic ' . base64_encode($app_config['app_key'] . ':' . $app_config['app_secret']), ], 'body' => [ 'oauth1_token' => $token['t'], 'oauth1_token_secret' => $token['s'], ], ]); if (is_wp_error($response)) { DUP_PRO_Log::traceObject("[DropboxClient] Something wrong with while trying to get v2_access_token with oauth1 token.", $response); return false; } $ret_obj = json_decode($response['body']); if (isset($ret_obj->oauth2_token)) { return $ret_obj->oauth2_token; } return false; } /** * Use the app config to authenticate and get the access token * * @param string $auth_code The authorization code * @param array{app_key: string, app_secret: string} $app_config The app config * * @return bool */ public function authenticate($auth_code, $app_config) { $url = self::OAUTH2_URL . 'token'; $args = $this->injectExtraReqArgs([ 'timeout' => 30, 'body' => [ 'client_id' => $app_config['app_key'], 'client_secret' => $app_config['app_secret'], 'code' => $auth_code, 'grant_type' => 'authorization_code', ], ]); $response = wp_remote_post($url, $args); if (is_wp_error($response)) { DUP_PRO_Log::traceObject("Something wrong with while trying to get v2_access_token with code", $response); return false; } DUP_PRO_Log::traceObject("Got v2 access_token", $response); $ret_obj = json_decode($response['body']); if (isset($ret_obj->access_token)) { return $ret_obj->access_token; } return false; } /** * Get the account's usage quota information. * * @return array{used: int, allocation: array{allocated: int}}|false */ public function getQuota() { try { return $this->rpcEndpointRequest('users/get_space_usage'); } catch (\Exception $e) { \DUP_PRO_Log::trace('[DropboxClient] ' . $e->getMessage()); return false; } } /** * Set the timeout for the client * * @param int $timeout The timeout in seconds * * @return void */ public function setTimeout($timeout) { if ($timeout > 0) { $this->client = new GuzzleClient(['handler' => self::createHandler(), 'timeout' => $timeout]); } else { $this->client = new GuzzleClient(['handler' => self::createHandler()]); } } /** * Download a file from a user's Dropbox. * * @param string $path The path to download * @param int $start The byte to start from * @param int $length The number of bytes to download * * @return string * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-download */ public function downloadPartial($path, $start = 0, $length = 1024 * 1024) { $arguments = ['path' => $this->normalizePath($path)]; $headers = ['Range' => "bytes=$start-" . ($start + $length - 1)]; /** @var Response $response */ $response = $this->contentEndpointRequestWithHeaders('files/download', $arguments, '', $headers); return $response->getBody()->getContents(); } /** * Inject extra request arguments * * @param array $opts The request options * * @return array */ private function injectExtraReqArgs(array $opts) { $global = DUP_PRO_Global_Entity::getInstance(); $opts['sslverify'] = !$global->ssl_disableverify; if (!$global->ssl_useservercerts) { $opts['sslcertificates'] = DUPLICATOR_PRO_CERT_PATH; } return $opts; } /** * Content endpoint request with custom headers * * @param string $endpoint The endpoint to send the request to * @param array $arguments The params to send. * @param string $body The body of the request * @param array $headers Custom headers to add. * * @return \VendorDuplicator\Dropbox\Psr\Http\Message\ResponseInterface * * @throws \Exception */ public function contentEndpointRequestWithHeaders($endpoint, array $arguments, $body = '', $headers = []) { $headers['Dropbox-API-Arg'] = \json_encode($arguments); if ($body !== '') { $headers['Content-Type'] = 'application/octet-stream'; } return $this->client->post($this->getEndpointUrl('content', $endpoint), ['headers' => $this->getHeaders($headers), 'body' => $body]); } } addons/dropboxaddon/src/Utils/Autoloader.php000064400000005375147600374260015221 0ustar00 $mappedPath) { if (strpos($className, $namespace) !== 0) { continue; } $filepath = self::getFilenameFromClass($className, $namespace, $mappedPath); if (file_exists($filepath)) { include $filepath; return; } } } } /** * Return namespace mapping * * @return string[] */ protected static function getNamespacesVendorMapping() { return [ self::ROOT_VENDOR . 'Google\\Service' => self::VENDOR_PATH . 'google/apiclient-services/src', self::ROOT_VENDOR . 'Google\\Auth' => self::VENDOR_PATH . 'google/auth/src', self::ROOT_VENDOR . 'Google' => self::VENDOR_PATH . 'google/apiclient/src', self::ROOT_VENDOR . 'GuzzleHttp\\Promise' => self::VENDOR_PATH . 'guzzlehttp/promises/src', self::ROOT_VENDOR . 'GuzzleHttp\\Psr7' => self::VENDOR_PATH . 'guzzlehttp/psr7/src', self::ROOT_VENDOR . 'GuzzleHttp' => self::VENDOR_PATH . 'guzzlehttp/guzzle/src', self::ROOT_VENDOR . 'Psr\\Http\\Message' => self::VENDOR_PATH . 'psr/http-message/src', self::ROOT_VENDOR . 'Psr\\Log' => self::VENDOR_PATH . 'psr/log/Psr/Log', self::ROOT_VENDOR . 'Psr\\Cache' => self::VENDOR_PATH . 'psr/cache/src', self::ROOT_VENDOR . 'Spatie\\Dropbox' => self::VENDOR_PATH . 'spatie/dropbox-api/src', ]; } } addons/dropboxaddon/template/dropboxaddon/configs/dropbox.php000064400000031273147600374260020632 0ustar00 $tplData * @var DropboxStorage $storage */ $storage = $tplData["storage"]; /** @var false|object */ $accountInfo = $tplData["accountInfo"]; /** @var false|array{used:int,total:int,perc:float,available:string} */ $quotaInfo = $tplData["quotaInfo"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?>
 



 
isAuthorized() && is_array($accountInfo)) : ?>






//Dropbox/Apps/Duplicator Pro/

render('admin_pages/storages/parts/provider_foot'); ?> title = __('Dropbox Connection Status', 'duplicator-pro'); $alertConnStatus->message = ''; // javascript inserted message $alertConnStatus->initAlert(); ?> addons/dropboxaddon/template/dropboxaddon/configs/global_options.php000064400000004676147600374260022177 0ustar00 $tplData */ ?>


 KB

 KB

addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php000064400000005227147600374260024536 0ustar00filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; if (\file_exists($cookieFile)) { $this->load($cookieFile); } } /** * Saves the file when shutting down */ public function __destruct() { $this->save($this->filename); } /** * Saves the cookies to a file. * * @param $filename File to save * @throws \RuntimeException if the file cannot be found or created */ public function save($filename) { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $jsonStr = \VendorDuplicator\Dropbox\GuzzleHttp\json_encode($json); if (\false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } /** * Load cookies from a JSON formatted file. * * Old cookies are kept unless overwritten by newly loaded ones. * * @param $filename Cookie file to load. * @throws \RuntimeException if the file cannot be loaded. */ public function load($filename) { $json = \file_get_contents($filename); if (\false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); } elseif ($json === '') { return; } $data = \VendorDuplicator\Dropbox\GuzzleHttp\json_decode($json, \true); if (\is_array($data)) { foreach (\json_decode($json, \true) as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php000064400000024157147600374260023760 0ustar00 null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => \false, 'Discard' => \false, 'HttpOnly' => \false]; /** @var array Cookie data */ private $data; /** * Create a new SetCookie object from a string * * @param $cookie Set-Cookie header string * * @return self */ public static function fromString($cookie) { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. if (empty($pieces[0]) || !\strpos($pieces[0], '=')) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { $cookieParts = \explode('=', $part, 2); $key = \trim($cookieParts[0]); $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\x00\v") : \true; // Only check for non-cookies when cookies have been found if (empty($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { foreach (\array_keys(self::$defaults) as $search) { if (!\strcasecmp($search, $key)) { $data[$search] = $value; continue 2; } } $data[$key] = $value; } } return new self($data); } /** * @param array $data Array of cookie data provided by a Cookie parser */ public function __construct(array $data = []) { $this->data = \array_replace(self::$defaults, $data); // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date $this->setExpires(\time() + $this->getMaxAge()); } elseif ($this->getExpires() && !\is_numeric($this->getExpires())) { $this->setExpires($this->getExpires()); } } public function __toString() { $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== \false) { if ($k === 'Expires') { $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; '; } else { $str .= ($v === \true ? $k : "{$k}={$v}") . '; '; } } } return \rtrim($str, '; '); } public function toArray() { return $this->data; } /** * Get the cookie name * * @return string */ public function getName() { return $this->data['Name']; } /** * Set the cookie name * * @param $name Cookie name */ public function setName($name) { $this->data['Name'] = $name; } /** * Get the cookie value * * @return string */ public function getValue() { return $this->data['Value']; } /** * Set the cookie value * * @param $value Cookie value */ public function setValue($value) { $this->data['Value'] = $value; } /** * Get the domain * * @return string|null */ public function getDomain() { return $this->data['Domain']; } /** * Set the domain of the cookie * * @param $domain */ public function setDomain($domain) { $this->data['Domain'] = $domain; } /** * Get the path * * @return string */ public function getPath() { return $this->data['Path']; } /** * Set the path of the cookie * * @param $path Path of the cookie */ public function setPath($path) { $this->data['Path'] = $path; } /** * Maximum lifetime of the cookie in seconds * * @return int|null */ public function getMaxAge() { return $this->data['Max-Age']; } /** * Set the max-age of the cookie * * @param $maxAge Max age of the cookie in seconds */ public function setMaxAge($maxAge) { $this->data['Max-Age'] = $maxAge; } /** * The UNIX timestamp when the cookie Expires * * @return mixed */ public function getExpires() { return $this->data['Expires']; } /** * Set the unix timestamp for which the cookie will expire * * @param $timestamp Unix timestamp */ public function setExpires($timestamp) { $this->data['Expires'] = \is_numeric($timestamp) ? (int) $timestamp : \strtotime($timestamp); } /** * Get whether or not this is a secure cookie * * @return bool|null */ public function getSecure() { return $this->data['Secure']; } /** * Set whether or not the cookie is secure * * @param $secure Set to true or false if secure */ public function setSecure($secure) { $this->data['Secure'] = $secure; } /** * Get whether or not this is a session cookie * * @return bool|null */ public function getDiscard() { return $this->data['Discard']; } /** * Set whether or not this is a session cookie * * @param $discard Set to true or false if this is a session cookie */ public function setDiscard($discard) { $this->data['Discard'] = $discard; } /** * Get whether or not this is an HTTP only cookie * * @return bool */ public function getHttpOnly() { return $this->data['HttpOnly']; } /** * Set whether or not this is an HTTP only cookie * * @param $httpOnly Set to true or false if this is HTTP only */ public function setHttpOnly($httpOnly) { $this->data['HttpOnly'] = $httpOnly; } /** * Check if the cookie matches a path value. * * A request-path path-matches a given cookie-path if at least one of * the following conditions holds: * * - The cookie-path and the request-path are identical. * - The cookie-path is a prefix of the request-path, and the last * character of the cookie-path is %x2F ("/"). * - The cookie-path is a prefix of the request-path, and the first * character of the request-path that is not included in the cookie- * path is a %x2F ("/") character. * * @param $requestPath Path to check against * * @return bool */ public function matchesPath($requestPath) { $cookiePath = $this->getPath(); // Match on exact matches or when path is the default empty "/" if ($cookiePath === '/' || $cookiePath == $requestPath) { return \true; } // Ensure that the cookie-path is a prefix of the request path. if (0 !== \strpos($requestPath, $cookiePath)) { return \false; } // Match if the last character of the cookie-path is "/" if (\substr($cookiePath, -1, 1) === '/') { return \true; } // Match if the first character not included in cookie path is "/" return \substr($requestPath, \strlen($cookiePath), 1) === '/'; } /** * Check if the cookie matches a domain value * * @param $domain Domain to check against * * @return bool */ public function matchesDomain($domain) { $cookieDomain = $this->getDomain(); if (null === $cookieDomain) { return \true; } // Remove the leading '.' as per spec in RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.2.3 $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); $domain = \strtolower($domain); // Domain not set or exact match. if ('' === $cookieDomain || $domain === $cookieDomain) { return \true; } // Matching the subdomain according to RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.1.3 if (\filter_var($domain, \FILTER_VALIDATE_IP)) { return \false; } return (bool) \preg_match('/\\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); } /** * Check if the cookie is expired * * @return bool */ public function isExpired() { return $this->getExpires() !== null && \time() > $this->getExpires(); } /** * Check if the cookie is valid according to RFC 6265 * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { // Names must not be empty, but can be 0 $name = $this->getName(); if (empty($name) && !\is_numeric($name)) { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name if (\preg_match('/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/', $name)) { return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\\"/?={}'; } // Value must not be empty, but can be 0 $value = $this->getValue(); if (empty($value) && !\is_numeric($value)) { return 'The cookie value must not be empty'; } // Domains must not be empty, but can be 0 // A "0" is not a valid internet domain, but may be used as server name // in a private network. $domain = $this->getDomain(); if (empty($domain) && !\is_numeric($domain)) { return 'The cookie domain must not be empty'; } return \true; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php000064400000021520147600374260023730 0ustar00strictMode = $strictMode; foreach ($cookieArray as $cookie) { if (!$cookie instanceof SetCookie) { $cookie = new SetCookie($cookie); } $this->setCookie($cookie); } } /** * Create a new Cookie jar from an associative array and domain. * * @param array $cookies Cookies to create the jar from * @param $domain Domain to set the cookies to * * @return self */ public static function fromArray(array $cookies, $domain) { $cookieJar = new self(); foreach ($cookies as $name => $value) { $cookieJar->setCookie(new SetCookie(['Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => \true])); } return $cookieJar; } /** * @deprecated */ public static function getCookieValue($value) { return $value; } /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * * @param SetCookie $cookie Being evaluated. * @param $allowSessionCookies If we should persist session cookies * @return bool */ public static function shouldPersist(SetCookie $cookie, $allowSessionCookies = \false) { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return \true; } } return \false; } /** * Finds and returns the cookie based on the name * * @param $name cookie name to search for * @return SetCookie|null cookie that was found or null if not found */ public function getCookieByName($name) { // don't allow a non string name if ($name === null || !\is_scalar($name)) { return null; } foreach ($this->cookies as $cookie) { if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } return null; } public function toArray() { return \array_map(function (SetCookie $cookie) { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } public function clear($domain = null, $path = null, $name = null) { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($domain) { return !$cookie->matchesDomain($domain); }); } elseif (!$name) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain) { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } else { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } } public function clearSessionCookies() { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) { return !$cookie->getDiscard() && $cookie->getExpires(); }); } public function setCookie(SetCookie $cookie) { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. $name = $cookie->getName(); if (!$name && $name !== '0') { return \false; } // Only allow cookies with set and valid domain, name, value $result = $cookie->validate(); if ($result !== \true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: ' . $result); } else { $this->removeCookieIfEmpty($cookie); return \false; } } // Resolve conflicts with previously set cookies foreach ($this->cookies as $i => $c) { // Two cookies are identical, when their path, and domain are // identical. if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName()) { continue; } // The previously set cookie is a discard cookie and this one is // not so allow the new cookie to be set if (!$cookie->getDiscard() && $c->getDiscard()) { unset($this->cookies[$i]); continue; } // If the new cookie's expiration is further into the future, then // replace the old cookie if ($cookie->getExpires() > $c->getExpires()) { unset($this->cookies[$i]); continue; } // If the value has changed, we better change it if ($cookie->getValue() !== $c->getValue()) { unset($this->cookies[$i]); continue; } // The cookie exists, so no need to continue return \false; } $this->cookies[] = $cookie; return \true; } public function count() { return \count($this->cookies); } public function getIterator() { return new \ArrayIterator(\array_values($this->cookies)); } public function extractCookies(RequestInterface $request, ResponseInterface $response) { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } if (!$sc->matchesDomain($request->getUri()->getHost())) { continue; } // Note: At this point `$sc->getDomain()` being a public suffix should // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } } /** * Computes cookie path following RFC 6265 section 5.1.4 * * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 * * @param RequestInterface $request * @return string */ private function getCookiePathFromRequest(RequestInterface $request) { $uriPath = $request->getUri()->getPath(); if ('' === $uriPath) { return '/'; } if (0 !== \strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } if (0 === ($lastSlashPos = \strrpos($uriPath, '/'))) { return '/'; } return \substr($uriPath, 0, $lastSlashPos); } public function withCookieHeader(RequestInterface $request) { $values = []; $uri = $request->getUri(); $scheme = $uri->getScheme(); $host = $uri->getHost(); $path = $uri->getPath() ?: '/'; foreach ($this->cookies as $cookie) { if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https')) { $values[] = $cookie->getName() . '=' . $cookie->getValue(); } } return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. * * @param SetCookie $cookie */ private function removeCookieIfEmpty(SetCookie $cookie) { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { $this->clear($cookie->getDomain(), $cookie->getPath(), $cookie->getName()); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php000064400000003650147600374260025300 0ustar00sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); } /** * Saves cookies to session when shutting down */ public function __destruct() { $this->save(); } /** * Save cookies to the client session */ public function save() { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $_SESSION[$this->sessionKey] = \json_encode($json); } /** * Load the contents of the client session into the data array */ protected function load() { if (!isset($_SESSION[$this->sessionKey])) { return; } $data = \json_decode($_SESSION[$this->sessionKey], \true); if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie data"); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php000064400000005441147600374260025555 0ustar00stream = $stream; $msg = $msg ?: 'Could not seek the stream to position ' . $pos; parent::__construct($msg); } /** * @return StreamInterface */ public function getStream() { return $this->stream; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php000064400000001433147600374260026674 0ustar00getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; $this->handlerContext = $handlerContext; } /** * Wrap non-RequestExceptions with a RequestException * * @param RequestInterface $request * @param \Exception $e * * @return RequestException */ public static function wrapException(RequestInterface $request, \Exception $e) { return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request * @param ResponseInterface $response Response received * @param \Exception $previous Previous exception * @param array $ctx Optional handler context. * * @return self */ public static function create(RequestInterface $request, ResponseInterface $response = null, \Exception $previous = null, array $ctx = []) { if (!$response) { return new self('Error completing request', $request, null, $previous, $ctx); } $level = (int) \floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; } elseif ($level === 5) { $label = 'Server error'; $className = ServerException::class; } else { $label = 'Unsuccessful request'; $className = __CLASS__; } $uri = $request->getUri(); $uri = static::obfuscateUri($uri); // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) $message = \sprintf('%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri, $response->getStatusCode(), $response->getReasonPhrase()); $summary = static::getResponseBodySummary($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } return new $className($message, $request, $response, $previous, $ctx); } /** * Get a short summary of the response * * Will return `null` if the response is not printable. * * @param ResponseInterface $response * * @return string|null */ public static function getResponseBodySummary(ResponseInterface $response) { return \VendorDuplicator\Dropbox\GuzzleHttp\Psr7\get_message_body_summary($response); } /** * Obfuscates URI if there is a username and a password present * * @param UriInterface $uri * * @return UriInterface */ private static function obfuscateUri(UriInterface $uri) { $userInfo = $uri->getUserInfo(); if (\false !== ($pos = \strpos($userInfo, ':'))) { return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); } return $uri; } /** * Get the request that caused the exception * * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Get the associated response * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Check if a response was received * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. * * @return array */ public function getHandlerContext() { return $this->handlerContext; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php000064400000000761147600374260025752 0ustar00headers)) { throw new \RuntimeException('No headers have been received'); } // HTTP-version SP status-code SP reason-phrase $startLine = \explode(' ', \array_shift($this->headers), 3); $headers = \VendorDuplicator\Dropbox\GuzzleHttp\headers_from_lines($this->headers); $normalizedKeys = \VendorDuplicator\Dropbox\GuzzleHttp\normalize_header_keys($headers); if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } } // Attach a response to the easy handle with the parsed headers. $this->response = new Response($startLine[1], $headers, $this->sink, \substr($startLine[0], 5), isset($startLine[2]) ? (string) $startLine[2] : null); } public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php000064400000013670147600374260024424 0ustar00onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { \call_user_func_array([$this, 'append'], $queue); } } public function __invoke(RequestInterface $request, array $options) { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } if (isset($options['delay']) && \is_numeric($options['delay'])) { \usleep($options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; $response = \array_shift($this->queue); if (isset($options['on_headers'])) { if (!\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $response = new RequestException($msg, $request, $response, $e); } } if (\is_callable($response)) { $response = \call_user_func($response, $request, $options); } $response = $response instanceof \Exception ? \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($response) : \VendorDuplicator\Dropbox\GuzzleHttp\Promise\promise_for($response); return $response->then(function ($value) use($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value); } if (isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; if (\is_resource($sink)) { \fwrite($sink, $contents); } elseif (\is_string($sink)) { \file_put_contents($sink, $contents); } elseif ($sink instanceof \VendorDuplicator\Dropbox\Psr\Http\Message\StreamInterface) { $sink->write($contents); } } return $value; }, function ($reason) use($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { \call_user_func($this->onRejected, $reason); } return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($reason); }); } /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. */ public function append() { foreach (\func_get_args() as $value) { if ($value instanceof ResponseInterface || $value instanceof \Exception || $value instanceof PromiseInterface || \is_callable($value)) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected a response or ' . 'exception. Found ' . \VendorDuplicator\Dropbox\GuzzleHttp\describe_type($value)); } } } /** * Get the last received request. * * @return RequestInterface */ public function getLastRequest() { return $this->lastRequest; } /** * Get the last received request options. * * @return array */ public function getLastOptions() { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. * * @return int */ public function count() { return \count($this->queue); } public function reset() { $this->queue = []; } private function invokeStats(RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null) { if (isset($options['on_stats'])) { $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; $stats = new TransferStats($request, $response, $transferTime, $reason); \call_user_func($options['on_stats'], $stats); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php000064400000003323147600374260023350 0ustar00withoutHeader('Expect'); // Append a content-length header if body size is zero to match // cURL's behavior. if (0 === $request->getBody()->getSize()) { $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse($request, $options, $this->createStream($request, $options), $startTime); } catch (\InvalidArgumentException $e) { throw $e; } catch (\Exception $e) { // Determine if the error was a networking error. $message = $e->getMessage(); // This list can probably get more comprehensive. if (\strpos($message, 'getaddrinfo') || \strpos($message, 'Connection refused') || \strpos($message, "couldn't connect to host") || \strpos($message, "connection attempt failed")) { $e = new ConnectException($e->getMessage(), $request, $e); } $e = RequestException::wrapException($request, $e); $this->invokeStats($options, $request, $startTime, null, $e); return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($e); } } private function invokeStats(array $options, RequestInterface $request, $startTime, ResponseInterface $response = null, $error = null) { if (isset($options['on_stats'])) { $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); \call_user_func($options['on_stats'], $stats); } } private function createResponse(RequestInterface $request, array $options, $stream, $startTime) { $hdrs = $this->lastHeaders; $this->lastHeaders = []; $parts = \explode(' ', \array_shift($hdrs), 3); $ver = \explode('/', $parts[0])[1]; $status = $parts[1]; $reason = isset($parts[2]) ? $parts[2] : null; $headers = \VendorDuplicator\Dropbox\GuzzleHttp\headers_from_lines($hdrs); list($stream, $headers) = $this->checkDecode($options, $headers, $stream); $stream = Psr7\stream_for($stream); $sink = $stream; if (\strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $ex = new RequestException($msg, $request, $response, $e); return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($ex); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); } $this->invokeStats($options, $request, $startTime, $response, null); return new FulfilledPromise($response); } private function createSink(StreamInterface $stream, array $options) { if (!empty($options['stream'])) { return $stream; } $sink = isset($options['sink']) ? $options['sink'] : \fopen('php://temp', 'r+'); return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\stream_for($sink); } private function checkDecode(array $options, array $headers, $stream) { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { $normalizedKeys = \VendorDuplicator\Dropbox\GuzzleHttp\normalize_header_keys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { $stream = new Psr7\InflateStream(Psr7\stream_for($stream)); $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); // Fix content-length header if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); } else { $headers[$normalizedKeys['content-length']] = [$length]; } } } } } return [$stream, $headers]; } /** * Drains the source stream into the "sink" client option. * * @param StreamInterface $source * @param StreamInterface $sink * @param string $contentLength Header specifying the amount of * data to read. * * @return StreamInterface * @throws \RuntimeException when the sink option is invalid. */ private function drain(StreamInterface $source, StreamInterface $sink, $contentLength) { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. Psr7\copy_to_stream($source, $sink, \strlen($contentLength) > 0 && (int) $contentLength > 0 ? (int) $contentLength : -1); $sink->seek(0); $source->close(); return $sink; } /** * Create a resource and check to ensure it was created successfully * * @param callable $callback Callable that returns stream resource * * @return resource * @throws \RuntimeException on error */ private function createResource(callable $callback) { $errors = null; \set_error_handler(function ($_, $msg, $file, $line) use(&$errors) { $errors[] = ['message' => $msg, 'file' => $file, 'line' => $line]; return \true; }); $resource = $callback(); \restore_error_handler(); if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { $message .= "[{$key}] {$value}" . \PHP_EOL; } } throw new \RuntimeException(\trim($message)); } return $resource; } private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { $methods = \array_flip(\get_class_methods(__CLASS__)); } // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection')) { $request = $request->withHeader('Connection', 'close'); } // Ensure SSL is verified by default if (!isset($options['verify'])) { $options['verify'] = \true; } $params = []; $context = $this->getDefaultContext($request); if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } if (!empty($options)) { foreach ($options as $key => $value) { $method = "add_{$key}"; if (isset($methods[$method])) { $this->{$method}($request, $context, $value, $params); } } } if (isset($options['stream_context'])) { if (!\is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } $context = \array_replace_recursive($context, $options['stream_context']); } // Microsoft NTLM authentication only supported with curl handler if (isset($options['auth']) && \is_array($options['auth']) && isset($options['auth'][2]) && 'ntlm' == $options['auth'][2]) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); $context = $this->createResource(function () use($context, $params) { return \stream_context_create($context, $params); }); return $this->createResource(function () use($uri, &$http_response_header, $context, $options) { $resource = \fopen((string) $uri, 'r', null, $context); $this->lastHeaders = $http_response_header; if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; \stream_set_timeout($resource, $sec, $usec); } return $resource; }); } private function resolveHost(RequestInterface $request, array $options) { $uri = $request->getUri(); if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_A); if (!isset($records[0]['ip'])) { throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost($records[0]['ip']); } elseif ('v6' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_AAAA); if (!isset($records[0]['ipv6'])) { throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); } } return $uri; } private function getDefaultContext(RequestInterface $request) { $headers = ''; foreach ($request->getHeaders() as $name => $value) { foreach ($value as $val) { $headers .= "{$name}: {$val}\r\n"; } } $context = ['http' => ['method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => \true, 'follow_location' => 0]]; $body = (string) $request->getBody(); if (!empty($body)) { $context['http']['content'] = $body; // Prevent the HTTP handler from adding a Content-Type header. if (!$request->hasHeader('Content-Type')) { $context['http']['header'] .= "Content-Type:\r\n"; } } $context['http']['header'] = \rtrim($context['http']['header']); return $context; } private function add_proxy(RequestInterface $request, &$options, $value, &$params) { if (!\is_array($value)) { $options['http']['proxy'] = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { if (!isset($value['no']) || !\VendorDuplicator\Dropbox\GuzzleHttp\is_host_in_noproxy($request->getUri()->getHost(), $value['no'])) { $options['http']['proxy'] = $value[$scheme]; } } } } private function add_timeout(RequestInterface $request, &$options, $value, &$params) { if ($value > 0) { $options['http']['timeout'] = $value; } } private function add_verify(RequestInterface $request, &$options, $value, &$params) { if ($value === \true) { // PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert. if (\PHP_VERSION_ID < 50600) { $options['ssl']['cafile'] = \VendorDuplicator\Dropbox\GuzzleHttp\default_ca_bundle(); } } elseif (\is_string($value)) { $options['ssl']['cafile'] = $value; if (!\file_exists($value)) { throw new \RuntimeException("SSL CA bundle not found: {$value}"); } } elseif ($value === \false) { $options['ssl']['verify_peer'] = \false; $options['ssl']['verify_peer_name'] = \false; return; } else { throw new \InvalidArgumentException('Invalid verify request option'); } $options['ssl']['verify_peer'] = \true; $options['ssl']['verify_peer_name'] = \true; $options['ssl']['allow_self_signed'] = \false; } private function add_cert(RequestInterface $request, &$options, $value, &$params) { if (\is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } if (!\file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } private function add_progress(RequestInterface $request, &$options, $value, &$params) { $this->addNotification($params, function ($code, $a, $b, $c, $transferred, $total) use($value) { if ($code == \STREAM_NOTIFY_PROGRESS) { $value($total, $transferred, null, null); } }); } private function add_debug(RequestInterface $request, &$options, $value, &$params) { if ($value === \false) { return; } static $map = [\STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE']; static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; $value = \VendorDuplicator\Dropbox\GuzzleHttp\debug_resource($value); $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); $this->addNotification($params, function () use($ident, $value, $map, $args) { $passed = \func_get_args(); $code = \array_shift($passed); \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); foreach (\array_filter($passed) as $i => $v) { \fwrite($value, $args[$i] . ': "' . $v . '" '); } \fwrite($value, "\n"); }); } private function addNotification(array &$params, callable $notify) { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { $params['notification'] = $this->callArray([$params['notification'], $notify]); } } private function callArray(array $functions) { return function () use($functions) { $args = \func_get_args(); foreach ($functions as $fn) { \call_user_func_array($fn, $args); } }; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php000064400000050132147600374260024464 0ustar00maxHandles = $maxHandles; } public function create(RequestInterface $request, array $options) { if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; unset($options['curl']['body_as_string']); } $easy = new EasyHandle(); $easy->request = $request; $easy->options = $options; $conf = $this->getDefaultConf($easy); $this->applyMethod($easy, $conf); $this->applyHandlerOptions($easy, $conf); $this->applyHeaders($easy, $conf); unset($conf['_headers']); // Add handler options from the request configuration options if (isset($options['curl'])) { $conf = \array_replace($conf, $options['curl']); } $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); \curl_setopt_array($easy->handle, $conf); return $easy; } public function release(EasyHandle $easy) { $resource = $easy->handle; unset($easy->handle); if (\count($this->handles) >= $this->maxHandles) { \curl_close($resource); } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); \curl_setopt($resource, \CURLOPT_READFUNCTION, null); \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); \curl_reset($resource); $this->handles[] = $resource; } } /** * Completes a cURL transaction, either returning a response promise or a * rejected promise. * * @param callable $handler * @param EasyHandle $easy * @param CurlFactoryInterface $factory Dictates how the handle is released * * @return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\PromiseInterface */ public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } if (!$easy->response || $easy->errno) { return self::finishError($handler, $easy, $factory); } // Return the response if it is present and there is no error. $factory->release($easy); // Rewind the body of the response if possible. $body = $easy->response->getBody(); if ($body->isSeekable()) { $body->rewind(); } return new FulfilledPromise($easy->response); } private static function invokeStats(EasyHandle $easy) { $curlStats = \curl_getinfo($easy->handle); $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); $stats = new TransferStats($easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats); \call_user_func($easy->options['on_stats'], $stats); } private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { // Get error information and release the handle to the factory. $ctx = ['errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME)] + \curl_getinfo($easy->handle); $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } private static function createRejection(EasyHandle $easy, array $ctx) { static $connectionErrors = [\CURLE_OPERATION_TIMEOUTED => \true, \CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true]; // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for(new RequestException('An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx)); } if (\version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { $message = \sprintf('cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'); } else { $message = \sprintf('cURL error %s: %s (%s) for %s', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', $easy->request->getUri()); } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($error); } private function getDefaultConf(EasyHandle $easy) { $conf = ['_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => \false, \CURLOPT_HEADER => \false, \CURLOPT_CONNECTTIMEOUT => 150]; if (\defined('CURLOPT_PROTOCOLS')) { $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ($version == 1.1) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; } elseif ($version == 2.0) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; } else { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; } return $conf; } private function applyMethod(EasyHandle $easy, array &$conf) { $body = $easy->request->getBody(); $size = $body->getSize(); if ($size === null || $size > 0) { $this->applyBody($easy->request, $easy->options, $conf); return; } $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { // See http://tools.ietf.org/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { $conf[\CURLOPT_NOBODY] = \true; unset($conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE]); } } private function applyBody(RequestInterface $request, array $options, array &$conf) { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. if ($size !== null && $size < 1000000 || !empty($options['_body_as_string'])) { $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { $conf[\CURLOPT_UPLOAD] = \true; if ($size !== null) { $conf[\CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } $conf[\CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } private function applyHeaders(EasyHandle $easy, array &$conf) { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { $value = (string) $value; if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. $conf[\CURLOPT_HTTPHEADER][] = "{$name};"; } else { $conf[\CURLOPT_HTTPHEADER][] = "{$name}: {$value}"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; } } /** * Remove a header from the options array. * * @param $name Case-insensitive header to remove * @param array $options Array of options to modify */ private function removeHeader($name, array &$options) { foreach (\array_keys($options['_headers']) as $key) { if (!\strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } private function applyHandlerOptions(EasyHandle $easy, array &$conf) { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === \false) { unset($conf[\CURLOPT_CAINFO]); $conf[\CURLOPT_SSL_VERIFYHOST] = 0; $conf[\CURLOPT_SSL_VERIFYPEER] = \false; } else { $conf[\CURLOPT_SSL_VERIFYHOST] = 2; $conf[\CURLOPT_SSL_VERIFYPEER] = \true; if (\is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. if (!\file_exists($options['verify'])) { throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. if (\is_dir($options['verify']) || \is_link($options['verify']) && \is_dir(\readlink($options['verify']))) { $conf[\CURLOPT_CAPATH] = $options['verify']; } else { $conf[\CURLOPT_CAINFO] = $options['verify']; } } } } if (!empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { $conf[\CURLOPT_ENCODING] = $accept; } else { $conf[\CURLOPT_ENCODING] = ''; // Don't let curl send the header over the wire $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } if (isset($options['sink'])) { $sink = $options['sink']; if (!\is_string($sink)) { $sink = \VendorDuplicator\Dropbox\GuzzleHttp\Psr7\stream_for($sink); } elseif (!\is_dir(\dirname($sink))) { // Ensure that the directory exists before failing in curl. throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); } else { $sink = new LazyOpenStream($sink, 'w+'); } $easy->sink = $sink; $conf[\CURLOPT_WRITEFUNCTION] = function ($ch, $write) use($sink) { return $sink->write($write); }; } else { // Use a default temp stream if no sink was set. $conf[\CURLOPT_FILE] = \fopen('php://temp', 'w+'); $easy->sink = Psr7\stream_for($conf[\CURLOPT_FILE]); } $timeoutRequiresNoSignal = \false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { $conf[\CURLOPT_NOSIGNAL] = \true; } if (isset($options['proxy'])) { if (!\is_array($options['proxy'])) { $conf[\CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); if (!isset($options['proxy']['no']) || !\VendorDuplicator\Dropbox\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])) { $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } } if (isset($options['cert'])) { $cert = $options['cert']; if (\is_array($cert)) { $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } if (!\file_exists($cert)) { throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); } $conf[\CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { if (\is_array($options['ssl_key'])) { if (\count($options['ssl_key']) === 2) { list($sslKey, $conf[\CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; } else { list($sslKey) = $options['ssl_key']; } } $sslKey = isset($sslKey) ? $sslKey : $options['ssl_key']; if (!\file_exists($sslKey)) { throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); } $conf[\CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; if (!\is_callable($progress)) { throw new \InvalidArgumentException('progress client option must be callable'); } $conf[\CURLOPT_NOPROGRESS] = \false; $conf[\CURLOPT_PROGRESSFUNCTION] = function () use($progress) { $args = \func_get_args(); // PHP 5.5 pushed the handle onto the start of the args if (\is_resource($args[0])) { \array_shift($args); } \call_user_func_array($progress, $args); }; } if (!empty($options['debug'])) { $conf[\CURLOPT_STDERR] = \VendorDuplicator\Dropbox\GuzzleHttp\debug_resource($options['debug']); $conf[\CURLOPT_VERBOSE] = \true; } } /** * This function ensures that a response was set on a transaction. If one * was not set, then the request is retried if possible. This error * typically means you are sending a payload, curl encountered a * "Connection died, retrying a fresh connect" error, tried to rewind the * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. */ private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx) { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); if ($body->tell() > 0) { $body->rewind(); } } catch (\RuntimeException $e) { $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e; return self::createRejection($easy, $ctx); } // Retry no more than 3 times before giving up. if (!isset($easy->options['_curl_retries'])) { $easy->options['_curl_retries'] = 1; } elseif ($easy->options['_curl_retries'] == 2) { $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.'; return self::createRejection($easy, $ctx); } else { $easy->options['_curl_retries']++; } return $handler($easy->request, $easy->options); } private function createHeaderFn(EasyHandle $easy) { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; if (!\is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } return function ($ch, $h) use($onHeaders, $easy, &$startingResponse) { $value = \trim($h); if ($value === '') { $startingResponse = \true; $easy->createResponse(); if ($onHeaders !== null) { try { $onHeaders($easy->response); } catch (\Exception $e) { // Associate the exception with the handle and trigger // a curl header write error by returning 0. $easy->onHeadersException = $e; return -1; } } } elseif ($startingResponse) { $startingResponse = \false; $easy->headers = [$value]; } else { $easy->headers[] = $value; } return \strlen($h); }; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php000064400000002441147600374260024432 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(3); } public function __invoke(RequestInterface $request, array $options) { if (isset($options['delay'])) { \usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); \curl_exec($easy->handle); $easy->errno = \curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php000064400000014206147600374260025447 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; } elseif ($selectTimeout = \getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { $this->selectTimeout = $selectTimeout; } else { $this->selectTimeout = 1; } $this->options = isset($options['options']) ? $options['options'] : []; } public function __get($name) { if ($name === '_mh') { $this->_mh = \curl_multi_init(); foreach ($this->options as $option => $value) { // A warning is raised in case of a wrong option. \curl_multi_setopt($this->_mh, $option, $value); } // Further calls to _mh will return the value directly, without entering the // __get() method at all. return $this->_mh; } throw new \BadMethodCallException(); } public function __destruct() { if (isset($this->_mh)) { \curl_multi_close($this->_mh); unset($this->_mh); } } public function __invoke(RequestInterface $request, array $options) { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; $promise = new Promise([$this, 'execute'], function () use($id) { return $this->cancel($id); }); $this->addRequest(['easy' => $easy, 'deferred' => $promise]); return $promise; } /** * Ticks the curl event loop. */ public function tick() { // Add any delayed handles if needed. if ($this->delays) { $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); \curl_multi_add_handle($this->_mh, $this->handles[$id]['easy']->handle); } } } // Step through the task queue which may add additional requests. P\queue()->run(); if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 \usleep(250); } while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { } $this->processMessages(); } /** * Runs until all outstanding connections have completed. */ public function execute() { $queue = P\queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { \usleep($this->timeToNext()); } $this->tick(); } } private function addRequest(array $entry) { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { \curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + $easy->options['delay'] / 1000; } } /** * Cancels a handle from sending and removes references to it. * * @param $id Handle ID to cancel and remove. * * @return bool True on success, false on failure. */ private function cancel($id) { // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return \false; } $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); \curl_multi_remove_handle($this->_mh, $handle); \curl_close($handle); return \true; } private function processMessages() { while ($done = \curl_multi_info_read($this->_mh)) { $id = (int) $done['handle']; \curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve(CurlFactory::finish($this, $entry['easy'], $this->factory)); } } private function timeToNext() { $currentTime = Utils::currentTime(); $nextTime = \PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } return \max(0, $nextTime - $currentTime) * 1000000; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Utils.php000064400000005524147600374260021757 0ustar00getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === \false) { $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; $errorConstants = \array_filter(\array_keys(\get_defined_constants()), function ($name) { return \substr($name, 0, 11) === 'IDNA_ERROR_'; }); $errors = []; foreach ($errorConstants as $errorConstant) { if ($errorBitSet & \constant($errorConstant)) { $errors[] = $errorConstant; } } $errorMessage = 'IDN conversion failed'; if ($errors) { $errorMessage .= ' (errors: ' . \implode(', ', $errors) . ')'; } throw new InvalidArgumentException($errorMessage); } else { if ($uri->getHost() !== $asciiHost) { // Replace URI only if the ASCII version is different $uri = $uri->withHost($asciiHost); } } } return $uri; } /** * @param $domain * @param int $options * @param array $info * * @return string|false */ private static function idnToAsci($domain, $options, &$info = []) { if (\preg_match('%^[ -~]+$%', $domain) === 1) { return $domain; } if (\extension_loaded('intl') && \defined('INTL_IDNA_VARIANT_UTS46')) { return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); } /* * The Idn class is marked as @internal. Verify that class and method exists. */ if (\method_exists(Idn::class, 'idn_to_ascii')) { return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); } throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/MessageFormatter.php000064400000014650147600374260024127 0ustar00>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; /** @var string Template used to format log messages */ private $template; /** * @param $template Log message template */ public function __construct($template = self::CLF) { $this->template = $template ?: self::CLF; } /** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received * @param \Exception $error Exception that was received * * @return string */ public function format(RequestInterface $request, ResponseInterface $response = null, \Exception $error = null) { $cache = []; return \preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { return $cache[$matches[1]]; } $result = ''; switch ($matches[1]) { case 'request': $result = Psr7\str($request); break; case 'response': $result = $response ? Psr7\str($response) : ''; break; case 'req_headers': $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); break; case 'res_headers': $result = $response ? \sprintf('HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase()) . "\r\n" . $this->headers($response) : 'NULL'; break; case 'req_body': $result = $request->getBody(); break; case 'res_body': $result = $response ? $response->getBody() : 'NULL'; break; case 'ts': case 'date_iso_8601': $result = \gmdate('c'); break; case 'date_common_log': $result = \date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); break; case 'version': $result = $request->getProtocolVersion(); break; case 'uri': case 'url': $result = $request->getUri(); break; case 'target': $result = $request->getRequestTarget(); break; case 'req_version': $result = $request->getProtocolVersion(); break; case 'res_version': $result = $response ? $response->getProtocolVersion() : 'NULL'; break; case 'host': $result = $request->getHeaderLine('Host'); break; case 'hostname': $result = \gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; break; case 'phrase': $result = $response ? $response->getReasonPhrase() : 'NULL'; break; case 'error': $result = $error ? $error->getMessage() : 'NULL'; break; default: // handle prefixed dynamic headers if (\strpos($matches[1], 'req_header_') === 0) { $result = $request->getHeaderLine(\substr($matches[1], 11)); } elseif (\strpos($matches[1], 'res_header_') === 0) { $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; } } $cache[$matches[1]] = $result; return $result; }, $this->template); } /** * Get headers from message as string * * @return string */ private function headers(MessageInterface $message) { $result = ''; foreach ($message->getHeaders() as $name => $values) { $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; } return \trim($result); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/functions.php000064400000023420147600374260022662 0ustar00expand($template, $variables); } /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (\gettype($input)) { case 'object': return 'object(' . \get_class($input) . ')'; case 'array': return 'array(' . \count($input) . ')'; default: \ob_start(); \var_dump($input); // normalize float vs double return \str_replace('double(', 'float(', \rtrim(\ob_get_clean())); } } /** * Parses an array of header lines into an associative array of headers. * * @param iterable $lines Header lines array of strings in the following * format: "Name: Value" * @return array */ function headers_from_lines($lines) { $headers = []; foreach ($lines as $line) { $parts = \explode(':', $line, 2); $headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null; } return $headers; } /** * Returns a debug stream based on the provided variable. * * @param mixed $value Optional value * * @return resource */ function debug_resource($value = null) { if (\is_resource($value)) { return $value; } elseif (\defined('STDOUT')) { return \STDOUT; } return \fopen('php://output', 'w'); } /** * Chooses and creates a default handler to use based on the environment. * * The returned handler is not wrapped by any default middlewares. * * @return callable Returns the best handler for the given system. * @throws \RuntimeException if no viable Handler is available. */ function choose_handler() { $handler = null; if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); } elseif (\function_exists('curl_exec')) { $handler = new CurlHandler(); } elseif (\function_exists('curl_multi_exec')) { $handler = new CurlMultiHandler(); } if (\ini_get('allow_url_fopen')) { $handler = $handler ? Proxy::wrapStreaming($handler, new StreamHandler()) : new StreamHandler(); } elseif (!$handler) { throw new \RuntimeException('VendorDuplicator\Dropbox\\GuzzleHttp requires cURL, the ' . 'allow_url_fopen ini setting, or a custom HTTP handler.'); } return $handler; } /** * Get the default User-Agent string to use with Guzzle * * @return string */ function default_user_agent() { static $defaultAgent = ''; if (!$defaultAgent) { $defaultAgent = 'VendorDuplicator\Dropbox\\GuzzleHttp/' . Client::VERSION; if (\extension_loaded('curl') && \function_exists('curl_version')) { $defaultAgent .= ' curl/' . \curl_version()['version']; } $defaultAgent .= ' PHP/' . \PHP_VERSION; } return $defaultAgent; } /** * Returns the default cacert bundle for the current system. * * First, the openssl.cafile and curl.cainfo php.ini settings are checked. * If those settings are not configured, then the common locations for * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X * and Windows are checked. If any of these file locations are found on * disk, they will be utilized. * * Note: the result of this function is cached for subsequent calls. * * @return string * @throws \RuntimeException if no bundle can be found. */ function default_ca_bundle() { static $cached = null; static $cafiles = [ // Red Hat, CentOS, Fedora (provided by the ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Ubuntu, Debian (provided by the ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // FreeBSD (provided by the ca_root_nss package) '/usr/local/share/certs/ca-root-nss.crt', // SLES 12 (provided by the ca-certificates package) '/var/lib/ca-certificates/ca-bundle.pem', // OS X provided by homebrew (using the default path) '/usr/local/etc/openssl/cert.pem', // Google app engine '/etc/ca-certificates.crt', // Windows? 'C:\\windows\\system32\\curl-ca-bundle.crt', 'C:\\windows\\curl-ca-bundle.crt', ]; if ($cached) { return $cached; } if ($ca = \ini_get('openssl.cafile')) { return $cached = $ca; } if ($ca = \ini_get('curl.cainfo')) { return $cached = $ca; } foreach ($cafiles as $filename) { if (\file_exists($filename)) { return $cached = $filename; } } throw new \RuntimeException(<< ['prefix' => '', 'joiner' => ',', 'query' => \false], '+' => ['prefix' => '', 'joiner' => ',', 'query' => \false], '#' => ['prefix' => '#', 'joiner' => ',', 'query' => \false], '.' => ['prefix' => '.', 'joiner' => '.', 'query' => \false], '/' => ['prefix' => '/', 'joiner' => '/', 'query' => \false], ';' => ['prefix' => ';', 'joiner' => ';', 'query' => \true], '?' => ['prefix' => '?', 'joiner' => '&', 'query' => \true], '&' => ['prefix' => '&', 'joiner' => '&', 'query' => \true]]; /** @var array Delimiters */ private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=']; /** @var array Percent encoded delimiters */ private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D']; public function expand($template, array $variables) { if (\false === \strpos($template, '{')) { return $template; } $this->template = $template; $this->variables = $variables; return \preg_replace_callback('/\\{([^\\}]+)\\}/', [$this, 'expandMatch'], $this->template); } /** * Parse an expression into parts * * @param $expression Expression to parse * * @return array Returns an associative array of parts */ private function parseExpression($expression) { $result = []; if (isset(self::$operatorHash[$expression[0]])) { $result['operator'] = $expression[0]; $expression = \substr($expression, 1); } else { $result['operator'] = ''; } foreach (\explode(',', $expression) as $value) { $value = \trim($value); $varspec = []; if ($colonPos = \strpos($value, ':')) { $varspec['value'] = \substr($value, 0, $colonPos); $varspec['modifier'] = ':'; $varspec['position'] = (int) \substr($value, $colonPos + 1); } elseif (\substr($value, -1) === '*') { $varspec['modifier'] = '*'; $varspec['value'] = \substr($value, 0, -1); } else { $varspec['value'] = (string) $value; $varspec['modifier'] = ''; } $result['values'][] = $varspec; } return $result; } /** * Process an expansion * * @param array $matches Matches met in the preg_replace_callback * * @return string Returns the replacement string */ private function expandMatch(array $matches) { static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; $replacements = []; $parsed = self::parseExpression($matches[1]); $prefix = self::$operatorHash[$parsed['operator']]['prefix']; $joiner = self::$operatorHash[$parsed['operator']]['joiner']; $useQuery = self::$operatorHash[$parsed['operator']]['query']; foreach ($parsed['values'] as $value) { if (!isset($this->variables[$value['value']])) { continue; } $variable = $this->variables[$value['value']]; $actuallyUseQuery = $useQuery; $expanded = ''; if (\is_array($variable)) { $isAssoc = $this->isAssoc($variable); $kvp = []; foreach ($variable as $key => $var) { if ($isAssoc) { $key = \rawurlencode($key); $isNestedArray = \is_array($var); } else { $isNestedArray = \false; } if (!$isNestedArray) { $var = \rawurlencode($var); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $var = $this->decodeReserved($var); } } if ($value['modifier'] === '*') { if ($isAssoc) { if ($isNestedArray) { // Nested arrays must allow for deeply nested // structures. $var = \strtr(\http_build_query([$key => $var]), $rfc1738to3986); } else { $var = $key . '=' . $var; } } elseif ($key > 0 && $actuallyUseQuery) { $var = $value['value'] . '=' . $var; } } $kvp[$key] = $var; } if (empty($variable)) { $actuallyUseQuery = \false; } elseif ($value['modifier'] === '*') { $expanded = \implode($joiner, $kvp); if ($isAssoc) { // Don't prepend the value name when using the explode // modifier with an associative array. $actuallyUseQuery = \false; } } else { if ($isAssoc) { // When an associative array is encountered and the // explode modifier is not set, then the result must be // a comma separated list of keys followed by their // respective values. foreach ($kvp as $k => &$v) { $v = $k . ',' . $v; } } $expanded = \implode(',', $kvp); } } else { if ($value['modifier'] === ':') { $variable = \substr($variable, 0, $value['position']); } $expanded = \rawurlencode($variable); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $expanded = $this->decodeReserved($expanded); } } if ($actuallyUseQuery) { if (!$expanded && $joiner !== '&') { $expanded = $value['value']; } else { $expanded = $value['value'] . '=' . $expanded; } } $replacements[] = $expanded; } $ret = \implode($joiner, $replacements); if ($ret && $prefix) { return $prefix . $ret; } return $ret; } /** * Determines if an array is associative. * * This makes the assumption that input arrays are sequences or hashes. * This assumption is a tradeoff for accuracy in favor of speed, but it * should work in almost every case where input is supplied for a URI * template. * * @param array $array Array to check * * @return bool */ private function isAssoc(array $array) { return $array && \array_keys($array)[0] !== 0; } /** * Removes percent encoding on reserved characters (used with + and # * modifiers). * * @param $string String to fix * * @return string */ private function decodeReserved($string) { return \str_replace(self::$delimsPct, self::$delims, $string); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/ClientInterface.php000064400000005701147600374260023713 0ustar00 'http://www.foo.com/1.0/', * 'timeout' => 0, * 'allow_redirects' => false, * 'proxy' => '192.168.16.1:10' * ]); * * Client configuration settings include the following options: * * - handler: (callable) Function that transfers HTTP requests over the * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a * Psr7\Http\Message\ResponseInterface on success. * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged * into relative URIs. Can be a string or instance of UriInterface. * - **: any request option * * @param array $config Client configuration settings. * * @see \VendorDuplicator\Dropbox\GuzzleHttp\RequestOptions for a list of available request options. */ public function __construct(array $config = []) { if (!isset($config['handler'])) { $config['handler'] = HandlerStack::create(); } elseif (!\is_callable($config['handler'])) { throw new \InvalidArgumentException('handler must be a callable'); } // Convert the base_uri to a UriInterface if (isset($config['base_uri'])) { $config['base_uri'] = Psr7\uri_for($config['base_uri']); } $this->configureDefaults($config); } /** * @param $method * @param array $args * * @return Promise\PromiseInterface */ public function __call($method, $args) { if (\count($args) < 1) { throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $opts = isset($args[1]) ? $args[1] : []; return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } /** * Asynchronously send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function sendAsync(RequestInterface $request, array $options = []) { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); return $this->transfer($request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options); } /** * Send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function send(RequestInterface $request, array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->sendAsync($request, $options)->wait(); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function requestAsync($method, $uri = '', array $options = []) { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. $headers = isset($options['headers']) ? $options['headers'] : []; $body = isset($options['body']) ? $options['body'] : null; $version = isset($options['version']) ? $options['version'] : '1.1'; // Merge the URI into the base URI. $uri = $this->buildUri($uri, $options); if (\is_array($body)) { $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. unset($options['headers'], $options['body'], $options['version']); return $this->transfer($request, $options); } /** * Create and send an HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string $method HTTP method. * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function request($method, $uri = '', array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->requestAsync($method, $uri, $options)->wait(); } /** * Get a client configuration option. * * These options include default request options of the client, a "handler" * (if utilized by the concrete client), and a "base_uri" if utilized by * the concrete client. * * @param string|null $option The config option to retrieve. * * @return mixed */ public function getConfig($option = null) { return $option === null ? $this->config : (isset($this->config[$option]) ? $this->config[$option] : null); } /** * @param string|null $uri * * @return UriInterface */ private function buildUri($uri, array $config) { // for BC we accept null which would otherwise fail in uri_for $uri = Psr7\uri_for($uri === null ? '' : $uri); if (isset($config['base_uri'])) { $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && $config['idn_conversion'] !== \false) { $idnOptions = $config['idn_conversion'] === \true ? \IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } /** * Configures the default options for a client. * * @param array $config * @return void */ private function configureDefaults(array $config) { $defaults = ['allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => \true, 'decode_content' => \true, 'verify' => \true, 'cookies' => \false, 'idn_conversion' => \true]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". if (\php_sapi_name() === 'cli' && \getenv('HTTP_PROXY')) { $defaults['proxy']['http'] = \getenv('HTTP_PROXY'); } if ($proxy = \getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } if ($noProxy = \getenv('NO_PROXY')) { $cleanedNoProxy = \str_replace(' ', '', $noProxy); $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; if (!empty($config['cookies']) && $config['cookies'] === \true) { $this->config['cookies'] = new CookieJar(); } // Add the default user-agent header. if (!isset($this->config['headers'])) { $this->config['headers'] = ['User-Agent' => default_user_agent()]; } else { // Add the User-Agent header if one was not already set. foreach (\array_keys($this->config['headers']) as $name) { if (\strtolower($name) === 'user-agent') { return; } } $this->config['headers']['User-Agent'] = default_user_agent(); } } /** * Merges default options into the array. * * @param array $options Options to modify by reference * * @return array */ private function prepareDefaults(array $options) { $defaults = $this->config; if (!empty($defaults['headers'])) { // Default headers are only added if they are not present. $defaults['_conditional'] = $defaults['headers']; unset($defaults['headers']); } // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. if (\array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); } elseif (!\is_array($options['headers'])) { throw new \InvalidArgumentException('headers must be an array'); } } // Shallow merge defaults underneath options. $result = $options + $defaults; // Remove null values. foreach ($result as $k => $v) { if ($v === null) { unset($result[$k]); } } return $result; } /** * Transfers the given request and applies request options. * * The URI of the request is not modified and the request options are used * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ private function transfer(RequestInterface $request, array $options) { // save_to -> sink if (isset($options['save_to'])) { $options['sink'] = $options['save_to']; unset($options['save_to']); } // exceptions -> http_errors if (isset($options['exceptions'])) { $options['http_errors'] = $options['exceptions']; unset($options['exceptions']); } $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { return Promise\promise_for($handler($request, $options)); } catch (\Exception $e) { return Promise\rejection_for($e); } } /** * Applies the array of request options to a request. * * @param RequestInterface $request * @param array $options * * @return RequestInterface */ private function applyOptions(RequestInterface $request, array &$options) { $modify = ['set_headers' => []]; if (isset($options['headers'])) { $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { throw new \InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); } $options['body'] = \http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } if (isset($options['multipart'])) { $options['body'] = new Psr7\MultipartStream($options['multipart']); unset($options['multipart']); } if (isset($options['json'])) { $options['body'] = \VendorDuplicator\Dropbox\GuzzleHttp\json_encode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } if (!empty($options['decode_content']) && $options['decode_content'] !== \true) { // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { if (\is_array($options['body'])) { $this->invalidBody(); } $modify['body'] = Psr7\stream_for($options['body']); unset($options['body']); } if (!empty($options['auth']) && \is_array($options['auth'])) { $value = $options['auth']; $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' . \base64_encode("{$value[0]}:{$value[1]}"); break; case 'digest': // @todo: Do not rely on curl $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; case 'ntlm': $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; } } if (isset($options['query'])) { $value = $options['query']; if (\is_array($value)) { $value = \http_build_query($value, null, '&', \PHP_QUERY_RFC3986); } if (!\is_string($value)) { throw new \InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); } // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? if (\is_bool($options['sink'])) { throw new \InvalidArgumentException('sink must not be a boolean'); } } $request = Psr7\modify_request($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); } // Merge in conditional headers if they are not present. if (isset($options['_conditional'])) { // Build up the changes so it's in a single clone of the message. $modify = []; foreach ($options['_conditional'] as $k => $v) { if (!$request->hasHeader($k)) { $modify['set_headers'][$k] = $v; } } $request = Psr7\modify_request($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } return $request; } /** * Throw Exception with pre-set message. * @return void * @throws \InvalidArgumentException Invalid body. */ private function invalidBody() { throw new \InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a POST request has been deprecated. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/Pool.php000064400000011377147600374260021573 0ustar00 $rfn) { if ($rfn instanceof RequestInterface) { (yield $key => $client->sendAsync($rfn, $opts)); } elseif (\is_callable($rfn)) { (yield $key => $rfn($opts)); } else { throw new \InvalidArgumentException('Each value yielded by ' . 'the iterator must be a Psr7\\Http\\Message\\RequestInterface ' . 'or a callable that returns a promise that fulfills ' . 'with a Psr7\\Message\\Http\\ResponseInterface object.'); } } }; $this->each = new EachPromise($requests(), $config); } /** * Get promise * * @return PromiseInterface */ public function promise() { return $this->each->promise(); } /** * Sends multiple requests concurrently and returns an array of responses * and exceptions that uses the same ordering as the provided requests. * * IMPORTANT: This method keeps every request and response in memory, and * as such, is NOT recommended when sending a large number or an * indeterminate number of requests concurrently. * * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in * {@see GuzzleHttp\Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. * @throws \InvalidArgumentException if the event format is incorrect. */ public static function batch(ClientInterface $client, $requests, array $options = []) { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); \ksort($res); return $res; } /** * Execute callback(s) * * @return void */ private static function cmpCallback(array &$options, $name, array &$results) { if (!isset($options[$name])) { $options[$name] = function ($v, $k) use(&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; $options[$name] = function ($v, $k) use(&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php000064400000006501147600374260023756 0ustar00decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; } /** * Default exponential backoff delay function. * * @param $retries * * @return int milliseconds. */ public static function exponentialDelay($retries) { return (int) \pow(2, $retries - 1) * 1000; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); } /** * Execute fulfilled closure * * @return mixed */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, $value, null)) { return $value; } return $this->doRetry($req, $options, $value); }; } /** * Execute rejected closure * * @return callable */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, null, $reason)) { return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($reason); } return $this->doRetry($req, $options); }; } /** * @return self */ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) { $options['delay'] = \call_user_func($this->delay, ++$options['retries'], $response); return $this($request, $options); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/RequestOptions.php000064400000024161147600374260023661 0ustar00withCookieHeader($request); return $handler($request, $options)->then(function ($response) use($cookieJar, $request) { $cookieJar->extractCookies($request, $response); return $response; }); }; }; } /** * Middleware that throws exceptions for 4xx or 5xx responses when the * "http_error" request option is set to true. * * @return callable Returns a function that accepts the next handler. */ public static function httpErrors() { return function (callable $handler) { return function ($request, array $options) use($handler) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then(function (ResponseInterface $response) use($request) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } throw RequestException::create($request, $response); }); }; }; } /** * Middleware that pushes history data to an ArrayAccess container. * * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ public static function history(&$container) { if (!\is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } return function (callable $handler) use(&$container) { return function ($request, array $options) use($handler, &$container) { return $handler($request, $options)->then(function ($value) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => $value, 'error' => null, 'options' => $options]; return $value; }, function ($reason) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => null, 'error' => $reason, 'options' => $options]; return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * Middleware that invokes a callback before and after sending a request. * * The provided listener cannot modify or alter the response. It simply * "taps" into the chain to be notified before returning the promise. The * before listener accepts a request and options array, and the after * listener accepts a request, options array, and response promise. * * @param callable $before Function to invoke before forwarding the request. * @param callable $after Function invoked after forwarding. * * @return callable Returns a function that accepts the next handler. */ public static function tap(callable $before = null, callable $after = null) { return function (callable $handler) use($before, $after) { return function ($request, array $options) use($handler, $before, $after) { if ($before) { $before($request, $options); } $response = $handler($request, $options); if ($after) { $after($request, $options, $response); } return $response; }; }; } /** * Middleware that handles request redirects. * * @return callable Returns a function that accepts the next handler. */ public static function redirect() { return function (callable $handler) { return new RedirectMiddleware($handler); }; } /** * Middleware that retries requests based on the boolean result of * invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and * returns true if the request is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * * @return callable Returns a function that accepts the next handler. */ public static function retry(callable $decider, callable $delay = null) { return function (callable $handler) use($decider, $delay) { return new RetryMiddleware($decider, $handler, $delay); }; } /** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info') { return function (callable $handler) use($logger, $formatter, $logLevel) { return function ($request, array $options) use($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter, $logLevel) { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, function ($reason) use($logger, $request, $formatter) { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, $reason); $logger->notice($message); return \VendorDuplicator\Dropbox\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. * * @return callable */ public static function prepareBody() { return function (callable $handler) { return new PrepareBodyMiddleware($handler); }; } /** * Middleware that applies a map function to the request before passing to * the next handler. * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. * @return callable */ public static function mapRequest(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($fn($request), $options); }; }; } /** * Middleware that applies a map function to the resolved promise's * response. * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. * @return callable */ public static function mapResponse(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($request, $options)->then($fn); }; }; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/TransferStats.php000064400000006075147600374260023464 0ustar00request = $request; $this->response = $response; $this->transferTime = $transferTime; $this->handlerErrorData = $handlerErrorData; $this->handlerStats = $handlerStats; } /** * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Returns the response that was received (if any). * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Returns true if a response was received. * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Gets handler specific error data. * * This might be an exception, a integer representing an error code, or * anything else. Relying on this value assumes that you know what handler * you are using. * * @return mixed */ public function getHandlerErrorData() { return $this->handlerErrorData; } /** * Get the effective URI the request was sent to. * * @return UriInterface */ public function getEffectiveUri() { return $this->request->getUri(); } /** * Get the estimated time the request was being transferred by the handler. * * @return float|null Time in seconds. */ public function getTransferTime() { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. * * @return array */ public function getHandlerStats() { return $this->handlerStats; } /** * Get a specific handler statistic from the handler by name. * * @param $stat Handler specific transfer stat to retrieve. * * @return mixed|null */ public function getHandlerStat($stat) { return isset($this->handlerStats[$stat]) ? $this->handlerStats[$stat] : null; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/functions_include.php000064400000000342147600374260024363 0ustar00nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; // Don't do anything if the request has no body. if ($request->getBody()->getSize() === 0) { return $fn($request, $options); } $modify = []; // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { if ($type = Psr7\mimetype_from_filename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } } // Add a default content-length or transfer-encoding header. if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding')) { $size = $request->getBody()->getSize(); if ($size !== null) { $modify['set_headers']['Content-Length'] = $size; } else { $modify['set_headers']['Transfer-Encoding'] = 'chunked'; } } // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); return $fn(Psr7\modify_request($request, $modify), $options); } /** * Add expect header * * @return void */ private function addExpectHeader(RequestInterface $request, array $options, array &$modify) { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } $expect = isset($options['expect']) ? $options['expect'] : null; // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 if ($expect === \false || $request->getProtocolVersion() < 1.1) { return; } // The expect header is unconditionally enabled if ($expect === \true) { $modify['set_headers']['Expect'] = '100-Continue'; return; } // By default, send the expect header when the payload is > 1mb if ($expect === null) { $expect = 1048576; } // Always add if the body cannot be rewound, the size cannot be // determined, or the size is greater than the cutoff threshold $body = $request->getBody(); $size = $body->getSize(); if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { $modify['set_headers']['Expect'] = '100-Continue'; } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php000064400000017710147600374260024416 0ustar00 5, 'protocols' => ['http', 'https'], 'strict' => \false, 'referer' => \false, 'track_redirects' => \false]; /** @var callable */ private $nextHandler; /** * @param callable $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; if (empty($options['allow_redirects'])) { return $fn($request, $options); } if ($options['allow_redirects'] === \true) { $options['allow_redirects'] = self::$defaultSettings; } elseif (!\is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings $options['allow_redirects'] += self::$defaultSettings; } if (empty($options['allow_redirects']['max'])) { return $fn($request, $options); } return $fn($request, $options)->then(function (ResponseInterface $response) use($request, $options) { return $this->checkRedirect($request, $options, $response); }); } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return ResponseInterface|PromiseInterface */ public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) { if (\substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location')) { return $response; } $this->guardMax($request, $options); $nextRequest = $this->modifyRequest($request, $options, $response); // If authorization is handled by curl, unset it if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && \defined('\\CURLOPT_HTTPAUTH')) { unset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]); } if (isset($options['allow_redirects']['on_redirect'])) { \call_user_func($options['allow_redirects']['on_redirect'], $request, $response, $nextRequest->getUri()); } /** @var PromiseInterface|ResponseInterface $promise */ $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. if (!empty($options['allow_redirects']['track_redirects'])) { return $this->withTracking($promise, (string) $nextRequest->getUri(), $response->getStatusCode()); } return $promise; } /** * Enable tracking on promise. * * @return PromiseInterface */ private function withTracking(PromiseInterface $promise, $uri, $statusCode) { return $promise->then(function (ResponseInterface $response) use($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); \array_unshift($historyHeader, $uri); \array_unshift($statusHeader, $statusCode); return $response->withHeader(self::HISTORY_HEADER, $historyHeader)->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); }); } /** * Check for too many redirects. * * @return void * * @throws TooManyRedirectsException Too many redirects. */ private function guardMax(RequestInterface $request, array &$options) { $current = isset($options['__redirect_count']) ? $options['__redirect_count'] : 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request); } } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return RequestInterface */ public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response) { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; // Use a GET request if this is an entity enclosing request and we are // not forcing RFC compliance, but rather emulating what all browsers // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || $statusCode <= 302 && !$options['allow_redirects']['strict']) { $modify['method'] = 'GET'; $modify['body'] = ''; } $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && $options['idn_conversion'] !== \false) { $idnOptions = $options['idn_conversion'] === \true ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; Psr7\rewind_body($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme()) { $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; } // Remove Authorization and Cookie headers if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; $modify['remove_headers'][] = 'Cookie'; } return Psr7\modify_request($request, $modify); } /** * Set the appropriate URL on the request based on the location header. * * @param RequestInterface $request * @param ResponseInterface $response * @param array $protocols * * @return UriInterface */ private static function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols) { $location = Psr7\UriResolver::resolve($request->getUri(), new Psr7\Uri($response->getHeaderLine('Location'))); // Ensure that the redirect URI is allowed based on the protocols. if (!\in_array($location->getScheme(), $protocols)) { throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); } return $location; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/src/HandlerStack.php000064400000017132147600374260023220 0ustar00push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); $stack->push(Middleware::prepareBody(), 'prepare_body'); return $stack; } /** * @param callable $handler Underlying HTTP handler. */ public function __construct(callable $handler = null) { $this->handler = $handler; } /** * Invokes the handler stack as a composed handler * * @param RequestInterface $request * @param array $options * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $handler = $this->resolve(); return $handler($request, $options); } /** * Dumps a string representation of the stack. * * @return string */ public function __toString() { $depth = 0; $stack = []; if ($this->handler) { $stack[] = "0) Handler: " . $this->debugCallable($this->handler); } $result = ''; foreach (\array_reverse($this->stack) as $tuple) { $depth++; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= "Function: " . $this->debugCallable($tuple[0]); $result = "> {$str}\n{$result}"; $stack[] = $str; } foreach (\array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } return $result; } /** * Set the HTTP handler that actually returns a promise. * * @param callable $handler Accepts a request and array of options and * returns a Promise. */ public function setHandler(callable $handler) { $this->handler = $handler; $this->cached = null; } /** * Returns true if the builder has a handler. * * @return bool */ public function hasHandler() { return (bool) $this->handler; } /** * Unshift a middleware to the bottom of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function unshift(callable $middleware, $name = null) { \array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function push(callable $middleware, $name = '') { $this->stack[] = [$middleware, $name]; $this->cached = null; } /** * Add a middleware before another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function before($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \true); } /** * Add a middleware after another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function after($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \false); } /** * Remove a middleware by instance or name from the stack. * * @param callable|$remove Middleware to remove by instance or name. */ public function remove($remove) { $this->cached = null; $idx = \is_callable($remove) ? 0 : 1; $this->stack = \array_values(\array_filter($this->stack, function ($tuple) use($idx, $remove) { return $tuple[$idx] !== $remove; })); } /** * Compose the middleware and handler into a single callable function. * * @return callable */ public function resolve() { if (!$this->cached) { if (!($prev = $this->handler)) { throw new \LogicException('No handler has been specified'); } foreach (\array_reverse($this->stack) as $fn) { $prev = $fn[0]($prev); } $this->cached = $prev; } return $this->cached; } /** * @param $name * @return int */ private function findByName($name) { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { return $k; } } throw new \InvalidArgumentException("Middleware not found: {$name}"); } /** * Splices a function into the middleware list at a specific position. * * @param string $findName * @param string $withName * @param callable $middleware * @param bool $before */ private function splice($findName, $withName, callable $middleware, $before) { $this->cached = null; $idx = $this->findByName($findName); $tuple = [$middleware, $withName]; if ($before) { if ($idx === 0) { \array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; \array_splice($this->stack, $idx, 1, $replacement); } } elseif ($idx === \count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; \array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * * @param array|callable $fn Function to write as a string. * * @return string */ private function debugCallable($fn) { if (\is_string($fn)) { return "callable({$fn})"; } if (\is_array($fn)) { return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; } return 'callable(' . \spl_object_hash($fn) . ')'; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/guzzle/Dockerfile000064400000000603147600374260021342 0ustar00FROM composer:latest as setup RUN mkdir /guzzle WORKDIR /guzzle RUN set -xe \ && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ && composer require guzzlehttp/guzzle FROM php:7.3 RUN mkdir /guzzle WORKDIR /guzzle COPY --from=setup /guzzle /guzzle addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/AggregateException.php000064400000000565147600374260024745 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\Utils::queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface */ public static function queue(TaskQueueInterface $assign = null) { static $queue; if ($assign) { $queue = $assign; } elseif (!$queue) { $queue = new TaskQueue(); } return $queue; } /** * Adds a function to run in the task queue when it is next `run()` and * returns a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface */ public static function task(callable $task) { $queue = self::queue(); $promise = new Promise([$queue, 'run']); $queue->add(function () use($task, $promise) { try { if (Is::pending($promise)) { $promise->resolve($task()); } } catch (\Throwable $e) { $promise->reject($e); } catch (\Exception $e) { $promise->reject($e); } }); return $promise; } /** * Synchronously waits on a promise to resolve and returns an inspection * state array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the * array will contain a "value" key mapping to the fulfilled value of the * promise. If the promise is rejected, the array will contain a "reason" * key mapping to the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array */ public static function inspect(PromiseInterface $promise) { try { return ['state' => PromiseInterface::FULFILLED, 'value' => $promise->wait()]; } catch (RejectionException $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; } catch (\Throwable $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } catch (\Exception $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } } /** * Waits on all of the provided promises, but does not unwrap rejected * promises as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array */ public static function inspectAll($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = self::inspect($promise); } return $results; } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same * order the promises were provided). An exception is thrown if any of the * promises are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 */ public static function unwrap($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = $promise->wait(); } return $results; } /** * Given an array of promises, return a promise that is fulfilled when all * the items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface */ public static function all($promises, $recursive = \false) { $results = []; $promise = Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = $value; }, function ($reason, $idx, Promise $aggregate) { $aggregate->reject($reason); })->then(function () use(&$results) { \ksort($results); return $results; }); if (\true === $recursive) { $promise = $promise->then(function ($results) use($recursive, &$promises) { foreach ($promises as $promise) { if (Is::pending($promise)) { return self::all($promises, $recursive); } } return $results; }); } return $promise; } /** * Initiate a competitive race between multiple promises or values (values * will become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise * is fulfilled with an array that contains the fulfillment values of the * winners in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number * of fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function some($count, $promises) { $results = []; $rejections = []; return Each::of($promises, function ($value, $idx, PromiseInterface $p) use(&$results, $count) { if (Is::settled($p)) { return; } $results[$idx] = $value; if (\count($results) >= $count) { $p->resolve(null); } }, function ($reason) use(&$rejections) { $rejections[] = $reason; })->then(function () use(&$results, &$rejections, $count) { if (\count($results) !== $count) { throw new AggregateException('Not enough promises to fulfill count', $rejections); } \ksort($results); return \array_values($results); }); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function any($promises) { return self::some(1, $promises)->then(function ($values) { return $values[0]; }); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function settle($promises) { $results = []; return Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; }, function ($reason, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; })->then(function () use(&$results) { \ksort($results); return $results; }); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/functions.php000064400000023551147600374260023210 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface * * @deprecated queue will be removed in guzzlehttp/promises:2.0. Use Utils::queue instead. */ function queue(TaskQueueInterface $assign = null) { return Utils::queue($assign); } /** * Adds a function to run in the task queue when it is next `run()` and returns * a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface * * @deprecated task will be removed in guzzlehttp/promises:2.0. Use Utils::task instead. */ function task(callable $task) { return Utils::task($task); } /** * Creates a promise for a value if the value is not a promise. * * @param mixed $value Promise or value. * * @return PromiseInterface * * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. */ function promise_for($value) { return Create::promiseFor($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. If * the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface * * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. */ function rejection_for($reason) { return Create::rejectionFor($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable * * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. */ function exception_for($reason) { return Create::exceptionFor($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator * * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. */ function iter_for($value) { return Create::iterFor($value); } /** * Synchronously waits on a promise to resolve and returns an inspection state * array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the array * will contain a "value" key mapping to the fulfilled value of the promise. If * the promise is rejected, the array will contain a "reason" key mapping to * the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. */ function inspect(PromiseInterface $promise) { return Utils::inspect($promise); } /** * Waits on all of the provided promises, but does not unwrap rejected promises * as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. */ function inspect_all($promises) { return Utils::inspectAll($promises); } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same order * the promises were provided). An exception is thrown if any of the promises * are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 * * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. */ function unwrap($promises) { return Utils::unwrap($promises); } /** * Given an array of promises, return a promise that is fulfilled when all the * items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface * * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. */ function all($promises, $recursive = \false) { return Utils::all($promises, $recursive); } /** * Initiate a competitive race between multiple promises or values (values will * become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise is * fulfilled with an array that contains the fulfillment values of the winners * in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number of * fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. */ function some($count, $promises) { return Utils::some($count, $promises); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. */ function any($promises) { return Utils::any($promises); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. */ function settle($promises) { return Utils::settle($promises); } /** * Given an iterator that yields promises or values, returns a promise that is * fulfilled with a null value when the iterator has been consumed or the * aggregate promise has been fulfilled or rejected. * * $onFulfilled is a function that accepts the fulfilled value, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * $onRejected is a function that accepts the rejection reason, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * @param mixed $iterable Iterator or array to iterate over. * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. */ function each($iterable, callable $onFulfilled = null, callable $onRejected = null) { return Each::of($iterable, $onFulfilled, $onRejected); } /** * Like each, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow for * dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. */ function each_limit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); } /** * Like each_limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface * * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. */ function each_limit_all($iterable, $concurrency, callable $onFulfilled = null) { return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); } /** * Returns true if a promise is fulfilled. * * @return bool * * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. */ function is_fulfilled(PromiseInterface $promise) { return Is::fulfilled($promise); } /** * Returns true if a promise is rejected. * * @return bool * * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. */ function is_rejected(PromiseInterface $promise) { return Is::rejected($promise); } /** * Returns true if a promise is fulfilled or rejected. * * @return bool * * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. */ function is_settled(PromiseInterface $promise) { return Is::settled($promise); } /** * Create a new coroutine. * * @see Coroutine * * @return PromiseInterface * * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. */ function coroutine(callable $generatorFn) { return Coroutine::of($generatorFn); } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/Is.php000064400000001775147600374260021557 0ustar00getState() === PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled or rejected. * * @return bool */ public static function settled(PromiseInterface $promise) { return $promise->getState() !== PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled. * * @return bool */ public static function fulfilled(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::FULFILLED; } /** * Returns true if a promise is rejected. * * @return bool */ public static function rejected(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::REJECTED; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/RejectionException.php000064400000002255147600374260024777 0ustar00reason = $reason; $message = 'The promise was rejected'; if ($description) { $message .= ' with reason: ' . $description; } elseif (\is_string($reason) || \is_object($reason) && \method_exists($reason, '__toString')) { $message .= ' with reason: ' . $this->reason; } elseif ($reason instanceof \JsonSerializable) { $message .= ' with reason: ' . \json_encode($this->reason, \JSON_PRETTY_PRINT); } parent::__construct($message); } /** * Returns the rejection reason. * * @return mixed */ public function getReason() { return $this->reason; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/PromisorInterface.php000064400000000415147600374260024625 0ustar00run(); */ class TaskQueue implements TaskQueueInterface { private $enableShutdown = \true; private $queue = []; public function __construct($withShutdown = \true) { if ($withShutdown) { \register_shutdown_function(function () { if ($this->enableShutdown) { // Only run the tasks if an E_ERROR didn't occur. $err = \error_get_last(); if (!$err || $err['type'] ^ \E_ERROR) { $this->run(); } } }); } } public function isEmpty() { return !$this->queue; } public function add(callable $task) { $this->queue[] = $task; } public function run() { while ($task = \array_shift($this->queue)) { /** @var callable $task */ $task(); } } /** * The task queue will be run and exhausted by default when the process * exits IFF the exit is not the result of a PHP E_ERROR error. * * You can disable running the automatic shutdown of the queue by calling * this function. If you disable the task queue shutdown process, then you * MUST either run the task queue (as a result of running your event loop * or manually using the run() method) or wait on each outstanding promise. * * Note: This shutdown will occur before any destructors are triggered. */ public function disableShutdown() { $this->enableShutdown = \false; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/PromiseInterface.php000064400000005434147600374260024437 0ustar00then([$promise, 'resolve'], [$promise, 'reject']); return $promise; } return new FulfilledPromise($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. * If the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface */ public static function rejectionFor($reason) { if ($reason instanceof PromiseInterface) { return $reason; } return new RejectedPromise($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable */ public static function exceptionFor($reason) { if ($reason instanceof \Exception || $reason instanceof \Throwable) { return $reason; } return new RejectionException($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator */ public static function iterFor($value) { if ($value instanceof \Iterator) { return $value; } if (\is_array($value)) { return new \ArrayIterator($value); } return new \ArrayIterator([$value]); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/Each.php000064400000005163147600374260022037 0ustar00 $onFulfilled, 'rejected' => $onRejected]))->promise(); } /** * Like of, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow * for dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface */ public static function ofLimit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return (new EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency]))->promise(); } /** * Like limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface */ public static function ofLimitAll($iterable, $concurrency, callable $onFulfilled = null) { return self::ofLimit($iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate) { $aggregate->reject($reason); }); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/RejectedPromise.php000064400000004313147600374260024257 0ustar00reason = $reason; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // If there's no onRejected callback then just return self. if (!$onRejected) { return $this; } $queue = Utils::queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use($p, $reason, $onRejected) { if (Is::pending($p)) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); } catch (\Throwable $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } catch (\Exception $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { if ($unwrap) { throw Create::exceptionFor($this->reason); } return null; } public function getState() { return self::REJECTED; } public function resolve($value) { throw new \LogicException("Cannot resolve a rejected promise"); } public function reject($reason) { if ($reason !== $this->reason) { throw new \LogicException("Cannot reject a rejected promise"); } } public function cancel() { // pass } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/FulfilledPromise.php000064400000003647147600374260024451 0ustar00value = $value; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // Return itself if there is no onFulfilled function. if (!$onFulfilled) { return $this; } $queue = Utils::queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use($p, $value, $onFulfilled) { if (Is::pending($p)) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { $p->reject($e); } catch (\Exception $e) { $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { return $unwrap ? $this->value : null; } public function getState() { return self::FULFILLED; } public function resolve($value) { if ($value !== $this->value) { throw new \LogicException("Cannot resolve a fulfilled promise"); } } public function reject($reason) { throw new \LogicException("Cannot reject a fulfilled promise"); } public function cancel() { // pass } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/functions_include.php000064400000000352147600374260024705 0ustar00waitFn = $waitFn; $this->cancelFn = $cancelFn; } public function then(callable $onFulfilled = null, callable $onRejected = null) { if ($this->state === self::PENDING) { $p = new Promise(null, [$this, 'cancel']); $this->handlers[] = [$p, $onFulfilled, $onRejected]; $p->waitList = $this->waitList; $p->waitList[] = $this; return $p; } // Return a fulfilled promise and immediately invoke any callbacks. if ($this->state === self::FULFILLED) { $promise = Create::promiseFor($this->result); return $onFulfilled ? $promise->then($onFulfilled) : $promise; } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. $rejection = Create::rejectionFor($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true) { $this->waitIfPending(); if ($this->result instanceof PromiseInterface) { return $this->result->wait($unwrap); } if ($unwrap) { if ($this->state === self::FULFILLED) { return $this->result; } // It's rejected so "unwrap" and throw an exception. throw Create::exceptionFor($this->result); } } public function getState() { return $this->state; } public function cancel() { if ($this->state !== self::PENDING) { return; } $this->waitFn = $this->waitList = null; if ($this->cancelFn) { $fn = $this->cancelFn; $this->cancelFn = null; try { $fn(); } catch (\Throwable $e) { $this->reject($e); } catch (\Exception $e) { $this->reject($e); } } // Reject the promise only if it wasn't rejected in a then callback. /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject(new CancellationException('Promise has been cancelled')); } } public function resolve($value) { $this->settle(self::FULFILLED, $value); } public function reject($reason) { $this->settle(self::REJECTED, $reason); } private function settle($state, $value) { if ($this->state !== self::PENDING) { // Ignore calls with the same resolution. if ($state === $this->state && $value === $this->result) { return; } throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); } if ($value === $this) { throw new \LogicException('Cannot fulfill or reject a promise with itself'); } // Clear out the state of the promise but stash the handlers. $this->state = $state; $this->result = $value; $handlers = $this->handlers; $this->handlers = null; $this->waitList = $this->waitFn = null; $this->cancelFn = null; if (!$handlers) { return; } // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. if (!\is_object($value) || !\method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. Utils::queue()->add(static function () use($id, $value, $handlers) { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); } elseif ($value instanceof Promise && Is::pending($value)) { // We can just merge our handlers onto the next promise. $value->handlers = \array_merge($value->handlers, $handlers); } else { // Resolve the handlers when the forwarded promise is resolved. $value->then(static function ($value) use($handlers) { foreach ($handlers as $handler) { self::callHandler(1, $value, $handler); } }, static function ($reason) use($handlers) { foreach ($handlers as $handler) { self::callHandler(2, $reason, $handler); } }); } } /** * Call a stack of handlers using a specific callback index and value. * * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). */ private static function callHandler($index, $value, array $handler) { /** @var PromiseInterface $promise */ $promise = $handler[0]; // The promise may have been cancelled or resolved before placing // this thunk in the queue. if (Is::settled($promise)) { return; } try { if (isset($handler[$index])) { /* * If $f throws an exception, then $handler will be in the exception * stack trace. Since $handler contains a reference to the callable * itself we get a circular reference. We clear the $handler * here to avoid that memory leak. */ $f = $handler[$index]; unset($handler); $promise->resolve($f($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); } else { // Forward rejections down the chain. $promise->reject($value); } } catch (\Throwable $reason) { $promise->reject($reason); } catch (\Exception $reason) { $promise->reject($reason); } } private function waitIfPending() { if ($this->state !== self::PENDING) { return; } elseif ($this->waitFn) { $this->invokeWaitFn(); } elseif ($this->waitList) { $this->invokeWaitList(); } else { // If there's no wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); } Utils::queue()->run(); /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } } private function invokeWaitFn() { try { $wfn = $this->waitFn; $this->waitFn = null; $wfn(\true); } catch (\Exception $reason) { if ($this->state === self::PENDING) { // The promise has not been resolved yet, so reject the promise // with the exception. $this->reject($reason); } else { // The promise was already resolved, so there's a problem in // the application. throw $reason; } } } private function invokeWaitList() { $waitList = $this->waitList; $this->waitList = null; foreach ($waitList as $result) { do { $result->waitIfPending(); $result = $result->result; } while ($result instanceof Promise); if ($result instanceof PromiseInterface) { $result->wait(\false); } } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/CancellationException.php000064400000000320147600374260025440 0ustar00then(function ($v) { echo $v; }); * * @param callable $generatorFn Generator function to wrap into a promise. * * @return Promise * * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration */ final class Coroutine implements PromiseInterface { /** * @var PromiseInterface|null */ private $currentPromise; /** * @var Generator */ private $generator; /** * @var Promise */ private $result; public function __construct(callable $generatorFn) { $this->generator = $generatorFn(); $this->result = new Promise(function () { while (isset($this->currentPromise)) { $this->currentPromise->wait(); } }); try { $this->nextCoroutine($this->generator->current()); } catch (\Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * Create a new coroutine. * * @return self */ public static function of(callable $generatorFn) { return new self($generatorFn); } public function then(callable $onFulfilled = null, callable $onRejected = null) { return $this->result->then($onFulfilled, $onRejected); } public function otherwise(callable $onRejected) { return $this->result->otherwise($onRejected); } public function wait($unwrap = \true) { return $this->result->wait($unwrap); } public function getState() { return $this->result->getState(); } public function resolve($value) { $this->result->resolve($value); } public function reject($reason) { $this->result->reject($reason); } public function cancel() { $this->currentPromise->cancel(); $this->result->cancel(); } private function nextCoroutine($yielded) { $this->currentPromise = Create::promiseFor($yielded)->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } /** * @internal */ public function _handleSuccess($value) { unset($this->currentPromise); try { $next = $this->generator->send($value); if ($this->generator->valid()) { $this->nextCoroutine($next); } else { $this->result->resolve($value); } } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * @internal */ public function _handleFailure($reason) { unset($this->currentPromise); try { $nextYield = $this->generator->throw(Create::exceptionFor($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/promises/src/EachPromise.php000064400000016447147600374260023405 0ustar00iterable = Create::iterFor($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; } if (isset($config['fulfilled'])) { $this->onFulfilled = $config['fulfilled']; } if (isset($config['rejected'])) { $this->onRejected = $config['rejected']; } } /** @psalm-suppress InvalidNullableReturnType */ public function promise() { if ($this->aggregate) { return $this->aggregate; } try { $this->createPromise(); /** @psalm-assert Promise $this->aggregate */ $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { $this->aggregate->reject($e); } catch (\Exception $e) { $this->aggregate->reject($e); } /** * @psalm-suppress NullableReturnStatement * @phpstan-ignore-next-line */ return $this->aggregate; } private function createPromise() { $this->mutex = \false; $this->aggregate = new Promise(function () { if ($this->checkIfFinished()) { return; } \reset($this->pending); // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = \current($this->pending)) { \next($this->pending); $promise->wait(); if (Is::settled($this->aggregate)) { return; } } }); // Clear the references when the promise is resolved. $clearFn = function () { $this->iterable = $this->concurrency = $this->pending = null; $this->onFulfilled = $this->onRejected = null; $this->nextPendingIndex = 0; }; $this->aggregate->then($clearFn, $clearFn); } private function refillPending() { if (!$this->concurrency) { // Add all pending promises. while ($this->addPending() && $this->advanceIterator()) { } return; } // Add only up to N pending promises. $concurrency = \is_callable($this->concurrency) ? \call_user_func($this->concurrency, \count($this->pending)) : $this->concurrency; $concurrency = \max($concurrency - \count($this->pending), 0); // Concurrency may be set to 0 to disallow new promises. if (!$concurrency) { return; } // Add the first pending promise. $this->addPending(); // Note this is special handling for concurrency=1 so that we do // not advance the iterator after adding the first promise. This // helps work around issues with generators that might not have the // next value to yield until promise callbacks are called. while (--$concurrency && $this->advanceIterator() && $this->addPending()) { } } private function addPending() { if (!$this->iterable || !$this->iterable->valid()) { return \false; } $promise = Create::promiseFor($this->iterable->current()); $key = $this->iterable->key(); // Iterable keys may not be unique, so we use a counter to // guarantee uniqueness $idx = $this->nextPendingIndex++; $this->pending[$idx] = $promise->then(function ($value) use($idx, $key) { if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value, $key, $this->aggregate); } $this->step($idx); }, function ($reason) use($idx, $key) { if ($this->onRejected) { \call_user_func($this->onRejected, $reason, $key, $this->aggregate); } $this->step($idx); }); return \true; } private function advanceIterator() { // Place a lock on the iterator so that we ensure to not recurse, // preventing fatal generator errors. if ($this->mutex) { return \false; } $this->mutex = \true; try { $this->iterable->next(); $this->mutex = \false; return \true; } catch (\Throwable $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } catch (\Exception $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } } private function step($idx) { // If the promise was already resolved, then ignore this step. if (Is::settled($this->aggregate)) { return; } unset($this->pending[$idx]); // Only refill pending promises if we are not locked, preventing the // EachPromise to recursively invoke the provided iterator, which // cause a fatal error: "Cannot resume an already running generator" if ($this->advanceIterator() && !$this->checkIfFinished()) { // Add more pending promises if possible. $this->refillPending(); } } private function checkIfFinished() { if (!$this->pending && !$this->iterable->valid()) { // Resolve the promise if there's nothing left to do. $this->aggregate->resolve(null); return \true; } return \false; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Stream.php000064400000015235147600374260021465 0ustar00size = $options['size']; } $this->customMetadata = isset($options['metadata']) ? $options['metadata'] : []; $this->stream = $stream; $meta = \stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } /** * Closes the stream when the destructed */ public function __destruct() { $this->close(); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { return ''; } } public function getContents() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $contents = \stream_get_contents($this->stream); if ($contents === \false) { throw new \RuntimeException('Unable to read stream contents'); } return $contents; } public function close() { if (isset($this->stream)) { if (\is_resource($this->stream)) { \fclose($this->stream); } $this->detach(); } } public function detach() { if (!isset($this->stream)) { return null; } $result = $this->stream; unset($this->stream); $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = \false; return $result; } public function getSize() { if ($this->size !== null) { return $this->size; } if (!isset($this->stream)) { return null; } // Clear the stat cache if the stream has a URI if ($this->uri) { \clearstatcache(\true, $this->uri); } $stats = \fstat($this->stream); if (isset($stats['size'])) { $this->size = $stats['size']; return $this->size; } return null; } public function isReadable() { return $this->readable; } public function isWritable() { return $this->writable; } public function isSeekable() { return $this->seekable; } public function eof() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } return \feof($this->stream); } public function tell() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $result = \ftell($this->stream); if ($result === \false) { throw new \RuntimeException('Unable to determine stream position'); } return $result; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $whence = (int) $whence; if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); } if (\fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); } } public function read($length) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } if ($length < 0) { throw new \RuntimeException('Length parameter cannot be negative'); } if (0 === $length) { return ''; } $string = \fread($this->stream, $length); if (\false === $string) { throw new \RuntimeException('Unable to read from stream'); } return $string; } public function write($string) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } // We can't know the size after writing anything $this->size = null; $result = \fwrite($this->stream, $string); if ($result === \false) { throw new \RuntimeException('Unable to write to stream'); } return $result; } public function getMetadata($key = null) { if (!isset($this->stream)) { return $key ? null : []; } elseif (!$key) { return $this->customMetadata + \stream_get_meta_data($this->stream); } elseif (isset($this->customMetadata[$key])) { return $this->customMetadata[$key]; } $meta = \stream_get_meta_data($this->stream); return isset($meta[$key]) ? $meta[$key] : null; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/LazyOpenStream.php000064400000001643147600374260023145 0ustar00filename = $filename; $this->mode = $mode; } /** * Creates the underlying stream lazily when required. * * @return StreamInterface */ protected function createStream() { return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Utils.php000064400000033746147600374260021341 0ustar00 $keys * * @return array */ public static function caselessRemove($keys, array $data) { $result = []; foreach ($keys as &$key) { $key = \strtolower($key); } foreach ($data as $k => $v) { if (!\in_array(\strtolower($k), $keys)) { $result[$k] = $v; } } return $result; } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ public static function copyToStream(StreamInterface $source, StreamInterface $dest, $maxLen = -1) { $bufferSize = 8192; if ($maxLen === -1) { while (!$source->eof()) { if (!$dest->write($source->read($bufferSize))) { break; } } } else { $remaining = $maxLen; while ($remaining > 0 && !$source->eof()) { $buf = $source->read(\min($bufferSize, $remaining)); $len = \strlen($buf); if (!$len) { break; } $remaining -= $len; $dest->write($buf); } } } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @return string * * @throws \RuntimeException on error. */ public static function copyToString(StreamInterface $stream, $maxLen = -1) { $buffer = ''; if ($maxLen === -1) { while (!$stream->eof()) { $buf = $stream->read(1048576); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; } return $buffer; } $len = 0; while (!$stream->eof() && $len < $maxLen) { $buf = $stream->read($maxLen - $len); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; $len = \strlen($buffer); } return $buffer; } /** * Calculate a hash of a stream. * * This method reads the entire stream to calculate a rolling hash, based * on PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream * * @throws \RuntimeException on error. */ public static function hash(StreamInterface $stream, $algo, $rawOutput = \false) { $pos = $stream->tell(); if ($pos > 0) { $stream->rewind(); } $ctx = \hash_init($algo); while (!$stream->eof()) { \hash_update($ctx, $stream->read(1048576)); } $out = \hash_final($ctx, (bool) $rawOutput); $stream->seek($pos); return $out; } /** * Clone and modify a request with the given changes. * * This method is useful for reducing the number of clones needed to mutate * a message. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. * * @return RequestInterface */ public static function modifyRequest(RequestInterface $request, array $changes) { if (!$changes) { return $request; } $headers = $request->getHeaders(); if (!isset($changes['uri'])) { $uri = $request->getUri(); } else { // Remove the host header if one is on the URI if ($host = $changes['uri']->getHost()) { $changes['set_headers']['Host'] = $host; if ($port = $changes['uri']->getPort()) { $standardPorts = ['http' => 80, 'https' => 443]; $scheme = $changes['uri']->getScheme(); if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { $changes['set_headers']['Host'] .= ':' . $port; } } } $uri = $changes['uri']; } if (!empty($changes['remove_headers'])) { $headers = self::caselessRemove($changes['remove_headers'], $headers); } if (!empty($changes['set_headers'])) { $headers = self::caselessRemove(\array_keys($changes['set_headers']), $headers); $headers = $changes['set_headers'] + $headers; } if (isset($changes['query'])) { $uri = $uri->withQuery($changes['query']); } if ($request instanceof ServerRequestInterface) { $new = (new ServerRequest(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion(), $request->getServerParams()))->withParsedBody($request->getParsedBody())->withQueryParams($request->getQueryParams())->withCookieParams($request->getCookieParams())->withUploadedFiles($request->getUploadedFiles()); foreach ($request->getAttributes() as $key => $value) { $new = $new->withAttribute($key, $value); } return $new; } return new Request(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion()); } /** * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from * @param int|null $maxLength Maximum buffer length * * @return string */ public static function readLine(StreamInterface $stream, $maxLength = null) { $buffer = ''; $size = 0; while (!$stream->eof()) { // Using a loose equality here to match on '' and false. if (null == ($byte = $stream->read(1))) { return $buffer; } $buffer .= $byte; // Break when a new line is found or the max length - 1 is reached if ($byte === "\n" || ++$size === $maxLength - 1) { break; } } return $buffer; } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * This method accepts the following `$resource` types: * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. * - `string`: Creates a stream object that uses the given string as the contents. * - `resource`: Creates a stream object that wraps the given PHP stream resource. * - `Iterator`: If the provided value implements `Iterator`, then a read-only * stream object will be created that wraps the given iterable. Each time the * stream is read from, data from the iterator will fill a buffer and will be * continuously called until the buffer is equal to the requested read size. * Subsequent read calls will first read from the buffer and then call `next` * on the underlying iterator until it is exhausted. * - `object` with `__toString()`: If the object has the `__toString()` method, * the object will be cast to a string and then a stream will be returned that * uses the string value. * - `NULL`: When `null` is passed, an empty stream object is returned. * - `callable` When a callable is passed, a read-only stream object will be * created that invokes the given callable. The callable is invoked with the * number of suggested bytes to read. The callable can return any number of * bytes, but MUST return `false` when there is no more data to return. The * stream object that wraps the callable will invoke the callable until the * number of requested bytes are available. Any additional bytes will be * buffered and used in subsequent reads. * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array $options Additional options * * @return StreamInterface * * @throws \InvalidArgumentException if the $resource arg is not valid. */ public static function streamFor($resource = '', array $options = []) { if (\is_scalar($resource)) { $stream = self::tryFopen('php://temp', 'r+'); if ($resource !== '') { \fwrite($stream, $resource); \fseek($stream, 0); } return new Stream($stream, $options); } switch (\gettype($resource)) { case 'resource': /* * The 'php://input' is a special stream with quirks and inconsistencies. * We avoid using that stream by reading it into php://temp */ $metaData = \stream_get_meta_data($resource); if (isset($metaData['uri']) && $metaData['uri'] === 'php://input') { $stream = self::tryFopen('php://temp', 'w+'); \fwrite($stream, \stream_get_contents($resource)); \fseek($stream, 0); $resource = $stream; } return new Stream($resource, $options); case 'object': if ($resource instanceof StreamInterface) { return $resource; } elseif ($resource instanceof \Iterator) { return new PumpStream(function () use($resource) { if (!$resource->valid()) { return \false; } $result = $resource->current(); $resource->next(); return $result; }, $options); } elseif (\method_exists($resource, '__toString')) { return Utils::streamFor((string) $resource, $options); } break; case 'NULL': return new Stream(self::tryFopen('php://temp', 'r+'), $options); } if (\is_callable($resource)) { return new PumpStream($resource, $options); } throw new \InvalidArgumentException('Invalid resource type: ' . \gettype($resource)); } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param $filename File to open * @param $mode Mode used to open the file * * @return resource * * @throws \RuntimeException if the file cannot be opened */ public static function tryFopen($filename, $mode) { $ex = null; \set_error_handler(function () use($filename, $mode, &$ex) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, \func_get_args()[1])); return \true; }); try { $handle = \fopen($filename, $mode); } catch (\Throwable $e) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage()), 0, $e); } \restore_error_handler(); if ($ex) { /** @var $ex \RuntimeException */ throw $ex; } return $handle; } /** * Returns a UriInterface for the given value. * * This function accepts a string or UriInterface and returns a * UriInterface for the given value. If the value is already a * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface * * @throws \InvalidArgumentException */ public static function uriFor($uri) { if ($uri instanceof UriInterface) { return $uri; } if (\is_string($uri)) { return new Uri($uri); } throw new \InvalidArgumentException('URI must be a string or UriInterface'); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Response.php000064400000010407147600374260022024 0ustar00 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required']; /** @var string */ private $reasonPhrase = ''; /** @var int */ private $statusCode = 200; /** * @param int $status Status code * @param array $headers Response headers * @param string|resource|StreamInterface|null $body Response body * @param string $version Protocol version * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { $this->assertStatusCodeIsInteger($status); $status = (int) $status; $this->assertStatusCodeRange($status); $this->statusCode = $status; if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } $this->setHeaders($headers); if ($reason == '' && isset(self::$phrases[$this->statusCode])) { $this->reasonPhrase = self::$phrases[$this->statusCode]; } else { $this->reasonPhrase = (string) $reason; } $this->protocol = $version; } public function getStatusCode() { return $this->statusCode; } public function getReasonPhrase() { return $this->reasonPhrase; } public function withStatus($code, $reasonPhrase = '') { $this->assertStatusCodeIsInteger($code); $code = (int) $code; $this->assertStatusCodeRange($code); $new = clone $this; $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { $reasonPhrase = self::$phrases[$new->statusCode]; } $new->reasonPhrase = (string) $reasonPhrase; return $new; } private function assertStatusCodeIsInteger($statusCode) { if (\filter_var($statusCode, \FILTER_VALIDATE_INT) === \false) { throw new \InvalidArgumentException('Status code must be an integer value.'); } } private function assertStatusCodeRange($statusCode) { if ($statusCode < 100 || $statusCode >= 600) { throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Rfc7230.php000064400000001301147600374260021245 0ustar00@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/functions.php000064400000032225147600374260022240 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|$urlEncoding How the query string is encoded * * @return array * * @deprecated parse_query will be removed in guzzlehttp/psr7:2.0. Use Query::parse instead. */ function parse_query($str, $urlEncoding = \true) { return Query::parse($str, $urlEncoding); } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse_query()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string * * @deprecated build_query will be removed in guzzlehttp/psr7:2.0. Use Query::build instead. */ function build_query(array $params, $encoding = \PHP_QUERY_RFC3986) { return Query::build($params, $encoding); } /** * Determines the mimetype of a file by looking at its extension. * * @param $filename * * @return string|null * * @deprecated mimetype_from_filename will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromFilename instead. */ function mimetype_from_filename($filename) { return MimeType::fromFilename($filename); } /** * Maps a file extensions to a mimetype. * * @param $extension string The file extension. * * @return string|null * * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types * @deprecated mimetype_from_extension will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromExtension instead. */ function mimetype_from_extension($extension) { return MimeType::fromExtension($extension); } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param $message HTTP request or response to parse. * * @return array * * @internal * * @deprecated _parse_message will be removed in guzzlehttp/psr7:2.0. Use Message::parseMessage instead. */ function _parse_message($message) { return Message::parseMessage($message); } /** * Constructs a URI for an HTTP request message. * * @param $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string * * @internal * * @deprecated _parse_request_uri will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequestUri instead. */ function _parse_request_uri($path, array $headers) { return Message::parseRequestUri($path, $headers); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null * * @deprecated get_message_body_summary will be removed in guzzlehttp/psr7:2.0. Use Message::bodySummary instead. */ function get_message_body_summary(MessageInterface $message, $truncateAt = 120) { return Message::bodySummary($message, $truncateAt); } /** * Remove the items given by the keys, case insensitively from the data. * * @param iterable $keys * * @return array * * @internal * * @deprecated _caseless_remove will be removed in guzzlehttp/psr7:2.0. Use Utils::caselessRemove instead. */ function _caseless_remove($keys, array $data) { return Utils::caselessRemove($keys, $data); } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/PumpStream.php000064400000010025147600374260022317 0ustar00source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return Utils::copyToString($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = \false; $this->source = null; return null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return \false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return \true; } public function read($length) { $data = $this->buffer->read($length); $readLen = \strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += \strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = \call_user_func($this->source, $length); if ($data === \false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= \strlen($data); } while ($length > 0); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/FnStream.php000064400000007610147600374260021747 0ustar00methods = $methods; // Create the functions on the class foreach ($methods as $name => $fn) { $this->{'_fn_' . $name} = $fn; } } /** * Lazily determine which methods are not implemented. * * @throws \BadMethodCallException */ public function __get($name) { throw new \BadMethodCallException(\str_replace('_fn_', '', $name) . '() is not implemented in the FnStream'); } /** * The close method is called on the underlying stream only if possible. */ public function __destruct() { if (isset($this->_fn_close)) { \call_user_func($this->_fn_close); } } /** * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. * * @throws \LogicException */ public function __wakeup() { throw new \LogicException('FnStream should never be unserialized'); } /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. * * @param StreamInterface $stream Stream to decorate * @param array $methods Hash of method name to a closure * * @return FnStream */ public static function decorate(StreamInterface $stream, array $methods) { // If any of the required methods were not provided, then simply // proxy to the decorated stream. foreach (\array_diff(self::$slots, \array_keys($methods)) as $diff) { $methods[$diff] = [$stream, $diff]; } return new self($methods); } public function __toString() { return \call_user_func($this->_fn___toString); } public function close() { return \call_user_func($this->_fn_close); } public function detach() { return \call_user_func($this->_fn_detach); } public function getSize() { return \call_user_func($this->_fn_getSize); } public function tell() { return \call_user_func($this->_fn_tell); } public function eof() { return \call_user_func($this->_fn_eof); } public function isSeekable() { return \call_user_func($this->_fn_isSeekable); } public function rewind() { \call_user_func($this->_fn_rewind); } public function seek($offset, $whence = \SEEK_SET) { \call_user_func($this->_fn_seek, $offset, $whence); } public function isWritable() { return \call_user_func($this->_fn_isWritable); } public function write($string) { return \call_user_func($this->_fn_write, $string); } public function isReadable() { return \call_user_func($this->_fn_isReadable); } public function read($length) { return \call_user_func($this->_fn_read, $length); } public function getContents() { return \call_user_func($this->_fn_getContents); } public function getMetadata($key = null) { return \call_user_func($this->_fn_getMetadata, $key); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Uri.php000064400000053041147600374260020766 0ustar00 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389]; private static $charUnreserved = 'a-zA-Z0-9_\\-\\.~'; private static $charSubDelims = '!\\$&\'\\(\\)\\*\\+,;='; private static $replaceQuery = ['=' => '%3D', '&' => '%26']; /** @var string Uri scheme. */ private $scheme = ''; /** @var string Uri user info. */ private $userInfo = ''; /** @var string Uri host. */ private $host = ''; /** @var int|null Uri port. */ private $port; /** @var string Uri path. */ private $path = ''; /** @var string Uri query string. */ private $query = ''; /** @var string Uri fragment. */ private $fragment = ''; /** * @param $uri URI to parse */ public function __construct($uri = '') { // weak type check to also accept null until we can add scalar type hints if ($uri != '') { $parts = self::parse($uri); if ($parts === \false) { throw new \InvalidArgumentException("Unable to parse URI: {$uri}"); } $this->applyParts($parts); } } /** * UTF-8 aware \parse_url() replacement. * * The internal function produces broken output for non ASCII domain names * (IDN) when used with locales other than "C". * * On the other hand, cURL understands IDN correctly only when UTF-8 locale * is configured ("C.UTF-8", "en_US.UTF-8", etc.). * * @see https://bugs.php.net/bug.php?id=52923 * @see https://www.php.net/manual/en/function.parse-url.php#114817 * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING * * @param $url * * @return array|false */ private static function parse($url) { // If IPv6 $prefix = ''; if (\preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) { $prefix = $matches[1]; $url = $matches[2]; } $encodedUrl = \preg_replace_callback('%[^:/@?&=#]+%usD', static function ($matches) { return \urlencode($matches[0]); }, $url); $result = \parse_url($prefix . $encodedUrl); if ($result === \false) { return \false; } return \array_map('urldecode', $result); } public function __toString() { return self::composeComponents($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); } /** * Composes a URI reference string from its various components. * * Usually this method does not need to be called manually but instead is used indirectly via * `Psr\Http\Message\UriInterface::__toString`. * * PSR-7 UriInterface treats an empty component the same as a missing component as * getQuery(), getFragment() etc. always return a string. This explains the slight * difference to RFC 3986 Section 5.3. * * Another adjustment is that the authority separator is added even when the authority is missing/empty * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to * that format). * * @param $scheme * @param $authority * @param $path * @param $query * @param $fragment * * @return string * * @link https://tools.ietf.org/html/rfc3986#section-5.3 */ public static function composeComponents($scheme, $authority, $path, $query, $fragment) { $uri = ''; // weak type checks to also accept null until we can add scalar type hints if ($scheme != '') { $uri .= $scheme . ':'; } if ($authority != '' || $scheme === 'file') { $uri .= '//' . $authority; } $uri .= $path; if ($query != '') { $uri .= '?' . $query; } if ($fragment != '') { $uri .= '#' . $fragment; } return $uri; } /** * Whether the URI has the default port of the current scheme. * * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used * independently of the implementation. * * @param UriInterface $uri * * @return bool */ public static function isDefaultPort(UriInterface $uri) { return $uri->getPort() === null || isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]; } /** * Whether the URI is absolute, i.e. it has a scheme. * * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative * to another URI, the base URI. Relative references can be divided into several forms: * - network-path references, e.g. '//example.com/path' * - absolute-path references, e.g. '/path' * - relative-path references, e.g. 'subpath' * * @param UriInterface $uri * * @return bool * * @see Uri::isNetworkPathReference * @see Uri::isAbsolutePathReference * @see Uri::isRelativePathReference * @link https://tools.ietf.org/html/rfc3986#section-4 */ public static function isAbsolute(UriInterface $uri) { return $uri->getScheme() !== ''; } /** * Whether the URI is a network-path reference. * * A relative reference that begins with two slash characters is termed an network-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isNetworkPathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() !== ''; } /** * Whether the URI is a absolute-path reference. * * A relative reference that begins with a single slash character is termed an absolute-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isAbsolutePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; } /** * Whether the URI is a relative-path reference. * * A relative reference that does not begin with a slash character is termed a relative-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isRelativePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); } /** * Whether the URI is a same-document reference. * * A same-document reference refers to a URI that is, aside from its fragment * component, identical to the base URI. When no base URI is given, only an empty * URI reference (apart from its fragment) is considered a same-document reference. * * @param UriInterface $uri The URI to check * @param UriInterface|null $base An optional base URI to compare against * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.4 */ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) { if ($base !== null) { $uri = UriResolver::resolve($base, $uri); return $uri->getScheme() === $base->getScheme() && $uri->getAuthority() === $base->getAuthority() && $uri->getPath() === $base->getPath() && $uri->getQuery() === $base->getQuery(); } return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; } /** * Removes dot segments from a path and returns the new path. * * @param $path * * @return string * * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. * @see UriResolver::removeDotSegments */ public static function removeDotSegments($path) { return UriResolver::removeDotSegments($path); } /** * Converts the relative URI into a new URI that is resolved against the base URI. * * @param UriInterface $base Base URI * @param string|UriInterface $rel Relative URI * * @return UriInterface * * @deprecated since version 1.4. Use UriResolver::resolve instead. * @see UriResolver::resolve */ public static function resolve(UriInterface $base, $rel) { if (!$rel instanceof UriInterface) { $rel = new self($rel); } return UriResolver::resolve($base, $rel); } /** * Creates a new URI with a specific query string value removed. * * Any existing query string values that exactly match the provided key are * removed. * * @param UriInterface $uri URI to use as a base. * @param string $key Query string key to remove. * * @return UriInterface */ public static function withoutQueryValue(UriInterface $uri, $key) { $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with a specific query string value. * * Any existing query string values that exactly match the provided key are * removed and replaced with the given key value pair. * * A value of null will set the query string key without a value, e.g. "key" * instead of "key=value". * * @param UriInterface $uri URI to use as a base. * @param string $key Key to set. * @param string|null $value Value to set * * @return UriInterface */ public static function withQueryValue(UriInterface $uri, $key, $value) { $result = self::getFilteredQueryString($uri, [$key]); $result[] = self::generateQueryString($key, $value); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with multiple specific query string values. * * It has the same behavior as withQueryValue() but for an associative array of key => value. * * @param UriInterface $uri URI to use as a base. * @param array $keyValueArray Associative array of key and values * * @return UriInterface */ public static function withQueryValues(UriInterface $uri, array $keyValueArray) { $result = self::getFilteredQueryString($uri, \array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(\implode('&', $result)); } /** * Creates a URI from a hash of `parse_url` components. * * @param array $parts * * @return UriInterface * * @link http://php.net/manual/en/function.parse-url.php * * @throws \InvalidArgumentException If the components do not form a valid URI. */ public static function fromParts(array $parts) { $uri = new self(); $uri->applyParts($parts); $uri->validateState(); return $uri; } public function getScheme() { return $this->scheme; } public function getAuthority() { $authority = $this->host; if ($this->userInfo !== '') { $authority = $this->userInfo . '@' . $authority; } if ($this->port !== null) { $authority .= ':' . $this->port; } return $authority; } public function getUserInfo() { return $this->userInfo; } public function getHost() { return $this->host; } public function getPort() { return $this->port; } public function getPath() { return $this->path; } public function getQuery() { return $this->query; } public function getFragment() { return $this->fragment; } public function withScheme($scheme) { $scheme = $this->filterScheme($scheme); if ($this->scheme === $scheme) { return $this; } $new = clone $this; $new->scheme = $scheme; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withUserInfo($user, $password = null) { $info = $this->filterUserInfoComponent($user); if ($password !== null) { $info .= ':' . $this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { return $this; } $new = clone $this; $new->userInfo = $info; $new->validateState(); return $new; } public function withHost($host) { $host = $this->filterHost($host); if ($this->host === $host) { return $this; } $new = clone $this; $new->host = $host; $new->validateState(); return $new; } public function withPort($port) { $port = $this->filterPort($port); if ($this->port === $port) { return $this; } $new = clone $this; $new->port = $port; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withPath($path) { $path = $this->filterPath($path); if ($this->path === $path) { return $this; } $new = clone $this; $new->path = $path; $new->validateState(); return $new; } public function withQuery($query) { $query = $this->filterQueryAndFragment($query); if ($this->query === $query) { return $this; } $new = clone $this; $new->query = $query; return $new; } public function withFragment($fragment) { $fragment = $this->filterQueryAndFragment($fragment); if ($this->fragment === $fragment) { return $this; } $new = clone $this; $new->fragment = $fragment; return $new; } /** * Apply parse_url parts to a URI. * * @param array $parts Array of parse_url parts to apply. */ private function applyParts(array $parts) { $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); } /** * @param $scheme * * @return string * * @throws \InvalidArgumentException If the scheme is invalid. */ private function filterScheme($scheme) { if (!\is_string($scheme)) { throw new \InvalidArgumentException('Scheme must be a string'); } return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param $component * * @return string * * @throws \InvalidArgumentException If the user info is invalid. */ private function filterUserInfoComponent($component) { if (!\is_string($component)) { throw new \InvalidArgumentException('User info must be a string'); } return \preg_replace_callback('/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component); } /** * @param $host * * @return string * * @throws \InvalidArgumentException If the host is invalid. */ private function filterHost($host) { if (!\is_string($host)) { throw new \InvalidArgumentException('Host must be a string'); } return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param int|null $port * * @return int|null * * @throws \InvalidArgumentException If the port is invalid. */ private function filterPort($port) { if ($port === null) { return null; } $port = (int) $port; if (0 > $port || 0xffff < $port) { throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); } return $port; } /** * @param UriInterface $uri * @param array $keys * * @return array */ private static function getFilteredQueryString(UriInterface $uri, array $keys) { $current = $uri->getQuery(); if ($current === '') { return []; } $decodedKeys = \array_map('rawurldecode', $keys); return \array_filter(\explode('&', $current), function ($part) use($decodedKeys) { return !\in_array(\rawurldecode(\explode('=', $part)[0]), $decodedKeys, \true); }); } /** * @param string $key * @param string|null $value * * @return string */ private static function generateQueryString($key, $value) { // Query string separators ("=", "&") within the key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = \strtr($key, self::$replaceQuery); if ($value !== null) { $queryString .= '=' . \strtr($value, self::$replaceQuery); } return $queryString; } private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { $this->port = null; } } /** * Filters the path of a URI * * @param $path * * @return string * * @throws \InvalidArgumentException If the path is invalid. */ private function filterPath($path) { if (!\is_string($path)) { throw new \InvalidArgumentException('Path must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path); } /** * Filters the query string or fragment of a URI. * * @param $str * * @return string * * @throws \InvalidArgumentException If the query or fragment is invalid. */ private function filterQueryAndFragment($str) { if (!\is_string($str)) { throw new \InvalidArgumentException('Query and fragment must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str); } private function rawurlencodeMatchZero(array $match) { return \rawurlencode($match[0]); } private function validateState() { if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { $this->host = self::HTTP_DEFAULT_HOST; } if ($this->getAuthority() === '') { if (0 === \strpos($this->path, '//')) { throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); } if ($this->scheme === '' && \false !== \strpos(\explode('/', $this->path, 2)[0], ':')) { throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); } } elseif (isset($this->path[0]) && $this->path[0] !== '/') { @\trigger_error('The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', \E_USER_DEPRECATED); $this->path = '/' . $this->path; //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/UploadedFile.php000064400000016342147600374260022567 0ustar00setError($errorStatus); $this->setSize($size); $this->setClientFilename($clientFilename); $this->setClientMediaType($clientMediaType); if ($this->isOk()) { $this->setStreamOrFile($streamOrFile); } } /** * Depending on the value set file or stream variable * * @param mixed $streamOrFile * * @throws InvalidArgumentException */ private function setStreamOrFile($streamOrFile) { if (\is_string($streamOrFile)) { $this->file = $streamOrFile; } elseif (\is_resource($streamOrFile)) { $this->stream = new Stream($streamOrFile); } elseif ($streamOrFile instanceof StreamInterface) { $this->stream = $streamOrFile; } else { throw new InvalidArgumentException('Invalid stream or file provided for UploadedFile'); } } /** * @param $error * * @throws InvalidArgumentException */ private function setError($error) { if (\false === \is_int($error)) { throw new InvalidArgumentException('Upload file error status must be an integer'); } if (\false === \in_array($error, UploadedFile::$errors)) { throw new InvalidArgumentException('Invalid error status for UploadedFile'); } $this->error = $error; } /** * @param $size * * @throws InvalidArgumentException */ private function setSize($size) { if (\false === \is_int($size)) { throw new InvalidArgumentException('Upload file size must be an integer'); } $this->size = $size; } /** * @param mixed $param * * @return bool */ private function isStringOrNull($param) { return \in_array(\gettype($param), ['string', 'NULL']); } /** * @param mixed $param * * @return bool */ private function isStringNotEmpty($param) { return \is_string($param) && \false === empty($param); } /** * @param string|null $clientFilename * * @throws InvalidArgumentException */ private function setClientFilename($clientFilename) { if (\false === $this->isStringOrNull($clientFilename)) { throw new InvalidArgumentException('Upload file client filename must be a string or null'); } $this->clientFilename = $clientFilename; } /** * @param string|null $clientMediaType * * @throws InvalidArgumentException */ private function setClientMediaType($clientMediaType) { if (\false === $this->isStringOrNull($clientMediaType)) { throw new InvalidArgumentException('Upload file client media type must be a string or null'); } $this->clientMediaType = $clientMediaType; } /** * Return true if there is no upload error * * @return bool */ private function isOk() { return $this->error === \UPLOAD_ERR_OK; } /** * @return bool */ public function isMoved() { return $this->moved; } /** * @throws RuntimeException if is moved or not ok */ private function validateActive() { if (\false === $this->isOk()) { throw new RuntimeException('Cannot retrieve stream due to upload error'); } if ($this->isMoved()) { throw new RuntimeException('Cannot retrieve stream after it has already been moved'); } } /** * {@inheritdoc} * * @throws RuntimeException if the upload was not successful. */ public function getStream() { $this->validateActive(); if ($this->stream instanceof StreamInterface) { return $this->stream; } return new LazyOpenStream($this->file, 'r+'); } /** * {@inheritdoc} * * @see http://php.net/is_uploaded_file * @see http://php.net/move_uploaded_file * * @param $targetPath Path to which to move the uploaded file. * * @throws RuntimeException if the upload was not successful. * @throws InvalidArgumentException if the $path specified is invalid. * @throws RuntimeException on any error during the move operation, or on * the second or subsequent call to the method. */ public function moveTo($targetPath) { $this->validateActive(); if (\false === $this->isStringNotEmpty($targetPath)) { throw new InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); } if ($this->file) { $this->moved = \php_sapi_name() == 'cli' ? \rename($this->file, $targetPath) : \move_uploaded_file($this->file, $targetPath); } else { Utils::copyToStream($this->getStream(), new LazyOpenStream($targetPath, 'w')); $this->moved = \true; } if (\false === $this->moved) { throw new RuntimeException(\sprintf('Uploaded file could not be moved to %s', $targetPath)); } } /** * {@inheritdoc} * * @return int|null The file size in bytes or null if unknown. */ public function getSize() { return $this->size; } /** * {@inheritdoc} * * @see http://php.net/manual/en/features.file-upload.errors.php * * @return int One of PHP's UPLOAD_ERR_XXX constants. */ public function getError() { return $this->error; } /** * {@inheritdoc} * * @return string|null The filename sent by the client or null if none * was provided. */ public function getClientFilename() { return $this->clientFilename; } /** * {@inheritdoc} */ public function getClientMediaType() { return $this->clientMediaType; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/NoSeekStream.php000064400000000750147600374260022566 0ustar00getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { $uri = $uri->withPath('/'); } if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { $uri = $uri->withHost(''); } if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { $uri = $uri->withPort(null); } if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { $queryKeyValues = \explode('&', $uri->getQuery()); \sort($queryKeyValues); $uri = $uri->withQuery(\implode('&', $queryKeyValues)); } return $uri; } /** * Whether two URIs can be considered equivalent. * * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be * resolved against the same base URI. If this is not the case, determination of equivalence or difference of * relative references does not mean anything. * * @param UriInterface $uri1 An URI to compare * @param UriInterface $uri2 An URI to compare * @param int $normalizations A bitmask of normalizations to apply, see constants * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-6.1 */ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) { return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); } private static function capitalizePercentEncoding(UriInterface $uri) { $regex = '/(?:%[A-Fa-f0-9]{2})++/'; $callback = function (array $match) { return \strtoupper($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private static function decodeUnreservedCharacters(UriInterface $uri) { $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; $callback = function (array $match) { return \rawurldecode($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private function __construct() { // cannot be instantiated } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php000064400000006340147600374260024331 0ustar00stream = $stream; } /** * Magic method used to create a new stream if streams are not added in * the constructor of a decorator (e.g., LazyOpenStream). * * @param $name Name of the property (allows "stream" only). * * @return StreamInterface */ public function __get($name) { if ($name == 'stream') { $this->stream = $this->createStream(); return $this->stream; } throw new \UnexpectedValueException("{$name} not found on class"); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { // Really, PHP? https://bugs.php.net/bug.php?id=53648 \trigger_error('StreamDecorator::__toString exception: ' . (string) $e, \E_USER_ERROR); return ''; } } public function getContents() { return Utils::copyToString($this); } /** * Allow decorators to implement custom methods * * @param $method Missing method name * @param array $args Method arguments * * @return mixed */ public function __call($method, array $args) { $result = \call_user_func_array([$this->stream, $method], $args); // Always return the wrapped object if the result is a return $this return $result === $this->stream ? $this : $result; } public function close() { $this->stream->close(); } public function getMetadata($key = null) { return $this->stream->getMetadata($key); } public function detach() { return $this->stream->detach(); } public function getSize() { return $this->stream->getSize(); } public function eof() { return $this->stream->eof(); } public function tell() { return $this->stream->tell(); } public function isReadable() { return $this->stream->isReadable(); } public function isWritable() { return $this->stream->isWritable(); } public function isSeekable() { return $this->stream->isSeekable(); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $this->stream->seek($offset, $whence); } public function read($length) { return $this->stream->read($length); } public function write($string) { return $this->stream->write($string); } /** * Implement in subclasses to dynamically create streams when requested. * * @return StreamInterface * * @throws \BadMethodCallException */ protected function createStream() { throw new \BadMethodCallException('Not implemented'); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/MimeType.php000064400000007441147600374260021763 0ustar00 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aac' => 'audio/x-aac', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'asc' => 'text/plain', 'asf' => 'video/x-ms-asf', 'atom' => 'application/atom+xml', 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'bz2' => 'application/x-bzip2', 'cer' => 'application/pkix-cert', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'css' => 'text/css', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'deb' => 'application/x-debian-package', 'doc' => 'application/msword', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dvi' => 'application/x-dvi', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'etx' => 'text/x-setext', 'flac' => 'audio/flac', 'flv' => 'video/x-flv', 'gif' => 'image/gif', 'gz' => 'application/gzip', 'htm' => 'text/html', 'html' => 'text/html', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ini' => 'text/plain', 'iso' => 'application/x-iso9660-image', 'jar' => 'application/java-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'text/javascript', 'json' => 'application/json', 'latex' => 'application/x-latex', 'log' => 'text/plain', 'm4a' => 'audio/mp4', 'm4v' => 'video/mp4', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mov' => 'video/quicktime', 'mkv' => 'video/x-matroska', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4v' => 'video/mp4', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'pbm' => 'image/x-portable-bitmap', 'pdf' => 'application/pdf', 'pgm' => 'image/x-portable-graymap', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/vnd.ms-powerpoint', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'svg' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 'tar' => 'application/x-tar', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'torrent' => 'application/x-bittorrent', 'ttf' => 'application/x-font-ttf', 'txt' => 'text/plain', 'wav' => 'audio/x-wav', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wma' => 'audio/x-ms-wma', 'wmv' => 'video/x-ms-wmv', 'woff' => 'application/x-font-woff', 'wsdl' => 'application/wsdl+xml', 'xbm' => 'image/x-xbitmap', 'xls' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xml' => 'application/xml', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'yaml' => 'text/yaml', 'yml' => 'text/yaml', 'zip' => 'application/zip']; $extension = \strtolower($extension); return isset($mimetypes[$extension]) ? $mimetypes[$extension] : null; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/AppendStream.php000064400000013165147600374260022615 0ustar00addStream($stream); } } public function __toString() { try { $this->rewind(); return $this->getContents(); } catch (\Exception $e) { return ''; } } /** * Add a stream to the AppendStream * * @param StreamInterface $stream Stream to append. Must be readable. * * @throws \InvalidArgumentException if the stream is not readable */ public function addStream(StreamInterface $stream) { if (!$stream->isReadable()) { throw new \InvalidArgumentException('Each stream must be readable'); } // The stream is only seekable if all streams are seekable if (!$stream->isSeekable()) { $this->seekable = \false; } $this->streams[] = $stream; } public function getContents() { return Utils::copyToString($this); } /** * Closes each attached stream. * * {@inheritdoc} */ public function close() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->close(); } $this->streams = []; } /** * Detaches each attached stream. * * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->detach(); } $this->streams = []; return null; } public function tell() { return $this->pos; } /** * Tries to calculate the size by adding the size of each stream. * * If any of the streams do not return a valid number, then the size of the * append stream cannot be determined and null is returned. * * {@inheritdoc} */ public function getSize() { $size = 0; foreach ($this->streams as $stream) { $s = $stream->getSize(); if ($s === null) { return null; } $size += $s; } return $size; } public function eof() { return !$this->streams || $this->current >= \count($this->streams) - 1 && $this->streams[$this->current]->eof(); } public function rewind() { $this->seek(0); } /** * Attempts to seek to the given position. Only supports SEEK_SET. * * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if (!$this->seekable) { throw new \RuntimeException('This AppendStream is not seekable'); } elseif ($whence !== \SEEK_SET) { throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); } $this->pos = $this->current = 0; // Rewind each stream foreach ($this->streams as $i => $stream) { try { $stream->rewind(); } catch (\Exception $e) { throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(\min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. * * {@inheritdoc} */ public function read($length) { $buffer = ''; $total = \count($this->streams) - 1; $remaining = $length; $progressToNext = \false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = \false; if ($this->current === $total) { break; } $this->current++; } $result = $this->streams[$this->current]->read($remaining); // Using a loose comparison here to match on '', false, and null if ($result == null) { $progressToNext = \true; continue; } $buffer .= $result; $remaining = $length - \strlen($buffer); } $this->pos += \strlen($buffer); return $buffer; } public function isReadable() { return \true; } public function isWritable() { return \false; } public function isSeekable() { return $this->seekable; } public function write($string) { throw new \RuntimeException('Cannot write to an AppendStream'); } public function getMetadata($key = null) { return $key ? null : []; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/LimitStream.php000064400000010106147600374260022454 0ustar00stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof() { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return \true; } // No limit and the underlying stream is not at EOF if ($this->limit == -1) { return \false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data * {@inheritdoc} */ public function getSize() { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit == -1) { return $length - $this->offset; } else { return \min($this->limit, $length - $this->offset); } } /** * Allow for a bounded seek on the read limited stream * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if ($whence !== \SEEK_SET || $offset < 0) { throw new \RuntimeException(\sprintf('Cannot seek to offset %s with whence %s', $offset, $whence)); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() * {@inheritdoc} */ public function tell() { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset($offset) { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset {$offset}"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit($limit) { $this->limit = $limit; } public function read($length) { if ($this->limit == -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = $this->offset + $this->limit - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(\min($remaining, $length)); } return ''; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/MessageTrait.php000064400000017057147600374260022626 0ustar00 array of values */ private $headers = []; /** @var array Map of lowercase header name => original name at registration */ private $headerNames = []; /** @var string */ private $protocol = '1.1'; /** @var StreamInterface|null */ private $stream; public function getProtocolVersion() { return $this->protocol; } public function withProtocolVersion($version) { if ($this->protocol === $version) { return $this; } $new = clone $this; $new->protocol = $version; return $new; } public function getHeaders() { return $this->headers; } public function hasHeader($header) { return isset($this->headerNames[\strtolower($header)]); } public function getHeader($header) { $header = \strtolower($header); if (!isset($this->headerNames[$header])) { return []; } $header = $this->headerNames[$header]; return $this->headers[$header]; } public function getHeaderLine($header) { return \implode(', ', $this->getHeader($header)); } public function withHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { unset($new->headers[$new->headerNames[$normalized]]); } $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; return $new; } public function withAddedHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $new->headers[$header] = \array_merge($this->headers[$header], $value); } else { $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; } return $new; } public function withoutHeader($header) { $normalized = \strtolower($header); if (!isset($this->headerNames[$normalized])) { return $this; } $header = $this->headerNames[$normalized]; $new = clone $this; unset($new->headers[$header], $new->headerNames[$normalized]); return $new; } public function getBody() { if (!$this->stream) { $this->stream = Utils::streamFor(''); } return $this->stream; } public function withBody(StreamInterface $body) { if ($body === $this->stream) { return $this; } $new = clone $this; $new->stream = $body; return $new; } private function setHeaders(array $headers) { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { if (\is_int($header)) { // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. $header = (string) $header; } $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $this->headers[$header] = \array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; } } } /** * @param mixed $value * * @return string[] */ private function normalizeHeaderValue($value) { if (!\is_array($value)) { return $this->trimAndValidateHeaderValues([$value]); } if (\count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } return $this->trimAndValidateHeaderValues($value); } /** * Trims whitespace from the header values. * * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. * * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * * @param mixed[] $values Header values * * @return string[] Trimmed header values * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ private function trimAndValidateHeaderValues(array $values) { return \array_map(function ($value) { if (!\is_scalar($value) && null !== $value) { throw new \InvalidArgumentException(\sprintf('Header value must be scalar or null but %s provided.', \is_object($value) ? \get_class($value) : \gettype($value))); } $trimmed = \trim((string) $value, " \t"); $this->assertValue($trimmed); return $trimmed; }, \array_values($values)); } /** * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * @param mixed $header * * @return void */ private function assertHeader($header) { if (!\is_string($header)) { throw new \InvalidArgumentException(\sprintf('Header name must be a string but %s provided.', \is_object($header) ? \get_class($header) : \gettype($header))); } if ($header === '') { throw new \InvalidArgumentException('Header name can not be empty.'); } if (!\preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header name.', $header)); } } /** * @param $value * * @return void * * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * field-value = *( field-content / obs-fold ) * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text * VCHAR = %x21-7E * obs-text = %x80-FF * obs-fold = CRLF 1*( SP / HTAB ) */ private function assertValue($value) { // The regular expression intentionally does not support the obs-fold production, because as // per RFC 7230#3.2.4: // // A sender MUST NOT generate a message that includes // line folding (i.e., that has any field-value that contains a match to // the obs-fold rule) unless the message is intended for packaging // within the message/http media type. // // Clients must not send a request with line folding and a server sending folded headers is // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting // folding is not likely to break any legitimate use case. if (!\preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header value.', $value)); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/InflateStream.php000064400000003547147600374260022773 0ustar00read(10); $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); // Skip the header, that is 10 + length of filename + 1 (nil) bytes $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); $resource = StreamWrapper::getResource($stream); \stream_filter_append($resource, 'zlib.inflate', \STREAM_FILTER_READ); $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** * @param StreamInterface $stream * @param $header * * @return int */ private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) { $filename_header_length = 0; if (\substr(\bin2hex($header), 6, 2) === '08') { // we have a filename, read until nil $filename_header_length = 1; while ($stream->read(1) !== \chr(0)) { $filename_header_length++; } } return $filename_header_length; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Message.php000064400000017663147600374260021625 0ustar00getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion(); if (!$message->hasHeader('host')) { $msg .= "\r\nHost: " . $message->getUri()->getHost(); } } elseif ($message instanceof ResponseInterface) { $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase(); } else { throw new \InvalidArgumentException('Unknown message type'); } foreach ($message->getHeaders() as $name => $values) { if (\strtolower($name) === 'set-cookie') { foreach ($values as $value) { $msg .= "\r\n{$name}: " . $value; } } else { $msg .= "\r\n{$name}: " . \implode(', ', $values); } } return "{$msg}\r\n\r\n" . $message->getBody(); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null */ public static function bodySummary(MessageInterface $message, $truncateAt = 120) { $body = $message->getBody(); if (!$body->isSeekable() || !$body->isReadable()) { return null; } $size = $body->getSize(); if ($size === 0) { return null; } $summary = $body->read($truncateAt); $body->rewind(); if ($size > $truncateAt) { $summary .= ' (truncated...)'; } // Matches any printable character, including unicode characters: // letters, marks, numbers, punctuation, spacing, and separators. if (\preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary)) { return null; } return $summary; } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` * returns a value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException */ public static function rewindBody(MessageInterface $message) { $body = $message->getBody(); if ($body->tell()) { $body->rewind(); } } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param $message HTTP request or response to parse. * * @return array */ public static function parseMessage($message) { if (!$message) { throw new \InvalidArgumentException('Invalid message'); } $message = \ltrim($message, "\r\n"); $messageParts = \preg_split("/\r?\n\r?\n/", $message, 2); if ($messageParts === \false || \count($messageParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } list($rawHeaders, $body) = $messageParts; $rawHeaders .= "\r\n"; // Put back the delimiter we split previously $headerParts = \preg_split("/\r?\n/", $rawHeaders, 2); if ($headerParts === \false || \count($headerParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing status line'); } list($startLine, $rawHeaders) = $headerParts; if (\preg_match("/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 $rawHeaders = \preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); } /** @var array[] $headerLines */ $count = \preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, \PREG_SET_ORDER); // If these aren't the same, then one line didn't match and there's an invalid header. if ($count !== \substr_count($rawHeaders, "\n")) { // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 if (\preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); } throw new \InvalidArgumentException('Invalid header syntax'); } $headers = []; foreach ($headerLines as $headerLine) { $headers[$headerLine[1]][] = $headerLine[2]; } return ['start-line' => $startLine, 'headers' => $headers, 'body' => $body]; } /** * Constructs a URI for an HTTP request message. * * @param $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string */ public static function parseRequestUri($path, array $headers) { $hostKey = \array_filter(\array_keys($headers), function ($k) { return \strtolower($k) === 'host'; }); // If no host is found, then a full URI cannot be constructed. if (!$hostKey) { return $path; } $host = $headers[\reset($hostKey)][0]; $scheme = \substr($host, -4) === ':443' ? 'https' : 'http'; return $scheme . '://' . $host . '/' . \ltrim($path, '/'); } /** * Parses a request message string into a request object. * * @param $message Request message string. * * @return Request */ public static function parseRequest($message) { $data = self::parseMessage($message); $matches = []; if (!\preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) { throw new \InvalidArgumentException('Invalid request string'); } $parts = \explode(' ', $data['start-line'], 3); $version = isset($parts[2]) ? \explode('/', $parts[2])[1] : '1.1'; $request = new Request($parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version); return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); } /** * Parses a response message string into a response object. * * @param $message Response message string. * * @return Response */ public static function parseResponse($message) { $data = self::parseMessage($message); // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space // between status-code and reason-phrase is required. But browsers accept // responses without space and reason as well. if (!\preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); } $parts = \explode(' ', $data['start-line'], 3); return new Response((int) $parts[1], $data['headers'], $data['body'], \explode('/', $parts[0])[1], isset($parts[2]) ? $parts[2] : null); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/functions_include.php000064400000000337147600374260023742 0ustar00stream = $stream; $this->maxLength = $maxLength; } public function write($string) { $diff = $this->maxLength - $this->stream->getSize(); // Begin returning 0 when the underlying stream is too large. if ($diff <= 0) { return 0; } // Write the stream or a subset of the stream if needed. if (\strlen($string) < $diff) { return $this->stream->write($string); } return $this->stream->write(\substr($string, 0, $diff)); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/UriResolver.php000064400000021047147600374260022511 0ustar00getScheme() != '') { return $rel->withPath(self::removeDotSegments($rel->getPath())); } if ($rel->getAuthority() != '') { $targetAuthority = $rel->getAuthority(); $targetPath = self::removeDotSegments($rel->getPath()); $targetQuery = $rel->getQuery(); } else { $targetAuthority = $base->getAuthority(); if ($rel->getPath() === '') { $targetPath = $base->getPath(); $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); } else { if ($rel->getPath()[0] === '/') { $targetPath = $rel->getPath(); } else { if ($targetAuthority != '' && $base->getPath() === '') { $targetPath = '/' . $rel->getPath(); } else { $lastSlashPos = \strrpos($base->getPath(), '/'); if ($lastSlashPos === \false) { $targetPath = $rel->getPath(); } else { $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); } } } $targetPath = self::removeDotSegments($targetPath); $targetQuery = $rel->getQuery(); } } return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); } /** * Returns the target URI as a relative reference from the base URI. * * This method is the counterpart to resolve(): * * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) * * One use-case is to use the current request URI as base URI and then generate relative links in your documents * to reduce the document size or offer self-contained downloadable document archives. * * $base = new Uri('http://example.com/a/b/'); * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. * * This method also accepts a target that is already relative and will try to relativize it further. Only a * relative-path reference will be returned as-is. * * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well * * @param UriInterface $base Base URI * @param UriInterface $target Target URI * * @return UriInterface The relative URI reference */ public static function relativize(UriInterface $base, UriInterface $target) { if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { return $target; } if (Uri::isRelativePathReference($target)) { // As the target is already highly relative we return it as-is. It would be possible to resolve // the target with `$target = self::resolve($base, $target);` and then try make it more relative // by removing a duplicate query. But let's not do that automatically. return $target; } if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { return $target->withScheme(''); } // We must remove the path before removing the authority because if the path starts with two slashes, the URI // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also // invalid. $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); if ($base->getPath() !== $target->getPath()) { return $emptyPathUri->withPath(self::getRelativePath($base, $target)); } if ($base->getQuery() === $target->getQuery()) { // Only the target fragment is left. And it must be returned even if base and target fragment are the same. return $emptyPathUri->withQuery(''); } // If the base URI has a query but the target has none, we cannot return an empty path reference as it would // inherit the base query component when resolving. if ($target->getQuery() === '') { $segments = \explode('/', $target->getPath()); $lastSegment = \end($segments); return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); } return $emptyPathUri; } private static function getRelativePath(UriInterface $base, UriInterface $target) { $sourceSegments = \explode('/', $base->getPath()); $targetSegments = \explode('/', $target->getPath()); \array_pop($sourceSegments); $targetLastSegment = \array_pop($targetSegments); foreach ($sourceSegments as $i => $segment) { if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { unset($sourceSegments[$i], $targetSegments[$i]); } else { break; } } $targetSegments[] = $targetLastSegment; $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { $relativePath = "./{$relativePath}"; } elseif ('/' === $relativePath[0]) { if ($base->getAuthority() != '' && $base->getPath() === '') { // In this case an extra slash is added by resolve() automatically. So we must not add one here. $relativePath = ".{$relativePath}"; } else { $relativePath = "./{$relativePath}"; } } return $relativePath; } private function __construct() { // cannot be instantiated } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/StreamWrapper.php000064400000006351147600374260023025 0ustar00isReadable()) { $mode = $stream->isWritable() ? 'r+' : 'r'; } elseif ($stream->isWritable()) { $mode = 'w'; } else { throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.'); } return \fopen('guzzle://stream', $mode, false, self::createStreamContext($stream)); } /** * Creates a stream context that can be used to open a stream as a php stream resource. * * @param StreamInterface $stream * * @return resource */ public static function createStreamContext(StreamInterface $stream) { return \stream_context_create(['guzzle' => ['stream' => $stream]]); } /** * Registers the stream wrapper if needed */ public static function register() { if (!\in_array('guzzle', \stream_get_wrappers())) { \stream_wrapper_register('guzzle', __CLASS__); } } public function stream_open($path, $mode, $options, &$opened_path) { $options = \stream_context_get_options($this->context); if (!isset($options['guzzle']['stream'])) { return \false; } $this->mode = $mode; $this->stream = $options['guzzle']['stream']; return \true; } public function stream_read($count) { return $this->stream->read($count); } public function stream_write($data) { return (int) $this->stream->write($data); } public function stream_tell() { return $this->stream->tell(); } public function stream_eof() { return $this->stream->eof(); } public function stream_seek($offset, $whence) { $this->stream->seek($offset, $whence); return \true; } public function stream_cast($cast_as) { $stream = clone $this->stream; return $stream->detach(); } public function stream_stat() { static $modeMap = ['r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188]; return ['dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } public function url_stat($path, $flags) { return ['dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Query.php000064400000006675147600374260021347 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|$urlEncoding How the query string is encoded * * @return array */ public static function parse($str, $urlEncoding = \true) { $result = []; if ($str === '') { return $result; } if ($urlEncoding === \true) { $decoder = function ($value) { return \rawurldecode(\str_replace('+', ' ', $value)); }; } elseif ($urlEncoding === \PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; } elseif ($urlEncoding === \PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; } foreach (\explode('&', $str) as $kvp) { $parts = \explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; if (!isset($result[$key])) { $result[$key] = $value; } else { if (!\is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } } return $result; } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string */ public static function build(array $params, $encoding = \PHP_QUERY_RFC3986) { if (!$params) { return ''; } if ($encoding === \false) { $encoder = function ($str) { return $str; }; } elseif ($encoding === \PHP_QUERY_RFC3986) { $encoder = 'rawurlencode'; } elseif ($encoding === \PHP_QUERY_RFC1738) { $encoder = 'urlencode'; } else { throw new \InvalidArgumentException('Invalid type'); } $qs = ''; foreach ($params as $k => $v) { $k = $encoder($k); if (!\is_array($v)) { $qs .= $k; if ($v !== null) { $qs .= '=' . $encoder($v); } $qs .= '&'; } else { foreach ($v as $vv) { $qs .= $k; if ($vv !== null) { $qs .= '=' . $encoder($vv); } $qs .= '&'; } } } return $qs ? (string) \substr($qs, 0, -1) : ''; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/BufferStream.php000064400000006051147600374260022613 0ustar00hwm = $hwm; } public function __toString() { return $this->getContents(); } public function getContents() { $buffer = $this->buffer; $this->buffer = ''; return $buffer; } public function close() { $this->buffer = ''; } public function detach() { $this->close(); return null; } public function getSize() { return \strlen($this->buffer); } public function isReadable() { return \true; } public function isWritable() { return \true; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a BufferStream'); } public function eof() { return \strlen($this->buffer) === 0; } public function tell() { throw new \RuntimeException('Cannot determine the position of a BufferStream'); } /** * Reads data from the buffer. */ public function read($length) { $currentLength = \strlen($this->buffer); if ($length >= $currentLength) { // No need to slice the buffer because we don't have enough data. $result = $this->buffer; $this->buffer = ''; } else { // Slice up the result to provide a subset of the buffer. $result = \substr($this->buffer, 0, $length); $this->buffer = \substr($this->buffer, $length); } return $result; } /** * Writes data to the buffer. */ public function write($string) { $this->buffer .= $string; // TODO: What should happen here? if (\strlen($this->buffer) >= $this->hwm) { return \false; } return \strlen($string); } public function getMetadata($key = null) { if ($key == 'hwm') { return $this->hwm; } return $key ? null : []; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/ServerRequest.php000064400000022675147600374260023057 0ustar00serverParams = $serverParams; parent::__construct($method, $uri, $headers, $body, $version); } /** * Return an UploadedFile instance array. * * @param array $files A array which respect $_FILES structure * * @return array * * @throws InvalidArgumentException for unrecognized values */ public static function normalizeFiles(array $files) { $normalized = []; foreach ($files as $key => $value) { if ($value instanceof UploadedFileInterface) { $normalized[$key] = $value; } elseif (\is_array($value) && isset($value['tmp_name'])) { $normalized[$key] = self::createUploadedFileFromSpec($value); } elseif (\is_array($value)) { $normalized[$key] = self::normalizeFiles($value); continue; } else { throw new InvalidArgumentException('Invalid value in files specification'); } } return $normalized; } /** * Create and return an UploadedFile instance from a $_FILES specification. * * If the specification represents an array of values, this method will * delegate to normalizeNestedFileSpec() and return that return value. * * @param array $value $_FILES struct * * @return array|UploadedFileInterface */ private static function createUploadedFileFromSpec(array $value) { if (\is_array($value['tmp_name'])) { return self::normalizeNestedFileSpec($value); } return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); } /** * Normalize an array of file specifications. * * Loops through all nested files and returns a normalized array of * UploadedFileInterface instances. * * @param array $files * * @return UploadedFileInterface[] */ private static function normalizeNestedFileSpec(array $files = []) { $normalizedFiles = []; foreach (\array_keys($files['tmp_name']) as $key) { $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key], 'error' => $files['error'][$key], 'name' => $files['name'][$key], 'type' => $files['type'][$key]]; $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); } return $normalizedFiles; } /** * Return a ServerRequest populated with superglobals: * $_GET * $_POST * $_COOKIE * $_FILES * $_SERVER * * @return ServerRequestInterface */ public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; $headers = \getallheaders(); $uri = self::getUriFromGlobals(); $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); } private static function extractHostAndPortFromAuthority($authority) { $uri = 'http://' . $authority; $parts = \parse_url($uri); if (\false === $parts) { return [null, null]; } $host = isset($parts['host']) ? $parts['host'] : null; $port = isset($parts['port']) ? $parts['port'] : null; return [$host, $port]; } /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ public static function getUriFromGlobals() { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = \false; if (isset($_SERVER['HTTP_HOST'])) { list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); if ($host !== null) { $uri = $uri->withHost($host); } if ($port !== null) { $hasPort = \true; $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); } elseif (isset($_SERVER['SERVER_ADDR'])) { $uri = $uri->withHost($_SERVER['SERVER_ADDR']); } if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { $uri = $uri->withPort($_SERVER['SERVER_PORT']); } $hasQuery = \false; if (isset($_SERVER['REQUEST_URI'])) { $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = \true; $uri = $uri->withQuery($requestUriParts[1]); } } if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { $uri = $uri->withQuery($_SERVER['QUERY_STRING']); } return $uri; } /** * {@inheritdoc} */ public function getServerParams() { return $this->serverParams; } /** * {@inheritdoc} */ public function getUploadedFiles() { return $this->uploadedFiles; } /** * {@inheritdoc} */ public function withUploadedFiles(array $uploadedFiles) { $new = clone $this; $new->uploadedFiles = $uploadedFiles; return $new; } /** * {@inheritdoc} */ public function getCookieParams() { return $this->cookieParams; } /** * {@inheritdoc} */ public function withCookieParams(array $cookies) { $new = clone $this; $new->cookieParams = $cookies; return $new; } /** * {@inheritdoc} */ public function getQueryParams() { return $this->queryParams; } /** * {@inheritdoc} */ public function withQueryParams(array $query) { $new = clone $this; $new->queryParams = $query; return $new; } /** * {@inheritdoc} */ public function getParsedBody() { return $this->parsedBody; } /** * {@inheritdoc} */ public function withParsedBody($data) { $new = clone $this; $new->parsedBody = $data; return $new; } /** * {@inheritdoc} */ public function getAttributes() { return $this->attributes; } /** * {@inheritdoc} */ public function getAttribute($attribute, $default = null) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $default; } return $this->attributes[$attribute]; } /** * {@inheritdoc} */ public function withAttribute($attribute, $value) { $new = clone $this; $new->attributes[$attribute] = $value; return $new; } /** * {@inheritdoc} */ public function withoutAttribute($attribute) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $this; } $new = clone $this; unset($new->attributes[$attribute]); return $new; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/MultipartStream.php000064400000011027147600374260023362 0ustar00boundary = $boundary ?: \sha1(\uniqid('', \true)); $this->stream = $this->createStream($elements); } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } public function isWritable() { return \false; } /** * Get the headers needed before transferring the content of a POST file */ private function getHeaders(array $headers) { $str = ''; foreach ($headers as $key => $value) { $str .= "{$key}: {$value}\r\n"; } return "--{$this->boundary}\r\n" . \trim($str) . "\r\n\r\n"; } /** * Create the aggregate stream that will be used to upload the POST data */ protected function createStream(array $elements) { $stream = new AppendStream(); foreach ($elements as $element) { $this->addElement($stream, $element); } // Add the trailing boundary with CRLF $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); return $stream; } private function addElement(AppendStream $stream, array $element) { foreach (['contents', 'name'] as $key) { if (!\array_key_exists($key, $element)) { throw new \InvalidArgumentException("A '{$key}' key is required"); } } $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); if (\substr($uri, 0, 6) !== 'php://') { $element['filename'] = $uri; } } list($body, $headers) = $this->createElement($element['name'], $element['contents'], isset($element['filename']) ? $element['filename'] : null, isset($element['headers']) ? $element['headers'] : []); $stream->addStream(Utils::streamFor($this->getHeaders($headers))); $stream->addStream($body); $stream->addStream(Utils::streamFor("\r\n")); } /** * @return array */ private function createElement($name, StreamInterface $stream, $filename, array $headers) { // Set a default content-disposition header if one was no provided $disposition = $this->getHeader($headers, 'content-disposition'); if (!$disposition) { $headers['Content-Disposition'] = $filename === '0' || $filename ? \sprintf('form-data; name="%s"; filename="%s"', $name, \basename($filename)) : "form-data; name=\"{$name}\""; } // Set a default content-length header if one was no provided $length = $this->getHeader($headers, 'content-length'); if (!$length) { if ($length = $stream->getSize()) { $headers['Content-Length'] = (string) $length; } } // Set a default Content-Type if one was not supplied $type = $this->getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { if ($type = MimeType::fromFilename($filename)) { $headers['Content-Type'] = $type; } } return [$stream, $headers]; } private function getHeader(array $headers, $key) { $lowercaseHeader = \strtolower($key); foreach ($headers as $k => $v) { if (\strtolower($k) === $lowercaseHeader) { return $v; } } return null; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/CachingStream.php000064400000010526147600374260022740 0ustar00remoteStream = $stream; $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); } public function getSize() { $remoteSize = $this->remoteStream->getSize(); if (null === $remoteSize) { return null; } return \max($this->stream->getSize(), $remoteSize); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { if ($whence == \SEEK_SET) { $byte = $offset; } elseif ($whence == \SEEK_CUR) { $byte = $offset + $this->tell(); } elseif ($whence == \SEEK_END) { $size = $this->remoteStream->getSize(); if ($size === null) { $size = $this->cacheEntireStream(); } $byte = $size + $offset; } else { throw new \InvalidArgumentException('Invalid whence'); } $diff = $byte - $this->stream->getSize(); if ($diff > 0) { // Read the remoteStream until we have read in at least the amount // of bytes requested, or we reach the end of the file. while ($diff > 0 && !$this->remoteStream->eof()) { $this->read($diff); $diff = $byte - $this->stream->getSize(); } } else { // We can just do a normal seek since we've already seen this byte. $this->stream->seek($byte); } } public function read($length) { // Perform a regular read on any previously read data from the buffer $data = $this->stream->read($length); $remaining = $length - \strlen($data); // More data was requested so read from the remote stream if ($remaining) { // If data was written to the buffer in a position that would have // been filled from the remote stream, then we must skip bytes on // the remote stream to emulate overwriting bytes from that // position. This mimics the behavior of other PHP stream wrappers. $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); if ($this->skipReadBytes) { $len = \strlen($remoteData); $remoteData = \substr($remoteData, $this->skipReadBytes); $this->skipReadBytes = \max(0, $this->skipReadBytes - $len); } $data .= $remoteData; $this->stream->write($remoteData); } return $data; } public function write($string) { // When appending to the end of the currently read stream, you'll want // to skip bytes from being read from the remote stream to emulate // other stream wrappers. Basically replacing bytes of data of a fixed // length. $overflow = \strlen($string) + $this->tell() - $this->remoteStream->tell(); if ($overflow > 0) { $this->skipReadBytes += $overflow; } return $this->stream->write($string); } public function eof() { return $this->stream->eof() && $this->remoteStream->eof(); } /** * Close both the remote stream and buffer stream */ public function close() { $this->remoteStream->close() && $this->stream->close(); } private function cacheEntireStream() { $target = new FnStream(['write' => 'strlen']); Utils::copyToStream($this, $target); return $this->tell(); } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Header.php000064400000004242147600374260021416 0ustar00]+>|[^=]+/', $kvp, $matches)) { $m = $matches[0]; if (isset($m[1])) { $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed); } else { $part[] = \trim($m[0], $trimmed); } } } if ($part) { $params[] = $part; } } return $params; } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. */ public static function normalize($header) { if (!\is_array($header)) { return \array_map('trim', \explode(',', $header)); } $result = []; foreach ($header as $value) { foreach ((array) $value as $v) { if (\strpos($v, ',') === \false) { $result[] = $v; continue; } foreach (\preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { $result[] = \trim($vv); } } } return $result; } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/Request.php000064400000007216147600374260021662 0ustar00assertMethod($method); if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } $this->method = \strtoupper($method); $this->uri = $uri; $this->setHeaders($headers); $this->protocol = $version; if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } } public function getRequestTarget() { if ($this->requestTarget !== null) { return $this->requestTarget; } $target = $this->uri->getPath(); if ($target == '') { $target = '/'; } if ($this->uri->getQuery() != '') { $target .= '?' . $this->uri->getQuery(); } return $target; } public function withRequestTarget($requestTarget) { if (\preg_match('#\\s#', $requestTarget)) { throw new InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); } $new = clone $this; $new->requestTarget = $requestTarget; return $new; } public function getMethod() { return $this->method; } public function withMethod($method) { $this->assertMethod($method); $new = clone $this; $new->method = \strtoupper($method); return $new; } public function getUri() { return $this->uri; } public function withUri(UriInterface $uri, $preserveHost = \false) { if ($uri === $this->uri) { return $this; } $new = clone $this; $new->uri = $uri; if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } return $new; } private function updateHostFromUri() { $host = $this->uri->getHost(); if ($host == '') { return; } if (($port = $this->uri->getPort()) !== null) { $host .= ':' . $port; } if (isset($this->headerNames['host'])) { $header = $this->headerNames['host']; } else { $header = 'Host'; $this->headerNames['host'] = 'Host'; } // Ensure Host is the first header. // See: http://tools.ietf.org/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } private function assertMethod($method) { if (!\is_string($method) || $method === '') { throw new \InvalidArgumentException('Method must be a non-empty string.'); } } } addons/dropboxaddon/vendor-prefixed/guzzlehttp/psr7/src/UriComparator.php000064400000002305147600374260023013 0ustar00getHost(), $modified->getHost()) !== 0) { return \true; } if ($original->getScheme() !== $modified->getScheme()) { return \true; } if (self::computePort($original) !== self::computePort($modified)) { return \true; } return \false; } /** * @return int */ private static function computePort(UriInterface $uri) { $port = $uri->getPort(); if (null !== $port) { return $port; } return 'https' === $uri->getScheme() ? 443 : 80; } private function __construct() { // cannot be instantiated } } addons/dropboxaddon/vendor-prefixed/psr/http-message/src/StreamInterface.php000064400000011174147600374260023376 0ustar00 * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param $user The user name to use for authority. * @param null|$password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|$port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } addons/dropboxaddon/vendor-prefixed/psr/http-message/src/UploadedFileInterface.php000064400000011116147600374260024474 0ustar00getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param $name The attribute name. * @return static */ public function withoutAttribute($name); } addons/dropboxaddon/vendor-prefixed/psr/http-message/src/MessageInterface.php000064400000015334147600374260023531 0ustar00getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } addons/dropboxaddon/vendor-prefixed/psr/http-message/src/RequestInterface.php000064400000011327147600374260023573 0ustar00 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5'); foreach ($_SERVER as $key => $value) { if (\substr($key, 0, 5) === 'HTTP_') { $key = \substr($key, 5); if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { $key = \str_replace(' ', '-', \ucwords(\strtolower(\str_replace('_', ' ', $key)))); $headers[$key] = $value; } } elseif (isset($copy_server[$key])) { $headers[$copy_server[$key]] = $value; } } if (!isset($headers['Authorization'])) { if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; } elseif (isset($_SERVER['PHP_AUTH_USER'])) { $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; $headers['Authorization'] = 'Basic ' . \base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; } } return $headers; } } addons/dropboxaddon/vendor-prefixed/spatie/dropbox-api/src/Exceptions/BadRequest.php000064400000001146147600374260025004 0ustar00getBody(), \true); if (isset($body['error']['.tag'])) { $this->dropboxCode = $body['error']['.tag']; } parent::__construct($body['error_summary']); } } addons/dropboxaddon/vendor-prefixed/spatie/dropbox-api/src/UploadSessionCursor.php000064400000001077147600374260024615 0ustar00session_id = $session_id; $this->offset = $offset; } } addons/dropboxaddon/vendor-prefixed/spatie/dropbox-api/src/Client.php000064400000051227147600374260022047 0ustar00accessToken = $accessToken; $this->client = $client ?: new GuzzleClient(['handler' => self::createHandler()]); $this->maxChunkSize = $maxChunkSize < self::MAX_CHUNK_SIZE ? $maxChunkSize > 1 ? $maxChunkSize : 1 : self::MAX_CHUNK_SIZE; $this->maxUploadChunkRetries = $maxUploadChunkRetries; } /** * Create a new guzzle handler stack. * * @return \VendorDuplicator\Dropbox\GuzzleHttp\HandlerStack */ protected static function createHandler() { $stack = HandlerStack::create(); $stack->push(Middleware::retry(function ($retries, $request, $response = null, $exception = null) { return $retries < 3 && ($exception instanceof ConnectException || $response && ($response->getStatusCode() >= 500 || \in_array($response->getStatusCode(), self::RETRY_CODES, \true))); }, function ($retries) { return (int) \pow(2, $retries) * self::RETRY_BACKOFF; })); return $stack; } /** * Copy a file or folder to a different location in the user's Dropbox. * * If the source path is a folder all its contents will be copied. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-copy_v2 */ public function copy($fromPath, $toPath) { $parameters = ['from_path' => $this->normalizePath($fromPath), 'to_path' => $this->normalizePath($toPath)]; return $this->rpcEndpointRequest('files/copy_v2', $parameters); } /** * Create a folder at a given path. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-create_folder */ public function createFolder($path) { $parameters = ['path' => $this->normalizePath($path)]; $object = $this->rpcEndpointRequest('files/create_folder', $parameters); $object['.tag'] = 'folder'; return $object; } /** * Create a shared link with custom settings. * * If no settings are given then the default visibility is RequestedVisibility.public. * The resolved visibility, though, may depend on other aspects such as team and * shared folder settings). Only for paid users. * * @link https://www.dropbox.com/developers/documentation/http/documentation#sharing-create_shared_link_with_settings */ public function createSharedLinkWithSettings($path, array $settings = []) { $parameters = ['path' => $this->normalizePath($path)]; if (\count($settings)) { $parameters = \array_merge(\compact('settings'), $parameters); } return $this->rpcEndpointRequest('sharing/create_shared_link_with_settings', $parameters); } /** * List shared links. * * For empty path returns a list of all shared links. For non-empty path * returns a list of all shared links with access to the given path. * * If direct_only is set true, only direct links to the path will be returned, otherwise * it may return link to the path itself and parent folders as described on docs. * * @link https://www.dropbox.com/developers/documentation/http/documentation#sharing-list_shared_links */ public function listSharedLinks($path = null, $direct_only = \false, $cursor = null) { $parameters = ['path' => $path ? $this->normalizePath($path) : null, 'cursor' => $cursor, 'direct_only' => $direct_only]; $body = $this->rpcEndpointRequest('sharing/list_shared_links', $parameters); return $body['links']; } /** * Delete the file or folder at a given path. * * If the path is a folder, all its contents will be deleted too. * A successful response indicates that the file or folder was deleted. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-delete */ public function delete($path) { $parameters = ['path' => $this->normalizePath($path)]; return $this->rpcEndpointRequest('files/delete', $parameters); } /** * Download a file from a user's Dropbox. * * @param $path * * @return resource * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-download */ public function download($path) { $arguments = ['path' => $this->normalizePath($path)]; $response = $this->contentEndpointRequest('files/download', $arguments); return StreamWrapper::getResource($response->getBody()); } /** * Returns the metadata for a file or folder. * * Note: Metadata for the root folder is unsupported. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-get_metadata */ public function getMetadata($path) { $parameters = ['path' => $this->normalizePath($path)]; return $this->rpcEndpointRequest('files/get_metadata', $parameters); } /** * Get a temporary link to stream content of a file. * * This link will expire in four hours and afterwards you will get 410 Gone. * Content-Type of the link is determined automatically by the file's mime type. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-get_temporary_link */ public function getTemporaryLink($path) { $parameters = ['path' => $this->normalizePath($path)]; $body = $this->rpcEndpointRequest('files/get_temporary_link', $parameters); return $body['link']; } /** * Get a thumbnail for an image. * * This method currently supports files with the following file extensions: * jpg, jpeg, png, tiff, tif, gif and bmp. * * Photos that are larger than 20MB in size won't be converted to a thumbnail. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-get_thumbnail */ public function getThumbnail($path, $format = 'jpeg', $size = 'w64h64') { $arguments = ['path' => $this->normalizePath($path), 'format' => $format, 'size' => $size]; $response = $this->contentEndpointRequest('files/get_thumbnail', $arguments); return (string) $response->getBody(); } /** * Starts returning the contents of a folder. * * If the result's ListFolderResult.has_more field is true, call * list_folder/continue with the returned ListFolderResult.cursor to retrieve more entries. * * Note: auth.RateLimitError may be returned if multiple list_folder or list_folder/continue calls * with same parameters are made simultaneously by same API app for same user. If your app implements * retry logic, please hold off the retry until the previous request finishes. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-list_folder */ public function listFolder($path = '', $recursive = \false) { $parameters = ['path' => $this->normalizePath($path), 'recursive' => $recursive]; return $this->rpcEndpointRequest('files/list_folder', $parameters); } /** * Once a cursor has been retrieved from list_folder, use this to paginate through all files and * retrieve updates to the folder, following the same rules as documented for list_folder. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-list_folder-continue */ public function listFolderContinue($cursor = '') { return $this->rpcEndpointRequest('files/list_folder/continue', \compact('cursor')); } /** * Move a file or folder to a different location in the user's Dropbox. * * If the source path is a folder all its contents will be moved. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-move_v2 */ public function move($fromPath, $toPath) { $parameters = ['from_path' => $this->normalizePath($fromPath), 'to_path' => $this->normalizePath($toPath)]; return $this->rpcEndpointRequest('files/move_v2', $parameters); } /** * The file should be uploaded in chunks if it size exceeds the 150 MB threshold * or if the resource size could not be determined (eg. a popen() stream). * * @param string|resource $contents * * @return bool */ protected function shouldUploadChunked($contents) { $size = \is_string($contents) ? \strlen($contents) : \fstat($contents)['size']; if ($this->isPipe($contents)) { return \true; } if ($size === null) { return \true; } return $size > $this->maxChunkSize; } /** * Check if the contents is a pipe stream (not seekable, no size defined). * * @param string|resource $contents * * @return bool */ protected function isPipe($contents) { return \is_resource($contents) ? (\fstat($contents)['mode'] & 010000) != 0 : \false; } /** * Create a new file with the contents provided in the request. * * Do not use this to upload a file larger than 150 MB. Instead, create an upload session with upload_session/start. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-upload * * @param $path * @param string|resource $contents * @param $mode * * @return array */ public function upload($path, $contents, $mode = 'add') { if ($this->shouldUploadChunked($contents)) { return $this->uploadChunked($path, $contents, $mode); } $arguments = ['path' => $this->normalizePath($path), 'mode' => $mode]; $response = $this->contentEndpointRequest('files/upload', $arguments, $contents); $metadata = \json_decode($response->getBody(), \true); $metadata['.tag'] = 'file'; return $metadata; } /** * Upload file split in chunks. This allows uploading large files, since * Dropbox API v2 limits the content size to 150MB. * * The chunk size will affect directly the memory usage, so be careful. * Large chunks tends to speed up the upload, while smaller optimizes memory usage. * * @param $path * @param string|resource $contents * @param $mode * @param $chunkSize * * @return array */ public function uploadChunked($path, $contents, $mode = 'add', $chunkSize = null) { if ($chunkSize === null || $chunkSize > $this->maxChunkSize) { $chunkSize = $this->maxChunkSize; } $stream = $this->getStream($contents); $cursor = $this->uploadChunk(self::UPLOAD_SESSION_START, $stream, $chunkSize, null); while (!$stream->eof()) { $cursor = $this->uploadChunk(self::UPLOAD_SESSION_APPEND, $stream, $chunkSize, $cursor); } return $this->uploadSessionFinish('', $cursor, $path, $mode); } /** * @param $type * @param Psr7\Stream $stream * @param $chunkSize * @param \VendorDuplicator\Dropbox\Spatie\Dropbox\UploadSessionCursor|null $cursor * @return \VendorDuplicator\Dropbox\Spatie\Dropbox\UploadSessionCursor * @throws Exception */ protected function uploadChunk($type, &$stream, $chunkSize, $cursor = null) { $maximumTries = $stream->isSeekable() ? $this->maxUploadChunkRetries : 0; $pos = $stream->tell(); $tries = 0; tryUpload: try { $tries++; $chunkStream = new Psr7\LimitStream($stream, $chunkSize, $stream->tell()); if ($type === self::UPLOAD_SESSION_START) { return $this->uploadSessionStart($chunkStream); } if ($type === self::UPLOAD_SESSION_APPEND && $cursor !== null) { return $this->uploadSessionAppend($chunkStream, $cursor); } throw new Exception('Invalid type'); } catch (RequestException $exception) { if ($tries < $maximumTries) { // rewind $stream->seek($pos, \SEEK_SET); goto tryUpload; } throw $exception; } } /** * Upload sessions allow you to upload a single file in one or more requests, * for example where the size of the file is greater than 150 MB. * This call starts a new upload session with the given data. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-upload_session-start * * @param string|StreamInterface $contents * @param $close * * @return UploadSessionCursor */ public function uploadSessionStart($contents, $close = \false) { $arguments = \compact('close'); $response = \json_decode($this->contentEndpointRequest('files/upload_session/start', $arguments, $contents)->getBody(), \true); return new UploadSessionCursor($response['session_id'], $contents instanceof StreamInterface ? $contents->tell() : \strlen($contents)); } /** * Append more data to an upload session. * When the parameter close is set, this call will close the session. * A single request should not upload more than 150 MB. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-upload_session-append_v2 * * @param string|StreamInterface $contents * @param UploadSessionCursor $cursor * @param $close * * @return \VendorDuplicator\Dropbox\Spatie\Dropbox\UploadSessionCursor */ public function uploadSessionAppend($contents, UploadSessionCursor $cursor, $close = \false) { $arguments = \compact('cursor', 'close'); $pos = $contents instanceof StreamInterface ? $contents->tell() : 0; $this->contentEndpointRequest('files/upload_session/append_v2', $arguments, $contents); $cursor->offset += $contents instanceof StreamInterface ? $contents->tell() - $pos : \strlen($contents); return $cursor; } /** * Finish an upload session and save the uploaded data to the given file path. * A single request should not upload more than 150 MB. * * @link https://www.dropbox.com/developers/documentation/http/documentation#files-upload_session-finish * * @param string|StreamInterface $contents * @param \VendorDuplicator\Dropbox\Spatie\Dropbox\UploadSessionCursor $cursor * @param $path * @param string|array $mode * @param $autorename * @param $mute * * @return array */ public function uploadSessionFinish($contents, UploadSessionCursor $cursor, $path, $mode = 'add', $autorename = \false, $mute = \false) { $arguments = \compact('cursor'); $arguments['commit'] = \compact('path', 'mode', 'autorename', 'mute'); $response = $this->contentEndpointRequest('files/upload_session/finish', $arguments, $contents == '' ? null : $contents); $metadata = \json_decode($response->getBody(), \true); $metadata['.tag'] = 'file'; return $metadata; } /** * Get Account Info for current authenticated user. * * @link https://www.dropbox.com/developers/documentation/http/documentation#users-get_current_account * * @return array */ public function getAccountInfo() { return $this->rpcEndpointRequest('users/get_current_account'); } /** * Revoke current access token. * * @link https://www.dropbox.com/developers/documentation/http/documentation#auth-token-revoke */ public function revokeToken() { $this->rpcEndpointRequest('auth/token/revoke'); } protected function normalizePath($path) { if (\preg_match("/^id:.*|^rev:.*|^(ns:[0-9]+(\\/.*)?)/", $path) === 1) { return $path; } $path = \trim($path, '/'); return $path === '' ? '' : '/' . $path; } protected function getEndpointUrl($subdomain, $endpoint) { if (\count($parts = \explode('::', $endpoint)) === 2) { list($subdomain, $endpoint) = $parts; } return "https://{$subdomain}.dropboxapi.com/2/{$endpoint}"; } /** * @param $endpoint * @param array $arguments * @param string|resource|StreamInterface $body * * @return \VendorDuplicator\Dropbox\Psr\Http\Message\ResponseInterface * * @throws \Exception */ public function contentEndpointRequest($endpoint, array $arguments, $body = '') { $headers = ['Dropbox-API-Arg' => \json_encode($arguments)]; if ($body !== '') { $headers['Content-Type'] = 'application/octet-stream'; } try { $response = $this->client->post($this->getEndpointUrl('content', $endpoint), ['headers' => $this->getHeaders($headers), 'body' => $body]); } catch (ClientException $exception) { throw $this->determineException($exception); } return $response; } public function rpcEndpointRequest($endpoint, array $parameters = null) { try { $options = ['headers' => $this->getHeaders()]; if ($parameters) { $options['json'] = $parameters; } $response = $this->client->post($this->getEndpointUrl('api', $endpoint), $options); } catch (ClientException $exception) { throw $this->determineException($exception); } $response = \json_decode($response->getBody(), \true); return $response ?: []; } protected function determineException(ClientException $exception) { if (\in_array($exception->getResponse()->getStatusCode(), [400, 409])) { return new BadRequest($exception->getResponse()); } return $exception; } /** * @param $contents * * @return \VendorDuplicator\Dropbox\GuzzleHttp\Psr7\PumpStream|\GuzzleHttp\Psr7\Stream */ protected function getStream($contents) { if ($this->isPipe($contents)) { /* @var resource $contents */ return new PumpStream(function ($length) use($contents) { $data = \fread($contents, $length); if (\strlen($data) === 0) { return \false; } return $data; }); } return Psr7\stream_for($contents); } /** * Get the access token. */ public function getAccessToken() { return $this->accessToken; } /** * Set the access token. */ public function setAccessToken($accessToken) { $this->accessToken = $accessToken; return $this; } /** * Get the HTTP headers. */ protected function getHeaders(array $headers = []) { return \array_merge(['Authorization' => "Bearer {$this->accessToken}"], $headers); } } dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php000064400000001642147600374260031022 0ustar00addons \true, 1 => \true, 2 => \true, 3 => \true, 4 => \true, 5 => \true, 6 => \true, 7 => \true, 8 => \true, 9 => \true, 10 => \true, 11 => \true, 12 => \true, 13 => \true, 14 => \true, 15 => \true, 16 => \true, 17 => \true, 18 => \true, 19 => \true, 20 => \true, 21 => \true, 22 => \true, 23 => \true, 24 => \true, 25 => \true, 26 => \true, 27 => \true, 28 => \true, 29 => \true, 30 => \true, 31 => \true, 32 => \true, 33 => \true, 34 => \true, 35 => \true, 36 => \true, 37 => \true, 38 => \true, 39 => \true, 40 => \true, 41 => \true, 42 => \true, 43 => \true, 44 => \true, 47 => \true, 58 => \true, 59 => \true, 60 => \true, 61 => \true, 62 => \true, 63 => \true, 64 => \true, 91 => \true, 92 => \true, 93 => \true, 94 => \true, 95 => \true, 96 => \true, 123 => \true, 124 => \true, 125 => \true, 126 => \true, 127 => \true, 8800 => \true, 8814 => \true, 8815 => \true); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php000064400000121643147600374260027131 0ustar00 \true, 889 => \true, 896 => \true, 897 => \true, 898 => \true, 899 => \true, 907 => \true, 909 => \true, 930 => \true, 1216 => \true, 1328 => \true, 1367 => \true, 1368 => \true, 1419 => \true, 1420 => \true, 1424 => \true, 1480 => \true, 1481 => \true, 1482 => \true, 1483 => \true, 1484 => \true, 1485 => \true, 1486 => \true, 1487 => \true, 1515 => \true, 1516 => \true, 1517 => \true, 1518 => \true, 1525 => \true, 1526 => \true, 1527 => \true, 1528 => \true, 1529 => \true, 1530 => \true, 1531 => \true, 1532 => \true, 1533 => \true, 1534 => \true, 1535 => \true, 1536 => \true, 1537 => \true, 1538 => \true, 1539 => \true, 1540 => \true, 1541 => \true, 1564 => \true, 1565 => \true, 1757 => \true, 1806 => \true, 1807 => \true, 1867 => \true, 1868 => \true, 1970 => \true, 1971 => \true, 1972 => \true, 1973 => \true, 1974 => \true, 1975 => \true, 1976 => \true, 1977 => \true, 1978 => \true, 1979 => \true, 1980 => \true, 1981 => \true, 1982 => \true, 1983 => \true, 2043 => \true, 2044 => \true, 2094 => \true, 2095 => \true, 2111 => \true, 2140 => \true, 2141 => \true, 2143 => \true, 2229 => \true, 2248 => \true, 2249 => \true, 2250 => \true, 2251 => \true, 2252 => \true, 2253 => \true, 2254 => \true, 2255 => \true, 2256 => \true, 2257 => \true, 2258 => \true, 2274 => \true, 2436 => \true, 2445 => \true, 2446 => \true, 2449 => \true, 2450 => \true, 2473 => \true, 2481 => \true, 2483 => \true, 2484 => \true, 2485 => \true, 2490 => \true, 2491 => \true, 2501 => \true, 2502 => \true, 2505 => \true, 2506 => \true, 2511 => \true, 2512 => \true, 2513 => \true, 2514 => \true, 2515 => \true, 2516 => \true, 2517 => \true, 2518 => \true, 2520 => \true, 2521 => \true, 2522 => \true, 2523 => \true, 2526 => \true, 2532 => \true, 2533 => \true, 2559 => \true, 2560 => \true, 2564 => \true, 2571 => \true, 2572 => \true, 2573 => \true, 2574 => \true, 2577 => \true, 2578 => \true, 2601 => \true, 2609 => \true, 2612 => \true, 2615 => \true, 2618 => \true, 2619 => \true, 2621 => \true, 2627 => \true, 2628 => \true, 2629 => \true, 2630 => \true, 2633 => \true, 2634 => \true, 2638 => \true, 2639 => \true, 2640 => \true, 2642 => \true, 2643 => \true, 2644 => \true, 2645 => \true, 2646 => \true, 2647 => \true, 2648 => \true, 2653 => \true, 2655 => \true, 2656 => \true, 2657 => \true, 2658 => \true, 2659 => \true, 2660 => \true, 2661 => \true, 2679 => \true, 2680 => \true, 2681 => \true, 2682 => \true, 2683 => \true, 2684 => \true, 2685 => \true, 2686 => \true, 2687 => \true, 2688 => \true, 2692 => \true, 2702 => \true, 2706 => \true, 2729 => \true, 2737 => \true, 2740 => \true, 2746 => \true, 2747 => \true, 2758 => \true, 2762 => \true, 2766 => \true, 2767 => \true, 2769 => \true, 2770 => \true, 2771 => \true, 2772 => \true, 2773 => \true, 2774 => \true, 2775 => \true, 2776 => \true, 2777 => \true, 2778 => \true, 2779 => \true, 2780 => \true, 2781 => \true, 2782 => \true, 2783 => \true, 2788 => \true, 2789 => \true, 2802 => \true, 2803 => \true, 2804 => \true, 2805 => \true, 2806 => \true, 2807 => \true, 2808 => \true, 2816 => \true, 2820 => \true, 2829 => \true, 2830 => \true, 2833 => \true, 2834 => \true, 2857 => \true, 2865 => \true, 2868 => \true, 2874 => \true, 2875 => \true, 2885 => \true, 2886 => \true, 2889 => \true, 2890 => \true, 2894 => \true, 2895 => \true, 2896 => \true, 2897 => \true, 2898 => \true, 2899 => \true, 2900 => \true, 2904 => \true, 2905 => \true, 2906 => \true, 2907 => \true, 2910 => \true, 2916 => \true, 2917 => \true, 2936 => \true, 2937 => \true, 2938 => \true, 2939 => \true, 2940 => \true, 2941 => \true, 2942 => \true, 2943 => \true, 2944 => \true, 2945 => \true, 2948 => \true, 2955 => \true, 2956 => \true, 2957 => \true, 2961 => \true, 2966 => \true, 2967 => \true, 2968 => \true, 2971 => \true, 2973 => \true, 2976 => \true, 2977 => \true, 2978 => \true, 2981 => \true, 2982 => \true, 2983 => \true, 2987 => \true, 2988 => \true, 2989 => \true, 3002 => \true, 3003 => \true, 3004 => \true, 3005 => \true, 3011 => \true, 3012 => \true, 3013 => \true, 3017 => \true, 3022 => \true, 3023 => \true, 3025 => \true, 3026 => \true, 3027 => \true, 3028 => \true, 3029 => \true, 3030 => \true, 3032 => \true, 3033 => \true, 3034 => \true, 3035 => \true, 3036 => \true, 3037 => \true, 3038 => \true, 3039 => \true, 3040 => \true, 3041 => \true, 3042 => \true, 3043 => \true, 3044 => \true, 3045 => \true, 3067 => \true, 3068 => \true, 3069 => \true, 3070 => \true, 3071 => \true, 3085 => \true, 3089 => \true, 3113 => \true, 3130 => \true, 3131 => \true, 3132 => \true, 3141 => \true, 3145 => \true, 3150 => \true, 3151 => \true, 3152 => \true, 3153 => \true, 3154 => \true, 3155 => \true, 3156 => \true, 3159 => \true, 3163 => \true, 3164 => \true, 3165 => \true, 3166 => \true, 3167 => \true, 3172 => \true, 3173 => \true, 3184 => \true, 3185 => \true, 3186 => \true, 3187 => \true, 3188 => \true, 3189 => \true, 3190 => \true, 3213 => \true, 3217 => \true, 3241 => \true, 3252 => \true, 3258 => \true, 3259 => \true, 3269 => \true, 3273 => \true, 3278 => \true, 3279 => \true, 3280 => \true, 3281 => \true, 3282 => \true, 3283 => \true, 3284 => \true, 3287 => \true, 3288 => \true, 3289 => \true, 3290 => \true, 3291 => \true, 3292 => \true, 3293 => \true, 3295 => \true, 3300 => \true, 3301 => \true, 3312 => \true, 3315 => \true, 3316 => \true, 3317 => \true, 3318 => \true, 3319 => \true, 3320 => \true, 3321 => \true, 3322 => \true, 3323 => \true, 3324 => \true, 3325 => \true, 3326 => \true, 3327 => \true, 3341 => \true, 3345 => \true, 3397 => \true, 3401 => \true, 3408 => \true, 3409 => \true, 3410 => \true, 3411 => \true, 3428 => \true, 3429 => \true, 3456 => \true, 3460 => \true, 3479 => \true, 3480 => \true, 3481 => \true, 3506 => \true, 3516 => \true, 3518 => \true, 3519 => \true, 3527 => \true, 3528 => \true, 3529 => \true, 3531 => \true, 3532 => \true, 3533 => \true, 3534 => \true, 3541 => \true, 3543 => \true, 3552 => \true, 3553 => \true, 3554 => \true, 3555 => \true, 3556 => \true, 3557 => \true, 3568 => \true, 3569 => \true, 3573 => \true, 3574 => \true, 3575 => \true, 3576 => \true, 3577 => \true, 3578 => \true, 3579 => \true, 3580 => \true, 3581 => \true, 3582 => \true, 3583 => \true, 3584 => \true, 3643 => \true, 3644 => \true, 3645 => \true, 3646 => \true, 3715 => \true, 3717 => \true, 3723 => \true, 3748 => \true, 3750 => \true, 3774 => \true, 3775 => \true, 3781 => \true, 3783 => \true, 3790 => \true, 3791 => \true, 3802 => \true, 3803 => \true, 3912 => \true, 3949 => \true, 3950 => \true, 3951 => \true, 3952 => \true, 3992 => \true, 4029 => \true, 4045 => \true, 4294 => \true, 4296 => \true, 4297 => \true, 4298 => \true, 4299 => \true, 4300 => \true, 4302 => \true, 4303 => \true, 4447 => \true, 4448 => \true, 4681 => \true, 4686 => \true, 4687 => \true, 4695 => \true, 4697 => \true, 4702 => \true, 4703 => \true, 4745 => \true, 4750 => \true, 4751 => \true, 4785 => \true, 4790 => \true, 4791 => \true, 4799 => \true, 4801 => \true, 4806 => \true, 4807 => \true, 4823 => \true, 4881 => \true, 4886 => \true, 4887 => \true, 4955 => \true, 4956 => \true, 4989 => \true, 4990 => \true, 4991 => \true, 5018 => \true, 5019 => \true, 5020 => \true, 5021 => \true, 5022 => \true, 5023 => \true, 5110 => \true, 5111 => \true, 5118 => \true, 5119 => \true, 5760 => \true, 5789 => \true, 5790 => \true, 5791 => \true, 5881 => \true, 5882 => \true, 5883 => \true, 5884 => \true, 5885 => \true, 5886 => \true, 5887 => \true, 5901 => \true, 5909 => \true, 5910 => \true, 5911 => \true, 5912 => \true, 5913 => \true, 5914 => \true, 5915 => \true, 5916 => \true, 5917 => \true, 5918 => \true, 5919 => \true, 5943 => \true, 5944 => \true, 5945 => \true, 5946 => \true, 5947 => \true, 5948 => \true, 5949 => \true, 5950 => \true, 5951 => \true, 5972 => \true, 5973 => \true, 5974 => \true, 5975 => \true, 5976 => \true, 5977 => \true, 5978 => \true, 5979 => \true, 5980 => \true, 5981 => \true, 5982 => \true, 5983 => \true, 5997 => \true, 6001 => \true, 6004 => \true, 6005 => \true, 6006 => \true, 6007 => \true, 6008 => \true, 6009 => \true, 6010 => \true, 6011 => \true, 6012 => \true, 6013 => \true, 6014 => \true, 6015 => \true, 6068 => \true, 6069 => \true, 6110 => \true, 6111 => \true, 6122 => \true, 6123 => \true, 6124 => \true, 6125 => \true, 6126 => \true, 6127 => \true, 6138 => \true, 6139 => \true, 6140 => \true, 6141 => \true, 6142 => \true, 6143 => \true, 6150 => \true, 6158 => \true, 6159 => \true, 6170 => \true, 6171 => \true, 6172 => \true, 6173 => \true, 6174 => \true, 6175 => \true, 6265 => \true, 6266 => \true, 6267 => \true, 6268 => \true, 6269 => \true, 6270 => \true, 6271 => \true, 6315 => \true, 6316 => \true, 6317 => \true, 6318 => \true, 6319 => \true, 6390 => \true, 6391 => \true, 6392 => \true, 6393 => \true, 6394 => \true, 6395 => \true, 6396 => \true, 6397 => \true, 6398 => \true, 6399 => \true, 6431 => \true, 6444 => \true, 6445 => \true, 6446 => \true, 6447 => \true, 6460 => \true, 6461 => \true, 6462 => \true, 6463 => \true, 6465 => \true, 6466 => \true, 6467 => \true, 6510 => \true, 6511 => \true, 6517 => \true, 6518 => \true, 6519 => \true, 6520 => \true, 6521 => \true, 6522 => \true, 6523 => \true, 6524 => \true, 6525 => \true, 6526 => \true, 6527 => \true, 6572 => \true, 6573 => \true, 6574 => \true, 6575 => \true, 6602 => \true, 6603 => \true, 6604 => \true, 6605 => \true, 6606 => \true, 6607 => \true, 6619 => \true, 6620 => \true, 6621 => \true, 6684 => \true, 6685 => \true, 6751 => \true, 6781 => \true, 6782 => \true, 6794 => \true, 6795 => \true, 6796 => \true, 6797 => \true, 6798 => \true, 6799 => \true, 6810 => \true, 6811 => \true, 6812 => \true, 6813 => \true, 6814 => \true, 6815 => \true, 6830 => \true, 6831 => \true, 6988 => \true, 6989 => \true, 6990 => \true, 6991 => \true, 7037 => \true, 7038 => \true, 7039 => \true, 7156 => \true, 7157 => \true, 7158 => \true, 7159 => \true, 7160 => \true, 7161 => \true, 7162 => \true, 7163 => \true, 7224 => \true, 7225 => \true, 7226 => \true, 7242 => \true, 7243 => \true, 7244 => \true, 7305 => \true, 7306 => \true, 7307 => \true, 7308 => \true, 7309 => \true, 7310 => \true, 7311 => \true, 7355 => \true, 7356 => \true, 7368 => \true, 7369 => \true, 7370 => \true, 7371 => \true, 7372 => \true, 7373 => \true, 7374 => \true, 7375 => \true, 7419 => \true, 7420 => \true, 7421 => \true, 7422 => \true, 7423 => \true, 7674 => \true, 7958 => \true, 7959 => \true, 7966 => \true, 7967 => \true, 8006 => \true, 8007 => \true, 8014 => \true, 8015 => \true, 8024 => \true, 8026 => \true, 8028 => \true, 8030 => \true, 8062 => \true, 8063 => \true, 8117 => \true, 8133 => \true, 8148 => \true, 8149 => \true, 8156 => \true, 8176 => \true, 8177 => \true, 8181 => \true, 8191 => \true, 8206 => \true, 8207 => \true, 8228 => \true, 8229 => \true, 8230 => \true, 8232 => \true, 8233 => \true, 8234 => \true, 8235 => \true, 8236 => \true, 8237 => \true, 8238 => \true, 8289 => \true, 8290 => \true, 8291 => \true, 8293 => \true, 8294 => \true, 8295 => \true, 8296 => \true, 8297 => \true, 8298 => \true, 8299 => \true, 8300 => \true, 8301 => \true, 8302 => \true, 8303 => \true, 8306 => \true, 8307 => \true, 8335 => \true, 8349 => \true, 8350 => \true, 8351 => \true, 8384 => \true, 8385 => \true, 8386 => \true, 8387 => \true, 8388 => \true, 8389 => \true, 8390 => \true, 8391 => \true, 8392 => \true, 8393 => \true, 8394 => \true, 8395 => \true, 8396 => \true, 8397 => \true, 8398 => \true, 8399 => \true, 8433 => \true, 8434 => \true, 8435 => \true, 8436 => \true, 8437 => \true, 8438 => \true, 8439 => \true, 8440 => \true, 8441 => \true, 8442 => \true, 8443 => \true, 8444 => \true, 8445 => \true, 8446 => \true, 8447 => \true, 8498 => \true, 8579 => \true, 8588 => \true, 8589 => \true, 8590 => \true, 8591 => \true, 9255 => \true, 9256 => \true, 9257 => \true, 9258 => \true, 9259 => \true, 9260 => \true, 9261 => \true, 9262 => \true, 9263 => \true, 9264 => \true, 9265 => \true, 9266 => \true, 9267 => \true, 9268 => \true, 9269 => \true, 9270 => \true, 9271 => \true, 9272 => \true, 9273 => \true, 9274 => \true, 9275 => \true, 9276 => \true, 9277 => \true, 9278 => \true, 9279 => \true, 9291 => \true, 9292 => \true, 9293 => \true, 9294 => \true, 9295 => \true, 9296 => \true, 9297 => \true, 9298 => \true, 9299 => \true, 9300 => \true, 9301 => \true, 9302 => \true, 9303 => \true, 9304 => \true, 9305 => \true, 9306 => \true, 9307 => \true, 9308 => \true, 9309 => \true, 9310 => \true, 9311 => \true, 9352 => \true, 9353 => \true, 9354 => \true, 9355 => \true, 9356 => \true, 9357 => \true, 9358 => \true, 9359 => \true, 9360 => \true, 9361 => \true, 9362 => \true, 9363 => \true, 9364 => \true, 9365 => \true, 9366 => \true, 9367 => \true, 9368 => \true, 9369 => \true, 9370 => \true, 9371 => \true, 11124 => \true, 11125 => \true, 11158 => \true, 11311 => \true, 11359 => \true, 11508 => \true, 11509 => \true, 11510 => \true, 11511 => \true, 11512 => \true, 11558 => \true, 11560 => \true, 11561 => \true, 11562 => \true, 11563 => \true, 11564 => \true, 11566 => \true, 11567 => \true, 11624 => \true, 11625 => \true, 11626 => \true, 11627 => \true, 11628 => \true, 11629 => \true, 11630 => \true, 11633 => \true, 11634 => \true, 11635 => \true, 11636 => \true, 11637 => \true, 11638 => \true, 11639 => \true, 11640 => \true, 11641 => \true, 11642 => \true, 11643 => \true, 11644 => \true, 11645 => \true, 11646 => \true, 11671 => \true, 11672 => \true, 11673 => \true, 11674 => \true, 11675 => \true, 11676 => \true, 11677 => \true, 11678 => \true, 11679 => \true, 11687 => \true, 11695 => \true, 11703 => \true, 11711 => \true, 11719 => \true, 11727 => \true, 11735 => \true, 11743 => \true, 11930 => \true, 12020 => \true, 12021 => \true, 12022 => \true, 12023 => \true, 12024 => \true, 12025 => \true, 12026 => \true, 12027 => \true, 12028 => \true, 12029 => \true, 12030 => \true, 12031 => \true, 12246 => \true, 12247 => \true, 12248 => \true, 12249 => \true, 12250 => \true, 12251 => \true, 12252 => \true, 12253 => \true, 12254 => \true, 12255 => \true, 12256 => \true, 12257 => \true, 12258 => \true, 12259 => \true, 12260 => \true, 12261 => \true, 12262 => \true, 12263 => \true, 12264 => \true, 12265 => \true, 12266 => \true, 12267 => \true, 12268 => \true, 12269 => \true, 12270 => \true, 12271 => \true, 12272 => \true, 12273 => \true, 12274 => \true, 12275 => \true, 12276 => \true, 12277 => \true, 12278 => \true, 12279 => \true, 12280 => \true, 12281 => \true, 12282 => \true, 12283 => \true, 12284 => \true, 12285 => \true, 12286 => \true, 12287 => \true, 12352 => \true, 12439 => \true, 12440 => \true, 12544 => \true, 12545 => \true, 12546 => \true, 12547 => \true, 12548 => \true, 12592 => \true, 12644 => \true, 12687 => \true, 12772 => \true, 12773 => \true, 12774 => \true, 12775 => \true, 12776 => \true, 12777 => \true, 12778 => \true, 12779 => \true, 12780 => \true, 12781 => \true, 12782 => \true, 12783 => \true, 12831 => \true, 13250 => \true, 13255 => \true, 13272 => \true, 40957 => \true, 40958 => \true, 40959 => \true, 42125 => \true, 42126 => \true, 42127 => \true, 42183 => \true, 42184 => \true, 42185 => \true, 42186 => \true, 42187 => \true, 42188 => \true, 42189 => \true, 42190 => \true, 42191 => \true, 42540 => \true, 42541 => \true, 42542 => \true, 42543 => \true, 42544 => \true, 42545 => \true, 42546 => \true, 42547 => \true, 42548 => \true, 42549 => \true, 42550 => \true, 42551 => \true, 42552 => \true, 42553 => \true, 42554 => \true, 42555 => \true, 42556 => \true, 42557 => \true, 42558 => \true, 42559 => \true, 42744 => \true, 42745 => \true, 42746 => \true, 42747 => \true, 42748 => \true, 42749 => \true, 42750 => \true, 42751 => \true, 42944 => \true, 42945 => \true, 43053 => \true, 43054 => \true, 43055 => \true, 43066 => \true, 43067 => \true, 43068 => \true, 43069 => \true, 43070 => \true, 43071 => \true, 43128 => \true, 43129 => \true, 43130 => \true, 43131 => \true, 43132 => \true, 43133 => \true, 43134 => \true, 43135 => \true, 43206 => \true, 43207 => \true, 43208 => \true, 43209 => \true, 43210 => \true, 43211 => \true, 43212 => \true, 43213 => \true, 43226 => \true, 43227 => \true, 43228 => \true, 43229 => \true, 43230 => \true, 43231 => \true, 43348 => \true, 43349 => \true, 43350 => \true, 43351 => \true, 43352 => \true, 43353 => \true, 43354 => \true, 43355 => \true, 43356 => \true, 43357 => \true, 43358 => \true, 43389 => \true, 43390 => \true, 43391 => \true, 43470 => \true, 43482 => \true, 43483 => \true, 43484 => \true, 43485 => \true, 43519 => \true, 43575 => \true, 43576 => \true, 43577 => \true, 43578 => \true, 43579 => \true, 43580 => \true, 43581 => \true, 43582 => \true, 43583 => \true, 43598 => \true, 43599 => \true, 43610 => \true, 43611 => \true, 43715 => \true, 43716 => \true, 43717 => \true, 43718 => \true, 43719 => \true, 43720 => \true, 43721 => \true, 43722 => \true, 43723 => \true, 43724 => \true, 43725 => \true, 43726 => \true, 43727 => \true, 43728 => \true, 43729 => \true, 43730 => \true, 43731 => \true, 43732 => \true, 43733 => \true, 43734 => \true, 43735 => \true, 43736 => \true, 43737 => \true, 43738 => \true, 43767 => \true, 43768 => \true, 43769 => \true, 43770 => \true, 43771 => \true, 43772 => \true, 43773 => \true, 43774 => \true, 43775 => \true, 43776 => \true, 43783 => \true, 43784 => \true, 43791 => \true, 43792 => \true, 43799 => \true, 43800 => \true, 43801 => \true, 43802 => \true, 43803 => \true, 43804 => \true, 43805 => \true, 43806 => \true, 43807 => \true, 43815 => \true, 43823 => \true, 43884 => \true, 43885 => \true, 43886 => \true, 43887 => \true, 44014 => \true, 44015 => \true, 44026 => \true, 44027 => \true, 44028 => \true, 44029 => \true, 44030 => \true, 44031 => \true, 55204 => \true, 55205 => \true, 55206 => \true, 55207 => \true, 55208 => \true, 55209 => \true, 55210 => \true, 55211 => \true, 55212 => \true, 55213 => \true, 55214 => \true, 55215 => \true, 55239 => \true, 55240 => \true, 55241 => \true, 55242 => \true, 55292 => \true, 55293 => \true, 55294 => \true, 55295 => \true, 64110 => \true, 64111 => \true, 64263 => \true, 64264 => \true, 64265 => \true, 64266 => \true, 64267 => \true, 64268 => \true, 64269 => \true, 64270 => \true, 64271 => \true, 64272 => \true, 64273 => \true, 64274 => \true, 64280 => \true, 64281 => \true, 64282 => \true, 64283 => \true, 64284 => \true, 64311 => \true, 64317 => \true, 64319 => \true, 64322 => \true, 64325 => \true, 64450 => \true, 64451 => \true, 64452 => \true, 64453 => \true, 64454 => \true, 64455 => \true, 64456 => \true, 64457 => \true, 64458 => \true, 64459 => \true, 64460 => \true, 64461 => \true, 64462 => \true, 64463 => \true, 64464 => \true, 64465 => \true, 64466 => \true, 64832 => \true, 64833 => \true, 64834 => \true, 64835 => \true, 64836 => \true, 64837 => \true, 64838 => \true, 64839 => \true, 64840 => \true, 64841 => \true, 64842 => \true, 64843 => \true, 64844 => \true, 64845 => \true, 64846 => \true, 64847 => \true, 64912 => \true, 64913 => \true, 64968 => \true, 64969 => \true, 64970 => \true, 64971 => \true, 64972 => \true, 64973 => \true, 64974 => \true, 64975 => \true, 65022 => \true, 65023 => \true, 65042 => \true, 65049 => \true, 65050 => \true, 65051 => \true, 65052 => \true, 65053 => \true, 65054 => \true, 65055 => \true, 65072 => \true, 65106 => \true, 65107 => \true, 65127 => \true, 65132 => \true, 65133 => \true, 65134 => \true, 65135 => \true, 65141 => \true, 65277 => \true, 65278 => \true, 65280 => \true, 65440 => \true, 65471 => \true, 65472 => \true, 65473 => \true, 65480 => \true, 65481 => \true, 65488 => \true, 65489 => \true, 65496 => \true, 65497 => \true, 65501 => \true, 65502 => \true, 65503 => \true, 65511 => \true, 65519 => \true, 65520 => \true, 65521 => \true, 65522 => \true, 65523 => \true, 65524 => \true, 65525 => \true, 65526 => \true, 65527 => \true, 65528 => \true, 65529 => \true, 65530 => \true, 65531 => \true, 65532 => \true, 65533 => \true, 65534 => \true, 65535 => \true, 65548 => \true, 65575 => \true, 65595 => \true, 65598 => \true, 65614 => \true, 65615 => \true, 65787 => \true, 65788 => \true, 65789 => \true, 65790 => \true, 65791 => \true, 65795 => \true, 65796 => \true, 65797 => \true, 65798 => \true, 65844 => \true, 65845 => \true, 65846 => \true, 65935 => \true, 65949 => \true, 65950 => \true, 65951 => \true, 66205 => \true, 66206 => \true, 66207 => \true, 66257 => \true, 66258 => \true, 66259 => \true, 66260 => \true, 66261 => \true, 66262 => \true, 66263 => \true, 66264 => \true, 66265 => \true, 66266 => \true, 66267 => \true, 66268 => \true, 66269 => \true, 66270 => \true, 66271 => \true, 66300 => \true, 66301 => \true, 66302 => \true, 66303 => \true, 66340 => \true, 66341 => \true, 66342 => \true, 66343 => \true, 66344 => \true, 66345 => \true, 66346 => \true, 66347 => \true, 66348 => \true, 66379 => \true, 66380 => \true, 66381 => \true, 66382 => \true, 66383 => \true, 66427 => \true, 66428 => \true, 66429 => \true, 66430 => \true, 66431 => \true, 66462 => \true, 66500 => \true, 66501 => \true, 66502 => \true, 66503 => \true, 66718 => \true, 66719 => \true, 66730 => \true, 66731 => \true, 66732 => \true, 66733 => \true, 66734 => \true, 66735 => \true, 66772 => \true, 66773 => \true, 66774 => \true, 66775 => \true, 66812 => \true, 66813 => \true, 66814 => \true, 66815 => \true, 66856 => \true, 66857 => \true, 66858 => \true, 66859 => \true, 66860 => \true, 66861 => \true, 66862 => \true, 66863 => \true, 66916 => \true, 66917 => \true, 66918 => \true, 66919 => \true, 66920 => \true, 66921 => \true, 66922 => \true, 66923 => \true, 66924 => \true, 66925 => \true, 66926 => \true, 67383 => \true, 67384 => \true, 67385 => \true, 67386 => \true, 67387 => \true, 67388 => \true, 67389 => \true, 67390 => \true, 67391 => \true, 67414 => \true, 67415 => \true, 67416 => \true, 67417 => \true, 67418 => \true, 67419 => \true, 67420 => \true, 67421 => \true, 67422 => \true, 67423 => \true, 67590 => \true, 67591 => \true, 67593 => \true, 67638 => \true, 67641 => \true, 67642 => \true, 67643 => \true, 67645 => \true, 67646 => \true, 67670 => \true, 67743 => \true, 67744 => \true, 67745 => \true, 67746 => \true, 67747 => \true, 67748 => \true, 67749 => \true, 67750 => \true, 67827 => \true, 67830 => \true, 67831 => \true, 67832 => \true, 67833 => \true, 67834 => \true, 67868 => \true, 67869 => \true, 67870 => \true, 67898 => \true, 67899 => \true, 67900 => \true, 67901 => \true, 67902 => \true, 68024 => \true, 68025 => \true, 68026 => \true, 68027 => \true, 68048 => \true, 68049 => \true, 68100 => \true, 68103 => \true, 68104 => \true, 68105 => \true, 68106 => \true, 68107 => \true, 68116 => \true, 68120 => \true, 68150 => \true, 68151 => \true, 68155 => \true, 68156 => \true, 68157 => \true, 68158 => \true, 68169 => \true, 68170 => \true, 68171 => \true, 68172 => \true, 68173 => \true, 68174 => \true, 68175 => \true, 68185 => \true, 68186 => \true, 68187 => \true, 68188 => \true, 68189 => \true, 68190 => \true, 68191 => \true, 68327 => \true, 68328 => \true, 68329 => \true, 68330 => \true, 68343 => \true, 68344 => \true, 68345 => \true, 68346 => \true, 68347 => \true, 68348 => \true, 68349 => \true, 68350 => \true, 68351 => \true, 68406 => \true, 68407 => \true, 68408 => \true, 68438 => \true, 68439 => \true, 68467 => \true, 68468 => \true, 68469 => \true, 68470 => \true, 68471 => \true, 68498 => \true, 68499 => \true, 68500 => \true, 68501 => \true, 68502 => \true, 68503 => \true, 68504 => \true, 68509 => \true, 68510 => \true, 68511 => \true, 68512 => \true, 68513 => \true, 68514 => \true, 68515 => \true, 68516 => \true, 68517 => \true, 68518 => \true, 68519 => \true, 68520 => \true, 68787 => \true, 68788 => \true, 68789 => \true, 68790 => \true, 68791 => \true, 68792 => \true, 68793 => \true, 68794 => \true, 68795 => \true, 68796 => \true, 68797 => \true, 68798 => \true, 68799 => \true, 68851 => \true, 68852 => \true, 68853 => \true, 68854 => \true, 68855 => \true, 68856 => \true, 68857 => \true, 68904 => \true, 68905 => \true, 68906 => \true, 68907 => \true, 68908 => \true, 68909 => \true, 68910 => \true, 68911 => \true, 69247 => \true, 69290 => \true, 69294 => \true, 69295 => \true, 69416 => \true, 69417 => \true, 69418 => \true, 69419 => \true, 69420 => \true, 69421 => \true, 69422 => \true, 69423 => \true, 69580 => \true, 69581 => \true, 69582 => \true, 69583 => \true, 69584 => \true, 69585 => \true, 69586 => \true, 69587 => \true, 69588 => \true, 69589 => \true, 69590 => \true, 69591 => \true, 69592 => \true, 69593 => \true, 69594 => \true, 69595 => \true, 69596 => \true, 69597 => \true, 69598 => \true, 69599 => \true, 69623 => \true, 69624 => \true, 69625 => \true, 69626 => \true, 69627 => \true, 69628 => \true, 69629 => \true, 69630 => \true, 69631 => \true, 69710 => \true, 69711 => \true, 69712 => \true, 69713 => \true, 69744 => \true, 69745 => \true, 69746 => \true, 69747 => \true, 69748 => \true, 69749 => \true, 69750 => \true, 69751 => \true, 69752 => \true, 69753 => \true, 69754 => \true, 69755 => \true, 69756 => \true, 69757 => \true, 69758 => \true, 69821 => \true, 69826 => \true, 69827 => \true, 69828 => \true, 69829 => \true, 69830 => \true, 69831 => \true, 69832 => \true, 69833 => \true, 69834 => \true, 69835 => \true, 69836 => \true, 69837 => \true, 69838 => \true, 69839 => \true, 69865 => \true, 69866 => \true, 69867 => \true, 69868 => \true, 69869 => \true, 69870 => \true, 69871 => \true, 69882 => \true, 69883 => \true, 69884 => \true, 69885 => \true, 69886 => \true, 69887 => \true, 69941 => \true, 69960 => \true, 69961 => \true, 69962 => \true, 69963 => \true, 69964 => \true, 69965 => \true, 69966 => \true, 69967 => \true, 70007 => \true, 70008 => \true, 70009 => \true, 70010 => \true, 70011 => \true, 70012 => \true, 70013 => \true, 70014 => \true, 70015 => \true, 70112 => \true, 70133 => \true, 70134 => \true, 70135 => \true, 70136 => \true, 70137 => \true, 70138 => \true, 70139 => \true, 70140 => \true, 70141 => \true, 70142 => \true, 70143 => \true, 70162 => \true, 70279 => \true, 70281 => \true, 70286 => \true, 70302 => \true, 70314 => \true, 70315 => \true, 70316 => \true, 70317 => \true, 70318 => \true, 70319 => \true, 70379 => \true, 70380 => \true, 70381 => \true, 70382 => \true, 70383 => \true, 70394 => \true, 70395 => \true, 70396 => \true, 70397 => \true, 70398 => \true, 70399 => \true, 70404 => \true, 70413 => \true, 70414 => \true, 70417 => \true, 70418 => \true, 70441 => \true, 70449 => \true, 70452 => \true, 70458 => \true, 70469 => \true, 70470 => \true, 70473 => \true, 70474 => \true, 70478 => \true, 70479 => \true, 70481 => \true, 70482 => \true, 70483 => \true, 70484 => \true, 70485 => \true, 70486 => \true, 70488 => \true, 70489 => \true, 70490 => \true, 70491 => \true, 70492 => \true, 70500 => \true, 70501 => \true, 70509 => \true, 70510 => \true, 70511 => \true, 70748 => \true, 70754 => \true, 70755 => \true, 70756 => \true, 70757 => \true, 70758 => \true, 70759 => \true, 70760 => \true, 70761 => \true, 70762 => \true, 70763 => \true, 70764 => \true, 70765 => \true, 70766 => \true, 70767 => \true, 70768 => \true, 70769 => \true, 70770 => \true, 70771 => \true, 70772 => \true, 70773 => \true, 70774 => \true, 70775 => \true, 70776 => \true, 70777 => \true, 70778 => \true, 70779 => \true, 70780 => \true, 70781 => \true, 70782 => \true, 70783 => \true, 70856 => \true, 70857 => \true, 70858 => \true, 70859 => \true, 70860 => \true, 70861 => \true, 70862 => \true, 70863 => \true, 71094 => \true, 71095 => \true, 71237 => \true, 71238 => \true, 71239 => \true, 71240 => \true, 71241 => \true, 71242 => \true, 71243 => \true, 71244 => \true, 71245 => \true, 71246 => \true, 71247 => \true, 71258 => \true, 71259 => \true, 71260 => \true, 71261 => \true, 71262 => \true, 71263 => \true, 71277 => \true, 71278 => \true, 71279 => \true, 71280 => \true, 71281 => \true, 71282 => \true, 71283 => \true, 71284 => \true, 71285 => \true, 71286 => \true, 71287 => \true, 71288 => \true, 71289 => \true, 71290 => \true, 71291 => \true, 71292 => \true, 71293 => \true, 71294 => \true, 71295 => \true, 71353 => \true, 71354 => \true, 71355 => \true, 71356 => \true, 71357 => \true, 71358 => \true, 71359 => \true, 71451 => \true, 71452 => \true, 71468 => \true, 71469 => \true, 71470 => \true, 71471 => \true, 71923 => \true, 71924 => \true, 71925 => \true, 71926 => \true, 71927 => \true, 71928 => \true, 71929 => \true, 71930 => \true, 71931 => \true, 71932 => \true, 71933 => \true, 71934 => \true, 71943 => \true, 71944 => \true, 71946 => \true, 71947 => \true, 71956 => \true, 71959 => \true, 71990 => \true, 71993 => \true, 71994 => \true, 72007 => \true, 72008 => \true, 72009 => \true, 72010 => \true, 72011 => \true, 72012 => \true, 72013 => \true, 72014 => \true, 72015 => \true, 72104 => \true, 72105 => \true, 72152 => \true, 72153 => \true, 72165 => \true, 72166 => \true, 72167 => \true, 72168 => \true, 72169 => \true, 72170 => \true, 72171 => \true, 72172 => \true, 72173 => \true, 72174 => \true, 72175 => \true, 72176 => \true, 72177 => \true, 72178 => \true, 72179 => \true, 72180 => \true, 72181 => \true, 72182 => \true, 72183 => \true, 72184 => \true, 72185 => \true, 72186 => \true, 72187 => \true, 72188 => \true, 72189 => \true, 72190 => \true, 72191 => \true, 72264 => \true, 72265 => \true, 72266 => \true, 72267 => \true, 72268 => \true, 72269 => \true, 72270 => \true, 72271 => \true, 72355 => \true, 72356 => \true, 72357 => \true, 72358 => \true, 72359 => \true, 72360 => \true, 72361 => \true, 72362 => \true, 72363 => \true, 72364 => \true, 72365 => \true, 72366 => \true, 72367 => \true, 72368 => \true, 72369 => \true, 72370 => \true, 72371 => \true, 72372 => \true, 72373 => \true, 72374 => \true, 72375 => \true, 72376 => \true, 72377 => \true, 72378 => \true, 72379 => \true, 72380 => \true, 72381 => \true, 72382 => \true, 72383 => \true, 72713 => \true, 72759 => \true, 72774 => \true, 72775 => \true, 72776 => \true, 72777 => \true, 72778 => \true, 72779 => \true, 72780 => \true, 72781 => \true, 72782 => \true, 72783 => \true, 72813 => \true, 72814 => \true, 72815 => \true, 72848 => \true, 72849 => \true, 72872 => \true, 72967 => \true, 72970 => \true, 73015 => \true, 73016 => \true, 73017 => \true, 73019 => \true, 73022 => \true, 73032 => \true, 73033 => \true, 73034 => \true, 73035 => \true, 73036 => \true, 73037 => \true, 73038 => \true, 73039 => \true, 73050 => \true, 73051 => \true, 73052 => \true, 73053 => \true, 73054 => \true, 73055 => \true, 73062 => \true, 73065 => \true, 73103 => \true, 73106 => \true, 73113 => \true, 73114 => \true, 73115 => \true, 73116 => \true, 73117 => \true, 73118 => \true, 73119 => \true, 73649 => \true, 73650 => \true, 73651 => \true, 73652 => \true, 73653 => \true, 73654 => \true, 73655 => \true, 73656 => \true, 73657 => \true, 73658 => \true, 73659 => \true, 73660 => \true, 73661 => \true, 73662 => \true, 73663 => \true, 73714 => \true, 73715 => \true, 73716 => \true, 73717 => \true, 73718 => \true, 73719 => \true, 73720 => \true, 73721 => \true, 73722 => \true, 73723 => \true, 73724 => \true, 73725 => \true, 73726 => \true, 74863 => \true, 74869 => \true, 74870 => \true, 74871 => \true, 74872 => \true, 74873 => \true, 74874 => \true, 74875 => \true, 74876 => \true, 74877 => \true, 74878 => \true, 74879 => \true, 78895 => \true, 78896 => \true, 78897 => \true, 78898 => \true, 78899 => \true, 78900 => \true, 78901 => \true, 78902 => \true, 78903 => \true, 78904 => \true, 92729 => \true, 92730 => \true, 92731 => \true, 92732 => \true, 92733 => \true, 92734 => \true, 92735 => \true, 92767 => \true, 92778 => \true, 92779 => \true, 92780 => \true, 92781 => \true, 92910 => \true, 92911 => \true, 92918 => \true, 92919 => \true, 92920 => \true, 92921 => \true, 92922 => \true, 92923 => \true, 92924 => \true, 92925 => \true, 92926 => \true, 92927 => \true, 92998 => \true, 92999 => \true, 93000 => \true, 93001 => \true, 93002 => \true, 93003 => \true, 93004 => \true, 93005 => \true, 93006 => \true, 93007 => \true, 93018 => \true, 93026 => \true, 93048 => \true, 93049 => \true, 93050 => \true, 93051 => \true, 93052 => \true, 94027 => \true, 94028 => \true, 94029 => \true, 94030 => \true, 94088 => \true, 94089 => \true, 94090 => \true, 94091 => \true, 94092 => \true, 94093 => \true, 94094 => \true, 94181 => \true, 94182 => \true, 94183 => \true, 94184 => \true, 94185 => \true, 94186 => \true, 94187 => \true, 94188 => \true, 94189 => \true, 94190 => \true, 94191 => \true, 94194 => \true, 94195 => \true, 94196 => \true, 94197 => \true, 94198 => \true, 94199 => \true, 94200 => \true, 94201 => \true, 94202 => \true, 94203 => \true, 94204 => \true, 94205 => \true, 94206 => \true, 94207 => \true, 100344 => \true, 100345 => \true, 100346 => \true, 100347 => \true, 100348 => \true, 100349 => \true, 100350 => \true, 100351 => \true, 110931 => \true, 110932 => \true, 110933 => \true, 110934 => \true, 110935 => \true, 110936 => \true, 110937 => \true, 110938 => \true, 110939 => \true, 110940 => \true, 110941 => \true, 110942 => \true, 110943 => \true, 110944 => \true, 110945 => \true, 110946 => \true, 110947 => \true, 110952 => \true, 110953 => \true, 110954 => \true, 110955 => \true, 110956 => \true, 110957 => \true, 110958 => \true, 110959 => \true, 113771 => \true, 113772 => \true, 113773 => \true, 113774 => \true, 113775 => \true, 113789 => \true, 113790 => \true, 113791 => \true, 113801 => \true, 113802 => \true, 113803 => \true, 113804 => \true, 113805 => \true, 113806 => \true, 113807 => \true, 113818 => \true, 113819 => \true, 119030 => \true, 119031 => \true, 119032 => \true, 119033 => \true, 119034 => \true, 119035 => \true, 119036 => \true, 119037 => \true, 119038 => \true, 119039 => \true, 119079 => \true, 119080 => \true, 119155 => \true, 119156 => \true, 119157 => \true, 119158 => \true, 119159 => \true, 119160 => \true, 119161 => \true, 119162 => \true, 119273 => \true, 119274 => \true, 119275 => \true, 119276 => \true, 119277 => \true, 119278 => \true, 119279 => \true, 119280 => \true, 119281 => \true, 119282 => \true, 119283 => \true, 119284 => \true, 119285 => \true, 119286 => \true, 119287 => \true, 119288 => \true, 119289 => \true, 119290 => \true, 119291 => \true, 119292 => \true, 119293 => \true, 119294 => \true, 119295 => \true, 119540 => \true, 119541 => \true, 119542 => \true, 119543 => \true, 119544 => \true, 119545 => \true, 119546 => \true, 119547 => \true, 119548 => \true, 119549 => \true, 119550 => \true, 119551 => \true, 119639 => \true, 119640 => \true, 119641 => \true, 119642 => \true, 119643 => \true, 119644 => \true, 119645 => \true, 119646 => \true, 119647 => \true, 119893 => \true, 119965 => \true, 119968 => \true, 119969 => \true, 119971 => \true, 119972 => \true, 119975 => \true, 119976 => \true, 119981 => \true, 119994 => \true, 119996 => \true, 120004 => \true, 120070 => \true, 120075 => \true, 120076 => \true, 120085 => \true, 120093 => \true, 120122 => \true, 120127 => \true, 120133 => \true, 120135 => \true, 120136 => \true, 120137 => \true, 120145 => \true, 120486 => \true, 120487 => \true, 120780 => \true, 120781 => \true, 121484 => \true, 121485 => \true, 121486 => \true, 121487 => \true, 121488 => \true, 121489 => \true, 121490 => \true, 121491 => \true, 121492 => \true, 121493 => \true, 121494 => \true, 121495 => \true, 121496 => \true, 121497 => \true, 121498 => \true, 121504 => \true, 122887 => \true, 122905 => \true, 122906 => \true, 122914 => \true, 122917 => \true, 123181 => \true, 123182 => \true, 123183 => \true, 123198 => \true, 123199 => \true, 123210 => \true, 123211 => \true, 123212 => \true, 123213 => \true, 123642 => \true, 123643 => \true, 123644 => \true, 123645 => \true, 123646 => \true, 125125 => \true, 125126 => \true, 125260 => \true, 125261 => \true, 125262 => \true, 125263 => \true, 125274 => \true, 125275 => \true, 125276 => \true, 125277 => \true, 126468 => \true, 126496 => \true, 126499 => \true, 126501 => \true, 126502 => \true, 126504 => \true, 126515 => \true, 126520 => \true, 126522 => \true, 126524 => \true, 126525 => \true, 126526 => \true, 126527 => \true, 126528 => \true, 126529 => \true, 126531 => \true, 126532 => \true, 126533 => \true, 126534 => \true, 126536 => \true, 126538 => \true, 126540 => \true, 126544 => \true, 126547 => \true, 126549 => \true, 126550 => \true, 126552 => \true, 126554 => \true, 126556 => \true, 126558 => \true, 126560 => \true, 126563 => \true, 126565 => \true, 126566 => \true, 126571 => \true, 126579 => \true, 126584 => \true, 126589 => \true, 126591 => \true, 126602 => \true, 126620 => \true, 126621 => \true, 126622 => \true, 126623 => \true, 126624 => \true, 126628 => \true, 126634 => \true, 127020 => \true, 127021 => \true, 127022 => \true, 127023 => \true, 127124 => \true, 127125 => \true, 127126 => \true, 127127 => \true, 127128 => \true, 127129 => \true, 127130 => \true, 127131 => \true, 127132 => \true, 127133 => \true, 127134 => \true, 127135 => \true, 127151 => \true, 127152 => \true, 127168 => \true, 127184 => \true, 127222 => \true, 127223 => \true, 127224 => \true, 127225 => \true, 127226 => \true, 127227 => \true, 127228 => \true, 127229 => \true, 127230 => \true, 127231 => \true, 127232 => \true, 127491 => \true, 127492 => \true, 127493 => \true, 127494 => \true, 127495 => \true, 127496 => \true, 127497 => \true, 127498 => \true, 127499 => \true, 127500 => \true, 127501 => \true, 127502 => \true, 127503 => \true, 127548 => \true, 127549 => \true, 127550 => \true, 127551 => \true, 127561 => \true, 127562 => \true, 127563 => \true, 127564 => \true, 127565 => \true, 127566 => \true, 127567 => \true, 127570 => \true, 127571 => \true, 127572 => \true, 127573 => \true, 127574 => \true, 127575 => \true, 127576 => \true, 127577 => \true, 127578 => \true, 127579 => \true, 127580 => \true, 127581 => \true, 127582 => \true, 127583 => \true, 128728 => \true, 128729 => \true, 128730 => \true, 128731 => \true, 128732 => \true, 128733 => \true, 128734 => \true, 128735 => \true, 128749 => \true, 128750 => \true, 128751 => \true, 128765 => \true, 128766 => \true, 128767 => \true, 128884 => \true, 128885 => \true, 128886 => \true, 128887 => \true, 128888 => \true, 128889 => \true, 128890 => \true, 128891 => \true, 128892 => \true, 128893 => \true, 128894 => \true, 128895 => \true, 128985 => \true, 128986 => \true, 128987 => \true, 128988 => \true, 128989 => \true, 128990 => \true, 128991 => \true, 129004 => \true, 129005 => \true, 129006 => \true, 129007 => \true, 129008 => \true, 129009 => \true, 129010 => \true, 129011 => \true, 129012 => \true, 129013 => \true, 129014 => \true, 129015 => \true, 129016 => \true, 129017 => \true, 129018 => \true, 129019 => \true, 129020 => \true, 129021 => \true, 129022 => \true, 129023 => \true, 129036 => \true, 129037 => \true, 129038 => \true, 129039 => \true, 129096 => \true, 129097 => \true, 129098 => \true, 129099 => \true, 129100 => \true, 129101 => \true, 129102 => \true, 129103 => \true, 129114 => \true, 129115 => \true, 129116 => \true, 129117 => \true, 129118 => \true, 129119 => \true, 129160 => \true, 129161 => \true, 129162 => \true, 129163 => \true, 129164 => \true, 129165 => \true, 129166 => \true, 129167 => \true, 129198 => \true, 129199 => \true, 129401 => \true, 129484 => \true, 129620 => \true, 129621 => \true, 129622 => \true, 129623 => \true, 129624 => \true, 129625 => \true, 129626 => \true, 129627 => \true, 129628 => \true, 129629 => \true, 129630 => \true, 129631 => \true, 129646 => \true, 129647 => \true, 129653 => \true, 129654 => \true, 129655 => \true, 129659 => \true, 129660 => \true, 129661 => \true, 129662 => \true, 129663 => \true, 129671 => \true, 129672 => \true, 129673 => \true, 129674 => \true, 129675 => \true, 129676 => \true, 129677 => \true, 129678 => \true, 129679 => \true, 129705 => \true, 129706 => \true, 129707 => \true, 129708 => \true, 129709 => \true, 129710 => \true, 129711 => \true, 129719 => \true, 129720 => \true, 129721 => \true, 129722 => \true, 129723 => \true, 129724 => \true, 129725 => \true, 129726 => \true, 129727 => \true, 129731 => \true, 129732 => \true, 129733 => \true, 129734 => \true, 129735 => \true, 129736 => \true, 129737 => \true, 129738 => \true, 129739 => \true, 129740 => \true, 129741 => \true, 129742 => \true, 129743 => \true, 129939 => \true, 131070 => \true, 131071 => \true, 177973 => \true, 177974 => \true, 177975 => \true, 177976 => \true, 177977 => \true, 177978 => \true, 177979 => \true, 177980 => \true, 177981 => \true, 177982 => \true, 177983 => \true, 178206 => \true, 178207 => \true, 183970 => \true, 183971 => \true, 183972 => \true, 183973 => \true, 183974 => \true, 183975 => \true, 183976 => \true, 183977 => \true, 183978 => \true, 183979 => \true, 183980 => \true, 183981 => \true, 183982 => \true, 183983 => \true, 194664 => \true, 194676 => \true, 194847 => \true, 194911 => \true, 195007 => \true, 196606 => \true, 196607 => \true, 262142 => \true, 262143 => \true, 327678 => \true, 327679 => \true, 393214 => \true, 393215 => \true, 458750 => \true, 458751 => \true, 524286 => \true, 524287 => \true, 589822 => \true, 589823 => \true, 655358 => \true, 655359 => \true, 720894 => \true, 720895 => \true, 786430 => \true, 786431 => \true, 851966 => \true, 851967 => \true, 917502 => \true, 917503 => \true, 917504 => \true, 917505 => \true, 917506 => \true, 917507 => \true, 917508 => \true, 917509 => \true, 917510 => \true, 917511 => \true, 917512 => \true, 917513 => \true, 917514 => \true, 917515 => \true, 917516 => \true, 917517 => \true, 917518 => \true, 917519 => \true, 917520 => \true, 917521 => \true, 917522 => \true, 917523 => \true, 917524 => \true, 917525 => \true, 917526 => \true, 917527 => \true, 917528 => \true, 917529 => \true, 917530 => \true, 917531 => \true, 917532 => \true, 917533 => \true, 917534 => \true, 917535 => \true, 983038 => \true, 983039 => \true, 1048574 => \true, 1048575 => \true, 1114110 => \true, 1114111 => \true); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/virama.php000064400000001374147600374260026257 0ustar00 9, 2509 => 9, 2637 => 9, 2765 => 9, 2893 => 9, 3021 => 9, 3149 => 9, 3277 => 9, 3387 => 9, 3388 => 9, 3405 => 9, 3530 => 9, 3642 => 9, 3770 => 9, 3972 => 9, 4153 => 9, 4154 => 9, 5908 => 9, 5940 => 9, 6098 => 9, 6752 => 9, 6980 => 9, 7082 => 9, 7083 => 9, 7154 => 9, 7155 => 9, 11647 => 9, 43014 => 9, 43052 => 9, 43204 => 9, 43347 => 9, 43456 => 9, 43766 => 9, 44013 => 9, 68159 => 9, 69702 => 9, 69759 => 9, 69817 => 9, 69939 => 9, 69940 => 9, 70080 => 9, 70197 => 9, 70378 => 9, 70477 => 9, 70722 => 9, 70850 => 9, 71103 => 9, 71231 => 9, 71350 => 9, 71467 => 9, 71737 => 9, 71997 => 9, 71998 => 9, 72160 => 9, 72244 => 9, 72263 => 9, 72345 => 9, 72767 => 9, 73028 => 9, 73029 => 9, 73111 => 9); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/mapped.php000064400000263120147600374260026245 0ustar00 'a', 66 => 'b', 67 => 'c', 68 => 'd', 69 => 'e', 70 => 'f', 71 => 'g', 72 => 'h', 73 => 'i', 74 => 'j', 75 => 'k', 76 => 'l', 77 => 'm', 78 => 'n', 79 => 'o', 80 => 'p', 81 => 'q', 82 => 'r', 83 => 's', 84 => 't', 85 => 'u', 86 => 'v', 87 => 'w', 88 => 'x', 89 => 'y', 90 => 'z', 170 => 'a', 178 => '2', 179 => '3', 181 => 'μ', 185 => '1', 186 => 'o', 188 => '1â„4', 189 => '1â„2', 190 => '3â„4', 192 => 'à', 193 => 'á', 194 => 'â', 195 => 'ã', 196 => 'ä', 197 => 'Ã¥', 198 => 'æ', 199 => 'ç', 200 => 'è', 201 => 'é', 202 => 'ê', 203 => 'ë', 204 => 'ì', 205 => 'í', 206 => 'î', 207 => 'ï', 208 => 'ð', 209 => 'ñ', 210 => 'ò', 211 => 'ó', 212 => 'ô', 213 => 'õ', 214 => 'ö', 216 => 'ø', 217 => 'ù', 218 => 'ú', 219 => 'û', 220 => 'ü', 221 => 'ý', 222 => 'þ', 256 => 'Ä', 258 => 'ă', 260 => 'Ä…', 262 => 'ć', 264 => 'ĉ', 266 => 'Ä‹', 268 => 'Ä', 270 => 'Ä', 272 => 'Ä‘', 274 => 'Ä“', 276 => 'Ä•', 278 => 'Ä—', 280 => 'Ä™', 282 => 'Ä›', 284 => 'Ä', 286 => 'ÄŸ', 288 => 'Ä¡', 290 => 'Ä£', 292 => 'Ä¥', 294 => 'ħ', 296 => 'Ä©', 298 => 'Ä«', 300 => 'Ä­', 302 => 'į', 304 => 'i̇', 306 => 'ij', 307 => 'ij', 308 => 'ĵ', 310 => 'Ä·', 313 => 'ĺ', 315 => 'ļ', 317 => 'ľ', 319 => 'l·', 320 => 'l·', 321 => 'Å‚', 323 => 'Å„', 325 => 'ņ', 327 => 'ň', 329 => 'ʼn', 330 => 'Å‹', 332 => 'Å', 334 => 'Å', 336 => 'Å‘', 338 => 'Å“', 340 => 'Å•', 342 => 'Å—', 344 => 'Å™', 346 => 'Å›', 348 => 'Å', 350 => 'ÅŸ', 352 => 'Å¡', 354 => 'Å£', 356 => 'Å¥', 358 => 'ŧ', 360 => 'Å©', 362 => 'Å«', 364 => 'Å­', 366 => 'ů', 368 => 'ű', 370 => 'ų', 372 => 'ŵ', 374 => 'Å·', 376 => 'ÿ', 377 => 'ź', 379 => 'ż', 381 => 'ž', 383 => 's', 385 => 'É“', 386 => 'ƃ', 388 => 'Æ…', 390 => 'É”', 391 => 'ƈ', 393 => 'É–', 394 => 'É—', 395 => 'ÆŒ', 398 => 'Ç', 399 => 'É™', 400 => 'É›', 401 => 'Æ’', 403 => 'É ', 404 => 'É£', 406 => 'É©', 407 => 'ɨ', 408 => 'Æ™', 412 => 'ɯ', 413 => 'ɲ', 415 => 'ɵ', 416 => 'Æ¡', 418 => 'Æ£', 420 => 'Æ¥', 422 => 'Ê€', 423 => 'ƨ', 425 => 'ʃ', 428 => 'Æ­', 430 => 'ʈ', 431 => 'Æ°', 433 => 'ÊŠ', 434 => 'Ê‹', 435 => 'Æ´', 437 => 'ƶ', 439 => 'Ê’', 440 => 'ƹ', 444 => 'ƽ', 452 => 'dž', 453 => 'dž', 454 => 'dž', 455 => 'lj', 456 => 'lj', 457 => 'lj', 458 => 'nj', 459 => 'nj', 460 => 'nj', 461 => 'ÇŽ', 463 => 'Ç', 465 => 'Ç’', 467 => 'Ç”', 469 => 'Ç–', 471 => 'ǘ', 473 => 'Çš', 475 => 'Çœ', 478 => 'ÇŸ', 480 => 'Ç¡', 482 => 'Ç£', 484 => 'Ç¥', 486 => 'ǧ', 488 => 'Ç©', 490 => 'Ç«', 492 => 'Ç­', 494 => 'ǯ', 497 => 'dz', 498 => 'dz', 499 => 'dz', 500 => 'ǵ', 502 => 'Æ•', 503 => 'Æ¿', 504 => 'ǹ', 506 => 'Ç»', 508 => 'ǽ', 510 => 'Ç¿', 512 => 'È', 514 => 'ȃ', 516 => 'È…', 518 => 'ȇ', 520 => 'ȉ', 522 => 'È‹', 524 => 'È', 526 => 'È', 528 => 'È‘', 530 => 'È“', 532 => 'È•', 534 => 'È—', 536 => 'È™', 538 => 'È›', 540 => 'È', 542 => 'ÈŸ', 544 => 'Æž', 546 => 'È£', 548 => 'È¥', 550 => 'ȧ', 552 => 'È©', 554 => 'È«', 556 => 'È­', 558 => 'ȯ', 560 => 'ȱ', 562 => 'ȳ', 570 => 'â±¥', 571 => 'ȼ', 573 => 'Æš', 574 => 'ⱦ', 577 => 'É‚', 579 => 'Æ€', 580 => 'ʉ', 581 => 'ÊŒ', 582 => 'ɇ', 584 => 'ɉ', 586 => 'É‹', 588 => 'É', 590 => 'É', 688 => 'h', 689 => 'ɦ', 690 => 'j', 691 => 'r', 692 => 'ɹ', 693 => 'É»', 694 => 'Ê', 695 => 'w', 696 => 'y', 736 => 'É£', 737 => 'l', 738 => 's', 739 => 'x', 740 => 'Ê•', 832 => 'Ì€', 833 => 'Ì', 835 => 'Ì“', 836 => '̈Ì', 837 => 'ι', 880 => 'ͱ', 882 => 'ͳ', 884 => 'ʹ', 886 => 'Í·', 895 => 'ϳ', 902 => 'ά', 903 => '·', 904 => 'έ', 905 => 'ή', 906 => 'ί', 908 => 'ÏŒ', 910 => 'Ï', 911 => 'ÏŽ', 913 => 'α', 914 => 'β', 915 => 'γ', 916 => 'δ', 917 => 'ε', 918 => 'ζ', 919 => 'η', 920 => 'θ', 921 => 'ι', 922 => 'κ', 923 => 'λ', 924 => 'μ', 925 => 'ν', 926 => 'ξ', 927 => 'ο', 928 => 'Ï€', 929 => 'Ï', 931 => 'σ', 932 => 'Ï„', 933 => 'Ï…', 934 => 'φ', 935 => 'χ', 936 => 'ψ', 937 => 'ω', 938 => 'ÏŠ', 939 => 'Ï‹', 975 => 'Ï—', 976 => 'β', 977 => 'θ', 978 => 'Ï…', 979 => 'Ï', 980 => 'Ï‹', 981 => 'φ', 982 => 'Ï€', 984 => 'Ï™', 986 => 'Ï›', 988 => 'Ï', 990 => 'ÏŸ', 992 => 'Ï¡', 994 => 'Ï£', 996 => 'Ï¥', 998 => 'ϧ', 1000 => 'Ï©', 1002 => 'Ï«', 1004 => 'Ï­', 1006 => 'ϯ', 1008 => 'κ', 1009 => 'Ï', 1010 => 'σ', 1012 => 'θ', 1013 => 'ε', 1015 => 'ϸ', 1017 => 'σ', 1018 => 'Ï»', 1021 => 'Í»', 1022 => 'ͼ', 1023 => 'ͽ', 1024 => 'Ñ', 1025 => 'Ñ‘', 1026 => 'Ñ’', 1027 => 'Ñ“', 1028 => 'Ñ”', 1029 => 'Ñ•', 1030 => 'Ñ–', 1031 => 'Ñ—', 1032 => 'ј', 1033 => 'Ñ™', 1034 => 'Ñš', 1035 => 'Ñ›', 1036 => 'Ñœ', 1037 => 'Ñ', 1038 => 'Ñž', 1039 => 'ÑŸ', 1040 => 'а', 1041 => 'б', 1042 => 'в', 1043 => 'г', 1044 => 'д', 1045 => 'е', 1046 => 'ж', 1047 => 'з', 1048 => 'и', 1049 => 'й', 1050 => 'к', 1051 => 'л', 1052 => 'м', 1053 => 'н', 1054 => 'о', 1055 => 'п', 1056 => 'Ñ€', 1057 => 'Ñ', 1058 => 'Ñ‚', 1059 => 'у', 1060 => 'Ñ„', 1061 => 'Ñ…', 1062 => 'ц', 1063 => 'ч', 1064 => 'ш', 1065 => 'щ', 1066 => 'ÑŠ', 1067 => 'Ñ‹', 1068 => 'ÑŒ', 1069 => 'Ñ', 1070 => 'ÑŽ', 1071 => 'Ñ', 1120 => 'Ñ¡', 1122 => 'Ñ£', 1124 => 'Ñ¥', 1126 => 'ѧ', 1128 => 'Ñ©', 1130 => 'Ñ«', 1132 => 'Ñ­', 1134 => 'ѯ', 1136 => 'ѱ', 1138 => 'ѳ', 1140 => 'ѵ', 1142 => 'Ñ·', 1144 => 'ѹ', 1146 => 'Ñ»', 1148 => 'ѽ', 1150 => 'Ñ¿', 1152 => 'Ò', 1162 => 'Ò‹', 1164 => 'Ò', 1166 => 'Ò', 1168 => 'Ò‘', 1170 => 'Ò“', 1172 => 'Ò•', 1174 => 'Ò—', 1176 => 'Ò™', 1178 => 'Ò›', 1180 => 'Ò', 1182 => 'ÒŸ', 1184 => 'Ò¡', 1186 => 'Ò£', 1188 => 'Ò¥', 1190 => 'Ò§', 1192 => 'Ò©', 1194 => 'Ò«', 1196 => 'Ò­', 1198 => 'Ò¯', 1200 => 'Ò±', 1202 => 'Ò³', 1204 => 'Òµ', 1206 => 'Ò·', 1208 => 'Ò¹', 1210 => 'Ò»', 1212 => 'Ò½', 1214 => 'Ò¿', 1217 => 'Ó‚', 1219 => 'Ó„', 1221 => 'Ó†', 1223 => 'Óˆ', 1225 => 'ÓŠ', 1227 => 'ÓŒ', 1229 => 'ÓŽ', 1232 => 'Ó‘', 1234 => 'Ó“', 1236 => 'Ó•', 1238 => 'Ó—', 1240 => 'Ó™', 1242 => 'Ó›', 1244 => 'Ó', 1246 => 'ÓŸ', 1248 => 'Ó¡', 1250 => 'Ó£', 1252 => 'Ó¥', 1254 => 'Ó§', 1256 => 'Ó©', 1258 => 'Ó«', 1260 => 'Ó­', 1262 => 'Ó¯', 1264 => 'Ó±', 1266 => 'Ó³', 1268 => 'Óµ', 1270 => 'Ó·', 1272 => 'Ó¹', 1274 => 'Ó»', 1276 => 'Ó½', 1278 => 'Ó¿', 1280 => 'Ô', 1282 => 'Ôƒ', 1284 => 'Ô…', 1286 => 'Ô‡', 1288 => 'Ô‰', 1290 => 'Ô‹', 1292 => 'Ô', 1294 => 'Ô', 1296 => 'Ô‘', 1298 => 'Ô“', 1300 => 'Ô•', 1302 => 'Ô—', 1304 => 'Ô™', 1306 => 'Ô›', 1308 => 'Ô', 1310 => 'ÔŸ', 1312 => 'Ô¡', 1314 => 'Ô£', 1316 => 'Ô¥', 1318 => 'Ô§', 1320 => 'Ô©', 1322 => 'Ô«', 1324 => 'Ô­', 1326 => 'Ô¯', 1329 => 'Õ¡', 1330 => 'Õ¢', 1331 => 'Õ£', 1332 => 'Õ¤', 1333 => 'Õ¥', 1334 => 'Õ¦', 1335 => 'Õ§', 1336 => 'Õ¨', 1337 => 'Õ©', 1338 => 'Õª', 1339 => 'Õ«', 1340 => 'Õ¬', 1341 => 'Õ­', 1342 => 'Õ®', 1343 => 'Õ¯', 1344 => 'Õ°', 1345 => 'Õ±', 1346 => 'Õ²', 1347 => 'Õ³', 1348 => 'Õ´', 1349 => 'Õµ', 1350 => 'Õ¶', 1351 => 'Õ·', 1352 => 'Õ¸', 1353 => 'Õ¹', 1354 => 'Õº', 1355 => 'Õ»', 1356 => 'Õ¼', 1357 => 'Õ½', 1358 => 'Õ¾', 1359 => 'Õ¿', 1360 => 'Ö€', 1361 => 'Ö', 1362 => 'Ö‚', 1363 => 'Öƒ', 1364 => 'Ö„', 1365 => 'Ö…', 1366 => 'Ö†', 1415 => 'Õ¥Ö‚', 1653 => 'اٴ', 1654 => 'وٴ', 1655 => 'Û‡Ù´', 1656 => 'يٴ', 2392 => 'क़', 2393 => 'ख़', 2394 => 'ग़', 2395 => 'ज़', 2396 => 'ड़', 2397 => 'ढ़', 2398 => 'फ़', 2399 => 'य़', 2524 => 'ড়', 2525 => 'ঢ়', 2527 => 'য়', 2611 => 'ਲ਼', 2614 => 'ਸ਼', 2649 => 'ਖ਼', 2650 => 'ਗ਼', 2651 => 'ਜ਼', 2654 => 'ਫ਼', 2908 => 'ଡ଼', 2909 => 'ଢ଼', 3635 => 'à¹à¸²', 3763 => 'à»àº²', 3804 => 'ຫນ', 3805 => 'ຫມ', 3852 => '་', 3907 => 'གྷ', 3917 => 'ཌྷ', 3922 => 'དྷ', 3927 => 'བྷ', 3932 => 'ཛྷ', 3945 => 'ཀྵ', 3955 => 'ཱི', 3957 => 'ཱུ', 3958 => 'ྲྀ', 3959 => 'ྲཱྀ', 3960 => 'ླྀ', 3961 => 'ླཱྀ', 3969 => 'ཱྀ', 3987 => 'ྒྷ', 3997 => 'ྜྷ', 4002 => 'ྡྷ', 4007 => 'ྦྷ', 4012 => 'ྫྷ', 4025 => 'à¾à¾µ', 4295 => 'â´§', 4301 => 'â´­', 4348 => 'ნ', 5112 => 'á°', 5113 => 'á±', 5114 => 'á²', 5115 => 'á³', 5116 => 'á´', 5117 => 'áµ', 7296 => 'в', 7297 => 'д', 7298 => 'о', 7299 => 'Ñ', 7300 => 'Ñ‚', 7301 => 'Ñ‚', 7302 => 'ÑŠ', 7303 => 'Ñ£', 7304 => 'ꙋ', 7312 => 'áƒ', 7313 => 'ბ', 7314 => 'გ', 7315 => 'დ', 7316 => 'ე', 7317 => 'ვ', 7318 => 'ზ', 7319 => 'თ', 7320 => 'ი', 7321 => 'კ', 7322 => 'ლ', 7323 => 'მ', 7324 => 'ნ', 7325 => 'áƒ', 7326 => 'პ', 7327 => 'ჟ', 7328 => 'რ', 7329 => 'ს', 7330 => 'ტ', 7331 => 'უ', 7332 => 'ფ', 7333 => 'ქ', 7334 => 'ღ', 7335 => 'ყ', 7336 => 'შ', 7337 => 'ჩ', 7338 => 'ც', 7339 => 'ძ', 7340 => 'წ', 7341 => 'ჭ', 7342 => 'ხ', 7343 => 'ჯ', 7344 => 'ჰ', 7345 => 'ჱ', 7346 => 'ჲ', 7347 => 'ჳ', 7348 => 'ჴ', 7349 => 'ჵ', 7350 => 'ჶ', 7351 => 'ჷ', 7352 => 'ჸ', 7353 => 'ჹ', 7354 => 'ჺ', 7357 => 'ჽ', 7358 => 'ჾ', 7359 => 'ჿ', 7468 => 'a', 7469 => 'æ', 7470 => 'b', 7472 => 'd', 7473 => 'e', 7474 => 'Ç', 7475 => 'g', 7476 => 'h', 7477 => 'i', 7478 => 'j', 7479 => 'k', 7480 => 'l', 7481 => 'm', 7482 => 'n', 7484 => 'o', 7485 => 'È£', 7486 => 'p', 7487 => 'r', 7488 => 't', 7489 => 'u', 7490 => 'w', 7491 => 'a', 7492 => 'É', 7493 => 'É‘', 7494 => 'á´‚', 7495 => 'b', 7496 => 'd', 7497 => 'e', 7498 => 'É™', 7499 => 'É›', 7500 => 'Éœ', 7501 => 'g', 7503 => 'k', 7504 => 'm', 7505 => 'Å‹', 7506 => 'o', 7507 => 'É”', 7508 => 'á´–', 7509 => 'á´—', 7510 => 'p', 7511 => 't', 7512 => 'u', 7513 => 'á´', 7514 => 'ɯ', 7515 => 'v', 7516 => 'á´¥', 7517 => 'β', 7518 => 'γ', 7519 => 'δ', 7520 => 'φ', 7521 => 'χ', 7522 => 'i', 7523 => 'r', 7524 => 'u', 7525 => 'v', 7526 => 'β', 7527 => 'γ', 7528 => 'Ï', 7529 => 'φ', 7530 => 'χ', 7544 => 'н', 7579 => 'É’', 7580 => 'c', 7581 => 'É•', 7582 => 'ð', 7583 => 'Éœ', 7584 => 'f', 7585 => 'ÉŸ', 7586 => 'É¡', 7587 => 'É¥', 7588 => 'ɨ', 7589 => 'É©', 7590 => 'ɪ', 7591 => 'áµ»', 7592 => 'Ê', 7593 => 'É­', 7594 => 'ᶅ', 7595 => 'ÊŸ', 7596 => 'ɱ', 7597 => 'É°', 7598 => 'ɲ', 7599 => 'ɳ', 7600 => 'É´', 7601 => 'ɵ', 7602 => 'ɸ', 7603 => 'Ê‚', 7604 => 'ʃ', 7605 => 'Æ«', 7606 => 'ʉ', 7607 => 'ÊŠ', 7608 => 'á´œ', 7609 => 'Ê‹', 7610 => 'ÊŒ', 7611 => 'z', 7612 => 'Ê', 7613 => 'Ê‘', 7614 => 'Ê’', 7615 => 'θ', 7680 => 'á¸', 7682 => 'ḃ', 7684 => 'ḅ', 7686 => 'ḇ', 7688 => 'ḉ', 7690 => 'ḋ', 7692 => 'á¸', 7694 => 'á¸', 7696 => 'ḑ', 7698 => 'ḓ', 7700 => 'ḕ', 7702 => 'ḗ', 7704 => 'ḙ', 7706 => 'ḛ', 7708 => 'á¸', 7710 => 'ḟ', 7712 => 'ḡ', 7714 => 'ḣ', 7716 => 'ḥ', 7718 => 'ḧ', 7720 => 'ḩ', 7722 => 'ḫ', 7724 => 'ḭ', 7726 => 'ḯ', 7728 => 'ḱ', 7730 => 'ḳ', 7732 => 'ḵ', 7734 => 'ḷ', 7736 => 'ḹ', 7738 => 'ḻ', 7740 => 'ḽ', 7742 => 'ḿ', 7744 => 'á¹', 7746 => 'ṃ', 7748 => 'á¹…', 7750 => 'ṇ', 7752 => 'ṉ', 7754 => 'ṋ', 7756 => 'á¹', 7758 => 'á¹', 7760 => 'ṑ', 7762 => 'ṓ', 7764 => 'ṕ', 7766 => 'á¹—', 7768 => 'á¹™', 7770 => 'á¹›', 7772 => 'á¹', 7774 => 'ṟ', 7776 => 'ṡ', 7778 => 'á¹£', 7780 => 'á¹¥', 7782 => 'ṧ', 7784 => 'ṩ', 7786 => 'ṫ', 7788 => 'á¹­', 7790 => 'ṯ', 7792 => 'á¹±', 7794 => 'á¹³', 7796 => 'á¹µ', 7798 => 'á¹·', 7800 => 'á¹¹', 7802 => 'á¹»', 7804 => 'á¹½', 7806 => 'ṿ', 7808 => 'áº', 7810 => 'ẃ', 7812 => 'ẅ', 7814 => 'ẇ', 7816 => 'ẉ', 7818 => 'ẋ', 7820 => 'áº', 7822 => 'áº', 7824 => 'ẑ', 7826 => 'ẓ', 7828 => 'ẕ', 7834 => 'aʾ', 7835 => 'ṡ', 7838 => 'ss', 7840 => 'ạ', 7842 => 'ả', 7844 => 'ấ', 7846 => 'ầ', 7848 => 'ẩ', 7850 => 'ẫ', 7852 => 'ậ', 7854 => 'ắ', 7856 => 'ằ', 7858 => 'ẳ', 7860 => 'ẵ', 7862 => 'ặ', 7864 => 'ẹ', 7866 => 'ẻ', 7868 => 'ẽ', 7870 => 'ế', 7872 => 'á»', 7874 => 'ể', 7876 => 'á»…', 7878 => 'ệ', 7880 => 'ỉ', 7882 => 'ị', 7884 => 'á»', 7886 => 'á»', 7888 => 'ố', 7890 => 'ồ', 7892 => 'ổ', 7894 => 'á»—', 7896 => 'á»™', 7898 => 'á»›', 7900 => 'á»', 7902 => 'ở', 7904 => 'ỡ', 7906 => 'ợ', 7908 => 'ụ', 7910 => 'ủ', 7912 => 'ứ', 7914 => 'ừ', 7916 => 'á»­', 7918 => 'ữ', 7920 => 'á»±', 7922 => 'ỳ', 7924 => 'ỵ', 7926 => 'á»·', 7928 => 'ỹ', 7930 => 'á»»', 7932 => 'ỽ', 7934 => 'ỿ', 7944 => 'á¼€', 7945 => 'á¼', 7946 => 'ἂ', 7947 => 'ἃ', 7948 => 'ἄ', 7949 => 'á¼…', 7950 => 'ἆ', 7951 => 'ἇ', 7960 => 'á¼', 7961 => 'ἑ', 7962 => 'á¼’', 7963 => 'ἓ', 7964 => 'á¼”', 7965 => 'ἕ', 7976 => 'á¼ ', 7977 => 'ἡ', 7978 => 'á¼¢', 7979 => 'á¼£', 7980 => 'ἤ', 7981 => 'á¼¥', 7982 => 'ἦ', 7983 => 'ἧ', 7992 => 'á¼°', 7993 => 'á¼±', 7994 => 'á¼²', 7995 => 'á¼³', 7996 => 'á¼´', 7997 => 'á¼µ', 7998 => 'ἶ', 7999 => 'á¼·', 8008 => 'á½€', 8009 => 'á½', 8010 => 'ὂ', 8011 => 'ὃ', 8012 => 'ὄ', 8013 => 'á½…', 8025 => 'ὑ', 8027 => 'ὓ', 8029 => 'ὕ', 8031 => 'á½—', 8040 => 'á½ ', 8041 => 'ὡ', 8042 => 'á½¢', 8043 => 'á½£', 8044 => 'ὤ', 8045 => 'á½¥', 8046 => 'ὦ', 8047 => 'ὧ', 8049 => 'ά', 8051 => 'έ', 8053 => 'ή', 8055 => 'ί', 8057 => 'ÏŒ', 8059 => 'Ï', 8061 => 'ÏŽ', 8064 => 'ἀι', 8065 => 'á¼Î¹', 8066 => 'ἂι', 8067 => 'ἃι', 8068 => 'ἄι', 8069 => 'ἅι', 8070 => 'ἆι', 8071 => 'ἇι', 8072 => 'ἀι', 8073 => 'á¼Î¹', 8074 => 'ἂι', 8075 => 'ἃι', 8076 => 'ἄι', 8077 => 'ἅι', 8078 => 'ἆι', 8079 => 'ἇι', 8080 => 'ἠι', 8081 => 'ἡι', 8082 => 'ἢι', 8083 => 'ἣι', 8084 => 'ἤι', 8085 => 'ἥι', 8086 => 'ἦι', 8087 => 'ἧι', 8088 => 'ἠι', 8089 => 'ἡι', 8090 => 'ἢι', 8091 => 'ἣι', 8092 => 'ἤι', 8093 => 'ἥι', 8094 => 'ἦι', 8095 => 'ἧι', 8096 => 'ὠι', 8097 => 'ὡι', 8098 => 'ὢι', 8099 => 'ὣι', 8100 => 'ὤι', 8101 => 'ὥι', 8102 => 'ὦι', 8103 => 'ὧι', 8104 => 'ὠι', 8105 => 'ὡι', 8106 => 'ὢι', 8107 => 'ὣι', 8108 => 'ὤι', 8109 => 'ὥι', 8110 => 'ὦι', 8111 => 'ὧι', 8114 => 'ὰι', 8115 => 'αι', 8116 => 'άι', 8119 => 'ᾶι', 8120 => 'á¾°', 8121 => 'á¾±', 8122 => 'á½°', 8123 => 'ά', 8124 => 'αι', 8126 => 'ι', 8130 => 'ὴι', 8131 => 'ηι', 8132 => 'ήι', 8135 => 'ῆι', 8136 => 'á½²', 8137 => 'έ', 8138 => 'á½´', 8139 => 'ή', 8140 => 'ηι', 8147 => 'Î', 8152 => 'á¿', 8153 => 'á¿‘', 8154 => 'ὶ', 8155 => 'ί', 8163 => 'ΰ', 8168 => 'á¿ ', 8169 => 'á¿¡', 8170 => 'ὺ', 8171 => 'Ï', 8172 => 'á¿¥', 8178 => 'ὼι', 8179 => 'ωι', 8180 => 'ώι', 8183 => 'ῶι', 8184 => 'ὸ', 8185 => 'ÏŒ', 8186 => 'á½¼', 8187 => 'ÏŽ', 8188 => 'ωι', 8209 => 'â€', 8243 => '′′', 8244 => '′′′', 8246 => '‵‵', 8247 => '‵‵‵', 8279 => '′′′′', 8304 => '0', 8305 => 'i', 8308 => '4', 8309 => '5', 8310 => '6', 8311 => '7', 8312 => '8', 8313 => '9', 8315 => '−', 8319 => 'n', 8320 => '0', 8321 => '1', 8322 => '2', 8323 => '3', 8324 => '4', 8325 => '5', 8326 => '6', 8327 => '7', 8328 => '8', 8329 => '9', 8331 => '−', 8336 => 'a', 8337 => 'e', 8338 => 'o', 8339 => 'x', 8340 => 'É™', 8341 => 'h', 8342 => 'k', 8343 => 'l', 8344 => 'm', 8345 => 'n', 8346 => 'p', 8347 => 's', 8348 => 't', 8360 => 'rs', 8450 => 'c', 8451 => '°c', 8455 => 'É›', 8457 => '°f', 8458 => 'g', 8459 => 'h', 8460 => 'h', 8461 => 'h', 8462 => 'h', 8463 => 'ħ', 8464 => 'i', 8465 => 'i', 8466 => 'l', 8467 => 'l', 8469 => 'n', 8470 => 'no', 8473 => 'p', 8474 => 'q', 8475 => 'r', 8476 => 'r', 8477 => 'r', 8480 => 'sm', 8481 => 'tel', 8482 => 'tm', 8484 => 'z', 8486 => 'ω', 8488 => 'z', 8490 => 'k', 8491 => 'Ã¥', 8492 => 'b', 8493 => 'c', 8495 => 'e', 8496 => 'e', 8497 => 'f', 8499 => 'm', 8500 => 'o', 8501 => '×', 8502 => 'ב', 8503 => '×’', 8504 => 'ד', 8505 => 'i', 8507 => 'fax', 8508 => 'Ï€', 8509 => 'γ', 8510 => 'γ', 8511 => 'Ï€', 8512 => '∑', 8517 => 'd', 8518 => 'd', 8519 => 'e', 8520 => 'i', 8521 => 'j', 8528 => '1â„7', 8529 => '1â„9', 8530 => '1â„10', 8531 => '1â„3', 8532 => '2â„3', 8533 => '1â„5', 8534 => '2â„5', 8535 => '3â„5', 8536 => '4â„5', 8537 => '1â„6', 8538 => '5â„6', 8539 => '1â„8', 8540 => '3â„8', 8541 => '5â„8', 8542 => '7â„8', 8543 => '1â„', 8544 => 'i', 8545 => 'ii', 8546 => 'iii', 8547 => 'iv', 8548 => 'v', 8549 => 'vi', 8550 => 'vii', 8551 => 'viii', 8552 => 'ix', 8553 => 'x', 8554 => 'xi', 8555 => 'xii', 8556 => 'l', 8557 => 'c', 8558 => 'd', 8559 => 'm', 8560 => 'i', 8561 => 'ii', 8562 => 'iii', 8563 => 'iv', 8564 => 'v', 8565 => 'vi', 8566 => 'vii', 8567 => 'viii', 8568 => 'ix', 8569 => 'x', 8570 => 'xi', 8571 => 'xii', 8572 => 'l', 8573 => 'c', 8574 => 'd', 8575 => 'm', 8585 => '0â„3', 8748 => '∫∫', 8749 => '∫∫∫', 8751 => '∮∮', 8752 => '∮∮∮', 9001 => '〈', 9002 => '〉', 9312 => '1', 9313 => '2', 9314 => '3', 9315 => '4', 9316 => '5', 9317 => '6', 9318 => '7', 9319 => '8', 9320 => '9', 9321 => '10', 9322 => '11', 9323 => '12', 9324 => '13', 9325 => '14', 9326 => '15', 9327 => '16', 9328 => '17', 9329 => '18', 9330 => '19', 9331 => '20', 9398 => 'a', 9399 => 'b', 9400 => 'c', 9401 => 'd', 9402 => 'e', 9403 => 'f', 9404 => 'g', 9405 => 'h', 9406 => 'i', 9407 => 'j', 9408 => 'k', 9409 => 'l', 9410 => 'm', 9411 => 'n', 9412 => 'o', 9413 => 'p', 9414 => 'q', 9415 => 'r', 9416 => 's', 9417 => 't', 9418 => 'u', 9419 => 'v', 9420 => 'w', 9421 => 'x', 9422 => 'y', 9423 => 'z', 9424 => 'a', 9425 => 'b', 9426 => 'c', 9427 => 'd', 9428 => 'e', 9429 => 'f', 9430 => 'g', 9431 => 'h', 9432 => 'i', 9433 => 'j', 9434 => 'k', 9435 => 'l', 9436 => 'm', 9437 => 'n', 9438 => 'o', 9439 => 'p', 9440 => 'q', 9441 => 'r', 9442 => 's', 9443 => 't', 9444 => 'u', 9445 => 'v', 9446 => 'w', 9447 => 'x', 9448 => 'y', 9449 => 'z', 9450 => '0', 10764 => '∫∫∫∫', 10972 => 'â«Ì¸', 11264 => 'â°°', 11265 => 'â°±', 11266 => 'â°²', 11267 => 'â°³', 11268 => 'â°´', 11269 => 'â°µ', 11270 => 'â°¶', 11271 => 'â°·', 11272 => 'â°¸', 11273 => 'â°¹', 11274 => 'â°º', 11275 => 'â°»', 11276 => 'â°¼', 11277 => 'â°½', 11278 => 'â°¾', 11279 => 'â°¿', 11280 => 'â±€', 11281 => 'â±', 11282 => 'ⱂ', 11283 => 'ⱃ', 11284 => 'ⱄ', 11285 => 'â±…', 11286 => 'ⱆ', 11287 => 'ⱇ', 11288 => 'ⱈ', 11289 => 'ⱉ', 11290 => 'ⱊ', 11291 => 'ⱋ', 11292 => 'ⱌ', 11293 => 'â±', 11294 => 'ⱎ', 11295 => 'â±', 11296 => 'â±', 11297 => 'ⱑ', 11298 => 'â±’', 11299 => 'ⱓ', 11300 => 'â±”', 11301 => 'ⱕ', 11302 => 'â±–', 11303 => 'â±—', 11304 => 'ⱘ', 11305 => 'â±™', 11306 => 'ⱚ', 11307 => 'â±›', 11308 => 'ⱜ', 11309 => 'â±', 11310 => 'ⱞ', 11360 => 'ⱡ', 11362 => 'É«', 11363 => 'áµ½', 11364 => 'ɽ', 11367 => 'ⱨ', 11369 => 'ⱪ', 11371 => 'ⱬ', 11373 => 'É‘', 11374 => 'ɱ', 11375 => 'É', 11376 => 'É’', 11378 => 'â±³', 11381 => 'ⱶ', 11388 => 'j', 11389 => 'v', 11390 => 'È¿', 11391 => 'É€', 11392 => 'â²', 11394 => 'ⲃ', 11396 => 'â²…', 11398 => 'ⲇ', 11400 => 'ⲉ', 11402 => 'ⲋ', 11404 => 'â²', 11406 => 'â²', 11408 => 'ⲑ', 11410 => 'ⲓ', 11412 => 'ⲕ', 11414 => 'â²—', 11416 => 'â²™', 11418 => 'â²›', 11420 => 'â²', 11422 => 'ⲟ', 11424 => 'ⲡ', 11426 => 'â²£', 11428 => 'â²¥', 11430 => 'ⲧ', 11432 => 'ⲩ', 11434 => 'ⲫ', 11436 => 'â²­', 11438 => 'ⲯ', 11440 => 'â²±', 11442 => 'â²³', 11444 => 'â²µ', 11446 => 'â²·', 11448 => 'â²¹', 11450 => 'â²»', 11452 => 'â²½', 11454 => 'ⲿ', 11456 => 'â³', 11458 => 'ⳃ', 11460 => 'â³…', 11462 => 'ⳇ', 11464 => 'ⳉ', 11466 => 'ⳋ', 11468 => 'â³', 11470 => 'â³', 11472 => 'ⳑ', 11474 => 'ⳓ', 11476 => 'ⳕ', 11478 => 'â³—', 11480 => 'â³™', 11482 => 'â³›', 11484 => 'â³', 11486 => 'ⳟ', 11488 => 'ⳡ', 11490 => 'â³£', 11499 => 'ⳬ', 11501 => 'â³®', 11506 => 'â³³', 11631 => 'ⵡ', 11935 => 'æ¯', 12019 => '龟', 12032 => '一', 12033 => '丨', 12034 => '丶', 12035 => '丿', 12036 => 'ä¹™', 12037 => '亅', 12038 => '二', 12039 => '亠', 12040 => '人', 12041 => 'å„¿', 12042 => 'å…¥', 12043 => 'å…«', 12044 => '冂', 12045 => '冖', 12046 => '冫', 12047 => '几', 12048 => '凵', 12049 => '刀', 12050 => '力', 12051 => '勹', 12052 => '匕', 12053 => '匚', 12054 => '匸', 12055 => 'å', 12056 => 'åœ', 12057 => 'å©', 12058 => '厂', 12059 => '厶', 12060 => 'åˆ', 12061 => 'å£', 12062 => 'å›—', 12063 => '土', 12064 => '士', 12065 => '夂', 12066 => '夊', 12067 => '夕', 12068 => '大', 12069 => '女', 12070 => 'å­', 12071 => '宀', 12072 => '寸', 12073 => 'å°', 12074 => 'å°¢', 12075 => 'å°¸', 12076 => 'å±®', 12077 => 'å±±', 12078 => 'å·›', 12079 => 'å·¥', 12080 => 'å·±', 12081 => 'å·¾', 12082 => 'å¹²', 12083 => '幺', 12084 => '广', 12085 => 'å»´', 12086 => '廾', 12087 => '弋', 12088 => '弓', 12089 => 'å½', 12090 => '彡', 12091 => 'å½³', 12092 => '心', 12093 => '戈', 12094 => '戶', 12095 => '手', 12096 => '支', 12097 => 'æ”´', 12098 => 'æ–‡', 12099 => 'æ–—', 12100 => 'æ–¤', 12101 => 'æ–¹', 12102 => 'æ— ', 12103 => 'æ—¥', 12104 => 'æ›°', 12105 => '月', 12106 => '木', 12107 => '欠', 12108 => 'æ­¢', 12109 => 'æ­¹', 12110 => '殳', 12111 => '毋', 12112 => '比', 12113 => '毛', 12114 => 'æ°', 12115 => 'æ°”', 12116 => 'æ°´', 12117 => 'ç«', 12118 => '爪', 12119 => '父', 12120 => '爻', 12121 => '爿', 12122 => '片', 12123 => '牙', 12124 => '牛', 12125 => '犬', 12126 => '玄', 12127 => '玉', 12128 => 'ç“œ', 12129 => '瓦', 12130 => '甘', 12131 => '生', 12132 => '用', 12133 => 'ç”°', 12134 => 'ç–‹', 12135 => 'ç–’', 12136 => '癶', 12137 => '白', 12138 => 'çš®', 12139 => 'çš¿', 12140 => 'ç›®', 12141 => '矛', 12142 => '矢', 12143 => '石', 12144 => '示', 12145 => '禸', 12146 => '禾', 12147 => 'ç©´', 12148 => 'ç«‹', 12149 => '竹', 12150 => 'ç±³', 12151 => '糸', 12152 => '缶', 12153 => '网', 12154 => '羊', 12155 => 'ç¾½', 12156 => 'è€', 12157 => '而', 12158 => '耒', 12159 => '耳', 12160 => 'è¿', 12161 => '肉', 12162 => '臣', 12163 => '自', 12164 => '至', 12165 => '臼', 12166 => '舌', 12167 => '舛', 12168 => '舟', 12169 => '艮', 12170 => '色', 12171 => '艸', 12172 => 'è™', 12173 => '虫', 12174 => 'è¡€', 12175 => 'è¡Œ', 12176 => 'è¡£', 12177 => '襾', 12178 => '見', 12179 => '角', 12180 => '言', 12181 => 'è°·', 12182 => '豆', 12183 => '豕', 12184 => '豸', 12185 => 'è²', 12186 => '赤', 12187 => 'èµ°', 12188 => '足', 12189 => '身', 12190 => '車', 12191 => 'è¾›', 12192 => 'è¾°', 12193 => 'è¾µ', 12194 => 'é‚‘', 12195 => 'é…‰', 12196 => '釆', 12197 => '里', 12198 => '金', 12199 => 'é•·', 12200 => 'é–€', 12201 => '阜', 12202 => '隶', 12203 => 'éš¹', 12204 => '雨', 12205 => 'é‘', 12206 => 'éž', 12207 => 'é¢', 12208 => 'é©', 12209 => '韋', 12210 => '韭', 12211 => '音', 12212 => 'é ', 12213 => '風', 12214 => '飛', 12215 => '食', 12216 => '首', 12217 => '香', 12218 => '馬', 12219 => '骨', 12220 => '高', 12221 => 'é«Ÿ', 12222 => '鬥', 12223 => '鬯', 12224 => '鬲', 12225 => '鬼', 12226 => 'é­š', 12227 => 'é³¥', 12228 => 'é¹µ', 12229 => '鹿', 12230 => '麥', 12231 => '麻', 12232 => '黃', 12233 => 'é»', 12234 => '黑', 12235 => '黹', 12236 => '黽', 12237 => '鼎', 12238 => '鼓', 12239 => 'é¼ ', 12240 => 'é¼»', 12241 => '齊', 12242 => 'é½’', 12243 => 'é¾', 12244 => '龜', 12245 => 'é¾ ', 12290 => '.', 12342 => '〒', 12344 => 'å', 12345 => 'å„', 12346 => 'å…', 12447 => 'より', 12543 => 'コト', 12593 => 'á„€', 12594 => 'á„', 12595 => 'ᆪ', 12596 => 'á„‚', 12597 => 'ᆬ', 12598 => 'ᆭ', 12599 => 'ᄃ', 12600 => 'á„„', 12601 => 'á„…', 12602 => 'ᆰ', 12603 => 'ᆱ', 12604 => 'ᆲ', 12605 => 'ᆳ', 12606 => 'ᆴ', 12607 => 'ᆵ', 12608 => 'á„š', 12609 => 'ᄆ', 12610 => 'ᄇ', 12611 => 'ᄈ', 12612 => 'á„¡', 12613 => 'ᄉ', 12614 => 'á„Š', 12615 => 'á„‹', 12616 => 'á„Œ', 12617 => 'á„', 12618 => 'á„Ž', 12619 => 'á„', 12620 => 'á„', 12621 => 'á„‘', 12622 => 'á„’', 12623 => 'á…¡', 12624 => 'á…¢', 12625 => 'á…£', 12626 => 'á…¤', 12627 => 'á…¥', 12628 => 'á…¦', 12629 => 'á…§', 12630 => 'á…¨', 12631 => 'á…©', 12632 => 'á…ª', 12633 => 'á…«', 12634 => 'á…¬', 12635 => 'á…­', 12636 => 'á…®', 12637 => 'á…¯', 12638 => 'á…°', 12639 => 'á…±', 12640 => 'á…²', 12641 => 'á…³', 12642 => 'á…´', 12643 => 'á…µ', 12645 => 'á„”', 12646 => 'á„•', 12647 => 'ᇇ', 12648 => 'ᇈ', 12649 => 'ᇌ', 12650 => 'ᇎ', 12651 => 'ᇓ', 12652 => 'ᇗ', 12653 => 'ᇙ', 12654 => 'á„œ', 12655 => 'á‡', 12656 => 'ᇟ', 12657 => 'á„', 12658 => 'á„ž', 12659 => 'á„ ', 12660 => 'á„¢', 12661 => 'á„£', 12662 => 'ᄧ', 12663 => 'á„©', 12664 => 'á„«', 12665 => 'ᄬ', 12666 => 'á„­', 12667 => 'á„®', 12668 => 'ᄯ', 12669 => 'ᄲ', 12670 => 'ᄶ', 12671 => 'á…€', 12672 => 'á…‡', 12673 => 'á…Œ', 12674 => 'ᇱ', 12675 => 'ᇲ', 12676 => 'á…—', 12677 => 'á…˜', 12678 => 'á…™', 12679 => 'ᆄ', 12680 => 'ᆅ', 12681 => 'ᆈ', 12682 => 'ᆑ', 12683 => 'ᆒ', 12684 => 'ᆔ', 12685 => 'ᆞ', 12686 => 'ᆡ', 12690 => '一', 12691 => '二', 12692 => '三', 12693 => 'å››', 12694 => '上', 12695 => '中', 12696 => '下', 12697 => '甲', 12698 => 'ä¹™', 12699 => '丙', 12700 => 'ä¸', 12701 => '天', 12702 => '地', 12703 => '人', 12868 => 'å•', 12869 => 'å¹¼', 12870 => 'æ–‡', 12871 => 'ç®', 12880 => 'pte', 12881 => '21', 12882 => '22', 12883 => '23', 12884 => '24', 12885 => '25', 12886 => '26', 12887 => '27', 12888 => '28', 12889 => '29', 12890 => '30', 12891 => '31', 12892 => '32', 12893 => '33', 12894 => '34', 12895 => '35', 12896 => 'á„€', 12897 => 'á„‚', 12898 => 'ᄃ', 12899 => 'á„…', 12900 => 'ᄆ', 12901 => 'ᄇ', 12902 => 'ᄉ', 12903 => 'á„‹', 12904 => 'á„Œ', 12905 => 'á„Ž', 12906 => 'á„', 12907 => 'á„', 12908 => 'á„‘', 12909 => 'á„’', 12910 => 'ê°€', 12911 => '나', 12912 => '다', 12913 => 'ë¼', 12914 => '마', 12915 => 'ë°”', 12916 => '사', 12917 => 'ì•„', 12918 => 'ìž', 12919 => 'ì°¨', 12920 => 'ì¹´', 12921 => '타', 12922 => '파', 12923 => '하', 12924 => '참고', 12925 => '주ì˜', 12926 => 'ìš°', 12928 => '一', 12929 => '二', 12930 => '三', 12931 => 'å››', 12932 => '五', 12933 => 'å…­', 12934 => '七', 12935 => 'å…«', 12936 => 'ä¹', 12937 => 'å', 12938 => '月', 12939 => 'ç«', 12940 => 'æ°´', 12941 => '木', 12942 => '金', 12943 => '土', 12944 => 'æ—¥', 12945 => 'æ ª', 12946 => '有', 12947 => '社', 12948 => 'å', 12949 => '特', 12950 => '財', 12951 => 'ç¥', 12952 => '労', 12953 => '秘', 12954 => 'ç”·', 12955 => '女', 12956 => 'é©', 12957 => '優', 12958 => 'å°', 12959 => '注', 12960 => 'é …', 12961 => '休', 12962 => '写', 12963 => 'æ­£', 12964 => '上', 12965 => '中', 12966 => '下', 12967 => 'å·¦', 12968 => 'å³', 12969 => '医', 12970 => 'å®—', 12971 => 'å­¦', 12972 => '監', 12973 => 'ä¼', 12974 => '資', 12975 => 'å”', 12976 => '夜', 12977 => '36', 12978 => '37', 12979 => '38', 12980 => '39', 12981 => '40', 12982 => '41', 12983 => '42', 12984 => '43', 12985 => '44', 12986 => '45', 12987 => '46', 12988 => '47', 12989 => '48', 12990 => '49', 12991 => '50', 12992 => '1月', 12993 => '2月', 12994 => '3月', 12995 => '4月', 12996 => '5月', 12997 => '6月', 12998 => '7月', 12999 => '8月', 13000 => '9月', 13001 => '10月', 13002 => '11月', 13003 => '12月', 13004 => 'hg', 13005 => 'erg', 13006 => 'ev', 13007 => 'ltd', 13008 => 'ã‚¢', 13009 => 'イ', 13010 => 'ウ', 13011 => 'エ', 13012 => 'オ', 13013 => 'ã‚«', 13014 => 'ã‚­', 13015 => 'ク', 13016 => 'ケ', 13017 => 'コ', 13018 => 'サ', 13019 => 'ã‚·', 13020 => 'ス', 13021 => 'ã‚»', 13022 => 'ソ', 13023 => 'ã‚¿', 13024 => 'ãƒ', 13025 => 'ツ', 13026 => 'テ', 13027 => 'ト', 13028 => 'ナ', 13029 => 'ニ', 13030 => 'ヌ', 13031 => 'ãƒ', 13032 => 'ノ', 13033 => 'ãƒ', 13034 => 'ヒ', 13035 => 'フ', 13036 => 'ヘ', 13037 => 'ホ', 13038 => 'マ', 13039 => 'ミ', 13040 => 'ム', 13041 => 'メ', 13042 => 'モ', 13043 => 'ヤ', 13044 => 'ユ', 13045 => 'ヨ', 13046 => 'ラ', 13047 => 'リ', 13048 => 'ル', 13049 => 'レ', 13050 => 'ロ', 13051 => 'ワ', 13052 => 'ヰ', 13053 => 'ヱ', 13054 => 'ヲ', 13055 => '令和', 13056 => 'アパート', 13057 => 'アルファ', 13058 => 'アンペア', 13059 => 'アール', 13060 => 'イニング', 13061 => 'インãƒ', 13062 => 'ウォン', 13063 => 'エスクード', 13064 => 'エーカー', 13065 => 'オンス', 13066 => 'オーム', 13067 => 'カイリ', 13068 => 'カラット', 13069 => 'カロリー', 13070 => 'ガロン', 13071 => 'ガンマ', 13072 => 'ギガ', 13073 => 'ギニー', 13074 => 'キュリー', 13075 => 'ギルダー', 13076 => 'キロ', 13077 => 'キログラム', 13078 => 'キロメートル', 13079 => 'キロワット', 13080 => 'グラム', 13081 => 'グラムトン', 13082 => 'クルゼイロ', 13083 => 'クローãƒ', 13084 => 'ケース', 13085 => 'コルナ', 13086 => 'コーãƒ', 13087 => 'サイクル', 13088 => 'サンãƒãƒ¼ãƒ ', 13089 => 'シリング', 13090 => 'センãƒ', 13091 => 'セント', 13092 => 'ダース', 13093 => 'デシ', 13094 => 'ドル', 13095 => 'トン', 13096 => 'ナノ', 13097 => 'ノット', 13098 => 'ãƒã‚¤ãƒ„', 13099 => 'パーセント', 13100 => 'パーツ', 13101 => 'ãƒãƒ¼ãƒ¬ãƒ«', 13102 => 'ピアストル', 13103 => 'ピクル', 13104 => 'ピコ', 13105 => 'ビル', 13106 => 'ファラッド', 13107 => 'フィート', 13108 => 'ブッシェル', 13109 => 'フラン', 13110 => 'ヘクタール', 13111 => 'ペソ', 13112 => 'ペニヒ', 13113 => 'ヘルツ', 13114 => 'ペンス', 13115 => 'ページ', 13116 => 'ベータ', 13117 => 'ãƒã‚¤ãƒ³ãƒˆ', 13118 => 'ボルト', 13119 => 'ホン', 13120 => 'ãƒãƒ³ãƒ‰', 13121 => 'ホール', 13122 => 'ホーン', 13123 => 'マイクロ', 13124 => 'マイル', 13125 => 'マッãƒ', 13126 => 'マルク', 13127 => 'マンション', 13128 => 'ミクロン', 13129 => 'ミリ', 13130 => 'ミリãƒãƒ¼ãƒ«', 13131 => 'メガ', 13132 => 'メガトン', 13133 => 'メートル', 13134 => 'ヤード', 13135 => 'ヤール', 13136 => 'ユアン', 13137 => 'リットル', 13138 => 'リラ', 13139 => 'ルピー', 13140 => 'ルーブル', 13141 => 'レム', 13142 => 'レントゲン', 13143 => 'ワット', 13144 => '0点', 13145 => '1点', 13146 => '2点', 13147 => '3点', 13148 => '4点', 13149 => '5点', 13150 => '6点', 13151 => '7点', 13152 => '8点', 13153 => '9点', 13154 => '10点', 13155 => '11点', 13156 => '12点', 13157 => '13点', 13158 => '14点', 13159 => '15点', 13160 => '16点', 13161 => '17点', 13162 => '18点', 13163 => '19点', 13164 => '20点', 13165 => '21点', 13166 => '22点', 13167 => '23点', 13168 => '24点', 13169 => 'hpa', 13170 => 'da', 13171 => 'au', 13172 => 'bar', 13173 => 'ov', 13174 => 'pc', 13175 => 'dm', 13176 => 'dm2', 13177 => 'dm3', 13178 => 'iu', 13179 => 'å¹³æˆ', 13180 => '昭和', 13181 => '大正', 13182 => '明治', 13183 => 'æ ªå¼ä¼šç¤¾', 13184 => 'pa', 13185 => 'na', 13186 => 'μa', 13187 => 'ma', 13188 => 'ka', 13189 => 'kb', 13190 => 'mb', 13191 => 'gb', 13192 => 'cal', 13193 => 'kcal', 13194 => 'pf', 13195 => 'nf', 13196 => 'μf', 13197 => 'μg', 13198 => 'mg', 13199 => 'kg', 13200 => 'hz', 13201 => 'khz', 13202 => 'mhz', 13203 => 'ghz', 13204 => 'thz', 13205 => 'μl', 13206 => 'ml', 13207 => 'dl', 13208 => 'kl', 13209 => 'fm', 13210 => 'nm', 13211 => 'μm', 13212 => 'mm', 13213 => 'cm', 13214 => 'km', 13215 => 'mm2', 13216 => 'cm2', 13217 => 'm2', 13218 => 'km2', 13219 => 'mm3', 13220 => 'cm3', 13221 => 'm3', 13222 => 'km3', 13223 => 'm∕s', 13224 => 'm∕s2', 13225 => 'pa', 13226 => 'kpa', 13227 => 'mpa', 13228 => 'gpa', 13229 => 'rad', 13230 => 'rad∕s', 13231 => 'rad∕s2', 13232 => 'ps', 13233 => 'ns', 13234 => 'μs', 13235 => 'ms', 13236 => 'pv', 13237 => 'nv', 13238 => 'μv', 13239 => 'mv', 13240 => 'kv', 13241 => 'mv', 13242 => 'pw', 13243 => 'nw', 13244 => 'μw', 13245 => 'mw', 13246 => 'kw', 13247 => 'mw', 13248 => 'kω', 13249 => 'mω', 13251 => 'bq', 13252 => 'cc', 13253 => 'cd', 13254 => 'c∕kg', 13256 => 'db', 13257 => 'gy', 13258 => 'ha', 13259 => 'hp', 13260 => 'in', 13261 => 'kk', 13262 => 'km', 13263 => 'kt', 13264 => 'lm', 13265 => 'ln', 13266 => 'log', 13267 => 'lx', 13268 => 'mb', 13269 => 'mil', 13270 => 'mol', 13271 => 'ph', 13273 => 'ppm', 13274 => 'pr', 13275 => 'sr', 13276 => 'sv', 13277 => 'wb', 13278 => 'v∕m', 13279 => 'a∕m', 13280 => '1æ—¥', 13281 => '2æ—¥', 13282 => '3æ—¥', 13283 => '4æ—¥', 13284 => '5æ—¥', 13285 => '6æ—¥', 13286 => '7æ—¥', 13287 => '8æ—¥', 13288 => '9æ—¥', 13289 => '10æ—¥', 13290 => '11æ—¥', 13291 => '12æ—¥', 13292 => '13æ—¥', 13293 => '14æ—¥', 13294 => '15æ—¥', 13295 => '16æ—¥', 13296 => '17æ—¥', 13297 => '18æ—¥', 13298 => '19æ—¥', 13299 => '20æ—¥', 13300 => '21æ—¥', 13301 => '22æ—¥', 13302 => '23æ—¥', 13303 => '24æ—¥', 13304 => '25æ—¥', 13305 => '26æ—¥', 13306 => '27æ—¥', 13307 => '28æ—¥', 13308 => '29æ—¥', 13309 => '30æ—¥', 13310 => '31æ—¥', 13311 => 'gal', 42560 => 'ê™', 42562 => 'ꙃ', 42564 => 'ê™…', 42566 => 'ꙇ', 42568 => 'ꙉ', 42570 => 'ꙋ', 42572 => 'ê™', 42574 => 'ê™', 42576 => 'ꙑ', 42578 => 'ꙓ', 42580 => 'ꙕ', 42582 => 'ê™—', 42584 => 'ê™™', 42586 => 'ê™›', 42588 => 'ê™', 42590 => 'ꙟ', 42592 => 'ꙡ', 42594 => 'ꙣ', 42596 => 'ꙥ', 42598 => 'ꙧ', 42600 => 'ꙩ', 42602 => 'ꙫ', 42604 => 'ê™­', 42624 => 'êš', 42626 => 'ꚃ', 42628 => 'êš…', 42630 => 'ꚇ', 42632 => 'ꚉ', 42634 => 'êš‹', 42636 => 'êš', 42638 => 'êš', 42640 => 'êš‘', 42642 => 'êš“', 42644 => 'êš•', 42646 => 'êš—', 42648 => 'êš™', 42650 => 'êš›', 42652 => 'ÑŠ', 42653 => 'ÑŒ', 42786 => 'ꜣ', 42788 => 'ꜥ', 42790 => 'ꜧ', 42792 => 'ꜩ', 42794 => 'ꜫ', 42796 => 'ꜭ', 42798 => 'ꜯ', 42802 => 'ꜳ', 42804 => 'ꜵ', 42806 => 'ꜷ', 42808 => 'ꜹ', 42810 => 'ꜻ', 42812 => 'ꜽ', 42814 => 'ꜿ', 42816 => 'ê', 42818 => 'êƒ', 42820 => 'ê…', 42822 => 'ê‡', 42824 => 'ê‰', 42826 => 'ê‹', 42828 => 'ê', 42830 => 'ê', 42832 => 'ê‘', 42834 => 'ê“', 42836 => 'ê•', 42838 => 'ê—', 42840 => 'ê™', 42842 => 'ê›', 42844 => 'ê', 42846 => 'êŸ', 42848 => 'ê¡', 42850 => 'ê£', 42852 => 'ê¥', 42854 => 'ê§', 42856 => 'ê©', 42858 => 'ê«', 42860 => 'ê­', 42862 => 'ê¯', 42864 => 'ê¯', 42873 => 'êº', 42875 => 'ê¼', 42877 => 'áµ¹', 42878 => 'ê¿', 42880 => 'êž', 42882 => 'ꞃ', 42884 => 'êž…', 42886 => 'ꞇ', 42891 => 'ꞌ', 42893 => 'É¥', 42896 => 'êž‘', 42898 => 'êž“', 42902 => 'êž—', 42904 => 'êž™', 42906 => 'êž›', 42908 => 'êž', 42910 => 'ꞟ', 42912 => 'êž¡', 42914 => 'ꞣ', 42916 => 'ꞥ', 42918 => 'ꞧ', 42920 => 'êž©', 42922 => 'ɦ', 42923 => 'Éœ', 42924 => 'É¡', 42925 => 'ɬ', 42926 => 'ɪ', 42928 => 'Êž', 42929 => 'ʇ', 42930 => 'Ê', 42931 => 'ê­“', 42932 => 'êžµ', 42934 => 'êž·', 42936 => 'êž¹', 42938 => 'êž»', 42940 => 'êž½', 42942 => 'êž¿', 42946 => 'ꟃ', 42948 => 'êž”', 42949 => 'Ê‚', 42950 => 'ᶎ', 42951 => 'ꟈ', 42953 => 'ꟊ', 42997 => 'ꟶ', 43000 => 'ħ', 43001 => 'Å“', 43868 => 'ꜧ', 43869 => 'ꬷ', 43870 => 'É«', 43871 => 'ê­’', 43881 => 'Ê', 43888 => 'Ꭰ', 43889 => 'Ꭱ', 43890 => 'Ꭲ', 43891 => 'Ꭳ', 43892 => 'Ꭴ', 43893 => 'Ꭵ', 43894 => 'Ꭶ', 43895 => 'Ꭷ', 43896 => 'Ꭸ', 43897 => 'Ꭹ', 43898 => 'Ꭺ', 43899 => 'Ꭻ', 43900 => 'Ꭼ', 43901 => 'Ꭽ', 43902 => 'Ꭾ', 43903 => 'Ꭿ', 43904 => 'Ꮀ', 43905 => 'Ꮁ', 43906 => 'Ꮂ', 43907 => 'Ꮃ', 43908 => 'Ꮄ', 43909 => 'Ꮅ', 43910 => 'Ꮆ', 43911 => 'Ꮇ', 43912 => 'Ꮈ', 43913 => 'Ꮉ', 43914 => 'Ꮊ', 43915 => 'Ꮋ', 43916 => 'Ꮌ', 43917 => 'Ꮍ', 43918 => 'Ꮎ', 43919 => 'Ꮏ', 43920 => 'á€', 43921 => 'á', 43922 => 'á‚', 43923 => 'áƒ', 43924 => 'á„', 43925 => 'á…', 43926 => 'á†', 43927 => 'á‡', 43928 => 'áˆ', 43929 => 'á‰', 43930 => 'áŠ', 43931 => 'á‹', 43932 => 'áŒ', 43933 => 'á', 43934 => 'áŽ', 43935 => 'á', 43936 => 'á', 43937 => 'á‘', 43938 => 'á’', 43939 => 'á“', 43940 => 'á”', 43941 => 'á•', 43942 => 'á–', 43943 => 'á—', 43944 => 'á˜', 43945 => 'á™', 43946 => 'áš', 43947 => 'á›', 43948 => 'áœ', 43949 => 'á', 43950 => 'áž', 43951 => 'áŸ', 43952 => 'á ', 43953 => 'á¡', 43954 => 'á¢', 43955 => 'á£', 43956 => 'á¤', 43957 => 'á¥', 43958 => 'á¦', 43959 => 'á§', 43960 => 'á¨', 43961 => 'á©', 43962 => 'áª', 43963 => 'á«', 43964 => 'á¬', 43965 => 'á­', 43966 => 'á®', 43967 => 'á¯', 63744 => '豈', 63745 => 'æ›´', 63746 => '車', 63747 => '賈', 63748 => '滑', 63749 => '串', 63750 => 'å¥', 63751 => '龜', 63752 => '龜', 63753 => '契', 63754 => '金', 63755 => 'å–‡', 63756 => '奈', 63757 => '懶', 63758 => '癩', 63759 => 'ç¾…', 63760 => '蘿', 63761 => '螺', 63762 => '裸', 63763 => 'é‚', 63764 => '樂', 63765 => 'æ´›', 63766 => '烙', 63767 => 'çž', 63768 => 'è½', 63769 => 'é…ª', 63770 => '駱', 63771 => '亂', 63772 => 'åµ', 63773 => '欄', 63774 => '爛', 63775 => '蘭', 63776 => '鸞', 63777 => 'åµ', 63778 => 'æ¿«', 63779 => 'è—', 63780 => '襤', 63781 => '拉', 63782 => '臘', 63783 => 'è Ÿ', 63784 => '廊', 63785 => '朗', 63786 => '浪', 63787 => '狼', 63788 => '郎', 63789 => '來', 63790 => '冷', 63791 => 'å‹ž', 63792 => 'æ“„', 63793 => 'æ«“', 63794 => 'çˆ', 63795 => '盧', 63796 => 'è€', 63797 => '蘆', 63798 => '虜', 63799 => 'è·¯', 63800 => '露', 63801 => 'é­¯', 63802 => 'é·º', 63803 => '碌', 63804 => '祿', 63805 => '綠', 63806 => 'è‰', 63807 => '錄', 63808 => '鹿', 63809 => 'è«–', 63810 => '壟', 63811 => '弄', 63812 => 'ç± ', 63813 => 'è¾', 63814 => '牢', 63815 => '磊', 63816 => '賂', 63817 => 'é›·', 63818 => '壘', 63819 => 'å±¢', 63820 => '樓', 63821 => 'æ·š', 63822 => 'æ¼', 63823 => 'ç´¯', 63824 => '縷', 63825 => '陋', 63826 => 'å‹’', 63827 => 'è‚‹', 63828 => '凜', 63829 => '凌', 63830 => '稜', 63831 => '綾', 63832 => 'è±', 63833 => '陵', 63834 => '讀', 63835 => 'æ‹', 63836 => '樂', 63837 => '諾', 63838 => '丹', 63839 => '寧', 63840 => '怒', 63841 => '率', 63842 => 'ç•°', 63843 => '北', 63844 => '磻', 63845 => '便', 63846 => '復', 63847 => 'ä¸', 63848 => '泌', 63849 => '數', 63850 => 'ç´¢', 63851 => 'åƒ', 63852 => 'å¡ž', 63853 => 'çœ', 63854 => '葉', 63855 => '說', 63856 => '殺', 63857 => 'è¾°', 63858 => '沈', 63859 => '拾', 63860 => 'è‹¥', 63861 => '掠', 63862 => 'ç•¥', 63863 => '亮', 63864 => 'å…©', 63865 => '凉', 63866 => 'æ¢', 63867 => '糧', 63868 => '良', 63869 => 'è«’', 63870 => 'é‡', 63871 => '勵', 63872 => 'å‘‚', 63873 => '女', 63874 => '廬', 63875 => 'æ—…', 63876 => '濾', 63877 => '礪', 63878 => 'é–­', 63879 => '驪', 63880 => '麗', 63881 => '黎', 63882 => '力', 63883 => '曆', 63884 => 'æ­·', 63885 => 'è½¢', 63886 => 'å¹´', 63887 => 'æ†', 63888 => '戀', 63889 => 'æ’š', 63890 => 'æ¼£', 63891 => 'ç…‰', 63892 => 'ç’‰', 63893 => '秊', 63894 => 'ç·´', 63895 => 'è¯', 63896 => '輦', 63897 => 'è“®', 63898 => '連', 63899 => 'éŠ', 63900 => '列', 63901 => '劣', 63902 => 'å’½', 63903 => '烈', 63904 => '裂', 63905 => '說', 63906 => '廉', 63907 => '念', 63908 => 'æ»', 63909 => 'æ®®', 63910 => 'ç°¾', 63911 => 'çµ', 63912 => '令', 63913 => '囹', 63914 => '寧', 63915 => '嶺', 63916 => '怜', 63917 => '玲', 63918 => 'ç‘©', 63919 => '羚', 63920 => 'è†', 63921 => '鈴', 63922 => '零', 63923 => 'éˆ', 63924 => 'é ˜', 63925 => '例', 63926 => '禮', 63927 => '醴', 63928 => '隸', 63929 => '惡', 63930 => '了', 63931 => '僚', 63932 => '寮', 63933 => 'å°¿', 63934 => 'æ–™', 63935 => '樂', 63936 => '燎', 63937 => '療', 63938 => '蓼', 63939 => 'é¼', 63940 => 'é¾', 63941 => '暈', 63942 => '阮', 63943 => '劉', 63944 => 'æ»', 63945 => '柳', 63946 => 'æµ', 63947 => '溜', 63948 => 'ç‰', 63949 => 'ç•™', 63950 => 'ç¡«', 63951 => 'ç´', 63952 => 'é¡ž', 63953 => 'å…­', 63954 => '戮', 63955 => '陸', 63956 => '倫', 63957 => 'å´™', 63958 => 'æ·ª', 63959 => '輪', 63960 => '律', 63961 => 'æ…„', 63962 => 'æ —', 63963 => '率', 63964 => '隆', 63965 => '利', 63966 => 'å', 63967 => 'å±¥', 63968 => '易', 63969 => 'æŽ', 63970 => '梨', 63971 => 'æ³¥', 63972 => 'ç†', 63973 => 'ç—¢', 63974 => 'ç½¹', 63975 => 'è£', 63976 => '裡', 63977 => '里', 63978 => '離', 63979 => '匿', 63980 => '溺', 63981 => 'å', 63982 => 'ç‡', 63983 => 'ç’˜', 63984 => 'è—º', 63985 => '隣', 63986 => 'é±—', 63987 => '麟', 63988 => 'æž—', 63989 => 'æ·‹', 63990 => '臨', 63991 => 'ç«‹', 63992 => '笠', 63993 => 'ç²’', 63994 => 'ç‹€', 63995 => 'ç‚™', 63996 => 'è­˜', 63997 => '什', 63998 => '茶', 63999 => '刺', 64000 => '切', 64001 => '度', 64002 => 'æ‹“', 64003 => 'ç³–', 64004 => 'å®…', 64005 => 'æ´ž', 64006 => 'æš´', 64007 => 'è¼»', 64008 => 'è¡Œ', 64009 => 'é™', 64010 => '見', 64011 => '廓', 64012 => 'å…€', 64013 => 'å—€', 64016 => 'å¡š', 64018 => 'æ™´', 64021 => '凞', 64022 => '猪', 64023 => '益', 64024 => '礼', 64025 => '神', 64026 => '祥', 64027 => 'ç¦', 64028 => 'é–', 64029 => 'ç²¾', 64030 => 'ç¾½', 64032 => '蘒', 64034 => '諸', 64037 => '逸', 64038 => '都', 64042 => '飯', 64043 => '飼', 64044 => '館', 64045 => '鶴', 64046 => '郞', 64047 => 'éš·', 64048 => 'ä¾®', 64049 => '僧', 64050 => 'å…', 64051 => '勉', 64052 => '勤', 64053 => 'å‘', 64054 => 'å–', 64055 => '嘆', 64056 => '器', 64057 => 'å¡€', 64058 => '墨', 64059 => '層', 64060 => 'å±®', 64061 => 'æ‚”', 64062 => 'æ…¨', 64063 => '憎', 64064 => '懲', 64065 => 'æ•', 64066 => 'æ—¢', 64067 => 'æš‘', 64068 => '梅', 64069 => 'æµ·', 64070 => '渚', 64071 => 'æ¼¢', 64072 => 'ç…®', 64073 => '爫', 64074 => 'ç¢', 64075 => '碑', 64076 => '社', 64077 => '祉', 64078 => '祈', 64079 => 'ç¥', 64080 => '祖', 64081 => 'ç¥', 64082 => 'ç¦', 64083 => '禎', 64084 => 'ç©€', 64085 => 'çª', 64086 => '節', 64087 => 'ç·´', 64088 => '縉', 64089 => 'ç¹', 64090 => 'ç½²', 64091 => '者', 64092 => '臭', 64093 => '艹', 64094 => '艹', 64095 => 'è‘—', 64096 => 'è¤', 64097 => '視', 64098 => 'è¬', 64099 => '謹', 64100 => '賓', 64101 => 'è´ˆ', 64102 => '辶', 64103 => '逸', 64104 => '難', 64105 => '響', 64106 => 'é »', 64107 => 'æµ', 64108 => '𤋮', 64109 => '舘', 64112 => '並', 64113 => '况', 64114 => 'å…¨', 64115 => 'ä¾€', 64116 => 'å……', 64117 => '冀', 64118 => '勇', 64119 => '勺', 64120 => 'å–', 64121 => 'å••', 64122 => 'å–™', 64123 => 'å—¢', 64124 => 'å¡š', 64125 => '墳', 64126 => '奄', 64127 => '奔', 64128 => 'å©¢', 64129 => '嬨', 64130 => 'å»’', 64131 => 'å»™', 64132 => '彩', 64133 => 'å¾­', 64134 => '惘', 64135 => 'æ…Ž', 64136 => '愈', 64137 => '憎', 64138 => 'æ… ', 64139 => '懲', 64140 => '戴', 64141 => 'æ„', 64142 => 'æœ', 64143 => 'æ‘’', 64144 => 'æ•–', 64145 => 'æ™´', 64146 => '朗', 64147 => '望', 64148 => 'æ–', 64149 => 'æ­¹', 64150 => '殺', 64151 => 'æµ', 64152 => 'æ»›', 64153 => '滋', 64154 => 'æ¼¢', 64155 => '瀞', 64156 => 'ç…®', 64157 => '瞧', 64158 => '爵', 64159 => '犯', 64160 => '猪', 64161 => '瑱', 64162 => '甆', 64163 => 'ç”»', 64164 => 'ç˜', 64165 => '瘟', 64166 => '益', 64167 => 'ç››', 64168 => 'ç›´', 64169 => 'çŠ', 64170 => 'ç€', 64171 => '磌', 64172 => '窱', 64173 => '節', 64174 => 'ç±»', 64175 => 'çµ›', 64176 => 'ç·´', 64177 => 'ç¼¾', 64178 => '者', 64179 => 'è’', 64180 => 'è¯', 64181 => 'è¹', 64182 => 'è¥', 64183 => '覆', 64184 => '視', 64185 => '調', 64186 => '諸', 64187 => 'è«‹', 64188 => 'è¬', 64189 => '諾', 64190 => 'è«­', 64191 => '謹', 64192 => '變', 64193 => 'è´ˆ', 64194 => '輸', 64195 => 'é²', 64196 => '醙', 64197 => '鉶', 64198 => '陼', 64199 => '難', 64200 => 'é–', 64201 => '韛', 64202 => '響', 64203 => 'é ‹', 64204 => 'é »', 64205 => '鬒', 64206 => '龜', 64207 => '𢡊', 64208 => '𢡄', 64209 => 'ð£•', 64210 => 'ã®', 64211 => '䀘', 64212 => '䀹', 64213 => '𥉉', 64214 => 'ð¥³', 64215 => '𧻓', 64216 => '齃', 64217 => '龎', 64256 => 'ff', 64257 => 'fi', 64258 => 'fl', 64259 => 'ffi', 64260 => 'ffl', 64261 => 'st', 64262 => 'st', 64275 => 'Õ´Õ¶', 64276 => 'Õ´Õ¥', 64277 => 'Õ´Õ«', 64278 => 'Õ¾Õ¶', 64279 => 'Õ´Õ­', 64285 => '×™Ö´', 64287 => 'ײַ', 64288 => '×¢', 64289 => '×', 64290 => 'ד', 64291 => '×”', 64292 => '×›', 64293 => 'ל', 64294 => '×', 64295 => 'ר', 64296 => 'ת', 64298 => 'ש×', 64299 => 'שׂ', 64300 => 'שּ×', 64301 => 'שּׂ', 64302 => '×Ö·', 64303 => '×Ö¸', 64304 => '×Ö¼', 64305 => 'בּ', 64306 => '×’Ö¼', 64307 => 'דּ', 64308 => '×”Ö¼', 64309 => 'וּ', 64310 => '×–Ö¼', 64312 => 'טּ', 64313 => '×™Ö¼', 64314 => 'ךּ', 64315 => '×›Ö¼', 64316 => 'לּ', 64318 => 'מּ', 64320 => '× Ö¼', 64321 => 'סּ', 64323 => '×£Ö¼', 64324 => 'פּ', 64326 => 'צּ', 64327 => 'קּ', 64328 => 'רּ', 64329 => 'שּ', 64330 => 'תּ', 64331 => 'וֹ', 64332 => 'בֿ', 64333 => '×›Ö¿', 64334 => 'פֿ', 64335 => '×ל', 64336 => 'Ù±', 64337 => 'Ù±', 64338 => 'Ù»', 64339 => 'Ù»', 64340 => 'Ù»', 64341 => 'Ù»', 64342 => 'Ù¾', 64343 => 'Ù¾', 64344 => 'Ù¾', 64345 => 'Ù¾', 64346 => 'Ú€', 64347 => 'Ú€', 64348 => 'Ú€', 64349 => 'Ú€', 64350 => 'Ùº', 64351 => 'Ùº', 64352 => 'Ùº', 64353 => 'Ùº', 64354 => 'Ù¿', 64355 => 'Ù¿', 64356 => 'Ù¿', 64357 => 'Ù¿', 64358 => 'Ù¹', 64359 => 'Ù¹', 64360 => 'Ù¹', 64361 => 'Ù¹', 64362 => 'Ú¤', 64363 => 'Ú¤', 64364 => 'Ú¤', 64365 => 'Ú¤', 64366 => 'Ú¦', 64367 => 'Ú¦', 64368 => 'Ú¦', 64369 => 'Ú¦', 64370 => 'Ú„', 64371 => 'Ú„', 64372 => 'Ú„', 64373 => 'Ú„', 64374 => 'Úƒ', 64375 => 'Úƒ', 64376 => 'Úƒ', 64377 => 'Úƒ', 64378 => 'Ú†', 64379 => 'Ú†', 64380 => 'Ú†', 64381 => 'Ú†', 64382 => 'Ú‡', 64383 => 'Ú‡', 64384 => 'Ú‡', 64385 => 'Ú‡', 64386 => 'Ú', 64387 => 'Ú', 64388 => 'ÚŒ', 64389 => 'ÚŒ', 64390 => 'ÚŽ', 64391 => 'ÚŽ', 64392 => 'Úˆ', 64393 => 'Úˆ', 64394 => 'Ú˜', 64395 => 'Ú˜', 64396 => 'Ú‘', 64397 => 'Ú‘', 64398 => 'Ú©', 64399 => 'Ú©', 64400 => 'Ú©', 64401 => 'Ú©', 64402 => 'Ú¯', 64403 => 'Ú¯', 64404 => 'Ú¯', 64405 => 'Ú¯', 64406 => 'Ú³', 64407 => 'Ú³', 64408 => 'Ú³', 64409 => 'Ú³', 64410 => 'Ú±', 64411 => 'Ú±', 64412 => 'Ú±', 64413 => 'Ú±', 64414 => 'Úº', 64415 => 'Úº', 64416 => 'Ú»', 64417 => 'Ú»', 64418 => 'Ú»', 64419 => 'Ú»', 64420 => 'Û€', 64421 => 'Û€', 64422 => 'Û', 64423 => 'Û', 64424 => 'Û', 64425 => 'Û', 64426 => 'Ú¾', 64427 => 'Ú¾', 64428 => 'Ú¾', 64429 => 'Ú¾', 64430 => 'Û’', 64431 => 'Û’', 64432 => 'Û“', 64433 => 'Û“', 64467 => 'Ú­', 64468 => 'Ú­', 64469 => 'Ú­', 64470 => 'Ú­', 64471 => 'Û‡', 64472 => 'Û‡', 64473 => 'Û†', 64474 => 'Û†', 64475 => 'Ûˆ', 64476 => 'Ûˆ', 64477 => 'Û‡Ù´', 64478 => 'Û‹', 64479 => 'Û‹', 64480 => 'Û…', 64481 => 'Û…', 64482 => 'Û‰', 64483 => 'Û‰', 64484 => 'Û', 64485 => 'Û', 64486 => 'Û', 64487 => 'Û', 64488 => 'Ù‰', 64489 => 'Ù‰', 64490 => 'ئا', 64491 => 'ئا', 64492 => 'ئە', 64493 => 'ئە', 64494 => 'ئو', 64495 => 'ئو', 64496 => 'ئۇ', 64497 => 'ئۇ', 64498 => 'ئۆ', 64499 => 'ئۆ', 64500 => 'ئۈ', 64501 => 'ئۈ', 64502 => 'ئÛ', 64503 => 'ئÛ', 64504 => 'ئÛ', 64505 => 'ئى', 64506 => 'ئى', 64507 => 'ئى', 64508 => 'ÛŒ', 64509 => 'ÛŒ', 64510 => 'ÛŒ', 64511 => 'ÛŒ', 64512 => 'ئج', 64513 => 'ئح', 64514 => 'ئم', 64515 => 'ئى', 64516 => 'ئي', 64517 => 'بج', 64518 => 'بح', 64519 => 'بخ', 64520 => 'بم', 64521 => 'بى', 64522 => 'بي', 64523 => 'تج', 64524 => 'تح', 64525 => 'تخ', 64526 => 'تم', 64527 => 'تى', 64528 => 'تي', 64529 => 'ثج', 64530 => 'ثم', 64531 => 'ثى', 64532 => 'ثي', 64533 => 'جح', 64534 => 'جم', 64535 => 'حج', 64536 => 'حم', 64537 => 'خج', 64538 => 'خح', 64539 => 'خم', 64540 => 'سج', 64541 => 'سح', 64542 => 'سخ', 64543 => 'سم', 64544 => 'صح', 64545 => 'صم', 64546 => 'ضج', 64547 => 'ضح', 64548 => 'ضخ', 64549 => 'ضم', 64550 => 'طح', 64551 => 'طم', 64552 => 'ظم', 64553 => 'عج', 64554 => 'عم', 64555 => 'غج', 64556 => 'غم', 64557 => 'Ùج', 64558 => 'ÙØ­', 64559 => 'ÙØ®', 64560 => 'ÙÙ…', 64561 => 'ÙÙ‰', 64562 => 'ÙÙŠ', 64563 => 'قح', 64564 => 'قم', 64565 => 'قى', 64566 => 'قي', 64567 => 'كا', 64568 => 'كج', 64569 => 'كح', 64570 => 'كخ', 64571 => 'كل', 64572 => 'كم', 64573 => 'كى', 64574 => 'كي', 64575 => 'لج', 64576 => 'لح', 64577 => 'لخ', 64578 => 'لم', 64579 => 'لى', 64580 => 'لي', 64581 => 'مج', 64582 => 'مح', 64583 => 'مخ', 64584 => 'مم', 64585 => 'مى', 64586 => 'مي', 64587 => 'نج', 64588 => 'نح', 64589 => 'نخ', 64590 => 'نم', 64591 => 'نى', 64592 => 'ني', 64593 => 'هج', 64594 => 'هم', 64595 => 'هى', 64596 => 'هي', 64597 => 'يج', 64598 => 'يح', 64599 => 'يخ', 64600 => 'يم', 64601 => 'يى', 64602 => 'يي', 64603 => 'ذٰ', 64604 => 'رٰ', 64605 => 'ىٰ', 64612 => 'ئر', 64613 => 'ئز', 64614 => 'ئم', 64615 => 'ئن', 64616 => 'ئى', 64617 => 'ئي', 64618 => 'بر', 64619 => 'بز', 64620 => 'بم', 64621 => 'بن', 64622 => 'بى', 64623 => 'بي', 64624 => 'تر', 64625 => 'تز', 64626 => 'تم', 64627 => 'تن', 64628 => 'تى', 64629 => 'تي', 64630 => 'ثر', 64631 => 'ثز', 64632 => 'ثم', 64633 => 'ثن', 64634 => 'ثى', 64635 => 'ثي', 64636 => 'ÙÙ‰', 64637 => 'ÙÙŠ', 64638 => 'قى', 64639 => 'قي', 64640 => 'كا', 64641 => 'كل', 64642 => 'كم', 64643 => 'كى', 64644 => 'كي', 64645 => 'لم', 64646 => 'لى', 64647 => 'لي', 64648 => 'ما', 64649 => 'مم', 64650 => 'نر', 64651 => 'نز', 64652 => 'نم', 64653 => 'نن', 64654 => 'نى', 64655 => 'ني', 64656 => 'ىٰ', 64657 => 'ير', 64658 => 'يز', 64659 => 'يم', 64660 => 'ين', 64661 => 'يى', 64662 => 'يي', 64663 => 'ئج', 64664 => 'ئح', 64665 => 'ئخ', 64666 => 'ئم', 64667 => 'ئه', 64668 => 'بج', 64669 => 'بح', 64670 => 'بخ', 64671 => 'بم', 64672 => 'به', 64673 => 'تج', 64674 => 'تح', 64675 => 'تخ', 64676 => 'تم', 64677 => 'ته', 64678 => 'ثم', 64679 => 'جح', 64680 => 'جم', 64681 => 'حج', 64682 => 'حم', 64683 => 'خج', 64684 => 'خم', 64685 => 'سج', 64686 => 'سح', 64687 => 'سخ', 64688 => 'سم', 64689 => 'صح', 64690 => 'صخ', 64691 => 'صم', 64692 => 'ضج', 64693 => 'ضح', 64694 => 'ضخ', 64695 => 'ضم', 64696 => 'طح', 64697 => 'ظم', 64698 => 'عج', 64699 => 'عم', 64700 => 'غج', 64701 => 'غم', 64702 => 'Ùج', 64703 => 'ÙØ­', 64704 => 'ÙØ®', 64705 => 'ÙÙ…', 64706 => 'قح', 64707 => 'قم', 64708 => 'كج', 64709 => 'كح', 64710 => 'كخ', 64711 => 'كل', 64712 => 'كم', 64713 => 'لج', 64714 => 'لح', 64715 => 'لخ', 64716 => 'لم', 64717 => 'له', 64718 => 'مج', 64719 => 'مح', 64720 => 'مخ', 64721 => 'مم', 64722 => 'نج', 64723 => 'نح', 64724 => 'نخ', 64725 => 'نم', 64726 => 'نه', 64727 => 'هج', 64728 => 'هم', 64729 => 'هٰ', 64730 => 'يج', 64731 => 'يح', 64732 => 'يخ', 64733 => 'يم', 64734 => 'يه', 64735 => 'ئم', 64736 => 'ئه', 64737 => 'بم', 64738 => 'به', 64739 => 'تم', 64740 => 'ته', 64741 => 'ثم', 64742 => 'ثه', 64743 => 'سم', 64744 => 'سه', 64745 => 'شم', 64746 => 'شه', 64747 => 'كل', 64748 => 'كم', 64749 => 'لم', 64750 => 'نم', 64751 => 'نه', 64752 => 'يم', 64753 => 'يه', 64754 => 'Ù€ÙŽÙ‘', 64755 => 'Ù€ÙÙ‘', 64756 => 'Ù€ÙÙ‘', 64757 => 'طى', 64758 => 'طي', 64759 => 'عى', 64760 => 'عي', 64761 => 'غى', 64762 => 'غي', 64763 => 'سى', 64764 => 'سي', 64765 => 'شى', 64766 => 'شي', 64767 => 'حى', 64768 => 'حي', 64769 => 'جى', 64770 => 'جي', 64771 => 'خى', 64772 => 'خي', 64773 => 'صى', 64774 => 'صي', 64775 => 'ضى', 64776 => 'ضي', 64777 => 'شج', 64778 => 'شح', 64779 => 'شخ', 64780 => 'شم', 64781 => 'شر', 64782 => 'سر', 64783 => 'صر', 64784 => 'ضر', 64785 => 'طى', 64786 => 'طي', 64787 => 'عى', 64788 => 'عي', 64789 => 'غى', 64790 => 'غي', 64791 => 'سى', 64792 => 'سي', 64793 => 'شى', 64794 => 'شي', 64795 => 'حى', 64796 => 'حي', 64797 => 'جى', 64798 => 'جي', 64799 => 'خى', 64800 => 'خي', 64801 => 'صى', 64802 => 'صي', 64803 => 'ضى', 64804 => 'ضي', 64805 => 'شج', 64806 => 'شح', 64807 => 'شخ', 64808 => 'شم', 64809 => 'شر', 64810 => 'سر', 64811 => 'صر', 64812 => 'ضر', 64813 => 'شج', 64814 => 'شح', 64815 => 'شخ', 64816 => 'شم', 64817 => 'سه', 64818 => 'شه', 64819 => 'طم', 64820 => 'سج', 64821 => 'سح', 64822 => 'سخ', 64823 => 'شج', 64824 => 'شح', 64825 => 'شخ', 64826 => 'طم', 64827 => 'ظم', 64828 => 'اً', 64829 => 'اً', 64848 => 'تجم', 64849 => 'تحج', 64850 => 'تحج', 64851 => 'تحم', 64852 => 'تخم', 64853 => 'تمج', 64854 => 'تمح', 64855 => 'تمخ', 64856 => 'جمح', 64857 => 'جمح', 64858 => 'حمي', 64859 => 'حمى', 64860 => 'سحج', 64861 => 'سجح', 64862 => 'سجى', 64863 => 'سمح', 64864 => 'سمح', 64865 => 'سمج', 64866 => 'سمم', 64867 => 'سمم', 64868 => 'صحح', 64869 => 'صحح', 64870 => 'صمم', 64871 => 'شحم', 64872 => 'شحم', 64873 => 'شجي', 64874 => 'شمخ', 64875 => 'شمخ', 64876 => 'شمم', 64877 => 'شمم', 64878 => 'ضحى', 64879 => 'ضخم', 64880 => 'ضخم', 64881 => 'طمح', 64882 => 'طمح', 64883 => 'طمم', 64884 => 'طمي', 64885 => 'عجم', 64886 => 'عمم', 64887 => 'عمم', 64888 => 'عمى', 64889 => 'غمم', 64890 => 'غمي', 64891 => 'غمى', 64892 => 'Ùخم', 64893 => 'Ùخم', 64894 => 'قمح', 64895 => 'قمم', 64896 => 'لحم', 64897 => 'لحي', 64898 => 'لحى', 64899 => 'لجج', 64900 => 'لجج', 64901 => 'لخم', 64902 => 'لخم', 64903 => 'لمح', 64904 => 'لمح', 64905 => 'محج', 64906 => 'محم', 64907 => 'محي', 64908 => 'مجح', 64909 => 'مجم', 64910 => 'مخج', 64911 => 'مخم', 64914 => 'مجخ', 64915 => 'همج', 64916 => 'همم', 64917 => 'نحم', 64918 => 'نحى', 64919 => 'نجم', 64920 => 'نجم', 64921 => 'نجى', 64922 => 'نمي', 64923 => 'نمى', 64924 => 'يمم', 64925 => 'يمم', 64926 => 'بخي', 64927 => 'تجي', 64928 => 'تجى', 64929 => 'تخي', 64930 => 'تخى', 64931 => 'تمي', 64932 => 'تمى', 64933 => 'جمي', 64934 => 'جحى', 64935 => 'جمى', 64936 => 'سخى', 64937 => 'صحي', 64938 => 'شحي', 64939 => 'ضحي', 64940 => 'لجي', 64941 => 'لمي', 64942 => 'يحي', 64943 => 'يجي', 64944 => 'يمي', 64945 => 'ممي', 64946 => 'قمي', 64947 => 'نحي', 64948 => 'قمح', 64949 => 'لحم', 64950 => 'عمي', 64951 => 'كمي', 64952 => 'نجح', 64953 => 'مخي', 64954 => 'لجم', 64955 => 'كمم', 64956 => 'لجم', 64957 => 'نجح', 64958 => 'جحي', 64959 => 'حجي', 64960 => 'مجي', 64961 => 'Ùمي', 64962 => 'بحي', 64963 => 'كمم', 64964 => 'عجم', 64965 => 'صمم', 64966 => 'سخي', 64967 => 'نجي', 65008 => 'صلے', 65009 => 'قلے', 65010 => 'الله', 65011 => 'اكبر', 65012 => 'محمد', 65013 => 'صلعم', 65014 => 'رسول', 65015 => 'عليه', 65016 => 'وسلم', 65017 => 'صلى', 65020 => 'ریال', 65041 => 'ã€', 65047 => '〖', 65048 => '〗', 65073 => '—', 65074 => '–', 65081 => '〔', 65082 => '〕', 65083 => 'ã€', 65084 => '】', 65085 => '《', 65086 => '》', 65087 => '〈', 65088 => '〉', 65089 => '「', 65090 => 'ã€', 65091 => '『', 65092 => 'ã€', 65105 => 'ã€', 65112 => '—', 65117 => '〔', 65118 => '〕', 65123 => '-', 65137 => 'ـً', 65143 => 'Ù€ÙŽ', 65145 => 'Ù€Ù', 65147 => 'Ù€Ù', 65149 => 'ـّ', 65151 => 'ـْ', 65152 => 'Ø¡', 65153 => 'Ø¢', 65154 => 'Ø¢', 65155 => 'Ø£', 65156 => 'Ø£', 65157 => 'ؤ', 65158 => 'ؤ', 65159 => 'Ø¥', 65160 => 'Ø¥', 65161 => 'ئ', 65162 => 'ئ', 65163 => 'ئ', 65164 => 'ئ', 65165 => 'ا', 65166 => 'ا', 65167 => 'ب', 65168 => 'ب', 65169 => 'ب', 65170 => 'ب', 65171 => 'Ø©', 65172 => 'Ø©', 65173 => 'ت', 65174 => 'ت', 65175 => 'ت', 65176 => 'ت', 65177 => 'Ø«', 65178 => 'Ø«', 65179 => 'Ø«', 65180 => 'Ø«', 65181 => 'ج', 65182 => 'ج', 65183 => 'ج', 65184 => 'ج', 65185 => 'Ø­', 65186 => 'Ø­', 65187 => 'Ø­', 65188 => 'Ø­', 65189 => 'Ø®', 65190 => 'Ø®', 65191 => 'Ø®', 65192 => 'Ø®', 65193 => 'د', 65194 => 'د', 65195 => 'Ø°', 65196 => 'Ø°', 65197 => 'ر', 65198 => 'ر', 65199 => 'ز', 65200 => 'ز', 65201 => 'س', 65202 => 'س', 65203 => 'س', 65204 => 'س', 65205 => 'Ø´', 65206 => 'Ø´', 65207 => 'Ø´', 65208 => 'Ø´', 65209 => 'ص', 65210 => 'ص', 65211 => 'ص', 65212 => 'ص', 65213 => 'ض', 65214 => 'ض', 65215 => 'ض', 65216 => 'ض', 65217 => 'Ø·', 65218 => 'Ø·', 65219 => 'Ø·', 65220 => 'Ø·', 65221 => 'ظ', 65222 => 'ظ', 65223 => 'ظ', 65224 => 'ظ', 65225 => 'ع', 65226 => 'ع', 65227 => 'ع', 65228 => 'ع', 65229 => 'غ', 65230 => 'غ', 65231 => 'غ', 65232 => 'غ', 65233 => 'Ù', 65234 => 'Ù', 65235 => 'Ù', 65236 => 'Ù', 65237 => 'Ù‚', 65238 => 'Ù‚', 65239 => 'Ù‚', 65240 => 'Ù‚', 65241 => 'Ùƒ', 65242 => 'Ùƒ', 65243 => 'Ùƒ', 65244 => 'Ùƒ', 65245 => 'Ù„', 65246 => 'Ù„', 65247 => 'Ù„', 65248 => 'Ù„', 65249 => 'Ù…', 65250 => 'Ù…', 65251 => 'Ù…', 65252 => 'Ù…', 65253 => 'Ù†', 65254 => 'Ù†', 65255 => 'Ù†', 65256 => 'Ù†', 65257 => 'Ù‡', 65258 => 'Ù‡', 65259 => 'Ù‡', 65260 => 'Ù‡', 65261 => 'Ùˆ', 65262 => 'Ùˆ', 65263 => 'Ù‰', 65264 => 'Ù‰', 65265 => 'ÙŠ', 65266 => 'ÙŠ', 65267 => 'ÙŠ', 65268 => 'ÙŠ', 65269 => 'لآ', 65270 => 'لآ', 65271 => 'لأ', 65272 => 'لأ', 65273 => 'لإ', 65274 => 'لإ', 65275 => 'لا', 65276 => 'لا', 65293 => '-', 65294 => '.', 65296 => '0', 65297 => '1', 65298 => '2', 65299 => '3', 65300 => '4', 65301 => '5', 65302 => '6', 65303 => '7', 65304 => '8', 65305 => '9', 65313 => 'a', 65314 => 'b', 65315 => 'c', 65316 => 'd', 65317 => 'e', 65318 => 'f', 65319 => 'g', 65320 => 'h', 65321 => 'i', 65322 => 'j', 65323 => 'k', 65324 => 'l', 65325 => 'm', 65326 => 'n', 65327 => 'o', 65328 => 'p', 65329 => 'q', 65330 => 'r', 65331 => 's', 65332 => 't', 65333 => 'u', 65334 => 'v', 65335 => 'w', 65336 => 'x', 65337 => 'y', 65338 => 'z', 65345 => 'a', 65346 => 'b', 65347 => 'c', 65348 => 'd', 65349 => 'e', 65350 => 'f', 65351 => 'g', 65352 => 'h', 65353 => 'i', 65354 => 'j', 65355 => 'k', 65356 => 'l', 65357 => 'm', 65358 => 'n', 65359 => 'o', 65360 => 'p', 65361 => 'q', 65362 => 'r', 65363 => 's', 65364 => 't', 65365 => 'u', 65366 => 'v', 65367 => 'w', 65368 => 'x', 65369 => 'y', 65370 => 'z', 65375 => '⦅', 65376 => '⦆', 65377 => '.', 65378 => '「', 65379 => 'ã€', 65380 => 'ã€', 65381 => '・', 65382 => 'ヲ', 65383 => 'ã‚¡', 65384 => 'ã‚£', 65385 => 'ã‚¥', 65386 => 'ェ', 65387 => 'ã‚©', 65388 => 'ャ', 65389 => 'ュ', 65390 => 'ョ', 65391 => 'ッ', 65392 => 'ー', 65393 => 'ã‚¢', 65394 => 'イ', 65395 => 'ウ', 65396 => 'エ', 65397 => 'オ', 65398 => 'ã‚«', 65399 => 'ã‚­', 65400 => 'ク', 65401 => 'ケ', 65402 => 'コ', 65403 => 'サ', 65404 => 'ã‚·', 65405 => 'ス', 65406 => 'ã‚»', 65407 => 'ソ', 65408 => 'ã‚¿', 65409 => 'ãƒ', 65410 => 'ツ', 65411 => 'テ', 65412 => 'ト', 65413 => 'ナ', 65414 => 'ニ', 65415 => 'ヌ', 65416 => 'ãƒ', 65417 => 'ノ', 65418 => 'ãƒ', 65419 => 'ヒ', 65420 => 'フ', 65421 => 'ヘ', 65422 => 'ホ', 65423 => 'マ', 65424 => 'ミ', 65425 => 'ム', 65426 => 'メ', 65427 => 'モ', 65428 => 'ヤ', 65429 => 'ユ', 65430 => 'ヨ', 65431 => 'ラ', 65432 => 'リ', 65433 => 'ル', 65434 => 'レ', 65435 => 'ロ', 65436 => 'ワ', 65437 => 'ン', 65438 => 'ã‚™', 65439 => 'ã‚š', 65441 => 'á„€', 65442 => 'á„', 65443 => 'ᆪ', 65444 => 'á„‚', 65445 => 'ᆬ', 65446 => 'ᆭ', 65447 => 'ᄃ', 65448 => 'á„„', 65449 => 'á„…', 65450 => 'ᆰ', 65451 => 'ᆱ', 65452 => 'ᆲ', 65453 => 'ᆳ', 65454 => 'ᆴ', 65455 => 'ᆵ', 65456 => 'á„š', 65457 => 'ᄆ', 65458 => 'ᄇ', 65459 => 'ᄈ', 65460 => 'á„¡', 65461 => 'ᄉ', 65462 => 'á„Š', 65463 => 'á„‹', 65464 => 'á„Œ', 65465 => 'á„', 65466 => 'á„Ž', 65467 => 'á„', 65468 => 'á„', 65469 => 'á„‘', 65470 => 'á„’', 65474 => 'á…¡', 65475 => 'á…¢', 65476 => 'á…£', 65477 => 'á…¤', 65478 => 'á…¥', 65479 => 'á…¦', 65482 => 'á…§', 65483 => 'á…¨', 65484 => 'á…©', 65485 => 'á…ª', 65486 => 'á…«', 65487 => 'á…¬', 65490 => 'á…­', 65491 => 'á…®', 65492 => 'á…¯', 65493 => 'á…°', 65494 => 'á…±', 65495 => 'á…²', 65498 => 'á…³', 65499 => 'á…´', 65500 => 'á…µ', 65504 => '¢', 65505 => '£', 65506 => '¬', 65508 => '¦', 65509 => 'Â¥', 65510 => 'â‚©', 65512 => '│', 65513 => 'â†', 65514 => '↑', 65515 => '→', 65516 => '↓', 65517 => 'â– ', 65518 => 'â—‹', 66560 => 'ð¨', 66561 => 'ð©', 66562 => 'ðª', 66563 => 'ð«', 66564 => 'ð¬', 66565 => 'ð­', 66566 => 'ð®', 66567 => 'ð¯', 66568 => 'ð°', 66569 => 'ð±', 66570 => 'ð²', 66571 => 'ð³', 66572 => 'ð´', 66573 => 'ðµ', 66574 => 'ð¶', 66575 => 'ð·', 66576 => 'ð¸', 66577 => 'ð¹', 66578 => 'ðº', 66579 => 'ð»', 66580 => 'ð¼', 66581 => 'ð½', 66582 => 'ð¾', 66583 => 'ð¿', 66584 => 'ð‘€', 66585 => 'ð‘', 66586 => 'ð‘‚', 66587 => 'ð‘ƒ', 66588 => 'ð‘„', 66589 => 'ð‘…', 66590 => 'ð‘†', 66591 => 'ð‘‡', 66592 => 'ð‘ˆ', 66593 => 'ð‘‰', 66594 => 'ð‘Š', 66595 => 'ð‘‹', 66596 => 'ð‘Œ', 66597 => 'ð‘', 66598 => 'ð‘Ž', 66599 => 'ð‘', 66736 => 'ð“˜', 66737 => 'ð“™', 66738 => 'ð“š', 66739 => 'ð“›', 66740 => 'ð“œ', 66741 => 'ð“', 66742 => 'ð“ž', 66743 => 'ð“Ÿ', 66744 => 'ð“ ', 66745 => 'ð“¡', 66746 => 'ð“¢', 66747 => 'ð“£', 66748 => 'ð“¤', 66749 => 'ð“¥', 66750 => 'ð“¦', 66751 => 'ð“§', 66752 => 'ð“¨', 66753 => 'ð“©', 66754 => 'ð“ª', 66755 => 'ð“«', 66756 => 'ð“¬', 66757 => 'ð“­', 66758 => 'ð“®', 66759 => 'ð“¯', 66760 => 'ð“°', 66761 => 'ð“±', 66762 => 'ð“²', 66763 => 'ð“³', 66764 => 'ð“´', 66765 => 'ð“µ', 66766 => 'ð“¶', 66767 => 'ð“·', 66768 => 'ð“¸', 66769 => 'ð“¹', 66770 => 'ð“º', 66771 => 'ð“»', 68736 => 'ð³€', 68737 => 'ð³', 68738 => 'ð³‚', 68739 => 'ð³ƒ', 68740 => 'ð³„', 68741 => 'ð³…', 68742 => 'ð³†', 68743 => 'ð³‡', 68744 => 'ð³ˆ', 68745 => 'ð³‰', 68746 => 'ð³Š', 68747 => 'ð³‹', 68748 => 'ð³Œ', 68749 => 'ð³', 68750 => 'ð³Ž', 68751 => 'ð³', 68752 => 'ð³', 68753 => 'ð³‘', 68754 => 'ð³’', 68755 => 'ð³“', 68756 => 'ð³”', 68757 => 'ð³•', 68758 => 'ð³–', 68759 => 'ð³—', 68760 => 'ð³˜', 68761 => 'ð³™', 68762 => 'ð³š', 68763 => 'ð³›', 68764 => 'ð³œ', 68765 => 'ð³', 68766 => 'ð³ž', 68767 => 'ð³Ÿ', 68768 => 'ð³ ', 68769 => 'ð³¡', 68770 => 'ð³¢', 68771 => 'ð³£', 68772 => 'ð³¤', 68773 => 'ð³¥', 68774 => 'ð³¦', 68775 => 'ð³§', 68776 => 'ð³¨', 68777 => 'ð³©', 68778 => 'ð³ª', 68779 => 'ð³«', 68780 => 'ð³¬', 68781 => 'ð³­', 68782 => 'ð³®', 68783 => 'ð³¯', 68784 => 'ð³°', 68785 => 'ð³±', 68786 => 'ð³²', 71840 => 'ð‘£€', 71841 => 'ð‘£', 71842 => '𑣂', 71843 => '𑣃', 71844 => '𑣄', 71845 => 'ð‘£…', 71846 => '𑣆', 71847 => '𑣇', 71848 => '𑣈', 71849 => '𑣉', 71850 => '𑣊', 71851 => '𑣋', 71852 => '𑣌', 71853 => 'ð‘£', 71854 => '𑣎', 71855 => 'ð‘£', 71856 => 'ð‘£', 71857 => '𑣑', 71858 => 'ð‘£’', 71859 => '𑣓', 71860 => 'ð‘£”', 71861 => '𑣕', 71862 => 'ð‘£–', 71863 => 'ð‘£—', 71864 => '𑣘', 71865 => 'ð‘£™', 71866 => '𑣚', 71867 => 'ð‘£›', 71868 => '𑣜', 71869 => 'ð‘£', 71870 => '𑣞', 71871 => '𑣟', 93760 => 'ð–¹ ', 93761 => '𖹡', 93762 => 'ð–¹¢', 93763 => 'ð–¹£', 93764 => '𖹤', 93765 => 'ð–¹¥', 93766 => '𖹦', 93767 => '𖹧', 93768 => '𖹨', 93769 => '𖹩', 93770 => '𖹪', 93771 => '𖹫', 93772 => '𖹬', 93773 => 'ð–¹­', 93774 => 'ð–¹®', 93775 => '𖹯', 93776 => 'ð–¹°', 93777 => 'ð–¹±', 93778 => 'ð–¹²', 93779 => 'ð–¹³', 93780 => 'ð–¹´', 93781 => 'ð–¹µ', 93782 => '𖹶', 93783 => 'ð–¹·', 93784 => '𖹸', 93785 => 'ð–¹¹', 93786 => '𖹺', 93787 => 'ð–¹»', 93788 => 'ð–¹¼', 93789 => 'ð–¹½', 93790 => 'ð–¹¾', 93791 => '𖹿', 119134 => 'ð…—ð…¥', 119135 => 'ð…˜ð…¥', 119136 => 'ð…˜ð…¥ð…®', 119137 => 'ð…˜ð…¥ð…¯', 119138 => 'ð…˜ð…¥ð…°', 119139 => 'ð…˜ð…¥ð…±', 119140 => 'ð…˜ð…¥ð…²', 119227 => 'ð†¹ð…¥', 119228 => 'ð†ºð…¥', 119229 => 'ð†¹ð…¥ð…®', 119230 => 'ð†ºð…¥ð…®', 119231 => 'ð†¹ð…¥ð…¯', 119232 => 'ð†ºð…¥ð…¯', 119808 => 'a', 119809 => 'b', 119810 => 'c', 119811 => 'd', 119812 => 'e', 119813 => 'f', 119814 => 'g', 119815 => 'h', 119816 => 'i', 119817 => 'j', 119818 => 'k', 119819 => 'l', 119820 => 'm', 119821 => 'n', 119822 => 'o', 119823 => 'p', 119824 => 'q', 119825 => 'r', 119826 => 's', 119827 => 't', 119828 => 'u', 119829 => 'v', 119830 => 'w', 119831 => 'x', 119832 => 'y', 119833 => 'z', 119834 => 'a', 119835 => 'b', 119836 => 'c', 119837 => 'd', 119838 => 'e', 119839 => 'f', 119840 => 'g', 119841 => 'h', 119842 => 'i', 119843 => 'j', 119844 => 'k', 119845 => 'l', 119846 => 'm', 119847 => 'n', 119848 => 'o', 119849 => 'p', 119850 => 'q', 119851 => 'r', 119852 => 's', 119853 => 't', 119854 => 'u', 119855 => 'v', 119856 => 'w', 119857 => 'x', 119858 => 'y', 119859 => 'z', 119860 => 'a', 119861 => 'b', 119862 => 'c', 119863 => 'd', 119864 => 'e', 119865 => 'f', 119866 => 'g', 119867 => 'h', 119868 => 'i', 119869 => 'j', 119870 => 'k', 119871 => 'l', 119872 => 'm', 119873 => 'n', 119874 => 'o', 119875 => 'p', 119876 => 'q', 119877 => 'r', 119878 => 's', 119879 => 't', 119880 => 'u', 119881 => 'v', 119882 => 'w', 119883 => 'x', 119884 => 'y', 119885 => 'z', 119886 => 'a', 119887 => 'b', 119888 => 'c', 119889 => 'd', 119890 => 'e', 119891 => 'f', 119892 => 'g', 119894 => 'i', 119895 => 'j', 119896 => 'k', 119897 => 'l', 119898 => 'm', 119899 => 'n', 119900 => 'o', 119901 => 'p', 119902 => 'q', 119903 => 'r', 119904 => 's', 119905 => 't', 119906 => 'u', 119907 => 'v', 119908 => 'w', 119909 => 'x', 119910 => 'y', 119911 => 'z', 119912 => 'a', 119913 => 'b', 119914 => 'c', 119915 => 'd', 119916 => 'e', 119917 => 'f', 119918 => 'g', 119919 => 'h', 119920 => 'i', 119921 => 'j', 119922 => 'k', 119923 => 'l', 119924 => 'm', 119925 => 'n', 119926 => 'o', 119927 => 'p', 119928 => 'q', 119929 => 'r', 119930 => 's', 119931 => 't', 119932 => 'u', 119933 => 'v', 119934 => 'w', 119935 => 'x', 119936 => 'y', 119937 => 'z', 119938 => 'a', 119939 => 'b', 119940 => 'c', 119941 => 'd', 119942 => 'e', 119943 => 'f', 119944 => 'g', 119945 => 'h', 119946 => 'i', 119947 => 'j', 119948 => 'k', 119949 => 'l', 119950 => 'm', 119951 => 'n', 119952 => 'o', 119953 => 'p', 119954 => 'q', 119955 => 'r', 119956 => 's', 119957 => 't', 119958 => 'u', 119959 => 'v', 119960 => 'w', 119961 => 'x', 119962 => 'y', 119963 => 'z', 119964 => 'a', 119966 => 'c', 119967 => 'd', 119970 => 'g', 119973 => 'j', 119974 => 'k', 119977 => 'n', 119978 => 'o', 119979 => 'p', 119980 => 'q', 119982 => 's', 119983 => 't', 119984 => 'u', 119985 => 'v', 119986 => 'w', 119987 => 'x', 119988 => 'y', 119989 => 'z', 119990 => 'a', 119991 => 'b', 119992 => 'c', 119993 => 'd', 119995 => 'f', 119997 => 'h', 119998 => 'i', 119999 => 'j', 120000 => 'k', 120001 => 'l', 120002 => 'm', 120003 => 'n', 120005 => 'p', 120006 => 'q', 120007 => 'r', 120008 => 's', 120009 => 't', 120010 => 'u', 120011 => 'v', 120012 => 'w', 120013 => 'x', 120014 => 'y', 120015 => 'z', 120016 => 'a', 120017 => 'b', 120018 => 'c', 120019 => 'd', 120020 => 'e', 120021 => 'f', 120022 => 'g', 120023 => 'h', 120024 => 'i', 120025 => 'j', 120026 => 'k', 120027 => 'l', 120028 => 'm', 120029 => 'n', 120030 => 'o', 120031 => 'p', 120032 => 'q', 120033 => 'r', 120034 => 's', 120035 => 't', 120036 => 'u', 120037 => 'v', 120038 => 'w', 120039 => 'x', 120040 => 'y', 120041 => 'z', 120042 => 'a', 120043 => 'b', 120044 => 'c', 120045 => 'd', 120046 => 'e', 120047 => 'f', 120048 => 'g', 120049 => 'h', 120050 => 'i', 120051 => 'j', 120052 => 'k', 120053 => 'l', 120054 => 'm', 120055 => 'n', 120056 => 'o', 120057 => 'p', 120058 => 'q', 120059 => 'r', 120060 => 's', 120061 => 't', 120062 => 'u', 120063 => 'v', 120064 => 'w', 120065 => 'x', 120066 => 'y', 120067 => 'z', 120068 => 'a', 120069 => 'b', 120071 => 'd', 120072 => 'e', 120073 => 'f', 120074 => 'g', 120077 => 'j', 120078 => 'k', 120079 => 'l', 120080 => 'm', 120081 => 'n', 120082 => 'o', 120083 => 'p', 120084 => 'q', 120086 => 's', 120087 => 't', 120088 => 'u', 120089 => 'v', 120090 => 'w', 120091 => 'x', 120092 => 'y', 120094 => 'a', 120095 => 'b', 120096 => 'c', 120097 => 'd', 120098 => 'e', 120099 => 'f', 120100 => 'g', 120101 => 'h', 120102 => 'i', 120103 => 'j', 120104 => 'k', 120105 => 'l', 120106 => 'm', 120107 => 'n', 120108 => 'o', 120109 => 'p', 120110 => 'q', 120111 => 'r', 120112 => 's', 120113 => 't', 120114 => 'u', 120115 => 'v', 120116 => 'w', 120117 => 'x', 120118 => 'y', 120119 => 'z', 120120 => 'a', 120121 => 'b', 120123 => 'd', 120124 => 'e', 120125 => 'f', 120126 => 'g', 120128 => 'i', 120129 => 'j', 120130 => 'k', 120131 => 'l', 120132 => 'm', 120134 => 'o', 120138 => 's', 120139 => 't', 120140 => 'u', 120141 => 'v', 120142 => 'w', 120143 => 'x', 120144 => 'y', 120146 => 'a', 120147 => 'b', 120148 => 'c', 120149 => 'd', 120150 => 'e', 120151 => 'f', 120152 => 'g', 120153 => 'h', 120154 => 'i', 120155 => 'j', 120156 => 'k', 120157 => 'l', 120158 => 'm', 120159 => 'n', 120160 => 'o', 120161 => 'p', 120162 => 'q', 120163 => 'r', 120164 => 's', 120165 => 't', 120166 => 'u', 120167 => 'v', 120168 => 'w', 120169 => 'x', 120170 => 'y', 120171 => 'z', 120172 => 'a', 120173 => 'b', 120174 => 'c', 120175 => 'd', 120176 => 'e', 120177 => 'f', 120178 => 'g', 120179 => 'h', 120180 => 'i', 120181 => 'j', 120182 => 'k', 120183 => 'l', 120184 => 'm', 120185 => 'n', 120186 => 'o', 120187 => 'p', 120188 => 'q', 120189 => 'r', 120190 => 's', 120191 => 't', 120192 => 'u', 120193 => 'v', 120194 => 'w', 120195 => 'x', 120196 => 'y', 120197 => 'z', 120198 => 'a', 120199 => 'b', 120200 => 'c', 120201 => 'd', 120202 => 'e', 120203 => 'f', 120204 => 'g', 120205 => 'h', 120206 => 'i', 120207 => 'j', 120208 => 'k', 120209 => 'l', 120210 => 'm', 120211 => 'n', 120212 => 'o', 120213 => 'p', 120214 => 'q', 120215 => 'r', 120216 => 's', 120217 => 't', 120218 => 'u', 120219 => 'v', 120220 => 'w', 120221 => 'x', 120222 => 'y', 120223 => 'z', 120224 => 'a', 120225 => 'b', 120226 => 'c', 120227 => 'd', 120228 => 'e', 120229 => 'f', 120230 => 'g', 120231 => 'h', 120232 => 'i', 120233 => 'j', 120234 => 'k', 120235 => 'l', 120236 => 'm', 120237 => 'n', 120238 => 'o', 120239 => 'p', 120240 => 'q', 120241 => 'r', 120242 => 's', 120243 => 't', 120244 => 'u', 120245 => 'v', 120246 => 'w', 120247 => 'x', 120248 => 'y', 120249 => 'z', 120250 => 'a', 120251 => 'b', 120252 => 'c', 120253 => 'd', 120254 => 'e', 120255 => 'f', 120256 => 'g', 120257 => 'h', 120258 => 'i', 120259 => 'j', 120260 => 'k', 120261 => 'l', 120262 => 'm', 120263 => 'n', 120264 => 'o', 120265 => 'p', 120266 => 'q', 120267 => 'r', 120268 => 's', 120269 => 't', 120270 => 'u', 120271 => 'v', 120272 => 'w', 120273 => 'x', 120274 => 'y', 120275 => 'z', 120276 => 'a', 120277 => 'b', 120278 => 'c', 120279 => 'd', 120280 => 'e', 120281 => 'f', 120282 => 'g', 120283 => 'h', 120284 => 'i', 120285 => 'j', 120286 => 'k', 120287 => 'l', 120288 => 'm', 120289 => 'n', 120290 => 'o', 120291 => 'p', 120292 => 'q', 120293 => 'r', 120294 => 's', 120295 => 't', 120296 => 'u', 120297 => 'v', 120298 => 'w', 120299 => 'x', 120300 => 'y', 120301 => 'z', 120302 => 'a', 120303 => 'b', 120304 => 'c', 120305 => 'd', 120306 => 'e', 120307 => 'f', 120308 => 'g', 120309 => 'h', 120310 => 'i', 120311 => 'j', 120312 => 'k', 120313 => 'l', 120314 => 'm', 120315 => 'n', 120316 => 'o', 120317 => 'p', 120318 => 'q', 120319 => 'r', 120320 => 's', 120321 => 't', 120322 => 'u', 120323 => 'v', 120324 => 'w', 120325 => 'x', 120326 => 'y', 120327 => 'z', 120328 => 'a', 120329 => 'b', 120330 => 'c', 120331 => 'd', 120332 => 'e', 120333 => 'f', 120334 => 'g', 120335 => 'h', 120336 => 'i', 120337 => 'j', 120338 => 'k', 120339 => 'l', 120340 => 'm', 120341 => 'n', 120342 => 'o', 120343 => 'p', 120344 => 'q', 120345 => 'r', 120346 => 's', 120347 => 't', 120348 => 'u', 120349 => 'v', 120350 => 'w', 120351 => 'x', 120352 => 'y', 120353 => 'z', 120354 => 'a', 120355 => 'b', 120356 => 'c', 120357 => 'd', 120358 => 'e', 120359 => 'f', 120360 => 'g', 120361 => 'h', 120362 => 'i', 120363 => 'j', 120364 => 'k', 120365 => 'l', 120366 => 'm', 120367 => 'n', 120368 => 'o', 120369 => 'p', 120370 => 'q', 120371 => 'r', 120372 => 's', 120373 => 't', 120374 => 'u', 120375 => 'v', 120376 => 'w', 120377 => 'x', 120378 => 'y', 120379 => 'z', 120380 => 'a', 120381 => 'b', 120382 => 'c', 120383 => 'd', 120384 => 'e', 120385 => 'f', 120386 => 'g', 120387 => 'h', 120388 => 'i', 120389 => 'j', 120390 => 'k', 120391 => 'l', 120392 => 'm', 120393 => 'n', 120394 => 'o', 120395 => 'p', 120396 => 'q', 120397 => 'r', 120398 => 's', 120399 => 't', 120400 => 'u', 120401 => 'v', 120402 => 'w', 120403 => 'x', 120404 => 'y', 120405 => 'z', 120406 => 'a', 120407 => 'b', 120408 => 'c', 120409 => 'd', 120410 => 'e', 120411 => 'f', 120412 => 'g', 120413 => 'h', 120414 => 'i', 120415 => 'j', 120416 => 'k', 120417 => 'l', 120418 => 'm', 120419 => 'n', 120420 => 'o', 120421 => 'p', 120422 => 'q', 120423 => 'r', 120424 => 's', 120425 => 't', 120426 => 'u', 120427 => 'v', 120428 => 'w', 120429 => 'x', 120430 => 'y', 120431 => 'z', 120432 => 'a', 120433 => 'b', 120434 => 'c', 120435 => 'd', 120436 => 'e', 120437 => 'f', 120438 => 'g', 120439 => 'h', 120440 => 'i', 120441 => 'j', 120442 => 'k', 120443 => 'l', 120444 => 'm', 120445 => 'n', 120446 => 'o', 120447 => 'p', 120448 => 'q', 120449 => 'r', 120450 => 's', 120451 => 't', 120452 => 'u', 120453 => 'v', 120454 => 'w', 120455 => 'x', 120456 => 'y', 120457 => 'z', 120458 => 'a', 120459 => 'b', 120460 => 'c', 120461 => 'd', 120462 => 'e', 120463 => 'f', 120464 => 'g', 120465 => 'h', 120466 => 'i', 120467 => 'j', 120468 => 'k', 120469 => 'l', 120470 => 'm', 120471 => 'n', 120472 => 'o', 120473 => 'p', 120474 => 'q', 120475 => 'r', 120476 => 's', 120477 => 't', 120478 => 'u', 120479 => 'v', 120480 => 'w', 120481 => 'x', 120482 => 'y', 120483 => 'z', 120484 => 'ı', 120485 => 'È·', 120488 => 'α', 120489 => 'β', 120490 => 'γ', 120491 => 'δ', 120492 => 'ε', 120493 => 'ζ', 120494 => 'η', 120495 => 'θ', 120496 => 'ι', 120497 => 'κ', 120498 => 'λ', 120499 => 'μ', 120500 => 'ν', 120501 => 'ξ', 120502 => 'ο', 120503 => 'Ï€', 120504 => 'Ï', 120505 => 'θ', 120506 => 'σ', 120507 => 'Ï„', 120508 => 'Ï…', 120509 => 'φ', 120510 => 'χ', 120511 => 'ψ', 120512 => 'ω', 120513 => '∇', 120514 => 'α', 120515 => 'β', 120516 => 'γ', 120517 => 'δ', 120518 => 'ε', 120519 => 'ζ', 120520 => 'η', 120521 => 'θ', 120522 => 'ι', 120523 => 'κ', 120524 => 'λ', 120525 => 'μ', 120526 => 'ν', 120527 => 'ξ', 120528 => 'ο', 120529 => 'Ï€', 120530 => 'Ï', 120531 => 'σ', 120532 => 'σ', 120533 => 'Ï„', 120534 => 'Ï…', 120535 => 'φ', 120536 => 'χ', 120537 => 'ψ', 120538 => 'ω', 120539 => '∂', 120540 => 'ε', 120541 => 'θ', 120542 => 'κ', 120543 => 'φ', 120544 => 'Ï', 120545 => 'Ï€', 120546 => 'α', 120547 => 'β', 120548 => 'γ', 120549 => 'δ', 120550 => 'ε', 120551 => 'ζ', 120552 => 'η', 120553 => 'θ', 120554 => 'ι', 120555 => 'κ', 120556 => 'λ', 120557 => 'μ', 120558 => 'ν', 120559 => 'ξ', 120560 => 'ο', 120561 => 'Ï€', 120562 => 'Ï', 120563 => 'θ', 120564 => 'σ', 120565 => 'Ï„', 120566 => 'Ï…', 120567 => 'φ', 120568 => 'χ', 120569 => 'ψ', 120570 => 'ω', 120571 => '∇', 120572 => 'α', 120573 => 'β', 120574 => 'γ', 120575 => 'δ', 120576 => 'ε', 120577 => 'ζ', 120578 => 'η', 120579 => 'θ', 120580 => 'ι', 120581 => 'κ', 120582 => 'λ', 120583 => 'μ', 120584 => 'ν', 120585 => 'ξ', 120586 => 'ο', 120587 => 'Ï€', 120588 => 'Ï', 120589 => 'σ', 120590 => 'σ', 120591 => 'Ï„', 120592 => 'Ï…', 120593 => 'φ', 120594 => 'χ', 120595 => 'ψ', 120596 => 'ω', 120597 => '∂', 120598 => 'ε', 120599 => 'θ', 120600 => 'κ', 120601 => 'φ', 120602 => 'Ï', 120603 => 'Ï€', 120604 => 'α', 120605 => 'β', 120606 => 'γ', 120607 => 'δ', 120608 => 'ε', 120609 => 'ζ', 120610 => 'η', 120611 => 'θ', 120612 => 'ι', 120613 => 'κ', 120614 => 'λ', 120615 => 'μ', 120616 => 'ν', 120617 => 'ξ', 120618 => 'ο', 120619 => 'Ï€', 120620 => 'Ï', 120621 => 'θ', 120622 => 'σ', 120623 => 'Ï„', 120624 => 'Ï…', 120625 => 'φ', 120626 => 'χ', 120627 => 'ψ', 120628 => 'ω', 120629 => '∇', 120630 => 'α', 120631 => 'β', 120632 => 'γ', 120633 => 'δ', 120634 => 'ε', 120635 => 'ζ', 120636 => 'η', 120637 => 'θ', 120638 => 'ι', 120639 => 'κ', 120640 => 'λ', 120641 => 'μ', 120642 => 'ν', 120643 => 'ξ', 120644 => 'ο', 120645 => 'Ï€', 120646 => 'Ï', 120647 => 'σ', 120648 => 'σ', 120649 => 'Ï„', 120650 => 'Ï…', 120651 => 'φ', 120652 => 'χ', 120653 => 'ψ', 120654 => 'ω', 120655 => '∂', 120656 => 'ε', 120657 => 'θ', 120658 => 'κ', 120659 => 'φ', 120660 => 'Ï', 120661 => 'Ï€', 120662 => 'α', 120663 => 'β', 120664 => 'γ', 120665 => 'δ', 120666 => 'ε', 120667 => 'ζ', 120668 => 'η', 120669 => 'θ', 120670 => 'ι', 120671 => 'κ', 120672 => 'λ', 120673 => 'μ', 120674 => 'ν', 120675 => 'ξ', 120676 => 'ο', 120677 => 'Ï€', 120678 => 'Ï', 120679 => 'θ', 120680 => 'σ', 120681 => 'Ï„', 120682 => 'Ï…', 120683 => 'φ', 120684 => 'χ', 120685 => 'ψ', 120686 => 'ω', 120687 => '∇', 120688 => 'α', 120689 => 'β', 120690 => 'γ', 120691 => 'δ', 120692 => 'ε', 120693 => 'ζ', 120694 => 'η', 120695 => 'θ', 120696 => 'ι', 120697 => 'κ', 120698 => 'λ', 120699 => 'μ', 120700 => 'ν', 120701 => 'ξ', 120702 => 'ο', 120703 => 'Ï€', 120704 => 'Ï', 120705 => 'σ', 120706 => 'σ', 120707 => 'Ï„', 120708 => 'Ï…', 120709 => 'φ', 120710 => 'χ', 120711 => 'ψ', 120712 => 'ω', 120713 => '∂', 120714 => 'ε', 120715 => 'θ', 120716 => 'κ', 120717 => 'φ', 120718 => 'Ï', 120719 => 'Ï€', 120720 => 'α', 120721 => 'β', 120722 => 'γ', 120723 => 'δ', 120724 => 'ε', 120725 => 'ζ', 120726 => 'η', 120727 => 'θ', 120728 => 'ι', 120729 => 'κ', 120730 => 'λ', 120731 => 'μ', 120732 => 'ν', 120733 => 'ξ', 120734 => 'ο', 120735 => 'Ï€', 120736 => 'Ï', 120737 => 'θ', 120738 => 'σ', 120739 => 'Ï„', 120740 => 'Ï…', 120741 => 'φ', 120742 => 'χ', 120743 => 'ψ', 120744 => 'ω', 120745 => '∇', 120746 => 'α', 120747 => 'β', 120748 => 'γ', 120749 => 'δ', 120750 => 'ε', 120751 => 'ζ', 120752 => 'η', 120753 => 'θ', 120754 => 'ι', 120755 => 'κ', 120756 => 'λ', 120757 => 'μ', 120758 => 'ν', 120759 => 'ξ', 120760 => 'ο', 120761 => 'Ï€', 120762 => 'Ï', 120763 => 'σ', 120764 => 'σ', 120765 => 'Ï„', 120766 => 'Ï…', 120767 => 'φ', 120768 => 'χ', 120769 => 'ψ', 120770 => 'ω', 120771 => '∂', 120772 => 'ε', 120773 => 'θ', 120774 => 'κ', 120775 => 'φ', 120776 => 'Ï', 120777 => 'Ï€', 120778 => 'Ï', 120779 => 'Ï', 120782 => '0', 120783 => '1', 120784 => '2', 120785 => '3', 120786 => '4', 120787 => '5', 120788 => '6', 120789 => '7', 120790 => '8', 120791 => '9', 120792 => '0', 120793 => '1', 120794 => '2', 120795 => '3', 120796 => '4', 120797 => '5', 120798 => '6', 120799 => '7', 120800 => '8', 120801 => '9', 120802 => '0', 120803 => '1', 120804 => '2', 120805 => '3', 120806 => '4', 120807 => '5', 120808 => '6', 120809 => '7', 120810 => '8', 120811 => '9', 120812 => '0', 120813 => '1', 120814 => '2', 120815 => '3', 120816 => '4', 120817 => '5', 120818 => '6', 120819 => '7', 120820 => '8', 120821 => '9', 120822 => '0', 120823 => '1', 120824 => '2', 120825 => '3', 120826 => '4', 120827 => '5', 120828 => '6', 120829 => '7', 120830 => '8', 120831 => '9', 125184 => '𞤢', 125185 => '𞤣', 125186 => '𞤤', 125187 => '𞤥', 125188 => '𞤦', 125189 => '𞤧', 125190 => '𞤨', 125191 => '𞤩', 125192 => '𞤪', 125193 => '𞤫', 125194 => '𞤬', 125195 => '𞤭', 125196 => '𞤮', 125197 => '𞤯', 125198 => '𞤰', 125199 => '𞤱', 125200 => '𞤲', 125201 => '𞤳', 125202 => '𞤴', 125203 => '𞤵', 125204 => '𞤶', 125205 => '𞤷', 125206 => '𞤸', 125207 => '𞤹', 125208 => '𞤺', 125209 => '𞤻', 125210 => '𞤼', 125211 => '𞤽', 125212 => '𞤾', 125213 => '𞤿', 125214 => '𞥀', 125215 => 'ðž¥', 125216 => '𞥂', 125217 => '𞥃', 126464 => 'ا', 126465 => 'ب', 126466 => 'ج', 126467 => 'د', 126469 => 'Ùˆ', 126470 => 'ز', 126471 => 'Ø­', 126472 => 'Ø·', 126473 => 'ÙŠ', 126474 => 'Ùƒ', 126475 => 'Ù„', 126476 => 'Ù…', 126477 => 'Ù†', 126478 => 'س', 126479 => 'ع', 126480 => 'Ù', 126481 => 'ص', 126482 => 'Ù‚', 126483 => 'ر', 126484 => 'Ø´', 126485 => 'ت', 126486 => 'Ø«', 126487 => 'Ø®', 126488 => 'Ø°', 126489 => 'ض', 126490 => 'ظ', 126491 => 'غ', 126492 => 'Ù®', 126493 => 'Úº', 126494 => 'Ú¡', 126495 => 'Ù¯', 126497 => 'ب', 126498 => 'ج', 126500 => 'Ù‡', 126503 => 'Ø­', 126505 => 'ÙŠ', 126506 => 'Ùƒ', 126507 => 'Ù„', 126508 => 'Ù…', 126509 => 'Ù†', 126510 => 'س', 126511 => 'ع', 126512 => 'Ù', 126513 => 'ص', 126514 => 'Ù‚', 126516 => 'Ø´', 126517 => 'ت', 126518 => 'Ø«', 126519 => 'Ø®', 126521 => 'ض', 126523 => 'غ', 126530 => 'ج', 126535 => 'Ø­', 126537 => 'ÙŠ', 126539 => 'Ù„', 126541 => 'Ù†', 126542 => 'س', 126543 => 'ع', 126545 => 'ص', 126546 => 'Ù‚', 126548 => 'Ø´', 126551 => 'Ø®', 126553 => 'ض', 126555 => 'غ', 126557 => 'Úº', 126559 => 'Ù¯', 126561 => 'ب', 126562 => 'ج', 126564 => 'Ù‡', 126567 => 'Ø­', 126568 => 'Ø·', 126569 => 'ÙŠ', 126570 => 'Ùƒ', 126572 => 'Ù…', 126573 => 'Ù†', 126574 => 'س', 126575 => 'ع', 126576 => 'Ù', 126577 => 'ص', 126578 => 'Ù‚', 126580 => 'Ø´', 126581 => 'ت', 126582 => 'Ø«', 126583 => 'Ø®', 126585 => 'ض', 126586 => 'ظ', 126587 => 'غ', 126588 => 'Ù®', 126590 => 'Ú¡', 126592 => 'ا', 126593 => 'ب', 126594 => 'ج', 126595 => 'د', 126596 => 'Ù‡', 126597 => 'Ùˆ', 126598 => 'ز', 126599 => 'Ø­', 126600 => 'Ø·', 126601 => 'ÙŠ', 126603 => 'Ù„', 126604 => 'Ù…', 126605 => 'Ù†', 126606 => 'س', 126607 => 'ع', 126608 => 'Ù', 126609 => 'ص', 126610 => 'Ù‚', 126611 => 'ر', 126612 => 'Ø´', 126613 => 'ت', 126614 => 'Ø«', 126615 => 'Ø®', 126616 => 'Ø°', 126617 => 'ض', 126618 => 'ظ', 126619 => 'غ', 126625 => 'ب', 126626 => 'ج', 126627 => 'د', 126629 => 'Ùˆ', 126630 => 'ز', 126631 => 'Ø­', 126632 => 'Ø·', 126633 => 'ÙŠ', 126635 => 'Ù„', 126636 => 'Ù…', 126637 => 'Ù†', 126638 => 'س', 126639 => 'ع', 126640 => 'Ù', 126641 => 'ص', 126642 => 'Ù‚', 126643 => 'ر', 126644 => 'Ø´', 126645 => 'ت', 126646 => 'Ø«', 126647 => 'Ø®', 126648 => 'Ø°', 126649 => 'ض', 126650 => 'ظ', 126651 => 'غ', 127274 => '〔s〕', 127275 => 'c', 127276 => 'r', 127277 => 'cd', 127278 => 'wz', 127280 => 'a', 127281 => 'b', 127282 => 'c', 127283 => 'd', 127284 => 'e', 127285 => 'f', 127286 => 'g', 127287 => 'h', 127288 => 'i', 127289 => 'j', 127290 => 'k', 127291 => 'l', 127292 => 'm', 127293 => 'n', 127294 => 'o', 127295 => 'p', 127296 => 'q', 127297 => 'r', 127298 => 's', 127299 => 't', 127300 => 'u', 127301 => 'v', 127302 => 'w', 127303 => 'x', 127304 => 'y', 127305 => 'z', 127306 => 'hv', 127307 => 'mv', 127308 => 'sd', 127309 => 'ss', 127310 => 'ppv', 127311 => 'wc', 127338 => 'mc', 127339 => 'md', 127340 => 'mr', 127376 => 'dj', 127488 => 'ã»ã‹', 127489 => 'ココ', 127490 => 'サ', 127504 => '手', 127505 => 'å­—', 127506 => 'åŒ', 127507 => 'デ', 127508 => '二', 127509 => '多', 127510 => '解', 127511 => '天', 127512 => '交', 127513 => '映', 127514 => 'ç„¡', 127515 => 'æ–™', 127516 => 'å‰', 127517 => '後', 127518 => 'å†', 127519 => 'æ–°', 127520 => 'åˆ', 127521 => '終', 127522 => '生', 127523 => '販', 127524 => '声', 127525 => 'å¹', 127526 => 'æ¼”', 127527 => '投', 127528 => 'æ•', 127529 => '一', 127530 => '三', 127531 => 'éŠ', 127532 => 'å·¦', 127533 => '中', 127534 => 'å³', 127535 => '指', 127536 => 'èµ°', 127537 => '打', 127538 => 'ç¦', 127539 => '空', 127540 => 'åˆ', 127541 => '満', 127542 => '有', 127543 => '月', 127544 => '申', 127545 => '割', 127546 => 'å–¶', 127547 => 'é…', 127552 => '〔本〕', 127553 => '〔三〕', 127554 => '〔二〕', 127555 => '〔安〕', 127556 => '〔点〕', 127557 => '〔打〕', 127558 => '〔盗〕', 127559 => '〔å‹ã€•', 127560 => '〔敗〕', 127568 => 'å¾—', 127569 => 'å¯', 130032 => '0', 130033 => '1', 130034 => '2', 130035 => '3', 130036 => '4', 130037 => '5', 130038 => '6', 130039 => '7', 130040 => '8', 130041 => '9', 194560 => '丽', 194561 => '丸', 194562 => 'ä¹', 194563 => 'ð „¢', 194564 => 'ä½ ', 194565 => 'ä¾®', 194566 => 'ä¾»', 194567 => '倂', 194568 => 'åº', 194569 => 'å‚™', 194570 => '僧', 194571 => 'åƒ', 194572 => 'ã’ž', 194573 => '𠘺', 194574 => 'å…', 194575 => 'å…”', 194576 => 'å…¤', 194577 => 'å…·', 194578 => '𠔜', 194579 => 'ã’¹', 194580 => 'å…§', 194581 => 'å†', 194582 => 'ð •‹', 194583 => '冗', 194584 => '冤', 194585 => '仌', 194586 => '冬', 194587 => '况', 194588 => '𩇟', 194589 => '凵', 194590 => '刃', 194591 => 'ã“Ÿ', 194592 => '刻', 194593 => '剆', 194594 => '割', 194595 => '剷', 194596 => '㔕', 194597 => '勇', 194598 => '勉', 194599 => '勤', 194600 => '勺', 194601 => '包', 194602 => '匆', 194603 => '北', 194604 => 'å‰', 194605 => 'å‘', 194606 => 'åš', 194607 => 'å³', 194608 => 'å½', 194609 => 'å¿', 194610 => 'å¿', 194611 => 'å¿', 194612 => '𠨬', 194613 => 'ç°', 194614 => 'åŠ', 194615 => 'åŸ', 194616 => 'ð ­£', 194617 => 'å«', 194618 => 'å±', 194619 => 'å†', 194620 => 'å’ž', 194621 => 'å¸', 194622 => '呈', 194623 => '周', 194624 => 'å’¢', 194625 => '哶', 194626 => 'å”', 194627 => 'å•“', 194628 => 'å•£', 194629 => 'å–„', 194630 => 'å–„', 194631 => 'å–™', 194632 => 'å–«', 194633 => 'å–³', 194634 => 'å—‚', 194635 => '圖', 194636 => '嘆', 194637 => '圗', 194638 => '噑', 194639 => 'å™´', 194640 => '切', 194641 => '壮', 194642 => '城', 194643 => '埴', 194644 => 'å ', 194645 => 'åž‹', 194646 => 'å ²', 194647 => 'å ±', 194648 => '墬', 194649 => '𡓤', 194650 => '売', 194651 => '壷', 194652 => '夆', 194653 => '多', 194654 => '夢', 194655 => '奢', 194656 => '𡚨', 194657 => '𡛪', 194658 => '姬', 194659 => '娛', 194660 => '娧', 194661 => '姘', 194662 => '婦', 194663 => 'ã›®', 194665 => '嬈', 194666 => '嬾', 194667 => '嬾', 194668 => '𡧈', 194669 => '寃', 194670 => '寘', 194671 => '寧', 194672 => '寳', 194673 => '𡬘', 194674 => '寿', 194675 => 'å°†', 194677 => 'å°¢', 194678 => 'ãž', 194679 => 'å± ', 194680 => 'å±®', 194681 => 'å³€', 194682 => 'å²', 194683 => 'ð¡·¤', 194684 => '嵃', 194685 => 'ð¡·¦', 194686 => 'åµ®', 194687 => '嵫', 194688 => 'åµ¼', 194689 => 'å·¡', 194690 => 'å·¢', 194691 => 'ã ¯', 194692 => 'å·½', 194693 => '帨', 194694 => '帽', 194695 => '幩', 194696 => 'ã¡¢', 194697 => '𢆃', 194698 => '㡼', 194699 => '庰', 194700 => '庳', 194701 => '庶', 194702 => '廊', 194703 => '𪎒', 194704 => '廾', 194705 => '𢌱', 194706 => '𢌱', 194707 => 'èˆ', 194708 => 'å¼¢', 194709 => 'å¼¢', 194710 => '㣇', 194711 => '𣊸', 194712 => '𦇚', 194713 => 'å½¢', 194714 => '彫', 194715 => '㣣', 194716 => '徚', 194717 => 'å¿', 194718 => 'å¿—', 194719 => '忹', 194720 => 'æ‚', 194721 => '㤺', 194722 => '㤜', 194723 => 'æ‚”', 194724 => '𢛔', 194725 => '惇', 194726 => 'æ…ˆ', 194727 => 'æ…Œ', 194728 => 'æ…Ž', 194729 => 'æ…Œ', 194730 => 'æ…º', 194731 => '憎', 194732 => '憲', 194733 => '憤', 194734 => '憯', 194735 => '懞', 194736 => '懲', 194737 => '懶', 194738 => 'æˆ', 194739 => '戛', 194740 => 'æ‰', 194741 => '抱', 194742 => 'æ‹”', 194743 => 'æ', 194744 => '𢬌', 194745 => '挽', 194746 => '拼', 194747 => 'æ¨', 194748 => '掃', 194749 => 'æ¤', 194750 => '𢯱', 194751 => 'æ¢', 194752 => 'æ…', 194753 => '掩', 194754 => '㨮', 194755 => 'æ‘©', 194756 => '摾', 194757 => 'æ’', 194758 => 'æ‘·', 194759 => '㩬', 194760 => 'æ•', 194761 => '敬', 194762 => '𣀊', 194763 => 'æ—£', 194764 => '書', 194765 => '晉', 194766 => '㬙', 194767 => 'æš‘', 194768 => '㬈', 194769 => '㫤', 194770 => '冒', 194771 => '冕', 194772 => '最', 194773 => 'æšœ', 194774 => 'è‚­', 194775 => 'ä™', 194776 => '朗', 194777 => '望', 194778 => '朡', 194779 => 'æž', 194780 => 'æ“', 194781 => 'ð£ƒ', 194782 => 'ã­‰', 194783 => '柺', 194784 => 'æž…', 194785 => 'æ¡’', 194786 => '梅', 194787 => '𣑭', 194788 => '梎', 194789 => 'æ Ÿ', 194790 => '椔', 194791 => 'ã®', 194792 => '楂', 194793 => '榣', 194794 => '槪', 194795 => '檨', 194796 => '𣚣', 194797 => 'æ«›', 194798 => 'ã°˜', 194799 => '次', 194800 => '𣢧', 194801 => 'æ­”', 194802 => '㱎', 194803 => 'æ­²', 194804 => '殟', 194805 => '殺', 194806 => 'æ®»', 194807 => 'ð£ª', 194808 => 'ð¡´‹', 194809 => '𣫺', 194810 => '汎', 194811 => '𣲼', 194812 => '沿', 194813 => 'æ³', 194814 => '汧', 194815 => 'æ´–', 194816 => 'æ´¾', 194817 => 'æµ·', 194818 => 'æµ', 194819 => '浩', 194820 => '浸', 194821 => '涅', 194822 => '𣴞', 194823 => 'æ´´', 194824 => '港', 194825 => 'æ¹®', 194826 => 'ã´³', 194827 => '滋', 194828 => '滇', 194829 => '𣻑', 194830 => 'æ·¹', 194831 => 'æ½®', 194832 => '𣽞', 194833 => '𣾎', 194834 => '濆', 194835 => '瀹', 194836 => '瀞', 194837 => '瀛', 194838 => '㶖', 194839 => 'çŠ', 194840 => 'ç½', 194841 => 'ç·', 194842 => 'ç‚­', 194843 => '𠔥', 194844 => 'ç……', 194845 => '𤉣', 194846 => '熜', 194848 => '爨', 194849 => '爵', 194850 => 'ç‰', 194851 => '𤘈', 194852 => '犀', 194853 => '犕', 194854 => '𤜵', 194855 => '𤠔', 194856 => 'çº', 194857 => '王', 194858 => '㺬', 194859 => '玥', 194860 => '㺸', 194861 => '㺸', 194862 => '瑇', 194863 => 'ç‘œ', 194864 => '瑱', 194865 => 'ç’…', 194866 => 'ç“Š', 194867 => 'ã¼›', 194868 => '甤', 194869 => '𤰶', 194870 => '甾', 194871 => '𤲒', 194872 => 'ç•°', 194873 => '𢆟', 194874 => 'ç˜', 194875 => '𤾡', 194876 => '𤾸', 194877 => 'ð¥„', 194878 => '㿼', 194879 => '䀈', 194880 => 'ç›´', 194881 => '𥃳', 194882 => '𥃲', 194883 => '𥄙', 194884 => '𥄳', 194885 => '眞', 194886 => '真', 194887 => '真', 194888 => 'çŠ', 194889 => '䀹', 194890 => 'çž‹', 194891 => 'ä†', 194892 => 'ä‚–', 194893 => 'ð¥', 194894 => 'ç¡Ž', 194895 => '碌', 194896 => '磌', 194897 => '䃣', 194898 => '𥘦', 194899 => '祖', 194900 => '𥚚', 194901 => '𥛅', 194902 => 'ç¦', 194903 => '秫', 194904 => '䄯', 194905 => 'ç©€', 194906 => 'ç©Š', 194907 => 'ç©', 194908 => '𥥼', 194909 => '𥪧', 194910 => '𥪧', 194912 => '䈂', 194913 => '𥮫', 194914 => '篆', 194915 => '築', 194916 => '䈧', 194917 => '𥲀', 194918 => 'ç³’', 194919 => '䊠', 194920 => '糨', 194921 => 'ç³£', 194922 => 'ç´€', 194923 => '𥾆', 194924 => 'çµ£', 194925 => 'äŒ', 194926 => 'ç·‡', 194927 => '縂', 194928 => 'ç¹…', 194929 => '䌴', 194930 => '𦈨', 194931 => '𦉇', 194932 => 'ä™', 194933 => '𦋙', 194934 => '罺', 194935 => '𦌾', 194936 => '羕', 194937 => '翺', 194938 => '者', 194939 => '𦓚', 194940 => '𦔣', 194941 => 'è ', 194942 => '𦖨', 194943 => 'è°', 194944 => 'ð£Ÿ', 194945 => 'ä•', 194946 => '育', 194947 => '脃', 194948 => 'ä‹', 194949 => '脾', 194950 => '媵', 194951 => '𦞧', 194952 => '𦞵', 194953 => '𣎓', 194954 => '𣎜', 194955 => 'èˆ', 194956 => '舄', 194957 => '辞', 194958 => 'ä‘«', 194959 => '芑', 194960 => '芋', 194961 => 'èŠ', 194962 => '劳', 194963 => '花', 194964 => '芳', 194965 => '芽', 194966 => '苦', 194967 => '𦬼', 194968 => 'è‹¥', 194969 => 'èŒ', 194970 => 'è£', 194971 => '莭', 194972 => '茣', 194973 => '莽', 194974 => 'è§', 194975 => 'è‘—', 194976 => 'è“', 194977 => 'èŠ', 194978 => 'èŒ', 194979 => 'èœ', 194980 => '𦰶', 194981 => '𦵫', 194982 => '𦳕', 194983 => '䔫', 194984 => '蓱', 194985 => '蓳', 194986 => 'è”–', 194987 => 'ð§Š', 194988 => '蕤', 194989 => '𦼬', 194990 => 'ä•', 194991 => 'ä•¡', 194992 => '𦾱', 194993 => '𧃒', 194994 => 'ä•«', 194995 => 'è™', 194996 => '虜', 194997 => '虧', 194998 => '虩', 194999 => 'èš©', 195000 => '蚈', 195001 => '蜎', 195002 => '蛢', 195003 => 'è¹', 195004 => '蜨', 195005 => 'è«', 195006 => '螆', 195008 => '蟡', 195009 => 'è ', 195010 => 'ä—¹', 195011 => 'è¡ ', 195012 => 'è¡£', 195013 => '𧙧', 195014 => '裗', 195015 => '裞', 195016 => '䘵', 195017 => '裺', 195018 => 'ã’»', 195019 => '𧢮', 195020 => '𧥦', 195021 => 'äš¾', 195022 => '䛇', 195023 => '誠', 195024 => 'è«­', 195025 => '變', 195026 => '豕', 195027 => '𧲨', 195028 => '貫', 195029 => 'è³', 195030 => 'è´›', 195031 => 'èµ·', 195032 => '𧼯', 195033 => 'ð  „', 195034 => 'è·‹', 195035 => '趼', 195036 => 'è·°', 195037 => '𠣞', 195038 => 'è»”', 195039 => '輸', 195040 => '𨗒', 195041 => '𨗭', 195042 => 'é‚”', 195043 => '郱', 195044 => 'é„‘', 195045 => '𨜮', 195046 => 'é„›', 195047 => '鈸', 195048 => 'é‹—', 195049 => '鋘', 195050 => '鉼', 195051 => 'é¹', 195052 => 'é•', 195053 => '𨯺', 195054 => 'é–‹', 195055 => '䦕', 195056 => 'é–·', 195057 => '𨵷', 195058 => '䧦', 195059 => '雃', 195060 => '嶲', 195061 => '霣', 195062 => 'ð©……', 195063 => '𩈚', 195064 => 'ä©®', 195065 => '䩶', 195066 => '韠', 195067 => 'ð©Š', 195068 => '䪲', 195069 => 'ð©’–', 195070 => 'é ‹', 195071 => 'é ‹', 195072 => 'é ©', 195073 => 'ð©–¶', 195074 => '飢', 195075 => '䬳', 195076 => '餩', 195077 => '馧', 195078 => '駂', 195079 => '駾', 195080 => '䯎', 195081 => '𩬰', 195082 => '鬒', 195083 => 'é±€', 195084 => 'é³½', 195085 => '䳎', 195086 => 'ä³­', 195087 => '鵧', 195088 => '𪃎', 195089 => '䳸', 195090 => '𪄅', 195091 => '𪈎', 195092 => '𪊑', 195093 => '麻', 195094 => 'äµ–', 195095 => '黹', 195096 => '黾', 195097 => 'é¼…', 195098 => 'é¼', 195099 => 'é¼–', 195100 => 'é¼»', 195101 => '𪘀'); dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php000064400000011403147600374260031165 0ustar00addons ' ', 168 => ' ̈', 175 => ' Ì„', 180 => ' Ì', 184 => ' ̧', 728 => ' ̆', 729 => ' ̇', 730 => ' ÌŠ', 731 => ' ̨', 732 => ' ̃', 733 => ' Ì‹', 890 => ' ι', 894 => ';', 900 => ' Ì', 901 => ' ̈Ì', 8125 => ' Ì“', 8127 => ' Ì“', 8128 => ' Í‚', 8129 => ' ̈͂', 8141 => ' Ì“Ì€', 8142 => ' Ì“Ì', 8143 => ' Ì“Í‚', 8157 => ' ̔̀', 8158 => ' Ì”Ì', 8159 => ' ̔͂', 8173 => ' ̈̀', 8174 => ' ̈Ì', 8175 => '`', 8189 => ' Ì', 8190 => ' Ì”', 8192 => ' ', 8193 => ' ', 8194 => ' ', 8195 => ' ', 8196 => ' ', 8197 => ' ', 8198 => ' ', 8199 => ' ', 8200 => ' ', 8201 => ' ', 8202 => ' ', 8215 => ' ̳', 8239 => ' ', 8252 => '!!', 8254 => ' Ì…', 8263 => '?:', 8264 => '?!', 8265 => '!?', 8287 => ' ', 8314 => '+', 8316 => '=', 8317 => '(', 8318 => ')', 8330 => '+', 8332 => '=', 8333 => '(', 8334 => ')', 8448 => 'a/c', 8449 => 'a/s', 8453 => 'c/o', 8454 => 'c/u', 9332 => '(1)', 9333 => '(2)', 9334 => '(3)', 9335 => '(4)', 9336 => '(5)', 9337 => '(6)', 9338 => '(7)', 9339 => '(8)', 9340 => '(9)', 9341 => '(10)', 9342 => '(11)', 9343 => '(12)', 9344 => '(13)', 9345 => '(14)', 9346 => '(15)', 9347 => '(16)', 9348 => '(17)', 9349 => '(18)', 9350 => '(19)', 9351 => '(20)', 9372 => '(a)', 9373 => '(b)', 9374 => '(c)', 9375 => '(d)', 9376 => '(e)', 9377 => '(f)', 9378 => '(g)', 9379 => '(h)', 9380 => '(i)', 9381 => '(j)', 9382 => '(k)', 9383 => '(l)', 9384 => '(m)', 9385 => '(n)', 9386 => '(o)', 9387 => '(p)', 9388 => '(q)', 9389 => '(r)', 9390 => '(s)', 9391 => '(t)', 9392 => '(u)', 9393 => '(v)', 9394 => '(w)', 9395 => '(x)', 9396 => '(y)', 9397 => '(z)', 10868 => '::=', 10869 => '==', 10870 => '===', 12288 => ' ', 12443 => ' ã‚™', 12444 => ' ã‚š', 12800 => '(á„€)', 12801 => '(á„‚)', 12802 => '(ᄃ)', 12803 => '(á„…)', 12804 => '(ᄆ)', 12805 => '(ᄇ)', 12806 => '(ᄉ)', 12807 => '(á„‹)', 12808 => '(á„Œ)', 12809 => '(á„Ž)', 12810 => '(á„)', 12811 => '(á„)', 12812 => '(á„‘)', 12813 => '(á„’)', 12814 => '(ê°€)', 12815 => '(나)', 12816 => '(다)', 12817 => '(ë¼)', 12818 => '(마)', 12819 => '(ë°”)', 12820 => '(사)', 12821 => '(ì•„)', 12822 => '(ìž)', 12823 => '(ì°¨)', 12824 => '(ì¹´)', 12825 => '(타)', 12826 => '(파)', 12827 => '(하)', 12828 => '(주)', 12829 => '(오전)', 12830 => '(오후)', 12832 => '(一)', 12833 => '(二)', 12834 => '(三)', 12835 => '(å››)', 12836 => '(五)', 12837 => '(å…­)', 12838 => '(七)', 12839 => '(å…«)', 12840 => '(ä¹)', 12841 => '(å)', 12842 => '(月)', 12843 => '(ç«)', 12844 => '(æ°´)', 12845 => '(木)', 12846 => '(金)', 12847 => '(土)', 12848 => '(æ—¥)', 12849 => '(æ ª)', 12850 => '(有)', 12851 => '(社)', 12852 => '(å)', 12853 => '(特)', 12854 => '(財)', 12855 => '(ç¥)', 12856 => '(労)', 12857 => '(代)', 12858 => '(呼)', 12859 => '(å­¦)', 12860 => '(監)', 12861 => '(ä¼)', 12862 => '(資)', 12863 => '(å”)', 12864 => '(祭)', 12865 => '(休)', 12866 => '(自)', 12867 => '(至)', 64297 => '+', 64606 => ' ٌّ', 64607 => ' ÙÙ‘', 64608 => ' ÙŽÙ‘', 64609 => ' ÙÙ‘', 64610 => ' ÙÙ‘', 64611 => ' ّٰ', 65018 => 'صلى الله عليه وسلم', 65019 => 'جل جلاله', 65040 => ',', 65043 => ':', 65044 => ';', 65045 => '!', 65046 => '?', 65075 => '_', 65076 => '_', 65077 => '(', 65078 => ')', 65079 => '{', 65080 => '}', 65095 => '[', 65096 => ']', 65097 => ' Ì…', 65098 => ' Ì…', 65099 => ' Ì…', 65100 => ' Ì…', 65101 => '_', 65102 => '_', 65103 => '_', 65104 => ',', 65108 => ';', 65109 => ':', 65110 => '?', 65111 => '!', 65113 => '(', 65114 => ')', 65115 => '{', 65116 => '}', 65119 => '#', 65120 => '&', 65121 => '*', 65122 => '+', 65124 => '<', 65125 => '>', 65126 => '=', 65128 => '\\', 65129 => '$', 65130 => '%', 65131 => '@', 65136 => ' Ù‹', 65138 => ' ÙŒ', 65140 => ' Ù', 65142 => ' ÙŽ', 65144 => ' Ù', 65146 => ' Ù', 65148 => ' Ù‘', 65150 => ' Ù’', 65281 => '!', 65282 => '"', 65283 => '#', 65284 => '$', 65285 => '%', 65286 => '&', 65287 => '\'', 65288 => '(', 65289 => ')', 65290 => '*', 65291 => '+', 65292 => ',', 65295 => '/', 65306 => ':', 65307 => ';', 65308 => '<', 65309 => '=', 65310 => '>', 65311 => '?', 65312 => '@', 65339 => '[', 65340 => '\\', 65341 => ']', 65342 => '^', 65343 => '_', 65344 => '`', 65371 => '{', 65372 => '|', 65373 => '}', 65374 => '~', 65507 => ' Ì„', 127233 => '0,', 127234 => '1,', 127235 => '2,', 127236 => '3,', 127237 => '4,', 127238 => '5,', 127239 => '6,', 127240 => '7,', 127241 => '8,', 127242 => '9,', 127248 => '(a)', 127249 => '(b)', 127250 => '(c)', 127251 => '(d)', 127252 => '(e)', 127253 => '(f)', 127254 => '(g)', 127255 => '(h)', 127256 => '(i)', 127257 => '(j)', 127258 => '(k)', 127259 => '(l)', 127260 => '(m)', 127261 => '(n)', 127262 => '(o)', 127263 => '(p)', 127264 => '(q)', 127265 => '(r)', 127266 => '(s)', 127267 => '(t)', 127268 => '(u)', 127269 => '(v)', 127270 => '(w)', 127271 => '(x)', 127272 => '(y)', 127273 => '(z)'); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/ignored.php000064400000010764147600374260026432 0ustar00 \true, 847 => \true, 6155 => \true, 6156 => \true, 6157 => \true, 8203 => \true, 8288 => \true, 8292 => \true, 65024 => \true, 65025 => \true, 65026 => \true, 65027 => \true, 65028 => \true, 65029 => \true, 65030 => \true, 65031 => \true, 65032 => \true, 65033 => \true, 65034 => \true, 65035 => \true, 65036 => \true, 65037 => \true, 65038 => \true, 65039 => \true, 65279 => \true, 113824 => \true, 113825 => \true, 113826 => \true, 113827 => \true, 917760 => \true, 917761 => \true, 917762 => \true, 917763 => \true, 917764 => \true, 917765 => \true, 917766 => \true, 917767 => \true, 917768 => \true, 917769 => \true, 917770 => \true, 917771 => \true, 917772 => \true, 917773 => \true, 917774 => \true, 917775 => \true, 917776 => \true, 917777 => \true, 917778 => \true, 917779 => \true, 917780 => \true, 917781 => \true, 917782 => \true, 917783 => \true, 917784 => \true, 917785 => \true, 917786 => \true, 917787 => \true, 917788 => \true, 917789 => \true, 917790 => \true, 917791 => \true, 917792 => \true, 917793 => \true, 917794 => \true, 917795 => \true, 917796 => \true, 917797 => \true, 917798 => \true, 917799 => \true, 917800 => \true, 917801 => \true, 917802 => \true, 917803 => \true, 917804 => \true, 917805 => \true, 917806 => \true, 917807 => \true, 917808 => \true, 917809 => \true, 917810 => \true, 917811 => \true, 917812 => \true, 917813 => \true, 917814 => \true, 917815 => \true, 917816 => \true, 917817 => \true, 917818 => \true, 917819 => \true, 917820 => \true, 917821 => \true, 917822 => \true, 917823 => \true, 917824 => \true, 917825 => \true, 917826 => \true, 917827 => \true, 917828 => \true, 917829 => \true, 917830 => \true, 917831 => \true, 917832 => \true, 917833 => \true, 917834 => \true, 917835 => \true, 917836 => \true, 917837 => \true, 917838 => \true, 917839 => \true, 917840 => \true, 917841 => \true, 917842 => \true, 917843 => \true, 917844 => \true, 917845 => \true, 917846 => \true, 917847 => \true, 917848 => \true, 917849 => \true, 917850 => \true, 917851 => \true, 917852 => \true, 917853 => \true, 917854 => \true, 917855 => \true, 917856 => \true, 917857 => \true, 917858 => \true, 917859 => \true, 917860 => \true, 917861 => \true, 917862 => \true, 917863 => \true, 917864 => \true, 917865 => \true, 917866 => \true, 917867 => \true, 917868 => \true, 917869 => \true, 917870 => \true, 917871 => \true, 917872 => \true, 917873 => \true, 917874 => \true, 917875 => \true, 917876 => \true, 917877 => \true, 917878 => \true, 917879 => \true, 917880 => \true, 917881 => \true, 917882 => \true, 917883 => \true, 917884 => \true, 917885 => \true, 917886 => \true, 917887 => \true, 917888 => \true, 917889 => \true, 917890 => \true, 917891 => \true, 917892 => \true, 917893 => \true, 917894 => \true, 917895 => \true, 917896 => \true, 917897 => \true, 917898 => \true, 917899 => \true, 917900 => \true, 917901 => \true, 917902 => \true, 917903 => \true, 917904 => \true, 917905 => \true, 917906 => \true, 917907 => \true, 917908 => \true, 917909 => \true, 917910 => \true, 917911 => \true, 917912 => \true, 917913 => \true, 917914 => \true, 917915 => \true, 917916 => \true, 917917 => \true, 917918 => \true, 917919 => \true, 917920 => \true, 917921 => \true, 917922 => \true, 917923 => \true, 917924 => \true, 917925 => \true, 917926 => \true, 917927 => \true, 917928 => \true, 917929 => \true, 917930 => \true, 917931 => \true, 917932 => \true, 917933 => \true, 917934 => \true, 917935 => \true, 917936 => \true, 917937 => \true, 917938 => \true, 917939 => \true, 917940 => \true, 917941 => \true, 917942 => \true, 917943 => \true, 917944 => \true, 917945 => \true, 917946 => \true, 917947 => \true, 917948 => \true, 917949 => \true, 917950 => \true, 917951 => \true, 917952 => \true, 917953 => \true, 917954 => \true, 917955 => \true, 917956 => \true, 917957 => \true, 917958 => \true, 917959 => \true, 917960 => \true, 917961 => \true, 917962 => \true, 917963 => \true, 917964 => \true, 917965 => \true, 917966 => \true, 917967 => \true, 917968 => \true, 917969 => \true, 917970 => \true, 917971 => \true, 917972 => \true, 917973 => \true, 917974 => \true, 917975 => \true, 917976 => \true, 917977 => \true, 917978 => \true, 917979 => \true, 917980 => \true, 917981 => \true, 917982 => \true, 917983 => \true, 917984 => \true, 917985 => \true, 917986 => \true, 917987 => \true, 917988 => \true, 917989 => \true, 917990 => \true, 917991 => \true, 917992 => \true, 917993 => \true, 917994 => \true, 917995 => \true, 917996 => \true, 917997 => \true, 917998 => \true, 917999 => \true); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php000064400000021377147600374260030234 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn\Resources\unidata; /** * @internal */ final class DisallowedRanges { /** * @param $codePoint * * @return bool */ public static function inRange($codePoint) { if ($codePoint >= 128 && $codePoint <= 159) { return \true; } if ($codePoint >= 2155 && $codePoint <= 2207) { return \true; } if ($codePoint >= 3676 && $codePoint <= 3712) { return \true; } if ($codePoint >= 3808 && $codePoint <= 3839) { return \true; } if ($codePoint >= 4059 && $codePoint <= 4095) { return \true; } if ($codePoint >= 4256 && $codePoint <= 4293) { return \true; } if ($codePoint >= 6849 && $codePoint <= 6911) { return \true; } if ($codePoint >= 11859 && $codePoint <= 11903) { return \true; } if ($codePoint >= 42955 && $codePoint <= 42996) { return \true; } if ($codePoint >= 55296 && $codePoint <= 57343) { return \true; } if ($codePoint >= 57344 && $codePoint <= 63743) { return \true; } if ($codePoint >= 64218 && $codePoint <= 64255) { return \true; } if ($codePoint >= 64976 && $codePoint <= 65007) { return \true; } if ($codePoint >= 65630 && $codePoint <= 65663) { return \true; } if ($codePoint >= 65953 && $codePoint <= 65999) { return \true; } if ($codePoint >= 66046 && $codePoint <= 66175) { return \true; } if ($codePoint >= 66518 && $codePoint <= 66559) { return \true; } if ($codePoint >= 66928 && $codePoint <= 67071) { return \true; } if ($codePoint >= 67432 && $codePoint <= 67583) { return \true; } if ($codePoint >= 67760 && $codePoint <= 67807) { return \true; } if ($codePoint >= 67904 && $codePoint <= 67967) { return \true; } if ($codePoint >= 68256 && $codePoint <= 68287) { return \true; } if ($codePoint >= 68528 && $codePoint <= 68607) { return \true; } if ($codePoint >= 68681 && $codePoint <= 68735) { return \true; } if ($codePoint >= 68922 && $codePoint <= 69215) { return \true; } if ($codePoint >= 69298 && $codePoint <= 69375) { return \true; } if ($codePoint >= 69466 && $codePoint <= 69551) { return \true; } if ($codePoint >= 70207 && $codePoint <= 70271) { return \true; } if ($codePoint >= 70517 && $codePoint <= 70655) { return \true; } if ($codePoint >= 70874 && $codePoint <= 71039) { return \true; } if ($codePoint >= 71134 && $codePoint <= 71167) { return \true; } if ($codePoint >= 71370 && $codePoint <= 71423) { return \true; } if ($codePoint >= 71488 && $codePoint <= 71679) { return \true; } if ($codePoint >= 71740 && $codePoint <= 71839) { return \true; } if ($codePoint >= 72026 && $codePoint <= 72095) { return \true; } if ($codePoint >= 72441 && $codePoint <= 72703) { return \true; } if ($codePoint >= 72887 && $codePoint <= 72959) { return \true; } if ($codePoint >= 73130 && $codePoint <= 73439) { return \true; } if ($codePoint >= 73465 && $codePoint <= 73647) { return \true; } if ($codePoint >= 74650 && $codePoint <= 74751) { return \true; } if ($codePoint >= 75076 && $codePoint <= 77823) { return \true; } if ($codePoint >= 78905 && $codePoint <= 82943) { return \true; } if ($codePoint >= 83527 && $codePoint <= 92159) { return \true; } if ($codePoint >= 92784 && $codePoint <= 92879) { return \true; } if ($codePoint >= 93072 && $codePoint <= 93759) { return \true; } if ($codePoint >= 93851 && $codePoint <= 93951) { return \true; } if ($codePoint >= 94112 && $codePoint <= 94175) { return \true; } if ($codePoint >= 101590 && $codePoint <= 101631) { return \true; } if ($codePoint >= 101641 && $codePoint <= 110591) { return \true; } if ($codePoint >= 110879 && $codePoint <= 110927) { return \true; } if ($codePoint >= 111356 && $codePoint <= 113663) { return \true; } if ($codePoint >= 113828 && $codePoint <= 118783) { return \true; } if ($codePoint >= 119366 && $codePoint <= 119519) { return \true; } if ($codePoint >= 119673 && $codePoint <= 119807) { return \true; } if ($codePoint >= 121520 && $codePoint <= 122879) { return \true; } if ($codePoint >= 122923 && $codePoint <= 123135) { return \true; } if ($codePoint >= 123216 && $codePoint <= 123583) { return \true; } if ($codePoint >= 123648 && $codePoint <= 124927) { return \true; } if ($codePoint >= 125143 && $codePoint <= 125183) { return \true; } if ($codePoint >= 125280 && $codePoint <= 126064) { return \true; } if ($codePoint >= 126133 && $codePoint <= 126208) { return \true; } if ($codePoint >= 126270 && $codePoint <= 126463) { return \true; } if ($codePoint >= 126652 && $codePoint <= 126703) { return \true; } if ($codePoint >= 126706 && $codePoint <= 126975) { return \true; } if ($codePoint >= 127406 && $codePoint <= 127461) { return \true; } if ($codePoint >= 127590 && $codePoint <= 127743) { return \true; } if ($codePoint >= 129202 && $codePoint <= 129279) { return \true; } if ($codePoint >= 129751 && $codePoint <= 129791) { return \true; } if ($codePoint >= 129995 && $codePoint <= 130031) { return \true; } if ($codePoint >= 130042 && $codePoint <= 131069) { return \true; } if ($codePoint >= 173790 && $codePoint <= 173823) { return \true; } if ($codePoint >= 191457 && $codePoint <= 194559) { return \true; } if ($codePoint >= 195102 && $codePoint <= 196605) { return \true; } if ($codePoint >= 201547 && $codePoint <= 262141) { return \true; } if ($codePoint >= 262144 && $codePoint <= 327677) { return \true; } if ($codePoint >= 327680 && $codePoint <= 393213) { return \true; } if ($codePoint >= 393216 && $codePoint <= 458749) { return \true; } if ($codePoint >= 458752 && $codePoint <= 524285) { return \true; } if ($codePoint >= 524288 && $codePoint <= 589821) { return \true; } if ($codePoint >= 589824 && $codePoint <= 655357) { return \true; } if ($codePoint >= 655360 && $codePoint <= 720893) { return \true; } if ($codePoint >= 720896 && $codePoint <= 786429) { return \true; } if ($codePoint >= 786432 && $codePoint <= 851965) { return \true; } if ($codePoint >= 851968 && $codePoint <= 917501) { return \true; } if ($codePoint >= 917536 && $codePoint <= 917631) { return \true; } if ($codePoint >= 917632 && $codePoint <= 917759) { return \true; } if ($codePoint >= 918000 && $codePoint <= 983037) { return \true; } if ($codePoint >= 983040 && $codePoint <= 1048573) { return \true; } if ($codePoint >= 1048576 && $codePoint <= 1114109) { return \true; } return \false; } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/deviation.php000064400000000154147600374260026755 0ustar00 'ss', 962 => 'σ', 8204 => '', 8205 => ''); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php000064400000332527147600374260026061 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn\Resources\unidata; /** * @internal */ final class Regex { const COMBINING_MARK = '/^[\\x{0300}-\\x{036F}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{0610}-\\x{061A}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DF}-\\x{06E4}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07FD}\\x{0816}-\\x{0819}\\x{081B}-\\x{0823}\\x{0825}-\\x{0827}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E3}-\\x{0902}\\x{0903}\\x{093A}\\x{093B}\\x{093C}\\x{093E}-\\x{0940}\\x{0941}-\\x{0948}\\x{0949}-\\x{094C}\\x{094D}\\x{094E}-\\x{094F}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{0982}-\\x{0983}\\x{09BC}\\x{09BE}-\\x{09C0}\\x{09C1}-\\x{09C4}\\x{09C7}-\\x{09C8}\\x{09CB}-\\x{09CC}\\x{09CD}\\x{09D7}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A03}\\x{0A3C}\\x{0A3E}-\\x{0A40}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0A83}\\x{0ABC}\\x{0ABE}-\\x{0AC0}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0AC9}\\x{0ACB}-\\x{0ACC}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B02}-\\x{0B03}\\x{0B3C}\\x{0B3E}\\x{0B3F}\\x{0B40}\\x{0B41}-\\x{0B44}\\x{0B47}-\\x{0B48}\\x{0B4B}-\\x{0B4C}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B57}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BBE}-\\x{0BBF}\\x{0BC0}\\x{0BC1}-\\x{0BC2}\\x{0BC6}-\\x{0BC8}\\x{0BCA}-\\x{0BCC}\\x{0BCD}\\x{0BD7}\\x{0C00}\\x{0C01}-\\x{0C03}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C41}-\\x{0C44}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0C82}-\\x{0C83}\\x{0CBC}\\x{0CBE}\\x{0CBF}\\x{0CC0}-\\x{0CC4}\\x{0CC6}\\x{0CC7}-\\x{0CC8}\\x{0CCA}-\\x{0CCB}\\x{0CCC}-\\x{0CCD}\\x{0CD5}-\\x{0CD6}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D02}-\\x{0D03}\\x{0D3B}-\\x{0D3C}\\x{0D3E}-\\x{0D40}\\x{0D41}-\\x{0D44}\\x{0D46}-\\x{0D48}\\x{0D4A}-\\x{0D4C}\\x{0D4D}\\x{0D57}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0D82}-\\x{0D83}\\x{0DCA}\\x{0DCF}-\\x{0DD1}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0DD8}-\\x{0DDF}\\x{0DF2}-\\x{0DF3}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F3E}-\\x{0F3F}\\x{0F71}-\\x{0F7E}\\x{0F7F}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102B}-\\x{102C}\\x{102D}-\\x{1030}\\x{1031}\\x{1032}-\\x{1037}\\x{1038}\\x{1039}-\\x{103A}\\x{103B}-\\x{103C}\\x{103D}-\\x{103E}\\x{1056}-\\x{1057}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1062}-\\x{1064}\\x{1067}-\\x{106D}\\x{1071}-\\x{1074}\\x{1082}\\x{1083}-\\x{1084}\\x{1085}-\\x{1086}\\x{1087}-\\x{108C}\\x{108D}\\x{108F}\\x{109A}-\\x{109C}\\x{109D}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B6}\\x{17B7}-\\x{17BD}\\x{17BE}-\\x{17C5}\\x{17C6}\\x{17C7}-\\x{17C8}\\x{17C9}-\\x{17D3}\\x{17DD}\\x{180B}-\\x{180D}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1923}-\\x{1926}\\x{1927}-\\x{1928}\\x{1929}-\\x{192B}\\x{1930}-\\x{1931}\\x{1932}\\x{1933}-\\x{1938}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A19}-\\x{1A1A}\\x{1A1B}\\x{1A55}\\x{1A56}\\x{1A57}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A61}\\x{1A62}\\x{1A63}-\\x{1A64}\\x{1A65}-\\x{1A6C}\\x{1A6D}-\\x{1A72}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B04}\\x{1B34}\\x{1B35}\\x{1B36}-\\x{1B3A}\\x{1B3B}\\x{1B3C}\\x{1B3D}-\\x{1B41}\\x{1B42}\\x{1B43}-\\x{1B44}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1B82}\\x{1BA1}\\x{1BA2}-\\x{1BA5}\\x{1BA6}-\\x{1BA7}\\x{1BA8}-\\x{1BA9}\\x{1BAA}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE7}\\x{1BE8}-\\x{1BE9}\\x{1BEA}-\\x{1BEC}\\x{1BED}\\x{1BEE}\\x{1BEF}-\\x{1BF1}\\x{1BF2}-\\x{1BF3}\\x{1C24}-\\x{1C2B}\\x{1C2C}-\\x{1C33}\\x{1C34}-\\x{1C35}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE1}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF7}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2CEF}-\\x{2CF1}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{302A}-\\x{302D}\\x{302E}-\\x{302F}\\x{3099}-\\x{309A}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A802}\\x{A806}\\x{A80B}\\x{A823}-\\x{A824}\\x{A825}-\\x{A826}\\x{A827}\\x{A82C}\\x{A880}-\\x{A881}\\x{A8B4}-\\x{A8C3}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A952}-\\x{A953}\\x{A980}-\\x{A982}\\x{A983}\\x{A9B3}\\x{A9B4}-\\x{A9B5}\\x{A9B6}-\\x{A9B9}\\x{A9BA}-\\x{A9BB}\\x{A9BC}-\\x{A9BD}\\x{A9BE}-\\x{A9C0}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA2F}-\\x{AA30}\\x{AA31}-\\x{AA32}\\x{AA33}-\\x{AA34}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA4D}\\x{AA7B}\\x{AA7C}\\x{AA7D}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEB}\\x{AAEC}-\\x{AAED}\\x{AAEE}-\\x{AAEF}\\x{AAF5}\\x{AAF6}\\x{ABE3}-\\x{ABE4}\\x{ABE5}\\x{ABE6}-\\x{ABE7}\\x{ABE8}\\x{ABE9}-\\x{ABEA}\\x{ABEC}\\x{ABED}\\x{FB1E}\\x{FE00}-\\x{FE0F}\\x{FE20}-\\x{FE2F}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10EAB}-\\x{10EAC}\\x{10F46}-\\x{10F50}\\x{11000}\\x{11001}\\x{11002}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{11082}\\x{110B0}-\\x{110B2}\\x{110B3}-\\x{110B6}\\x{110B7}-\\x{110B8}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112C}\\x{1112D}-\\x{11134}\\x{11145}-\\x{11146}\\x{11173}\\x{11180}-\\x{11181}\\x{11182}\\x{111B3}-\\x{111B5}\\x{111B6}-\\x{111BE}\\x{111BF}-\\x{111C0}\\x{111C9}-\\x{111CC}\\x{111CE}\\x{111CF}\\x{1122C}-\\x{1122E}\\x{1122F}-\\x{11231}\\x{11232}-\\x{11233}\\x{11234}\\x{11235}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E0}-\\x{112E2}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{11302}-\\x{11303}\\x{1133B}-\\x{1133C}\\x{1133E}-\\x{1133F}\\x{11340}\\x{11341}-\\x{11344}\\x{11347}-\\x{11348}\\x{1134B}-\\x{1134D}\\x{11357}\\x{11362}-\\x{11363}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11435}-\\x{11437}\\x{11438}-\\x{1143F}\\x{11440}-\\x{11441}\\x{11442}-\\x{11444}\\x{11445}\\x{11446}\\x{1145E}\\x{114B0}-\\x{114B2}\\x{114B3}-\\x{114B8}\\x{114B9}\\x{114BA}\\x{114BB}-\\x{114BE}\\x{114BF}-\\x{114C0}\\x{114C1}\\x{114C2}-\\x{114C3}\\x{115AF}-\\x{115B1}\\x{115B2}-\\x{115B5}\\x{115B8}-\\x{115BB}\\x{115BC}-\\x{115BD}\\x{115BE}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11630}-\\x{11632}\\x{11633}-\\x{1163A}\\x{1163B}-\\x{1163C}\\x{1163D}\\x{1163E}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AC}\\x{116AD}\\x{116AE}-\\x{116AF}\\x{116B0}-\\x{116B5}\\x{116B6}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11720}-\\x{11721}\\x{11722}-\\x{11725}\\x{11726}\\x{11727}-\\x{1172B}\\x{1182C}-\\x{1182E}\\x{1182F}-\\x{11837}\\x{11838}\\x{11839}-\\x{1183A}\\x{11930}-\\x{11935}\\x{11937}-\\x{11938}\\x{1193B}-\\x{1193C}\\x{1193D}\\x{1193E}\\x{11940}\\x{11942}\\x{11943}\\x{119D1}-\\x{119D3}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119DC}-\\x{119DF}\\x{119E0}\\x{119E4}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A39}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A57}-\\x{11A58}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A97}\\x{11A98}-\\x{11A99}\\x{11C2F}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3E}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CA9}\\x{11CAA}-\\x{11CB0}\\x{11CB1}\\x{11CB2}-\\x{11CB3}\\x{11CB4}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D8A}-\\x{11D8E}\\x{11D90}-\\x{11D91}\\x{11D93}-\\x{11D94}\\x{11D95}\\x{11D96}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{11EF5}-\\x{11EF6}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F51}-\\x{16F87}\\x{16F8F}-\\x{16F92}\\x{16FE4}\\x{16FF0}-\\x{16FF1}\\x{1BC9D}-\\x{1BC9E}\\x{1D165}-\\x{1D166}\\x{1D167}-\\x{1D169}\\x{1D16D}-\\x{1D172}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{E0100}-\\x{E01EF}]/u'; const RTL_LABEL = '/[\\x{0590}\\x{05BE}\\x{05C0}\\x{05C3}\\x{05C6}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0608}\\x{060B}\\x{060D}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{0660}-\\x{0669}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06DD}\\x{06E5}-\\x{06E6}\\x{06EE}-\\x{06EF}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0712}-\\x{072F}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{081A}\\x{0824}\\x{0828}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08E2}\\x{200F}\\x{FB1D}\\x{FB1F}-\\x{FB28}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFE}-\\x{FDFF}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A04}\\x{10A07}-\\x{10A0B}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A3B}-\\x{10A3E}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}]/u'; const BIDI_STEP_1_LTR = '/^[^\\x{0000}-\\x{0008}\\x{0009}\\x{000A}\\x{000B}\\x{000C}\\x{000D}\\x{000E}-\\x{001B}\\x{001C}-\\x{001E}\\x{001F}\\x{0020}\\x{0021}-\\x{0022}\\x{0023}\\x{0024}\\x{0025}\\x{0026}-\\x{0027}\\x{0028}\\x{0029}\\x{002A}\\x{002B}\\x{002C}\\x{002D}\\x{002E}-\\x{002F}\\x{0030}-\\x{0039}\\x{003A}\\x{003B}\\x{003C}-\\x{003E}\\x{003F}-\\x{0040}\\x{005B}\\x{005C}\\x{005D}\\x{005E}\\x{005F}\\x{0060}\\x{007B}\\x{007C}\\x{007D}\\x{007E}\\x{007F}-\\x{0084}\\x{0085}\\x{0086}-\\x{009F}\\x{00A0}\\x{00A1}\\x{00A2}-\\x{00A5}\\x{00A6}\\x{00A7}\\x{00A8}\\x{00A9}\\x{00AB}\\x{00AC}\\x{00AD}\\x{00AE}\\x{00AF}\\x{00B0}\\x{00B1}\\x{00B2}-\\x{00B3}\\x{00B4}\\x{00B6}-\\x{00B7}\\x{00B8}\\x{00B9}\\x{00BB}\\x{00BC}-\\x{00BE}\\x{00BF}\\x{00D7}\\x{00F7}\\x{02B9}-\\x{02BA}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02CF}\\x{02D2}-\\x{02DF}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037E}\\x{0384}-\\x{0385}\\x{0387}\\x{03F6}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{058A}\\x{058D}-\\x{058E}\\x{058F}\\x{0590}\\x{0591}-\\x{05BD}\\x{05BE}\\x{05BF}\\x{05C0}\\x{05C1}-\\x{05C2}\\x{05C3}\\x{05C4}-\\x{05C5}\\x{05C6}\\x{05C7}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0606}-\\x{0607}\\x{0608}\\x{0609}-\\x{060A}\\x{060B}\\x{060C}\\x{060D}\\x{060E}-\\x{060F}\\x{0610}-\\x{061A}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{064B}-\\x{065F}\\x{0660}-\\x{0669}\\x{066A}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0670}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DE}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06E9}\\x{06EA}-\\x{06ED}\\x{06EE}-\\x{06EF}\\x{06F0}-\\x{06F9}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0711}\\x{0712}-\\x{072F}\\x{0730}-\\x{074A}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07A6}-\\x{07B0}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07F6}\\x{07F7}-\\x{07F9}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FD}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{0859}-\\x{085B}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09F2}-\\x{09F3}\\x{09FB}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AF1}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0BF3}-\\x{0BF8}\\x{0BF9}\\x{0BFA}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C78}-\\x{0C7E}\\x{0C81}\\x{0CBC}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E3F}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F3A}\\x{0F3B}\\x{0F3C}\\x{0F3D}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1390}-\\x{1399}\\x{1400}\\x{1680}\\x{169B}\\x{169C}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DB}\\x{17DD}\\x{17F0}-\\x{17F9}\\x{1800}-\\x{1805}\\x{1806}\\x{1807}-\\x{180A}\\x{180B}-\\x{180D}\\x{180E}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1940}\\x{1944}-\\x{1945}\\x{19DE}-\\x{19FF}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{2000}-\\x{200A}\\x{200B}-\\x{200D}\\x{200F}\\x{2010}-\\x{2015}\\x{2016}-\\x{2017}\\x{2018}\\x{2019}\\x{201A}\\x{201B}-\\x{201C}\\x{201D}\\x{201E}\\x{201F}\\x{2020}-\\x{2027}\\x{2028}\\x{2029}\\x{202A}\\x{202B}\\x{202C}\\x{202D}\\x{202E}\\x{202F}\\x{2030}-\\x{2034}\\x{2035}-\\x{2038}\\x{2039}\\x{203A}\\x{203B}-\\x{203E}\\x{203F}-\\x{2040}\\x{2041}-\\x{2043}\\x{2044}\\x{2045}\\x{2046}\\x{2047}-\\x{2051}\\x{2052}\\x{2053}\\x{2054}\\x{2055}-\\x{205E}\\x{205F}\\x{2060}-\\x{2064}\\x{2065}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\\x{206A}-\\x{206F}\\x{2070}\\x{2074}-\\x{2079}\\x{207A}-\\x{207B}\\x{207C}\\x{207D}\\x{207E}\\x{2080}-\\x{2089}\\x{208A}-\\x{208B}\\x{208C}\\x{208D}\\x{208E}\\x{20A0}-\\x{20BF}\\x{20C0}-\\x{20CF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2100}-\\x{2101}\\x{2103}-\\x{2106}\\x{2108}-\\x{2109}\\x{2114}\\x{2116}-\\x{2117}\\x{2118}\\x{211E}-\\x{2123}\\x{2125}\\x{2127}\\x{2129}\\x{212E}\\x{213A}-\\x{213B}\\x{2140}-\\x{2144}\\x{214A}\\x{214B}\\x{214C}-\\x{214D}\\x{2150}-\\x{215F}\\x{2189}\\x{218A}-\\x{218B}\\x{2190}-\\x{2194}\\x{2195}-\\x{2199}\\x{219A}-\\x{219B}\\x{219C}-\\x{219F}\\x{21A0}\\x{21A1}-\\x{21A2}\\x{21A3}\\x{21A4}-\\x{21A5}\\x{21A6}\\x{21A7}-\\x{21AD}\\x{21AE}\\x{21AF}-\\x{21CD}\\x{21CE}-\\x{21CF}\\x{21D0}-\\x{21D1}\\x{21D2}\\x{21D3}\\x{21D4}\\x{21D5}-\\x{21F3}\\x{21F4}-\\x{2211}\\x{2212}\\x{2213}\\x{2214}-\\x{22FF}\\x{2300}-\\x{2307}\\x{2308}\\x{2309}\\x{230A}\\x{230B}\\x{230C}-\\x{231F}\\x{2320}-\\x{2321}\\x{2322}-\\x{2328}\\x{2329}\\x{232A}\\x{232B}-\\x{2335}\\x{237B}\\x{237C}\\x{237D}-\\x{2394}\\x{2396}-\\x{239A}\\x{239B}-\\x{23B3}\\x{23B4}-\\x{23DB}\\x{23DC}-\\x{23E1}\\x{23E2}-\\x{2426}\\x{2440}-\\x{244A}\\x{2460}-\\x{2487}\\x{2488}-\\x{249B}\\x{24EA}-\\x{24FF}\\x{2500}-\\x{25B6}\\x{25B7}\\x{25B8}-\\x{25C0}\\x{25C1}\\x{25C2}-\\x{25F7}\\x{25F8}-\\x{25FF}\\x{2600}-\\x{266E}\\x{266F}\\x{2670}-\\x{26AB}\\x{26AD}-\\x{2767}\\x{2768}\\x{2769}\\x{276A}\\x{276B}\\x{276C}\\x{276D}\\x{276E}\\x{276F}\\x{2770}\\x{2771}\\x{2772}\\x{2773}\\x{2774}\\x{2775}\\x{2776}-\\x{2793}\\x{2794}-\\x{27BF}\\x{27C0}-\\x{27C4}\\x{27C5}\\x{27C6}\\x{27C7}-\\x{27E5}\\x{27E6}\\x{27E7}\\x{27E8}\\x{27E9}\\x{27EA}\\x{27EB}\\x{27EC}\\x{27ED}\\x{27EE}\\x{27EF}\\x{27F0}-\\x{27FF}\\x{2900}-\\x{2982}\\x{2983}\\x{2984}\\x{2985}\\x{2986}\\x{2987}\\x{2988}\\x{2989}\\x{298A}\\x{298B}\\x{298C}\\x{298D}\\x{298E}\\x{298F}\\x{2990}\\x{2991}\\x{2992}\\x{2993}\\x{2994}\\x{2995}\\x{2996}\\x{2997}\\x{2998}\\x{2999}-\\x{29D7}\\x{29D8}\\x{29D9}\\x{29DA}\\x{29DB}\\x{29DC}-\\x{29FB}\\x{29FC}\\x{29FD}\\x{29FE}-\\x{2AFF}\\x{2B00}-\\x{2B2F}\\x{2B30}-\\x{2B44}\\x{2B45}-\\x{2B46}\\x{2B47}-\\x{2B4C}\\x{2B4D}-\\x{2B73}\\x{2B76}-\\x{2B95}\\x{2B97}-\\x{2BFF}\\x{2CE5}-\\x{2CEA}\\x{2CEF}-\\x{2CF1}\\x{2CF9}-\\x{2CFC}\\x{2CFD}\\x{2CFE}-\\x{2CFF}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E00}-\\x{2E01}\\x{2E02}\\x{2E03}\\x{2E04}\\x{2E05}\\x{2E06}-\\x{2E08}\\x{2E09}\\x{2E0A}\\x{2E0B}\\x{2E0C}\\x{2E0D}\\x{2E0E}-\\x{2E16}\\x{2E17}\\x{2E18}-\\x{2E19}\\x{2E1A}\\x{2E1B}\\x{2E1C}\\x{2E1D}\\x{2E1E}-\\x{2E1F}\\x{2E20}\\x{2E21}\\x{2E22}\\x{2E23}\\x{2E24}\\x{2E25}\\x{2E26}\\x{2E27}\\x{2E28}\\x{2E29}\\x{2E2A}-\\x{2E2E}\\x{2E2F}\\x{2E30}-\\x{2E39}\\x{2E3A}-\\x{2E3B}\\x{2E3C}-\\x{2E3F}\\x{2E40}\\x{2E41}\\x{2E42}\\x{2E43}-\\x{2E4F}\\x{2E50}-\\x{2E51}\\x{2E52}\\x{2E80}-\\x{2E99}\\x{2E9B}-\\x{2EF3}\\x{2F00}-\\x{2FD5}\\x{2FF0}-\\x{2FFB}\\x{3000}\\x{3001}-\\x{3003}\\x{3004}\\x{3008}\\x{3009}\\x{300A}\\x{300B}\\x{300C}\\x{300D}\\x{300E}\\x{300F}\\x{3010}\\x{3011}\\x{3012}-\\x{3013}\\x{3014}\\x{3015}\\x{3016}\\x{3017}\\x{3018}\\x{3019}\\x{301A}\\x{301B}\\x{301C}\\x{301D}\\x{301E}-\\x{301F}\\x{3020}\\x{302A}-\\x{302D}\\x{3030}\\x{3036}-\\x{3037}\\x{303D}\\x{303E}-\\x{303F}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{30A0}\\x{30FB}\\x{31C0}-\\x{31E3}\\x{321D}-\\x{321E}\\x{3250}\\x{3251}-\\x{325F}\\x{327C}-\\x{327E}\\x{32B1}-\\x{32BF}\\x{32CC}-\\x{32CF}\\x{3377}-\\x{337A}\\x{33DE}-\\x{33DF}\\x{33FF}\\x{4DC0}-\\x{4DFF}\\x{A490}-\\x{A4C6}\\x{A60D}-\\x{A60F}\\x{A66F}\\x{A670}-\\x{A672}\\x{A673}\\x{A674}-\\x{A67D}\\x{A67E}\\x{A67F}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A788}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A828}-\\x{A82B}\\x{A82C}\\x{A838}\\x{A839}\\x{A874}-\\x{A877}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{AB6A}-\\x{AB6B}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1D}\\x{FB1E}\\x{FB1F}-\\x{FB28}\\x{FB29}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD3E}\\x{FD3F}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDD0}-\\x{FDEF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFD}\\x{FDFE}-\\x{FDFF}\\x{FE00}-\\x{FE0F}\\x{FE10}-\\x{FE16}\\x{FE17}\\x{FE18}\\x{FE19}\\x{FE20}-\\x{FE2F}\\x{FE30}\\x{FE31}-\\x{FE32}\\x{FE33}-\\x{FE34}\\x{FE35}\\x{FE36}\\x{FE37}\\x{FE38}\\x{FE39}\\x{FE3A}\\x{FE3B}\\x{FE3C}\\x{FE3D}\\x{FE3E}\\x{FE3F}\\x{FE40}\\x{FE41}\\x{FE42}\\x{FE43}\\x{FE44}\\x{FE45}-\\x{FE46}\\x{FE47}\\x{FE48}\\x{FE49}-\\x{FE4C}\\x{FE4D}-\\x{FE4F}\\x{FE50}\\x{FE51}\\x{FE52}\\x{FE54}\\x{FE55}\\x{FE56}-\\x{FE57}\\x{FE58}\\x{FE59}\\x{FE5A}\\x{FE5B}\\x{FE5C}\\x{FE5D}\\x{FE5E}\\x{FE5F}\\x{FE60}-\\x{FE61}\\x{FE62}\\x{FE63}\\x{FE64}-\\x{FE66}\\x{FE68}\\x{FE69}\\x{FE6A}\\x{FE6B}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{FEFF}\\x{FF01}-\\x{FF02}\\x{FF03}\\x{FF04}\\x{FF05}\\x{FF06}-\\x{FF07}\\x{FF08}\\x{FF09}\\x{FF0A}\\x{FF0B}\\x{FF0C}\\x{FF0D}\\x{FF0E}-\\x{FF0F}\\x{FF10}-\\x{FF19}\\x{FF1A}\\x{FF1B}\\x{FF1C}-\\x{FF1E}\\x{FF1F}-\\x{FF20}\\x{FF3B}\\x{FF3C}\\x{FF3D}\\x{FF3E}\\x{FF3F}\\x{FF40}\\x{FF5B}\\x{FF5C}\\x{FF5D}\\x{FF5E}\\x{FF5F}\\x{FF60}\\x{FF61}\\x{FF62}\\x{FF63}\\x{FF64}-\\x{FF65}\\x{FFE0}-\\x{FFE1}\\x{FFE2}\\x{FFE3}\\x{FFE4}\\x{FFE5}-\\x{FFE6}\\x{FFE8}\\x{FFE9}-\\x{FFEC}\\x{FFED}-\\x{FFEE}\\x{FFF0}-\\x{FFF8}\\x{FFF9}-\\x{FFFB}\\x{FFFC}-\\x{FFFD}\\x{FFFE}-\\x{FFFF}\\x{10101}\\x{10140}-\\x{10174}\\x{10175}-\\x{10178}\\x{10179}-\\x{10189}\\x{1018A}-\\x{1018B}\\x{1018C}\\x{10190}-\\x{1019C}\\x{101A0}\\x{101FD}\\x{102E0}\\x{102E1}-\\x{102FB}\\x{10376}-\\x{1037A}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{1091F}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A01}-\\x{10A03}\\x{10A04}\\x{10A05}-\\x{10A06}\\x{10A07}-\\x{10A0B}\\x{10A0C}-\\x{10A0F}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A38}-\\x{10A3A}\\x{10A3B}-\\x{10A3E}\\x{10A3F}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE5}-\\x{10AE6}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B39}-\\x{10B3F}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D24}-\\x{10D27}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAB}-\\x{10EAC}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F46}-\\x{10F50}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{11001}\\x{11038}-\\x{11046}\\x{11052}-\\x{11065}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{11660}-\\x{1166C}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A06}\\x{11A09}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{11FD5}-\\x{11FDC}\\x{11FDD}-\\x{11FE0}\\x{11FE1}-\\x{11FF1}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE2}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D200}-\\x{1D241}\\x{1D242}-\\x{1D244}\\x{1D245}\\x{1D300}-\\x{1D356}\\x{1D6DB}\\x{1D715}\\x{1D74F}\\x{1D789}\\x{1D7C3}\\x{1D7CE}-\\x{1D7FF}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E2FF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D0}-\\x{1E8D6}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E944}-\\x{1E94A}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF0}-\\x{1EEF1}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}\\x{1F000}-\\x{1F02B}\\x{1F030}-\\x{1F093}\\x{1F0A0}-\\x{1F0AE}\\x{1F0B1}-\\x{1F0BF}\\x{1F0C1}-\\x{1F0CF}\\x{1F0D1}-\\x{1F0F5}\\x{1F100}-\\x{1F10A}\\x{1F10B}-\\x{1F10C}\\x{1F10D}-\\x{1F10F}\\x{1F12F}\\x{1F16A}-\\x{1F16F}\\x{1F1AD}\\x{1F260}-\\x{1F265}\\x{1F300}-\\x{1F3FA}\\x{1F3FB}-\\x{1F3FF}\\x{1F400}-\\x{1F6D7}\\x{1F6E0}-\\x{1F6EC}\\x{1F6F0}-\\x{1F6FC}\\x{1F700}-\\x{1F773}\\x{1F780}-\\x{1F7D8}\\x{1F7E0}-\\x{1F7EB}\\x{1F800}-\\x{1F80B}\\x{1F810}-\\x{1F847}\\x{1F850}-\\x{1F859}\\x{1F860}-\\x{1F887}\\x{1F890}-\\x{1F8AD}\\x{1F8B0}-\\x{1F8B1}\\x{1F900}-\\x{1F978}\\x{1F97A}-\\x{1F9CB}\\x{1F9CD}-\\x{1FA53}\\x{1FA60}-\\x{1FA6D}\\x{1FA70}-\\x{1FA74}\\x{1FA78}-\\x{1FA7A}\\x{1FA80}-\\x{1FA86}\\x{1FA90}-\\x{1FAA8}\\x{1FAB0}-\\x{1FAB6}\\x{1FAC0}-\\x{1FAC2}\\x{1FAD0}-\\x{1FAD6}\\x{1FB00}-\\x{1FB92}\\x{1FB94}-\\x{1FBCA}\\x{1FBF0}-\\x{1FBF9}\\x{1FFFE}-\\x{1FFFF}\\x{2FFFE}-\\x{2FFFF}\\x{3FFFE}-\\x{3FFFF}\\x{4FFFE}-\\x{4FFFF}\\x{5FFFE}-\\x{5FFFF}\\x{6FFFE}-\\x{6FFFF}\\x{7FFFE}-\\x{7FFFF}\\x{8FFFE}-\\x{8FFFF}\\x{9FFFE}-\\x{9FFFF}\\x{AFFFE}-\\x{AFFFF}\\x{BFFFE}-\\x{BFFFF}\\x{CFFFE}-\\x{CFFFF}\\x{DFFFE}-\\x{E0000}\\x{E0001}\\x{E0002}-\\x{E001F}\\x{E0020}-\\x{E007F}\\x{E0080}-\\x{E00FF}\\x{E0100}-\\x{E01EF}\\x{E01F0}-\\x{E0FFF}\\x{EFFFE}-\\x{EFFFF}\\x{FFFFE}-\\x{FFFFF}\\x{10FFFE}-\\x{10FFFF}]/u'; const BIDI_STEP_1_RTL = '/^[\\x{0590}\\x{05BE}\\x{05C0}\\x{05C3}\\x{05C6}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0608}\\x{060B}\\x{060D}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{066D}\\x{066E}-\\x{066F}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06E5}-\\x{06E6}\\x{06EE}-\\x{06EF}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0712}-\\x{072F}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{081A}\\x{0824}\\x{0828}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{200F}\\x{FB1D}\\x{FB1F}-\\x{FB28}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFE}-\\x{FDFF}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A04}\\x{10A07}-\\x{10A0B}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A3B}-\\x{10A3E}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D28}-\\x{10D2F}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}]/u'; const BIDI_STEP_2 = '/[^\\x{0000}-\\x{0008}\\x{000E}-\\x{001B}\\x{0021}-\\x{0022}\\x{0023}\\x{0024}\\x{0025}\\x{0026}-\\x{0027}\\x{0028}\\x{0029}\\x{002A}\\x{002B}\\x{002C}\\x{002D}\\x{002E}-\\x{002F}\\x{0030}-\\x{0039}\\x{003A}\\x{003B}\\x{003C}-\\x{003E}\\x{003F}-\\x{0040}\\x{005B}\\x{005C}\\x{005D}\\x{005E}\\x{005F}\\x{0060}\\x{007B}\\x{007C}\\x{007D}\\x{007E}\\x{007F}-\\x{0084}\\x{0086}-\\x{009F}\\x{00A0}\\x{00A1}\\x{00A2}-\\x{00A5}\\x{00A6}\\x{00A7}\\x{00A8}\\x{00A9}\\x{00AB}\\x{00AC}\\x{00AD}\\x{00AE}\\x{00AF}\\x{00B0}\\x{00B1}\\x{00B2}-\\x{00B3}\\x{00B4}\\x{00B6}-\\x{00B7}\\x{00B8}\\x{00B9}\\x{00BB}\\x{00BC}-\\x{00BE}\\x{00BF}\\x{00D7}\\x{00F7}\\x{02B9}-\\x{02BA}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02CF}\\x{02D2}-\\x{02DF}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037E}\\x{0384}-\\x{0385}\\x{0387}\\x{03F6}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{058A}\\x{058D}-\\x{058E}\\x{058F}\\x{0590}\\x{0591}-\\x{05BD}\\x{05BE}\\x{05BF}\\x{05C0}\\x{05C1}-\\x{05C2}\\x{05C3}\\x{05C4}-\\x{05C5}\\x{05C6}\\x{05C7}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0606}-\\x{0607}\\x{0608}\\x{0609}-\\x{060A}\\x{060B}\\x{060C}\\x{060D}\\x{060E}-\\x{060F}\\x{0610}-\\x{061A}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{064B}-\\x{065F}\\x{0660}-\\x{0669}\\x{066A}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0670}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DE}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06E9}\\x{06EA}-\\x{06ED}\\x{06EE}-\\x{06EF}\\x{06F0}-\\x{06F9}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0711}\\x{0712}-\\x{072F}\\x{0730}-\\x{074A}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07A6}-\\x{07B0}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07F6}\\x{07F7}-\\x{07F9}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FD}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{0859}-\\x{085B}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09F2}-\\x{09F3}\\x{09FB}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AF1}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0BF3}-\\x{0BF8}\\x{0BF9}\\x{0BFA}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C78}-\\x{0C7E}\\x{0C81}\\x{0CBC}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E3F}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F3A}\\x{0F3B}\\x{0F3C}\\x{0F3D}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1390}-\\x{1399}\\x{1400}\\x{169B}\\x{169C}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DB}\\x{17DD}\\x{17F0}-\\x{17F9}\\x{1800}-\\x{1805}\\x{1806}\\x{1807}-\\x{180A}\\x{180B}-\\x{180D}\\x{180E}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1940}\\x{1944}-\\x{1945}\\x{19DE}-\\x{19FF}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{200B}-\\x{200D}\\x{200F}\\x{2010}-\\x{2015}\\x{2016}-\\x{2017}\\x{2018}\\x{2019}\\x{201A}\\x{201B}-\\x{201C}\\x{201D}\\x{201E}\\x{201F}\\x{2020}-\\x{2027}\\x{202F}\\x{2030}-\\x{2034}\\x{2035}-\\x{2038}\\x{2039}\\x{203A}\\x{203B}-\\x{203E}\\x{203F}-\\x{2040}\\x{2041}-\\x{2043}\\x{2044}\\x{2045}\\x{2046}\\x{2047}-\\x{2051}\\x{2052}\\x{2053}\\x{2054}\\x{2055}-\\x{205E}\\x{2060}-\\x{2064}\\x{2065}\\x{206A}-\\x{206F}\\x{2070}\\x{2074}-\\x{2079}\\x{207A}-\\x{207B}\\x{207C}\\x{207D}\\x{207E}\\x{2080}-\\x{2089}\\x{208A}-\\x{208B}\\x{208C}\\x{208D}\\x{208E}\\x{20A0}-\\x{20BF}\\x{20C0}-\\x{20CF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2100}-\\x{2101}\\x{2103}-\\x{2106}\\x{2108}-\\x{2109}\\x{2114}\\x{2116}-\\x{2117}\\x{2118}\\x{211E}-\\x{2123}\\x{2125}\\x{2127}\\x{2129}\\x{212E}\\x{213A}-\\x{213B}\\x{2140}-\\x{2144}\\x{214A}\\x{214B}\\x{214C}-\\x{214D}\\x{2150}-\\x{215F}\\x{2189}\\x{218A}-\\x{218B}\\x{2190}-\\x{2194}\\x{2195}-\\x{2199}\\x{219A}-\\x{219B}\\x{219C}-\\x{219F}\\x{21A0}\\x{21A1}-\\x{21A2}\\x{21A3}\\x{21A4}-\\x{21A5}\\x{21A6}\\x{21A7}-\\x{21AD}\\x{21AE}\\x{21AF}-\\x{21CD}\\x{21CE}-\\x{21CF}\\x{21D0}-\\x{21D1}\\x{21D2}\\x{21D3}\\x{21D4}\\x{21D5}-\\x{21F3}\\x{21F4}-\\x{2211}\\x{2212}\\x{2213}\\x{2214}-\\x{22FF}\\x{2300}-\\x{2307}\\x{2308}\\x{2309}\\x{230A}\\x{230B}\\x{230C}-\\x{231F}\\x{2320}-\\x{2321}\\x{2322}-\\x{2328}\\x{2329}\\x{232A}\\x{232B}-\\x{2335}\\x{237B}\\x{237C}\\x{237D}-\\x{2394}\\x{2396}-\\x{239A}\\x{239B}-\\x{23B3}\\x{23B4}-\\x{23DB}\\x{23DC}-\\x{23E1}\\x{23E2}-\\x{2426}\\x{2440}-\\x{244A}\\x{2460}-\\x{2487}\\x{2488}-\\x{249B}\\x{24EA}-\\x{24FF}\\x{2500}-\\x{25B6}\\x{25B7}\\x{25B8}-\\x{25C0}\\x{25C1}\\x{25C2}-\\x{25F7}\\x{25F8}-\\x{25FF}\\x{2600}-\\x{266E}\\x{266F}\\x{2670}-\\x{26AB}\\x{26AD}-\\x{2767}\\x{2768}\\x{2769}\\x{276A}\\x{276B}\\x{276C}\\x{276D}\\x{276E}\\x{276F}\\x{2770}\\x{2771}\\x{2772}\\x{2773}\\x{2774}\\x{2775}\\x{2776}-\\x{2793}\\x{2794}-\\x{27BF}\\x{27C0}-\\x{27C4}\\x{27C5}\\x{27C6}\\x{27C7}-\\x{27E5}\\x{27E6}\\x{27E7}\\x{27E8}\\x{27E9}\\x{27EA}\\x{27EB}\\x{27EC}\\x{27ED}\\x{27EE}\\x{27EF}\\x{27F0}-\\x{27FF}\\x{2900}-\\x{2982}\\x{2983}\\x{2984}\\x{2985}\\x{2986}\\x{2987}\\x{2988}\\x{2989}\\x{298A}\\x{298B}\\x{298C}\\x{298D}\\x{298E}\\x{298F}\\x{2990}\\x{2991}\\x{2992}\\x{2993}\\x{2994}\\x{2995}\\x{2996}\\x{2997}\\x{2998}\\x{2999}-\\x{29D7}\\x{29D8}\\x{29D9}\\x{29DA}\\x{29DB}\\x{29DC}-\\x{29FB}\\x{29FC}\\x{29FD}\\x{29FE}-\\x{2AFF}\\x{2B00}-\\x{2B2F}\\x{2B30}-\\x{2B44}\\x{2B45}-\\x{2B46}\\x{2B47}-\\x{2B4C}\\x{2B4D}-\\x{2B73}\\x{2B76}-\\x{2B95}\\x{2B97}-\\x{2BFF}\\x{2CE5}-\\x{2CEA}\\x{2CEF}-\\x{2CF1}\\x{2CF9}-\\x{2CFC}\\x{2CFD}\\x{2CFE}-\\x{2CFF}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E00}-\\x{2E01}\\x{2E02}\\x{2E03}\\x{2E04}\\x{2E05}\\x{2E06}-\\x{2E08}\\x{2E09}\\x{2E0A}\\x{2E0B}\\x{2E0C}\\x{2E0D}\\x{2E0E}-\\x{2E16}\\x{2E17}\\x{2E18}-\\x{2E19}\\x{2E1A}\\x{2E1B}\\x{2E1C}\\x{2E1D}\\x{2E1E}-\\x{2E1F}\\x{2E20}\\x{2E21}\\x{2E22}\\x{2E23}\\x{2E24}\\x{2E25}\\x{2E26}\\x{2E27}\\x{2E28}\\x{2E29}\\x{2E2A}-\\x{2E2E}\\x{2E2F}\\x{2E30}-\\x{2E39}\\x{2E3A}-\\x{2E3B}\\x{2E3C}-\\x{2E3F}\\x{2E40}\\x{2E41}\\x{2E42}\\x{2E43}-\\x{2E4F}\\x{2E50}-\\x{2E51}\\x{2E52}\\x{2E80}-\\x{2E99}\\x{2E9B}-\\x{2EF3}\\x{2F00}-\\x{2FD5}\\x{2FF0}-\\x{2FFB}\\x{3001}-\\x{3003}\\x{3004}\\x{3008}\\x{3009}\\x{300A}\\x{300B}\\x{300C}\\x{300D}\\x{300E}\\x{300F}\\x{3010}\\x{3011}\\x{3012}-\\x{3013}\\x{3014}\\x{3015}\\x{3016}\\x{3017}\\x{3018}\\x{3019}\\x{301A}\\x{301B}\\x{301C}\\x{301D}\\x{301E}-\\x{301F}\\x{3020}\\x{302A}-\\x{302D}\\x{3030}\\x{3036}-\\x{3037}\\x{303D}\\x{303E}-\\x{303F}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{30A0}\\x{30FB}\\x{31C0}-\\x{31E3}\\x{321D}-\\x{321E}\\x{3250}\\x{3251}-\\x{325F}\\x{327C}-\\x{327E}\\x{32B1}-\\x{32BF}\\x{32CC}-\\x{32CF}\\x{3377}-\\x{337A}\\x{33DE}-\\x{33DF}\\x{33FF}\\x{4DC0}-\\x{4DFF}\\x{A490}-\\x{A4C6}\\x{A60D}-\\x{A60F}\\x{A66F}\\x{A670}-\\x{A672}\\x{A673}\\x{A674}-\\x{A67D}\\x{A67E}\\x{A67F}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A788}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A828}-\\x{A82B}\\x{A82C}\\x{A838}\\x{A839}\\x{A874}-\\x{A877}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{AB6A}-\\x{AB6B}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1D}\\x{FB1E}\\x{FB1F}-\\x{FB28}\\x{FB29}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD3E}\\x{FD3F}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDD0}-\\x{FDEF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFD}\\x{FDFE}-\\x{FDFF}\\x{FE00}-\\x{FE0F}\\x{FE10}-\\x{FE16}\\x{FE17}\\x{FE18}\\x{FE19}\\x{FE20}-\\x{FE2F}\\x{FE30}\\x{FE31}-\\x{FE32}\\x{FE33}-\\x{FE34}\\x{FE35}\\x{FE36}\\x{FE37}\\x{FE38}\\x{FE39}\\x{FE3A}\\x{FE3B}\\x{FE3C}\\x{FE3D}\\x{FE3E}\\x{FE3F}\\x{FE40}\\x{FE41}\\x{FE42}\\x{FE43}\\x{FE44}\\x{FE45}-\\x{FE46}\\x{FE47}\\x{FE48}\\x{FE49}-\\x{FE4C}\\x{FE4D}-\\x{FE4F}\\x{FE50}\\x{FE51}\\x{FE52}\\x{FE54}\\x{FE55}\\x{FE56}-\\x{FE57}\\x{FE58}\\x{FE59}\\x{FE5A}\\x{FE5B}\\x{FE5C}\\x{FE5D}\\x{FE5E}\\x{FE5F}\\x{FE60}-\\x{FE61}\\x{FE62}\\x{FE63}\\x{FE64}-\\x{FE66}\\x{FE68}\\x{FE69}\\x{FE6A}\\x{FE6B}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{FEFF}\\x{FF01}-\\x{FF02}\\x{FF03}\\x{FF04}\\x{FF05}\\x{FF06}-\\x{FF07}\\x{FF08}\\x{FF09}\\x{FF0A}\\x{FF0B}\\x{FF0C}\\x{FF0D}\\x{FF0E}-\\x{FF0F}\\x{FF10}-\\x{FF19}\\x{FF1A}\\x{FF1B}\\x{FF1C}-\\x{FF1E}\\x{FF1F}-\\x{FF20}\\x{FF3B}\\x{FF3C}\\x{FF3D}\\x{FF3E}\\x{FF3F}\\x{FF40}\\x{FF5B}\\x{FF5C}\\x{FF5D}\\x{FF5E}\\x{FF5F}\\x{FF60}\\x{FF61}\\x{FF62}\\x{FF63}\\x{FF64}-\\x{FF65}\\x{FFE0}-\\x{FFE1}\\x{FFE2}\\x{FFE3}\\x{FFE4}\\x{FFE5}-\\x{FFE6}\\x{FFE8}\\x{FFE9}-\\x{FFEC}\\x{FFED}-\\x{FFEE}\\x{FFF0}-\\x{FFF8}\\x{FFF9}-\\x{FFFB}\\x{FFFC}-\\x{FFFD}\\x{FFFE}-\\x{FFFF}\\x{10101}\\x{10140}-\\x{10174}\\x{10175}-\\x{10178}\\x{10179}-\\x{10189}\\x{1018A}-\\x{1018B}\\x{1018C}\\x{10190}-\\x{1019C}\\x{101A0}\\x{101FD}\\x{102E0}\\x{102E1}-\\x{102FB}\\x{10376}-\\x{1037A}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{1091F}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A01}-\\x{10A03}\\x{10A04}\\x{10A05}-\\x{10A06}\\x{10A07}-\\x{10A0B}\\x{10A0C}-\\x{10A0F}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A38}-\\x{10A3A}\\x{10A3B}-\\x{10A3E}\\x{10A3F}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE5}-\\x{10AE6}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B39}-\\x{10B3F}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D24}-\\x{10D27}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAB}-\\x{10EAC}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F46}-\\x{10F50}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{11001}\\x{11038}-\\x{11046}\\x{11052}-\\x{11065}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{11660}-\\x{1166C}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A06}\\x{11A09}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{11FD5}-\\x{11FDC}\\x{11FDD}-\\x{11FE0}\\x{11FE1}-\\x{11FF1}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE2}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D200}-\\x{1D241}\\x{1D242}-\\x{1D244}\\x{1D245}\\x{1D300}-\\x{1D356}\\x{1D6DB}\\x{1D715}\\x{1D74F}\\x{1D789}\\x{1D7C3}\\x{1D7CE}-\\x{1D7FF}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E2FF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D0}-\\x{1E8D6}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E944}-\\x{1E94A}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF0}-\\x{1EEF1}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}\\x{1F000}-\\x{1F02B}\\x{1F030}-\\x{1F093}\\x{1F0A0}-\\x{1F0AE}\\x{1F0B1}-\\x{1F0BF}\\x{1F0C1}-\\x{1F0CF}\\x{1F0D1}-\\x{1F0F5}\\x{1F100}-\\x{1F10A}\\x{1F10B}-\\x{1F10C}\\x{1F10D}-\\x{1F10F}\\x{1F12F}\\x{1F16A}-\\x{1F16F}\\x{1F1AD}\\x{1F260}-\\x{1F265}\\x{1F300}-\\x{1F3FA}\\x{1F3FB}-\\x{1F3FF}\\x{1F400}-\\x{1F6D7}\\x{1F6E0}-\\x{1F6EC}\\x{1F6F0}-\\x{1F6FC}\\x{1F700}-\\x{1F773}\\x{1F780}-\\x{1F7D8}\\x{1F7E0}-\\x{1F7EB}\\x{1F800}-\\x{1F80B}\\x{1F810}-\\x{1F847}\\x{1F850}-\\x{1F859}\\x{1F860}-\\x{1F887}\\x{1F890}-\\x{1F8AD}\\x{1F8B0}-\\x{1F8B1}\\x{1F900}-\\x{1F978}\\x{1F97A}-\\x{1F9CB}\\x{1F9CD}-\\x{1FA53}\\x{1FA60}-\\x{1FA6D}\\x{1FA70}-\\x{1FA74}\\x{1FA78}-\\x{1FA7A}\\x{1FA80}-\\x{1FA86}\\x{1FA90}-\\x{1FAA8}\\x{1FAB0}-\\x{1FAB6}\\x{1FAC0}-\\x{1FAC2}\\x{1FAD0}-\\x{1FAD6}\\x{1FB00}-\\x{1FB92}\\x{1FB94}-\\x{1FBCA}\\x{1FBF0}-\\x{1FBF9}\\x{1FFFE}-\\x{1FFFF}\\x{2FFFE}-\\x{2FFFF}\\x{3FFFE}-\\x{3FFFF}\\x{4FFFE}-\\x{4FFFF}\\x{5FFFE}-\\x{5FFFF}\\x{6FFFE}-\\x{6FFFF}\\x{7FFFE}-\\x{7FFFF}\\x{8FFFE}-\\x{8FFFF}\\x{9FFFE}-\\x{9FFFF}\\x{AFFFE}-\\x{AFFFF}\\x{BFFFE}-\\x{BFFFF}\\x{CFFFE}-\\x{CFFFF}\\x{DFFFE}-\\x{E0000}\\x{E0001}\\x{E0002}-\\x{E001F}\\x{E0020}-\\x{E007F}\\x{E0080}-\\x{E00FF}\\x{E0100}-\\x{E01EF}\\x{E01F0}-\\x{E0FFF}\\x{EFFFE}-\\x{EFFFF}\\x{FFFFE}-\\x{FFFFF}\\x{10FFFE}-\\x{10FFFF}]/u'; const BIDI_STEP_3 = '/[\\x{0030}-\\x{0039}\\x{00B2}-\\x{00B3}\\x{00B9}\\x{0590}\\x{05BE}\\x{05C0}\\x{05C3}\\x{05C6}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0608}\\x{060B}\\x{060D}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{0660}-\\x{0669}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06DD}\\x{06E5}-\\x{06E6}\\x{06EE}-\\x{06EF}\\x{06F0}-\\x{06F9}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0712}-\\x{072F}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{081A}\\x{0824}\\x{0828}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08E2}\\x{200F}\\x{2070}\\x{2074}-\\x{2079}\\x{2080}-\\x{2089}\\x{2488}-\\x{249B}\\x{FB1D}\\x{FB1F}-\\x{FB28}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFE}-\\x{FDFF}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{FF10}-\\x{FF19}\\x{102E1}-\\x{102FB}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A04}\\x{10A07}-\\x{10A0B}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A3B}-\\x{10A3E}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{1D7CE}-\\x{1D7FF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}\\x{1F100}-\\x{1F10A}\\x{1FBF0}-\\x{1FBF9}][\\x{0300}-\\x{036F}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{0610}-\\x{061A}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DF}-\\x{06E4}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07FD}\\x{0816}-\\x{0819}\\x{081B}-\\x{0823}\\x{0825}-\\x{0827}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DD}\\x{180B}-\\x{180D}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2CEF}-\\x{2CF1}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{302A}-\\x{302D}\\x{3099}-\\x{309A}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A82C}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FE00}-\\x{FE0F}\\x{FE20}-\\x{FE2F}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10EAB}-\\x{10EAC}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A06}\\x{11A09}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1D167}-\\x{1D169}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{E0100}-\\x{E01EF}]*$/u'; const BIDI_STEP_4_AN = '/[\\x{0600}-\\x{0605}\\x{0660}-\\x{0669}\\x{066B}-\\x{066C}\\x{06DD}\\x{08E2}\\x{10D30}-\\x{10D39}\\x{10E60}-\\x{10E7E}]/u'; const BIDI_STEP_4_EN = '/[\\x{0030}-\\x{0039}\\x{00B2}-\\x{00B3}\\x{00B9}\\x{06F0}-\\x{06F9}\\x{2070}\\x{2074}-\\x{2079}\\x{2080}-\\x{2089}\\x{2488}-\\x{249B}\\x{FF10}-\\x{FF19}\\x{102E1}-\\x{102FB}\\x{1D7CE}-\\x{1D7FF}\\x{1F100}-\\x{1F10A}\\x{1FBF0}-\\x{1FBF9}]/u'; const BIDI_STEP_5 = '/[\\x{0009}\\x{000A}\\x{000B}\\x{000C}\\x{000D}\\x{001C}-\\x{001E}\\x{001F}\\x{0020}\\x{0085}\\x{0590}\\x{05BE}\\x{05C0}\\x{05C3}\\x{05C6}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0608}\\x{060B}\\x{060D}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{0660}-\\x{0669}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06DD}\\x{06E5}-\\x{06E6}\\x{06EE}-\\x{06EF}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0712}-\\x{072F}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07F4}-\\x{07F5}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{081A}\\x{0824}\\x{0828}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08E2}\\x{1680}\\x{2000}-\\x{200A}\\x{200F}\\x{2028}\\x{2029}\\x{202A}\\x{202B}\\x{202C}\\x{202D}\\x{202E}\\x{205F}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\\x{3000}\\x{FB1D}\\x{FB1F}-\\x{FB28}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFE}-\\x{FDFF}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A04}\\x{10A07}-\\x{10A0B}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A3B}-\\x{10A3E}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}]/u'; const BIDI_STEP_6 = '/[^\\x{0000}-\\x{0008}\\x{0009}\\x{000A}\\x{000B}\\x{000C}\\x{000D}\\x{000E}-\\x{001B}\\x{001C}-\\x{001E}\\x{001F}\\x{0020}\\x{0021}-\\x{0022}\\x{0023}\\x{0024}\\x{0025}\\x{0026}-\\x{0027}\\x{0028}\\x{0029}\\x{002A}\\x{002B}\\x{002C}\\x{002D}\\x{002E}-\\x{002F}\\x{003A}\\x{003B}\\x{003C}-\\x{003E}\\x{003F}-\\x{0040}\\x{005B}\\x{005C}\\x{005D}\\x{005E}\\x{005F}\\x{0060}\\x{007B}\\x{007C}\\x{007D}\\x{007E}\\x{007F}-\\x{0084}\\x{0085}\\x{0086}-\\x{009F}\\x{00A0}\\x{00A1}\\x{00A2}-\\x{00A5}\\x{00A6}\\x{00A7}\\x{00A8}\\x{00A9}\\x{00AB}\\x{00AC}\\x{00AD}\\x{00AE}\\x{00AF}\\x{00B0}\\x{00B1}\\x{00B4}\\x{00B6}-\\x{00B7}\\x{00B8}\\x{00BB}\\x{00BC}-\\x{00BE}\\x{00BF}\\x{00D7}\\x{00F7}\\x{02B9}-\\x{02BA}\\x{02C2}-\\x{02C5}\\x{02C6}-\\x{02CF}\\x{02D2}-\\x{02DF}\\x{02E5}-\\x{02EB}\\x{02EC}\\x{02ED}\\x{02EF}-\\x{02FF}\\x{0300}-\\x{036F}\\x{0374}\\x{0375}\\x{037E}\\x{0384}-\\x{0385}\\x{0387}\\x{03F6}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{058A}\\x{058D}-\\x{058E}\\x{058F}\\x{0590}\\x{0591}-\\x{05BD}\\x{05BE}\\x{05BF}\\x{05C0}\\x{05C1}-\\x{05C2}\\x{05C3}\\x{05C4}-\\x{05C5}\\x{05C6}\\x{05C7}\\x{05C8}-\\x{05CF}\\x{05D0}-\\x{05EA}\\x{05EB}-\\x{05EE}\\x{05EF}-\\x{05F2}\\x{05F3}-\\x{05F4}\\x{05F5}-\\x{05FF}\\x{0600}-\\x{0605}\\x{0606}-\\x{0607}\\x{0608}\\x{0609}-\\x{060A}\\x{060B}\\x{060C}\\x{060D}\\x{060E}-\\x{060F}\\x{0610}-\\x{061A}\\x{061B}\\x{061C}\\x{061D}\\x{061E}-\\x{061F}\\x{0620}-\\x{063F}\\x{0640}\\x{0641}-\\x{064A}\\x{064B}-\\x{065F}\\x{0660}-\\x{0669}\\x{066A}\\x{066B}-\\x{066C}\\x{066D}\\x{066E}-\\x{066F}\\x{0670}\\x{0671}-\\x{06D3}\\x{06D4}\\x{06D5}\\x{06D6}-\\x{06DC}\\x{06DD}\\x{06DE}\\x{06DF}-\\x{06E4}\\x{06E5}-\\x{06E6}\\x{06E7}-\\x{06E8}\\x{06E9}\\x{06EA}-\\x{06ED}\\x{06EE}-\\x{06EF}\\x{06FA}-\\x{06FC}\\x{06FD}-\\x{06FE}\\x{06FF}\\x{0700}-\\x{070D}\\x{070E}\\x{070F}\\x{0710}\\x{0711}\\x{0712}-\\x{072F}\\x{0730}-\\x{074A}\\x{074B}-\\x{074C}\\x{074D}-\\x{07A5}\\x{07A6}-\\x{07B0}\\x{07B1}\\x{07B2}-\\x{07BF}\\x{07C0}-\\x{07C9}\\x{07CA}-\\x{07EA}\\x{07EB}-\\x{07F3}\\x{07F4}-\\x{07F5}\\x{07F6}\\x{07F7}-\\x{07F9}\\x{07FA}\\x{07FB}-\\x{07FC}\\x{07FD}\\x{07FE}-\\x{07FF}\\x{0800}-\\x{0815}\\x{0816}-\\x{0819}\\x{081A}\\x{081B}-\\x{0823}\\x{0824}\\x{0825}-\\x{0827}\\x{0828}\\x{0829}-\\x{082D}\\x{082E}-\\x{082F}\\x{0830}-\\x{083E}\\x{083F}\\x{0840}-\\x{0858}\\x{0859}-\\x{085B}\\x{085C}-\\x{085D}\\x{085E}\\x{085F}\\x{0860}-\\x{086A}\\x{086B}-\\x{086F}\\x{0870}-\\x{089F}\\x{08A0}-\\x{08B4}\\x{08B5}\\x{08B6}-\\x{08C7}\\x{08C8}-\\x{08D2}\\x{08D3}-\\x{08E1}\\x{08E2}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09F2}-\\x{09F3}\\x{09FB}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AF1}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0BF3}-\\x{0BF8}\\x{0BF9}\\x{0BFA}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C78}-\\x{0C7E}\\x{0C81}\\x{0CBC}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E3F}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F3A}\\x{0F3B}\\x{0F3C}\\x{0F3D}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1390}-\\x{1399}\\x{1400}\\x{1680}\\x{169B}\\x{169C}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DB}\\x{17DD}\\x{17F0}-\\x{17F9}\\x{1800}-\\x{1805}\\x{1806}\\x{1807}-\\x{180A}\\x{180B}-\\x{180D}\\x{180E}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1940}\\x{1944}-\\x{1945}\\x{19DE}-\\x{19FF}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{1FBD}\\x{1FBF}-\\x{1FC1}\\x{1FCD}-\\x{1FCF}\\x{1FDD}-\\x{1FDF}\\x{1FED}-\\x{1FEF}\\x{1FFD}-\\x{1FFE}\\x{2000}-\\x{200A}\\x{200B}-\\x{200D}\\x{200F}\\x{2010}-\\x{2015}\\x{2016}-\\x{2017}\\x{2018}\\x{2019}\\x{201A}\\x{201B}-\\x{201C}\\x{201D}\\x{201E}\\x{201F}\\x{2020}-\\x{2027}\\x{2028}\\x{2029}\\x{202A}\\x{202B}\\x{202C}\\x{202D}\\x{202E}\\x{202F}\\x{2030}-\\x{2034}\\x{2035}-\\x{2038}\\x{2039}\\x{203A}\\x{203B}-\\x{203E}\\x{203F}-\\x{2040}\\x{2041}-\\x{2043}\\x{2044}\\x{2045}\\x{2046}\\x{2047}-\\x{2051}\\x{2052}\\x{2053}\\x{2054}\\x{2055}-\\x{205E}\\x{205F}\\x{2060}-\\x{2064}\\x{2065}\\x{2066}\\x{2067}\\x{2068}\\x{2069}\\x{206A}-\\x{206F}\\x{207A}-\\x{207B}\\x{207C}\\x{207D}\\x{207E}\\x{208A}-\\x{208B}\\x{208C}\\x{208D}\\x{208E}\\x{20A0}-\\x{20BF}\\x{20C0}-\\x{20CF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2100}-\\x{2101}\\x{2103}-\\x{2106}\\x{2108}-\\x{2109}\\x{2114}\\x{2116}-\\x{2117}\\x{2118}\\x{211E}-\\x{2123}\\x{2125}\\x{2127}\\x{2129}\\x{212E}\\x{213A}-\\x{213B}\\x{2140}-\\x{2144}\\x{214A}\\x{214B}\\x{214C}-\\x{214D}\\x{2150}-\\x{215F}\\x{2189}\\x{218A}-\\x{218B}\\x{2190}-\\x{2194}\\x{2195}-\\x{2199}\\x{219A}-\\x{219B}\\x{219C}-\\x{219F}\\x{21A0}\\x{21A1}-\\x{21A2}\\x{21A3}\\x{21A4}-\\x{21A5}\\x{21A6}\\x{21A7}-\\x{21AD}\\x{21AE}\\x{21AF}-\\x{21CD}\\x{21CE}-\\x{21CF}\\x{21D0}-\\x{21D1}\\x{21D2}\\x{21D3}\\x{21D4}\\x{21D5}-\\x{21F3}\\x{21F4}-\\x{2211}\\x{2212}\\x{2213}\\x{2214}-\\x{22FF}\\x{2300}-\\x{2307}\\x{2308}\\x{2309}\\x{230A}\\x{230B}\\x{230C}-\\x{231F}\\x{2320}-\\x{2321}\\x{2322}-\\x{2328}\\x{2329}\\x{232A}\\x{232B}-\\x{2335}\\x{237B}\\x{237C}\\x{237D}-\\x{2394}\\x{2396}-\\x{239A}\\x{239B}-\\x{23B3}\\x{23B4}-\\x{23DB}\\x{23DC}-\\x{23E1}\\x{23E2}-\\x{2426}\\x{2440}-\\x{244A}\\x{2460}-\\x{2487}\\x{24EA}-\\x{24FF}\\x{2500}-\\x{25B6}\\x{25B7}\\x{25B8}-\\x{25C0}\\x{25C1}\\x{25C2}-\\x{25F7}\\x{25F8}-\\x{25FF}\\x{2600}-\\x{266E}\\x{266F}\\x{2670}-\\x{26AB}\\x{26AD}-\\x{2767}\\x{2768}\\x{2769}\\x{276A}\\x{276B}\\x{276C}\\x{276D}\\x{276E}\\x{276F}\\x{2770}\\x{2771}\\x{2772}\\x{2773}\\x{2774}\\x{2775}\\x{2776}-\\x{2793}\\x{2794}-\\x{27BF}\\x{27C0}-\\x{27C4}\\x{27C5}\\x{27C6}\\x{27C7}-\\x{27E5}\\x{27E6}\\x{27E7}\\x{27E8}\\x{27E9}\\x{27EA}\\x{27EB}\\x{27EC}\\x{27ED}\\x{27EE}\\x{27EF}\\x{27F0}-\\x{27FF}\\x{2900}-\\x{2982}\\x{2983}\\x{2984}\\x{2985}\\x{2986}\\x{2987}\\x{2988}\\x{2989}\\x{298A}\\x{298B}\\x{298C}\\x{298D}\\x{298E}\\x{298F}\\x{2990}\\x{2991}\\x{2992}\\x{2993}\\x{2994}\\x{2995}\\x{2996}\\x{2997}\\x{2998}\\x{2999}-\\x{29D7}\\x{29D8}\\x{29D9}\\x{29DA}\\x{29DB}\\x{29DC}-\\x{29FB}\\x{29FC}\\x{29FD}\\x{29FE}-\\x{2AFF}\\x{2B00}-\\x{2B2F}\\x{2B30}-\\x{2B44}\\x{2B45}-\\x{2B46}\\x{2B47}-\\x{2B4C}\\x{2B4D}-\\x{2B73}\\x{2B76}-\\x{2B95}\\x{2B97}-\\x{2BFF}\\x{2CE5}-\\x{2CEA}\\x{2CEF}-\\x{2CF1}\\x{2CF9}-\\x{2CFC}\\x{2CFD}\\x{2CFE}-\\x{2CFF}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{2E00}-\\x{2E01}\\x{2E02}\\x{2E03}\\x{2E04}\\x{2E05}\\x{2E06}-\\x{2E08}\\x{2E09}\\x{2E0A}\\x{2E0B}\\x{2E0C}\\x{2E0D}\\x{2E0E}-\\x{2E16}\\x{2E17}\\x{2E18}-\\x{2E19}\\x{2E1A}\\x{2E1B}\\x{2E1C}\\x{2E1D}\\x{2E1E}-\\x{2E1F}\\x{2E20}\\x{2E21}\\x{2E22}\\x{2E23}\\x{2E24}\\x{2E25}\\x{2E26}\\x{2E27}\\x{2E28}\\x{2E29}\\x{2E2A}-\\x{2E2E}\\x{2E2F}\\x{2E30}-\\x{2E39}\\x{2E3A}-\\x{2E3B}\\x{2E3C}-\\x{2E3F}\\x{2E40}\\x{2E41}\\x{2E42}\\x{2E43}-\\x{2E4F}\\x{2E50}-\\x{2E51}\\x{2E52}\\x{2E80}-\\x{2E99}\\x{2E9B}-\\x{2EF3}\\x{2F00}-\\x{2FD5}\\x{2FF0}-\\x{2FFB}\\x{3000}\\x{3001}-\\x{3003}\\x{3004}\\x{3008}\\x{3009}\\x{300A}\\x{300B}\\x{300C}\\x{300D}\\x{300E}\\x{300F}\\x{3010}\\x{3011}\\x{3012}-\\x{3013}\\x{3014}\\x{3015}\\x{3016}\\x{3017}\\x{3018}\\x{3019}\\x{301A}\\x{301B}\\x{301C}\\x{301D}\\x{301E}-\\x{301F}\\x{3020}\\x{302A}-\\x{302D}\\x{3030}\\x{3036}-\\x{3037}\\x{303D}\\x{303E}-\\x{303F}\\x{3099}-\\x{309A}\\x{309B}-\\x{309C}\\x{30A0}\\x{30FB}\\x{31C0}-\\x{31E3}\\x{321D}-\\x{321E}\\x{3250}\\x{3251}-\\x{325F}\\x{327C}-\\x{327E}\\x{32B1}-\\x{32BF}\\x{32CC}-\\x{32CF}\\x{3377}-\\x{337A}\\x{33DE}-\\x{33DF}\\x{33FF}\\x{4DC0}-\\x{4DFF}\\x{A490}-\\x{A4C6}\\x{A60D}-\\x{A60F}\\x{A66F}\\x{A670}-\\x{A672}\\x{A673}\\x{A674}-\\x{A67D}\\x{A67E}\\x{A67F}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A700}-\\x{A716}\\x{A717}-\\x{A71F}\\x{A720}-\\x{A721}\\x{A788}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A828}-\\x{A82B}\\x{A82C}\\x{A838}\\x{A839}\\x{A874}-\\x{A877}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{AB6A}-\\x{AB6B}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1D}\\x{FB1E}\\x{FB1F}-\\x{FB28}\\x{FB29}\\x{FB2A}-\\x{FB36}\\x{FB37}\\x{FB38}-\\x{FB3C}\\x{FB3D}\\x{FB3E}\\x{FB3F}\\x{FB40}-\\x{FB41}\\x{FB42}\\x{FB43}-\\x{FB44}\\x{FB45}\\x{FB46}-\\x{FB4F}\\x{FB50}-\\x{FBB1}\\x{FBB2}-\\x{FBC1}\\x{FBC2}-\\x{FBD2}\\x{FBD3}-\\x{FD3D}\\x{FD3E}\\x{FD3F}\\x{FD40}-\\x{FD4F}\\x{FD50}-\\x{FD8F}\\x{FD90}-\\x{FD91}\\x{FD92}-\\x{FDC7}\\x{FDC8}-\\x{FDCF}\\x{FDD0}-\\x{FDEF}\\x{FDF0}-\\x{FDFB}\\x{FDFC}\\x{FDFD}\\x{FDFE}-\\x{FDFF}\\x{FE00}-\\x{FE0F}\\x{FE10}-\\x{FE16}\\x{FE17}\\x{FE18}\\x{FE19}\\x{FE20}-\\x{FE2F}\\x{FE30}\\x{FE31}-\\x{FE32}\\x{FE33}-\\x{FE34}\\x{FE35}\\x{FE36}\\x{FE37}\\x{FE38}\\x{FE39}\\x{FE3A}\\x{FE3B}\\x{FE3C}\\x{FE3D}\\x{FE3E}\\x{FE3F}\\x{FE40}\\x{FE41}\\x{FE42}\\x{FE43}\\x{FE44}\\x{FE45}-\\x{FE46}\\x{FE47}\\x{FE48}\\x{FE49}-\\x{FE4C}\\x{FE4D}-\\x{FE4F}\\x{FE50}\\x{FE51}\\x{FE52}\\x{FE54}\\x{FE55}\\x{FE56}-\\x{FE57}\\x{FE58}\\x{FE59}\\x{FE5A}\\x{FE5B}\\x{FE5C}\\x{FE5D}\\x{FE5E}\\x{FE5F}\\x{FE60}-\\x{FE61}\\x{FE62}\\x{FE63}\\x{FE64}-\\x{FE66}\\x{FE68}\\x{FE69}\\x{FE6A}\\x{FE6B}\\x{FE70}-\\x{FE74}\\x{FE75}\\x{FE76}-\\x{FEFC}\\x{FEFD}-\\x{FEFE}\\x{FEFF}\\x{FF01}-\\x{FF02}\\x{FF03}\\x{FF04}\\x{FF05}\\x{FF06}-\\x{FF07}\\x{FF08}\\x{FF09}\\x{FF0A}\\x{FF0B}\\x{FF0C}\\x{FF0D}\\x{FF0E}-\\x{FF0F}\\x{FF1A}\\x{FF1B}\\x{FF1C}-\\x{FF1E}\\x{FF1F}-\\x{FF20}\\x{FF3B}\\x{FF3C}\\x{FF3D}\\x{FF3E}\\x{FF3F}\\x{FF40}\\x{FF5B}\\x{FF5C}\\x{FF5D}\\x{FF5E}\\x{FF5F}\\x{FF60}\\x{FF61}\\x{FF62}\\x{FF63}\\x{FF64}-\\x{FF65}\\x{FFE0}-\\x{FFE1}\\x{FFE2}\\x{FFE3}\\x{FFE4}\\x{FFE5}-\\x{FFE6}\\x{FFE8}\\x{FFE9}-\\x{FFEC}\\x{FFED}-\\x{FFEE}\\x{FFF0}-\\x{FFF8}\\x{FFF9}-\\x{FFFB}\\x{FFFC}-\\x{FFFD}\\x{FFFE}-\\x{FFFF}\\x{10101}\\x{10140}-\\x{10174}\\x{10175}-\\x{10178}\\x{10179}-\\x{10189}\\x{1018A}-\\x{1018B}\\x{1018C}\\x{10190}-\\x{1019C}\\x{101A0}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10800}-\\x{10805}\\x{10806}-\\x{10807}\\x{10808}\\x{10809}\\x{1080A}-\\x{10835}\\x{10836}\\x{10837}-\\x{10838}\\x{10839}-\\x{1083B}\\x{1083C}\\x{1083D}-\\x{1083E}\\x{1083F}-\\x{10855}\\x{10856}\\x{10857}\\x{10858}-\\x{1085F}\\x{10860}-\\x{10876}\\x{10877}-\\x{10878}\\x{10879}-\\x{1087F}\\x{10880}-\\x{1089E}\\x{1089F}-\\x{108A6}\\x{108A7}-\\x{108AF}\\x{108B0}-\\x{108DF}\\x{108E0}-\\x{108F2}\\x{108F3}\\x{108F4}-\\x{108F5}\\x{108F6}-\\x{108FA}\\x{108FB}-\\x{108FF}\\x{10900}-\\x{10915}\\x{10916}-\\x{1091B}\\x{1091C}-\\x{1091E}\\x{1091F}\\x{10920}-\\x{10939}\\x{1093A}-\\x{1093E}\\x{1093F}\\x{10940}-\\x{1097F}\\x{10980}-\\x{109B7}\\x{109B8}-\\x{109BB}\\x{109BC}-\\x{109BD}\\x{109BE}-\\x{109BF}\\x{109C0}-\\x{109CF}\\x{109D0}-\\x{109D1}\\x{109D2}-\\x{109FF}\\x{10A00}\\x{10A01}-\\x{10A03}\\x{10A04}\\x{10A05}-\\x{10A06}\\x{10A07}-\\x{10A0B}\\x{10A0C}-\\x{10A0F}\\x{10A10}-\\x{10A13}\\x{10A14}\\x{10A15}-\\x{10A17}\\x{10A18}\\x{10A19}-\\x{10A35}\\x{10A36}-\\x{10A37}\\x{10A38}-\\x{10A3A}\\x{10A3B}-\\x{10A3E}\\x{10A3F}\\x{10A40}-\\x{10A48}\\x{10A49}-\\x{10A4F}\\x{10A50}-\\x{10A58}\\x{10A59}-\\x{10A5F}\\x{10A60}-\\x{10A7C}\\x{10A7D}-\\x{10A7E}\\x{10A7F}\\x{10A80}-\\x{10A9C}\\x{10A9D}-\\x{10A9F}\\x{10AA0}-\\x{10ABF}\\x{10AC0}-\\x{10AC7}\\x{10AC8}\\x{10AC9}-\\x{10AE4}\\x{10AE5}-\\x{10AE6}\\x{10AE7}-\\x{10AEA}\\x{10AEB}-\\x{10AEF}\\x{10AF0}-\\x{10AF6}\\x{10AF7}-\\x{10AFF}\\x{10B00}-\\x{10B35}\\x{10B36}-\\x{10B38}\\x{10B39}-\\x{10B3F}\\x{10B40}-\\x{10B55}\\x{10B56}-\\x{10B57}\\x{10B58}-\\x{10B5F}\\x{10B60}-\\x{10B72}\\x{10B73}-\\x{10B77}\\x{10B78}-\\x{10B7F}\\x{10B80}-\\x{10B91}\\x{10B92}-\\x{10B98}\\x{10B99}-\\x{10B9C}\\x{10B9D}-\\x{10BA8}\\x{10BA9}-\\x{10BAF}\\x{10BB0}-\\x{10BFF}\\x{10C00}-\\x{10C48}\\x{10C49}-\\x{10C7F}\\x{10C80}-\\x{10CB2}\\x{10CB3}-\\x{10CBF}\\x{10CC0}-\\x{10CF2}\\x{10CF3}-\\x{10CF9}\\x{10CFA}-\\x{10CFF}\\x{10D00}-\\x{10D23}\\x{10D24}-\\x{10D27}\\x{10D28}-\\x{10D2F}\\x{10D30}-\\x{10D39}\\x{10D3A}-\\x{10D3F}\\x{10D40}-\\x{10E5F}\\x{10E60}-\\x{10E7E}\\x{10E7F}\\x{10E80}-\\x{10EA9}\\x{10EAA}\\x{10EAB}-\\x{10EAC}\\x{10EAD}\\x{10EAE}-\\x{10EAF}\\x{10EB0}-\\x{10EB1}\\x{10EB2}-\\x{10EFF}\\x{10F00}-\\x{10F1C}\\x{10F1D}-\\x{10F26}\\x{10F27}\\x{10F28}-\\x{10F2F}\\x{10F30}-\\x{10F45}\\x{10F46}-\\x{10F50}\\x{10F51}-\\x{10F54}\\x{10F55}-\\x{10F59}\\x{10F5A}-\\x{10F6F}\\x{10F70}-\\x{10FAF}\\x{10FB0}-\\x{10FC4}\\x{10FC5}-\\x{10FCB}\\x{10FCC}-\\x{10FDF}\\x{10FE0}-\\x{10FF6}\\x{10FF7}-\\x{10FFF}\\x{11001}\\x{11038}-\\x{11046}\\x{11052}-\\x{11065}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{11660}-\\x{1166C}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A06}\\x{11A09}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{11FD5}-\\x{11FDC}\\x{11FDD}-\\x{11FE0}\\x{11FE1}-\\x{11FF1}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE2}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D200}-\\x{1D241}\\x{1D242}-\\x{1D244}\\x{1D245}\\x{1D300}-\\x{1D356}\\x{1D6DB}\\x{1D715}\\x{1D74F}\\x{1D789}\\x{1D7C3}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E2FF}\\x{1E800}-\\x{1E8C4}\\x{1E8C5}-\\x{1E8C6}\\x{1E8C7}-\\x{1E8CF}\\x{1E8D0}-\\x{1E8D6}\\x{1E8D7}-\\x{1E8FF}\\x{1E900}-\\x{1E943}\\x{1E944}-\\x{1E94A}\\x{1E94B}\\x{1E94C}-\\x{1E94F}\\x{1E950}-\\x{1E959}\\x{1E95A}-\\x{1E95D}\\x{1E95E}-\\x{1E95F}\\x{1E960}-\\x{1EC6F}\\x{1EC70}\\x{1EC71}-\\x{1ECAB}\\x{1ECAC}\\x{1ECAD}-\\x{1ECAF}\\x{1ECB0}\\x{1ECB1}-\\x{1ECB4}\\x{1ECB5}-\\x{1ECBF}\\x{1ECC0}-\\x{1ECFF}\\x{1ED00}\\x{1ED01}-\\x{1ED2D}\\x{1ED2E}\\x{1ED2F}-\\x{1ED3D}\\x{1ED3E}-\\x{1ED4F}\\x{1ED50}-\\x{1EDFF}\\x{1EE00}-\\x{1EE03}\\x{1EE04}\\x{1EE05}-\\x{1EE1F}\\x{1EE20}\\x{1EE21}-\\x{1EE22}\\x{1EE23}\\x{1EE24}\\x{1EE25}-\\x{1EE26}\\x{1EE27}\\x{1EE28}\\x{1EE29}-\\x{1EE32}\\x{1EE33}\\x{1EE34}-\\x{1EE37}\\x{1EE38}\\x{1EE39}\\x{1EE3A}\\x{1EE3B}\\x{1EE3C}-\\x{1EE41}\\x{1EE42}\\x{1EE43}-\\x{1EE46}\\x{1EE47}\\x{1EE48}\\x{1EE49}\\x{1EE4A}\\x{1EE4B}\\x{1EE4C}\\x{1EE4D}-\\x{1EE4F}\\x{1EE50}\\x{1EE51}-\\x{1EE52}\\x{1EE53}\\x{1EE54}\\x{1EE55}-\\x{1EE56}\\x{1EE57}\\x{1EE58}\\x{1EE59}\\x{1EE5A}\\x{1EE5B}\\x{1EE5C}\\x{1EE5D}\\x{1EE5E}\\x{1EE5F}\\x{1EE60}\\x{1EE61}-\\x{1EE62}\\x{1EE63}\\x{1EE64}\\x{1EE65}-\\x{1EE66}\\x{1EE67}-\\x{1EE6A}\\x{1EE6B}\\x{1EE6C}-\\x{1EE72}\\x{1EE73}\\x{1EE74}-\\x{1EE77}\\x{1EE78}\\x{1EE79}-\\x{1EE7C}\\x{1EE7D}\\x{1EE7E}\\x{1EE7F}\\x{1EE80}-\\x{1EE89}\\x{1EE8A}\\x{1EE8B}-\\x{1EE9B}\\x{1EE9C}-\\x{1EEA0}\\x{1EEA1}-\\x{1EEA3}\\x{1EEA4}\\x{1EEA5}-\\x{1EEA9}\\x{1EEAA}\\x{1EEAB}-\\x{1EEBB}\\x{1EEBC}-\\x{1EEEF}\\x{1EEF0}-\\x{1EEF1}\\x{1EEF2}-\\x{1EEFF}\\x{1EF00}-\\x{1EFFF}\\x{1F000}-\\x{1F02B}\\x{1F030}-\\x{1F093}\\x{1F0A0}-\\x{1F0AE}\\x{1F0B1}-\\x{1F0BF}\\x{1F0C1}-\\x{1F0CF}\\x{1F0D1}-\\x{1F0F5}\\x{1F10B}-\\x{1F10C}\\x{1F10D}-\\x{1F10F}\\x{1F12F}\\x{1F16A}-\\x{1F16F}\\x{1F1AD}\\x{1F260}-\\x{1F265}\\x{1F300}-\\x{1F3FA}\\x{1F3FB}-\\x{1F3FF}\\x{1F400}-\\x{1F6D7}\\x{1F6E0}-\\x{1F6EC}\\x{1F6F0}-\\x{1F6FC}\\x{1F700}-\\x{1F773}\\x{1F780}-\\x{1F7D8}\\x{1F7E0}-\\x{1F7EB}\\x{1F800}-\\x{1F80B}\\x{1F810}-\\x{1F847}\\x{1F850}-\\x{1F859}\\x{1F860}-\\x{1F887}\\x{1F890}-\\x{1F8AD}\\x{1F8B0}-\\x{1F8B1}\\x{1F900}-\\x{1F978}\\x{1F97A}-\\x{1F9CB}\\x{1F9CD}-\\x{1FA53}\\x{1FA60}-\\x{1FA6D}\\x{1FA70}-\\x{1FA74}\\x{1FA78}-\\x{1FA7A}\\x{1FA80}-\\x{1FA86}\\x{1FA90}-\\x{1FAA8}\\x{1FAB0}-\\x{1FAB6}\\x{1FAC0}-\\x{1FAC2}\\x{1FAD0}-\\x{1FAD6}\\x{1FB00}-\\x{1FB92}\\x{1FB94}-\\x{1FBCA}\\x{1FFFE}-\\x{1FFFF}\\x{2FFFE}-\\x{2FFFF}\\x{3FFFE}-\\x{3FFFF}\\x{4FFFE}-\\x{4FFFF}\\x{5FFFE}-\\x{5FFFF}\\x{6FFFE}-\\x{6FFFF}\\x{7FFFE}-\\x{7FFFF}\\x{8FFFE}-\\x{8FFFF}\\x{9FFFE}-\\x{9FFFF}\\x{AFFFE}-\\x{AFFFF}\\x{BFFFE}-\\x{BFFFF}\\x{CFFFE}-\\x{CFFFF}\\x{DFFFE}-\\x{E0000}\\x{E0001}\\x{E0002}-\\x{E001F}\\x{E0020}-\\x{E007F}\\x{E0080}-\\x{E00FF}\\x{E0100}-\\x{E01EF}\\x{E01F0}-\\x{E0FFF}\\x{EFFFE}-\\x{EFFFF}\\x{FFFFE}-\\x{FFFFF}\\x{10FFFE}-\\x{10FFFF}][\\x{0300}-\\x{036F}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{0610}-\\x{061A}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DF}-\\x{06E4}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07FD}\\x{0816}-\\x{0819}\\x{081B}-\\x{0823}\\x{0825}-\\x{0827}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DD}\\x{180B}-\\x{180D}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2CEF}-\\x{2CF1}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{302A}-\\x{302D}\\x{3099}-\\x{309A}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A82C}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FE00}-\\x{FE0F}\\x{FE20}-\\x{FE2F}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10EAB}-\\x{10EAC}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A06}\\x{11A09}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1D167}-\\x{1D169}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{E0100}-\\x{E01EF}]*$/u'; const ZWNJ = '/([\\x{A872}\\x{10ACD}\\x{10AD7}\\x{10D00}\\x{10FCB}\\x{0620}\\x{0626}\\x{0628}\\x{062A}-\\x{062E}\\x{0633}-\\x{063F}\\x{0641}-\\x{0647}\\x{0649}-\\x{064A}\\x{066E}-\\x{066F}\\x{0678}-\\x{0687}\\x{069A}-\\x{06BF}\\x{06C1}-\\x{06C2}\\x{06CC}\\x{06CE}\\x{06D0}-\\x{06D1}\\x{06FA}-\\x{06FC}\\x{06FF}\\x{0712}-\\x{0714}\\x{071A}-\\x{071D}\\x{071F}-\\x{0727}\\x{0729}\\x{072B}\\x{072D}-\\x{072E}\\x{074E}-\\x{0758}\\x{075C}-\\x{076A}\\x{076D}-\\x{0770}\\x{0772}\\x{0775}-\\x{0777}\\x{077A}-\\x{077F}\\x{07CA}-\\x{07EA}\\x{0841}-\\x{0845}\\x{0848}\\x{084A}-\\x{0853}\\x{0855}\\x{0860}\\x{0862}-\\x{0865}\\x{0868}\\x{08A0}-\\x{08A9}\\x{08AF}-\\x{08B0}\\x{08B3}-\\x{08B4}\\x{08B6}-\\x{08B8}\\x{08BA}-\\x{08C7}\\x{1807}\\x{1820}-\\x{1842}\\x{1843}\\x{1844}-\\x{1878}\\x{1887}-\\x{18A8}\\x{18AA}\\x{A840}-\\x{A871}\\x{10AC0}-\\x{10AC4}\\x{10AD3}-\\x{10AD6}\\x{10AD8}-\\x{10ADC}\\x{10ADE}-\\x{10AE0}\\x{10AEB}-\\x{10AEE}\\x{10B80}\\x{10B82}\\x{10B86}-\\x{10B88}\\x{10B8A}-\\x{10B8B}\\x{10B8D}\\x{10B90}\\x{10BAD}-\\x{10BAE}\\x{10D01}-\\x{10D21}\\x{10D23}\\x{10F30}-\\x{10F32}\\x{10F34}-\\x{10F44}\\x{10F51}-\\x{10F53}\\x{10FB0}\\x{10FB2}-\\x{10FB3}\\x{10FB8}\\x{10FBB}-\\x{10FBC}\\x{10FBE}-\\x{10FBF}\\x{10FC1}\\x{10FC4}\\x{10FCA}\\x{1E900}-\\x{1E943}][\\x{00AD}\\x{0300}-\\x{036F}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{0610}-\\x{061A}\\x{061C}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DF}-\\x{06E4}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{070F}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07FD}\\x{0816}-\\x{0819}\\x{081B}-\\x{0823}\\x{0825}-\\x{0827}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CBF}\\x{0CC6}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DD}\\x{180B}-\\x{180D}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{200B}\\x{200E}-\\x{200F}\\x{202A}-\\x{202E}\\x{2060}-\\x{2064}\\x{206A}-\\x{206F}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2CEF}-\\x{2CF1}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{302A}-\\x{302D}\\x{3099}-\\x{309A}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A82C}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FE00}-\\x{FE0F}\\x{FE20}-\\x{FE2F}\\x{FEFF}\\x{FFF9}-\\x{FFFB}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10EAB}-\\x{10EAC}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{13430}-\\x{13438}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{1E94B}\\x{E0001}\\x{E0020}-\\x{E007F}\\x{E0100}-\\x{E01EF}]*\\x{200C}[\\x{00AD}\\x{0300}-\\x{036F}\\x{0483}-\\x{0487}\\x{0488}-\\x{0489}\\x{0591}-\\x{05BD}\\x{05BF}\\x{05C1}-\\x{05C2}\\x{05C4}-\\x{05C5}\\x{05C7}\\x{0610}-\\x{061A}\\x{061C}\\x{064B}-\\x{065F}\\x{0670}\\x{06D6}-\\x{06DC}\\x{06DF}-\\x{06E4}\\x{06E7}-\\x{06E8}\\x{06EA}-\\x{06ED}\\x{070F}\\x{0711}\\x{0730}-\\x{074A}\\x{07A6}-\\x{07B0}\\x{07EB}-\\x{07F3}\\x{07FD}\\x{0816}-\\x{0819}\\x{081B}-\\x{0823}\\x{0825}-\\x{0827}\\x{0829}-\\x{082D}\\x{0859}-\\x{085B}\\x{08D3}-\\x{08E1}\\x{08E3}-\\x{0902}\\x{093A}\\x{093C}\\x{0941}-\\x{0948}\\x{094D}\\x{0951}-\\x{0957}\\x{0962}-\\x{0963}\\x{0981}\\x{09BC}\\x{09C1}-\\x{09C4}\\x{09CD}\\x{09E2}-\\x{09E3}\\x{09FE}\\x{0A01}-\\x{0A02}\\x{0A3C}\\x{0A41}-\\x{0A42}\\x{0A47}-\\x{0A48}\\x{0A4B}-\\x{0A4D}\\x{0A51}\\x{0A70}-\\x{0A71}\\x{0A75}\\x{0A81}-\\x{0A82}\\x{0ABC}\\x{0AC1}-\\x{0AC5}\\x{0AC7}-\\x{0AC8}\\x{0ACD}\\x{0AE2}-\\x{0AE3}\\x{0AFA}-\\x{0AFF}\\x{0B01}\\x{0B3C}\\x{0B3F}\\x{0B41}-\\x{0B44}\\x{0B4D}\\x{0B55}-\\x{0B56}\\x{0B62}-\\x{0B63}\\x{0B82}\\x{0BC0}\\x{0BCD}\\x{0C00}\\x{0C04}\\x{0C3E}-\\x{0C40}\\x{0C46}-\\x{0C48}\\x{0C4A}-\\x{0C4D}\\x{0C55}-\\x{0C56}\\x{0C62}-\\x{0C63}\\x{0C81}\\x{0CBC}\\x{0CBF}\\x{0CC6}\\x{0CCC}-\\x{0CCD}\\x{0CE2}-\\x{0CE3}\\x{0D00}-\\x{0D01}\\x{0D3B}-\\x{0D3C}\\x{0D41}-\\x{0D44}\\x{0D4D}\\x{0D62}-\\x{0D63}\\x{0D81}\\x{0DCA}\\x{0DD2}-\\x{0DD4}\\x{0DD6}\\x{0E31}\\x{0E34}-\\x{0E3A}\\x{0E47}-\\x{0E4E}\\x{0EB1}\\x{0EB4}-\\x{0EBC}\\x{0EC8}-\\x{0ECD}\\x{0F18}-\\x{0F19}\\x{0F35}\\x{0F37}\\x{0F39}\\x{0F71}-\\x{0F7E}\\x{0F80}-\\x{0F84}\\x{0F86}-\\x{0F87}\\x{0F8D}-\\x{0F97}\\x{0F99}-\\x{0FBC}\\x{0FC6}\\x{102D}-\\x{1030}\\x{1032}-\\x{1037}\\x{1039}-\\x{103A}\\x{103D}-\\x{103E}\\x{1058}-\\x{1059}\\x{105E}-\\x{1060}\\x{1071}-\\x{1074}\\x{1082}\\x{1085}-\\x{1086}\\x{108D}\\x{109D}\\x{135D}-\\x{135F}\\x{1712}-\\x{1714}\\x{1732}-\\x{1734}\\x{1752}-\\x{1753}\\x{1772}-\\x{1773}\\x{17B4}-\\x{17B5}\\x{17B7}-\\x{17BD}\\x{17C6}\\x{17C9}-\\x{17D3}\\x{17DD}\\x{180B}-\\x{180D}\\x{1885}-\\x{1886}\\x{18A9}\\x{1920}-\\x{1922}\\x{1927}-\\x{1928}\\x{1932}\\x{1939}-\\x{193B}\\x{1A17}-\\x{1A18}\\x{1A1B}\\x{1A56}\\x{1A58}-\\x{1A5E}\\x{1A60}\\x{1A62}\\x{1A65}-\\x{1A6C}\\x{1A73}-\\x{1A7C}\\x{1A7F}\\x{1AB0}-\\x{1ABD}\\x{1ABE}\\x{1ABF}-\\x{1AC0}\\x{1B00}-\\x{1B03}\\x{1B34}\\x{1B36}-\\x{1B3A}\\x{1B3C}\\x{1B42}\\x{1B6B}-\\x{1B73}\\x{1B80}-\\x{1B81}\\x{1BA2}-\\x{1BA5}\\x{1BA8}-\\x{1BA9}\\x{1BAB}-\\x{1BAD}\\x{1BE6}\\x{1BE8}-\\x{1BE9}\\x{1BED}\\x{1BEF}-\\x{1BF1}\\x{1C2C}-\\x{1C33}\\x{1C36}-\\x{1C37}\\x{1CD0}-\\x{1CD2}\\x{1CD4}-\\x{1CE0}\\x{1CE2}-\\x{1CE8}\\x{1CED}\\x{1CF4}\\x{1CF8}-\\x{1CF9}\\x{1DC0}-\\x{1DF9}\\x{1DFB}-\\x{1DFF}\\x{200B}\\x{200E}-\\x{200F}\\x{202A}-\\x{202E}\\x{2060}-\\x{2064}\\x{206A}-\\x{206F}\\x{20D0}-\\x{20DC}\\x{20DD}-\\x{20E0}\\x{20E1}\\x{20E2}-\\x{20E4}\\x{20E5}-\\x{20F0}\\x{2CEF}-\\x{2CF1}\\x{2D7F}\\x{2DE0}-\\x{2DFF}\\x{302A}-\\x{302D}\\x{3099}-\\x{309A}\\x{A66F}\\x{A670}-\\x{A672}\\x{A674}-\\x{A67D}\\x{A69E}-\\x{A69F}\\x{A6F0}-\\x{A6F1}\\x{A802}\\x{A806}\\x{A80B}\\x{A825}-\\x{A826}\\x{A82C}\\x{A8C4}-\\x{A8C5}\\x{A8E0}-\\x{A8F1}\\x{A8FF}\\x{A926}-\\x{A92D}\\x{A947}-\\x{A951}\\x{A980}-\\x{A982}\\x{A9B3}\\x{A9B6}-\\x{A9B9}\\x{A9BC}-\\x{A9BD}\\x{A9E5}\\x{AA29}-\\x{AA2E}\\x{AA31}-\\x{AA32}\\x{AA35}-\\x{AA36}\\x{AA43}\\x{AA4C}\\x{AA7C}\\x{AAB0}\\x{AAB2}-\\x{AAB4}\\x{AAB7}-\\x{AAB8}\\x{AABE}-\\x{AABF}\\x{AAC1}\\x{AAEC}-\\x{AAED}\\x{AAF6}\\x{ABE5}\\x{ABE8}\\x{ABED}\\x{FB1E}\\x{FE00}-\\x{FE0F}\\x{FE20}-\\x{FE2F}\\x{FEFF}\\x{FFF9}-\\x{FFFB}\\x{101FD}\\x{102E0}\\x{10376}-\\x{1037A}\\x{10A01}-\\x{10A03}\\x{10A05}-\\x{10A06}\\x{10A0C}-\\x{10A0F}\\x{10A38}-\\x{10A3A}\\x{10A3F}\\x{10AE5}-\\x{10AE6}\\x{10D24}-\\x{10D27}\\x{10EAB}-\\x{10EAC}\\x{10F46}-\\x{10F50}\\x{11001}\\x{11038}-\\x{11046}\\x{1107F}-\\x{11081}\\x{110B3}-\\x{110B6}\\x{110B9}-\\x{110BA}\\x{11100}-\\x{11102}\\x{11127}-\\x{1112B}\\x{1112D}-\\x{11134}\\x{11173}\\x{11180}-\\x{11181}\\x{111B6}-\\x{111BE}\\x{111C9}-\\x{111CC}\\x{111CF}\\x{1122F}-\\x{11231}\\x{11234}\\x{11236}-\\x{11237}\\x{1123E}\\x{112DF}\\x{112E3}-\\x{112EA}\\x{11300}-\\x{11301}\\x{1133B}-\\x{1133C}\\x{11340}\\x{11366}-\\x{1136C}\\x{11370}-\\x{11374}\\x{11438}-\\x{1143F}\\x{11442}-\\x{11444}\\x{11446}\\x{1145E}\\x{114B3}-\\x{114B8}\\x{114BA}\\x{114BF}-\\x{114C0}\\x{114C2}-\\x{114C3}\\x{115B2}-\\x{115B5}\\x{115BC}-\\x{115BD}\\x{115BF}-\\x{115C0}\\x{115DC}-\\x{115DD}\\x{11633}-\\x{1163A}\\x{1163D}\\x{1163F}-\\x{11640}\\x{116AB}\\x{116AD}\\x{116B0}-\\x{116B5}\\x{116B7}\\x{1171D}-\\x{1171F}\\x{11722}-\\x{11725}\\x{11727}-\\x{1172B}\\x{1182F}-\\x{11837}\\x{11839}-\\x{1183A}\\x{1193B}-\\x{1193C}\\x{1193E}\\x{11943}\\x{119D4}-\\x{119D7}\\x{119DA}-\\x{119DB}\\x{119E0}\\x{11A01}-\\x{11A0A}\\x{11A33}-\\x{11A38}\\x{11A3B}-\\x{11A3E}\\x{11A47}\\x{11A51}-\\x{11A56}\\x{11A59}-\\x{11A5B}\\x{11A8A}-\\x{11A96}\\x{11A98}-\\x{11A99}\\x{11C30}-\\x{11C36}\\x{11C38}-\\x{11C3D}\\x{11C3F}\\x{11C92}-\\x{11CA7}\\x{11CAA}-\\x{11CB0}\\x{11CB2}-\\x{11CB3}\\x{11CB5}-\\x{11CB6}\\x{11D31}-\\x{11D36}\\x{11D3A}\\x{11D3C}-\\x{11D3D}\\x{11D3F}-\\x{11D45}\\x{11D47}\\x{11D90}-\\x{11D91}\\x{11D95}\\x{11D97}\\x{11EF3}-\\x{11EF4}\\x{13430}-\\x{13438}\\x{16AF0}-\\x{16AF4}\\x{16B30}-\\x{16B36}\\x{16F4F}\\x{16F8F}-\\x{16F92}\\x{16FE4}\\x{1BC9D}-\\x{1BC9E}\\x{1BCA0}-\\x{1BCA3}\\x{1D167}-\\x{1D169}\\x{1D173}-\\x{1D17A}\\x{1D17B}-\\x{1D182}\\x{1D185}-\\x{1D18B}\\x{1D1AA}-\\x{1D1AD}\\x{1D242}-\\x{1D244}\\x{1DA00}-\\x{1DA36}\\x{1DA3B}-\\x{1DA6C}\\x{1DA75}\\x{1DA84}\\x{1DA9B}-\\x{1DA9F}\\x{1DAA1}-\\x{1DAAF}\\x{1E000}-\\x{1E006}\\x{1E008}-\\x{1E018}\\x{1E01B}-\\x{1E021}\\x{1E023}-\\x{1E024}\\x{1E026}-\\x{1E02A}\\x{1E130}-\\x{1E136}\\x{1E2EC}-\\x{1E2EF}\\x{1E8D0}-\\x{1E8D6}\\x{1E944}-\\x{1E94A}\\x{1E94B}\\x{E0001}\\x{E0020}-\\x{E007F}\\x{E0100}-\\x{E01EF}]*)[\\x{0622}-\\x{0625}\\x{0627}\\x{0629}\\x{062F}-\\x{0632}\\x{0648}\\x{0671}-\\x{0673}\\x{0675}-\\x{0677}\\x{0688}-\\x{0699}\\x{06C0}\\x{06C3}-\\x{06CB}\\x{06CD}\\x{06CF}\\x{06D2}-\\x{06D3}\\x{06D5}\\x{06EE}-\\x{06EF}\\x{0710}\\x{0715}-\\x{0719}\\x{071E}\\x{0728}\\x{072A}\\x{072C}\\x{072F}\\x{074D}\\x{0759}-\\x{075B}\\x{076B}-\\x{076C}\\x{0771}\\x{0773}-\\x{0774}\\x{0778}-\\x{0779}\\x{0840}\\x{0846}-\\x{0847}\\x{0849}\\x{0854}\\x{0856}-\\x{0858}\\x{0867}\\x{0869}-\\x{086A}\\x{08AA}-\\x{08AC}\\x{08AE}\\x{08B1}-\\x{08B2}\\x{08B9}\\x{10AC5}\\x{10AC7}\\x{10AC9}-\\x{10ACA}\\x{10ACE}-\\x{10AD2}\\x{10ADD}\\x{10AE1}\\x{10AE4}\\x{10AEF}\\x{10B81}\\x{10B83}-\\x{10B85}\\x{10B89}\\x{10B8C}\\x{10B8E}-\\x{10B8F}\\x{10B91}\\x{10BA9}-\\x{10BAC}\\x{10D22}\\x{10F33}\\x{10F54}\\x{10FB4}-\\x{10FB6}\\x{10FB9}-\\x{10FBA}\\x{10FBD}\\x{10FC2}-\\x{10FC3}\\x{10FC9}\\x{0620}\\x{0626}\\x{0628}\\x{062A}-\\x{062E}\\x{0633}-\\x{063F}\\x{0641}-\\x{0647}\\x{0649}-\\x{064A}\\x{066E}-\\x{066F}\\x{0678}-\\x{0687}\\x{069A}-\\x{06BF}\\x{06C1}-\\x{06C2}\\x{06CC}\\x{06CE}\\x{06D0}-\\x{06D1}\\x{06FA}-\\x{06FC}\\x{06FF}\\x{0712}-\\x{0714}\\x{071A}-\\x{071D}\\x{071F}-\\x{0727}\\x{0729}\\x{072B}\\x{072D}-\\x{072E}\\x{074E}-\\x{0758}\\x{075C}-\\x{076A}\\x{076D}-\\x{0770}\\x{0772}\\x{0775}-\\x{0777}\\x{077A}-\\x{077F}\\x{07CA}-\\x{07EA}\\x{0841}-\\x{0845}\\x{0848}\\x{084A}-\\x{0853}\\x{0855}\\x{0860}\\x{0862}-\\x{0865}\\x{0868}\\x{08A0}-\\x{08A9}\\x{08AF}-\\x{08B0}\\x{08B3}-\\x{08B4}\\x{08B6}-\\x{08B8}\\x{08BA}-\\x{08C7}\\x{1807}\\x{1820}-\\x{1842}\\x{1843}\\x{1844}-\\x{1878}\\x{1887}-\\x{18A8}\\x{18AA}\\x{A840}-\\x{A871}\\x{10AC0}-\\x{10AC4}\\x{10AD3}-\\x{10AD6}\\x{10AD8}-\\x{10ADC}\\x{10ADE}-\\x{10AE0}\\x{10AEB}-\\x{10AEE}\\x{10B80}\\x{10B82}\\x{10B86}-\\x{10B88}\\x{10B8A}-\\x{10B8B}\\x{10B8D}\\x{10B90}\\x{10BAD}-\\x{10BAE}\\x{10D01}-\\x{10D21}\\x{10D23}\\x{10F30}-\\x{10F32}\\x{10F34}-\\x{10F44}\\x{10F51}-\\x{10F53}\\x{10FB0}\\x{10FB2}-\\x{10FB3}\\x{10FB8}\\x{10FBB}-\\x{10FBC}\\x{10FBE}-\\x{10FBF}\\x{10FC1}\\x{10FC4}\\x{10FCA}\\x{1E900}-\\x{1E943}]/u'; } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Info.php000064400000001010147600374260022257 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn; /** * @internal */ class Info { public $bidiDomain = \false; public $errors = 0; public $validBidiDomain = \true; public $transitionalDifferent = \false; } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/Idn.php000064400000072237147600374260022121 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn; use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex; /** * @see https://www.unicode.org/reports/tr46/ * * @internal */ final class Idn { public const ERROR_EMPTY_LABEL = 1; public const ERROR_LABEL_TOO_LONG = 2; public const ERROR_DOMAIN_NAME_TOO_LONG = 4; public const ERROR_LEADING_HYPHEN = 8; public const ERROR_TRAILING_HYPHEN = 0x10; public const ERROR_HYPHEN_3_4 = 0x20; public const ERROR_LEADING_COMBINING_MARK = 0x40; public const ERROR_DISALLOWED = 0x80; public const ERROR_PUNYCODE = 0x100; public const ERROR_LABEL_HAS_DOT = 0x200; public const ERROR_INVALID_ACE_LABEL = 0x400; public const ERROR_BIDI = 0x800; public const ERROR_CONTEXTJ = 0x1000; public const ERROR_CONTEXTO_PUNCTUATION = 0x2000; public const ERROR_CONTEXTO_DIGITS = 0x4000; public const INTL_IDNA_VARIANT_2003 = 0; public const INTL_IDNA_VARIANT_UTS46 = 1; public const IDNA_DEFAULT = 0; public const IDNA_ALLOW_UNASSIGNED = 1; public const IDNA_USE_STD3_RULES = 2; public const IDNA_CHECK_BIDI = 4; public const IDNA_CHECK_CONTEXTJ = 8; public const IDNA_NONTRANSITIONAL_TO_ASCII = 16; public const IDNA_NONTRANSITIONAL_TO_UNICODE = 32; public const MAX_DOMAIN_SIZE = 253; public const MAX_LABEL_SIZE = 63; public const BASE = 36; public const TMIN = 1; public const TMAX = 26; public const SKEW = 38; public const DAMP = 700; public const INITIAL_BIAS = 72; public const INITIAL_N = 128; public const DELIMITER = '-'; public const MAX_INT = 2147483647; /** * Contains the numeric value of a basic code point (for use in representing integers) in the * range 0 to BASE-1, or -1 if b is does not represent a value. * * @var array */ private static $basicToDigit = [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1]; /** * @var array */ private static $virama; /** * @var array */ private static $mapped; /** * @var array */ private static $ignored; /** * @var array */ private static $deviation; /** * @var array */ private static $disallowed; /** * @var array */ private static $disallowed_STD3_mapped; /** * @var array */ private static $disallowed_STD3_valid; /** * @var bool */ private static $mappingTableLoaded = \false; /** * @see https://www.unicode.org/reports/tr46/#ToASCII * * @param $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $options = ['CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_ASCII), 'VerifyDnsLength' => \true]; $info = new Info(); $labels = self::process((string) $domainName, $options, $info); foreach ($labels as $i => $label) { // Only convert labels to punycode that contain non-ASCII code points if (1 === \preg_match('/[^\\x00-\\x7F]/', $label)) { try { $label = 'xn--' . self::punycodeEncode($label); } catch (\Exception $e) { $info->errors |= self::ERROR_PUNYCODE; } $labels[$i] = $label; } } if ($options['VerifyDnsLength']) { self::validateDomainAndLabelLength($labels, $info); } $idna_info = ['result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors]; return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @see https://www.unicode.org/reports/tr46/#ToUnicode * * @param $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = []) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $info = new Info(); $labels = self::process((string) $domainName, ['CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_UNICODE)], $info); $idna_info = ['result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors]; return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @param $label * * @return bool */ private static function isValidContextJ(array $codePoints, $label) { if (!isset(self::$virama)) { self::$virama = (require __DIR__ . \DIRECTORY_SEPARATOR . 'Resources' . \DIRECTORY_SEPARATOR . 'unidata' . \DIRECTORY_SEPARATOR . 'virama.php'); } $offset = 0; foreach ($codePoints as $i => $codePoint) { if (0x200c !== $codePoint && 0x200d !== $codePoint) { continue; } if (!isset($codePoints[$i - 1])) { return \false; } // If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True; if (isset(self::$virama[$codePoints[$i - 1]])) { continue; } // If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C(Joining_Type:T)*(Joining_Type:{R,D})) Then // True; // Generated RegExp = ([Joining_Type:{L,D}][Joining_Type:T]*\u200C[Joining_Type:T]*)[Joining_Type:{R,D}] if (0x200c === $codePoint && 1 === \preg_match(Regex::ZWNJ, $label, $matches, \PREG_OFFSET_CAPTURE, $offset)) { $offset += \strlen($matches[1][0]); continue; } return \false; } return \true; } /** * @see https://www.unicode.org/reports/tr46/#ProcessingStepMap * * @param string $input * @param array $options * * @return string */ private static function mapCodePoints($input, array $options, Info $info) { $str = ''; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; $transitional = $options['Transitional_Processing']; foreach (self::utf8Decode($input) as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); switch ($data['status']) { case 'disallowed': $info->errors |= self::ERROR_DISALLOWED; // no break. case 'valid': $str .= \mb_chr($codePoint, 'utf-8'); break; case 'ignored': // Do nothing. break; case 'mapped': $str .= $data['mapping']; break; case 'deviation': $info->transitionalDifferent = \true; $str .= $transitional ? $data['mapping'] : \mb_chr($codePoint, 'utf-8'); break; } } return $str; } /** * @see https://www.unicode.org/reports/tr46/#Processing * * @param string $domain * @param array $options * * @return array */ private static function process($domain, array $options, Info $info) { // If VerifyDnsLength is not set, we are doing ToUnicode otherwise we are doing ToASCII and // we need to respect the VerifyDnsLength option. $checkForEmptyLabels = !isset($options['VerifyDnsLength']) || $options['VerifyDnsLength']; if ($checkForEmptyLabels && '' === $domain) { $info->errors |= self::ERROR_EMPTY_LABEL; return [$domain]; } // Step 1. Map each code point in the domain name string $domain = self::mapCodePoints($domain, $options, $info); // Step 2. Normalize the domain name string to Unicode Normalization Form C. if (!\Normalizer::isNormalized($domain, \Normalizer::FORM_C)) { $domain = \Normalizer::normalize($domain, \Normalizer::FORM_C); } // Step 3. Break the string into labels at U+002E (.) FULL STOP. $labels = \explode('.', $domain); $lastLabelIndex = \count($labels) - 1; // Step 4. Convert and validate each label in the domain name string. foreach ($labels as $i => $label) { $validationOptions = $options; if ('xn--' === \substr($label, 0, 4)) { try { $label = self::punycodeDecode(\substr($label, 4)); } catch (\Exception $e) { $info->errors |= self::ERROR_PUNYCODE; continue; } $validationOptions['Transitional_Processing'] = \false; $labels[$i] = $label; } self::validateLabel($label, $info, $validationOptions, $i > 0 && $i === $lastLabelIndex); } if ($info->bidiDomain && !$info->validBidiDomain) { $info->errors |= self::ERROR_BIDI; } // Any input domain name string that does not record an error has been successfully // processed according to this specification. Conversely, if an input domain_name string // causes an error, then the processing of the input domain_name string fails. Determining // what to do with error input is up to the caller, and not in the scope of this document. return $labels; } /** * @see https://tools.ietf.org/html/rfc5893#section-2 * * @param $label */ private static function validateBidiLabel($label, Info $info) { if (1 === \preg_match(Regex::RTL_LABEL, $label)) { $info->bidiDomain = \true; // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the R or AL property, it is an RTL label if (1 !== \preg_match(Regex::BIDI_STEP_1_RTL, $label)) { $info->validBidiDomain = \false; return; } // Step 2. In an RTL label, only characters with the Bidi properties R, AL, AN, EN, ES, // CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_2, $label)) { $info->validBidiDomain = \false; return; } // Step 3. In an RTL label, the end of the label must be a character with Bidi property // R, AL, EN, or AN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_3, $label)) { $info->validBidiDomain = \false; return; } // Step 4. In an RTL label, if an EN is present, no AN may be present, and vice versa. if (1 === \preg_match(Regex::BIDI_STEP_4_AN, $label) && 1 === \preg_match(Regex::BIDI_STEP_4_EN, $label)) { $info->validBidiDomain = \false; return; } return; } // We are a LTR label // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the L property, it is an LTR label. if (1 !== \preg_match(Regex::BIDI_STEP_1_LTR, $label)) { $info->validBidiDomain = \false; return; } // Step 5. In an LTR label, only characters with the Bidi properties L, EN, // ES, CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_5, $label)) { $info->validBidiDomain = \false; return; } // Step 6.In an LTR label, the end of the label must be a character with Bidi property L or // EN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_6, $label)) { $info->validBidiDomain = \false; return; } } /** * @param array $labels */ private static function validateDomainAndLabelLength(array $labels, Info $info) { $maxDomainSize = self::MAX_DOMAIN_SIZE; $length = \count($labels); // Number of "." delimiters. $domainLength = $length - 1; // If the last label is empty and it is not the first label, then it is the root label. // Increase the max size by 1, making it 254, to account for the root label's "." // delimiter. This also means we don't need to check the last label's length for being too // long. if ($length > 1 && '' === $labels[$length - 1]) { ++$maxDomainSize; --$length; } for ($i = 0; $i < $length; ++$i) { $bytes = \strlen($labels[$i]); $domainLength += $bytes; if ($bytes > self::MAX_LABEL_SIZE) { $info->errors |= self::ERROR_LABEL_TOO_LONG; } } if ($domainLength > $maxDomainSize) { $info->errors |= self::ERROR_DOMAIN_NAME_TOO_LONG; } } /** * @see https://www.unicode.org/reports/tr46/#Validity_Criteria * * @param string $label * @param array $options * @param bool $canBeEmpty */ private static function validateLabel($label, Info $info, array $options, $canBeEmpty) { if ('' === $label) { if (!$canBeEmpty && (!isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'])) { $info->errors |= self::ERROR_EMPTY_LABEL; } return; } // Step 1. The label must be in Unicode Normalization Form C. if (!\Normalizer::isNormalized($label, \Normalizer::FORM_C)) { $info->errors |= self::ERROR_INVALID_ACE_LABEL; } $codePoints = self::utf8Decode($label); if ($options['CheckHyphens']) { // Step 2. If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character // in both the thrid and fourth positions. if (isset($codePoints[2], $codePoints[3]) && 0x2d === $codePoints[2] && 0x2d === $codePoints[3]) { $info->errors |= self::ERROR_HYPHEN_3_4; } // Step 3. If CheckHyphens, the label must neither begin nor end with a U+002D // HYPHEN-MINUS character. if ('-' === \substr($label, 0, 1)) { $info->errors |= self::ERROR_LEADING_HYPHEN; } if ('-' === \substr($label, -1, 1)) { $info->errors |= self::ERROR_TRAILING_HYPHEN; } } // Step 4. The label must not contain a U+002E (.) FULL STOP. if (\false !== \strpos($label, '.')) { $info->errors |= self::ERROR_LABEL_HAS_DOT; } // Step 5. The label must not begin with a combining mark, that is: General_Category=Mark. if (1 === \preg_match(Regex::COMBINING_MARK, $label)) { $info->errors |= self::ERROR_LEADING_COMBINING_MARK; } // Step 6. Each code point in the label must only have certain status values according to // Section 5, IDNA Mapping Table: $transitional = $options['Transitional_Processing']; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; foreach ($codePoints as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); $status = $data['status']; if ('valid' === $status || !$transitional && 'deviation' === $status) { continue; } $info->errors |= self::ERROR_DISALLOWED; break; } // Step 7. If CheckJoiners, the label must satisify the ContextJ rules from Appendix A, in // The Unicode Code Points and Internationalized Domain Names for Applications (IDNA) // [IDNA2008]. if ($options['CheckJoiners'] && !self::isValidContextJ($codePoints, $label)) { $info->errors |= self::ERROR_CONTEXTJ; } // Step 8. If CheckBidi, and if the domain name is a Bidi domain name, then the label must // satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2. if ($options['CheckBidi'] && (!$info->bidiDomain || $info->validBidiDomain)) { self::validateBidiLabel($label, $info); } } /** * @see https://tools.ietf.org/html/rfc3492#section-6.2 * * @param $input * * @return string */ private static function punycodeDecode($input) { $n = self::INITIAL_N; $out = 0; $i = 0; $bias = self::INITIAL_BIAS; $lastDelimIndex = \strrpos($input, self::DELIMITER); $b = \false === $lastDelimIndex ? 0 : $lastDelimIndex; $inputLength = \strlen($input); $output = []; $bytes = \array_map('ord', \str_split($input)); for ($j = 0; $j < $b; ++$j) { if ($bytes[$j] > 0x7f) { throw new \Exception('Invalid input'); } $output[$out++] = $input[$j]; } if ($b > 0) { ++$b; } for ($in = $b; $in < $inputLength; ++$out) { $oldi = $i; $w = 1; for ($k = self::BASE;; $k += self::BASE) { if ($in >= $inputLength) { throw new \Exception('Invalid input'); } $digit = self::$basicToDigit[$bytes[$in++] & 0xff]; if ($digit < 0) { throw new \Exception('Invalid input'); } if ($digit > \intdiv(self::MAX_INT - $i, $w)) { throw new \Exception('Integer overflow'); } $i += $digit * $w; if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($digit < $t) { break; } $baseMinusT = self::BASE - $t; if ($w > \intdiv(self::MAX_INT, $baseMinusT)) { throw new \Exception('Integer overflow'); } $w *= $baseMinusT; } $outPlusOne = $out + 1; $bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi); if (\intdiv($i, $outPlusOne) > self::MAX_INT - $n) { throw new \Exception('Integer overflow'); } $n += \intdiv($i, $outPlusOne); $i %= $outPlusOne; \array_splice($output, $i++, 0, [\mb_chr($n, 'utf-8')]); } return \implode('', $output); } /** * @see https://tools.ietf.org/html/rfc3492#section-6.3 * * @param $input * * @return string */ private static function punycodeEncode($input) { $n = self::INITIAL_N; $delta = 0; $out = 0; $bias = self::INITIAL_BIAS; $inputLength = 0; $output = ''; $iter = self::utf8Decode($input); foreach ($iter as $codePoint) { ++$inputLength; if ($codePoint < 0x80) { $output .= \chr($codePoint); ++$out; } } $h = $out; $b = $out; if ($b > 0) { $output .= self::DELIMITER; ++$out; } while ($h < $inputLength) { $m = self::MAX_INT; foreach ($iter as $codePoint) { if ($codePoint >= $n && $codePoint < $m) { $m = $codePoint; } } if ($m - $n > \intdiv(self::MAX_INT - $delta, $h + 1)) { throw new \Exception('Integer overflow'); } $delta += ($m - $n) * ($h + 1); $n = $m; foreach ($iter as $codePoint) { if ($codePoint < $n && 0 === ++$delta) { throw new \Exception('Integer overflow'); } if ($codePoint === $n) { $q = $delta; for ($k = self::BASE;; $k += self::BASE) { if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($q < $t) { break; } $qMinusT = $q - $t; $baseMinusT = self::BASE - $t; $output .= self::encodeDigit($t + $qMinusT % $baseMinusT, \false); ++$out; $q = \intdiv($qMinusT, $baseMinusT); } $output .= self::encodeDigit($q, \false); ++$out; $bias = self::adaptBias($delta, $h + 1, $h === $b); $delta = 0; ++$h; } } ++$delta; ++$n; } return $output; } /** * @see https://tools.ietf.org/html/rfc3492#section-6.1 * * @param int $delta * @param int $numPoints * @param $firstTime * * @return int */ private static function adaptBias($delta, $numPoints, $firstTime) { // xxx >> 1 is a faster way of doing intdiv(xxx, 2) $delta = $firstTime ? \intdiv($delta, self::DAMP) : $delta >> 1; $delta += \intdiv($delta, $numPoints); $k = 0; while ($delta > (self::BASE - self::TMIN) * self::TMAX >> 1) { $delta = \intdiv($delta, self::BASE - self::TMIN); $k += self::BASE; } return $k + \intdiv((self::BASE - self::TMIN + 1) * $delta, $delta + self::SKEW); } /** * @param int $d * @param $flag * * @return string */ private static function encodeDigit($d, $flag) { return \chr($d + 22 + 75 * ($d < 26 ? 1 : 0) - (($flag ? 1 : 0) << 5)); } /** * Takes a UTF-8 encoded string and converts it into a series of integer code points. Any * invalid byte sequences will be replaced by a U+FFFD replacement code point. * * @see https://encoding.spec.whatwg.org/#utf-8-decoder * * @param $input * * @return array */ private static function utf8Decode($input) { $bytesSeen = 0; $bytesNeeded = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = 0; $codePoints = []; $length = \strlen($input); for ($i = 0; $i < $length; ++$i) { $byte = \ord($input[$i]); if (0 === $bytesNeeded) { if ($byte >= 0x0 && $byte <= 0x7f) { $codePoints[] = $byte; continue; } if ($byte >= 0xc2 && $byte <= 0xdf) { $bytesNeeded = 1; $codePoint = $byte & 0x1f; } elseif ($byte >= 0xe0 && $byte <= 0xef) { if (0xe0 === $byte) { $lowerBoundary = 0xa0; } elseif (0xed === $byte) { $upperBoundary = 0x9f; } $bytesNeeded = 2; $codePoint = $byte & 0xf; } elseif ($byte >= 0xf0 && $byte <= 0xf4) { if (0xf0 === $byte) { $lowerBoundary = 0x90; } elseif (0xf4 === $byte) { $upperBoundary = 0x8f; } $bytesNeeded = 3; $codePoint = $byte & 0x7; } else { $codePoints[] = 0xfffd; } continue; } if ($byte < $lowerBoundary || $byte > $upperBoundary) { $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; --$i; $codePoints[] = 0xfffd; continue; } $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = $codePoint << 6 | $byte & 0x3f; if (++$bytesSeen !== $bytesNeeded) { continue; } $codePoints[] = $codePoint; $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; } // String unexpectedly ended, so append a U+FFFD code point. if (0 !== $bytesNeeded) { $codePoints[] = 0xfffd; } return $codePoints; } /** * @param int $codePoint * @param $useSTD3ASCIIRules * * @return array{status: string, mapping?: string} */ private static function lookupCodePointStatus($codePoint, $useSTD3ASCIIRules) { if (!self::$mappingTableLoaded) { self::$mappingTableLoaded = \true; self::$mapped = (require __DIR__ . '/Resources/unidata/mapped.php'); self::$ignored = (require __DIR__ . '/Resources/unidata/ignored.php'); self::$deviation = (require __DIR__ . '/Resources/unidata/deviation.php'); self::$disallowed = (require __DIR__ . '/Resources/unidata/disallowed.php'); self::$disallowed_STD3_mapped = (require __DIR__ . '/Resources/unidata/disallowed_STD3_mapped.php'); self::$disallowed_STD3_valid = (require __DIR__ . '/Resources/unidata/disallowed_STD3_valid.php'); } if (isset(self::$mapped[$codePoint])) { return ['status' => 'mapped', 'mapping' => self::$mapped[$codePoint]]; } if (isset(self::$ignored[$codePoint])) { return ['status' => 'ignored']; } if (isset(self::$deviation[$codePoint])) { return ['status' => 'deviation', 'mapping' => self::$deviation[$codePoint]]; } if (isset(self::$disallowed[$codePoint]) || DisallowedRanges::inRange($codePoint)) { return ['status' => 'disallowed']; } $isDisallowedMapped = isset(self::$disallowed_STD3_mapped[$codePoint]); if ($isDisallowedMapped || isset(self::$disallowed_STD3_valid[$codePoint])) { $status = 'disallowed'; if (!$useSTD3ASCIIRules) { $status = $isDisallowedMapped ? 'mapped' : 'valid'; } if ($isDisallowedMapped) { return ['status' => $status, 'mapping' => self::$disallowed_STD3_mapped[$codePoint]]; } return ['status' => $status]; } return ['status' => 'valid']; } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/bootstrap.php000064400000011411147600374260023407 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn as p; if (\extension_loaded('intl')) { return; } if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\defined('U_IDNA_PROHIBITED_ERROR')) { \define('U_IDNA_PROHIBITED_ERROR', 66560); } if (!\defined('U_IDNA_ERROR_START')) { \define('U_IDNA_ERROR_START', 66560); } if (!\defined('U_IDNA_UNASSIGNED_ERROR')) { \define('U_IDNA_UNASSIGNED_ERROR', 66561); } if (!\defined('U_IDNA_CHECK_BIDI_ERROR')) { \define('U_IDNA_CHECK_BIDI_ERROR', 66562); } if (!\defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { \define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); } if (!\defined('U_IDNA_ACE_PREFIX_ERROR')) { \define('U_IDNA_ACE_PREFIX_ERROR', 66564); } if (!\defined('U_IDNA_VERIFICATION_ERROR')) { \define('U_IDNA_VERIFICATION_ERROR', 66565); } if (!\defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { \define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); } if (!\defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { \define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); } if (!\defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { \define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); } if (!\defined('U_IDNA_ERROR_LIMIT')) { \define('U_IDNA_ERROR_LIMIT', 66569); } if (!\defined('U_STRINGPREP_PROHIBITED_ERROR')) { \define('U_STRINGPREP_PROHIBITED_ERROR', 66560); } if (!\defined('U_STRINGPREP_UNASSIGNED_ERROR')) { \define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); } if (!\defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { \define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); } if (!\defined('IDNA_DEFAULT')) { \define('IDNA_DEFAULT', 0); } if (!\defined('IDNA_ALLOW_UNASSIGNED')) { \define('IDNA_ALLOW_UNASSIGNED', 1); } if (!\defined('IDNA_USE_STD3_RULES')) { \define('IDNA_USE_STD3_RULES', 2); } if (!\defined('IDNA_CHECK_BIDI')) { \define('IDNA_CHECK_BIDI', 4); } if (!\defined('IDNA_CHECK_CONTEXTJ')) { \define('IDNA_CHECK_CONTEXTJ', 8); } if (!\defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { \define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); } if (!\defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { \define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); } if (!\defined('INTL_IDNA_VARIANT_2003')) { \define('INTL_IDNA_VARIANT_2003', 0); } if (!\defined('INTL_IDNA_VARIANT_UTS46')) { \define('INTL_IDNA_VARIANT_UTS46', 1); } if (!\defined('IDNA_ERROR_EMPTY_LABEL')) { \define('IDNA_ERROR_EMPTY_LABEL', 1); } if (!\defined('IDNA_ERROR_LABEL_TOO_LONG')) { \define('IDNA_ERROR_LABEL_TOO_LONG', 2); } if (!\defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { \define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); } if (!\defined('IDNA_ERROR_LEADING_HYPHEN')) { \define('IDNA_ERROR_LEADING_HYPHEN', 8); } if (!\defined('IDNA_ERROR_TRAILING_HYPHEN')) { \define('IDNA_ERROR_TRAILING_HYPHEN', 16); } if (!\defined('IDNA_ERROR_HYPHEN_3_4')) { \define('IDNA_ERROR_HYPHEN_3_4', 32); } if (!\defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { \define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); } if (!\defined('IDNA_ERROR_DISALLOWED')) { \define('IDNA_ERROR_DISALLOWED', 128); } if (!\defined('IDNA_ERROR_PUNYCODE')) { \define('IDNA_ERROR_PUNYCODE', 256); } if (!\defined('IDNA_ERROR_LABEL_HAS_DOT')) { \define('IDNA_ERROR_LABEL_HAS_DOT', 512); } if (!\defined('IDNA_ERROR_INVALID_ACE_LABEL')) { \define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); } if (!\defined('IDNA_ERROR_BIDI')) { \define('IDNA_ERROR_BIDI', 2048); } if (!\defined('IDNA_ERROR_CONTEXTJ')) { \define('IDNA_ERROR_CONTEXTJ', 4096); } if (\PHP_VERSION_ID < 70400) { if (!\function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $flags = 0, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = null) { return p\Idn::idn_to_ascii($domain, $flags, $variant, $idna_info); } } if (!\function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $flags = 0, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = null) { return p\Idn::idn_to_utf8($domain, $flags, $variant, $idna_info); } } } else { if (!\function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $flags = 0, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = null) { return p\Idn::idn_to_ascii($domain, $flags, $variant, $idna_info); } } if (!\function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $flags = 0, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = null) { return p\Idn::idn_to_utf8($domain, $flags, $variant, $idna_info); } } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-idn/bootstrap80.php000064400000010067147600374260023565 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Idn as p; if (!\defined('U_IDNA_PROHIBITED_ERROR')) { \define('U_IDNA_PROHIBITED_ERROR', 66560); } if (!\defined('U_IDNA_ERROR_START')) { \define('U_IDNA_ERROR_START', 66560); } if (!\defined('U_IDNA_UNASSIGNED_ERROR')) { \define('U_IDNA_UNASSIGNED_ERROR', 66561); } if (!\defined('U_IDNA_CHECK_BIDI_ERROR')) { \define('U_IDNA_CHECK_BIDI_ERROR', 66562); } if (!\defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { \define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); } if (!\defined('U_IDNA_ACE_PREFIX_ERROR')) { \define('U_IDNA_ACE_PREFIX_ERROR', 66564); } if (!\defined('U_IDNA_VERIFICATION_ERROR')) { \define('U_IDNA_VERIFICATION_ERROR', 66565); } if (!\defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { \define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); } if (!\defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { \define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); } if (!\defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { \define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); } if (!\defined('U_IDNA_ERROR_LIMIT')) { \define('U_IDNA_ERROR_LIMIT', 66569); } if (!\defined('U_STRINGPREP_PROHIBITED_ERROR')) { \define('U_STRINGPREP_PROHIBITED_ERROR', 66560); } if (!\defined('U_STRINGPREP_UNASSIGNED_ERROR')) { \define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); } if (!\defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { \define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); } if (!\defined('IDNA_DEFAULT')) { \define('IDNA_DEFAULT', 0); } if (!\defined('IDNA_ALLOW_UNASSIGNED')) { \define('IDNA_ALLOW_UNASSIGNED', 1); } if (!\defined('IDNA_USE_STD3_RULES')) { \define('IDNA_USE_STD3_RULES', 2); } if (!\defined('IDNA_CHECK_BIDI')) { \define('IDNA_CHECK_BIDI', 4); } if (!\defined('IDNA_CHECK_CONTEXTJ')) { \define('IDNA_CHECK_CONTEXTJ', 8); } if (!\defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { \define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); } if (!\defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { \define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); } if (!\defined('INTL_IDNA_VARIANT_UTS46')) { \define('INTL_IDNA_VARIANT_UTS46', 1); } if (!\defined('IDNA_ERROR_EMPTY_LABEL')) { \define('IDNA_ERROR_EMPTY_LABEL', 1); } if (!\defined('IDNA_ERROR_LABEL_TOO_LONG')) { \define('IDNA_ERROR_LABEL_TOO_LONG', 2); } if (!\defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { \define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); } if (!\defined('IDNA_ERROR_LEADING_HYPHEN')) { \define('IDNA_ERROR_LEADING_HYPHEN', 8); } if (!\defined('IDNA_ERROR_TRAILING_HYPHEN')) { \define('IDNA_ERROR_TRAILING_HYPHEN', 16); } if (!\defined('IDNA_ERROR_HYPHEN_3_4')) { \define('IDNA_ERROR_HYPHEN_3_4', 32); } if (!\defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { \define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); } if (!\defined('IDNA_ERROR_DISALLOWED')) { \define('IDNA_ERROR_DISALLOWED', 128); } if (!\defined('IDNA_ERROR_PUNYCODE')) { \define('IDNA_ERROR_PUNYCODE', 256); } if (!\defined('IDNA_ERROR_LABEL_HAS_DOT')) { \define('IDNA_ERROR_LABEL_HAS_DOT', 512); } if (!\defined('IDNA_ERROR_INVALID_ACE_LABEL')) { \define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); } if (!\defined('IDNA_ERROR_BIDI')) { \define('IDNA_ERROR_BIDI', 2048); } if (!\defined('IDNA_ERROR_CONTEXTJ')) { \define('IDNA_ERROR_CONTEXTJ', 4096); } if (!\function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $flags = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = null) : string|false { return p\Idn::idn_to_ascii((string) $domain, (int) $flags, (int) $variant, $idna_info); } } if (!\function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $flags = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = null) : string|false { return p\Idn::idn_to_utf8((string) $domain, (int) $flags, (int) $variant, $idna_info); } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php000064400000001006147600374260030235 0ustar00 ' ', '¨' => ' ̈', 'ª' => 'a', '¯' => ' Ì„', '²' => '2', '³' => '3', '´' => ' Ì', 'µ' => 'μ', '¸' => ' ̧', '¹' => '1', 'º' => 'o', '¼' => '1â„4', '½' => '1â„2', '¾' => '3â„4', 'IJ' => 'IJ', 'ij' => 'ij', 'Ä¿' => 'L·', 'Å€' => 'l·', 'ʼn' => 'ʼn', 'Å¿' => 's', 'Ç„' => 'DZÌŒ', 'Ç…' => 'DzÌŒ', 'dž' => 'dzÌŒ', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'ÇŠ' => 'NJ', 'Ç‹' => 'Nj', 'ÇŒ' => 'nj', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'Ê°' => 'h', 'ʱ' => 'ɦ', 'ʲ' => 'j', 'ʳ' => 'r', 'Ê´' => 'ɹ', 'ʵ' => 'É»', 'ʶ' => 'Ê', 'Ê·' => 'w', 'ʸ' => 'y', '˘' => ' ̆', 'Ë™' => ' ̇', 'Ëš' => ' ÌŠ', 'Ë›' => ' ̨', 'Ëœ' => ' ̃', 'Ë' => ' Ì‹', 'Ë ' => 'É£', 'Ë¡' => 'l', 'Ë¢' => 's', 'Ë£' => 'x', 'ˤ' => 'Ê•', 'ͺ' => ' Í…', '΄' => ' Ì', 'Î…' => ' ̈Ì', 'Ï' => 'β', 'Ï‘' => 'θ', 'Ï’' => 'Î¥', 'Ï“' => 'Î¥Ì', 'Ï”' => 'Ϋ', 'Ï•' => 'φ', 'Ï–' => 'Ï€', 'Ï°' => 'κ', 'ϱ' => 'Ï', 'ϲ' => 'Ï‚', 'Ï´' => 'Θ', 'ϵ' => 'ε', 'Ϲ' => 'Σ', 'Ö‡' => 'Õ¥Ö‚', 'Ùµ' => 'اٴ', 'Ù¶' => 'وٴ', 'Ù·' => 'Û‡Ù´', 'Ù¸' => 'يٴ', 'ำ' => 'à¹à¸²', 'ຳ' => 'à»àº²', 'ໜ' => 'ຫນ', 'à»' => 'ຫມ', '༌' => '་', 'ཷ' => 'ྲཱྀ', 'ཹ' => 'ླཱྀ', 'ჼ' => 'ნ', 'á´¬' => 'A', 'á´­' => 'Æ', 'á´®' => 'B', 'á´°' => 'D', 'á´±' => 'E', 'á´²' => 'ÆŽ', 'á´³' => 'G', 'á´´' => 'H', 'á´µ' => 'I', 'á´¶' => 'J', 'á´·' => 'K', 'á´¸' => 'L', 'á´¹' => 'M', 'á´º' => 'N', 'á´¼' => 'O', 'á´½' => 'È¢', 'á´¾' => 'P', 'á´¿' => 'R', 'áµ€' => 'T', 'áµ' => 'U', 'ᵂ' => 'W', 'ᵃ' => 'a', 'ᵄ' => 'É', 'áµ…' => 'É‘', 'ᵆ' => 'á´‚', 'ᵇ' => 'b', 'ᵈ' => 'd', 'ᵉ' => 'e', 'ᵊ' => 'É™', 'ᵋ' => 'É›', 'ᵌ' => 'Éœ', 'áµ' => 'g', 'áµ' => 'k', 'áµ' => 'm', 'ᵑ' => 'Å‹', 'áµ’' => 'o', 'ᵓ' => 'É”', 'áµ”' => 'á´–', 'ᵕ' => 'á´—', 'áµ–' => 'p', 'áµ—' => 't', 'ᵘ' => 'u', 'áµ™' => 'á´', 'ᵚ' => 'ɯ', 'áµ›' => 'v', 'ᵜ' => 'á´¥', 'áµ' => 'β', 'ᵞ' => 'γ', 'ᵟ' => 'δ', 'áµ ' => 'φ', 'ᵡ' => 'χ', 'áµ¢' => 'i', 'áµ£' => 'r', 'ᵤ' => 'u', 'áµ¥' => 'v', 'ᵦ' => 'β', 'ᵧ' => 'γ', 'ᵨ' => 'Ï', 'ᵩ' => 'φ', 'ᵪ' => 'χ', 'ᵸ' => 'н', 'ᶛ' => 'É’', 'ᶜ' => 'c', 'á¶' => 'É•', 'ᶞ' => 'ð', 'ᶟ' => 'Éœ', 'ᶠ' => 'f', 'ᶡ' => 'ÉŸ', 'ᶢ' => 'É¡', 'ᶣ' => 'É¥', 'ᶤ' => 'ɨ', 'ᶥ' => 'É©', 'ᶦ' => 'ɪ', 'ᶧ' => 'áµ»', 'ᶨ' => 'Ê', 'ᶩ' => 'É­', 'ᶪ' => 'ᶅ', 'ᶫ' => 'ÊŸ', 'ᶬ' => 'ɱ', 'ᶭ' => 'É°', 'ᶮ' => 'ɲ', 'ᶯ' => 'ɳ', 'ᶰ' => 'É´', 'ᶱ' => 'ɵ', 'ᶲ' => 'ɸ', 'ᶳ' => 'Ê‚', 'ᶴ' => 'ʃ', 'ᶵ' => 'Æ«', 'ᶶ' => 'ʉ', 'ᶷ' => 'ÊŠ', 'ᶸ' => 'á´œ', 'ᶹ' => 'Ê‹', 'ᶺ' => 'ÊŒ', 'ᶻ' => 'z', 'ᶼ' => 'Ê', 'ᶽ' => 'Ê‘', 'ᶾ' => 'Ê’', 'ᶿ' => 'θ', 'ẚ' => 'aʾ', 'ẛ' => 'ṡ', 'á¾½' => ' Ì“', '᾿' => ' Ì“', 'á¿€' => ' Í‚', 'á¿' => ' ̈͂', 'á¿' => ' Ì“Ì€', 'á¿Ž' => ' Ì“Ì', 'á¿' => ' Ì“Í‚', 'á¿' => ' ̔̀', 'á¿ž' => ' Ì”Ì', 'á¿Ÿ' => ' ̔͂', 'á¿­' => ' ̈̀', 'á¿®' => ' ̈Ì', '´' => ' Ì', '῾' => ' Ì”', ' ' => ' ', 'â€' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '‑' => 'â€', '‗' => ' ̳', '․' => '.', '‥' => '..', '…' => '...', ' ' => ' ', '″' => '′′', '‴' => '′′′', '‶' => '‵‵', '‷' => '‵‵‵', '‼' => '!!', '‾' => ' Ì…', 'â‡' => '?:', 'âˆ' => '?!', 'â‰' => '!?', 'â—' => '′′′′', 'âŸ' => ' ', 'â°' => '0', 'â±' => 'i', 'â´' => '4', 'âµ' => '5', 'â¶' => '6', 'â·' => '7', 'â¸' => '8', 'â¹' => '9', 'âº' => '+', 'â»' => '−', 'â¼' => '=', 'â½' => '(', 'â¾' => ')', 'â¿' => 'n', 'â‚€' => '0', 'â‚' => '1', 'â‚‚' => '2', '₃' => '3', 'â‚„' => '4', 'â‚…' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', 'â‚Š' => '+', 'â‚‹' => '−', 'â‚Œ' => '=', 'â‚' => '(', 'â‚Ž' => ')', 'â‚' => 'a', 'â‚‘' => 'e', 'â‚’' => 'o', 'â‚“' => 'x', 'â‚”' => 'É™', 'â‚•' => 'h', 'â‚–' => 'k', 'â‚—' => 'l', 'ₘ' => 'm', 'â‚™' => 'n', 'â‚š' => 'p', 'â‚›' => 's', 'â‚œ' => 't', '₨' => 'Rs', 'â„€' => 'a/c', 'â„' => 'a/s', 'â„‚' => 'C', '℃' => '°C', 'â„…' => 'c/o', '℆' => 'c/u', 'ℇ' => 'Æ', '℉' => '°F', 'â„Š' => 'g', 'â„‹' => 'H', 'â„Œ' => 'H', 'â„' => 'H', 'â„Ž' => 'h', 'â„' => 'ħ', 'â„' => 'I', 'â„‘' => 'I', 'â„’' => 'L', 'â„“' => 'l', 'â„•' => 'N', 'â„–' => 'No', 'â„™' => 'P', 'â„š' => 'Q', 'â„›' => 'R', 'â„œ' => 'R', 'â„' => 'R', 'â„ ' => 'SM', 'â„¡' => 'TEL', 'â„¢' => 'TM', 'ℤ' => 'Z', 'ℨ' => 'Z', 'ℬ' => 'B', 'â„­' => 'C', 'ℯ' => 'e', 'â„°' => 'E', 'ℱ' => 'F', 'ℳ' => 'M', 'â„´' => 'o', 'ℵ' => '×', 'ℶ' => 'ב', 'â„·' => '×’', 'ℸ' => 'ד', 'ℹ' => 'i', 'â„»' => 'FAX', 'ℼ' => 'Ï€', 'ℽ' => 'γ', 'ℾ' => 'Γ', 'â„¿' => 'Π', 'â…€' => '∑', 'â……' => 'D', 'â…†' => 'd', 'â…‡' => 'e', 'â…ˆ' => 'i', 'â…‰' => 'j', 'â…' => '1â„7', 'â…‘' => '1â„9', 'â…’' => '1â„10', 'â…“' => '1â„3', 'â…”' => '2â„3', 'â…•' => '1â„5', 'â…–' => '2â„5', 'â…—' => '3â„5', 'â…˜' => '4â„5', 'â…™' => '1â„6', 'â…š' => '5â„6', 'â…›' => '1â„8', 'â…œ' => '3â„8', 'â…' => '5â„8', 'â…ž' => '7â„8', 'â…Ÿ' => '1â„', 'â… ' => 'I', 'â…¡' => 'II', 'â…¢' => 'III', 'â…£' => 'IV', 'â…¤' => 'V', 'â…¥' => 'VI', 'â…¦' => 'VII', 'â…§' => 'VIII', 'â…¨' => 'IX', 'â…©' => 'X', 'â…ª' => 'XI', 'â…«' => 'XII', 'â…¬' => 'L', 'â…­' => 'C', 'â…®' => 'D', 'â…¯' => 'M', 'â…°' => 'i', 'â…±' => 'ii', 'â…²' => 'iii', 'â…³' => 'iv', 'â…´' => 'v', 'â…µ' => 'vi', 'â…¶' => 'vii', 'â…·' => 'viii', 'â…¸' => 'ix', 'â…¹' => 'x', 'â…º' => 'xi', 'â…»' => 'xii', 'â…¼' => 'l', 'â…½' => 'c', 'â…¾' => 'd', 'â…¿' => 'm', '↉' => '0â„3', '∬' => '∫∫', '∭' => '∫∫∫', '∯' => '∮∮', '∰' => '∮∮∮', 'â‘ ' => '1', 'â‘¡' => '2', 'â‘¢' => '3', 'â‘£' => '4', '⑤' => '5', 'â‘¥' => '6', '⑦' => '7', '⑧' => '8', '⑨' => '9', 'â‘©' => '10', '⑪' => '11', 'â‘«' => '12', '⑬' => '13', 'â‘­' => '14', 'â‘®' => '15', '⑯' => '16', 'â‘°' => '17', '⑱' => '18', '⑲' => '19', '⑳' => '20', 'â‘´' => '(1)', '⑵' => '(2)', '⑶' => '(3)', 'â‘·' => '(4)', '⑸' => '(5)', '⑹' => '(6)', '⑺' => '(7)', 'â‘»' => '(8)', '⑼' => '(9)', '⑽' => '(10)', '⑾' => '(11)', 'â‘¿' => '(12)', 'â’€' => '(13)', 'â’' => '(14)', 'â’‚' => '(15)', 'â’ƒ' => '(16)', 'â’„' => '(17)', 'â’…' => '(18)', 'â’†' => '(19)', 'â’‡' => '(20)', 'â’ˆ' => '1.', 'â’‰' => '2.', 'â’Š' => '3.', 'â’‹' => '4.', 'â’Œ' => '5.', 'â’' => '6.', 'â’Ž' => '7.', 'â’' => '8.', 'â’' => '9.', 'â’‘' => '10.', 'â’’' => '11.', 'â’“' => '12.', 'â’”' => '13.', 'â’•' => '14.', 'â’–' => '15.', 'â’—' => '16.', 'â’˜' => '17.', 'â’™' => '18.', 'â’š' => '19.', 'â’›' => '20.', 'â’œ' => '(a)', 'â’' => '(b)', 'â’ž' => '(c)', 'â’Ÿ' => '(d)', 'â’ ' => '(e)', 'â’¡' => '(f)', 'â’¢' => '(g)', 'â’£' => '(h)', 'â’¤' => '(i)', 'â’¥' => '(j)', 'â’¦' => '(k)', 'â’§' => '(l)', 'â’¨' => '(m)', 'â’©' => '(n)', 'â’ª' => '(o)', 'â’«' => '(p)', 'â’¬' => '(q)', 'â’­' => '(r)', 'â’®' => '(s)', 'â’¯' => '(t)', 'â’°' => '(u)', 'â’±' => '(v)', 'â’²' => '(w)', 'â’³' => '(x)', 'â’´' => '(y)', 'â’µ' => '(z)', 'â’¶' => 'A', 'â’·' => 'B', 'â’¸' => 'C', 'â’¹' => 'D', 'â’º' => 'E', 'â’»' => 'F', 'â’¼' => 'G', 'â’½' => 'H', 'â’¾' => 'I', 'â’¿' => 'J', 'â“€' => 'K', 'â“' => 'L', 'â“‚' => 'M', 'Ⓝ' => 'N', 'â“„' => 'O', 'â“…' => 'P', 'Ⓠ' => 'Q', 'Ⓡ' => 'R', 'Ⓢ' => 'S', 'Ⓣ' => 'T', 'â“Š' => 'U', 'â“‹' => 'V', 'â“Œ' => 'W', 'â“' => 'X', 'â“Ž' => 'Y', 'â“' => 'Z', 'â“' => 'a', 'â“‘' => 'b', 'â“’' => 'c', 'â““' => 'd', 'â“”' => 'e', 'â“•' => 'f', 'â“–' => 'g', 'â“—' => 'h', 'ⓘ' => 'i', 'â“™' => 'j', 'â“š' => 'k', 'â“›' => 'l', 'â“œ' => 'm', 'â“' => 'n', 'â“ž' => 'o', 'â“Ÿ' => 'p', 'â“ ' => 'q', 'â“¡' => 'r', 'â“¢' => 's', 'â“£' => 't', 'ⓤ' => 'u', 'â“¥' => 'v', 'ⓦ' => 'w', 'ⓧ' => 'x', 'ⓨ' => 'y', 'â“©' => 'z', '⓪' => '0', '⨌' => '∫∫∫∫', 'â©´' => '::=', '⩵' => '==', '⩶' => '===', 'â±¼' => 'j', 'â±½' => 'V', 'ⵯ' => 'ⵡ', '⺟' => 'æ¯', '⻳' => '龟', 'â¼€' => '一', 'â¼' => '丨', '⼂' => '丶', '⼃' => '丿', '⼄' => 'ä¹™', 'â¼…' => '亅', '⼆' => '二', '⼇' => '亠', '⼈' => '人', '⼉' => 'å„¿', '⼊' => 'å…¥', '⼋' => 'å…«', '⼌' => '冂', 'â¼' => '冖', '⼎' => '冫', 'â¼' => '几', 'â¼' => '凵', '⼑' => '刀', 'â¼’' => '力', '⼓' => '勹', 'â¼”' => '匕', '⼕' => '匚', 'â¼–' => '匸', 'â¼—' => 'å', '⼘' => 'åœ', 'â¼™' => 'å©', '⼚' => '厂', 'â¼›' => '厶', '⼜' => 'åˆ', 'â¼' => 'å£', '⼞' => 'å›—', '⼟' => '土', 'â¼ ' => '士', '⼡' => '夂', 'â¼¢' => '夊', 'â¼£' => '夕', '⼤' => '大', 'â¼¥' => '女', '⼦' => 'å­', '⼧' => '宀', '⼨' => '寸', '⼩' => 'å°', '⼪' => 'å°¢', '⼫' => 'å°¸', '⼬' => 'å±®', 'â¼­' => 'å±±', 'â¼®' => 'å·›', '⼯' => 'å·¥', 'â¼°' => 'å·±', 'â¼±' => 'å·¾', 'â¼²' => 'å¹²', 'â¼³' => '幺', 'â¼´' => '广', 'â¼µ' => 'å»´', '⼶' => '廾', 'â¼·' => '弋', '⼸' => '弓', 'â¼¹' => 'å½', '⼺' => '彡', 'â¼»' => 'å½³', 'â¼¼' => '心', 'â¼½' => '戈', 'â¼¾' => '戶', '⼿' => '手', 'â½€' => '支', 'â½' => 'æ”´', '⽂' => 'æ–‡', '⽃' => 'æ–—', '⽄' => 'æ–¤', 'â½…' => 'æ–¹', '⽆' => 'æ— ', '⽇' => 'æ—¥', '⽈' => 'æ›°', '⽉' => '月', '⽊' => '木', '⽋' => '欠', '⽌' => 'æ­¢', 'â½' => 'æ­¹', '⽎' => '殳', 'â½' => '毋', 'â½' => '比', '⽑' => '毛', 'â½’' => 'æ°', '⽓' => 'æ°”', 'â½”' => 'æ°´', '⽕' => 'ç«', 'â½–' => '爪', 'â½—' => '父', '⽘' => '爻', 'â½™' => '爿', '⽚' => '片', 'â½›' => '牙', '⽜' => '牛', 'â½' => '犬', '⽞' => '玄', '⽟' => '玉', 'â½ ' => 'ç“œ', '⽡' => '瓦', 'â½¢' => '甘', 'â½£' => '生', '⽤' => '用', 'â½¥' => 'ç”°', '⽦' => 'ç–‹', '⽧' => 'ç–’', '⽨' => '癶', '⽩' => '白', '⽪' => 'çš®', '⽫' => 'çš¿', '⽬' => 'ç›®', 'â½­' => '矛', 'â½®' => '矢', '⽯' => '石', 'â½°' => '示', 'â½±' => '禸', 'â½²' => '禾', 'â½³' => 'ç©´', 'â½´' => 'ç«‹', 'â½µ' => '竹', '⽶' => 'ç±³', 'â½·' => '糸', '⽸' => '缶', 'â½¹' => '网', '⽺' => '羊', 'â½»' => 'ç¾½', 'â½¼' => 'è€', 'â½½' => '而', 'â½¾' => '耒', '⽿' => '耳', 'â¾€' => 'è¿', 'â¾' => '肉', '⾂' => '臣', '⾃' => '自', '⾄' => '至', 'â¾…' => '臼', '⾆' => '舌', '⾇' => '舛', '⾈' => '舟', '⾉' => '艮', '⾊' => '色', '⾋' => '艸', '⾌' => 'è™', 'â¾' => '虫', '⾎' => 'è¡€', 'â¾' => 'è¡Œ', 'â¾' => 'è¡£', '⾑' => '襾', 'â¾’' => '見', '⾓' => '角', 'â¾”' => '言', '⾕' => 'è°·', 'â¾–' => '豆', 'â¾—' => '豕', '⾘' => '豸', 'â¾™' => 'è²', '⾚' => '赤', 'â¾›' => 'èµ°', '⾜' => '足', 'â¾' => '身', '⾞' => '車', '⾟' => 'è¾›', 'â¾ ' => 'è¾°', '⾡' => 'è¾µ', 'â¾¢' => 'é‚‘', 'â¾£' => 'é…‰', '⾤' => '釆', 'â¾¥' => '里', '⾦' => '金', '⾧' => 'é•·', '⾨' => 'é–€', '⾩' => '阜', '⾪' => '隶', '⾫' => 'éš¹', '⾬' => '雨', 'â¾­' => 'é‘', 'â¾®' => 'éž', '⾯' => 'é¢', 'â¾°' => 'é©', 'â¾±' => '韋', 'â¾²' => '韭', 'â¾³' => '音', 'â¾´' => 'é ', 'â¾µ' => '風', '⾶' => '飛', 'â¾·' => '食', '⾸' => '首', 'â¾¹' => '香', '⾺' => '馬', 'â¾»' => '骨', 'â¾¼' => '高', 'â¾½' => 'é«Ÿ', 'â¾¾' => '鬥', '⾿' => '鬯', 'â¿€' => '鬲', 'â¿' => '鬼', 'â¿‚' => 'é­š', '⿃' => 'é³¥', 'â¿„' => 'é¹µ', 'â¿…' => '鹿', '⿆' => '麥', '⿇' => '麻', '⿈' => '黃', '⿉' => 'é»', 'â¿Š' => '黑', 'â¿‹' => '黹', 'â¿Œ' => '黽', 'â¿' => '鼎', 'â¿Ž' => '鼓', 'â¿' => 'é¼ ', 'â¿' => 'é¼»', 'â¿‘' => '齊', 'â¿’' => 'é½’', 'â¿“' => 'é¾', 'â¿”' => '龜', 'â¿•' => 'é¾ ', ' ' => ' ', '〶' => '〒', '〸' => 'å', '〹' => 'å„', '〺' => 'å…', 'ã‚›' => ' ã‚™', 'ã‚œ' => ' ã‚š', 'ã‚Ÿ' => 'より', 'ヿ' => 'コト', 'ㄱ' => 'á„€', 'ㄲ' => 'á„', 'ㄳ' => 'ᆪ', 'ã„´' => 'á„‚', 'ㄵ' => 'ᆬ', 'ㄶ' => 'ᆭ', 'ã„·' => 'ᄃ', 'ㄸ' => 'á„„', 'ㄹ' => 'á„…', 'ㄺ' => 'ᆰ', 'ã„»' => 'ᆱ', 'ㄼ' => 'ᆲ', 'ㄽ' => 'ᆳ', 'ㄾ' => 'ᆴ', 'ã„¿' => 'ᆵ', 'ã…€' => 'á„š', 'ã…' => 'ᄆ', 'ã…‚' => 'ᄇ', 'ã…ƒ' => 'ᄈ', 'ã…„' => 'á„¡', 'ã……' => 'ᄉ', 'ã…†' => 'á„Š', 'ã…‡' => 'á„‹', 'ã…ˆ' => 'á„Œ', 'ã…‰' => 'á„', 'ã…Š' => 'á„Ž', 'ã…‹' => 'á„', 'ã…Œ' => 'á„', 'ã…' => 'á„‘', 'ã…Ž' => 'á„’', 'ã…' => 'á…¡', 'ã…' => 'á…¢', 'ã…‘' => 'á…£', 'ã…’' => 'á…¤', 'ã…“' => 'á…¥', 'ã…”' => 'á…¦', 'ã…•' => 'á…§', 'ã…–' => 'á…¨', 'ã…—' => 'á…©', 'ã…˜' => 'á…ª', 'ã…™' => 'á…«', 'ã…š' => 'á…¬', 'ã…›' => 'á…­', 'ã…œ' => 'á…®', 'ã…' => 'á…¯', 'ã…ž' => 'á…°', 'ã…Ÿ' => 'á…±', 'ã… ' => 'á…²', 'ã…¡' => 'á…³', 'ã…¢' => 'á…´', 'ã…£' => 'á…µ', 'ã…¤' => 'á… ', 'ã…¥' => 'á„”', 'ã…¦' => 'á„•', 'ã…§' => 'ᇇ', 'ã…¨' => 'ᇈ', 'ã…©' => 'ᇌ', 'ã…ª' => 'ᇎ', 'ã…«' => 'ᇓ', 'ã…¬' => 'ᇗ', 'ã…­' => 'ᇙ', 'ã…®' => 'á„œ', 'ã…¯' => 'á‡', 'ã…°' => 'ᇟ', 'ã…±' => 'á„', 'ã…²' => 'á„ž', 'ã…³' => 'á„ ', 'ã…´' => 'á„¢', 'ã…µ' => 'á„£', 'ã…¶' => 'ᄧ', 'ã…·' => 'á„©', 'ã…¸' => 'á„«', 'ã…¹' => 'ᄬ', 'ã…º' => 'á„­', 'ã…»' => 'á„®', 'ã…¼' => 'ᄯ', 'ã…½' => 'ᄲ', 'ã…¾' => 'ᄶ', 'ã…¿' => 'á…€', 'ㆀ' => 'á…‡', 'ã†' => 'á…Œ', 'ㆂ' => 'ᇱ', 'ㆃ' => 'ᇲ', 'ㆄ' => 'á…—', 'ㆅ' => 'á…˜', 'ㆆ' => 'á…™', 'ㆇ' => 'ᆄ', 'ㆈ' => 'ᆅ', 'ㆉ' => 'ᆈ', 'ㆊ' => 'ᆑ', 'ㆋ' => 'ᆒ', 'ㆌ' => 'ᆔ', 'ã†' => 'ᆞ', 'ㆎ' => 'ᆡ', '㆒' => '一', '㆓' => '二', '㆔' => '三', '㆕' => 'å››', '㆖' => '上', '㆗' => '中', '㆘' => '下', '㆙' => '甲', '㆚' => 'ä¹™', '㆛' => '丙', '㆜' => 'ä¸', 'ã†' => '天', '㆞' => '地', '㆟' => '人', '㈀' => '(á„€)', 'ãˆ' => '(á„‚)', '㈂' => '(ᄃ)', '㈃' => '(á„…)', '㈄' => '(ᄆ)', '㈅' => '(ᄇ)', '㈆' => '(ᄉ)', '㈇' => '(á„‹)', '㈈' => '(á„Œ)', '㈉' => '(á„Ž)', '㈊' => '(á„)', '㈋' => '(á„)', '㈌' => '(á„‘)', 'ãˆ' => '(á„’)', '㈎' => '(가)', 'ãˆ' => '(á„‚á…¡)', 'ãˆ' => '(다)', '㈑' => '(á„…á…¡)', '㈒' => '(마)', '㈓' => '(바)', '㈔' => '(사)', '㈕' => '(á„‹á…¡)', '㈖' => '(자)', '㈗' => '(á„Žá…¡)', '㈘' => '(á„á…¡)', '㈙' => '(á„á…¡)', '㈚' => '(á„‘á…¡)', '㈛' => '(á„’á…¡)', '㈜' => '(주)', 'ãˆ' => '(오전)', '㈞' => '(á„‹á…©á„’á…®)', '㈠' => '(一)', '㈡' => '(二)', '㈢' => '(三)', '㈣' => '(å››)', '㈤' => '(五)', '㈥' => '(å…­)', '㈦' => '(七)', '㈧' => '(å…«)', '㈨' => '(ä¹)', '㈩' => '(å)', '㈪' => '(月)', '㈫' => '(ç«)', '㈬' => '(æ°´)', '㈭' => '(木)', '㈮' => '(金)', '㈯' => '(土)', '㈰' => '(æ—¥)', '㈱' => '(æ ª)', '㈲' => '(有)', '㈳' => '(社)', '㈴' => '(å)', '㈵' => '(特)', '㈶' => '(財)', '㈷' => '(ç¥)', '㈸' => '(労)', '㈹' => '(代)', '㈺' => '(呼)', '㈻' => '(å­¦)', '㈼' => '(監)', '㈽' => '(ä¼)', '㈾' => '(資)', '㈿' => '(å”)', '㉀' => '(祭)', 'ã‰' => '(休)', '㉂' => '(自)', '㉃' => '(至)', '㉄' => 'å•', '㉅' => 'å¹¼', '㉆' => 'æ–‡', '㉇' => 'ç®', 'ã‰' => 'PTE', '㉑' => '21', '㉒' => '22', '㉓' => '23', '㉔' => '24', '㉕' => '25', '㉖' => '26', '㉗' => '27', '㉘' => '28', '㉙' => '29', '㉚' => '30', '㉛' => '31', '㉜' => '32', 'ã‰' => '33', '㉞' => '34', '㉟' => '35', '㉠' => 'á„€', '㉡' => 'á„‚', '㉢' => 'ᄃ', '㉣' => 'á„…', '㉤' => 'ᄆ', '㉥' => 'ᄇ', '㉦' => 'ᄉ', '㉧' => 'á„‹', '㉨' => 'á„Œ', '㉩' => 'á„Ž', '㉪' => 'á„', '㉫' => 'á„', '㉬' => 'á„‘', '㉭' => 'á„’', '㉮' => '가', '㉯' => 'á„‚á…¡', '㉰' => '다', '㉱' => 'á„…á…¡', '㉲' => '마', '㉳' => '바', '㉴' => '사', '㉵' => 'á„‹á…¡', '㉶' => '자', '㉷' => 'á„Žá…¡', '㉸' => 'á„á…¡', '㉹' => 'á„á…¡', '㉺' => 'á„‘á…¡', '㉻' => 'á„’á…¡', '㉼' => '참고', '㉽' => '주의', '㉾' => 'á„‹á…®', '㊀' => '一', 'ãŠ' => '二', '㊂' => '三', '㊃' => 'å››', '㊄' => '五', '㊅' => 'å…­', '㊆' => '七', '㊇' => 'å…«', '㊈' => 'ä¹', '㊉' => 'å', '㊊' => '月', '㊋' => 'ç«', '㊌' => 'æ°´', 'ãŠ' => '木', '㊎' => '金', 'ãŠ' => '土', 'ãŠ' => 'æ—¥', '㊑' => 'æ ª', '㊒' => '有', '㊓' => '社', '㊔' => 'å', '㊕' => '特', '㊖' => '財', '㊗' => 'ç¥', '㊘' => '労', '㊙' => '秘', '㊚' => 'ç”·', '㊛' => '女', '㊜' => 'é©', 'ãŠ' => '優', '㊞' => 'å°', '㊟' => '注', '㊠' => 'é …', '㊡' => '休', '㊢' => '写', '㊣' => 'æ­£', '㊤' => '上', '㊥' => '中', '㊦' => '下', '㊧' => 'å·¦', '㊨' => 'å³', '㊩' => '医', '㊪' => 'å®—', '㊫' => 'å­¦', '㊬' => '監', '㊭' => 'ä¼', '㊮' => '資', '㊯' => 'å”', '㊰' => '夜', '㊱' => '36', '㊲' => '37', '㊳' => '38', '㊴' => '39', '㊵' => '40', '㊶' => '41', '㊷' => '42', '㊸' => '43', '㊹' => '44', '㊺' => '45', '㊻' => '46', '㊼' => '47', '㊽' => '48', '㊾' => '49', '㊿' => '50', 'ã‹€' => '1月', 'ã‹' => '2月', 'ã‹‚' => '3月', '㋃' => '4月', 'ã‹„' => '5月', 'ã‹…' => '6月', '㋆' => '7月', '㋇' => '8月', '㋈' => '9月', '㋉' => '10月', 'ã‹Š' => '11月', 'ã‹‹' => '12月', 'ã‹Œ' => 'Hg', 'ã‹' => 'erg', 'ã‹Ž' => 'eV', 'ã‹' => 'LTD', 'ã‹' => 'ã‚¢', 'ã‹‘' => 'イ', 'ã‹’' => 'ウ', 'ã‹“' => 'エ', 'ã‹”' => 'オ', 'ã‹•' => 'ã‚«', 'ã‹–' => 'ã‚­', 'ã‹—' => 'ク', '㋘' => 'ケ', 'ã‹™' => 'コ', 'ã‹š' => 'サ', 'ã‹›' => 'ã‚·', 'ã‹œ' => 'ス', 'ã‹' => 'ã‚»', 'ã‹ž' => 'ソ', 'ã‹Ÿ' => 'ã‚¿', 'ã‹ ' => 'ãƒ', 'ã‹¡' => 'ツ', 'ã‹¢' => 'テ', 'ã‹£' => 'ト', '㋤' => 'ナ', 'ã‹¥' => 'ニ', '㋦' => 'ヌ', '㋧' => 'ãƒ', '㋨' => 'ノ', 'ã‹©' => 'ãƒ', '㋪' => 'ヒ', 'ã‹«' => 'フ', '㋬' => 'ヘ', 'ã‹­' => 'ホ', 'ã‹®' => 'マ', '㋯' => 'ミ', 'ã‹°' => 'ム', '㋱' => 'メ', '㋲' => 'モ', '㋳' => 'ヤ', 'ã‹´' => 'ユ', '㋵' => 'ヨ', '㋶' => 'ラ', 'ã‹·' => 'リ', '㋸' => 'ル', '㋹' => 'レ', '㋺' => 'ロ', 'ã‹»' => 'ワ', '㋼' => 'ヰ', '㋽' => 'ヱ', '㋾' => 'ヲ', 'ã‹¿' => '令和', '㌀' => 'ã‚¢ãƒã‚šãƒ¼ãƒˆ', 'ãŒ' => 'アルファ', '㌂' => 'アンペア', '㌃' => 'アール', '㌄' => 'イニング', '㌅' => 'インãƒ', '㌆' => 'ウォン', '㌇' => 'エスクード', '㌈' => 'エーカー', '㌉' => 'オンス', '㌊' => 'オーム', '㌋' => 'カイリ', '㌌' => 'カラット', 'ãŒ' => 'カロリー', '㌎' => 'ガロン', 'ãŒ' => 'ガンマ', 'ãŒ' => 'ギガ', '㌑' => 'ギニー', '㌒' => 'キュリー', '㌓' => 'ギルダー', '㌔' => 'キロ', '㌕' => 'キログラム', '㌖' => 'キロメートル', '㌗' => 'キロワット', '㌘' => 'グラム', '㌙' => 'グラムトン', '㌚' => 'クルゼイロ', '㌛' => 'クローãƒ', '㌜' => 'ケース', 'ãŒ' => 'コルナ', '㌞' => 'コーポ', '㌟' => 'サイクル', '㌠' => 'サンãƒãƒ¼ãƒ ', '㌡' => 'シリング', '㌢' => 'センãƒ', '㌣' => 'セント', '㌤' => 'ダース', '㌥' => 'デシ', '㌦' => 'ドル', '㌧' => 'トン', '㌨' => 'ナノ', '㌩' => 'ノット', '㌪' => 'ãƒã‚¤ãƒ„', '㌫' => 'ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ', '㌬' => 'ãƒã‚šãƒ¼ãƒ„', '㌭' => 'ãƒã‚™ãƒ¼ãƒ¬ãƒ«', '㌮' => 'ピアストル', '㌯' => 'ピクル', '㌰' => 'ピコ', '㌱' => 'ビル', '㌲' => 'ファラッド', '㌳' => 'フィート', '㌴' => 'ブッシェル', '㌵' => 'フラン', '㌶' => 'ヘクタール', '㌷' => 'ペソ', '㌸' => 'ペニヒ', '㌹' => 'ヘルツ', '㌺' => 'ペンス', '㌻' => 'ページ', '㌼' => 'ベータ', '㌽' => 'ポイント', '㌾' => 'ボルト', '㌿' => 'ホン', 'ã€' => 'ポンド', 'ã' => 'ホール', 'ã‚' => 'ホーン', 'ãƒ' => 'マイクロ', 'ã„' => 'マイル', 'ã…' => 'マッãƒ', 'ã†' => 'マルク', 'ã‡' => 'マンション', 'ãˆ' => 'ミクロン', 'ã‰' => 'ミリ', 'ãŠ' => 'ミリãƒã‚™ãƒ¼ãƒ«', 'ã‹' => 'メガ', 'ãŒ' => 'メガトン', 'ã' => 'メートル', 'ãŽ' => 'ヤード', 'ã' => 'ヤール', 'ã' => 'ユアン', 'ã‘' => 'リットル', 'ã’' => 'リラ', 'ã“' => 'ルピー', 'ã”' => 'ルーブル', 'ã•' => 'レム', 'ã–' => 'レントゲン', 'ã—' => 'ワット', 'ã˜' => '0点', 'ã™' => '1点', 'ãš' => '2点', 'ã›' => '3点', 'ãœ' => '4点', 'ã' => '5点', 'ãž' => '6点', 'ãŸ' => '7点', 'ã ' => '8点', 'ã¡' => '9点', 'ã¢' => '10点', 'ã£' => '11点', 'ã¤' => '12点', 'ã¥' => '13点', 'ã¦' => '14点', 'ã§' => '15点', 'ã¨' => '16点', 'ã©' => '17点', 'ãª' => '18点', 'ã«' => '19点', 'ã¬' => '20点', 'ã­' => '21点', 'ã®' => '22点', 'ã¯' => '23点', 'ã°' => '24点', 'ã±' => 'hPa', 'ã²' => 'da', 'ã³' => 'AU', 'ã´' => 'bar', 'ãµ' => 'oV', 'ã¶' => 'pc', 'ã·' => 'dm', 'ã¸' => 'dm2', 'ã¹' => 'dm3', 'ãº' => 'IU', 'ã»' => 'å¹³æˆ', 'ã¼' => '昭和', 'ã½' => '大正', 'ã¾' => '明治', 'ã¿' => 'æ ªå¼ä¼šç¤¾', '㎀' => 'pA', 'ãŽ' => 'nA', '㎂' => 'μA', '㎃' => 'mA', '㎄' => 'kA', '㎅' => 'KB', '㎆' => 'MB', '㎇' => 'GB', '㎈' => 'cal', '㎉' => 'kcal', '㎊' => 'pF', '㎋' => 'nF', '㎌' => 'μF', 'ãŽ' => 'μg', '㎎' => 'mg', 'ãŽ' => 'kg', 'ãŽ' => 'Hz', '㎑' => 'kHz', '㎒' => 'MHz', '㎓' => 'GHz', '㎔' => 'THz', '㎕' => 'μl', '㎖' => 'ml', '㎗' => 'dl', '㎘' => 'kl', '㎙' => 'fm', '㎚' => 'nm', '㎛' => 'μm', '㎜' => 'mm', 'ãŽ' => 'cm', '㎞' => 'km', '㎟' => 'mm2', '㎠' => 'cm2', '㎡' => 'm2', '㎢' => 'km2', '㎣' => 'mm3', '㎤' => 'cm3', '㎥' => 'm3', '㎦' => 'km3', '㎧' => 'm∕s', '㎨' => 'm∕s2', '㎩' => 'Pa', '㎪' => 'kPa', '㎫' => 'MPa', '㎬' => 'GPa', '㎭' => 'rad', '㎮' => 'rad∕s', '㎯' => 'rad∕s2', '㎰' => 'ps', '㎱' => 'ns', '㎲' => 'μs', '㎳' => 'ms', '㎴' => 'pV', '㎵' => 'nV', '㎶' => 'μV', '㎷' => 'mV', '㎸' => 'kV', '㎹' => 'MV', '㎺' => 'pW', '㎻' => 'nW', '㎼' => 'μW', '㎽' => 'mW', '㎾' => 'kW', '㎿' => 'MW', 'ã€' => 'kΩ', 'ã' => 'MΩ', 'ã‚' => 'a.m.', 'ãƒ' => 'Bq', 'ã„' => 'cc', 'ã…' => 'cd', 'ã†' => 'C∕kg', 'ã‡' => 'Co.', 'ãˆ' => 'dB', 'ã‰' => 'Gy', 'ãŠ' => 'ha', 'ã‹' => 'HP', 'ãŒ' => 'in', 'ã' => 'KK', 'ãŽ' => 'KM', 'ã' => 'kt', 'ã' => 'lm', 'ã‘' => 'ln', 'ã’' => 'log', 'ã“' => 'lx', 'ã”' => 'mb', 'ã•' => 'mil', 'ã–' => 'mol', 'ã—' => 'PH', 'ã˜' => 'p.m.', 'ã™' => 'PPM', 'ãš' => 'PR', 'ã›' => 'sr', 'ãœ' => 'Sv', 'ã' => 'Wb', 'ãž' => 'V∕m', 'ãŸ' => 'A∕m', 'ã ' => '1æ—¥', 'ã¡' => '2æ—¥', 'ã¢' => '3æ—¥', 'ã£' => '4æ—¥', 'ã¤' => '5æ—¥', 'ã¥' => '6æ—¥', 'ã¦' => '7æ—¥', 'ã§' => '8æ—¥', 'ã¨' => '9æ—¥', 'ã©' => '10æ—¥', 'ãª' => '11æ—¥', 'ã«' => '12æ—¥', 'ã¬' => '13æ—¥', 'ã­' => '14æ—¥', 'ã®' => '15æ—¥', 'ã¯' => '16æ—¥', 'ã°' => '17æ—¥', 'ã±' => '18æ—¥', 'ã²' => '19æ—¥', 'ã³' => '20æ—¥', 'ã´' => '21æ—¥', 'ãµ' => '22æ—¥', 'ã¶' => '23æ—¥', 'ã·' => '24æ—¥', 'ã¸' => '25æ—¥', 'ã¹' => '26æ—¥', 'ãº' => '27æ—¥', 'ã»' => '28æ—¥', 'ã¼' => '29æ—¥', 'ã½' => '30æ—¥', 'ã¾' => '31æ—¥', 'ã¿' => 'gal', 'êšœ' => 'ÑŠ', 'êš' => 'ÑŒ', 'ê°' => 'ê¯', 'ꟸ' => 'Ħ', 'ꟹ' => 'Å“', 'ê­œ' => 'ꜧ', 'ê­' => 'ꬷ', 'ê­ž' => 'É«', 'ê­Ÿ' => 'ê­’', 'ê­©' => 'Ê', 'ff' => 'ff', 'ï¬' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'Õ´Õ¶', 'ﬔ' => 'Õ´Õ¥', 'ﬕ' => 'Õ´Õ«', 'ﬖ' => 'Õ¾Õ¶', 'ﬗ' => 'Õ´Õ­', 'ﬠ' => '×¢', 'ﬡ' => '×', 'ﬢ' => 'ד', 'ﬣ' => '×”', 'ﬤ' => '×›', 'ﬥ' => 'ל', 'ﬦ' => '×', 'ﬧ' => 'ר', 'ﬨ' => 'ת', '﬩' => '+', 'ï­' => '×ל', 'ï­' => 'Ù±', 'ï­‘' => 'Ù±', 'ï­’' => 'Ù»', 'ï­“' => 'Ù»', 'ï­”' => 'Ù»', 'ï­•' => 'Ù»', 'ï­–' => 'Ù¾', 'ï­—' => 'Ù¾', 'ï­˜' => 'Ù¾', 'ï­™' => 'Ù¾', 'ï­š' => 'Ú€', 'ï­›' => 'Ú€', 'ï­œ' => 'Ú€', 'ï­' => 'Ú€', 'ï­ž' => 'Ùº', 'ï­Ÿ' => 'Ùº', 'ï­ ' => 'Ùº', 'ï­¡' => 'Ùº', 'ï­¢' => 'Ù¿', 'ï­£' => 'Ù¿', 'ï­¤' => 'Ù¿', 'ï­¥' => 'Ù¿', 'ï­¦' => 'Ù¹', 'ï­§' => 'Ù¹', 'ï­¨' => 'Ù¹', 'ï­©' => 'Ù¹', 'ï­ª' => 'Ú¤', 'ï­«' => 'Ú¤', 'ï­¬' => 'Ú¤', 'ï­­' => 'Ú¤', 'ï­®' => 'Ú¦', 'ï­¯' => 'Ú¦', 'ï­°' => 'Ú¦', 'ï­±' => 'Ú¦', 'ï­²' => 'Ú„', 'ï­³' => 'Ú„', 'ï­´' => 'Ú„', 'ï­µ' => 'Ú„', 'ï­¶' => 'Úƒ', 'ï­·' => 'Úƒ', 'ï­¸' => 'Úƒ', 'ï­¹' => 'Úƒ', 'ï­º' => 'Ú†', 'ï­»' => 'Ú†', 'ï­¼' => 'Ú†', 'ï­½' => 'Ú†', 'ï­¾' => 'Ú‡', 'ï­¿' => 'Ú‡', 'ﮀ' => 'Ú‡', 'ï®' => 'Ú‡', 'ﮂ' => 'Ú', 'ﮃ' => 'Ú', 'ﮄ' => 'ÚŒ', 'ï®…' => 'ÚŒ', 'ﮆ' => 'ÚŽ', 'ﮇ' => 'ÚŽ', 'ﮈ' => 'Úˆ', 'ﮉ' => 'Úˆ', 'ﮊ' => 'Ú˜', 'ﮋ' => 'Ú˜', 'ﮌ' => 'Ú‘', 'ï®' => 'Ú‘', 'ﮎ' => 'Ú©', 'ï®' => 'Ú©', 'ï®' => 'Ú©', 'ﮑ' => 'Ú©', 'ï®’' => 'Ú¯', 'ﮓ' => 'Ú¯', 'ï®”' => 'Ú¯', 'ﮕ' => 'Ú¯', 'ï®–' => 'Ú³', 'ï®—' => 'Ú³', 'ﮘ' => 'Ú³', 'ï®™' => 'Ú³', 'ﮚ' => 'Ú±', 'ï®›' => 'Ú±', 'ﮜ' => 'Ú±', 'ï®' => 'Ú±', 'ﮞ' => 'Úº', 'ﮟ' => 'Úº', 'ï® ' => 'Ú»', 'ﮡ' => 'Ú»', 'ﮢ' => 'Ú»', 'ﮣ' => 'Ú»', 'ﮤ' => 'Û•Ù”', 'ﮥ' => 'Û•Ù”', 'ﮦ' => 'Û', 'ﮧ' => 'Û', 'ﮨ' => 'Û', 'ﮩ' => 'Û', 'ﮪ' => 'Ú¾', 'ﮫ' => 'Ú¾', 'ﮬ' => 'Ú¾', 'ï®­' => 'Ú¾', 'ï®®' => 'Û’', 'ﮯ' => 'Û’', 'ï®°' => 'Û’Ù”', 'ï®±' => 'Û’Ù”', 'ﯓ' => 'Ú­', 'ﯔ' => 'Ú­', 'ﯕ' => 'Ú­', 'ﯖ' => 'Ú­', 'ﯗ' => 'Û‡', 'ﯘ' => 'Û‡', 'ﯙ' => 'Û†', 'ﯚ' => 'Û†', 'ﯛ' => 'Ûˆ', 'ﯜ' => 'Ûˆ', 'ï¯' => 'Û‡Ù´', 'ﯞ' => 'Û‹', 'ﯟ' => 'Û‹', 'ﯠ' => 'Û…', 'ﯡ' => 'Û…', 'ﯢ' => 'Û‰', 'ﯣ' => 'Û‰', 'ﯤ' => 'Û', 'ﯥ' => 'Û', 'ﯦ' => 'Û', 'ﯧ' => 'Û', 'ﯨ' => 'Ù‰', 'ﯩ' => 'Ù‰', 'ﯪ' => 'ئا', 'ﯫ' => 'ئا', 'ﯬ' => 'ÙŠÙ”Û•', 'ﯭ' => 'ÙŠÙ”Û•', 'ﯮ' => 'ÙŠÙ”Ùˆ', 'ﯯ' => 'ÙŠÙ”Ùˆ', 'ﯰ' => 'ÙŠÙ”Û‡', 'ﯱ' => 'ÙŠÙ”Û‡', 'ﯲ' => 'ÙŠÙ”Û†', 'ﯳ' => 'ÙŠÙ”Û†', 'ﯴ' => 'ÙŠÙ”Ûˆ', 'ﯵ' => 'ÙŠÙ”Ûˆ', 'ﯶ' => 'ÙŠÙ”Û', 'ﯷ' => 'ÙŠÙ”Û', 'ﯸ' => 'ÙŠÙ”Û', 'ﯹ' => 'ÙŠÙ”Ù‰', 'ﯺ' => 'ÙŠÙ”Ù‰', 'ﯻ' => 'ÙŠÙ”Ù‰', 'ﯼ' => 'ÛŒ', 'ﯽ' => 'ÛŒ', 'ﯾ' => 'ÛŒ', 'ﯿ' => 'ÛŒ', 'ï°€' => 'ئج', 'ï°' => 'ئح', 'ï°‚' => 'ÙŠÙ”Ù…', 'ï°ƒ' => 'ÙŠÙ”Ù‰', 'ï°„' => 'ÙŠÙ”ÙŠ', 'ï°…' => 'بج', 'ï°†' => 'بح', 'ï°‡' => 'بخ', 'ï°ˆ' => 'بم', 'ï°‰' => 'بى', 'ï°Š' => 'بي', 'ï°‹' => 'تج', 'ï°Œ' => 'تح', 'ï°' => 'تخ', 'ï°Ž' => 'تم', 'ï°' => 'تى', 'ï°' => 'تي', 'ï°‘' => 'ثج', 'ï°’' => 'ثم', 'ï°“' => 'ثى', 'ï°”' => 'ثي', 'ï°•' => 'جح', 'ï°–' => 'جم', 'ï°—' => 'حج', 'ï°˜' => 'حم', 'ï°™' => 'خج', 'ï°š' => 'خح', 'ï°›' => 'خم', 'ï°œ' => 'سج', 'ï°' => 'سح', 'ï°ž' => 'سخ', 'ï°Ÿ' => 'سم', 'ï° ' => 'صح', 'ï°¡' => 'صم', 'ï°¢' => 'ضج', 'ï°£' => 'ضح', 'ï°¤' => 'ضخ', 'ï°¥' => 'ضم', 'ï°¦' => 'طح', 'ï°§' => 'طم', 'ï°¨' => 'ظم', 'ï°©' => 'عج', 'ï°ª' => 'عم', 'ï°«' => 'غج', 'ï°¬' => 'غم', 'ï°­' => 'Ùج', 'ï°®' => 'ÙØ­', 'ï°¯' => 'ÙØ®', 'ï°°' => 'ÙÙ…', 'ï°±' => 'ÙÙ‰', 'ï°²' => 'ÙÙŠ', 'ï°³' => 'قح', 'ï°´' => 'قم', 'ï°µ' => 'قى', 'ï°¶' => 'قي', 'ï°·' => 'كا', 'ï°¸' => 'كج', 'ï°¹' => 'كح', 'ï°º' => 'كخ', 'ï°»' => 'كل', 'ï°¼' => 'كم', 'ï°½' => 'كى', 'ï°¾' => 'كي', 'ï°¿' => 'لج', 'ï±€' => 'لح', 'ï±' => 'لخ', 'ﱂ' => 'لم', 'ﱃ' => 'لى', 'ﱄ' => 'لي', 'ï±…' => 'مج', 'ﱆ' => 'مح', 'ﱇ' => 'مخ', 'ﱈ' => 'مم', 'ﱉ' => 'مى', 'ﱊ' => 'مي', 'ﱋ' => 'نج', 'ﱌ' => 'نح', 'ï±' => 'نخ', 'ﱎ' => 'نم', 'ï±' => 'نى', 'ï±' => 'ني', 'ﱑ' => 'هج', 'ï±’' => 'هم', 'ﱓ' => 'هى', 'ï±”' => 'هي', 'ﱕ' => 'يج', 'ï±–' => 'يح', 'ï±—' => 'يخ', 'ﱘ' => 'يم', 'ï±™' => 'يى', 'ﱚ' => 'يي', 'ï±›' => 'ذٰ', 'ﱜ' => 'رٰ', 'ï±' => 'ىٰ', 'ﱞ' => ' ٌّ', 'ﱟ' => ' ÙÙ‘', 'ï± ' => ' ÙŽÙ‘', 'ﱡ' => ' ÙÙ‘', 'ï±¢' => ' ÙÙ‘', 'ï±£' => ' ّٰ', 'ﱤ' => 'ئر', 'ï±¥' => 'ئز', 'ﱦ' => 'ÙŠÙ”Ù…', 'ﱧ' => 'ÙŠÙ”Ù†', 'ﱨ' => 'ÙŠÙ”Ù‰', 'ﱩ' => 'ÙŠÙ”ÙŠ', 'ﱪ' => 'بر', 'ﱫ' => 'بز', 'ﱬ' => 'بم', 'ï±­' => 'بن', 'ï±®' => 'بى', 'ﱯ' => 'بي', 'ï±°' => 'تر', 'ï±±' => 'تز', 'ï±²' => 'تم', 'ï±³' => 'تن', 'ï±´' => 'تى', 'ï±µ' => 'تي', 'ﱶ' => 'ثر', 'ï±·' => 'ثز', 'ﱸ' => 'ثم', 'ï±¹' => 'ثن', 'ﱺ' => 'ثى', 'ï±»' => 'ثي', 'ï±¼' => 'ÙÙ‰', 'ï±½' => 'ÙÙŠ', 'ï±¾' => 'قى', 'ﱿ' => 'قي', 'ï²€' => 'كا', 'ï²' => 'كل', 'ﲂ' => 'كم', 'ﲃ' => 'كى', 'ﲄ' => 'كي', 'ï²…' => 'لم', 'ﲆ' => 'لى', 'ﲇ' => 'لي', 'ﲈ' => 'ما', 'ﲉ' => 'مم', 'ﲊ' => 'نر', 'ﲋ' => 'نز', 'ﲌ' => 'نم', 'ï²' => 'نن', 'ﲎ' => 'نى', 'ï²' => 'ني', 'ï²' => 'ىٰ', 'ﲑ' => 'ير', 'ï²’' => 'يز', 'ﲓ' => 'يم', 'ï²”' => 'ين', 'ﲕ' => 'يى', 'ï²–' => 'يي', 'ï²—' => 'ئج', 'ﲘ' => 'ئح', 'ï²™' => 'ئخ', 'ﲚ' => 'ÙŠÙ”Ù…', 'ï²›' => 'ÙŠÙ”Ù‡', 'ﲜ' => 'بج', 'ï²' => 'بح', 'ﲞ' => 'بخ', 'ﲟ' => 'بم', 'ï² ' => 'به', 'ﲡ' => 'تج', 'ï²¢' => 'تح', 'ï²£' => 'تخ', 'ﲤ' => 'تم', 'ï²¥' => 'ته', 'ﲦ' => 'ثم', 'ﲧ' => 'جح', 'ﲨ' => 'جم', 'ﲩ' => 'حج', 'ﲪ' => 'حم', 'ﲫ' => 'خج', 'ﲬ' => 'خم', 'ï²­' => 'سج', 'ï²®' => 'سح', 'ﲯ' => 'سخ', 'ï²°' => 'سم', 'ï²±' => 'صح', 'ï²²' => 'صخ', 'ï²³' => 'صم', 'ï²´' => 'ضج', 'ï²µ' => 'ضح', 'ﲶ' => 'ضخ', 'ï²·' => 'ضم', 'ﲸ' => 'طح', 'ï²¹' => 'ظم', 'ﲺ' => 'عج', 'ï²»' => 'عم', 'ï²¼' => 'غج', 'ï²½' => 'غم', 'ï²¾' => 'Ùج', 'ﲿ' => 'ÙØ­', 'ï³€' => 'ÙØ®', 'ï³' => 'ÙÙ…', 'ﳂ' => 'قح', 'ﳃ' => 'قم', 'ﳄ' => 'كج', 'ï³…' => 'كح', 'ﳆ' => 'كخ', 'ﳇ' => 'كل', 'ﳈ' => 'كم', 'ﳉ' => 'لج', 'ﳊ' => 'لح', 'ﳋ' => 'لخ', 'ﳌ' => 'لم', 'ï³' => 'له', 'ﳎ' => 'مج', 'ï³' => 'مح', 'ï³' => 'مخ', 'ﳑ' => 'مم', 'ï³’' => 'نج', 'ﳓ' => 'نح', 'ï³”' => 'نخ', 'ﳕ' => 'نم', 'ï³–' => 'نه', 'ï³—' => 'هج', 'ﳘ' => 'هم', 'ï³™' => 'هٰ', 'ﳚ' => 'يج', 'ï³›' => 'يح', 'ﳜ' => 'يخ', 'ï³' => 'يم', 'ﳞ' => 'يه', 'ﳟ' => 'ÙŠÙ”Ù…', 'ï³ ' => 'ÙŠÙ”Ù‡', 'ﳡ' => 'بم', 'ï³¢' => 'به', 'ï³£' => 'تم', 'ﳤ' => 'ته', 'ï³¥' => 'ثم', 'ﳦ' => 'ثه', 'ﳧ' => 'سم', 'ﳨ' => 'سه', 'ﳩ' => 'شم', 'ﳪ' => 'شه', 'ﳫ' => 'كل', 'ﳬ' => 'كم', 'ï³­' => 'لم', 'ï³®' => 'نم', 'ﳯ' => 'نه', 'ï³°' => 'يم', 'ï³±' => 'يه', 'ï³²' => 'Ù€ÙŽÙ‘', 'ï³³' => 'Ù€ÙÙ‘', 'ï³´' => 'Ù€ÙÙ‘', 'ï³µ' => 'طى', 'ﳶ' => 'طي', 'ï³·' => 'عى', 'ﳸ' => 'عي', 'ï³¹' => 'غى', 'ﳺ' => 'غي', 'ï³»' => 'سى', 'ï³¼' => 'سي', 'ï³½' => 'شى', 'ï³¾' => 'شي', 'ﳿ' => 'حى', 'ï´€' => 'حي', 'ï´' => 'جى', 'ï´‚' => 'جي', 'ï´ƒ' => 'خى', 'ï´„' => 'خي', 'ï´…' => 'صى', 'ï´†' => 'صي', 'ï´‡' => 'ضى', 'ï´ˆ' => 'ضي', 'ï´‰' => 'شج', 'ï´Š' => 'شح', 'ï´‹' => 'شخ', 'ï´Œ' => 'شم', 'ï´' => 'شر', 'ï´Ž' => 'سر', 'ï´' => 'صر', 'ï´' => 'ضر', 'ï´‘' => 'طى', 'ï´’' => 'طي', 'ï´“' => 'عى', 'ï´”' => 'عي', 'ï´•' => 'غى', 'ï´–' => 'غي', 'ï´—' => 'سى', 'ï´˜' => 'سي', 'ï´™' => 'شى', 'ï´š' => 'شي', 'ï´›' => 'حى', 'ï´œ' => 'حي', 'ï´' => 'جى', 'ï´ž' => 'جي', 'ï´Ÿ' => 'خى', 'ï´ ' => 'خي', 'ï´¡' => 'صى', 'ï´¢' => 'صي', 'ï´£' => 'ضى', 'ï´¤' => 'ضي', 'ï´¥' => 'شج', 'ï´¦' => 'شح', 'ï´§' => 'شخ', 'ï´¨' => 'شم', 'ï´©' => 'شر', 'ï´ª' => 'سر', 'ï´«' => 'صر', 'ï´¬' => 'ضر', 'ï´­' => 'شج', 'ï´®' => 'شح', 'ï´¯' => 'شخ', 'ï´°' => 'شم', 'ï´±' => 'سه', 'ï´²' => 'شه', 'ï´³' => 'طم', 'ï´´' => 'سج', 'ï´µ' => 'سح', 'ï´¶' => 'سخ', 'ï´·' => 'شج', 'ï´¸' => 'شح', 'ï´¹' => 'شخ', 'ï´º' => 'طم', 'ï´»' => 'ظم', 'ï´¼' => 'اً', 'ï´½' => 'اً', 'ïµ' => 'تجم', 'ﵑ' => 'تحج', 'ïµ’' => 'تحج', 'ﵓ' => 'تحم', 'ïµ”' => 'تخم', 'ﵕ' => 'تمج', 'ïµ–' => 'تمح', 'ïµ—' => 'تمخ', 'ﵘ' => 'جمح', 'ïµ™' => 'جمح', 'ﵚ' => 'حمي', 'ïµ›' => 'حمى', 'ﵜ' => 'سحج', 'ïµ' => 'سجح', 'ﵞ' => 'سجى', 'ﵟ' => 'سمح', 'ïµ ' => 'سمح', 'ﵡ' => 'سمج', 'ïµ¢' => 'سمم', 'ïµ£' => 'سمم', 'ﵤ' => 'صحح', 'ïµ¥' => 'صحح', 'ﵦ' => 'صمم', 'ﵧ' => 'شحم', 'ﵨ' => 'شحم', 'ﵩ' => 'شجي', 'ﵪ' => 'شمخ', 'ﵫ' => 'شمخ', 'ﵬ' => 'شمم', 'ïµ­' => 'شمم', 'ïµ®' => 'ضحى', 'ﵯ' => 'ضخم', 'ïµ°' => 'ضخم', 'ïµ±' => 'طمح', 'ïµ²' => 'طمح', 'ïµ³' => 'طمم', 'ïµ´' => 'طمي', 'ïµµ' => 'عجم', 'ﵶ' => 'عمم', 'ïµ·' => 'عمم', 'ﵸ' => 'عمى', 'ïµ¹' => 'غمم', 'ﵺ' => 'غمي', 'ïµ»' => 'غمى', 'ïµ¼' => 'Ùخم', 'ïµ½' => 'Ùخم', 'ïµ¾' => 'قمح', 'ﵿ' => 'قمم', 'ﶀ' => 'لحم', 'ï¶' => 'لحي', 'ﶂ' => 'لحى', 'ﶃ' => 'لجج', 'ﶄ' => 'لجج', 'ﶅ' => 'لخم', 'ﶆ' => 'لخم', 'ﶇ' => 'لمح', 'ﶈ' => 'لمح', 'ﶉ' => 'محج', 'ﶊ' => 'محم', 'ﶋ' => 'محي', 'ﶌ' => 'مجح', 'ï¶' => 'مجم', 'ﶎ' => 'مخج', 'ï¶' => 'مخم', 'ﶒ' => 'مجخ', 'ﶓ' => 'همج', 'ﶔ' => 'همم', 'ﶕ' => 'نحم', 'ﶖ' => 'نحى', 'ﶗ' => 'نجم', 'ﶘ' => 'نجم', 'ﶙ' => 'نجى', 'ﶚ' => 'نمي', 'ﶛ' => 'نمى', 'ﶜ' => 'يمم', 'ï¶' => 'يمم', 'ﶞ' => 'بخي', 'ﶟ' => 'تجي', 'ﶠ' => 'تجى', 'ﶡ' => 'تخي', 'ﶢ' => 'تخى', 'ﶣ' => 'تمي', 'ﶤ' => 'تمى', 'ﶥ' => 'جمي', 'ﶦ' => 'جحى', 'ﶧ' => 'جمى', 'ﶨ' => 'سخى', 'ﶩ' => 'صحي', 'ﶪ' => 'شحي', 'ﶫ' => 'ضحي', 'ﶬ' => 'لجي', 'ﶭ' => 'لمي', 'ﶮ' => 'يحي', 'ﶯ' => 'يجي', 'ﶰ' => 'يمي', 'ﶱ' => 'ممي', 'ﶲ' => 'قمي', 'ﶳ' => 'نحي', 'ﶴ' => 'قمح', 'ﶵ' => 'لحم', 'ﶶ' => 'عمي', 'ﶷ' => 'كمي', 'ﶸ' => 'نجح', 'ﶹ' => 'مخي', 'ﶺ' => 'لجم', 'ﶻ' => 'كمم', 'ﶼ' => 'لجم', 'ﶽ' => 'نجح', 'ﶾ' => 'جحي', 'ﶿ' => 'حجي', 'ï·€' => 'مجي', 'ï·' => 'Ùمي', 'ï·‚' => 'بحي', 'ï·ƒ' => 'كمم', 'ï·„' => 'عجم', 'ï·…' => 'صمم', 'ï·†' => 'سخي', 'ï·‡' => 'نجي', 'ï·°' => 'صلے', 'ï·±' => 'قلے', 'ï·²' => 'الله', 'ï·³' => 'اكبر', 'ï·´' => 'محمد', 'ï·µ' => 'صلعم', 'ï·¶' => 'رسول', 'ï··' => 'عليه', 'ï·¸' => 'وسلم', 'ï·¹' => 'صلى', 'ï·º' => 'صلى الله عليه وسلم', 'ï·»' => 'جل جلاله', 'ï·¼' => 'ریال', 'ï¸' => ',', '︑' => 'ã€', '︒' => '。', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︗' => '〖', '︘' => '〗', '︙' => '...', '︰' => '..', '︱' => '—', '︲' => '–', '︳' => '_', '︴' => '_', '︵' => '(', '︶' => ')', '︷' => '{', '︸' => '}', '︹' => '〔', '︺' => '〕', '︻' => 'ã€', '︼' => '】', '︽' => '《', '︾' => '》', '︿' => '〈', 'ï¹€' => '〉', 'ï¹' => '「', '﹂' => 'ã€', '﹃' => '『', '﹄' => 'ã€', '﹇' => '[', '﹈' => ']', '﹉' => ' Ì…', '﹊' => ' Ì…', '﹋' => ' Ì…', '﹌' => ' Ì…', 'ï¹' => '_', '﹎' => '_', 'ï¹' => '_', 'ï¹' => ',', '﹑' => 'ã€', 'ï¹’' => '.', 'ï¹”' => ';', '﹕' => ':', 'ï¹–' => '?', 'ï¹—' => '!', '﹘' => '—', 'ï¹™' => '(', '﹚' => ')', 'ï¹›' => '{', '﹜' => '}', 'ï¹' => '〔', '﹞' => '〕', '﹟' => '#', 'ï¹ ' => '&', '﹡' => '*', 'ï¹¢' => '+', 'ï¹£' => '-', '﹤' => '<', 'ï¹¥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', 'ï¹°' => ' Ù‹', 'ï¹±' => 'ـً', 'ï¹²' => ' ÙŒ', 'ï¹´' => ' Ù', 'ﹶ' => ' ÙŽ', 'ï¹·' => 'Ù€ÙŽ', 'ﹸ' => ' Ù', 'ï¹¹' => 'Ù€Ù', 'ﹺ' => ' Ù', 'ï¹»' => 'Ù€Ù', 'ï¹¼' => ' Ù‘', 'ï¹½' => 'ـّ', 'ï¹¾' => ' Ù’', 'ﹿ' => 'ـْ', 'ﺀ' => 'Ø¡', 'ïº' => 'آ', 'ﺂ' => 'آ', 'ﺃ' => 'أ', 'ﺄ' => 'أ', 'ﺅ' => 'ÙˆÙ”', 'ﺆ' => 'ÙˆÙ”', 'ﺇ' => 'إ', 'ﺈ' => 'إ', 'ﺉ' => 'ÙŠÙ”', 'ﺊ' => 'ÙŠÙ”', 'ﺋ' => 'ÙŠÙ”', 'ﺌ' => 'ÙŠÙ”', 'ïº' => 'ا', 'ﺎ' => 'ا', 'ïº' => 'ب', 'ïº' => 'ب', 'ﺑ' => 'ب', 'ﺒ' => 'ب', 'ﺓ' => 'Ø©', 'ﺔ' => 'Ø©', 'ﺕ' => 'ت', 'ﺖ' => 'ت', 'ﺗ' => 'ت', 'ﺘ' => 'ت', 'ﺙ' => 'Ø«', 'ﺚ' => 'Ø«', 'ﺛ' => 'Ø«', 'ﺜ' => 'Ø«', 'ïº' => 'ج', 'ﺞ' => 'ج', 'ﺟ' => 'ج', 'ﺠ' => 'ج', 'ﺡ' => 'Ø­', 'ﺢ' => 'Ø­', 'ﺣ' => 'Ø­', 'ﺤ' => 'Ø­', 'ﺥ' => 'Ø®', 'ﺦ' => 'Ø®', 'ﺧ' => 'Ø®', 'ﺨ' => 'Ø®', 'ﺩ' => 'د', 'ﺪ' => 'د', 'ﺫ' => 'Ø°', 'ﺬ' => 'Ø°', 'ﺭ' => 'ر', 'ﺮ' => 'ر', 'ﺯ' => 'ز', 'ﺰ' => 'ز', 'ﺱ' => 'س', 'ﺲ' => 'س', 'ﺳ' => 'س', 'ﺴ' => 'س', 'ﺵ' => 'Ø´', 'ﺶ' => 'Ø´', 'ﺷ' => 'Ø´', 'ﺸ' => 'Ø´', 'ﺹ' => 'ص', 'ﺺ' => 'ص', 'ﺻ' => 'ص', 'ﺼ' => 'ص', 'ﺽ' => 'ض', 'ﺾ' => 'ض', 'ﺿ' => 'ض', 'ﻀ' => 'ض', 'ï»' => 'Ø·', 'ﻂ' => 'Ø·', 'ﻃ' => 'Ø·', 'ﻄ' => 'Ø·', 'ï»…' => 'ظ', 'ﻆ' => 'ظ', 'ﻇ' => 'ظ', 'ﻈ' => 'ظ', 'ﻉ' => 'ع', 'ﻊ' => 'ع', 'ﻋ' => 'ع', 'ﻌ' => 'ع', 'ï»' => 'غ', 'ﻎ' => 'غ', 'ï»' => 'غ', 'ï»' => 'غ', 'ﻑ' => 'Ù', 'ï»’' => 'Ù', 'ﻓ' => 'Ù', 'ï»”' => 'Ù', 'ﻕ' => 'Ù‚', 'ï»–' => 'Ù‚', 'ï»—' => 'Ù‚', 'ﻘ' => 'Ù‚', 'ï»™' => 'Ùƒ', 'ﻚ' => 'Ùƒ', 'ï»›' => 'Ùƒ', 'ﻜ' => 'Ùƒ', 'ï»' => 'Ù„', 'ﻞ' => 'Ù„', 'ﻟ' => 'Ù„', 'ï» ' => 'Ù„', 'ﻡ' => 'Ù…', 'ﻢ' => 'Ù…', 'ﻣ' => 'Ù…', 'ﻤ' => 'Ù…', 'ﻥ' => 'Ù†', 'ﻦ' => 'Ù†', 'ﻧ' => 'Ù†', 'ﻨ' => 'Ù†', 'ﻩ' => 'Ù‡', 'ﻪ' => 'Ù‡', 'ﻫ' => 'Ù‡', 'ﻬ' => 'Ù‡', 'ï»­' => 'Ùˆ', 'ï»®' => 'Ùˆ', 'ﻯ' => 'Ù‰', 'ï»°' => 'Ù‰', 'ï»±' => 'ÙŠ', 'ﻲ' => 'ÙŠ', 'ﻳ' => 'ÙŠ', 'ï»´' => 'ÙŠ', 'ﻵ' => 'لآ', 'ﻶ' => 'لآ', 'ï»·' => 'لأ', 'ﻸ' => 'لأ', 'ﻹ' => 'لإ', 'ﻺ' => 'لإ', 'ï»»' => 'لا', 'ﻼ' => 'لا', 'ï¼' => '!', '"' => '"', '#' => '#', '$' => '$', 'ï¼…' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', 'ï¼' => '-', '.' => '.', 'ï¼' => '/', 'ï¼' => '0', '1' => '1', 'ï¼’' => '2', '3' => '3', 'ï¼”' => '4', '5' => '5', 'ï¼–' => '6', 'ï¼—' => '7', '8' => '8', 'ï¼™' => '9', ':' => ':', 'ï¼›' => ';', '<' => '<', 'ï¼' => '=', '>' => '>', '?' => '?', 'ï¼ ' => '@', 'A' => 'A', 'ï¼¢' => 'B', 'ï¼£' => 'C', 'D' => 'D', 'ï¼¥' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'ï¼­' => 'M', 'ï¼®' => 'N', 'O' => 'O', 'ï¼°' => 'P', 'ï¼±' => 'Q', 'ï¼²' => 'R', 'ï¼³' => 'S', 'ï¼´' => 'T', 'ï¼µ' => 'U', 'V' => 'V', 'ï¼·' => 'W', 'X' => 'X', 'ï¼¹' => 'Y', 'Z' => 'Z', 'ï¼»' => '[', 'ï¼¼' => '\\', 'ï¼½' => ']', 'ï¼¾' => '^', '_' => '_', 'ï½€' => '`', 'ï½' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'ï½…' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'ï½' => 'm', 'n' => 'n', 'ï½' => 'o', 'ï½' => 'p', 'q' => 'q', 'ï½’' => 'r', 's' => 's', 'ï½”' => 't', 'u' => 'u', 'ï½–' => 'v', 'ï½—' => 'w', 'x' => 'x', 'ï½™' => 'y', 'z' => 'z', 'ï½›' => '{', '|' => '|', 'ï½' => '}', '~' => '~', '⦅' => '⦅', 'ï½ ' => '⦆', '。' => '。', 'ï½¢' => '「', 'ï½£' => 'ã€', '、' => 'ã€', 'ï½¥' => '・', 'ヲ' => 'ヲ', 'ァ' => 'ã‚¡', 'ィ' => 'ã‚£', 'ゥ' => 'ã‚¥', 'ェ' => 'ェ', 'ォ' => 'ã‚©', 'ャ' => 'ャ', 'ï½­' => 'ュ', 'ï½®' => 'ョ', 'ッ' => 'ッ', 'ï½°' => 'ー', 'ï½±' => 'ã‚¢', 'ï½²' => 'イ', 'ï½³' => 'ウ', 'ï½´' => 'エ', 'ï½µ' => 'オ', 'カ' => 'ã‚«', 'ï½·' => 'ã‚­', 'ク' => 'ク', 'ï½¹' => 'ケ', 'コ' => 'コ', 'ï½»' => 'サ', 'ï½¼' => 'ã‚·', 'ï½½' => 'ス', 'ï½¾' => 'ã‚»', 'ソ' => 'ソ', 'ï¾€' => 'ã‚¿', 'ï¾' => 'ãƒ', 'ツ' => 'ツ', 'テ' => 'テ', 'ト' => 'ト', 'ï¾…' => 'ナ', 'ニ' => 'ニ', 'ヌ' => 'ヌ', 'ネ' => 'ãƒ', 'ノ' => 'ノ', 'ハ' => 'ãƒ', 'ヒ' => 'ヒ', 'フ' => 'フ', 'ï¾' => 'ヘ', 'ホ' => 'ホ', 'ï¾' => 'マ', 'ï¾' => 'ミ', 'ム' => 'ム', 'ï¾’' => 'メ', 'モ' => 'モ', 'ï¾”' => 'ヤ', 'ユ' => 'ユ', 'ï¾–' => 'ヨ', 'ï¾—' => 'ラ', 'リ' => 'リ', 'ï¾™' => 'ル', 'レ' => 'レ', 'ï¾›' => 'ロ', 'ワ' => 'ワ', 'ï¾' => 'ン', '゙' => 'ã‚™', '゚' => 'ã‚š', 'ï¾ ' => 'á… ', 'ᄀ' => 'á„€', 'ï¾¢' => 'á„', 'ï¾£' => 'ᆪ', 'ᄂ' => 'á„‚', 'ï¾¥' => 'ᆬ', 'ᆭ' => 'ᆭ', 'ᄃ' => 'ᄃ', 'ᄄ' => 'á„„', 'ᄅ' => 'á„…', 'ᆰ' => 'ᆰ', 'ᆱ' => 'ᆱ', 'ᆲ' => 'ᆲ', 'ï¾­' => 'ᆳ', 'ï¾®' => 'ᆴ', 'ᆵ' => 'ᆵ', 'ï¾°' => 'á„š', 'ï¾±' => 'ᄆ', 'ï¾²' => 'ᄇ', 'ï¾³' => 'ᄈ', 'ï¾´' => 'á„¡', 'ï¾µ' => 'ᄉ', 'ᄊ' => 'á„Š', 'ï¾·' => 'á„‹', 'ᄌ' => 'á„Œ', 'ï¾¹' => 'á„', 'ᄎ' => 'á„Ž', 'ï¾»' => 'á„', 'ï¾¼' => 'á„', 'ï¾½' => 'á„‘', 'ï¾¾' => 'á„’', 'ï¿‚' => 'á…¡', 'ᅢ' => 'á…¢', 'ï¿„' => 'á…£', 'ï¿…' => 'á…¤', 'ᅥ' => 'á…¥', 'ᅦ' => 'á…¦', 'ï¿Š' => 'á…§', 'ï¿‹' => 'á…¨', 'ï¿Œ' => 'á…©', 'ï¿' => 'á…ª', 'ï¿Ž' => 'á…«', 'ï¿' => 'á…¬', 'ï¿’' => 'á…­', 'ï¿“' => 'á…®', 'ï¿”' => 'á…¯', 'ï¿•' => 'á…°', 'ï¿–' => 'á…±', 'ï¿—' => 'á…²', 'ï¿š' => 'á…³', 'ï¿›' => 'á…´', 'ï¿œ' => 'á…µ', 'ï¿ ' => '¢', 'ï¿¡' => '£', 'ï¿¢' => '¬', 'ï¿£' => ' Ì„', '¦' => '¦', 'ï¿¥' => 'Â¥', '₩' => 'â‚©', '│' => '│', 'ï¿©' => 'â†', '↑' => '↑', 'ï¿«' => '→', '↓' => '↓', 'ï¿­' => 'â– ', 'ï¿®' => 'â—‹', 'ð€' => 'A', 'ð' => 'B', 'ð‚' => 'C', 'ðƒ' => 'D', 'ð„' => 'E', 'ð…' => 'F', 'ð†' => 'G', 'ð‡' => 'H', 'ðˆ' => 'I', 'ð‰' => 'J', 'ðŠ' => 'K', 'ð‹' => 'L', 'ðŒ' => 'M', 'ð' => 'N', 'ðŽ' => 'O', 'ð' => 'P', 'ð' => 'Q', 'ð‘' => 'R', 'ð’' => 'S', 'ð“' => 'T', 'ð”' => 'U', 'ð•' => 'V', 'ð–' => 'W', 'ð—' => 'X', 'ð˜' => 'Y', 'ð™' => 'Z', 'ðš' => 'a', 'ð›' => 'b', 'ðœ' => 'c', 'ð' => 'd', 'ðž' => 'e', 'ðŸ' => 'f', 'ð ' => 'g', 'ð¡' => 'h', 'ð¢' => 'i', 'ð£' => 'j', 'ð¤' => 'k', 'ð¥' => 'l', 'ð¦' => 'm', 'ð§' => 'n', 'ð¨' => 'o', 'ð©' => 'p', 'ðª' => 'q', 'ð«' => 'r', 'ð¬' => 's', 'ð­' => 't', 'ð®' => 'u', 'ð¯' => 'v', 'ð°' => 'w', 'ð±' => 'x', 'ð²' => 'y', 'ð³' => 'z', 'ð´' => 'A', 'ðµ' => 'B', 'ð¶' => 'C', 'ð·' => 'D', 'ð¸' => 'E', 'ð¹' => 'F', 'ðº' => 'G', 'ð»' => 'H', 'ð¼' => 'I', 'ð½' => 'J', 'ð¾' => 'K', 'ð¿' => 'L', 'ð‘€' => 'M', 'ð‘' => 'N', 'ð‘‚' => 'O', 'ð‘ƒ' => 'P', 'ð‘„' => 'Q', 'ð‘…' => 'R', 'ð‘†' => 'S', 'ð‘‡' => 'T', 'ð‘ˆ' => 'U', 'ð‘‰' => 'V', 'ð‘Š' => 'W', 'ð‘‹' => 'X', 'ð‘Œ' => 'Y', 'ð‘' => 'Z', 'ð‘Ž' => 'a', 'ð‘' => 'b', 'ð‘' => 'c', 'ð‘‘' => 'd', 'ð‘’' => 'e', 'ð‘“' => 'f', 'ð‘”' => 'g', 'ð‘–' => 'i', 'ð‘—' => 'j', 'ð‘˜' => 'k', 'ð‘™' => 'l', 'ð‘š' => 'm', 'ð‘›' => 'n', 'ð‘œ' => 'o', 'ð‘' => 'p', 'ð‘ž' => 'q', 'ð‘Ÿ' => 'r', 'ð‘ ' => 's', 'ð‘¡' => 't', 'ð‘¢' => 'u', 'ð‘£' => 'v', 'ð‘¤' => 'w', 'ð‘¥' => 'x', 'ð‘¦' => 'y', 'ð‘§' => 'z', 'ð‘¨' => 'A', 'ð‘©' => 'B', 'ð‘ª' => 'C', 'ð‘«' => 'D', 'ð‘¬' => 'E', 'ð‘­' => 'F', 'ð‘®' => 'G', 'ð‘¯' => 'H', 'ð‘°' => 'I', 'ð‘±' => 'J', 'ð‘²' => 'K', 'ð‘³' => 'L', 'ð‘´' => 'M', 'ð‘µ' => 'N', 'ð‘¶' => 'O', 'ð‘·' => 'P', 'ð‘¸' => 'Q', 'ð‘¹' => 'R', 'ð‘º' => 'S', 'ð‘»' => 'T', 'ð‘¼' => 'U', 'ð‘½' => 'V', 'ð‘¾' => 'W', 'ð‘¿' => 'X', 'ð’€' => 'Y', 'ð’' => 'Z', 'ð’‚' => 'a', 'ð’ƒ' => 'b', 'ð’„' => 'c', 'ð’…' => 'd', 'ð’†' => 'e', 'ð’‡' => 'f', 'ð’ˆ' => 'g', 'ð’‰' => 'h', 'ð’Š' => 'i', 'ð’‹' => 'j', 'ð’Œ' => 'k', 'ð’' => 'l', 'ð’Ž' => 'm', 'ð’' => 'n', 'ð’' => 'o', 'ð’‘' => 'p', 'ð’’' => 'q', 'ð’“' => 'r', 'ð’”' => 's', 'ð’•' => 't', 'ð’–' => 'u', 'ð’—' => 'v', 'ð’˜' => 'w', 'ð’™' => 'x', 'ð’š' => 'y', 'ð’›' => 'z', 'ð’œ' => 'A', 'ð’ž' => 'C', 'ð’Ÿ' => 'D', 'ð’¢' => 'G', 'ð’¥' => 'J', 'ð’¦' => 'K', 'ð’©' => 'N', 'ð’ª' => 'O', 'ð’«' => 'P', 'ð’¬' => 'Q', 'ð’®' => 'S', 'ð’¯' => 'T', 'ð’°' => 'U', 'ð’±' => 'V', 'ð’²' => 'W', 'ð’³' => 'X', 'ð’´' => 'Y', 'ð’µ' => 'Z', 'ð’¶' => 'a', 'ð’·' => 'b', 'ð’¸' => 'c', 'ð’¹' => 'd', 'ð’»' => 'f', 'ð’½' => 'h', 'ð’¾' => 'i', 'ð’¿' => 'j', 'ð“€' => 'k', 'ð“' => 'l', 'ð“‚' => 'm', 'ð“ƒ' => 'n', 'ð“…' => 'p', 'ð“†' => 'q', 'ð“‡' => 'r', 'ð“ˆ' => 's', 'ð“‰' => 't', 'ð“Š' => 'u', 'ð“‹' => 'v', 'ð“Œ' => 'w', 'ð“' => 'x', 'ð“Ž' => 'y', 'ð“' => 'z', 'ð“' => 'A', 'ð“‘' => 'B', 'ð“’' => 'C', 'ð““' => 'D', 'ð“”' => 'E', 'ð“•' => 'F', 'ð“–' => 'G', 'ð“—' => 'H', 'ð“˜' => 'I', 'ð“™' => 'J', 'ð“š' => 'K', 'ð“›' => 'L', 'ð“œ' => 'M', 'ð“' => 'N', 'ð“ž' => 'O', 'ð“Ÿ' => 'P', 'ð“ ' => 'Q', 'ð“¡' => 'R', 'ð“¢' => 'S', 'ð“£' => 'T', 'ð“¤' => 'U', 'ð“¥' => 'V', 'ð“¦' => 'W', 'ð“§' => 'X', 'ð“¨' => 'Y', 'ð“©' => 'Z', 'ð“ª' => 'a', 'ð“«' => 'b', 'ð“¬' => 'c', 'ð“­' => 'd', 'ð“®' => 'e', 'ð“¯' => 'f', 'ð“°' => 'g', 'ð“±' => 'h', 'ð“²' => 'i', 'ð“³' => 'j', 'ð“´' => 'k', 'ð“µ' => 'l', 'ð“¶' => 'm', 'ð“·' => 'n', 'ð“¸' => 'o', 'ð“¹' => 'p', 'ð“º' => 'q', 'ð“»' => 'r', 'ð“¼' => 's', 'ð“½' => 't', 'ð“¾' => 'u', 'ð“¿' => 'v', 'ð”€' => 'w', 'ð”' => 'x', 'ð”‚' => 'y', 'ð”ƒ' => 'z', 'ð”„' => 'A', 'ð”…' => 'B', 'ð”‡' => 'D', 'ð”ˆ' => 'E', 'ð”‰' => 'F', 'ð”Š' => 'G', 'ð”' => 'J', 'ð”Ž' => 'K', 'ð”' => 'L', 'ð”' => 'M', 'ð”‘' => 'N', 'ð”’' => 'O', 'ð”“' => 'P', 'ð””' => 'Q', 'ð”–' => 'S', 'ð”—' => 'T', 'ð”˜' => 'U', 'ð”™' => 'V', 'ð”š' => 'W', 'ð”›' => 'X', 'ð”œ' => 'Y', 'ð”ž' => 'a', 'ð”Ÿ' => 'b', 'ð” ' => 'c', 'ð”¡' => 'd', 'ð”¢' => 'e', 'ð”£' => 'f', 'ð”¤' => 'g', 'ð”¥' => 'h', 'ð”¦' => 'i', 'ð”§' => 'j', 'ð”¨' => 'k', 'ð”©' => 'l', 'ð”ª' => 'm', 'ð”«' => 'n', 'ð”¬' => 'o', 'ð”­' => 'p', 'ð”®' => 'q', 'ð”¯' => 'r', 'ð”°' => 's', 'ð”±' => 't', 'ð”²' => 'u', 'ð”³' => 'v', 'ð”´' => 'w', 'ð”µ' => 'x', 'ð”¶' => 'y', 'ð”·' => 'z', 'ð”¸' => 'A', 'ð”¹' => 'B', 'ð”»' => 'D', 'ð”¼' => 'E', 'ð”½' => 'F', 'ð”¾' => 'G', 'ð•€' => 'I', 'ð•' => 'J', 'ð•‚' => 'K', 'ð•ƒ' => 'L', 'ð•„' => 'M', 'ð•†' => 'O', 'ð•Š' => 'S', 'ð•‹' => 'T', 'ð•Œ' => 'U', 'ð•' => 'V', 'ð•Ž' => 'W', 'ð•' => 'X', 'ð•' => 'Y', 'ð•’' => 'a', 'ð•“' => 'b', 'ð•”' => 'c', 'ð••' => 'd', 'ð•–' => 'e', 'ð•—' => 'f', 'ð•˜' => 'g', 'ð•™' => 'h', 'ð•š' => 'i', 'ð•›' => 'j', 'ð•œ' => 'k', 'ð•' => 'l', 'ð•ž' => 'm', 'ð•Ÿ' => 'n', 'ð• ' => 'o', 'ð•¡' => 'p', 'ð•¢' => 'q', 'ð•£' => 'r', 'ð•¤' => 's', 'ð•¥' => 't', 'ð•¦' => 'u', 'ð•§' => 'v', 'ð•¨' => 'w', 'ð•©' => 'x', 'ð•ª' => 'y', 'ð•«' => 'z', 'ð•¬' => 'A', 'ð•­' => 'B', 'ð•®' => 'C', 'ð•¯' => 'D', 'ð•°' => 'E', 'ð•±' => 'F', 'ð•²' => 'G', 'ð•³' => 'H', 'ð•´' => 'I', 'ð•µ' => 'J', 'ð•¶' => 'K', 'ð•·' => 'L', 'ð•¸' => 'M', 'ð•¹' => 'N', 'ð•º' => 'O', 'ð•»' => 'P', 'ð•¼' => 'Q', 'ð•½' => 'R', 'ð•¾' => 'S', 'ð•¿' => 'T', 'ð–€' => 'U', 'ð–' => 'V', 'ð–‚' => 'W', 'ð–ƒ' => 'X', 'ð–„' => 'Y', 'ð–…' => 'Z', 'ð–†' => 'a', 'ð–‡' => 'b', 'ð–ˆ' => 'c', 'ð–‰' => 'd', 'ð–Š' => 'e', 'ð–‹' => 'f', 'ð–Œ' => 'g', 'ð–' => 'h', 'ð–Ž' => 'i', 'ð–' => 'j', 'ð–' => 'k', 'ð–‘' => 'l', 'ð–’' => 'm', 'ð–“' => 'n', 'ð–”' => 'o', 'ð–•' => 'p', 'ð––' => 'q', 'ð–—' => 'r', 'ð–˜' => 's', 'ð–™' => 't', 'ð–š' => 'u', 'ð–›' => 'v', 'ð–œ' => 'w', 'ð–' => 'x', 'ð–ž' => 'y', 'ð–Ÿ' => 'z', 'ð– ' => 'A', 'ð–¡' => 'B', 'ð–¢' => 'C', 'ð–£' => 'D', 'ð–¤' => 'E', 'ð–¥' => 'F', 'ð–¦' => 'G', 'ð–§' => 'H', 'ð–¨' => 'I', 'ð–©' => 'J', 'ð–ª' => 'K', 'ð–«' => 'L', 'ð–¬' => 'M', 'ð–­' => 'N', 'ð–®' => 'O', 'ð–¯' => 'P', 'ð–°' => 'Q', 'ð–±' => 'R', 'ð–²' => 'S', 'ð–³' => 'T', 'ð–´' => 'U', 'ð–µ' => 'V', 'ð–¶' => 'W', 'ð–·' => 'X', 'ð–¸' => 'Y', 'ð–¹' => 'Z', 'ð–º' => 'a', 'ð–»' => 'b', 'ð–¼' => 'c', 'ð–½' => 'd', 'ð–¾' => 'e', 'ð–¿' => 'f', 'ð—€' => 'g', 'ð—' => 'h', 'ð—‚' => 'i', 'ð—ƒ' => 'j', 'ð—„' => 'k', 'ð—…' => 'l', 'ð—†' => 'm', 'ð—‡' => 'n', 'ð—ˆ' => 'o', 'ð—‰' => 'p', 'ð—Š' => 'q', 'ð—‹' => 'r', 'ð—Œ' => 's', 'ð—' => 't', 'ð—Ž' => 'u', 'ð—' => 'v', 'ð—' => 'w', 'ð—‘' => 'x', 'ð—’' => 'y', 'ð—“' => 'z', 'ð—”' => 'A', 'ð—•' => 'B', 'ð—–' => 'C', 'ð——' => 'D', 'ð—˜' => 'E', 'ð—™' => 'F', 'ð—š' => 'G', 'ð—›' => 'H', 'ð—œ' => 'I', 'ð—' => 'J', 'ð—ž' => 'K', 'ð—Ÿ' => 'L', 'ð— ' => 'M', 'ð—¡' => 'N', 'ð—¢' => 'O', 'ð—£' => 'P', 'ð—¤' => 'Q', 'ð—¥' => 'R', 'ð—¦' => 'S', 'ð—§' => 'T', 'ð—¨' => 'U', 'ð—©' => 'V', 'ð—ª' => 'W', 'ð—«' => 'X', 'ð—¬' => 'Y', 'ð—­' => 'Z', 'ð—®' => 'a', 'ð—¯' => 'b', 'ð—°' => 'c', 'ð—±' => 'd', 'ð—²' => 'e', 'ð—³' => 'f', 'ð—´' => 'g', 'ð—µ' => 'h', 'ð—¶' => 'i', 'ð—·' => 'j', 'ð—¸' => 'k', 'ð—¹' => 'l', 'ð—º' => 'm', 'ð—»' => 'n', 'ð—¼' => 'o', 'ð—½' => 'p', 'ð—¾' => 'q', 'ð—¿' => 'r', 'ð˜€' => 's', 'ð˜' => 't', 'ð˜‚' => 'u', 'ð˜ƒ' => 'v', 'ð˜„' => 'w', 'ð˜…' => 'x', 'ð˜†' => 'y', 'ð˜‡' => 'z', 'ð˜ˆ' => 'A', 'ð˜‰' => 'B', 'ð˜Š' => 'C', 'ð˜‹' => 'D', 'ð˜Œ' => 'E', 'ð˜' => 'F', 'ð˜Ž' => 'G', 'ð˜' => 'H', 'ð˜' => 'I', 'ð˜‘' => 'J', 'ð˜’' => 'K', 'ð˜“' => 'L', 'ð˜”' => 'M', 'ð˜•' => 'N', 'ð˜–' => 'O', 'ð˜—' => 'P', 'ð˜˜' => 'Q', 'ð˜™' => 'R', 'ð˜š' => 'S', 'ð˜›' => 'T', 'ð˜œ' => 'U', 'ð˜' => 'V', 'ð˜ž' => 'W', 'ð˜Ÿ' => 'X', 'ð˜ ' => 'Y', 'ð˜¡' => 'Z', 'ð˜¢' => 'a', 'ð˜£' => 'b', 'ð˜¤' => 'c', 'ð˜¥' => 'd', 'ð˜¦' => 'e', 'ð˜§' => 'f', 'ð˜¨' => 'g', 'ð˜©' => 'h', 'ð˜ª' => 'i', 'ð˜«' => 'j', 'ð˜¬' => 'k', 'ð˜­' => 'l', 'ð˜®' => 'm', 'ð˜¯' => 'n', 'ð˜°' => 'o', 'ð˜±' => 'p', 'ð˜²' => 'q', 'ð˜³' => 'r', 'ð˜´' => 's', 'ð˜µ' => 't', 'ð˜¶' => 'u', 'ð˜·' => 'v', 'ð˜¸' => 'w', 'ð˜¹' => 'x', 'ð˜º' => 'y', 'ð˜»' => 'z', 'ð˜¼' => 'A', 'ð˜½' => 'B', 'ð˜¾' => 'C', 'ð˜¿' => 'D', 'ð™€' => 'E', 'ð™' => 'F', 'ð™‚' => 'G', 'ð™ƒ' => 'H', 'ð™„' => 'I', 'ð™…' => 'J', 'ð™†' => 'K', 'ð™‡' => 'L', 'ð™ˆ' => 'M', 'ð™‰' => 'N', 'ð™Š' => 'O', 'ð™‹' => 'P', 'ð™Œ' => 'Q', 'ð™' => 'R', 'ð™Ž' => 'S', 'ð™' => 'T', 'ð™' => 'U', 'ð™‘' => 'V', 'ð™’' => 'W', 'ð™“' => 'X', 'ð™”' => 'Y', 'ð™•' => 'Z', 'ð™–' => 'a', 'ð™—' => 'b', 'ð™˜' => 'c', 'ð™™' => 'd', 'ð™š' => 'e', 'ð™›' => 'f', 'ð™œ' => 'g', 'ð™' => 'h', 'ð™ž' => 'i', 'ð™Ÿ' => 'j', 'ð™ ' => 'k', 'ð™¡' => 'l', 'ð™¢' => 'm', 'ð™£' => 'n', 'ð™¤' => 'o', 'ð™¥' => 'p', 'ð™¦' => 'q', 'ð™§' => 'r', 'ð™¨' => 's', 'ð™©' => 't', 'ð™ª' => 'u', 'ð™«' => 'v', 'ð™¬' => 'w', 'ð™­' => 'x', 'ð™®' => 'y', 'ð™¯' => 'z', 'ð™°' => 'A', 'ð™±' => 'B', 'ð™²' => 'C', 'ð™³' => 'D', 'ð™´' => 'E', 'ð™µ' => 'F', 'ð™¶' => 'G', 'ð™·' => 'H', 'ð™¸' => 'I', 'ð™¹' => 'J', 'ð™º' => 'K', 'ð™»' => 'L', 'ð™¼' => 'M', 'ð™½' => 'N', 'ð™¾' => 'O', 'ð™¿' => 'P', 'ðš€' => 'Q', 'ðš' => 'R', 'ðš‚' => 'S', 'ðšƒ' => 'T', 'ðš„' => 'U', 'ðš…' => 'V', 'ðš†' => 'W', 'ðš‡' => 'X', 'ðšˆ' => 'Y', 'ðš‰' => 'Z', 'ðšŠ' => 'a', 'ðš‹' => 'b', 'ðšŒ' => 'c', 'ðš' => 'd', 'ðšŽ' => 'e', 'ðš' => 'f', 'ðš' => 'g', 'ðš‘' => 'h', 'ðš’' => 'i', 'ðš“' => 'j', 'ðš”' => 'k', 'ðš•' => 'l', 'ðš–' => 'm', 'ðš—' => 'n', 'ðš˜' => 'o', 'ðš™' => 'p', 'ðšš' => 'q', 'ðš›' => 'r', 'ðšœ' => 's', 'ðš' => 't', 'ðšž' => 'u', 'ðšŸ' => 'v', 'ðš ' => 'w', 'ðš¡' => 'x', 'ðš¢' => 'y', 'ðš£' => 'z', 'ðš¤' => 'ı', 'ðš¥' => 'È·', 'ðš¨' => 'Α', 'ðš©' => 'Î’', 'ðšª' => 'Γ', 'ðš«' => 'Δ', 'ðš¬' => 'Ε', 'ðš­' => 'Ζ', 'ðš®' => 'Η', 'ðš¯' => 'Θ', 'ðš°' => 'Ι', 'ðš±' => 'Κ', 'ðš²' => 'Λ', 'ðš³' => 'Îœ', 'ðš´' => 'Î', 'ðšµ' => 'Ξ', 'ðš¶' => 'Ο', 'ðš·' => 'Π', 'ðš¸' => 'Ρ', 'ðš¹' => 'Θ', 'ðšº' => 'Σ', 'ðš»' => 'Τ', 'ðš¼' => 'Î¥', 'ðš½' => 'Φ', 'ðš¾' => 'Χ', 'ðš¿' => 'Ψ', 'ð›€' => 'Ω', 'ð›' => '∇', 'ð›‚' => 'α', 'ð›ƒ' => 'β', 'ð›„' => 'γ', 'ð›…' => 'δ', 'ð›†' => 'ε', 'ð›‡' => 'ζ', 'ð›ˆ' => 'η', 'ð›‰' => 'θ', 'ð›Š' => 'ι', 'ð›‹' => 'κ', 'ð›Œ' => 'λ', 'ð›' => 'μ', 'ð›Ž' => 'ν', 'ð›' => 'ξ', 'ð›' => 'ο', 'ð›‘' => 'Ï€', 'ð›’' => 'Ï', 'ð›“' => 'Ï‚', 'ð›”' => 'σ', 'ð›•' => 'Ï„', 'ð›–' => 'Ï…', 'ð›—' => 'φ', 'ð›˜' => 'χ', 'ð›™' => 'ψ', 'ð›š' => 'ω', 'ð››' => '∂', 'ð›œ' => 'ε', 'ð›' => 'θ', 'ð›ž' => 'κ', 'ð›Ÿ' => 'φ', 'ð› ' => 'Ï', 'ð›¡' => 'Ï€', 'ð›¢' => 'Α', 'ð›£' => 'Î’', 'ð›¤' => 'Γ', 'ð›¥' => 'Δ', 'ð›¦' => 'Ε', 'ð›§' => 'Ζ', 'ð›¨' => 'Η', 'ð›©' => 'Θ', 'ð›ª' => 'Ι', 'ð›«' => 'Κ', 'ð›¬' => 'Λ', 'ð›­' => 'Îœ', 'ð›®' => 'Î', 'ð›¯' => 'Ξ', 'ð›°' => 'Ο', 'ð›±' => 'Π', 'ð›²' => 'Ρ', 'ð›³' => 'Θ', 'ð›´' => 'Σ', 'ð›µ' => 'Τ', 'ð›¶' => 'Î¥', 'ð›·' => 'Φ', 'ð›¸' => 'Χ', 'ð›¹' => 'Ψ', 'ð›º' => 'Ω', 'ð›»' => '∇', 'ð›¼' => 'α', 'ð›½' => 'β', 'ð›¾' => 'γ', 'ð›¿' => 'δ', 'ðœ€' => 'ε', 'ðœ' => 'ζ', 'ðœ‚' => 'η', 'ðœƒ' => 'θ', 'ðœ„' => 'ι', 'ðœ…' => 'κ', 'ðœ†' => 'λ', 'ðœ‡' => 'μ', 'ðœˆ' => 'ν', 'ðœ‰' => 'ξ', 'ðœŠ' => 'ο', 'ðœ‹' => 'Ï€', 'ðœŒ' => 'Ï', 'ðœ' => 'Ï‚', 'ðœŽ' => 'σ', 'ðœ' => 'Ï„', 'ðœ' => 'Ï…', 'ðœ‘' => 'φ', 'ðœ’' => 'χ', 'ðœ“' => 'ψ', 'ðœ”' => 'ω', 'ðœ•' => '∂', 'ðœ–' => 'ε', 'ðœ—' => 'θ', 'ðœ˜' => 'κ', 'ðœ™' => 'φ', 'ðœš' => 'Ï', 'ðœ›' => 'Ï€', 'ðœœ' => 'Α', 'ðœ' => 'Î’', 'ðœž' => 'Γ', 'ðœŸ' => 'Δ', 'ðœ ' => 'Ε', 'ðœ¡' => 'Ζ', 'ðœ¢' => 'Η', 'ðœ£' => 'Θ', 'ðœ¤' => 'Ι', 'ðœ¥' => 'Κ', 'ðœ¦' => 'Λ', 'ðœ§' => 'Îœ', 'ðœ¨' => 'Î', 'ðœ©' => 'Ξ', 'ðœª' => 'Ο', 'ðœ«' => 'Π', 'ðœ¬' => 'Ρ', 'ðœ­' => 'Θ', 'ðœ®' => 'Σ', 'ðœ¯' => 'Τ', 'ðœ°' => 'Î¥', 'ðœ±' => 'Φ', 'ðœ²' => 'Χ', 'ðœ³' => 'Ψ', 'ðœ´' => 'Ω', 'ðœµ' => '∇', 'ðœ¶' => 'α', 'ðœ·' => 'β', 'ðœ¸' => 'γ', 'ðœ¹' => 'δ', 'ðœº' => 'ε', 'ðœ»' => 'ζ', 'ðœ¼' => 'η', 'ðœ½' => 'θ', 'ðœ¾' => 'ι', 'ðœ¿' => 'κ', 'ð€' => 'λ', 'ð' => 'μ', 'ð‚' => 'ν', 'ðƒ' => 'ξ', 'ð„' => 'ο', 'ð…' => 'Ï€', 'ð†' => 'Ï', 'ð‡' => 'Ï‚', 'ðˆ' => 'σ', 'ð‰' => 'Ï„', 'ðŠ' => 'Ï…', 'ð‹' => 'φ', 'ðŒ' => 'χ', 'ð' => 'ψ', 'ðŽ' => 'ω', 'ð' => '∂', 'ð' => 'ε', 'ð‘' => 'θ', 'ð’' => 'κ', 'ð“' => 'φ', 'ð”' => 'Ï', 'ð•' => 'Ï€', 'ð–' => 'Α', 'ð—' => 'Î’', 'ð˜' => 'Γ', 'ð™' => 'Δ', 'ðš' => 'Ε', 'ð›' => 'Ζ', 'ðœ' => 'Η', 'ð' => 'Θ', 'ðž' => 'Ι', 'ðŸ' => 'Κ', 'ð ' => 'Λ', 'ð¡' => 'Îœ', 'ð¢' => 'Î', 'ð£' => 'Ξ', 'ð¤' => 'Ο', 'ð¥' => 'Π', 'ð¦' => 'Ρ', 'ð§' => 'Θ', 'ð¨' => 'Σ', 'ð©' => 'Τ', 'ðª' => 'Î¥', 'ð«' => 'Φ', 'ð¬' => 'Χ', 'ð­' => 'Ψ', 'ð®' => 'Ω', 'ð¯' => '∇', 'ð°' => 'α', 'ð±' => 'β', 'ð²' => 'γ', 'ð³' => 'δ', 'ð´' => 'ε', 'ðµ' => 'ζ', 'ð¶' => 'η', 'ð·' => 'θ', 'ð¸' => 'ι', 'ð¹' => 'κ', 'ðº' => 'λ', 'ð»' => 'μ', 'ð¼' => 'ν', 'ð½' => 'ξ', 'ð¾' => 'ο', 'ð¿' => 'Ï€', 'ðž€' => 'Ï', 'ðž' => 'Ï‚', 'ðž‚' => 'σ', 'ðžƒ' => 'Ï„', 'ðž„' => 'Ï…', 'ðž…' => 'φ', 'ðž†' => 'χ', 'ðž‡' => 'ψ', 'ðžˆ' => 'ω', 'ðž‰' => '∂', 'ðžŠ' => 'ε', 'ðž‹' => 'θ', 'ðžŒ' => 'κ', 'ðž' => 'φ', 'ðžŽ' => 'Ï', 'ðž' => 'Ï€', 'ðž' => 'Α', 'ðž‘' => 'Î’', 'ðž’' => 'Γ', 'ðž“' => 'Δ', 'ðž”' => 'Ε', 'ðž•' => 'Ζ', 'ðž–' => 'Η', 'ðž—' => 'Θ', 'ðž˜' => 'Ι', 'ðž™' => 'Κ', 'ðžš' => 'Λ', 'ðž›' => 'Îœ', 'ðžœ' => 'Î', 'ðž' => 'Ξ', 'ðžž' => 'Ο', 'ðžŸ' => 'Π', 'ðž ' => 'Ρ', 'ðž¡' => 'Θ', 'ðž¢' => 'Σ', 'ðž£' => 'Τ', 'ðž¤' => 'Î¥', 'ðž¥' => 'Φ', 'ðž¦' => 'Χ', 'ðž§' => 'Ψ', 'ðž¨' => 'Ω', 'ðž©' => '∇', 'ðžª' => 'α', 'ðž«' => 'β', 'ðž¬' => 'γ', 'ðž­' => 'δ', 'ðž®' => 'ε', 'ðž¯' => 'ζ', 'ðž°' => 'η', 'ðž±' => 'θ', 'ðž²' => 'ι', 'ðž³' => 'κ', 'ðž´' => 'λ', 'ðžµ' => 'μ', 'ðž¶' => 'ν', 'ðž·' => 'ξ', 'ðž¸' => 'ο', 'ðž¹' => 'Ï€', 'ðžº' => 'Ï', 'ðž»' => 'Ï‚', 'ðž¼' => 'σ', 'ðž½' => 'Ï„', 'ðž¾' => 'Ï…', 'ðž¿' => 'φ', 'ðŸ€' => 'χ', 'ðŸ' => 'ψ', 'ðŸ‚' => 'ω', 'ðŸƒ' => '∂', 'ðŸ„' => 'ε', 'ðŸ…' => 'θ', 'ðŸ†' => 'κ', 'ðŸ‡' => 'φ', 'ðŸˆ' => 'Ï', 'ðŸ‰' => 'Ï€', 'ðŸŠ' => 'Ïœ', 'ðŸ‹' => 'Ï', 'ðŸŽ' => '0', 'ðŸ' => '1', 'ðŸ' => '2', 'ðŸ‘' => '3', 'ðŸ’' => '4', 'ðŸ“' => '5', 'ðŸ”' => '6', 'ðŸ•' => '7', 'ðŸ–' => '8', 'ðŸ—' => '9', 'ðŸ˜' => '0', 'ðŸ™' => '1', 'ðŸš' => '2', 'ðŸ›' => '3', 'ðŸœ' => '4', 'ðŸ' => '5', 'ðŸž' => '6', 'ðŸŸ' => '7', 'ðŸ ' => '8', 'ðŸ¡' => '9', 'ðŸ¢' => '0', 'ðŸ£' => '1', 'ðŸ¤' => '2', 'ðŸ¥' => '3', 'ðŸ¦' => '4', 'ðŸ§' => '5', 'ðŸ¨' => '6', 'ðŸ©' => '7', 'ðŸª' => '8', 'ðŸ«' => '9', 'ðŸ¬' => '0', 'ðŸ­' => '1', 'ðŸ®' => '2', 'ðŸ¯' => '3', 'ðŸ°' => '4', 'ðŸ±' => '5', 'ðŸ²' => '6', 'ðŸ³' => '7', 'ðŸ´' => '8', 'ðŸµ' => '9', 'ðŸ¶' => '0', 'ðŸ·' => '1', 'ðŸ¸' => '2', 'ðŸ¹' => '3', 'ðŸº' => '4', 'ðŸ»' => '5', 'ðŸ¼' => '6', 'ðŸ½' => '7', 'ðŸ¾' => '8', 'ðŸ¿' => '9', '𞸀' => 'ا', 'ðž¸' => 'ب', '𞸂' => 'ج', '𞸃' => 'د', '𞸅' => 'Ùˆ', '𞸆' => 'ز', '𞸇' => 'Ø­', '𞸈' => 'Ø·', '𞸉' => 'ÙŠ', '𞸊' => 'Ùƒ', '𞸋' => 'Ù„', '𞸌' => 'Ù…', 'ðž¸' => 'Ù†', '𞸎' => 'س', 'ðž¸' => 'ع', 'ðž¸' => 'Ù', '𞸑' => 'ص', '𞸒' => 'Ù‚', '𞸓' => 'ر', '𞸔' => 'Ø´', '𞸕' => 'ت', '𞸖' => 'Ø«', '𞸗' => 'Ø®', '𞸘' => 'Ø°', '𞸙' => 'ض', '𞸚' => 'ظ', '𞸛' => 'غ', '𞸜' => 'Ù®', 'ðž¸' => 'Úº', '𞸞' => 'Ú¡', '𞸟' => 'Ù¯', '𞸡' => 'ب', '𞸢' => 'ج', '𞸤' => 'Ù‡', '𞸧' => 'Ø­', '𞸩' => 'ÙŠ', '𞸪' => 'Ùƒ', '𞸫' => 'Ù„', '𞸬' => 'Ù…', '𞸭' => 'Ù†', '𞸮' => 'س', '𞸯' => 'ع', '𞸰' => 'Ù', '𞸱' => 'ص', '𞸲' => 'Ù‚', '𞸴' => 'Ø´', '𞸵' => 'ت', '𞸶' => 'Ø«', '𞸷' => 'Ø®', '𞸹' => 'ض', '𞸻' => 'غ', '𞹂' => 'ج', '𞹇' => 'Ø­', '𞹉' => 'ÙŠ', '𞹋' => 'Ù„', 'ðž¹' => 'Ù†', '𞹎' => 'س', 'ðž¹' => 'ع', '𞹑' => 'ص', 'ðž¹’' => 'Ù‚', 'ðž¹”' => 'Ø´', 'ðž¹—' => 'Ø®', 'ðž¹™' => 'ض', 'ðž¹›' => 'غ', 'ðž¹' => 'Úº', '𞹟' => 'Ù¯', '𞹡' => 'ب', 'ðž¹¢' => 'ج', '𞹤' => 'Ù‡', '𞹧' => 'Ø­', '𞹨' => 'Ø·', '𞹩' => 'ÙŠ', '𞹪' => 'Ùƒ', '𞹬' => 'Ù…', 'ðž¹­' => 'Ù†', 'ðž¹®' => 'س', '𞹯' => 'ع', 'ðž¹°' => 'Ù', 'ðž¹±' => 'ص', 'ðž¹²' => 'Ù‚', 'ðž¹´' => 'Ø´', 'ðž¹µ' => 'ت', '𞹶' => 'Ø«', 'ðž¹·' => 'Ø®', 'ðž¹¹' => 'ض', '𞹺' => 'ظ', 'ðž¹»' => 'غ', 'ðž¹¼' => 'Ù®', 'ðž¹¾' => 'Ú¡', '𞺀' => 'ا', 'ðžº' => 'ب', '𞺂' => 'ج', '𞺃' => 'د', '𞺄' => 'Ù‡', '𞺅' => 'Ùˆ', '𞺆' => 'ز', '𞺇' => 'Ø­', '𞺈' => 'Ø·', '𞺉' => 'ÙŠ', '𞺋' => 'Ù„', '𞺌' => 'Ù…', 'ðžº' => 'Ù†', '𞺎' => 'س', 'ðžº' => 'ع', 'ðžº' => 'Ù', '𞺑' => 'ص', '𞺒' => 'Ù‚', '𞺓' => 'ر', '𞺔' => 'Ø´', '𞺕' => 'ت', '𞺖' => 'Ø«', '𞺗' => 'Ø®', '𞺘' => 'Ø°', '𞺙' => 'ض', '𞺚' => 'ظ', '𞺛' => 'غ', '𞺡' => 'ب', '𞺢' => 'ج', '𞺣' => 'د', '𞺥' => 'Ùˆ', '𞺦' => 'ز', '𞺧' => 'Ø­', '𞺨' => 'Ø·', '𞺩' => 'ÙŠ', '𞺫' => 'Ù„', '𞺬' => 'Ù…', '𞺭' => 'Ù†', '𞺮' => 'س', '𞺯' => 'ع', '𞺰' => 'Ù', '𞺱' => 'ص', '𞺲' => 'Ù‚', '𞺳' => 'ر', '𞺴' => 'Ø´', '𞺵' => 'ت', '𞺶' => 'Ø«', '𞺷' => 'Ø®', '𞺸' => 'Ø°', '𞺹' => 'ض', '𞺺' => 'ظ', '𞺻' => 'غ', '🄀' => '0.', 'ðŸ„' => '0,', '🄂' => '1,', '🄃' => '2,', '🄄' => '3,', '🄅' => '4,', '🄆' => '5,', '🄇' => '6,', '🄈' => '7,', '🄉' => '8,', '🄊' => '9,', 'ðŸ„' => '(A)', '🄑' => '(B)', '🄒' => '(C)', '🄓' => '(D)', '🄔' => '(E)', '🄕' => '(F)', '🄖' => '(G)', '🄗' => '(H)', '🄘' => '(I)', '🄙' => '(J)', '🄚' => '(K)', '🄛' => '(L)', '🄜' => '(M)', 'ðŸ„' => '(N)', '🄞' => '(O)', '🄟' => '(P)', '🄠' => '(Q)', '🄡' => '(R)', '🄢' => '(S)', '🄣' => '(T)', '🄤' => '(U)', '🄥' => '(V)', '🄦' => '(W)', '🄧' => '(X)', '🄨' => '(Y)', '🄩' => '(Z)', '🄪' => '〔S〕', '🄫' => 'C', '🄬' => 'R', '🄭' => 'CD', '🄮' => 'WZ', '🄰' => 'A', '🄱' => 'B', '🄲' => 'C', '🄳' => 'D', '🄴' => 'E', '🄵' => 'F', '🄶' => 'G', '🄷' => 'H', '🄸' => 'I', '🄹' => 'J', '🄺' => 'K', '🄻' => 'L', '🄼' => 'M', '🄽' => 'N', '🄾' => 'O', '🄿' => 'P', '🅀' => 'Q', 'ðŸ…' => 'R', '🅂' => 'S', '🅃' => 'T', '🅄' => 'U', '🅅' => 'V', '🅆' => 'W', '🅇' => 'X', '🅈' => 'Y', '🅉' => 'Z', '🅊' => 'HV', '🅋' => 'MV', '🅌' => 'SD', 'ðŸ…' => 'SS', '🅎' => 'PPV', 'ðŸ…' => 'WC', '🅪' => 'MC', '🅫' => 'MD', '🅬' => 'MR', 'ðŸ†' => 'DJ', '🈀' => 'ã»ã‹', 'ðŸˆ' => 'ココ', '🈂' => 'サ', 'ðŸˆ' => '手', '🈑' => 'å­—', '🈒' => 'åŒ', '🈓' => 'デ', '🈔' => '二', '🈕' => '多', '🈖' => '解', '🈗' => '天', '🈘' => '交', '🈙' => '映', '🈚' => 'ç„¡', '🈛' => 'æ–™', '🈜' => 'å‰', 'ðŸˆ' => '後', '🈞' => 'å†', '🈟' => 'æ–°', '🈠' => 'åˆ', '🈡' => '終', '🈢' => '生', '🈣' => '販', '🈤' => '声', '🈥' => 'å¹', '🈦' => 'æ¼”', '🈧' => '投', '🈨' => 'æ•', '🈩' => '一', '🈪' => '三', '🈫' => 'éŠ', '🈬' => 'å·¦', '🈭' => '中', '🈮' => 'å³', '🈯' => '指', '🈰' => 'èµ°', '🈱' => '打', '🈲' => 'ç¦', '🈳' => '空', '🈴' => 'åˆ', '🈵' => '満', '🈶' => '有', '🈷' => '月', '🈸' => '申', '🈹' => '割', '🈺' => 'å–¶', '🈻' => 'é…', '🉀' => '〔本〕', 'ðŸ‰' => '〔三〕', '🉂' => '〔二〕', '🉃' => '〔安〕', '🉄' => '〔点〕', '🉅' => '〔打〕', '🉆' => '〔盗〕', '🉇' => '〔å‹ã€•', '🉈' => '〔敗〕', 'ðŸ‰' => 'å¾—', '🉑' => 'å¯', '🯰' => '0', '🯱' => '1', '🯲' => '2', '🯳' => '3', '🯴' => '4', '🯵' => '5', '🯶' => '6', '🯷' => '7', '🯸' => '8', '🯹' => '9'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php000064400000036652147600374260032513 0ustar00addons/dropboxaddon 'À', 'AÌ' => 'Ã', 'AÌ‚' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'AÌŠ' => 'Ã…', 'Ç' => 'Ç', 'EÌ€' => 'È', 'EÌ' => 'É', 'EÌ‚' => 'Ê', 'Ë' => 'Ë', 'IÌ€' => 'ÃŒ', 'IÌ' => 'Ã', 'IÌ‚' => 'ÃŽ', 'Ï' => 'Ã', 'Ñ' => 'Ñ', 'OÌ€' => 'Ã’', 'OÌ' => 'Ó', 'OÌ‚' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'UÌ€' => 'Ù', 'UÌ' => 'Ú', 'UÌ‚' => 'Û', 'Ü' => 'Ãœ', 'YÌ' => 'Ã', 'aÌ€' => 'à', 'aÌ' => 'á', 'aÌ‚' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'aÌŠ' => 'Ã¥', 'ç' => 'ç', 'eÌ€' => 'è', 'eÌ' => 'é', 'eÌ‚' => 'ê', 'ë' => 'ë', 'iÌ€' => 'ì', 'iÌ' => 'í', 'iÌ‚' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'oÌ€' => 'ò', 'oÌ' => 'ó', 'oÌ‚' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'uÌ€' => 'ù', 'uÌ' => 'ú', 'uÌ‚' => 'û', 'ü' => 'ü', 'yÌ' => 'ý', 'ÿ' => 'ÿ', 'AÌ„' => 'Ä€', 'aÌ„' => 'Ä', 'Ă' => 'Ä‚', 'ă' => 'ă', 'Ą' => 'Ä„', 'ą' => 'Ä…', 'CÌ' => 'Ć', 'cÌ' => 'ć', 'CÌ‚' => 'Ĉ', 'cÌ‚' => 'ĉ', 'Ċ' => 'ÄŠ', 'ċ' => 'Ä‹', 'CÌŒ' => 'ÄŒ', 'cÌŒ' => 'Ä', 'DÌŒ' => 'ÄŽ', 'dÌŒ' => 'Ä', 'EÌ„' => 'Ä’', 'eÌ„' => 'Ä“', 'Ĕ' => 'Ä”', 'ĕ' => 'Ä•', 'Ė' => 'Ä–', 'ė' => 'Ä—', 'Ę' => 'Ę', 'ę' => 'Ä™', 'EÌŒ' => 'Äš', 'eÌŒ' => 'Ä›', 'GÌ‚' => 'Äœ', 'gÌ‚' => 'Ä', 'Ğ' => 'Äž', 'ğ' => 'ÄŸ', 'Ġ' => 'Ä ', 'ġ' => 'Ä¡', 'Ģ' => 'Ä¢', 'ģ' => 'Ä£', 'HÌ‚' => 'Ĥ', 'hÌ‚' => 'Ä¥', 'Ĩ' => 'Ĩ', 'ĩ' => 'Ä©', 'IÌ„' => 'Ī', 'iÌ„' => 'Ä«', 'Ĭ' => 'Ĭ', 'ĭ' => 'Ä­', 'Į' => 'Ä®', 'į' => 'į', 'İ' => 'Ä°', 'JÌ‚' => 'Ä´', 'jÌ‚' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'Ä·', 'LÌ' => 'Ĺ', 'lÌ' => 'ĺ', 'Ļ' => 'Ä»', 'ļ' => 'ļ', 'LÌŒ' => 'Ľ', 'lÌŒ' => 'ľ', 'NÌ' => 'Ń', 'nÌ' => 'Å„', 'Ņ' => 'Å…', 'ņ' => 'ņ', 'NÌŒ' => 'Ň', 'nÌŒ' => 'ň', 'OÌ„' => 'ÅŒ', 'oÌ„' => 'Å', 'Ŏ' => 'ÅŽ', 'ŏ' => 'Å', 'OÌ‹' => 'Å', 'oÌ‹' => 'Å‘', 'RÌ' => 'Å”', 'rÌ' => 'Å•', 'Ŗ' => 'Å–', 'ŗ' => 'Å—', 'RÌŒ' => 'Ř', 'rÌŒ' => 'Å™', 'SÌ' => 'Åš', 'sÌ' => 'Å›', 'SÌ‚' => 'Åœ', 'sÌ‚' => 'Å', 'Ş' => 'Åž', 'ş' => 'ÅŸ', 'SÌŒ' => 'Å ', 'sÌŒ' => 'Å¡', 'Ţ' => 'Å¢', 'ţ' => 'Å£', 'TÌŒ' => 'Ť', 'tÌŒ' => 'Å¥', 'Ũ' => 'Ũ', 'ũ' => 'Å©', 'UÌ„' => 'Ū', 'uÌ„' => 'Å«', 'Ŭ' => 'Ŭ', 'ŭ' => 'Å­', 'UÌŠ' => 'Å®', 'uÌŠ' => 'ů', 'UÌ‹' => 'Å°', 'uÌ‹' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'WÌ‚' => 'Å´', 'wÌ‚' => 'ŵ', 'YÌ‚' => 'Ŷ', 'yÌ‚' => 'Å·', 'Ÿ' => 'Ÿ', 'ZÌ' => 'Ź', 'zÌ' => 'ź', 'Ż' => 'Å»', 'ż' => 'ż', 'ZÌŒ' => 'Ž', 'zÌŒ' => 'ž', 'OÌ›' => 'Æ ', 'oÌ›' => 'Æ¡', 'UÌ›' => 'Ư', 'uÌ›' => 'Æ°', 'AÌŒ' => 'Ç', 'aÌŒ' => 'ÇŽ', 'IÌŒ' => 'Ç', 'iÌŒ' => 'Ç', 'OÌŒ' => 'Ç‘', 'oÌŒ' => 'Ç’', 'UÌŒ' => 'Ç“', 'uÌŒ' => 'Ç”', 'Ǖ' => 'Ç•', 'ǖ' => 'Ç–', 'ÃœÌ' => 'Ç—', 'üÌ' => 'ǘ', 'Ǚ' => 'Ç™', 'ǚ' => 'Çš', 'Ǜ' => 'Ç›', 'ǜ' => 'Çœ', 'Ǟ' => 'Çž', 'ǟ' => 'ÇŸ', 'Ǡ' => 'Ç ', 'ǡ' => 'Ç¡', 'Ǣ' => 'Ç¢', 'ǣ' => 'Ç£', 'GÌŒ' => 'Ǧ', 'gÌŒ' => 'ǧ', 'KÌŒ' => 'Ǩ', 'kÌŒ' => 'Ç©', 'Ǫ' => 'Ǫ', 'ǫ' => 'Ç«', 'Ǭ' => 'Ǭ', 'Ç«Ì„' => 'Ç­', 'Æ·ÌŒ' => 'Ç®', 'Ê’ÌŒ' => 'ǯ', 'jÌŒ' => 'Ç°', 'GÌ' => 'Ç´', 'gÌ' => 'ǵ', 'NÌ€' => 'Ǹ', 'nÌ€' => 'ǹ', 'Ã…Ì' => 'Ǻ', 'Ã¥Ì' => 'Ç»', 'ÆÌ' => 'Ǽ', 'æÌ' => 'ǽ', 'ØÌ' => 'Ǿ', 'øÌ' => 'Ç¿', 'AÌ' => 'È€', 'aÌ' => 'È', 'AÌ‘' => 'È‚', 'aÌ‘' => 'ȃ', 'EÌ' => 'È„', 'eÌ' => 'È…', 'EÌ‘' => 'Ȇ', 'eÌ‘' => 'ȇ', 'IÌ' => 'Ȉ', 'iÌ' => 'ȉ', 'IÌ‘' => 'ÈŠ', 'iÌ‘' => 'È‹', 'OÌ' => 'ÈŒ', 'oÌ' => 'È', 'OÌ‘' => 'ÈŽ', 'oÌ‘' => 'È', 'RÌ' => 'È', 'rÌ' => 'È‘', 'RÌ‘' => 'È’', 'rÌ‘' => 'È“', 'UÌ' => 'È”', 'uÌ' => 'È•', 'UÌ‘' => 'È–', 'uÌ‘' => 'È—', 'Ș' => 'Ș', 'ș' => 'È™', 'Ț' => 'Èš', 'ț' => 'È›', 'HÌŒ' => 'Èž', 'hÌŒ' => 'ÈŸ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'È©', 'Ȫ' => 'Ȫ', 'ȫ' => 'È«', 'Ȭ' => 'Ȭ', 'ȭ' => 'È­', 'Ȯ' => 'È®', 'ȯ' => 'ȯ', 'Ȱ' => 'È°', 'ȱ' => 'ȱ', 'YÌ„' => 'Ȳ', 'yÌ„' => 'ȳ', '¨Ì' => 'Î…', 'ΑÌ' => 'Ά', 'ΕÌ' => 'Έ', 'ΗÌ' => 'Ή', 'ΙÌ' => 'Ί', 'ΟÌ' => 'ÎŒ', 'Î¥Ì' => 'ÎŽ', 'ΩÌ' => 'Î', 'ÏŠÌ' => 'Î', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'αÌ' => 'ά', 'εÌ' => 'έ', 'ηÌ' => 'ή', 'ιÌ' => 'ί', 'Ï‹Ì' => 'ΰ', 'ϊ' => 'ÏŠ', 'ϋ' => 'Ï‹', 'οÌ' => 'ÏŒ', 'Ï…Ì' => 'Ï', 'ωÌ' => 'ÏŽ', 'Ï’Ì' => 'Ï“', 'ϔ' => 'Ï”', 'Ѐ' => 'Ѐ', 'Ё' => 'Ð', 'ГÌ' => 'Ѓ', 'Ї' => 'Ї', 'КÌ' => 'ÐŒ', 'Ѝ' => 'Ð', 'Ў' => 'ÐŽ', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'Ñ', 'ё' => 'Ñ‘', 'гÌ' => 'Ñ“', 'ї' => 'Ñ—', 'кÌ' => 'Ñœ', 'ѝ' => 'Ñ', 'ў' => 'Ñž', 'Ñ´Ì' => 'Ѷ', 'ѵÌ' => 'Ñ·', 'Ӂ' => 'Ó', 'ӂ' => 'Ó‚', 'Ð̆' => 'Ó', 'ӑ' => 'Ó‘', 'Ð̈' => 'Ó’', 'ӓ' => 'Ó“', 'Ӗ' => 'Ó–', 'ӗ' => 'Ó—', 'Ӛ' => 'Óš', 'ӛ' => 'Ó›', 'Ӝ' => 'Óœ', 'ӝ' => 'Ó', 'Ӟ' => 'Óž', 'ӟ' => 'ÓŸ', 'Ӣ' => 'Ó¢', 'ӣ' => 'Ó£', 'Ӥ' => 'Ó¤', 'ӥ' => 'Ó¥', 'Ӧ' => 'Ó¦', 'ӧ' => 'Ó§', 'Ӫ' => 'Óª', 'ӫ' => 'Ó«', 'Ӭ' => 'Ó¬', 'Ñ̈' => 'Ó­', 'Ӯ' => 'Ó®', 'ӯ' => 'Ó¯', 'Ӱ' => 'Ó°', 'ӱ' => 'Ó±', 'Ӳ' => 'Ó²', 'ӳ' => 'Ó³', 'Ӵ' => 'Ó´', 'ӵ' => 'Óµ', 'Ӹ' => 'Ó¸', 'ӹ' => 'Ó¹', 'آ' => 'Ø¢', 'أ' => 'Ø£', 'ÙˆÙ”' => 'ؤ', 'إ' => 'Ø¥', 'ÙŠÙ”' => 'ئ', 'Û•Ù”' => 'Û€', 'ÛÙ”' => 'Û‚', 'Û’Ù”' => 'Û“', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ୈ' => 'à­ˆ', 'ୋ' => 'à­‹', 'ୌ' => 'à­Œ', 'ஔ' => 'à®”', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'à³€', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'à·š', 'à·™à·' => 'à·œ', 'ෝ' => 'à·', 'ෞ' => 'à·ž', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'á¬á¬µ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'á­€', 'ᭁ' => 'á­', 'ᭃ' => 'á­ƒ', 'AÌ¥' => 'Ḁ', 'aÌ¥' => 'á¸', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'BÌ£' => 'Ḅ', 'bÌ£' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'ÇÌ' => 'Ḉ', 'çÌ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'DÌ£' => 'Ḍ', 'dÌ£' => 'á¸', 'Ḏ' => 'Ḏ', 'ḏ' => 'á¸', 'Ḑ' => 'á¸', 'ḑ' => 'ḑ', 'DÌ­' => 'Ḓ', 'dÌ­' => 'ḓ', 'Ä’Ì€' => 'Ḕ', 'Ä“Ì€' => 'ḕ', 'Ä’Ì' => 'Ḗ', 'Ä“Ì' => 'ḗ', 'EÌ­' => 'Ḙ', 'eÌ­' => 'ḙ', 'EÌ°' => 'Ḛ', 'eÌ°' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'á¸', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'GÌ„' => 'Ḡ', 'gÌ„' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'HÌ£' => 'Ḥ', 'hÌ£' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'HÌ®' => 'Ḫ', 'hÌ®' => 'ḫ', 'IÌ°' => 'Ḭ', 'iÌ°' => 'ḭ', 'ÃÌ' => 'Ḯ', 'ïÌ' => 'ḯ', 'KÌ' => 'Ḱ', 'kÌ' => 'ḱ', 'KÌ£' => 'Ḳ', 'kÌ£' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'LÌ£' => 'Ḷ', 'lÌ£' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'LÌ­' => 'Ḽ', 'lÌ­' => 'ḽ', 'MÌ' => 'Ḿ', 'mÌ' => 'ḿ', 'Ṁ' => 'á¹€', 'ṁ' => 'á¹', 'MÌ£' => 'Ṃ', 'mÌ£' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'á¹…', 'NÌ£' => 'Ṇ', 'nÌ£' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'NÌ­' => 'Ṋ', 'nÌ­' => 'ṋ', 'ÕÌ' => 'Ṍ', 'õÌ' => 'á¹', 'Ṏ' => 'Ṏ', 'ṏ' => 'á¹', 'Ṑ' => 'á¹', 'ÅÌ€' => 'ṑ', 'ÅŒÌ' => 'á¹’', 'ÅÌ' => 'ṓ', 'PÌ' => 'á¹”', 'pÌ' => 'ṕ', 'Ṗ' => 'á¹–', 'ṗ' => 'á¹—', 'Ṙ' => 'Ṙ', 'ṙ' => 'á¹™', 'RÌ£' => 'Ṛ', 'rÌ£' => 'á¹›', 'Ṝ' => 'Ṝ', 'ṝ' => 'á¹', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'á¹ ', 'ṡ' => 'ṡ', 'SÌ£' => 'á¹¢', 'sÌ£' => 'á¹£', 'Ṥ' => 'Ṥ', 'ṥ' => 'á¹¥', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'TÌ£' => 'Ṭ', 'tÌ£' => 'á¹­', 'Ṯ' => 'á¹®', 'ṯ' => 'ṯ', 'TÌ­' => 'á¹°', 'tÌ­' => 'á¹±', 'Ṳ' => 'á¹²', 'ṳ' => 'á¹³', 'UÌ°' => 'á¹´', 'uÌ°' => 'á¹µ', 'UÌ­' => 'Ṷ', 'uÌ­' => 'á¹·', 'ŨÌ' => 'Ṹ', 'Å©Ì' => 'á¹¹', 'Ṻ' => 'Ṻ', 'ṻ' => 'á¹»', 'Ṽ' => 'á¹¼', 'ṽ' => 'á¹½', 'VÌ£' => 'á¹¾', 'vÌ£' => 'ṿ', 'WÌ€' => 'Ẁ', 'wÌ€' => 'áº', 'WÌ' => 'Ẃ', 'wÌ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'WÌ£' => 'Ẉ', 'wÌ£' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'áº', 'Ẏ' => 'Ẏ', 'ẏ' => 'áº', 'ZÌ‚' => 'áº', 'zÌ‚' => 'ẑ', 'ZÌ£' => 'Ẓ', 'zÌ£' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'wÌŠ' => 'ẘ', 'yÌŠ' => 'ẙ', 'ẛ' => 'ẛ', 'AÌ£' => 'Ạ', 'aÌ£' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'ÂÌ' => 'Ấ', 'âÌ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ä‚Ì' => 'Ắ', 'ăÌ' => 'ắ', 'Ä‚Ì€' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'EÌ£' => 'Ẹ', 'eÌ£' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'ÊÌ' => 'Ế', 'êÌ' => 'ế', 'Ề' => 'Ề', 'ề' => 'á»', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'á»…', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'IÌ£' => 'Ị', 'iÌ£' => 'ị', 'OÌ£' => 'Ọ', 'oÌ£' => 'á»', 'Ỏ' => 'Ỏ', 'ỏ' => 'á»', 'ÔÌ' => 'á»', 'ôÌ' => 'ố', 'Ồ' => 'á»’', 'ồ' => 'ồ', 'Ổ' => 'á»”', 'ổ' => 'ổ', 'Ỗ' => 'á»–', 'ỗ' => 'á»—', 'Ộ' => 'Ộ', 'á»Ì‚' => 'á»™', 'Æ Ì' => 'Ớ', 'Æ¡Ì' => 'á»›', 'Ờ' => 'Ờ', 'Æ¡Ì€' => 'á»', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'á» ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'Æ¡Ì£' => 'ợ', 'UÌ£' => 'Ụ', 'uÌ£' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'ƯÌ' => 'Ứ', 'Æ°Ì' => 'ứ', 'Ừ' => 'Ừ', 'Æ°Ì€' => 'ừ', 'Ử' => 'Ử', 'ử' => 'á»­', 'Ữ' => 'á»®', 'ữ' => 'ữ', 'Ự' => 'á»°', 'Æ°Ì£' => 'á»±', 'YÌ€' => 'Ỳ', 'yÌ€' => 'ỳ', 'YÌ£' => 'á»´', 'yÌ£' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'á»·', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'á¼€', 'ἁ' => 'á¼', 'ἂ' => 'ἂ', 'á¼Ì€' => 'ἃ', 'á¼€Ì' => 'ἄ', 'á¼Ì' => 'á¼…', 'ἆ' => 'ἆ', 'á¼Í‚' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'ἈÌ' => 'Ἄ', 'ἉÌ' => 'á¼', 'Ἆ' => 'Ἆ', 'Ἇ' => 'á¼', 'ἐ' => 'á¼', 'ἑ' => 'ἑ', 'á¼Ì€' => 'á¼’', 'ἓ' => 'ἓ', 'á¼Ì' => 'á¼”', 'ἑÌ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'á¼™', 'Ἒ' => 'Ἒ', 'Ἓ' => 'á¼›', 'ἘÌ' => 'Ἔ', 'á¼™Ì' => 'á¼', 'ἠ' => 'á¼ ', 'ἡ' => 'ἡ', 'ἢ' => 'á¼¢', 'ἣ' => 'á¼£', 'á¼ Ì' => 'ἤ', 'ἡÌ' => 'á¼¥', 'á¼ Í‚' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'ἨÌ' => 'Ἤ', 'ἩÌ' => 'á¼­', 'Ἦ' => 'á¼®', 'Ἧ' => 'Ἧ', 'ἰ' => 'á¼°', 'ἱ' => 'á¼±', 'á¼°Ì€' => 'á¼²', 'ἳ' => 'á¼³', 'á¼°Ì' => 'á¼´', 'á¼±Ì' => 'á¼µ', 'á¼°Í‚' => 'ἶ', 'ἷ' => 'á¼·', 'Ἰ' => 'Ἰ', 'Ἱ' => 'á¼¹', 'Ἲ' => 'Ἲ', 'Ἳ' => 'á¼»', 'ἸÌ' => 'á¼¼', 'á¼¹Ì' => 'á¼½', 'Ἶ' => 'á¼¾', 'Ἷ' => 'Ἷ', 'ὀ' => 'á½€', 'ὁ' => 'á½', 'ὂ' => 'ὂ', 'á½Ì€' => 'ὃ', 'á½€Ì' => 'ὄ', 'á½Ì' => 'á½…', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'ὈÌ' => 'Ὄ', 'ὉÌ' => 'á½', 'Ï…Ì“' => 'á½', 'Ï…Ì”' => 'ὑ', 'á½Ì€' => 'á½’', 'ὓ' => 'ὓ', 'á½Ì' => 'á½”', 'ὑÌ' => 'ὕ', 'á½Í‚' => 'á½–', 'ὗ' => 'á½—', 'Ὑ' => 'á½™', 'Ὓ' => 'á½›', 'á½™Ì' => 'á½', 'Ὗ' => 'Ὗ', 'ὠ' => 'á½ ', 'ὡ' => 'ὡ', 'ὢ' => 'á½¢', 'ὣ' => 'á½£', 'á½ Ì' => 'ὤ', 'ὡÌ' => 'á½¥', 'á½ Í‚' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'ὨÌ' => 'Ὤ', 'ὩÌ' => 'á½­', 'Ὦ' => 'á½®', 'Ὧ' => 'Ὧ', 'ὰ' => 'á½°', 'ὲ' => 'á½²', 'ὴ' => 'á½´', 'ὶ' => 'ὶ', 'ὸ' => 'ὸ', 'Ï…Ì€' => 'ὺ', 'ὼ' => 'á½¼', 'ᾀ' => 'á¾€', 'á¼Í…' => 'á¾', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'á¼…Í…' => 'á¾…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'á¼Í…' => 'á¾', 'ᾎ' => 'ᾎ', 'á¼Í…' => 'á¾', 'á¼ Í…' => 'á¾', 'ᾑ' => 'ᾑ', 'ᾒ' => 'á¾’', 'ᾓ' => 'ᾓ', 'ᾔ' => 'á¾”', 'ᾕ' => 'ᾕ', 'ᾖ' => 'á¾–', 'ᾗ' => 'á¾—', 'ᾘ' => 'ᾘ', 'ᾙ' => 'á¾™', 'ᾚ' => 'ᾚ', 'ᾛ' => 'á¾›', 'ᾜ' => 'ᾜ', 'á¼­Í…' => 'á¾', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á½ Í…' => 'á¾ ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'á¾¢', 'ᾣ' => 'á¾£', 'ᾤ' => 'ᾤ', 'ᾥ' => 'á¾¥', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'á½­Í…' => 'á¾­', 'ᾮ' => 'á¾®', 'ᾯ' => 'ᾯ', 'ᾰ' => 'á¾°', 'ᾱ' => 'á¾±', 'á½°Í…' => 'á¾²', 'ᾳ' => 'á¾³', 'ᾴ' => 'á¾´', 'ᾶ' => 'ᾶ', 'ᾷ' => 'á¾·', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'á¾¹', 'Ὰ' => 'Ὰ', 'ᾼ' => 'á¾¼', '῁' => 'á¿', 'á½´Í…' => 'á¿‚', 'ῃ' => 'ῃ', 'ῄ' => 'á¿„', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Ὴ' => 'á¿Š', 'ῌ' => 'á¿Œ', '῍' => 'á¿', '᾿Ì' => 'á¿Ž', '῏' => 'á¿', 'ῐ' => 'á¿', 'ῑ' => 'á¿‘', 'ÏŠÌ€' => 'á¿’', 'ῖ' => 'á¿–', 'ÏŠÍ‚' => 'á¿—', 'Ῐ' => 'Ῐ', 'Ῑ' => 'á¿™', 'Ὶ' => 'á¿š', '῝' => 'á¿', '῾Ì' => 'á¿ž', '῟' => 'á¿Ÿ', 'ῠ' => 'á¿ ', 'Ï…Ì„' => 'á¿¡', 'Ï‹Ì€' => 'á¿¢', 'ÏÌ“' => 'ῤ', 'ÏÌ”' => 'á¿¥', 'Ï…Í‚' => 'ῦ', 'Ï‹Í‚' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'á¿©', 'Ὺ' => 'Ὺ', 'Ῥ' => 'Ῥ', '῭' => 'á¿­', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ÏŽÍ…' => 'á¿´', 'ῶ' => 'ῶ', 'ῷ' => 'á¿·', 'Ὸ' => 'Ὸ', 'Ὼ' => 'Ὼ', 'ῼ' => 'ῼ', 'â†Ì¸' => '↚', '↛' => '↛', '↮' => '↮', 'â‡Ì¸' => 'â‡', '⇎' => '⇎', '⇏' => 'â‡', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => 'â‰', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', 'â‰Ì¸' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => 'âŠ', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => 'â‹ ', '⋡' => 'â‹¡', '⋢' => 'â‹¢', '⋣' => 'â‹£', '⋪' => '⋪', '⋫' => 'â‹«', '⋬' => '⋬', '⋭' => 'â‹­', 'ã‹ã‚™' => 'ãŒ', 'ãã‚™' => 'ãŽ', 'ãã‚™' => 'ã', 'ã‘ã‚™' => 'ã’', 'ã“ã‚™' => 'ã”', 'ã•ã‚™' => 'ã–', 'ã—ã‚™' => 'ã˜', 'ã™ã‚™' => 'ãš', 'ã›ã‚™' => 'ãœ', 'ãã‚™' => 'ãž', 'ãŸã‚™' => 'ã ', 'ã¡ã‚™' => 'ã¢', 'ã¤ã‚™' => 'ã¥', 'ã¦ã‚™' => 'ã§', 'ã¨ã‚™' => 'ã©', 'ã¯ã‚™' => 'ã°', 'ã¯ã‚š' => 'ã±', 'ã²ã‚™' => 'ã³', 'ã²ã‚š' => 'ã´', 'ãµã‚™' => 'ã¶', 'ãµã‚š' => 'ã·', 'ã¸ã‚™' => 'ã¹', 'ã¸ã‚š' => 'ãº', 'ã»ã‚™' => 'ã¼', 'ã»ã‚š' => 'ã½', 'ã†ã‚™' => 'ã‚”', 'ã‚ã‚™' => 'ã‚ž', 'ã‚«ã‚™' => 'ガ', 'ã‚­ã‚™' => 'ã‚®', 'グ' => 'ã‚°', 'ゲ' => 'ゲ', 'ゴ' => 'ã‚´', 'ザ' => 'ザ', 'ã‚·ã‚™' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ã‚¿ã‚™' => 'ダ', 'ãƒã‚™' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒã‚™' => 'ãƒ', 'ãƒã‚š' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ãƒ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '𑂚' => 'ð‘‚š', '𑂜' => 'ð‘‚œ', '𑂫' => 'ð‘‚«', '𑄮' => 'ð‘„®', '𑄯' => '𑄯', 'ð‘‡ð‘Œ¾' => 'ð‘‹', 'ð‘‡ð‘—' => 'ð‘Œ', '𑒻' => 'ð‘’»', '𑒼' => 'ð‘’¼', '𑒾' => 'ð‘’¾', '𑖺' => 'ð‘–º', '𑖻' => 'ð‘–»', '𑤸' => '𑤸'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php000064400000104202147600374260033007 0ustar00addons/dropboxaddon 'AÌ€', 'Ã' => 'AÌ', 'Â' => 'AÌ‚', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Ã…' => 'AÌŠ', 'Ç' => 'Ç', 'È' => 'EÌ€', 'É' => 'EÌ', 'Ê' => 'EÌ‚', 'Ë' => 'Ë', 'ÃŒ' => 'IÌ€', 'Ã' => 'IÌ', 'ÃŽ' => 'IÌ‚', 'Ã' => 'Ï', 'Ñ' => 'Ñ', 'Ã’' => 'OÌ€', 'Ó' => 'OÌ', 'Ô' => 'OÌ‚', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'UÌ€', 'Ú' => 'UÌ', 'Û' => 'UÌ‚', 'Ãœ' => 'Ü', 'Ã' => 'YÌ', 'à' => 'aÌ€', 'á' => 'aÌ', 'â' => 'aÌ‚', 'ã' => 'ã', 'ä' => 'ä', 'Ã¥' => 'aÌŠ', 'ç' => 'ç', 'è' => 'eÌ€', 'é' => 'eÌ', 'ê' => 'eÌ‚', 'ë' => 'ë', 'ì' => 'iÌ€', 'í' => 'iÌ', 'î' => 'iÌ‚', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'oÌ€', 'ó' => 'oÌ', 'ô' => 'oÌ‚', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'uÌ€', 'ú' => 'uÌ', 'û' => 'uÌ‚', 'ü' => 'ü', 'ý' => 'yÌ', 'ÿ' => 'ÿ', 'Ä€' => 'AÌ„', 'Ä' => 'aÌ„', 'Ä‚' => 'Ă', 'ă' => 'ă', 'Ä„' => 'Ą', 'Ä…' => 'ą', 'Ć' => 'CÌ', 'ć' => 'cÌ', 'Ĉ' => 'CÌ‚', 'ĉ' => 'cÌ‚', 'ÄŠ' => 'Ċ', 'Ä‹' => 'ċ', 'ÄŒ' => 'CÌŒ', 'Ä' => 'cÌŒ', 'ÄŽ' => 'DÌŒ', 'Ä' => 'dÌŒ', 'Ä’' => 'EÌ„', 'Ä“' => 'eÌ„', 'Ä”' => 'Ĕ', 'Ä•' => 'ĕ', 'Ä–' => 'Ė', 'Ä—' => 'ė', 'Ę' => 'Ę', 'Ä™' => 'ę', 'Äš' => 'EÌŒ', 'Ä›' => 'eÌŒ', 'Äœ' => 'GÌ‚', 'Ä' => 'gÌ‚', 'Äž' => 'Ğ', 'ÄŸ' => 'ğ', 'Ä ' => 'Ġ', 'Ä¡' => 'ġ', 'Ä¢' => 'Ģ', 'Ä£' => 'ģ', 'Ĥ' => 'HÌ‚', 'Ä¥' => 'hÌ‚', 'Ĩ' => 'Ĩ', 'Ä©' => 'ĩ', 'Ī' => 'IÌ„', 'Ä«' => 'iÌ„', 'Ĭ' => 'Ĭ', 'Ä­' => 'ĭ', 'Ä®' => 'Į', 'į' => 'į', 'Ä°' => 'İ', 'Ä´' => 'JÌ‚', 'ĵ' => 'jÌ‚', 'Ķ' => 'Ķ', 'Ä·' => 'ķ', 'Ĺ' => 'LÌ', 'ĺ' => 'lÌ', 'Ä»' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'LÌŒ', 'ľ' => 'lÌŒ', 'Ń' => 'NÌ', 'Å„' => 'nÌ', 'Å…' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'NÌŒ', 'ň' => 'nÌŒ', 'ÅŒ' => 'OÌ„', 'Å' => 'oÌ„', 'ÅŽ' => 'Ŏ', 'Å' => 'ŏ', 'Å' => 'OÌ‹', 'Å‘' => 'oÌ‹', 'Å”' => 'RÌ', 'Å•' => 'rÌ', 'Å–' => 'Ŗ', 'Å—' => 'ŗ', 'Ř' => 'RÌŒ', 'Å™' => 'rÌŒ', 'Åš' => 'SÌ', 'Å›' => 'sÌ', 'Åœ' => 'SÌ‚', 'Å' => 'sÌ‚', 'Åž' => 'Ş', 'ÅŸ' => 'ş', 'Å ' => 'SÌŒ', 'Å¡' => 'sÌŒ', 'Å¢' => 'Ţ', 'Å£' => 'ţ', 'Ť' => 'TÌŒ', 'Å¥' => 'tÌŒ', 'Ũ' => 'Ũ', 'Å©' => 'ũ', 'Ū' => 'UÌ„', 'Å«' => 'uÌ„', 'Ŭ' => 'Ŭ', 'Å­' => 'ŭ', 'Å®' => 'UÌŠ', 'ů' => 'uÌŠ', 'Å°' => 'UÌ‹', 'ű' => 'uÌ‹', 'Ų' => 'Ų', 'ų' => 'ų', 'Å´' => 'WÌ‚', 'ŵ' => 'wÌ‚', 'Ŷ' => 'YÌ‚', 'Å·' => 'yÌ‚', 'Ÿ' => 'Ÿ', 'Ź' => 'ZÌ', 'ź' => 'zÌ', 'Å»' => 'Ż', 'ż' => 'ż', 'Ž' => 'ZÌŒ', 'ž' => 'zÌŒ', 'Æ ' => 'OÌ›', 'Æ¡' => 'oÌ›', 'Ư' => 'UÌ›', 'Æ°' => 'uÌ›', 'Ç' => 'AÌŒ', 'ÇŽ' => 'aÌŒ', 'Ç' => 'IÌŒ', 'Ç' => 'iÌŒ', 'Ç‘' => 'OÌŒ', 'Ç’' => 'oÌŒ', 'Ç“' => 'UÌŒ', 'Ç”' => 'uÌŒ', 'Ç•' => 'Ǖ', 'Ç–' => 'ǖ', 'Ç—' => 'ÜÌ', 'ǘ' => 'üÌ', 'Ç™' => 'Ǚ', 'Çš' => 'ǚ', 'Ç›' => 'Ǜ', 'Çœ' => 'ǜ', 'Çž' => 'Ǟ', 'ÇŸ' => 'ǟ', 'Ç ' => 'Ǡ', 'Ç¡' => 'ǡ', 'Ç¢' => 'Ǣ', 'Ç£' => 'ǣ', 'Ǧ' => 'GÌŒ', 'ǧ' => 'gÌŒ', 'Ǩ' => 'KÌŒ', 'Ç©' => 'kÌŒ', 'Ǫ' => 'Ǫ', 'Ç«' => 'ǫ', 'Ǭ' => 'Ǭ', 'Ç­' => 'ǭ', 'Ç®' => 'Æ·ÌŒ', 'ǯ' => 'Ê’ÌŒ', 'Ç°' => 'jÌŒ', 'Ç´' => 'GÌ', 'ǵ' => 'gÌ', 'Ǹ' => 'NÌ€', 'ǹ' => 'nÌ€', 'Ǻ' => 'AÌŠÌ', 'Ç»' => 'aÌŠÌ', 'Ǽ' => 'ÆÌ', 'ǽ' => 'æÌ', 'Ǿ' => 'ØÌ', 'Ç¿' => 'øÌ', 'È€' => 'AÌ', 'È' => 'aÌ', 'È‚' => 'AÌ‘', 'ȃ' => 'aÌ‘', 'È„' => 'EÌ', 'È…' => 'eÌ', 'Ȇ' => 'EÌ‘', 'ȇ' => 'eÌ‘', 'Ȉ' => 'IÌ', 'ȉ' => 'iÌ', 'ÈŠ' => 'IÌ‘', 'È‹' => 'iÌ‘', 'ÈŒ' => 'OÌ', 'È' => 'oÌ', 'ÈŽ' => 'OÌ‘', 'È' => 'oÌ‘', 'È' => 'RÌ', 'È‘' => 'rÌ', 'È’' => 'RÌ‘', 'È“' => 'rÌ‘', 'È”' => 'UÌ', 'È•' => 'uÌ', 'È–' => 'UÌ‘', 'È—' => 'uÌ‘', 'Ș' => 'Ș', 'È™' => 'ș', 'Èš' => 'Ț', 'È›' => 'ț', 'Èž' => 'HÌŒ', 'ÈŸ' => 'hÌŒ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'È©' => 'ȩ', 'Ȫ' => 'Ȫ', 'È«' => 'ȫ', 'Ȭ' => 'Ȭ', 'È­' => 'ȭ', 'È®' => 'Ȯ', 'ȯ' => 'ȯ', 'È°' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'YÌ„', 'ȳ' => 'yÌ„', 'Í€' => 'Ì€', 'Í' => 'Ì', '̓' => 'Ì“', 'Í„' => '̈Ì', 'Í´' => 'ʹ', ';' => ';', 'Î…' => '¨Ì', 'Ά' => 'ΑÌ', '·' => '·', 'Έ' => 'ΕÌ', 'Ή' => 'ΗÌ', 'Ί' => 'ΙÌ', 'ÎŒ' => 'ΟÌ', 'ÎŽ' => 'Î¥Ì', 'Î' => 'ΩÌ', 'Î' => 'ϊÌ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'αÌ', 'έ' => 'εÌ', 'ή' => 'ηÌ', 'ί' => 'ιÌ', 'ΰ' => 'ϋÌ', 'ÏŠ' => 'ϊ', 'Ï‹' => 'ϋ', 'ÏŒ' => 'οÌ', 'Ï' => 'Ï…Ì', 'ÏŽ' => 'ωÌ', 'Ï“' => 'Ï’Ì', 'Ï”' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ð' => 'Ё', 'Ѓ' => 'ГÌ', 'Ї' => 'Ї', 'ÐŒ' => 'КÌ', 'Ð' => 'Ѝ', 'ÐŽ' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'Ñ' => 'ѐ', 'Ñ‘' => 'ё', 'Ñ“' => 'гÌ', 'Ñ—' => 'ї', 'Ñœ' => 'кÌ', 'Ñ' => 'ѝ', 'Ñž' => 'ў', 'Ѷ' => 'Ñ´Ì', 'Ñ·' => 'ѵÌ', 'Ó' => 'Ӂ', 'Ó‚' => 'ӂ', 'Ó' => 'Ð̆', 'Ó‘' => 'ӑ', 'Ó’' => 'Ð̈', 'Ó“' => 'ӓ', 'Ó–' => 'Ӗ', 'Ó—' => 'ӗ', 'Óš' => 'Ӛ', 'Ó›' => 'ӛ', 'Óœ' => 'Ӝ', 'Ó' => 'ӝ', 'Óž' => 'Ӟ', 'ÓŸ' => 'ӟ', 'Ó¢' => 'Ӣ', 'Ó£' => 'ӣ', 'Ó¤' => 'Ӥ', 'Ó¥' => 'ӥ', 'Ó¦' => 'Ӧ', 'Ó§' => 'ӧ', 'Óª' => 'Ӫ', 'Ó«' => 'ӫ', 'Ó¬' => 'Ӭ', 'Ó­' => 'Ñ̈', 'Ó®' => 'Ӯ', 'Ó¯' => 'ӯ', 'Ó°' => 'Ӱ', 'Ó±' => 'ӱ', 'Ó²' => 'Ӳ', 'Ó³' => 'ӳ', 'Ó´' => 'Ӵ', 'Óµ' => 'ӵ', 'Ó¸' => 'Ӹ', 'Ó¹' => 'ӹ', 'Ø¢' => 'آ', 'Ø£' => 'أ', 'ؤ' => 'ÙˆÙ”', 'Ø¥' => 'إ', 'ئ' => 'ÙŠÙ”', 'Û€' => 'Û•Ù”', 'Û‚' => 'ÛÙ”', 'Û“' => 'Û’Ù”', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'क़' => 'क़', 'ख़' => 'ख़', 'ग़' => 'ग़', 'ज़' => 'ज़', 'ड़' => 'ड़', 'à¥' => 'ढ़', 'फ़' => 'फ़', 'य़' => 'य़', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ড়' => 'ড়', 'à§' => 'ঢ়', 'য়' => 'য়', 'ਲ਼' => 'ਲ਼', 'ਸ਼' => 'ਸ਼', 'à©™' => 'ਖ਼', 'à©š' => 'ਗ਼', 'à©›' => 'ਜ਼', 'à©ž' => 'ਫ਼', 'à­ˆ' => 'ୈ', 'à­‹' => 'ୋ', 'à­Œ' => 'ୌ', 'à­œ' => 'ଡ଼', 'à­' => 'ଢ଼', 'à®”' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'à³€' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'à·š' => 'ේ', 'à·œ' => 'à·™à·', 'à·' => 'à·™à·à·Š', 'à·ž' => 'ෞ', 'གྷ' => 'གྷ', 'à½' => 'ཌྷ', 'དྷ' => 'དྷ', 'བྷ' => 'བྷ', 'ཛྷ' => 'ཛྷ', 'ཀྵ' => 'ཀྵ', 'ཱི' => 'ཱི', 'ཱུ' => 'ཱུ', 'ྲྀ' => 'ྲྀ', 'ླྀ' => 'ླྀ', 'à¾' => 'ཱྀ', 'ྒྷ' => 'ྒྷ', 'à¾' => 'ྜྷ', 'ྡྷ' => 'ྡྷ', 'ྦྷ' => 'ྦྷ', 'ྫྷ' => 'ྫྷ', 'ྐྵ' => 'à¾à¾µ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'á¬á¬µ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'á­€' => 'ᭀ', 'á­' => 'ᭁ', 'á­ƒ' => 'ᭃ', 'Ḁ' => 'AÌ¥', 'á¸' => 'aÌ¥', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'BÌ£', 'ḅ' => 'bÌ£', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'ÇÌ', 'ḉ' => 'çÌ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'DÌ£', 'á¸' => 'dÌ£', 'Ḏ' => 'Ḏ', 'á¸' => 'ḏ', 'á¸' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'DÌ­', 'ḓ' => 'dÌ­', 'Ḕ' => 'EÌ„Ì€', 'ḕ' => 'eÌ„Ì€', 'Ḗ' => 'EÌ„Ì', 'ḗ' => 'eÌ„Ì', 'Ḙ' => 'EÌ­', 'ḙ' => 'eÌ­', 'Ḛ' => 'EÌ°', 'ḛ' => 'eÌ°', 'Ḝ' => 'Ḝ', 'á¸' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'GÌ„', 'ḡ' => 'gÌ„', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'HÌ£', 'ḥ' => 'hÌ£', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'HÌ®', 'ḫ' => 'hÌ®', 'Ḭ' => 'IÌ°', 'ḭ' => 'iÌ°', 'Ḯ' => 'ÏÌ', 'ḯ' => 'ïÌ', 'Ḱ' => 'KÌ', 'ḱ' => 'kÌ', 'Ḳ' => 'KÌ£', 'ḳ' => 'kÌ£', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'LÌ£', 'ḷ' => 'lÌ£', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'LÌ­', 'ḽ' => 'lÌ­', 'Ḿ' => 'MÌ', 'ḿ' => 'mÌ', 'á¹€' => 'Ṁ', 'á¹' => 'ṁ', 'Ṃ' => 'MÌ£', 'ṃ' => 'mÌ£', 'Ṅ' => 'Ṅ', 'á¹…' => 'ṅ', 'Ṇ' => 'NÌ£', 'ṇ' => 'nÌ£', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'NÌ­', 'ṋ' => 'nÌ­', 'Ṍ' => 'ÕÌ', 'á¹' => 'õÌ', 'Ṏ' => 'Ṏ', 'á¹' => 'ṏ', 'á¹' => 'OÌ„Ì€', 'ṑ' => 'oÌ„Ì€', 'á¹’' => 'OÌ„Ì', 'ṓ' => 'oÌ„Ì', 'á¹”' => 'PÌ', 'ṕ' => 'pÌ', 'á¹–' => 'Ṗ', 'á¹—' => 'ṗ', 'Ṙ' => 'Ṙ', 'á¹™' => 'ṙ', 'Ṛ' => 'RÌ£', 'á¹›' => 'rÌ£', 'Ṝ' => 'Ṝ', 'á¹' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'á¹ ' => 'Ṡ', 'ṡ' => 'ṡ', 'á¹¢' => 'SÌ£', 'á¹£' => 'sÌ£', 'Ṥ' => 'SÌ̇', 'á¹¥' => 'sÌ̇', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'TÌ£', 'á¹­' => 'tÌ£', 'á¹®' => 'Ṯ', 'ṯ' => 'ṯ', 'á¹°' => 'TÌ­', 'á¹±' => 'tÌ­', 'á¹²' => 'Ṳ', 'á¹³' => 'ṳ', 'á¹´' => 'UÌ°', 'á¹µ' => 'uÌ°', 'Ṷ' => 'UÌ­', 'á¹·' => 'uÌ­', 'Ṹ' => 'ŨÌ', 'á¹¹' => 'ũÌ', 'Ṻ' => 'Ṻ', 'á¹»' => 'ṻ', 'á¹¼' => 'Ṽ', 'á¹½' => 'ṽ', 'á¹¾' => 'VÌ£', 'ṿ' => 'vÌ£', 'Ẁ' => 'WÌ€', 'áº' => 'wÌ€', 'Ẃ' => 'WÌ', 'ẃ' => 'wÌ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'WÌ£', 'ẉ' => 'wÌ£', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'áº' => 'ẍ', 'Ẏ' => 'Ẏ', 'áº' => 'ẏ', 'áº' => 'ZÌ‚', 'ẑ' => 'zÌ‚', 'Ẓ' => 'ZÌ£', 'ẓ' => 'zÌ£', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'wÌŠ', 'ẙ' => 'yÌŠ', 'ẛ' => 'ẛ', 'Ạ' => 'AÌ£', 'ạ' => 'aÌ£', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'AÌ‚Ì', 'ấ' => 'aÌ‚Ì', 'Ầ' => 'AÌ‚Ì€', 'ầ' => 'aÌ‚Ì€', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'ĂÌ', 'ắ' => 'ăÌ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'EÌ£', 'ẹ' => 'eÌ£', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'EÌ‚Ì', 'ế' => 'eÌ‚Ì', 'Ề' => 'EÌ‚Ì€', 'á»' => 'eÌ‚Ì€', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'á»…' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'IÌ£', 'ị' => 'iÌ£', 'Ọ' => 'OÌ£', 'á»' => 'oÌ£', 'Ỏ' => 'Ỏ', 'á»' => 'ỏ', 'á»' => 'OÌ‚Ì', 'ố' => 'oÌ‚Ì', 'á»’' => 'OÌ‚Ì€', 'ồ' => 'oÌ‚Ì€', 'á»”' => 'Ổ', 'ổ' => 'ổ', 'á»–' => 'Ỗ', 'á»—' => 'ỗ', 'Ộ' => 'Ộ', 'á»™' => 'ộ', 'Ớ' => 'OÌ›Ì', 'á»›' => 'oÌ›Ì', 'Ờ' => 'Ờ', 'á»' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'á» ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'UÌ£', 'ụ' => 'uÌ£', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'UÌ›Ì', 'ứ' => 'uÌ›Ì', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'á»­' => 'ử', 'á»®' => 'Ữ', 'ữ' => 'ữ', 'á»°' => 'Ự', 'á»±' => 'ự', 'Ỳ' => 'YÌ€', 'ỳ' => 'yÌ€', 'á»´' => 'YÌ£', 'ỵ' => 'yÌ£', 'Ỷ' => 'Ỷ', 'á»·' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'á¼€' => 'ἀ', 'á¼' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἀÌ', 'á¼…' => 'ἁÌ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'ἈÌ', 'á¼' => 'ἉÌ', 'Ἆ' => 'Ἆ', 'á¼' => 'Ἇ', 'á¼' => 'ἐ', 'ἑ' => 'ἑ', 'á¼’' => 'ἒ', 'ἓ' => 'ἓ', 'á¼”' => 'ἐÌ', 'ἕ' => 'ἑÌ', 'Ἐ' => 'Ἐ', 'á¼™' => 'Ἑ', 'Ἒ' => 'Ἒ', 'á¼›' => 'Ἓ', 'Ἔ' => 'ἘÌ', 'á¼' => 'ἙÌ', 'á¼ ' => 'ἠ', 'ἡ' => 'ἡ', 'á¼¢' => 'ἢ', 'á¼£' => 'ἣ', 'ἤ' => 'ἠÌ', 'á¼¥' => 'ἡÌ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'ἨÌ', 'á¼­' => 'ἩÌ', 'á¼®' => 'Ἦ', 'Ἧ' => 'Ἧ', 'á¼°' => 'ἰ', 'á¼±' => 'ἱ', 'á¼²' => 'ἲ', 'á¼³' => 'ἳ', 'á¼´' => 'ἰÌ', 'á¼µ' => 'ἱÌ', 'ἶ' => 'ἶ', 'á¼·' => 'ἷ', 'Ἰ' => 'Ἰ', 'á¼¹' => 'Ἱ', 'Ἲ' => 'Ἲ', 'á¼»' => 'Ἳ', 'á¼¼' => 'ἸÌ', 'á¼½' => 'ἹÌ', 'á¼¾' => 'Ἶ', 'Ἷ' => 'Ἷ', 'á½€' => 'ὀ', 'á½' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὀÌ', 'á½…' => 'ὁÌ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'ὈÌ', 'á½' => 'ὉÌ', 'á½' => 'Ï…Ì“', 'ὑ' => 'Ï…Ì”', 'á½’' => 'Ï…Ì“Ì€', 'ὓ' => 'ὓ', 'á½”' => 'Ï…Ì“Ì', 'ὕ' => 'Ï…Ì”Ì', 'á½–' => 'Ï…Ì“Í‚', 'á½—' => 'ὗ', 'á½™' => 'Ὑ', 'á½›' => 'Ὓ', 'á½' => 'ὙÌ', 'Ὗ' => 'Ὗ', 'á½ ' => 'ὠ', 'ὡ' => 'ὡ', 'á½¢' => 'ὢ', 'á½£' => 'ὣ', 'ὤ' => 'ὠÌ', 'á½¥' => 'ὡÌ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'ὨÌ', 'á½­' => 'ὩÌ', 'á½®' => 'Ὦ', 'Ὧ' => 'Ὧ', 'á½°' => 'ὰ', 'á½±' => 'αÌ', 'á½²' => 'ὲ', 'á½³' => 'εÌ', 'á½´' => 'ὴ', 'á½µ' => 'ηÌ', 'ὶ' => 'ὶ', 'á½·' => 'ιÌ', 'ὸ' => 'ὸ', 'á½¹' => 'οÌ', 'ὺ' => 'Ï…Ì€', 'á½»' => 'Ï…Ì', 'á½¼' => 'ὼ', 'á½½' => 'ωÌ', 'á¾€' => 'ᾀ', 'á¾' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ἀÌÍ…', 'á¾…' => 'ἁÌÍ…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ἈÌÍ…', 'á¾' => 'ἉÌÍ…', 'ᾎ' => 'ᾎ', 'á¾' => 'ᾏ', 'á¾' => 'ᾐ', 'ᾑ' => 'ᾑ', 'á¾’' => 'ᾒ', 'ᾓ' => 'ᾓ', 'á¾”' => 'ἠÌÍ…', 'ᾕ' => 'ἡÌÍ…', 'á¾–' => 'ᾖ', 'á¾—' => 'ᾗ', 'ᾘ' => 'ᾘ', 'á¾™' => 'ᾙ', 'ᾚ' => 'ᾚ', 'á¾›' => 'ᾛ', 'ᾜ' => 'ἨÌÍ…', 'á¾' => 'ἩÌÍ…', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á¾ ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'á¾¢' => 'ᾢ', 'á¾£' => 'ᾣ', 'ᾤ' => 'ὠÌÍ…', 'á¾¥' => 'ὡÌÍ…', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ὨÌÍ…', 'á¾­' => 'ὩÌÍ…', 'á¾®' => 'ᾮ', 'ᾯ' => 'ᾯ', 'á¾°' => 'ᾰ', 'á¾±' => 'ᾱ', 'á¾²' => 'ᾲ', 'á¾³' => 'ᾳ', 'á¾´' => 'αÌÍ…', 'ᾶ' => 'ᾶ', 'á¾·' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'á¾¹' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'á¾»' => 'ΑÌ', 'á¾¼' => 'ᾼ', 'á¾¾' => 'ι', 'á¿' => '῁', 'á¿‚' => 'ῂ', 'ῃ' => 'ῃ', 'á¿„' => 'ηÌÍ…', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Έ' => 'ΕÌ', 'á¿Š' => 'Ὴ', 'á¿‹' => 'ΗÌ', 'á¿Œ' => 'ῌ', 'á¿' => '῍', 'á¿Ž' => '᾿Ì', 'á¿' => '῏', 'á¿' => 'ῐ', 'á¿‘' => 'ῑ', 'á¿’' => 'ῒ', 'á¿“' => 'ϊÌ', 'á¿–' => 'ῖ', 'á¿—' => 'ῗ', 'Ῐ' => 'Ῐ', 'á¿™' => 'Ῑ', 'á¿š' => 'Ὶ', 'á¿›' => 'ΙÌ', 'á¿' => '῝', 'á¿ž' => '῾Ì', 'á¿Ÿ' => '῟', 'á¿ ' => 'ῠ', 'á¿¡' => 'Ï…Ì„', 'á¿¢' => 'ῢ', 'á¿£' => 'ϋÌ', 'ῤ' => 'ÏÌ“', 'á¿¥' => 'ÏÌ”', 'ῦ' => 'Ï…Í‚', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'á¿©' => 'Ῡ', 'Ὺ' => 'Ὺ', 'á¿«' => 'Î¥Ì', 'Ῥ' => 'Ῥ', 'á¿­' => '῭', 'á¿®' => '¨Ì', '`' => '`', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'á¿´' => 'ωÌÍ…', 'ῶ' => 'ῶ', 'á¿·' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ό' => 'ΟÌ', 'Ὼ' => 'Ὼ', 'á¿»' => 'ΩÌ', 'ῼ' => 'ῼ', '´' => '´', ' ' => ' ', 'â€' => ' ', 'Ω' => 'Ω', 'K' => 'K', 'â„«' => 'AÌŠ', '↚' => 'â†Ì¸', '↛' => '↛', '↮' => '↮', 'â‡' => 'â‡Ì¸', '⇎' => '⇎', 'â‡' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', 'â‰' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => 'â‰Ì¸', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', 'âŠ' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', 'â‹ ' => '⋠', 'â‹¡' => '⋡', 'â‹¢' => '⋢', 'â‹£' => '⋣', '⋪' => '⋪', 'â‹«' => '⋫', '⋬' => '⋬', 'â‹­' => '⋭', '〈' => '〈', '〉' => '〉', 'â«œ' => 'â«Ì¸', 'ãŒ' => 'ã‹ã‚™', 'ãŽ' => 'ãã‚™', 'ã' => 'ãã‚™', 'ã’' => 'ã‘ã‚™', 'ã”' => 'ã“ã‚™', 'ã–' => 'ã•ã‚™', 'ã˜' => 'ã—ã‚™', 'ãš' => 'ã™ã‚™', 'ãœ' => 'ã›ã‚™', 'ãž' => 'ãã‚™', 'ã ' => 'ãŸã‚™', 'ã¢' => 'ã¡ã‚™', 'ã¥' => 'ã¤ã‚™', 'ã§' => 'ã¦ã‚™', 'ã©' => 'ã¨ã‚™', 'ã°' => 'ã¯ã‚™', 'ã±' => 'ã¯ã‚š', 'ã³' => 'ã²ã‚™', 'ã´' => 'ã²ã‚š', 'ã¶' => 'ãµã‚™', 'ã·' => 'ãµã‚š', 'ã¹' => 'ã¸ã‚™', 'ãº' => 'ã¸ã‚š', 'ã¼' => 'ã»ã‚™', 'ã½' => 'ã»ã‚š', 'ã‚”' => 'ã†ã‚™', 'ã‚ž' => 'ã‚ã‚™', 'ガ' => 'ã‚«ã‚™', 'ã‚®' => 'ã‚­ã‚™', 'ã‚°' => 'グ', 'ゲ' => 'ゲ', 'ã‚´' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ã‚·ã‚™', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ã‚¿ã‚™', 'ヂ' => 'ãƒã‚™', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒ' => 'ãƒã‚™', 'パ' => 'ãƒã‚š', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ãƒ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '豈' => '豈', 'ï¤' => 'æ›´', '車' => '車', '賈' => '賈', '滑' => '滑', '串' => '串', '句' => 'å¥', '龜' => '龜', '龜' => '龜', '契' => '契', '金' => '金', '喇' => 'å–‡', '奈' => '奈', 'ï¤' => '懶', '癩' => '癩', 'ï¤' => 'ç¾…', 'ï¤' => '蘿', '螺' => '螺', '裸' => '裸', '邏' => 'é‚', '樂' => '樂', '洛' => 'æ´›', '烙' => '烙', '珞' => 'çž', '落' => 'è½', '酪' => 'é…ª', '駱' => '駱', '亂' => '亂', '卵' => 'åµ', 'ï¤' => '欄', '爛' => '爛', '蘭' => '蘭', '鸞' => '鸞', '嵐' => 'åµ', '濫' => 'æ¿«', '藍' => 'è—', '襤' => '襤', '拉' => '拉', '臘' => '臘', '蠟' => 'è Ÿ', '廊' => '廊', '朗' => '朗', '浪' => '浪', '狼' => '狼', '郎' => '郎', '來' => '來', '冷' => '冷', '勞' => 'å‹ž', '擄' => 'æ“„', '櫓' => 'æ«“', '爐' => 'çˆ', '盧' => '盧', '老' => 'è€', '蘆' => '蘆', '虜' => '虜', '路' => 'è·¯', '露' => '露', '魯' => 'é­¯', '鷺' => 'é·º', '碌' => '碌', '祿' => '祿', '綠' => '綠', '菉' => 'è‰', '錄' => '錄', '鹿' => '鹿', 'ï¥' => 'è«–', '壟' => '壟', '弄' => '弄', '籠' => 'ç± ', '聾' => 'è¾', '牢' => '牢', '磊' => '磊', '賂' => '賂', '雷' => 'é›·', '壘' => '壘', '屢' => 'å±¢', '樓' => '樓', 'ï¥' => 'æ·š', '漏' => 'æ¼', 'ï¥' => 'ç´¯', 'ï¥' => '縷', '陋' => '陋', '勒' => 'å‹’', '肋' => 'è‚‹', '凜' => '凜', '凌' => '凌', '稜' => '稜', '綾' => '綾', '菱' => 'è±', '陵' => '陵', '讀' => '讀', '拏' => 'æ‹', '樂' => '樂', 'ï¥' => '諾', '丹' => '丹', '寧' => '寧', '怒' => '怒', '率' => '率', '異' => 'ç•°', '北' => '北', '磻' => '磻', '便' => '便', '復' => '復', '不' => 'ä¸', '泌' => '泌', '數' => '數', '索' => 'ç´¢', '參' => 'åƒ', '塞' => 'å¡ž', '省' => 'çœ', '葉' => '葉', '說' => '說', '殺' => '殺', '辰' => 'è¾°', '沈' => '沈', '拾' => '拾', '若' => 'è‹¥', '掠' => '掠', '略' => 'ç•¥', '亮' => '亮', '兩' => 'å…©', '凉' => '凉', '梁' => 'æ¢', '糧' => '糧', '良' => '良', '諒' => 'è«’', '量' => 'é‡', '勵' => '勵', '呂' => 'å‘‚', 'ï¦' => '女', '廬' => '廬', '旅' => 'æ—…', '濾' => '濾', '礪' => '礪', '閭' => 'é–­', '驪' => '驪', '麗' => '麗', '黎' => '黎', '力' => '力', '曆' => '曆', '歷' => 'æ­·', 'ï¦' => 'è½¢', '年' => 'å¹´', 'ï¦' => 'æ†', 'ï¦' => '戀', '撚' => 'æ’š', '漣' => 'æ¼£', '煉' => 'ç…‰', '璉' => 'ç’‰', '秊' => '秊', '練' => 'ç·´', '聯' => 'è¯', '輦' => '輦', '蓮' => 'è“®', '連' => '連', '鍊' => 'éŠ', '列' => '列', 'ï¦' => '劣', '咽' => 'å’½', '烈' => '烈', '裂' => '裂', '說' => '說', '廉' => '廉', '念' => '念', '捻' => 'æ»', '殮' => 'æ®®', '簾' => 'ç°¾', '獵' => 'çµ', '令' => '令', '囹' => '囹', '寧' => '寧', '嶺' => '嶺', '怜' => '怜', '玲' => '玲', '瑩' => 'ç‘©', '羚' => '羚', '聆' => 'è†', '鈴' => '鈴', '零' => '零', '靈' => 'éˆ', '領' => 'é ˜', '例' => '例', '禮' => '禮', '醴' => '醴', '隸' => '隸', '惡' => '惡', '了' => '了', '僚' => '僚', '寮' => '寮', '尿' => 'å°¿', '料' => 'æ–™', '樂' => '樂', '燎' => '燎', 'ï§' => '療', '蓼' => '蓼', '遼' => 'é¼', '龍' => 'é¾', '暈' => '暈', '阮' => '阮', '劉' => '劉', '杻' => 'æ»', '柳' => '柳', '流' => 'æµ', '溜' => '溜', '琉' => 'ç‰', 'ï§' => 'ç•™', '硫' => 'ç¡«', 'ï§' => 'ç´', 'ï§' => 'é¡ž', '六' => 'å…­', '戮' => '戮', '陸' => '陸', '倫' => '倫', '崙' => 'å´™', '淪' => 'æ·ª', '輪' => '輪', '律' => '律', '慄' => 'æ…„', '栗' => 'æ —', '率' => '率', '隆' => '隆', 'ï§' => '利', '吏' => 'å', '履' => 'å±¥', '易' => '易', '李' => 'æŽ', '梨' => '梨', '泥' => 'æ³¥', '理' => 'ç†', '痢' => 'ç—¢', '罹' => 'ç½¹', '裏' => 'è£', '裡' => '裡', '里' => '里', '離' => '離', '匿' => '匿', '溺' => '溺', '吝' => 'å', '燐' => 'ç‡', '璘' => 'ç’˜', '藺' => 'è—º', '隣' => '隣', '鱗' => 'é±—', '麟' => '麟', '林' => 'æž—', '淋' => 'æ·‹', '臨' => '臨', '立' => 'ç«‹', '笠' => '笠', '粒' => 'ç²’', '狀' => 'ç‹€', '炙' => 'ç‚™', '識' => 'è­˜', '什' => '什', '茶' => '茶', '刺' => '刺', '切' => '切', 'ï¨' => '度', '拓' => 'æ‹“', '糖' => 'ç³–', '宅' => 'å®…', '洞' => 'æ´ž', '暴' => 'æš´', '輻' => 'è¼»', '行' => 'è¡Œ', '降' => 'é™', '見' => '見', '廓' => '廓', '兀' => 'å…€', 'ï¨' => 'å—€', 'ï¨' => 'å¡š', '晴' => 'æ™´', '凞' => '凞', '猪' => '猪', '益' => '益', '礼' => '礼', '神' => '神', '祥' => '祥', '福' => 'ç¦', '靖' => 'é–', 'ï¨' => 'ç²¾', '羽' => 'ç¾½', '蘒' => '蘒', '諸' => '諸', '逸' => '逸', '都' => '都', '飯' => '飯', '飼' => '飼', '館' => '館', '鶴' => '鶴', '郞' => '郞', '隷' => 'éš·', '侮' => 'ä¾®', '僧' => '僧', '免' => 'å…', '勉' => '勉', '勤' => '勤', '卑' => 'å‘', '喝' => 'å–', '嘆' => '嘆', '器' => '器', '塀' => 'å¡€', '墨' => '墨', '層' => '層', '屮' => 'å±®', '悔' => 'æ‚”', '慨' => 'æ…¨', '憎' => '憎', 'ï©€' => '懲', 'ï©' => 'æ•', 'ï©‚' => 'æ—¢', '暑' => 'æš‘', 'ï©„' => '梅', 'ï©…' => 'æµ·', '渚' => '渚', '漢' => 'æ¼¢', '煮' => 'ç…®', '爫' => '爫', 'ï©Š' => 'ç¢', 'ï©‹' => '碑', 'ï©Œ' => '社', 'ï©' => '祉', 'ï©Ž' => '祈', 'ï©' => 'ç¥', 'ï©' => '祖', 'ï©‘' => 'ç¥', 'ï©’' => 'ç¦', 'ï©“' => '禎', 'ï©”' => 'ç©€', 'ï©•' => 'çª', 'ï©–' => '節', 'ï©—' => 'ç·´', '縉' => '縉', 'ï©™' => 'ç¹', 'ï©š' => 'ç½²', 'ï©›' => '者', 'ï©œ' => '臭', 'ï©' => '艹', 'ï©ž' => '艹', 'ï©Ÿ' => 'è‘—', 'ï© ' => 'è¤', 'ï©¡' => '視', 'ï©¢' => 'è¬', 'ï©£' => '謹', '賓' => '賓', 'ï©¥' => 'è´ˆ', '辶' => '辶', '逸' => '逸', '難' => '難', 'ï©©' => '響', '頻' => 'é »', 'ï©«' => 'æµ', '𤋮' => '𤋮', 'ï©­' => '舘', 'ï©°' => '並', '况' => '况', '全' => 'å…¨', '侀' => 'ä¾€', 'ï©´' => 'å……', '冀' => '冀', '勇' => '勇', 'ï©·' => '勺', '喝' => 'å–', '啕' => 'å••', '喙' => 'å–™', 'ï©»' => 'å—¢', '塚' => 'å¡š', '墳' => '墳', '奄' => '奄', 'ï©¿' => '奔', '婢' => 'å©¢', 'ïª' => '嬨', '廒' => 'å»’', '廙' => 'å»™', '彩' => '彩', '徭' => 'å¾­', '惘' => '惘', '慎' => 'æ…Ž', '愈' => '愈', '憎' => '憎', '慠' => 'æ… ', '懲' => '懲', '戴' => '戴', 'ïª' => 'æ„', '搜' => 'æœ', 'ïª' => 'æ‘’', 'ïª' => 'æ•–', '晴' => 'æ™´', '朗' => '朗', '望' => '望', '杖' => 'æ–', '歹' => 'æ­¹', '殺' => '殺', '流' => 'æµ', '滛' => 'æ»›', '滋' => '滋', '漢' => 'æ¼¢', '瀞' => '瀞', '煮' => 'ç…®', 'ïª' => '瞧', '爵' => '爵', '犯' => '犯', '猪' => '猪', '瑱' => '瑱', '甆' => '甆', '画' => 'ç”»', '瘝' => 'ç˜', '瘟' => '瘟', '益' => '益', '盛' => 'ç››', '直' => 'ç›´', '睊' => 'çŠ', '着' => 'ç€', '磌' => '磌', '窱' => '窱', '節' => '節', '类' => 'ç±»', '絛' => 'çµ›', '練' => 'ç·´', '缾' => 'ç¼¾', '者' => '者', '荒' => 'è’', '華' => 'è¯', '蝹' => 'è¹', '襁' => 'è¥', '覆' => '覆', '視' => '視', '調' => '調', '諸' => '諸', '請' => 'è«‹', '謁' => 'è¬', '諾' => '諾', '諭' => 'è«­', '謹' => '謹', 'ï«€' => '變', 'ï«' => 'è´ˆ', 'ï«‚' => '輸', '遲' => 'é²', 'ï«„' => '醙', 'ï«…' => '鉶', '陼' => '陼', '難' => '難', '靖' => 'é–', '韛' => '韛', 'ï«Š' => '響', 'ï«‹' => 'é ‹', 'ï«Œ' => 'é »', 'ï«' => '鬒', 'ï«Ž' => '龜', 'ï«' => '𢡊', 'ï«' => '𢡄', 'ï«‘' => 'ð£•', 'ï«’' => 'ã®', 'ï«“' => '䀘', 'ï«”' => '䀹', 'ï«•' => '𥉉', 'ï«–' => 'ð¥³', 'ï«—' => '𧻓', '齃' => '齃', 'ï«™' => '龎', 'ï¬' => '×™Ö´', 'ײַ' => 'ײַ', 'שׁ' => 'ש×', 'שׂ' => 'שׂ', 'שּׁ' => 'שּ×', 'שּׂ' => 'שּׂ', 'אַ' => '×Ö·', 'אָ' => '×Ö¸', 'אּ' => '×Ö¼', 'בּ' => 'בּ', 'גּ' => '×’Ö¼', 'דּ' => 'דּ', 'הּ' => '×”Ö¼', 'וּ' => 'וּ', 'זּ' => '×–Ö¼', 'טּ' => 'טּ', 'יּ' => '×™Ö¼', 'ךּ' => 'ךּ', 'כּ' => '×›Ö¼', 'לּ' => 'לּ', 'מּ' => 'מּ', 'ï­€' => '× Ö¼', 'ï­' => 'סּ', 'ï­ƒ' => '×£Ö¼', 'ï­„' => 'פּ', 'ï­†' => 'צּ', 'ï­‡' => 'קּ', 'ï­ˆ' => 'רּ', 'ï­‰' => 'שּ', 'ï­Š' => 'תּ', 'ï­‹' => 'וֹ', 'ï­Œ' => 'בֿ', 'ï­' => '×›Ö¿', 'ï­Ž' => 'פֿ', 'ð‘‚š' => '𑂚', 'ð‘‚œ' => '𑂜', 'ð‘‚«' => '𑂫', 'ð‘„®' => '𑄮', '𑄯' => '𑄯', 'ð‘‹' => 'ð‘‡ð‘Œ¾', 'ð‘Œ' => 'ð‘‡ð‘—', 'ð‘’»' => '𑒻', 'ð‘’¼' => '𑒼', 'ð‘’¾' => '𑒾', 'ð‘–º' => '𑖺', 'ð‘–»' => '𑖻', '𑤸' => '𑤸', 'ð…ž' => 'ð…—ð…¥', 'ð…Ÿ' => 'ð…˜ð…¥', 'ð… ' => 'ð…˜ð…¥ð…®', 'ð…¡' => 'ð…˜ð…¥ð…¯', 'ð…¢' => 'ð…˜ð…¥ð…°', 'ð…£' => 'ð…˜ð…¥ð…±', 'ð…¤' => 'ð…˜ð…¥ð…²', 'ð†»' => 'ð†¹ð…¥', 'ð†¼' => 'ð†ºð…¥', 'ð†½' => 'ð†¹ð…¥ð…®', 'ð†¾' => 'ð†ºð…¥ð…®', 'ð†¿' => 'ð†¹ð…¥ð…¯', 'ð‡€' => 'ð†ºð…¥ð…¯', '丽' => '丽', 'ð¯ ' => '丸', '乁' => 'ä¹', '𠄢' => 'ð „¢', '你' => 'ä½ ', '侮' => 'ä¾®', '侻' => 'ä¾»', '倂' => '倂', '偺' => 'åº', '備' => 'å‚™', '僧' => '僧', '像' => 'åƒ', '㒞' => 'ã’ž', 'ð¯ ' => '𠘺', '免' => 'å…', 'ð¯ ' => 'å…”', 'ð¯ ' => 'å…¤', '具' => 'å…·', '𠔜' => '𠔜', '㒹' => 'ã’¹', '內' => 'å…§', '再' => 'å†', '𠕋' => 'ð •‹', '冗' => '冗', '冤' => '冤', '仌' => '仌', '冬' => '冬', '况' => '况', '𩇟' => '𩇟', 'ð¯ ' => '凵', '刃' => '刃', '㓟' => 'ã“Ÿ', '刻' => '刻', '剆' => '剆', '割' => '割', '剷' => '剷', '㔕' => '㔕', '勇' => '勇', '勉' => '勉', '勤' => '勤', '勺' => '勺', '包' => '包', '匆' => '匆', '北' => '北', '卉' => 'å‰', '卑' => 'å‘', '博' => 'åš', '即' => 'å³', '卽' => 'å½', '卿' => 'å¿', '卿' => 'å¿', '卿' => 'å¿', '𠨬' => '𠨬', '灰' => 'ç°', '及' => 'åŠ', '叟' => 'åŸ', '𠭣' => 'ð ­£', '叫' => 'å«', '叱' => 'å±', '吆' => 'å†', '咞' => 'å’ž', '吸' => 'å¸', '呈' => '呈', '周' => '周', '咢' => 'å’¢', 'ð¯¡' => '哶', '唐' => 'å”', '啓' => 'å•“', '啣' => 'å•£', '善' => 'å–„', '善' => 'å–„', '喙' => 'å–™', '喫' => 'å–«', '喳' => 'å–³', '嗂' => 'å—‚', '圖' => '圖', '嘆' => '嘆', 'ð¯¡' => '圗', '噑' => '噑', 'ð¯¡' => 'å™´', 'ð¯¡' => '切', '壮' => '壮', '城' => '城', '埴' => '埴', '堍' => 'å ', '型' => 'åž‹', '堲' => 'å ²', '報' => 'å ±', '墬' => '墬', '𡓤' => '𡓤', '売' => '売', '壷' => '壷', '夆' => '夆', 'ð¯¡' => '多', '夢' => '夢', '奢' => '奢', '𡚨' => '𡚨', '𡛪' => '𡛪', '姬' => '姬', '娛' => '娛', '娧' => '娧', '姘' => '姘', '婦' => '婦', '㛮' => 'ã›®', '㛼' => '㛼', '嬈' => '嬈', '嬾' => '嬾', '嬾' => '嬾', '𡧈' => '𡧈', '寃' => '寃', '寘' => '寘', '寧' => '寧', '寳' => '寳', '𡬘' => '𡬘', '寿' => '寿', '将' => 'å°†', '当' => '当', '尢' => 'å°¢', '㞁' => 'ãž', '屠' => 'å± ', '屮' => 'å±®', '峀' => 'å³€', '岍' => 'å²', '𡷤' => 'ð¡·¤', '嵃' => '嵃', '𡷦' => 'ð¡·¦', '嵮' => 'åµ®', '嵫' => '嵫', '嵼' => 'åµ¼', 'ð¯¢' => 'å·¡', '巢' => 'å·¢', '㠯' => 'ã ¯', '巽' => 'å·½', '帨' => '帨', '帽' => '帽', '幩' => '幩', '㡢' => 'ã¡¢', '𢆃' => '𢆃', '㡼' => '㡼', '庰' => '庰', '庳' => '庳', 'ð¯¢' => '庶', '廊' => '廊', 'ð¯¢' => '𪎒', 'ð¯¢' => '廾', '𢌱' => '𢌱', '𢌱' => '𢌱', '舁' => 'èˆ', '弢' => 'å¼¢', '弢' => 'å¼¢', '㣇' => '㣇', '𣊸' => '𣊸', '𦇚' => '𦇚', '形' => 'å½¢', '彫' => '彫', '㣣' => '㣣', '徚' => '徚', 'ð¯¢' => 'å¿', '志' => 'å¿—', '忹' => '忹', '悁' => 'æ‚', '㤺' => '㤺', '㤜' => '㤜', '悔' => 'æ‚”', '𢛔' => '𢛔', '惇' => '惇', '慈' => 'æ…ˆ', '慌' => 'æ…Œ', '慎' => 'æ…Ž', '慌' => 'æ…Œ', '慺' => 'æ…º', '憎' => '憎', '憲' => '憲', '憤' => '憤', '憯' => '憯', '懞' => '懞', '懲' => '懲', '懶' => '懶', '成' => 'æˆ', '戛' => '戛', '扝' => 'æ‰', '抱' => '抱', '拔' => 'æ‹”', '捐' => 'æ', '𢬌' => '𢬌', '挽' => '挽', '拼' => '拼', '捨' => 'æ¨', '掃' => '掃', '揤' => 'æ¤', '𢯱' => '𢯱', '搢' => 'æ¢', '揅' => 'æ…', 'ð¯£' => '掩', '㨮' => '㨮', '摩' => 'æ‘©', '摾' => '摾', '撝' => 'æ’', '摷' => 'æ‘·', '㩬' => '㩬', '敏' => 'æ•', '敬' => '敬', '𣀊' => '𣀊', '旣' => 'æ—£', '書' => '書', 'ð¯£' => '晉', '㬙' => '㬙', 'ð¯£' => 'æš‘', 'ð¯£' => '㬈', '㫤' => '㫤', '冒' => '冒', '冕' => '冕', '最' => '最', '暜' => 'æšœ', '肭' => 'è‚­', '䏙' => 'ä™', '朗' => '朗', '望' => '望', '朡' => '朡', '杞' => 'æž', '杓' => 'æ“', 'ð¯£' => 'ð£ƒ', '㭉' => 'ã­‰', '柺' => '柺', '枅' => 'æž…', '桒' => 'æ¡’', '梅' => '梅', '𣑭' => '𣑭', '梎' => '梎', '栟' => 'æ Ÿ', '椔' => '椔', '㮝' => 'ã®', '楂' => '楂', '榣' => '榣', '槪' => '槪', '檨' => '檨', '𣚣' => '𣚣', '櫛' => 'æ«›', '㰘' => 'ã°˜', '次' => '次', '𣢧' => '𣢧', '歔' => 'æ­”', '㱎' => '㱎', '歲' => 'æ­²', '殟' => '殟', '殺' => '殺', '殻' => 'æ®»', '𣪍' => 'ð£ª', '𡴋' => 'ð¡´‹', '𣫺' => '𣫺', '汎' => '汎', '𣲼' => '𣲼', '沿' => '沿', '泍' => 'æ³', '汧' => '汧', '洖' => 'æ´–', '派' => 'æ´¾', 'ð¯¤' => 'æµ·', '流' => 'æµ', '浩' => '浩', '浸' => '浸', '涅' => '涅', '𣴞' => '𣴞', '洴' => 'æ´´', '港' => '港', '湮' => 'æ¹®', '㴳' => 'ã´³', '滋' => '滋', '滇' => '滇', 'ð¯¤' => '𣻑', '淹' => 'æ·¹', 'ð¯¤' => 'æ½®', 'ð¯¤' => '𣽞', '𣾎' => '𣾎', '濆' => '濆', '瀹' => '瀹', '瀞' => '瀞', '瀛' => '瀛', '㶖' => '㶖', '灊' => 'çŠ', '災' => 'ç½', '灷' => 'ç·', '炭' => 'ç‚­', '𠔥' => '𠔥', '煅' => 'ç……', 'ð¯¤' => '𤉣', '熜' => '熜', '𤎫' => '𤎫', '爨' => '爨', '爵' => '爵', '牐' => 'ç‰', '𤘈' => '𤘈', '犀' => '犀', '犕' => '犕', '𤜵' => '𤜵', '𤠔' => '𤠔', '獺' => 'çº', '王' => '王', '㺬' => '㺬', '玥' => '玥', '㺸' => '㺸', '㺸' => '㺸', '瑇' => '瑇', '瑜' => 'ç‘œ', '瑱' => '瑱', '璅' => 'ç’…', '瓊' => 'ç“Š', '㼛' => 'ã¼›', '甤' => '甤', '𤰶' => '𤰶', '甾' => '甾', '𤲒' => '𤲒', '異' => 'ç•°', '𢆟' => '𢆟', '瘐' => 'ç˜', '𤾡' => '𤾡', '𤾸' => '𤾸', '𥁄' => 'ð¥„', '㿼' => '㿼', '䀈' => '䀈', '直' => 'ç›´', 'ð¯¥' => '𥃳', '𥃲' => '𥃲', '𥄙' => '𥄙', '𥄳' => '𥄳', '眞' => '眞', '真' => '真', '真' => '真', '睊' => 'çŠ', '䀹' => '䀹', '瞋' => 'çž‹', '䁆' => 'ä†', '䂖' => 'ä‚–', 'ð¯¥' => 'ð¥', '硎' => 'ç¡Ž', 'ð¯¥' => '碌', 'ð¯¥' => '磌', '䃣' => '䃣', '𥘦' => '𥘦', '祖' => '祖', '𥚚' => '𥚚', '𥛅' => '𥛅', '福' => 'ç¦', '秫' => '秫', '䄯' => '䄯', '穀' => 'ç©€', '穊' => 'ç©Š', '穏' => 'ç©', '𥥼' => '𥥼', 'ð¯¥' => '𥪧', '𥪧' => '𥪧', '竮' => 'ç«®', '䈂' => '䈂', '𥮫' => '𥮫', '篆' => '篆', '築' => '築', '䈧' => '䈧', '𥲀' => '𥲀', '糒' => 'ç³’', '䊠' => '䊠', '糨' => '糨', '糣' => 'ç³£', '紀' => 'ç´€', '𥾆' => '𥾆', '絣' => 'çµ£', '䌁' => 'äŒ', '緇' => 'ç·‡', '縂' => '縂', '繅' => 'ç¹…', '䌴' => '䌴', '𦈨' => '𦈨', '𦉇' => '𦉇', '䍙' => 'ä™', '𦋙' => '𦋙', '罺' => '罺', '𦌾' => '𦌾', '羕' => '羕', '翺' => '翺', '者' => '者', '𦓚' => '𦓚', '𦔣' => '𦔣', '聠' => 'è ', '𦖨' => '𦖨', '聰' => 'è°', '𣍟' => 'ð£Ÿ', 'ð¯¦' => 'ä•', '育' => '育', '脃' => '脃', '䐋' => 'ä‹', '脾' => '脾', '媵' => '媵', '𦞧' => '𦞧', '𦞵' => '𦞵', '𣎓' => '𣎓', '𣎜' => '𣎜', '舁' => 'èˆ', '舄' => '舄', 'ð¯¦' => '辞', '䑫' => 'ä‘«', 'ð¯¦' => '芑', 'ð¯¦' => '芋', '芝' => 'èŠ', '劳' => '劳', '花' => '花', '芳' => '芳', '芽' => '芽', '苦' => '苦', '𦬼' => '𦬼', '若' => 'è‹¥', '茝' => 'èŒ', '荣' => 'è£', '莭' => '莭', '茣' => '茣', 'ð¯¦' => '莽', '菧' => 'è§', '著' => 'è‘—', '荓' => 'è“', '菊' => 'èŠ', '菌' => 'èŒ', '菜' => 'èœ', '𦰶' => '𦰶', '𦵫' => '𦵫', '𦳕' => '𦳕', '䔫' => '䔫', '蓱' => '蓱', '蓳' => '蓳', '蔖' => 'è”–', '𧏊' => 'ð§Š', '蕤' => '蕤', '𦼬' => '𦼬', '䕝' => 'ä•', '䕡' => 'ä•¡', '𦾱' => '𦾱', '𧃒' => '𧃒', '䕫' => 'ä•«', '虐' => 'è™', '虜' => '虜', '虧' => '虧', '虩' => '虩', '蚩' => 'èš©', '蚈' => '蚈', '蜎' => '蜎', '蛢' => '蛢', '蝹' => 'è¹', '蜨' => '蜨', '蝫' => 'è«', '螆' => '螆', '䗗' => 'ä——', '蟡' => '蟡', 'ð¯§' => 'è ', '䗹' => 'ä—¹', '衠' => 'è¡ ', '衣' => 'è¡£', '𧙧' => '𧙧', '裗' => '裗', '裞' => '裞', '䘵' => '䘵', '裺' => '裺', '㒻' => 'ã’»', '𧢮' => '𧢮', '𧥦' => '𧥦', 'ð¯§' => 'äš¾', '䛇' => '䛇', 'ð¯§' => '誠', 'ð¯§' => 'è«­', '變' => '變', '豕' => '豕', '𧲨' => '𧲨', '貫' => '貫', '賁' => 'è³', '贛' => 'è´›', '起' => 'èµ·', '𧼯' => '𧼯', '𠠄' => 'ð  „', '跋' => 'è·‹', '趼' => '趼', '跰' => 'è·°', 'ð¯§' => '𠣞', '軔' => 'è»”', '輸' => '輸', '𨗒' => '𨗒', '𨗭' => '𨗭', '邔' => 'é‚”', '郱' => '郱', '鄑' => 'é„‘', '𨜮' => '𨜮', '鄛' => 'é„›', '鈸' => '鈸', '鋗' => 'é‹—', '鋘' => '鋘', '鉼' => '鉼', '鏹' => 'é¹', '鐕' => 'é•', '𨯺' => '𨯺', '開' => 'é–‹', '䦕' => '䦕', '閷' => 'é–·', '𨵷' => '𨵷', '䧦' => '䧦', '雃' => '雃', '嶲' => '嶲', '霣' => '霣', '𩅅' => 'ð©……', '𩈚' => '𩈚', '䩮' => 'ä©®', '䩶' => '䩶', '韠' => '韠', '𩐊' => 'ð©Š', '䪲' => '䪲', '𩒖' => 'ð©’–', '頋' => 'é ‹', '頋' => 'é ‹', '頩' => 'é ©', 'ð¯¨' => 'ð©–¶', '飢' => '飢', '䬳' => '䬳', '餩' => '餩', '馧' => '馧', '駂' => '駂', '駾' => '駾', '䯎' => '䯎', '𩬰' => '𩬰', '鬒' => '鬒', '鱀' => 'é±€', '鳽' => 'é³½', 'ð¯¨' => '䳎', '䳭' => 'ä³­', 'ð¯¨' => '鵧', 'ð¯¨' => '𪃎', '䳸' => '䳸', '𪄅' => '𪄅', '𪈎' => '𪈎', '𪊑' => '𪊑', '麻' => '麻', '䵖' => 'äµ–', '黹' => '黹', '黾' => '黾', '鼅' => 'é¼…', '鼏' => 'é¼', '鼖' => 'é¼–', '鼻' => 'é¼»', 'ð¯¨' => '𪘀'); dropboxaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php000064400000027225147600374260031267 0ustar00addons 230, 'Ì' => 230, 'Ì‚' => 230, '̃' => 230, 'Ì„' => 230, 'Ì…' => 230, '̆' => 230, '̇' => 230, '̈' => 230, '̉' => 230, 'ÌŠ' => 230, 'Ì‹' => 230, 'ÌŒ' => 230, 'Ì' => 230, 'ÌŽ' => 230, 'Ì' => 230, 'Ì' => 230, 'Ì‘' => 230, 'Ì’' => 230, 'Ì“' => 230, 'Ì”' => 230, 'Ì•' => 232, 'Ì–' => 220, 'Ì—' => 220, '̘' => 220, 'Ì™' => 220, 'Ìš' => 232, 'Ì›' => 216, 'Ìœ' => 220, 'Ì' => 220, 'Ìž' => 220, 'ÌŸ' => 220, 'Ì ' => 220, 'Ì¡' => 202, 'Ì¢' => 202, 'Ì£' => 220, '̤' => 220, 'Ì¥' => 220, '̦' => 220, '̧' => 202, '̨' => 202, 'Ì©' => 220, '̪' => 220, 'Ì«' => 220, '̬' => 220, 'Ì­' => 220, 'Ì®' => 220, '̯' => 220, 'Ì°' => 220, '̱' => 220, '̲' => 220, '̳' => 220, 'Ì´' => 1, '̵' => 1, '̶' => 1, 'Ì·' => 1, '̸' => 1, '̹' => 220, '̺' => 220, 'Ì»' => 220, '̼' => 220, '̽' => 230, '̾' => 230, 'Ì¿' => 230, 'Í€' => 230, 'Í' => 230, 'Í‚' => 230, '̓' => 230, 'Í„' => 230, 'Í…' => 240, '͆' => 230, '͇' => 220, '͈' => 220, '͉' => 220, 'ÍŠ' => 230, 'Í‹' => 230, 'ÍŒ' => 230, 'Í' => 220, 'ÍŽ' => 220, 'Í' => 230, 'Í‘' => 230, 'Í’' => 230, 'Í“' => 220, 'Í”' => 220, 'Í•' => 220, 'Í–' => 220, 'Í—' => 230, '͘' => 232, 'Í™' => 220, 'Íš' => 220, 'Í›' => 230, 'Íœ' => 233, 'Í' => 234, 'Íž' => 234, 'ÍŸ' => 233, 'Í ' => 234, 'Í¡' => 234, 'Í¢' => 233, 'Í£' => 230, 'ͤ' => 230, 'Í¥' => 230, 'ͦ' => 230, 'ͧ' => 230, 'ͨ' => 230, 'Í©' => 230, 'ͪ' => 230, 'Í«' => 230, 'ͬ' => 230, 'Í­' => 230, 'Í®' => 230, 'ͯ' => 230, 'Òƒ' => 230, 'Ò„' => 230, 'Ò…' => 230, 'Ò†' => 230, 'Ò‡' => 230, 'Ö‘' => 220, 'Ö’' => 230, 'Ö“' => 230, 'Ö”' => 230, 'Ö•' => 230, 'Ö–' => 220, 'Ö—' => 230, 'Ö˜' => 230, 'Ö™' => 230, 'Öš' => 222, 'Ö›' => 220, 'Öœ' => 230, 'Ö' => 230, 'Öž' => 230, 'ÖŸ' => 230, 'Ö ' => 230, 'Ö¡' => 230, 'Ö¢' => 220, 'Ö£' => 220, 'Ö¤' => 220, 'Ö¥' => 220, 'Ö¦' => 220, 'Ö§' => 220, 'Ö¨' => 230, 'Ö©' => 230, 'Öª' => 220, 'Ö«' => 230, 'Ö¬' => 230, 'Ö­' => 222, 'Ö®' => 228, 'Ö¯' => 230, 'Ö°' => 10, 'Ö±' => 11, 'Ö²' => 12, 'Ö³' => 13, 'Ö´' => 14, 'Öµ' => 15, 'Ö¶' => 16, 'Ö·' => 17, 'Ö¸' => 18, 'Ö¹' => 19, 'Öº' => 19, 'Ö»' => 20, 'Ö¼' => 21, 'Ö½' => 22, 'Ö¿' => 23, '×' => 24, 'ׂ' => 25, 'ׄ' => 230, '×…' => 220, 'ׇ' => 18, 'Ø' => 230, 'Ø‘' => 230, 'Ø’' => 230, 'Ø“' => 230, 'Ø”' => 230, 'Ø•' => 230, 'Ø–' => 230, 'Ø—' => 230, 'ؘ' => 30, 'Ø™' => 31, 'Øš' => 32, 'Ù‹' => 27, 'ÙŒ' => 28, 'Ù' => 29, 'ÙŽ' => 30, 'Ù' => 31, 'Ù' => 32, 'Ù‘' => 33, 'Ù’' => 34, 'Ù“' => 230, 'Ù”' => 230, 'Ù•' => 220, 'Ù–' => 220, 'Ù—' => 230, 'Ù˜' => 230, 'Ù™' => 230, 'Ùš' => 230, 'Ù›' => 230, 'Ùœ' => 220, 'Ù' => 230, 'Ùž' => 230, 'ÙŸ' => 220, 'Ù°' => 35, 'Û–' => 230, 'Û—' => 230, 'Û˜' => 230, 'Û™' => 230, 'Ûš' => 230, 'Û›' => 230, 'Ûœ' => 230, 'ÛŸ' => 230, 'Û ' => 230, 'Û¡' => 230, 'Û¢' => 230, 'Û£' => 220, 'Û¤' => 230, 'Û§' => 230, 'Û¨' => 230, 'Ûª' => 220, 'Û«' => 230, 'Û¬' => 230, 'Û­' => 220, 'Ü‘' => 36, 'Ü°' => 230, 'ܱ' => 220, 'ܲ' => 230, 'ܳ' => 230, 'Ü´' => 220, 'ܵ' => 230, 'ܶ' => 230, 'Ü·' => 220, 'ܸ' => 220, 'ܹ' => 220, 'ܺ' => 230, 'Ü»' => 220, 'ܼ' => 220, 'ܽ' => 230, 'ܾ' => 220, 'Ü¿' => 230, 'Ý€' => 230, 'Ý' => 230, 'Ý‚' => 220, '݃' => 230, 'Ý„' => 220, 'Ý…' => 230, '݆' => 220, '݇' => 230, '݈' => 220, '݉' => 230, 'ÝŠ' => 230, 'ß«' => 230, '߬' => 230, 'ß­' => 230, 'ß®' => 230, '߯' => 230, 'ß°' => 230, 'ß±' => 230, 'ß²' => 220, 'ß³' => 230, 'ß½' => 220, 'à –' => 230, 'à —' => 230, 'à ˜' => 230, 'à ™' => 230, 'à ›' => 230, 'à œ' => 230, 'à ' => 230, 'à ž' => 230, 'à Ÿ' => 230, 'à  ' => 230, 'à ¡' => 230, 'à ¢' => 230, 'à £' => 230, 'à ¥' => 230, 'à ¦' => 230, 'à §' => 230, 'à ©' => 230, 'à ª' => 230, 'à «' => 230, 'à ¬' => 230, 'à ­' => 230, 'à¡™' => 220, 'à¡š' => 220, 'à¡›' => 220, '࣓' => 220, 'ࣔ' => 230, 'ࣕ' => 230, 'ࣖ' => 230, 'ࣗ' => 230, 'ࣘ' => 230, 'ࣙ' => 230, 'ࣚ' => 230, 'ࣛ' => 230, 'ࣜ' => 230, 'à£' => 230, 'ࣞ' => 230, 'ࣟ' => 230, '࣠' => 230, '࣡' => 230, 'ࣣ' => 220, 'ࣤ' => 230, 'ࣥ' => 230, 'ࣦ' => 220, 'ࣧ' => 230, 'ࣨ' => 230, 'ࣩ' => 220, '࣪' => 230, '࣫' => 230, '࣬' => 230, '࣭' => 220, '࣮' => 220, '࣯' => 220, 'ࣰ' => 27, 'ࣱ' => 28, 'ࣲ' => 29, 'ࣳ' => 230, 'ࣴ' => 230, 'ࣵ' => 230, 'ࣶ' => 220, 'ࣷ' => 230, 'ࣸ' => 230, 'ࣹ' => 220, 'ࣺ' => 220, 'ࣻ' => 230, 'ࣼ' => 230, 'ࣽ' => 230, 'ࣾ' => 230, 'ࣿ' => 230, '़' => 7, 'à¥' => 9, '॑' => 230, '॒' => 220, '॓' => 230, '॔' => 230, '়' => 7, 'à§' => 9, '৾' => 230, '਼' => 7, 'à©' => 9, '઼' => 7, 'à«' => 9, '଼' => 7, 'à­' => 9, 'à¯' => 9, 'à±' => 9, 'ౕ' => 84, 'à±–' => 91, '಼' => 7, 'à³' => 9, 'à´»' => 9, 'à´¼' => 9, 'àµ' => 9, 'à·Š' => 9, 'ุ' => 103, 'ู' => 103, 'ฺ' => 9, '่' => 107, '้' => 107, '๊' => 107, '๋' => 107, 'ຸ' => 118, 'ູ' => 118, '຺' => 9, '່' => 122, '້' => 122, '໊' => 122, '໋' => 122, '༘' => 220, '༙' => 220, '༵' => 220, '༷' => 220, '༹' => 216, 'ཱ' => 129, 'ི' => 130, 'ུ' => 132, 'ེ' => 130, 'ཻ' => 130, 'ོ' => 130, 'ཽ' => 130, 'ྀ' => 130, 'ྂ' => 230, 'ྃ' => 230, '྄' => 9, '྆' => 230, '྇' => 230, '࿆' => 220, '့' => 7, '္' => 9, '်' => 9, 'á‚' => 220, 'á' => 230, 'áž' => 230, 'áŸ' => 230, '᜔' => 9, '᜴' => 9, '្' => 9, 'áŸ' => 230, 'ᢩ' => 228, '᤹' => 222, '᤺' => 230, '᤻' => 220, 'ᨗ' => 230, 'ᨘ' => 220, 'á© ' => 9, '᩵' => 230, '᩶' => 230, 'á©·' => 230, '᩸' => 230, '᩹' => 230, '᩺' => 230, 'á©»' => 230, '᩼' => 230, 'á©¿' => 220, '᪰' => 230, '᪱' => 230, '᪲' => 230, '᪳' => 230, '᪴' => 230, '᪵' => 220, '᪶' => 220, '᪷' => 220, '᪸' => 220, '᪹' => 220, '᪺' => 220, '᪻' => 230, '᪼' => 230, '᪽' => 220, 'ᪿ' => 220, 'á«€' => 220, '᬴' => 7, 'á­„' => 9, 'á­«' => 230, 'á­¬' => 220, 'á­­' => 230, 'á­®' => 230, 'á­¯' => 230, 'á­°' => 230, 'á­±' => 230, 'á­²' => 230, 'á­³' => 230, '᮪' => 9, '᮫' => 9, '᯦' => 7, '᯲' => 9, '᯳' => 9, 'á°·' => 7, 'á³' => 230, '᳑' => 230, 'á³’' => 230, 'á³”' => 1, '᳕' => 220, 'á³–' => 220, 'á³—' => 220, '᳘' => 220, 'á³™' => 220, '᳚' => 230, 'á³›' => 230, '᳜' => 220, 'á³' => 220, '᳞' => 220, '᳟' => 220, 'á³ ' => 230, 'á³¢' => 1, 'á³£' => 1, '᳤' => 1, 'á³¥' => 1, '᳦' => 1, '᳧' => 1, '᳨' => 1, 'á³­' => 220, 'á³´' => 230, '᳸' => 230, 'á³¹' => 230, 'á·€' => 230, 'á·' => 230, 'á·‚' => 220, 'á·ƒ' => 230, 'á·„' => 230, 'á·…' => 230, 'á·†' => 230, 'á·‡' => 230, 'á·ˆ' => 230, 'á·‰' => 230, 'á·Š' => 220, 'á·‹' => 230, 'á·Œ' => 230, 'á·' => 234, 'á·Ž' => 214, 'á·' => 220, 'á·' => 202, 'á·‘' => 230, 'á·’' => 230, 'á·“' => 230, 'á·”' => 230, 'á·•' => 230, 'á·–' => 230, 'á·—' => 230, 'á·˜' => 230, 'á·™' => 230, 'á·š' => 230, 'á·›' => 230, 'á·œ' => 230, 'á·' => 230, 'á·ž' => 230, 'á·Ÿ' => 230, 'á· ' => 230, 'á·¡' => 230, 'á·¢' => 230, 'á·£' => 230, 'á·¤' => 230, 'á·¥' => 230, 'á·¦' => 230, 'á·§' => 230, 'á·¨' => 230, 'á·©' => 230, 'á·ª' => 230, 'á·«' => 230, 'á·¬' => 230, 'á·­' => 230, 'á·®' => 230, 'á·¯' => 230, 'á·°' => 230, 'á·±' => 230, 'á·²' => 230, 'á·³' => 230, 'á·´' => 230, 'á·µ' => 230, 'á·¶' => 232, 'á··' => 228, 'á·¸' => 228, 'á·¹' => 220, 'á·»' => 230, 'á·¼' => 233, 'á·½' => 220, 'á·¾' => 230, 'á·¿' => 220, 'âƒ' => 230, '⃑' => 230, '⃒' => 1, '⃓' => 1, '⃔' => 230, '⃕' => 230, '⃖' => 230, '⃗' => 230, '⃘' => 1, '⃙' => 1, '⃚' => 1, '⃛' => 230, '⃜' => 230, '⃡' => 230, '⃥' => 1, '⃦' => 1, '⃧' => 230, '⃨' => 220, '⃩' => 230, '⃪' => 1, '⃫' => 1, '⃬' => 220, '⃭' => 220, '⃮' => 220, '⃯' => 220, '⃰' => 230, '⳯' => 230, 'â³°' => 230, 'â³±' => 230, '⵿' => 9, 'â· ' => 230, 'â·¡' => 230, 'â·¢' => 230, 'â·£' => 230, 'â·¤' => 230, 'â·¥' => 230, 'â·¦' => 230, 'â·§' => 230, 'â·¨' => 230, 'â·©' => 230, 'â·ª' => 230, 'â·«' => 230, 'â·¬' => 230, 'â·­' => 230, 'â·®' => 230, 'â·¯' => 230, 'â·°' => 230, 'â·±' => 230, 'â·²' => 230, 'â·³' => 230, 'â·´' => 230, 'â·µ' => 230, 'â·¶' => 230, 'â··' => 230, 'â·¸' => 230, 'â·¹' => 230, 'â·º' => 230, 'â·»' => 230, 'â·¼' => 230, 'â·½' => 230, 'â·¾' => 230, 'â·¿' => 230, '〪' => 218, '〫' => 228, '〬' => 232, '〭' => 222, '〮' => 224, '〯' => 224, 'ã‚™' => 8, 'ã‚š' => 8, '꙯' => 230, 'ê™´' => 230, 'ꙵ' => 230, 'ꙶ' => 230, 'ê™·' => 230, 'ꙸ' => 230, 'ꙹ' => 230, 'ꙺ' => 230, 'ê™»' => 230, '꙼' => 230, '꙽' => 230, 'êšž' => 230, 'ꚟ' => 230, 'ê›°' => 230, 'ê›±' => 230, 'ê †' => 9, 'ê ¬' => 9, '꣄' => 9, '꣠' => 230, '꣡' => 230, '꣢' => 230, '꣣' => 230, '꣤' => 230, '꣥' => 230, '꣦' => 230, '꣧' => 230, '꣨' => 230, '꣩' => 230, '꣪' => 230, '꣫' => 230, '꣬' => 230, '꣭' => 230, '꣮' => 230, '꣯' => 230, '꣰' => 230, '꣱' => 230, '꤫' => 220, '꤬' => 220, '꤭' => 220, '꥓' => 9, '꦳' => 7, '꧀' => 9, 'ꪰ' => 230, 'ꪲ' => 230, 'ꪳ' => 230, 'ꪴ' => 220, 'ꪷ' => 230, 'ꪸ' => 230, 'ꪾ' => 230, '꪿' => 230, 'ê«' => 230, '꫶' => 9, '꯭' => 9, 'ﬞ' => 26, '︠' => 230, '︡' => 230, '︢' => 230, '︣' => 230, '︤' => 230, '︥' => 230, '︦' => 230, '︧' => 220, '︨' => 220, '︩' => 220, '︪' => 220, '︫' => 220, '︬' => 220, '︭' => 220, '︮' => 230, '︯' => 230, 'ð‡½' => 220, 'ð‹ ' => 220, 'ð¶' => 230, 'ð·' => 230, 'ð¸' => 230, 'ð¹' => 230, 'ðº' => 230, 'ð¨' => 220, 'ð¨' => 230, 'ð¨¸' => 230, 'ð¨¹' => 1, 'ð¨º' => 220, 'ð¨¿' => 9, 'ð«¥' => 230, 'ð«¦' => 220, 'ð´¤' => 230, 'ð´¥' => 230, 'ð´¦' => 230, 'ð´§' => 230, 'ðº«' => 230, 'ðº¬' => 230, 'ð½†' => 220, 'ð½‡' => 220, 'ð½ˆ' => 230, 'ð½‰' => 230, 'ð½Š' => 230, 'ð½‹' => 220, 'ð½Œ' => 230, 'ð½' => 220, 'ð½Ž' => 220, 'ð½' => 220, 'ð½' => 220, 'ð‘†' => 9, 'ð‘¿' => 9, 'ð‘‚¹' => 9, '𑂺' => 7, 'ð‘„€' => 230, 'ð‘„' => 230, 'ð‘„‚' => 230, 'ð‘„³' => 9, 'ð‘„´' => 9, 'ð‘…³' => 7, '𑇀' => 9, '𑇊' => 7, '𑈵' => 9, '𑈶' => 7, 'ð‘‹©' => 7, '𑋪' => 9, '𑌻' => 7, '𑌼' => 7, 'ð‘' => 9, 'ð‘¦' => 230, 'ð‘§' => 230, 'ð‘¨' => 230, 'ð‘©' => 230, 'ð‘ª' => 230, 'ð‘«' => 230, 'ð‘¬' => 230, 'ð‘°' => 230, 'ð‘±' => 230, 'ð‘²' => 230, 'ð‘³' => 230, 'ð‘´' => 230, 'ð‘‘‚' => 9, '𑑆' => 7, 'ð‘‘ž' => 230, 'ð‘“‚' => 9, '𑓃' => 7, 'ð‘–¿' => 9, 'ð‘—€' => 7, '𑘿' => 9, '𑚶' => 9, 'ð‘š·' => 7, '𑜫' => 9, 'ð‘ ¹' => 9, 'ð‘ º' => 7, '𑤽' => 9, '𑤾' => 9, '𑥃' => 7, '𑧠' => 9, '𑨴' => 9, '𑩇' => 9, '𑪙' => 9, 'ð‘°¿' => 9, '𑵂' => 7, '𑵄' => 9, '𑵅' => 9, '𑶗' => 9, 'ð–«°' => 1, 'ð–«±' => 1, 'ð–«²' => 1, 'ð–«³' => 1, 'ð–«´' => 1, 'ð–¬°' => 230, '𖬱' => 230, '𖬲' => 230, '𖬳' => 230, 'ð–¬´' => 230, '𖬵' => 230, '𖬶' => 230, 'ð–¿°' => 6, 'ð–¿±' => 6, '𛲞' => 1, 'ð…¥' => 216, 'ð…¦' => 216, 'ð…§' => 1, 'ð…¨' => 1, 'ð…©' => 1, 'ð…­' => 226, 'ð…®' => 216, 'ð…¯' => 216, 'ð…°' => 216, 'ð…±' => 216, 'ð…²' => 216, 'ð…»' => 220, 'ð…¼' => 220, 'ð…½' => 220, 'ð…¾' => 220, 'ð…¿' => 220, 'ð†€' => 220, 'ð†' => 220, 'ð†‚' => 220, 'ð†…' => 230, 'ð††' => 230, 'ð†‡' => 230, 'ð†ˆ' => 230, 'ð†‰' => 230, 'ð†Š' => 220, 'ð†‹' => 220, 'ð†ª' => 230, 'ð†«' => 230, 'ð†¬' => 230, 'ð†­' => 230, 'ð‰‚' => 230, 'ð‰ƒ' => 230, 'ð‰„' => 230, '𞀀' => 230, 'ðž€' => 230, '𞀂' => 230, '𞀃' => 230, '𞀄' => 230, '𞀅' => 230, '𞀆' => 230, '𞀈' => 230, '𞀉' => 230, '𞀊' => 230, '𞀋' => 230, '𞀌' => 230, 'ðž€' => 230, '𞀎' => 230, 'ðž€' => 230, 'ðž€' => 230, '𞀑' => 230, '𞀒' => 230, '𞀓' => 230, '𞀔' => 230, '𞀕' => 230, '𞀖' => 230, '𞀗' => 230, '𞀘' => 230, '𞀛' => 230, '𞀜' => 230, 'ðž€' => 230, '𞀞' => 230, '𞀟' => 230, '𞀠' => 230, '𞀡' => 230, '𞀣' => 230, '𞀤' => 230, '𞀦' => 230, '𞀧' => 230, '𞀨' => 230, '𞀩' => 230, '𞀪' => 230, 'ðž„°' => 230, '𞄱' => 230, '𞄲' => 230, '𞄳' => 230, 'ðž„´' => 230, '𞄵' => 230, '𞄶' => 230, '𞋬' => 230, 'ðž‹­' => 230, 'ðž‹®' => 230, '𞋯' => 230, 'ðž£' => 220, '𞣑' => 220, '𞣒' => 220, '𞣓' => 220, '𞣔' => 220, '𞣕' => 220, '𞣖' => 220, '𞥄' => 230, '𞥅' => 230, '𞥆' => 230, '𞥇' => 230, '𞥈' => 230, '𞥉' => 230, '𞥊' => 7); addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Normalizer.php000064400000022073147600374260025132 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Normalizer; /** * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. * * It has been validated with Unicode 6.3 Normalization Conformance Test. * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. * * @author Nicolas Grekas * * @internal */ class Normalizer { public const FORM_D = \Normalizer::FORM_D; public const FORM_KD = \Normalizer::FORM_KD; public const FORM_C = \Normalizer::FORM_C; public const FORM_KC = \Normalizer::FORM_KC; public const NFD = \Normalizer::NFD; public const NFKD = \Normalizer::NFKD; public const NFC = \Normalizer::NFC; public const NFKC = \Normalizer::NFKC; private static $C; private static $D; private static $KD; private static $cC; private static $ulenMask = ["\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4]; private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T \PHP_VERSION_ID) { return \false; } throw new \ValueError('normalizer_normalize(): Argument #2 ($form) must be a a valid normalization form'); } if ('' === $s) { return ''; } if ($K && null === self::$KD) { self::$KD = self::getData('compatibilityDecomposition'); } if (null === self::$D) { self::$D = self::getData('canonicalDecomposition'); self::$cC = self::getData('combiningClass'); } if (null !== ($mbEncoding = 2 & (int) \ini_get('mbstring.func_overload') ? \mb_internal_encoding() : null)) { \mb_internal_encoding('8bit'); } $r = self::decompose($s, $K); if ($C) { if (null === self::$C) { self::$C = self::getData('canonicalComposition'); } $r = self::recompose($r); } if (null !== $mbEncoding) { \mb_internal_encoding($mbEncoding); } return $r; } private static function recompose($s) { $ASCII = self::$ASCII; $compMap = self::$C; $combClass = self::$cC; $ulenMask = self::$ulenMask; $result = $tail = ''; $i = $s[0] < "\x80" ? 1 : $ulenMask[$s[0] & "\xf0"]; $len = \strlen($s); $lastUchr = \substr($s, 0, $i); $lastUcls = isset($combClass[$lastUchr]) ? 256 : 0; while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($tail) { $lastUchr .= $tail; $tail = ''; } if ($j = \strspn($s, $ASCII, $i + 1)) { $lastUchr .= \substr($s, $i, $j); $i += $j; } $result .= $lastUchr; $lastUchr = $s[$i]; $lastUcls = 0; ++$i; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); if ($lastUchr < "á„€" || "á„’" < $lastUchr || $uchr < "á…¡" || "á…µ" < $uchr || $lastUcls) { // Table lookup and combining chars composition $ucls = $combClass[$uchr] ?: 0; if (isset($compMap[$lastUchr . $uchr]) && (!$lastUcls || $lastUcls < $ucls)) { $lastUchr = $compMap[$lastUchr . $uchr]; } elseif ($lastUcls = $ucls) { $tail .= $uchr; } else { if ($tail) { $lastUchr .= $tail; $tail = ''; } $result .= $lastUchr; $lastUchr = $uchr; } } else { // Hangul chars $L = \ord($lastUchr[2]) - 0x80; $V = \ord($uchr[2]) - 0xa1; $T = 0; $uchr = \substr($s, $i + $ulen, 3); if ("ᆧ" <= $uchr && $uchr <= "ᇂ") { $T = \ord($uchr[2]) - 0xa7; 0 > $T && ($T += 0x40); $ulen += 3; } $L = 0xac00 + ($L * 21 + $V) * 28 + $T; $lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f); } $i += $ulen; } return $result . $lastUchr . $tail; } private static function decompose($s, $c) { $result = ''; $ASCII = self::$ASCII; $decompMap = self::$D; $combClass = self::$cC; $ulenMask = self::$ulenMask; if ($c) { $compatMap = self::$KD; } $c = []; $i = 0; $len = \strlen($s); while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($c) { \ksort($c); $result .= \implode('', $c); $c = []; } $j = 1 + \strspn($s, $ASCII, $i + 1); $result .= \substr($s, $i, $j); $i += $j; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if ($uchr < "ê°€" || "힣" < $uchr) { // Table lookup if ($uchr !== ($j = $compatMap[$uchr] ?: $decompMap[$uchr] ?: $uchr)) { $uchr = $j; $j = \strlen($uchr); $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"]; if ($ulen != $j) { // Put trailing chars in $s $j -= $ulen; $i -= $j; if (0 > $i) { $s = \str_repeat(' ', -$i) . $s; $len -= $i; $i = 0; } while ($j--) { $s[$i + $j] = $uchr[$ulen + $j]; } $uchr = \substr($uchr, 0, $ulen); } } if (isset($combClass[$uchr])) { // Combining chars, for sorting if (!isset($c[$combClass[$uchr]])) { $c[$combClass[$uchr]] = ''; } $c[$combClass[$uchr]] .= $uchr; continue; } } else { // Hangul chars $uchr = \unpack('C*', $uchr); $j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80; $uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28)); if ($j %= 28) { $uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j); } } if ($c) { \ksort($c); $result .= \implode('', $c); $c = []; } $result .= $uchr; } if ($c) { \ksort($c); $result .= \implode('', $c); } return $result; } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/bootstrap.php000064400000001464147600374260025026 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Normalizer as p; if (\PHP_VERSION_ID >= 80000) { return require __DIR__ . '/bootstrap80.php'; } if (!\function_exists('normalizer_is_normalized')) { function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized($string, $form); } } if (!\function_exists('normalizer_normalize')) { function normalizer_normalize($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::normalize($string, $form); } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/bootstrap80.php000064400000001417147600374260025174 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Dropbox\Symfony\Polyfill\Intl\Normalizer as p; if (!\function_exists('normalizer_is_normalized')) { function normalizer_is_normalized($string, $form = p\Normalizer::FORM_C) { return p\Normalizer::isNormalized((string) $string, (int) $form); } } if (!\function_exists('normalizer_normalize')) { function normalizer_normalize($string, $form = p\Normalizer::FORM_C) : string|false { return p\Normalizer::normalize((string) $string, (int) $form); } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-php72/bootstrap.php000064400000004143147600374260022635 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Dropbox\Symfony\Polyfill\Php72 as p; if (\PHP_VERSION_ID >= 70200) { return; } if (!\defined('PHP_FLOAT_DIG')) { \define('PHP_FLOAT_DIG', 15); } if (!\defined('PHP_FLOAT_EPSILON')) { \define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); } if (!\defined('PHP_FLOAT_MIN')) { \define('PHP_FLOAT_MIN', 2.2250738585072E-308); } if (!\defined('PHP_FLOAT_MAX')) { \define('PHP_FLOAT_MAX', 1.7976931348623157E+308); } if (!\defined('PHP_OS_FAMILY')) { \define('PHP_OS_FAMILY', p\Php72::php_os_family()); } if ('\\' === \DIRECTORY_SEPARATOR && !\function_exists('sapi_windows_vt100_support')) { function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } } if (!\function_exists('stream_isatty')) { function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } } if (!\function_exists('utf8_encode')) { function utf8_encode($string) { return p\Php72::utf8_encode($string); } } if (!\function_exists('utf8_decode')) { function utf8_decode($string) { return p\Php72::utf8_decode($string); } } if (!\function_exists('spl_object_id')) { function spl_object_id($object) { return p\Php72::spl_object_id($object); } } if (!\function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } } if (!\function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } } if (!\function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } addons/dropboxaddon/vendor-prefixed/symfony/polyfill-php72/Php72.php000064400000015112147600374260021516 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Dropbox\Symfony\Polyfill\Php72; /** * @author Nicolas Grekas * @author Dariusz RumiÅ„ski * * @internal */ final class Php72 { private static $hashMask; public static function utf8_encode($s) { $s .= $s; $len = \strlen($s); for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { switch (\true) { case $s[$i] < "\x80": $s[$j] = $s[$i]; break; case $s[$i] < "\xc0": $s[$j] = "\xc2"; $s[++$j] = $s[$i]; break; default: $s[$j] = "\xc3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; } } return \substr($s, 0, $j); } public static function utf8_decode($s) { $s = (string) $s; $len = \strlen($s); for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { switch ($s[$i] & "\xf0") { case "\xc0": case "\xd0": $c = \ord($s[$i] & "\x1f") << 6 | \ord($s[++$i] & "?"); $s[$j] = $c < 256 ? \chr($c) : '?'; break; case "\xf0": ++$i; // no break case "\xe0": $s[$j] = '?'; $i += 2; break; default: $s[$j] = $s[$i]; } } return \substr($s, 0, $j); } public static function php_os_family() { if ('\\' === \DIRECTORY_SEPARATOR) { return 'Windows'; } $map = ['Darwin' => 'Darwin', 'DragonFly' => 'BSD', 'FreeBSD' => 'BSD', 'NetBSD' => 'BSD', 'OpenBSD' => 'BSD', 'Linux' => 'Linux', 'SunOS' => 'Solaris']; return $map[\PHP_OS] ?: 'Unknown'; } public static function spl_object_id($object) { if (null === self::$hashMask) { self::initHashMask(); } if (null === ($hash = \spl_object_hash($object))) { return; } // On 32-bit systems, PHP_INT_SIZE is 4, return self::$hashMask ^ \hexdec(\substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function sapi_windows_vt100_support($stream, $enable = null) { if (!\is_resource($stream)) { \trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } $meta = \stream_get_meta_data($stream); if ('STDIO' !== $meta['stream_type']) { \trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', \E_USER_WARNING); return \false; } // We cannot actually disable vt100 support if it is set if (\false === $enable || !self::stream_isatty($stream)) { return \false; } // The native function does not apply to stdin $meta = \array_map('strtolower', $meta); $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; return !$stdin && (\false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM') || 'Hyper' === \getenv('TERM_PROGRAM')); } public static function stream_isatty($stream) { if (!\is_resource($stream)) { \trigger_error('stream_isatty() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } if ('\\' === \DIRECTORY_SEPARATOR) { $stat = @\fstat($stream); // Check if formatted mode is S_IFCHR return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; } return \function_exists('posix_isatty') && @\posix_isatty($stream); } private static function initHashMask() { $obj = (object) []; self::$hashMask = -1; // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below $obFuncs = ['ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush']; foreach (\debug_backtrace(\PHP_VERSION_ID >= 50400 ? \DEBUG_BACKTRACE_IGNORE_ARGS : \false) as $frame) { if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { $frame['line'] = 0; break; } } if (!empty($frame['line'])) { \ob_start(); \debug_zval_dump($obj); self::$hashMask = (int) \substr(\ob_get_clean(), 17); } self::$hashMask ^= \hexdec(\substr(\spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== ($encoding = $encoding ?: \mb_internal_encoding())) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if (null === $encoding) { $s = \mb_convert_encoding($s, 'UTF-8'); } elseif ('UTF-8' !== $encoding) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } } addons/dropboxaddon/DropboxAddon.php000064400000004232147600374260013605 0ustar00 $storageNums Storages num * * @return array */ public static function getStorageUsageStats($storageNums) { if (($storages = AbstractStorageEntity::getAll()) === false) { $storages = []; } $storageNums['storages_dropbox_count'] = 0; foreach ($storages as $storage) { if ($storage->getSType() === DropboxStorage::getSType()) { $storageNums['storages_dropbox_count']++; } } return $storageNums; } /** * Register storages * * @return void */ public function registerStorages() { DropboxStorage::registerType(); } /** * * @return string */ public static function getAddonPath() { return self::ADDON_PATH; } /** * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/ftpaddon/src/Models/FTPStorage.php000064400000042714147600374260014335 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge( $config, [ 'server' => '', 'port' => 21, 'username' => '', 'password' => '', 'use_curl' => false, 'timeout_in_secs' => 15, 'ssl' => false, 'passive_mode' => true, ] ); return $config; } /** * Get stoage adapter * * @return AbstractStorageAdapter */ protected function getAdapter() { if ($this->adapter !== null) { return $this->adapter; } if ($this->config['use_curl'] || static::isCurlOnly()) { $global = DUP_PRO_Global_Entity::getInstance(); $this->adapter = new FTPCurlStorageAdapter( $this->config['server'], $this->config['port'], $this->config['username'], $this->config['password'], $this->config['storage_folder'], $this->config['timeout_in_secs'], $this->config['ssl'], $this->config['passive_mode'], 0, !$global->ssl_disableverify, $global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH ); } else { $this->adapter = new FTPStorageAdapter( $this->config['server'], $this->config['port'], $this->config['username'], $this->config['password'], $this->config['storage_folder'], $this->config['timeout_in_secs'], $this->config['ssl'], $this->config['passive_mode'] ); } return $this->adapter; } /** * Will be called, automatically, when Serialize * * @return array */ public function __serialize() // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound { $data = parent::__serialize(); unset($data['client']); return $data; } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'server' => $this->ftp_server, 'port' => $this->ftp_port, 'username' => $this->ftp_username, 'password' => $this->ftp_password, 'use_curl' => $this->ftp_use_curl, 'storage_folder' => '/' . ltrim($this->ftp_storage_folder, '/\\'), 'max_packages' => $this->ftp_max_files, 'timeout_in_secs' => $this->ftp_timeout_in_secs, 'ssl' => $this->ftp_ssl, 'passive_mode' => $this->ftp_passive_mode, ]; // reset old values $this->ftp_server = ''; $this->ftp_port = 21; $this->ftp_username = ''; $this->ftp_password = ''; $this->ftp_use_curl = false; $this->ftp_storage_folder = ''; $this->ftp_max_files = 10; $this->ftp_timeout_in_secs = 15; $this->ftp_ssl = false; $this->ftp_passive_mode = false; } // For legacy entities, we need to make sure the config is up to date $this->config['port'] = (int) $this->config['port']; $this->config['max_packages'] = (int) $this->config['max_packages']; $this->config['timeout_in_secs'] = (int) $this->config['timeout_in_secs']; } /** * Return the storage type * * @return int */ public static function getSType() { return 2; } /** * Returns the FontAwesome storage type icon. * * @return string Returns the font-awesome icon */ public static function getStypeIcon() { return ''; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('FTP', 'duplicator-pro'); } /** * Get priority, used to sort storages. * 100 is neutral value, 0 is the highest priority * * @return int */ public static function getPriority() { return 80; } /** * Get storage location string * * @return string */ public function getLocationString() { return "ftp://" . $this->config['server'] . ":" . $this->config['port'] . $this->getStorageFolder(); } /** * Check if storage is supported * * @return bool */ public static function isSupported() { return apply_filters('duplicator_pro_ftp_connect_exists', function_exists('ftp_connect') || SnapUtil::isCurlEnabled(false)); } /** * Check if only curl is supported. * * @return bool */ public static function isCurlOnly() { return !function_exists('ftp_connect') && SnapUtil::isCurlEnabled(false); } /** * Get supported notice, displayed if storage isn't supported * * @return string html string or empty if storage is supported */ public static function getNotSupportedNotice() { if (static::isSupported()) { return ''; } return sprintf( esc_html__( 'FTP Storage requires FTP module enabled. Please install the FTP module as described in the %s.', 'duplicator-pro' ), 'https://secure.php.net/manual/en/ftp.installation.php' ); } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->getAdapter()->isValid(); } /** * Get upload chunk size in bytes * * @return int bytes */ public function getUploadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('ftp_upload_chunksize_in_mb', self::DEFAULT_UPLOAD_CHUNK_SIZE_IN_MB) * 1024 * 1024; } /** * Get upload chunk size in bytes * * @return int bytes */ public function getDownloadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('ftp_download_chunksize_in_mb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB) * 1024 * 1024; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { return (int) ($this->config['timeout_in_secs'] <= 0 ? 0 : $this->config['timeout_in_secs'] * SECONDS_IN_MICROSECONDS); } /** * Get action key text * * @param string $key Key name (action, pending, failed, cancelled, success) * * @return string */ protected function getUploadActionKeyText($key) { switch ($key) { case 'action': return sprintf( __('Transferring to FTP server %1$s in folder:
%2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'pending': return sprintf( __('Transfer to FTP server %1$s in folder %2$s is pending', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'failed': return sprintf( __('Failed to transfer to FTP server %1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'cancelled': return sprintf( __('Cancelled before could transfer to FTP server:
%1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'success': return sprintf( __('Transferred package to FTP server:
%1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); default: throw new Exception('Invalid key'); } } /** * Get action key text for download * * @param string $key Key name (action, pending, failed, cancelled, success) * * @return string */ protected function getDownloadActionKeyText($key) { switch ($key) { case 'action': return sprintf( __('Downloading from FTP server %1$s from folder:
%2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'pending': return sprintf( __('Download from FTP server %1$s from folder %2$s is pending', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'failed': return sprintf( __('Failed to download from FTP server %1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'cancelled': return sprintf( __('Cancelled before could download from FTP server:
%1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'success': return sprintf( __('Downloaded from FTP server:
%1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); default: throw new Exception('Invalid key'); } } /** * List quick view * * @param bool $echo Echo or return * * @return string */ public function getListQuickView($echo = true) { ob_start(); ?>
config['server']); ?>: config['port']); ?>
getHtmlLocationLink(), [ 'a' => [ 'href' => [], 'target' => [], ], ] ); ?>
render( 'ftpaddon/configs/ftp', [ 'storage' => $this, 'server' => $this->config['server'], 'port' => $this->config['port'], 'username' => $this->config['username'], 'password' => $this->config['password'], 'storageFolder' => $this->config['storage_folder'], 'maxPackages' => $this->config['max_packages'], 'timeout' => $this->config['timeout_in_secs'], 'useCurl' => $this->config['use_curl'] || $forceCurl, 'isPassive' => $this->config['passive_mode'], 'useSSL' => $this->config['ssl'], 'forceCurl' => $forceCurl, ], $echo ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'ftp_max_files', 10); $this->config['server'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'ftp_server', ''); $this->config['port'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'ftp_port', 10); $this->config['username'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'ftp_username', ''); $password = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'ftp_password', ''); $password2 = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'ftp_password2', ''); if (strlen($password) > 0) { if ($password !== $password2) { $message = __('Passwords do not match', 'duplicator-pro'); return false; } $this->config['password'] = $password; } $this->config['storage_folder'] = self::getSanitizedInputFolder('_ftp_storage_folder', 'add'); $this->config['timeout_in_secs'] = max(10, SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'ftp_timeout_in_secs', 15)); $this->config['use_curl'] = SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, '_ftp_use_curl', false) || static::isCurlOnly(); $this->config['ssl'] = SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, '_ftp_ssl', false); $this->config['passive_mode'] = SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, '_ftp_passive_mode', false); $errorMsg = ''; if ($this->getAdapter()->initialize($errorMsg) === false) { $message = sprintf( __('Failed to connect to FTP server with message: %1$s', 'duplicator-pro'), $errorMsg ); return false; } $message = sprintf( __('FTP Storage Updated - Server %1$s, Folder %2$s was created.', 'duplicator-pro'), $this->config['server'], $this->getStorageFolder() ); return true; } /** * Register storage type * * @return void */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } $dGlobal->save(); }); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return [ 'ftp_upload_chunksize_in_mb' => self::DEFAULT_UPLOAD_CHUNK_SIZE_IN_MB, 'ftp_download_chunksize_in_mb' => self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB, ]; } /** * Render the settings page for this storage. * * @return void */ public static function renderGlobalOptions() { $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'ftpaddon/configs/ftp_global_options', [ 'uploadChunkSize' => $dGlobal->getVal('ftp_upload_chunksize_in_mb', self::DEFAULT_UPLOAD_CHUNK_SIZE_IN_MB), 'downloadChunkSize' => $dGlobal->getVal('ftp_download_chunksize_in_mb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB), ] ); } } addons/ftpaddon/src/Models/SFTPStorageAdapter.php000064400000056012147600374260015755 0ustar00server = $server; $this->port = (int) $port; $this->username = $username; $this->password = $password; $this->root = SnapIO::trailingslashit($root); $this->privateKey = $privateKey; $this->privateKeyPassword = $privateKeyPassword; $this->timeout = (int) $timeout; } /** * Initialize the storage on creation. * * @param string $errorMsg The error message if storage is invalid. * * @return bool true on success or false on failure. */ public function initialize(&$errorMsg = '') { if (!$this->isDir('/') && !$this->createDir('/')) { $errorMsg = 'Could not create root directory'; return false; } return true; } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { return $this->delete('/', true); } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { if (!$this->isConnectionInfoValid($errorMsg)) { return false; } if ($this->getConnection($errorMsg) === null) { return false; } if (!$this->isDir('/')) { $errorMsg = 'Root path is invalid'; return false; } return true; } /** * Check if connection info is valid * * @param string $errorMsg error message * * @return bool true if connection info is valid, false otherwise */ private function isConnectionInfoValid(&$errorMsg = '') { try { if (strlen($this->server) == 0) { throw new Exception('Server name is required to make sftp connection'); } if ($this->port < 1) { throw new Exception('Server port is required to make sftp connection'); } if (strlen($this->username) == 0) { throw new Exception('Username is required to make sftp connection'); } if (strlen($this->password) == 0 && strlen($this->privateKey) == 0) { throw new Exception('You should provide either sftp user pasword or the private key to make sftp connection'); } if (strlen($this->privateKey) > 0 && strlen($this->privateKeyPassword) == 0) { throw new Exception('You should provide private key password'); } } catch (Exception $e) { $errorMsg = $e->getMessage(); return false; } return true; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The directory path. * * @return bool true on success or false on failure. */ public function realCreateDir($path) { if (($conn = $this->getConnection()) === null) { return false; } if ($this->isDir($path)) { return true; } $path = $this->getFullPath($path, true); try { return $conn->mkdir($path, -1, true) !== false; } catch (Exception $e) { return false; } } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function realCreateFile($path, $content) { if (($conn = $this->getConnection()) === null) { return false; } if (($fullPath = $this->getFullPath($path)) === false) { return false; } try { $parentDir = dirname($path); if ($this->createDir($parentDir) === false) { return false; } if ($conn->put($fullPath, $content) === false) { return false; } return strlen($content); } catch (Exception $e) { return false; } } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { if (($conn = $this->getConnection()) === null) { return false; } if (($path = $this->getFullPath($path)) === false) { return false; } try { return $conn->get($path); } catch (Exception $e) { return false; } } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ public function realMove($oldPath, $newPath) { if (($conn = $this->getConnection()) === null) { return false; } if (($oldPath = $this->getFullPath($oldPath)) === false) { return false; } if (($newPath = $this->getFullPath($newPath)) === false) { return false; } try { return $conn->rename($oldPath, $newPath); } catch (Exception $e) { return false; } } /** * Get path info. * * @param string $path Relative storage path, if empty, return root path info. * * @return StoragePathInfo|false The path info or false if path is invalid. */ public function getRealPathInfo($path) { if (($conn = $this->getConnection()) === null) { return false; } $fullPath = $this->getFullPath($path, true); try { $info = $conn->stat($fullPath); if ($info === false) { throw new Exception('Could not get path info'); } $pathInfo = new StoragePathInfo(); $pathInfo->exists = true; $pathInfo->path = $path; $pathInfo->isDir = $info['type'] === 2; $pathInfo->size = $pathInfo->isDir ? 0 : $info['size']; $pathInfo->modified = $info['mtime']; $pathInfo->created = isset($info['ctime']) ? $info['ctime'] : $info['mtime']; return $pathInfo; } catch (Exception $e) { $pathInfo = new StoragePathInfo(); $pathInfo->path = $path; return $pathInfo; } } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { if (($conn = $this->getConnection()) === null) { return []; } $path = $this->getFullPath($path, true); try { $list = $conn->nlist($path); if ($list === false) { return []; } $result = []; foreach ($list as $item) { if ($item === '.' || $item === '..') { continue; } $itemPath = SnapIO::trailingslashit($path) . $item; if ($conn->is_dir($itemPath)) { if ($folders) { $result[] = $item; } } else { if ($files) { $result[] = $item; } } } return $result; } catch (Exception $e) { return []; } } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { if ($this->isDir($path) === false) { return false; } $regexFilters = []; $normalFilters = []; foreach ($filters as $filter) { if (preg_match('/^\/.*\/$/', $filter) === 1) { $regexFilters[] = $filter; } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $startTime = microtime(true); if (($conn = $this->getConnection()) === null) { return false; } if (($storageFileFullPath = $this->getFullPath($storageFile)) === false) { return false; } $parentDir = dirname($storageFile); if ($offset === 0 && !$this->createDir($parentDir)) { return false; } //Uplaod file at once without any other operation if (($timeout === 0 && $offset === 0 && $length < 0) || filesize($sourceFile) < $length) { if (($content = file_get_contents($sourceFile)) === false) { return false; } return $this->createFile($storageFile, $content); } if (($sourceFileHandle = $this->getSourceFileHandle($sourceFile)) === false) { return false; } if (@fseek($sourceFileHandle, $offset) === -1) { return false; } $bytesWritten = 0; $length = $length < 0 ? self::DEFAULT_CHUNK_SIZE : $length; try { $result = $conn->put( $storageFileFullPath, function ($size) use ($timeout, $startTime, &$bytesWritten, $sourceFileHandle, $length) { if ($timeout !== 0 && (microtime(true) - $startTime) * SECONDS_IN_MICROSECONDS > $timeout) { return null; } if ($timeout === 0 && $bytesWritten >= $length) { return null; } if (feof($sourceFileHandle)) { return null; } if (($data = @fread($sourceFileHandle, $size)) === false) { return null; } return $data; }, SFTP::SOURCE_CALLBACK | SFTP::RESUME, $offset, -1, function ($sent) use (&$bytesWritten) { $bytesWritten = $sent; } ); if ($result === false) { return false; } } catch (Exception $e) { return false; } return $timeout === 0 ? $length : $bytesWritten; } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $startTime = microtime(true); if (($conn = $this->getConnection()) === null) { return false; } if (($fullPath = $this->getFullPath($storageFile)) === false) { return false; } if (wp_mkdir_p(dirname($destFile)) == false) { return false; } if ($offset === 0 && @file_exists($destFile) && !@unlink($destFile)) { return false; } if (!$this->isFile($storageFile)) { return false; } if ($timeout === 0 && $offset === 0 && $length < 0) { if (($content = $this->getFileContent($storageFile)) === false) { return false; } return @file_put_contents($destFile, $content); } if (($handle = $this->getDestFileHandle($destFile)) === false) { return false; } $bytesWritten = 0; $length = $length < 0 ? self::DEFAULT_CHUNK_SIZE : $length; try { do { $content = $conn->get($fullPath, false, $offset, $length); if ( $content === false || @fseek($handle, $offset) === -1 || @fwrite($handle, $content) === false ) { return false; } if ($timeout === 0) { return $length; } $bytesWritten += strlen($content); $offset += strlen($content); } while (self::getElapsedTime($startTime) < $timeout && $content !== false); } catch (Exception $e) { return false; } return $bytesWritten; } /** * Returns an SFTP object * * @param string $errorMsg error message * * @return ?SFTP */ private function getConnection(&$errorMsg = '') { if ($this->connection instanceof SFTP) { return $this->connection; } try { if (!$this->isConnectionInfoValid($errorMsg)) { throw new Exception($errorMsg); } $this->connection = new SFTP($this->server, $this->port, $this->timeout); if (strlen($this->privateKey) > 0) { if (($key = $this->getPrivateKey()) === null) { throw new Exception('Invalid private key'); } if (!$this->connection->login($this->username, $key)) { throw new Exception('Invalid username or private key'); } } else { if (!$this->connection->login($this->username, $this->password)) { throw new Exception('Invalid username or password'); } } } catch (Exception $e) { if ($this->connection !== null && $this->connection->isConnected()) { $this->connection->disconnect(); } $this->connection = null; $errorMsg = $e->getMessage(); return null; } return $this->connection; } /** * Set an SFTP Private Key * * @return ?PrivateKey return key object or null */ protected function getPrivateKey() { if (strlen($this->privateKey) == 0) { return null; } $password = strlen($this->privateKeyPassword) > 0 ? $this->privateKeyPassword : false; $key = PublicKeyLoader::load($this->privateKey, $password); if ($key instanceof PrivateKey) { return $key; } else { return null; } } /** * Delete reletative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ public function realDelete($path, $recursive = false) { if (($conn = $this->getConnection()) === null) { return false; } if ($this->exists($path) === false) { return true; } $fullPath = $this->getFullPath($path, true); try { // have to use hack below because phpseclib doesn't work well with // directories in none recursive mode $isDir = $this->isDir($path); $isEmptyDir = $isDir && $this->isDirEmpty($path); if ($isDir) { if ($isEmptyDir === false && $recursive === false) { return false; } return $conn->delete($fullPath, true); } else { return $conn->delete($fullPath); } } catch (Exception $e) { return false; } } /** * Return the full path of storage from relative path. * * @param string $path The relative storage path * @param bool $acceptEmpty If true, return root path if path is empty. Default to false. * * @return string|false The full path or false if path is invalid. */ protected function getFullPath($path, $acceptEmpty = false) { $path = ltrim((string) $path, '/\\'); if (strlen($path) === 0) { return $acceptEmpty ? SnapIO::untrailingslashit($this->root) : false; } return $this->root . $path; } /** * Returns the source file handle * * @param string $destFilePath The source file path * * @return resource|false returns the file handle or false on failure */ private function getDestFileHandle($destFilePath) { if ($this->lastDestFilePath === $destFilePath) { return $this->destFileHandle; } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } if (($this->destFileHandle = @fopen($destFilePath, 'cb')) === false) { return false; } $this->lastDestFilePath = $destFilePath; return $this->destFileHandle; } /** * Returns the source file handle * * @param string $sourceFilePath The source file path * * @return resource|false */ private function getSourceFileHandle($sourceFilePath) { if ($this->lastSourceFilePath === $sourceFilePath) { return $this->sourceFileHandle; } if (is_resource($this->sourceFileHandle)) { @fclose($this->sourceFileHandle); } if (($this->sourceFileHandle = @fopen($sourceFilePath, 'r')) === false) { return false; } $this->lastSourceFilePath = $sourceFilePath; return $this->sourceFileHandle; } /** * Get elapsed time in microseconds * * @param float $startTime start time * * @return float */ private function getElapsedTime($startTime) { return (microtime(true) - $startTime) * SECONDS_IN_MICROSECONDS; } /** * Class destructor * * @return void */ public function __destruct() { if ($this->connection !== null && $this->connection->isConnected()) { $this->connection->disconnect(); } } } addons/ftpaddon/src/Models/FTPStorageAdapter.php000064400000076466147600374260015651 0ustar00server = $server; $this->port = (int) $port; $this->username = $username; $this->password = $password; $this->root = SnapIO::trailingslashit($root); $this->timeoutInSec = max(1, (int) $timeoutInSec); $this->ssl = (bool) $ssl; $this->passiveMode = (bool) $passiveMode; $this->throttle = max(0, (int) $throttle); } /** * Opens the FTP connection and initializes root directory * * @param string $errorMsg The error message to return * * @return bool True on success, false on failure */ public function initialize(&$errorMsg = '') { if (!$this->createDir('/')) { $errorMsg = "Couldn't create root directory."; return false; } $this->wait(); return true; } /** * Throttle the connection * * @return void */ protected function wait() { if ($this->throttle > 0) { usleep($this->throttle); } } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { if (!$this->isConnectionInfoValid($errorMsg)) { $errorMsg = "FTP connection info is invalid: " . $errorMsg; return false; } if ($this->getConnection() === false) { $errorMsg = "FTP connection failed."; return false; } if (!$this->isDir('/')) { $errorMsg = "FTP root directory doesn't exist."; return false; } return true; } /** * Checks if the connection info is valid * * @param string $errorMsg The error message to return * * @return bool */ protected function isConnectionInfoValid(&$errorMsg = '') { if (strlen($this->server) < 1) { $errorMsg = "FTP server is empty."; return false; } if (strlen($this->username) < 1) { $errorMsg = "FTP username is empty."; return false; } if ($this->port < 1) { $errorMsg = "FTP port is invalid."; return false; } if (strlen($this->root) < 1) { $errorMsg = "FTP root directory is empty."; return false; } return true; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The relative directory path. * * @return bool true on success or false on failure. */ protected function realCreateDir($path) { $isRoot = ($this->getFullPath($path) === false); if ($isRoot) { $path = $this->root; } else { $path = $this->getFullPath($path); } return $this->createDirRecursively($path); } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The full path to the directory. * * @return bool true on success or false on failure. */ private function createDirRecursively($path) { try { if (($connection = $this->getConnection()) === false) { return false; } if (@ftp_chdir($connection, $path) === true) { if ($path !== $this->root) { @ftp_chdir($connection, $this->root); } return true; } $parent = dirname($path); if (!$this->createDirRecursively($parent)) { return false; } if (@ftp_mkdir($connection, $path) === false) { return false; } } finally { $this->wait(); } return true; } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { if (($infoList = $this->getDirContentsInfo($path)) === false) { return $this->scanDirNlist($path, $files, $folders); } $result = []; foreach ($infoList as $item) { if ($item['isDir'] && !$folders) { continue; } if (!$item['isDir'] && !$files) { continue; } $result[] = $item['name']; } return $result; } /** * Get the list of files and directories inside the specified path. * Uses ftp_nlist() to get the list of files and directories. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ private function scanDirNlist($path, $files = true, $folders = true) { if (($connection = $this->getConnection()) === false) { return []; } if (($fullPath = $this->getFullPath($path, true)) == false) { return []; } if (($list = @ftp_nlist($connection, "$fullPath")) === false) { return []; } $path = SnapIO::trailingslashit($path); $result = []; foreach ($list as $item) { $item = basename($item); if ($item == '.' || $item == '..') { continue; } $itemPath = $path . $item; if (!$folders && $this->isDir($itemPath)) { continue; } if (!$files && $this->isFile($itemPath)) { continue; } $result[] = $item; } return $result; } /** * Get the list of files and directories inside the specified path. * Uses ftp_rawlist() to get the list of files and directories. * * @param string $path Relative storage path, if empty, scan root path. * @param string $defaultSystemType The default system type to use if ftp_systype() fails. * * @return array{array{name: string, size: int, modified: int, created: int, isDir: bool}}|false */ private function getDirContentsInfo($path, $defaultSystemType = '') { if (($connection = $this->getConnection()) === false) { return false; } if (($systemType = @ftp_systype($connection)) === false || strlen($systemType) === 0) { if (strlen($defaultSystemType) > 0) { $systemType = strtoupper($defaultSystemType); } else { return false; } } else { $systemType = strtoupper($systemType); if ($systemType !== FTPUtils::SYS_TYPE_UNIX && $systemType !== FTPUtils::SYS_TYPE_WINDOWS_NT) { return false; } } $path = $this->getFullPath($path, true); if (($list = @ftp_rawlist($connection, "$path")) === false) { return false; } $result = []; foreach ($list as $item) { if (($item = FTPUtils::parseRawListString($item, $systemType)) === false) { continue; } if ($item['name'] == '.' || $item['name'] == '..') { continue; } $result[] = $item; } return $result; } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { if (!$this->isDir($path)) { return false; } $regexFilters = []; $normalFilters = []; foreach ($filters as $filter) { if (preg_match('/^\/.*\/$/', $filter) === 1) { $regexFilters[] = $filter; } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Get path info and cache it, is path not exists return path info with exists property set to false. * Gets the path info but has to do seperate calls to get the size and modified time. * Also the modified time doesn't work for directories. * * @param string $path Relative storage path, if empty, return root path info. * * @return StoragePathInfo|false The path info or false on error. */ protected function getRealPathInfo($path) { if (($connection = $this->getConnection()) === false) { return false; } $fullPath = $this->getFullPath($path, true); $info = new StoragePathInfo(); $info->path = $path; if ( ($size = @ftp_size($connection, $fullPath)) >= 0 || ($size = $this->getSizeFromRawList($path)) >= 0 ) { $info->exists = true; $info->isDir = false; $info->size = $size; } elseif (@ftp_chdir($connection, $fullPath) === true) { if ($fullPath !== $this->getFullPath('', true)) { @ftp_chdir($connection, $this->root); } $info->exists = true; $info->isDir = true; $info->size = 0; } else { $info->exists = false; $info->isDir = false; $info->size = 0; } if ($info->exists) { if ($info->isDir) { $info->modified = time(); } else { if (($info->modified = (int) @ftp_mdtm($connection, $fullPath)) === -1) { $info->modified = 0; } } $info->created = $info->modified; } return $info; } /** * Get the size of the file. * * @param string $path The path to file. * * @return int<-1,max> The size of file or -1 on failure. */ protected function getSizeFromRawList($path) { $parent = dirname($path) !== '.' ? dirname($path) : ''; if (($contents = $this->getDirContentsInfo($parent, FTPUtils::SYS_TYPE_UNIX)) === false) { return -1; } foreach ($contents as $item) { if ($item['name'] === basename($path) && $item['isDir'] === false) { return $item['size']; } } return -1; } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCreateFile($path, $content) { try { if (($connection = $this->getConnection()) === false) { return false; } if (($storageFileFullPath = $this->getFullPath($path)) == false) { return false; } $parent = dirname($path); if (!$this->createDir($parent)) { return false; } $tmpFile = tempnam(sys_get_temp_dir(), 'duplicator-pro-'); if (($bytesWritten = file_put_contents($tmpFile, $content)) === false) { return false; } //ftp_put overwrites the file if it exists, no need to delete it first if (@ftp_put($connection, $storageFileFullPath, $tmpFile, FTP_BINARY) === false) { SnapIO::unlink($tmpFile); return false; } SnapIO::unlink($tmpFile); return $bytesWritten; } finally { $this->wait(); } } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { try { $startTime = microtime(true); if (($connection = $this->getConnection()) === false) { return false; } if (!is_file($sourceFile)) { return false; } if (($storageFileFullPath = $this->getFullPath($storageFile)) == false) { return false; } $parent = dirname($storageFile); if ($offset === 0 && !$this->createDir($parent)) { return false; } // Uplaod file at once without any other operation if ($timeout === 0 && (($offset === 0 && $length < 0) || filesize($sourceFile) < $length)) { if (@ftp_put($connection, $storageFileFullPath, $sourceFile, FTP_BINARY) === false) { return false; } return filesize($sourceFile); } $sourceFileHandle = $this->getSourceFileHandle($sourceFile); $tempFileHandle = $this->getTempFileHandle(); $length = $length < 0 ? self::DEFAULT_CHUNK_SIZE : $length; $bytesWritten = 0; do { if (@fseek($sourceFileHandle, $offset) === -1 || ($chunk = @fread($sourceFileHandle, $length)) === false) { return false; } if ( @ftruncate($tempFileHandle, 0) === false || @rewind($tempFileHandle) === false || @fwrite($tempFileHandle, $chunk) === false ) { return false; } @rewind($tempFileHandle); // No need to delete remote file, ftp_fput overwrites the file if the offset is 0 if (@ftp_fput($connection, $storageFileFullPath, $tempFileHandle, FTP_BINARY, $offset) === false) { return false; } //abort on first chunk if no timeout set if ($timeout === 0) { return $length; } $bytesWritten += strlen($chunk); $offset += strlen($chunk); } while ((self::getElapsedTime($startTime) < $timeout) && !feof($sourceFileHandle)); return $bytesWritten; } finally { $this->wait(); } } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { try { $startTime = microtime(true); if (($connection = $this->getConnection()) === false) { return false; } if (($fullPath = $this->getFullPath($storageFile)) === false) { return false; } if (wp_mkdir_p(dirname($destFile)) == false) { return false; } if ($offset === 0 && @file_exists($destFile) && !@unlink($destFile)) { return false; } if (!$this->isFile($storageFile)) { return false; } if ($timeout === 0 && $offset === 0 && $length < 0) { if (($content = $this->getFileContent($storageFile)) === false) { return false; } return @file_put_contents($destFile, $content); } if ( ($destHandle = $this->getDestFileHandle($destFile)) === false || @fseek($destHandle, $offset) === -1 ) { return false; } //This is necessary to be able to call this function multiple times in one session //Otherwise ftp_nb_fget will fail if the file is already opened for upload if (isset($extraData['multiPartInProgress']) && $extraData['multiPartInProgress'] === true) { if (($connection = $this->resetConnection()) === false) { return false; } } else { $extraData['multiPartInProgress'] = true; } $sizeBefore = filesize($destFile); $result = @ftp_nb_fget($connection, $destHandle, $fullPath, FTP_BINARY, $offset); while ( $result === FTP_MOREDATA && ( ($timeout !== 0 && self::getElapsedTime($startTime) < $timeout) || ($timeout === 0 && @ftell($destHandle) - $sizeBefore <= $length) ) ) { $result = @ftp_nb_continue($connection); } if ($result === FTP_FAILED) { return false; } if ($timeout !== 0) { return @ftell($destHandle) - $sizeBefore; } else { return $length; } } finally { $this->wait(); } } /** * Resets the connection * * @return false|resource|Connection True on success, false on failure */ private function resetConnection() { if ($this->connection !== false) { @ftp_close($this->connection); } $this->connection = false; if (($connection = $this->getConnection()) === false) { return false; } return $connection; } /** * Delete reletative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ protected function realDelete($path, $recursive = false) { try { if (($connection = $this->getConnection()) === false) { return false; } if (($fullPath = $this->getFullPath($path, true)) == false) { return false; } if ($this->isDir($path)) { if ($recursive) { foreach ($this->scanDir($path) as $item) { if (!$this->delete(SnapIO::trailingslashit($path) . $item, true)) { return false; } } } return @ftp_rmdir($connection, $fullPath); } elseif ($this->isFile($path)) { return @ftp_delete($connection, $fullPath); } else { //path doesn't exist return true; } } finally { $this->wait(); } } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { if (($connection = $this->getConnection()) === false) { return false; } if (($fullPath = $this->getFullPath($path)) == false) { return false; } $tmpFile = tempnam(sys_get_temp_dir(), 'duplicator-pro'); if (@ftp_get($connection, $tmpFile, $fullPath, FTP_BINARY) === false) { SnapIO::unlink($tmpFile); return false; } if (($content = file_get_contents($tmpFile)) === false) { SnapIO::unlink($tmpFile); return false; } SnapIO::unlink($tmpFile); return $content; } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ protected function realMove($oldPath, $newPath) { try { if (($connection = $this->getConnection()) === false) { return false; } $newPathParent = dirname($newPath); if (!$this->createDir($newPathParent)) { return false; } if (($oldPath = $this->getFullPath($oldPath)) == false) { return false; } if (($newPath = $this->getFullPath($newPath)) == false) { return false; } return @ftp_rename($connection, $oldPath, $newPath); } finally { $this->wait(); } } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { //Don't accidentally delete root directory if ( preg_match('/^[a-zA-Z]:\/$/', $this->root) === 1 || preg_match('/^\/$/', $this->root) === 1 ) { return true; } return $this->delete('/', true); } /** * Returns an empty file stream to temporarlly store chunk data. * * @return resource */ private function getTempFileHandle() { if (is_resource($this->tempFileHandle)) { if (ftruncate($this->tempFileHandle, 0) === false) { throw new Exception('Can\'t truncate temp file'); } return $this->tempFileHandle; } if (($this->tempFileHandle = @fopen('php://temp', 'wb+')) === false) { throw new Exception('Can\'t open temp handle'); } return $this->tempFileHandle; } /** * Returns the dest file handle * * @param string $destFilePath The dest file path * * @return resource|false The dest file handle or false on failure */ private function getDestFileHandle($destFilePath) { if ($this->lastDestFilePath === $destFilePath && is_resource($this->destFileHandle)) { return $this->destFileHandle; } if (@is_resource($this->destFileHandle)) { @fclose($this->destFileHandle); } if (($this->destFileHandle = @fopen($destFilePath, 'cb')) === false) { return false; } $this->lastDestFilePath = $destFilePath; return $this->destFileHandle; } /** * Returns the source file handle * * @param string $sourceFilePath The source file path * * @return resource */ private function getSourceFileHandle($sourceFilePath) { if ($this->lastSourceFilePath === $sourceFilePath) { return $this->sourceFileHandle; } if (is_resource($this->sourceFileHandle)) { fclose($this->sourceFileHandle); } if (($this->sourceFileHandle = SnapIO::fopen($sourceFilePath, 'r')) === false) { throw new Exception('Can\'t open ' . $sourceFilePath . ' file'); } $this->lastSourceFilePath = $sourceFilePath; return $this->sourceFileHandle; } /** * Opens the FTP connection * * @param string $errorMsg The error message to return * * @return bool True on success, false on failure */ private function connect(&$errorMsg = '') { if ($this->connection !== false) { return true; } if (!$this->isConnectionInfoValid($errorMsg)) { return false; } try { if (!function_exists('ftp_connect')) { throw new Exception('FTP functions are not available.'); } if ($this->ssl && !function_exists('ftp_ssl_connect')) { throw new Exception('Attempted to open FTP SSL connection when OpenSSL hasn\'t been statically built into this PHP install.'); } if ($this->ssl) { $this->connection = @ftp_ssl_connect($this->server, $this->port, $this->timeoutInSec); } else { $this->connection = @ftp_connect($this->server, $this->port, $this->timeoutInSec); } if ($this->connection === false) { throw new Exception('Error connecting to FTP server. ' . $this->server . ':' . $this->port); } if (ftp_login($this->connection, $this->username, $this->password) === false) { throw new Exception('Error logging in user ' . $this->username . ', double check your username and password'); } if ($this->passiveMode && !@ftp_pasv($this->connection, true)) { throw new Exception("Couldn't set the connection into passive mode."); } if (ftp_set_option($this->getConnection(), FTP_AUTOSEEK, false) === false) { throw new Exception("Couldn't disable auto seek."); } } catch (Exception $e) { if ($this->connection !== false) { ftp_close($this->connection); $this->connection = false; } $errorMsg = $e->getMessage(); return false; } return true; } /** * Returns the FTP connection resource * * @return false|resource|Connection The FTP connection resource or false if not connected */ public function getConnection() { return ($this->connect() === true ? $this->connection : false); } /** * Closes the FTP connection */ public function __destruct() { if ($this->connection !== false) { @ftp_close($this->connection); } if (is_resource($this->sourceFileHandle)) { @fclose($this->sourceFileHandle); } if (is_resource($this->tempFileHandle)) { @fclose($this->tempFileHandle); } if (is_resource($this->destFileHandle)) { @fclose($this->destFileHandle); } } /** * Return the full path of storage from relative path. * * @param string $path The relative storage path * @param bool $acceptEmpty If true, return root path if path is empty. Default to false. * * @return string|false The full path or false if path is invalid. */ protected function getFullPath($path, $acceptEmpty = false) { $path = ltrim((string) $path, '/\\'); if (strlen($path) === 0) { return $acceptEmpty ? SnapIO::untrailingslashit($this->root) : false; } return $this->root . $path; } /** * Get the elapsed time in microseconds * * @param float $startTime The start time * * @return float The elapsed time in microseconds */ private static function getElapsedTime($startTime) { return (microtime(true) - $startTime) * SECONDS_IN_MICROSECONDS; } } addons/ftpaddon/src/Models/SFTPStorage.php000064400000037244147600374260014462 0ustar00adapter !== null) { return $this->adapter; } $this->adapter = new SFTPStorageAdapter( $this->config['server'], $this->config['port'], $this->config['username'], $this->config['password'], $this->config['storage_folder'], $this->config['private_key'], $this->config['private_key_password'], $this->config['timeout_in_secs'] ); return $this->adapter; } /** * Get default config * * @return array */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge( $config, [ 'server' => '', 'port' => 22, 'username' => '', 'password' => '', 'private_key' => '', 'private_key_password' => '', 'timeout_in_secs' => 15, ] ); return $config; } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'server' => $this->sftp_server, 'port' => $this->sftp_port, 'username' => $this->sftp_username, 'password' => $this->sftp_password, 'private_key' => $this->sftp_private_key, 'private_key_password' => $this->sftp_private_key_password, 'storage_folder' => '/' . ltrim($this->sftp_storage_folder, '/\\'), 'max_packages' => $this->sftp_max_files, 'timeout_in_secs' => $this->sftp_timeout_in_secs, ]; // reset old values $this->sftp_server = ''; $this->sftp_port = 22; $this->sftp_username = ''; $this->sftp_password = ''; $this->sftp_private_key = ''; $this->sftp_private_key_password = ''; $this->sftp_storage_folder = ''; $this->sftp_max_files = 10; $this->sftp_timeout_in_secs = 15; $this->sftp_disable_chunking_mode = false; } // For legacy entities, we need to make sure the config is up to date $this->config['port'] = (int) $this->config['port']; $this->config['max_packages'] = (int) $this->config['max_packages']; $this->config['timeout_in_secs'] = (int) $this->config['timeout_in_secs']; } /** * Return the storage type * * @return int */ public static function getSType() { return 5; } /** * Returns the FontAwesome storage type icon. * * @return string Returns the font-awesome icon */ public static function getStypeIcon() { return ''; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('SFTP', 'duplicator-pro'); } /** * Get storage location string * * @return string */ public function getLocationString() { return $this->config['server'] . ":" . $this->config['port']; } /** * Get priority, used to sort storages. * 100 is neutral value, 0 is the highest priority * * @return int */ public static function getPriority() { return 90; } /** * Check if storage is supported * * @return bool */ public static function isSupported() { return extension_loaded('gmp'); } /** * Get supported notice, displayed if storage isn't supported * * @return string html string or empty if storage is supported */ public static function getNotSupportedNotice() { if (static::isSupported()) { return ''; } return sprintf( _x( 'SFTP requires the %1$sgmp extension%2$s. Please contact your host to install.', '1: tag, 2: tag', 'duplicator-pro' ), '', '' ); } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->getAdapter()->isValid(); } /** * Get action key text * * @param string $key Key name (action, pending, failed, cancelled, success) * * @return string */ protected function getUploadActionKeyText($key) { switch ($key) { case 'action': return sprintf( __('Transferring to SFTP server %1$s in folder:
%2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'pending': return sprintf( __('Transfer to SFTP server %1$s in folder %2$s is pending', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'failed': return sprintf( __('Failed to transfer to SFTP server %1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'cancelled': return sprintf( __('Cancelled before could transfer to SFTP server:
%1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'success': return sprintf( __('Transferred package to SFTP server:
%1$s in folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); default: throw new Exception('Invalid key'); } } /** * Get action key text * * @param string $key Key name (action, pending, failed, cancelled, success) * * @return string */ protected function getDownloadActionKeyText($key) { switch ($key) { case 'action': return sprintf( __('Downloading from SFTP server %1$s from folder:
%2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'pending': return sprintf( __('Download from SFTP server %1$s from folder %2$s is pending', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'failed': return sprintf( __('Failed to download from SFTP server %1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'cancelled': return sprintf( __('Cancelled before could download from SFTP server:
%1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); case 'success': return sprintf( __('Downloaded package from SFTP server:
%1$s from folder %2$s', "duplicator-pro"), $this->config['server'], $this->getStorageFolder() ); default: throw new Exception('Invalid key'); } } /** * List quick view * * @param bool $echo Echo or return * * @return string */ public function getListQuickView($echo = true) { ob_start(); ?>
config['server']); ?>: config['port']); ?>
getHtmlLocationLink(), [ 'a' => [ 'href' => [], 'target' => [], ], ] ); ?>
render( 'ftpaddon/configs/sftp', [ 'storage' => $this, 'server' => $this->config['server'], 'port' => $this->config['port'], 'username' => $this->config['username'], 'password' => $this->config['password'], 'privateKey' => $this->config['private_key'], 'privateKeyPwd' => $this->config['private_key_password'], 'storageFolder' => $this->config['storage_folder'], 'maxPackages' => $this->config['max_packages'], 'timeout' => $this->config['timeout_in_secs'], ], $echo ); } /** * Get upload chunk size in bytes * * @return int bytes */ public function getUploadChunkSize() { return -1; } /** * Get upload chunk size in bytes * * @return int bytes */ public function getDownloadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); return $dGlobal->getVal('sftp_download_chunksize_in_mb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB) * 1024 * 1024; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { return (int) ($this->config['timeout_in_secs'] <= 0 ? 0 : $this->config['timeout_in_secs'] * SECONDS_IN_MICROSECONDS); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return ['sftp_download_chunksize_in_mb' => self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB]; } /** * Render the settings page for this storage. * * @return void */ public static function renderGlobalOptions() { $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'ftpaddon/configs/sftp_global_options', [ 'downloadChunkSize' => $dGlobal->getVal('sftp_download_chunksize_in_mb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_MB), ] ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'sftp_max_files', 10); $this->config['server'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_server', ''); $this->config['port'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'sftp_port', 10); $this->config['username'] = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_username', ''); $password = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_password', ''); $password2 = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_password2', ''); $this->config['private_key'] = SnapUtil::sanitizeDefaultInput(SnapUtil::INPUT_REQUEST, 'sftp_private_key', ''); $keyPassword = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_private_key_password', ''); $keyPassword2 = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'sftp_private_key_password2', ''); if (strlen($password) > 0) { if ($password !== $password2) { $message = __('Passwords do not match', 'duplicator-pro'); return false; } $this->config['password'] = $password; } elseif (strlen($keyPassword) > 0) { if ($keyPassword !== $keyPassword2) { $message = __('Private key Passwords do not match', 'duplicator-pro'); return false; } $this->config['private_key_password'] = $keyPassword; } $this->config['storage_folder'] = self::getSanitizedInputFolder('_sftp_storage_folder', 'add'); $this->config['timeout_in_secs'] = max(10, SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'sftp_timeout_in_secs', 15)); $errorMsg = ''; if ($this->getAdapter()->initialize($errorMsg) === false) { $message = sprintf( __('Failed to connect to SFTP server with message: %1$s', 'duplicator-pro'), $errorMsg ); return false; } $message = sprintf( __('SFTP Storage Updated - Server %1$s, Folder %2$s was created.', 'duplicator-pro'), $this->config['server'], $this->getStorageFolder() ); return true; } /** * Register storage type * * @return void */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } $dGlobal->save(); }); } } addons/ftpaddon/src/Models/FTPCurlStorageAdapter.php000064400000074515147600374260016470 0ustar00server = $server; $this->port = (int) $port; $this->username = $username; $this->password = $password; $this->root = SnapIO::trailingslashit($root); $this->timeoutInSec = max(1, (int) $timeoutInSec); $this->ssl = (bool) $ssl; $this->passiveMode = (bool) $passiveMode; $this->throttle = max(0, (int) $throttle); $this->sslVerify = (bool) $sslVerify; $this->sslCertificate = $sslCertificate; } /** * Opens the FTP connection and initializes root directory * * @param string $errorMsg The error message to return * * @return bool True on success, false on failure */ public function initialize(&$errorMsg = '') { if (!$this->isDir('/') && !$this->createDir('/')) { $errorMsg = "Couldn't create root directory."; return false; } $this->wait(); return true; } /** * Throttle the connection * * @return void */ protected function wait() { if ($this->throttle > 0) { usleep($this->throttle); } } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { if (!$this->isConnectionInfoValid($errorMsg)) { $errorMsg = "FTP connection info is invalid: " . $errorMsg; return false; } if ($this->testConnection($errorMsg) === false) { $errorMsg = "FTP connection failed: " . $errorMsg; return false; } if (!$this->isDir('/')) { $errorMsg = "FTP root directory doesn't exist."; return false; } return true; } /** * Checks if the connection info is valid * * @param string $errorMsg The error message to return * * @return bool */ protected function isConnectionInfoValid(&$errorMsg = '') { if (strlen($this->server) < 1) { $errorMsg = "FTP server is empty."; return false; } if (strlen($this->username) < 1) { $errorMsg = "FTP username is empty."; return false; } if (strlen($this->password) < 1) { $errorMsg = "FTP password is empty."; return false; } if ($this->port < 1) { $errorMsg = "FTP port is invalid."; return false; } if (strlen($this->root) < 1) { $errorMsg = "FTP root directory is empty."; return false; } return true; } /** * test ftp connection * * @param string $errorMsg error message * * @return boolean */ private function testConnection(&$errorMsg = '') { $path = $this->getFullPath('/', true); return $this->curlCall($path, [CURLOPT_TIMEOUT => $this->timeoutInSec]) !== false; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The directory path. * * @return bool true on success or false on failure. */ protected function realCreateDir($path) { try { $path = SnapIO::trailingslashit($this->getFullPath($path, true)); return $this->curlCall($path, [CURLOPT_FTP_CREATE_MISSING_DIRS => true]) !== false; } finally { $this->wait(); } } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCreateFile($path, $content) { try { if (($fullPath = $this->getFullPath($path)) === false) { return false; } if ($this->exists($path) && !$this->delete($path)) { return false; } $tmpFile = tempnam(sys_get_temp_dir(), 'duplicator-pro-'); if (($bytesWritten = file_put_contents($tmpFile, $content)) === false) { return false; } if (($stream = @fopen($tmpFile, 'r')) === false) { return false; } $success = $this->curlCall( $fullPath, [ CURLOPT_UPLOAD => true, CURLOPT_NOPROGRESS => true, CURLOPT_FTP_CREATE_MISSING_DIRS => true, CURLOPT_INFILE => $stream, CURLOPT_INFILESIZE => $bytesWritten, ] ); @fclose($stream); if ($success === false) { return false; } return $bytesWritten; } finally { $this->wait(); } } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { if (($path = $this->getFullPath($path)) === false) { return false; } if (($content = $this->curlCall($path)) === false) { return false; } return $content; } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ protected function realMove($oldPath, $newPath) { try { if (($fullOldPath = $this->getFullPath($oldPath)) === false) { return false; } if (($fullNewPath = $this->getFullPath($newPath)) === false) { return false; } return $this->curlCall('/', [CURLOPT_QUOTE => ["RNFR " . $fullOldPath, "RNTO " . $fullNewPath]]) !== false; } finally { $this->wait(); } } /** * Delete reletative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ protected function realDelete($path, $recursive = false) { try { $fullPath = $this->getFullPath($path, true); if ($this->isDir($path)) { $fullPath = SnapIO::trailingslashit($fullPath); if ($recursive) { foreach ($this->scanDir($path) as $item) { if (!$this->realDelete(SnapIO::trailingslashit($path) . $item, true)) { return false; } } } return $this->curlCall('/', [CURLOPT_QUOTE => ["RMD " . $fullPath]]) !== false; } elseif ($this->isFile($path)) { return $this->curlCall('/', [CURLOPT_QUOTE => ["DELE " . $fullPath]]) !== false; } else { //path doesn't exist return true; } } finally { $this->wait(); } } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { try { $startTime = microtime(true); if (($storageFileFullPath = $this->getFullPath($storageFile)) === false) { return false; } if (!is_file($sourceFile)) { return false; } if ($offset === 0 && $this->isFile($storageFile) && !$this->delete($storageFile)) { return false; } // Uplaod file at once without any other operation if (($timeout === 0 && $offset === 0 && $length < 0) || filesize($sourceFile) < $length) { if (($content = @file_get_contents($sourceFile)) === false) { return false; } return $this->createFile($storageFile, $content); } if ( ($sourceFileHandle = $this->getSourceFileHandle($sourceFile)) === false || ($tempFileHandle = $this->getTempFileHandle()) === false ) { return false; } $bytesWritten = 0; $length = $length < 0 ? self::DEFAULT_CHUNK_SIZE : $length; do { if ( @fseek($sourceFileHandle, $offset) === -1 || ($chunk = @fread($sourceFileHandle, $length)) === false ) { return false; } if ( @ftruncate($tempFileHandle, 0) === false || @rewind($tempFileHandle) === false || @fwrite($tempFileHandle, $chunk) === false ) { return false; } @rewind($tempFileHandle); $result = $this->curlCall( $storageFileFullPath, [ CURLOPT_FTPAPPEND => true, CURLOPT_UPLOAD => true, CURLOPT_FTP_CREATE_MISSING_DIRS => true, CURLOPT_INFILE => $tempFileHandle, CURLOPT_INFILESIZE => strlen($chunk), ] ); if ($result === false) { return false; } //abort on first chunk if no timeout if ($timeout === 0) { return $length; } $bytesWritten += strlen($chunk); $offset += strlen($chunk); } while ($timeout !== 0 && self::getElapsedTime($startTime) < $timeout && !feof($sourceFileHandle)); return $bytesWritten; } finally { $this->wait(); } } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { try { $startTime = microtime(true); if (($fullPath = $this->getFullPath($storageFile)) === false) { return false; } if (wp_mkdir_p(dirname($destFile)) == false) { return false; } if ($offset === 0) { if (@file_exists($destFile) && !@unlink($destFile)) { return false; } if (!$this->isFile($storageFile)) { return false; } if ($timeout === 0 && $length < 0) { if (($content = $this->getFileContent($storageFile)) === false) { return false; } return @file_put_contents($destFile, $content); } } if (($handle = $this->getDestFileHandle($destFile)) === false) { return false; } if (@fseek($handle, $offset) === -1) { return false; } $bytesWritten = 0; $length = $length < 0 ? self::DEFAULT_CHUNK_SIZE : $length; do { if (@fseek($handle, $offset) === -1) { return false; } $content = $this->curlCall( $fullPath, [ CURLOPT_RANGE => sprintf('%d-%d', $offset, $offset + $length - 1), ] ); if ( $content === false || (strlen($content) > 0 && @fwrite($handle, $content) === false) ) { return false; } if ($timeout === 0) { return $length; } $bytesWritten += strlen($content); $offset += strlen($content); } while ($timeout !== 0 && self::getElapsedTime($startTime) < $timeout && strlen($content) > 0); return $bytesWritten; } finally { $this->wait(); } } /** * Get all files meta information in a folder * * @param string $path remote dir path * @param bool $filterDots filters . and .. from the list * * @return array{array{name: string, size: int, modified: int, created: int, isDir: bool}}|array{} */ private function getRawListInfo($path, $filterDots = true) { //direactories need the trailing slash to be recognized as such $path = SnapIO::trailingslashit($this->getFullPath($path, true)); $res = $this->curlCall($path, [CURLOPT_CUSTOMREQUEST => 'LIST']); if ($res === false) { return []; } $items = explode("\n", $res); $items = array_filter($items, function ($item) { return !empty($item); }); if (empty($items)) { return []; } if (strpos($items[0], 'total') !== false) { array_shift($items); } $result = []; foreach ($items as $key => $item) { if (($parsed = FTPUtils::parseRawListString($item, $this->getSystemType())) !== false) { if ($filterDots && ($parsed['name'] === '.' || $parsed['name'] === '..')) { continue; } $result[] = $parsed; } } return $result; } /** * Get System type * * @return string */ private function getSystemType() { if (($res = $this->curlCall('/', [CURLOPT_CUSTOMREQUEST => 'SYST'])) === false) { return 'UNIX'; } $res = strtoupper($res); if (strpos($res, 'WINDOWS') !== false) { return 'WINDOWS_NT'; } return 'UNIX'; } /** * Get path info. * * @param string $path Relative storage path, if empty, return root path info. * * @return StoragePathInfo|false The path info or false if path is invalid. */ public function getRealPathInfo($path) { if (($fullPath = $this->getFullPath($path, true)) === false) { return false; } $matches = []; $info = new StoragePathInfo(); $info->path = $path; if ( ($response = $this->curlCall($fullPath, [CURLOPT_HEADER => true, CURLOPT_NOBODY => true])) !== false && preg_match('/^Content-Length:\s*(\d+)/im', $response, $matches) === 1 ) { // Is file $info->exists = true; $info->isDir = false; $info->size = (int) $matches[1]; $response = $this->curlCall($fullPath, [CURLOPT_CUSTOMREQUEST => 'MDTM']); $matches = []; if (preg_match('/^(\d{14})/', $response, $matches) === 1) { $info->modified = strtotime($matches[1]); } else { $info->modified = time(); } $info->created = $info->modified; } elseif ($this->curlCall(trailingslashit($fullPath), [CURLOPT_CUSTOMREQUEST => 'NLST']) !== false) { // Is folder $info = new StoragePathInfo(); $info->path = $path; $info->exists = true; $info->isDir = true; $info->size = 0; $info->created = time(); $info->modified = time(); } else { // Not exists $info->exists = false; $info->isDir = false; } return $info; } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { $infoList = $this->getRawListInfo($path); $result = []; foreach ($infoList as $item) { if ($item['isDir'] && !$folders) { continue; } if (!$item['isDir'] && !$files) { continue; } $result[] = $item['name']; } return $result; } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { if (!$this->isDir($path)) { return false; } $regexFilters = []; $normalFilters = []; foreach ($filters as $filter) { if (preg_match('/^\/.*\/$/', $filter) === 1) { $regexFilters[] = $filter; } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { // Don't delete if root directory if ( preg_match('/^[a-zA-Z]:\/$/', $this->root) === 1 || preg_match('/^\/$/', $this->root) === 1 ) { return true; } return $this->delete('/', true); } /** * Destruct * * @return void */ public function __destruct() { if (is_resource($this->sourceFileHandle)) { fclose($this->sourceFileHandle); } if (is_resource($this->tempFileHandle)) { fclose($this->tempFileHandle); } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } if ($this->connection !== null) { curl_close($this->connection); } } /** * Do a curl call * * @param string $path where the curl call occur * @param array $options configuration options * @param string $errorMsg error message * * @return string|false response or false on failure */ private function curlCall($path = '/', $options = [], &$errorMsg = '') { if ($this->connection === null) { $this->connection = curl_init(); } else { curl_reset($this->connection); } if ($this->connection === false) { return false; } $path = ltrim($path, '/\\'); $options[CURLOPT_URL] = sprintf('ftp://%s:%d/%s', $this->server, $this->port, $path); $options = array_replace($this->getDefaultOptions(), $options); curl_setopt_array($this->connection, $options); if (($response = curl_exec($this->connection)) === false) { if (($errno = curl_errno($this->connection))) { switch ($errno) { case 6: case 7: $errorMsg = 'Unable to connect to FTP server. Please check your FTP hostname, port, and active mode settings. Error code: ' . $errno; break; case 8: $errorMsg = 'Got an unexpected reply from FTP server. Error code: ' . $errno; break; case 9: $errorMsg = 'Unable to change FTP directory. Please ensure that you have permission on the server. Error code: ' . $errno; break; case 23: $errorMsg = 'Unable to download file from FTP server. Please ensure that you have enough disk space. Error code: ' . $errno; break; case 28: $errorMsg = 'Connecting to FTP server timed out. Please check FTP hostname, port, username, password, and active mode ' . 'settings. Error code: ' . $errno; break; case 67: $errorMsg = 'Unable to login to FTP server. Please check your username and password. Error code: ' . $errno; break; default: $errorMsg = 'Unable to connect to FTP. Error code: ' . $errno . '. Error message: ' . curl_error($this->connection); break; } } return false; } $http_code = curl_getinfo($this->connection, CURLINFO_HTTP_CODE); if ($http_code >= 400) { $errorMsg = sprintf('Error code: %s.', $http_code); return false; } return $response; } /** * Returns default options for cURL * * @return array */ private function getDefaultOptions() { $options = [ CURLOPT_USERPWD => sprintf('%s:%s', $this->username, $this->password), CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_BINARYTRANSFER => true, CURLOPT_CONNECTTIMEOUT => $this->timeoutInSec, CURLOPT_TIMEOUT => 0, ]; if ($this->ssl) { $options[CURLOPT_FTP_SSL] = CURLFTPSSL_TRY; $options[CURLOPT_FTPSSLAUTH] = CURLFTPAUTH_TLS; } if ($this->sslVerify) { $options[CURLOPT_SSL_VERIFYPEER] = true; $options[CURLOPT_SSL_VERIFYHOST] = 2; $options[CURLOPT_CAINFO] = strlen($this->sslCertificate) > 0 ? $this->sslCertificate : false; } else { $options[CURLOPT_SSL_VERIFYPEER] = false; $options[CURLOPT_SSL_VERIFYHOST] = 0; } if ($this->passiveMode) { $options[CURLOPT_FTP_USE_EPSV] = true; } else { $options[CURLOPT_FTP_USE_EPRT] = true; $options[CURLOPT_FTPPORT] = 0; } return $options; } /** * Returns the source file handle * * @param string $destFilePath The source file path * * @return resource|false returns the file handle or false on failure */ private function getDestFileHandle($destFilePath) { if ($this->lastDestFilePath === $destFilePath) { return $this->destFileHandle; } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } if (($this->destFileHandle = SnapIO::fopen($destFilePath, 'cb')) === false) { return false; } $this->lastDestFilePath = $destFilePath; return $this->destFileHandle; } /** * Returns the source file handle * * @param string $sourceFilePath The source file path * * @return resource|false returns the file handle or false on failure */ private function getSourceFileHandle($sourceFilePath) { if ($this->lastSourceFilePath === $sourceFilePath) { return $this->sourceFileHandle; } if (is_resource($this->sourceFileHandle)) { fclose($this->sourceFileHandle); } if (($this->sourceFileHandle = SnapIO::fopen($sourceFilePath, 'r')) === false) { return false; } $this->lastSourceFilePath = $sourceFilePath; return $this->sourceFileHandle; } /** * Returns an empty file stream to temporarlly store chunk data. * * @return resource|false */ private function getTempFileHandle() { if (is_resource($this->tempFileHandle)) { if (ftruncate($this->tempFileHandle, 0) === false) { return false; } if (rewind($this->tempFileHandle) === false) { return false; } return $this->tempFileHandle; } if (@file_exists($this->lastTempFilePath)) { @unlink($this->lastTempFilePath); } $this->lastTempFilePath = tempnam(sys_get_temp_dir(), 'duplicator_ftp_curl_tmpfile_'); if (($this->tempFileHandle = @fopen($this->lastTempFilePath, 'r+')) === false) { return false; } return $this->tempFileHandle; } /** * Return the full path of storage from relative path. * * @param string $path The relative storage path * @param bool $acceptEmpty If true, return root path if path is empty. Default to false. * * @return string|false The full path or false if path is invalid. */ protected function getFullPath($path, $acceptEmpty = false) { $path = ltrim((string) $path, '/\\'); if (strlen($path) === 0) { return $acceptEmpty ? SnapIO::trailingslashit($this->root) : false; } return $this->root . $path; } /** * Elapsed time in microseconds * * @param float $startTime start time in microseconds * * @return float */ private static function getElapsedTime($startTime) { return (microtime(true) - $startTime) * SECONDS_IN_MICROSECONDS; } } addons/ftpaddon/src/Utils/FTPUtils.php000064400000006071147600374260013702 0ustar00 folder //File: 01-01-70 12:00AM 4096 file.txt //Groups: 1 3 4 $regex = '/^(\d{2}-\d{2}-\d{2,4}\s+\d{1,2}:\d{1,2}(?:AM|PM))\s+(?:|(\d+))\s+(.+)$/'; if (preg_match($regex, $rawListString, $matches) !== 1) { return false; } $info = []; $info['name'] = $matches[4]; $info['isDir'] = strtoupper($matches[3]) === ''; $info['size'] = $info['isDir'] ? 0 : (int) $matches[3]; $info['modified'] = strtotime($matches[1]); $info['created'] = $info['modified']; return $info; } /** * Returns the info in the raw list item for Unix * * @param string $rawListString Raw list string * * @return false|array{name: string, size: int, modified: int, created: int, isDir: bool}|false */ private static function parseUnixRawListString($rawListString) { //Regex below gets info from raw string on UNIX systems //Example: drwxr-xr-x 2 user group 4096 Jan 1 1970 folder //Groups: 1 2 3 4 5 6 7 $regex = '/^([drwx\-]{10})\s+(\d+)\s+(\S+)\s+(\S+)\s+(\d+)\s+(\w{3}\s+\d{1,2}\s+\d{1,2}:\d{1,2}|\w{3}\s+\d{1,2}\s+\d{4})\s+(.+)$/'; if (preg_match($regex, $rawListString, $matches) !== 1) { return false; } $info = []; $info['name'] = $matches[7]; $info['isDir'] = $matches[1][0] === 'd'; $info['size'] = $info['isDir'] ? 0 : (int) $matches[5]; $info['modified'] = strtotime($matches[6]); $info['created'] = $info['modified']; return $info; } } addons/ftpaddon/template/ftpaddon/configs/ftp_global_options.php000064400000005711147600374260021267 0ustar00 $tplData */ $uploadChunkSize = $tplData['uploadChunkSize']; $downloadChunkSize = $tplData['downloadChunkSize']; ?>


 MB

 MB

addons/ftpaddon/template/ftpaddon/configs/ftp.php000064400000022175147600374260016177 0ustar00 $tplData * @var FTPStorage $storage */ $storage = $tplData["storage"]; /** @var string */ $server = $tplData["server"]; /** @var int */ $port = $tplData["port"]; /** @var string */ $username = $tplData["username"]; /** @var string */ $password = $tplData["password"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var int */ $timeout = $tplData["timeout"]; /** @var bool */ $useCurl = $tplData["useCurl"]; /** @var bool */ $isPassive = $tplData["isPassive"]; /** @var bool */ $useSSL = $tplData["useSSL"]; /** @var bool $forceCurl */ $forceCurl = $tplData["forceCurl"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?>
" autocomplete="off" value="" > " autocomplete="off" value="" data-parsley-errors-container="#ftp_password2_error_container" data-parsley-trigger="change" data-parsley-equalto="#ftp_password" data-parsley-equalto-message="" >

class="checkbox" value="1" type="checkbox" id="_ftp_ssl" > class="checkbox" value="1" type="checkbox" name="_ftp_passive_mode" id="_ftp_passive_mode" > >

Note: This setting is for FTP and FTPS (FTP/SSL) only. To use SFTP (SSH File Transfer Protocol) change the type dropdown above.", 'duplicator-pro' ), array( 'b' => array(), ) ); ?>

render('admin_pages/storages/parts/provider_foot'); ?> addons/ftpaddon/template/ftpaddon/configs/sftp.php000064400000022135147600374260016356 0ustar00 $tplData * @var SFTPStorage $storage */ $storage = $tplData["storage"]; /** @var string */ $server = $tplData["server"]; /** @var int */ $port = $tplData["port"]; /** @var string */ $username = $tplData["username"]; /** @var string */ $password = $tplData["password"]; /** @var string */ $privateKey = $tplData["privateKey"]; /** @var string */ $privateKeyPwd = $tplData["privateKeyPwd"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var int */ $timeout = $tplData["timeout"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?>
" autocomplete="off" value="" > " autocomplete="off" value="" data-parsley-errors-container="#sftp_password2_error_container" data-parsley-trigger="change" data-parsley-equalto="#sftp_password" data-parsley-equalto-message="" >

" autocomplete="off" value="" data-parsley-errors-container="#sftp_private_key_password_error_container" >
" autocomplete="off" value="" data-parsley-errors-container="#sftp_private_key_password2_error_container" data-parsley-trigger="change" data-parsley-equalto="#sftp_private_key_password" data-parsley-equalto-message="" >

) tag', 'duplicator-pro' ), '', '' ); ?>

render('admin_pages/storages/parts/provider_foot'); ?> addons/ftpaddon/template/ftpaddon/configs/sftp_global_options.php000064400000003447147600374260021456 0ustar00 $tplData */ $uploadChunkSize = $tplData['uploadChunkSize']; $downloadChunkSize = $tplData['downloadChunkSize']; ?>


 MB

addons/ftpaddon/FtpAddon.php000064400000005724147600374260012044 0ustar00 $storageNums Storages num * * @return array */ public static function getStorageUsageStats($storageNums) { if (($storages = AbstractStorageEntity::getAll()) === false) { $storages = []; } $storageNums['storages_ftp_count'] = 0; $storageNums['storages_sftp_count'] = 0; foreach ($storages as $index => $storage) { switch ($storage->getSType()) { case FTPStorage::getSType(): $storageNums['storages_ftp_count']++; break; case SFTPStorage::getSType(): $storageNums['storages_sftp_count']++; break; } } return $storageNums; } /** * * @return string */ public static function getAddonPath() { return __DIR__; } /** * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/gdriveaddon/src/Models/GDriveStorage.php000064400000047216147600374260015555 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge( $config, [ 'storage_folder_id' => '', 'storage_folder_web_url' => '', 'token_json' => '', 'refresh_token' => '', 'client_number' => -1, 'authorized' => false, ] ); return $config; } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'token_json' => $this->gdrive_access_token_set_json, 'refresh_token' => $this->gdrive_refresh_token, 'storage_folder' => ltrim($this->gdrive_storage_folder, '/\\'), 'client_number' => $this->gdrive_client_number, 'max_packages' => $this->gdrive_max_files, 'authorized' => ($this->gdrive_authorization_state == 1), ]; // reset old values $this->gdrive_access_token_set_json = ''; $this->gdrive_refresh_token = ''; $this->gdrive_storage_folder = ''; $this->gdrive_client_number = -1; $this->gdrive_max_files = 10; $this->gdrive_authorization_state = 0; } } /** * Return the storage type * * @return int */ public static function getSType() { return 3; } /** * Returns the storage type icon. * * @return string Returns the storage icon */ public static function getStypeIcon() { $imgUrl = DUPLICATOR_PRO_IMG_URL . '/google-drive.svg'; return '' . esc_attr(static::getStypeName()) . ''; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('Google Drive', 'duplicator-pro'); } /** * Get storage location string * * @return string */ public function getLocationString() { if ($this->isAuthorized()) { return $this->config['storage_folder_web_url']; } else { return __('Not Authenticated', 'duplicator-pro'); } } /** * Check if storage is supported * * @return bool */ public static function isSupported() { return (SnapUtil::isCurlEnabled() || SnapUtil::isUrlFopenEnabled()); } /** * Get supported notice, displayed if storage isn't supported * * @return string html string or empty if storage is supported */ public static function getNotSupportedNotice() { if (static::isSupported()) { return ''; } if (!SnapUtil::isCurlEnabled() && !SnapUtil::isUrlFopenEnabled()) { return esc_html__( 'Google Drive requires either the PHP CURL extension enabled or the allow_url_fopen runtime configuration to be enabled.', 'duplicator-pro' ); } elseif (!SnapUtil::isCurlEnabled()) { return esc_html__('Google Drive requires the PHP CURL extension enabled.', 'duplicator-pro'); } else { return esc_html__('Google Drive requires the allow_url_fopen runtime configuration to be enabled.', 'duplicator-pro'); } } /** * Get upload chunk size in bytes * * @return int bytes */ public function getUploadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); $chunkSizeKb = $dGlobal->getVal('gdrive_upload_chunksize_in_kb', 256); return $chunkSizeKb * KB_IN_BYTES; } /** * Get download chunk size in bytes * * @return int bytes */ public function getDownloadChunkSize() { $dGlobal = DynamicGlobalEntity::getInstance(); $chunkSizeKb = $dGlobal->getVal('gdrive_download_chunksize_in_kb', 10 * 1024); return $chunkSizeKb * KB_IN_BYTES; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { // @todo: fixed to 10 seconds for historical reasons, make it configurable. return 10 * 1000000; } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->isAuthorized(); } /** * Is autorized * * @return bool */ public function isAuthorized() { return $this->config['authorized']; } /** * Returns an HTML anchor tag of location * * @return string Returns an HTML anchor tag with the storage location as a hyperlink. */ public function getHtmlLocationLink() { if (! $this->isAuthorized() || empty($this->config['storage_folder_web_url'])) { return '' . esc_html($this->getStorageFolder()) . ''; } return sprintf("%s", esc_url($this->config['storage_folder_web_url']), esc_html($this->getStorageFolder())); } /** * Authorized from HTTP request * * @param string $message Message * * @return bool True if authorized, false if failed */ public function authorizeFromRequest(&$message = '') { $tokenPairString = ''; try { if (($refreshToken = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'auth_code')) === '') { throw new Exception(__('Authorization code is empty', 'duplicator-pro')); } $this->name = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'name', ''); $this->notes = SnapUtil::sanitizeDefaultInput(SnapUtil::INPUT_REQUEST, 'notes', ''); $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'max_packages', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('storage_folder', 'remove'); $this->revokeAuthorization(); $token = (new TokenEntity(static::getSType(), ['refresh_token' => $refreshToken])); if (!$token->refresh(true)) { throw new Exception(__('Failed to fetch information from Google Drive. Make sure the token is valid.', 'duplicator-pro')); } if (empty($token->getScope())) { throw new Exception(__("Couldn't connect. Google Drive scopes not found.", 'duplicator-pro')); } if (! $token->hasScopes(static::REQUIRED_SCOPES)) { throw new Exception( __( "Authorization failed. You did not allow all required permissions. Try again and make sure that you checked all checkboxes.", 'duplicator-pro' ) ); } $this->config['refresh_token'] = $token->getRefreshToken(); $this->config['token_json'] = wp_json_encode([ 'created' => $token->getCreated(), 'access_token' => $token->getAccessToken(), 'refresh_token' => $token->getRefreshToken(), 'expires_in' => $token->getExpiresIn(), 'scope' => $token->getScope(), ]); $this->config['client_number'] = self::GDRIVE_CLIENT_LATEST; $this->config['authorized'] = $token->isValid(); } catch (Exception $e) { DUP_PRO_Log::traceException($e, "Problem authorizing Google Drive access token"); DUP_PRO_Log::traceObject('Token pair string from authorization:', $tokenPairString); $message = $e->getMessage(); return false; } $this->save(); $message = __('Google Drive is connected successfully and Storage Provider Updated.', 'duplicator-pro'); return true; } /** * Revokes authorization * * @param string $message Message * * @return bool True if authorized, false if failed */ public function revokeAuthorization(&$message = '') { if (!$this->isAuthorized()) { $message = __('Google Drive isn\'t authorized.', 'duplicator-pro'); return true; } try { $client = $this->getAdapter()->getService()->getClient(); if (!empty($this->config['refresh_token'])) { $client->revokeToken($this->config['refresh_token']); } $accessTokenObj = json_decode($this->config['token_json']); if (is_object($accessTokenObj) && property_exists($accessTokenObj, 'access_token')) { $gdrive_access_token = $accessTokenObj->access_token; } else { $gdrive_access_token = false; } if (!empty($gdrive_access_token)) { $client->revokeToken($gdrive_access_token); } } catch (Exception $e) { DUP_PRO_Log::trace("Problem revoking Google Drive access token msg: " . $e->getMessage()); $message = $e->getMessage(); return false; } finally { $this->config['token_json'] = ''; $this->config['refresh_token'] = ''; $this->config['client_number'] = -1; $this->config['authorized'] = false; } $message = __('Google Drive is disconnected successfully.', 'duplicator-pro'); return true; } /** * Get authorization URL * * @return string */ public function getAuthorizationUrl() { return (new TokenService(static::getSType()))->getRedirectUri(); } /** * Get storage adapter * * @return GDriveAdapter */ public function getAdapter() { $global = DUP_PRO_Global_Entity::getInstance(); $token = $this->getTokenFromConfig(); if (! $this->adapter) { $storageFolderId = ''; if (! empty($this->config['storage_folder_id'])) { $storageFolderId = $this->config['storage_folder_id']; } $this->adapter = new GDriveAdapter( $token, $this->config['storage_folder'], $storageFolderId, !$global->ssl_disableverify, ($global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH), $global->ipv4_only ); $this->adapter->initialize(); if ($token->isValid() && empty($this->config['storage_folder_id'])) { $storageFolder = $this->adapter->getPathInfo('/'); $this->config['storage_folder_id'] = $storageFolder->id; $this->config['storage_folder_web_url'] = $storageFolder->webUrl; $this->save(); } } if (! $token->isValid()) { return $this->adapter; } // This check is only needed if we have a valid storage. $storageFolder = $this->adapter->getPathInfo('/'); if ($storageFolder->name !== basename($this->getStorageFolder())) { // root folder id & storage folder name is different. $this->adapter = new GDriveAdapter( $token, $this->config['storage_folder'], '', !$global->ssl_disableverify, ($global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH), $global->ipv4_only ); $this->adapter->initialize(); $storageFolder = $this->adapter->getPathInfo('/'); $this->config['storage_folder_id'] = $storageFolder->id; $this->config['storage_folder_web_url'] = $storageFolder->webUrl; $this->save(); } return $this->adapter; } /** * Render form config fields * * @param bool $echo Echo or return * * @return string */ public function renderConfigFields($echo = true) { $userInfo = false; $quotaString = ''; $adapter = $this->getAdapter(); if ($this->isAuthorized() && $adapter->isValid()) { try { $serviceDrive = $adapter->getService(); $optParams = array('fields' => '*'); $about = $serviceDrive->about->get($optParams); $storageQuota = $about->getStorageQuota(); $quota_total = max($storageQuota->getLimit(), 1); $quota_used = $storageQuota->getUsage(); $userInfo = $about->getUser(); if (is_numeric($quota_total) && is_numeric($quota_used)) { $available_quota = $quota_total - $quota_used; $used_perc = round($quota_used * 100 / $quota_total, 1); $quotaString = sprintf( __('%1$s%% used, %2$s available', 'duplicator-pro'), $used_perc, size_format($available_quota) ); } } catch (\Exception $e) { DUP_PRO_Log::info("Problem getting Google Drive user info and quota: " . $e->getMessage()); $userInfo = $quotaString = null; } } // Adapter is invalid, but we have a refresh token, so it has been revoked if (! $adapter->isValid() && ! empty($this->config['refresh_token'])) { $errorMessage = __('Google Drive has been disconnected. Please connect to Google Drive again.', 'duplicator-pro'); AdminNotices::displayGeneralAdminNotice($errorMessage, AdminNotices::GEN_ERROR_NOTICE); } return TplMng::getInstance()->render( 'gdriveaddon/configs/google_drive', [ 'storage' => $this, 'storageFolder' => $this->config['storage_folder'], 'maxPackages' => $this->config['max_packages'], 'userInfo' => $userInfo, 'quotaString' => $quotaString, ], $echo ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $previousStorageFolder = $this->config['storage_folder']; $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'gdrive_max_files', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('_gdrive_storage_folder', 'remove'); if ($previousStorageFolder !== $this->config['storage_folder']) { $this->config['storage_folder_id'] = ''; $this->config['storage_folder_web_url'] = ''; } $message = sprintf( __('Google Drive Storage Updated.', 'duplicator-pro'), $this->config['server'], $this->getStorageFolder() ); return true; } /** * Get the token entity from config * * @return TokenEntity */ protected function getTokenFromConfig() { $token = new TokenEntity(static::getSType(), $this->config['token_json']); if ($token->isValid() && $token->isAboutToExpire()) { try { if (! $token->refresh(true)) { $token->updateProperties(['access_token' => '']); // clear access token $this->config['authorized'] = false; $this->save(); return $token; } } catch (Exception $e) { DUP_PRO_Log::traceException($e, "Problem refreshing Google Drive access token"); } $this->config['token_json'] = wp_json_encode([ 'created' => $token->getCreated(), 'access_token' => $token->getAccessToken(), 'refresh_token' => $token->getRefreshToken(), 'expires_in' => $token->getExpiresIn(), 'scope' => $token->getScope(), ]); $this->save(); } return $token; } /** * @return void */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } }); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return [ 'gdrive_upload_chunksize_in_kb' => 1024, 'gdrive_download_chunksize_in_kb' => 10 * 1024, 'gdrive_transfer_mode' => DUP_PRO_Google_Drive_Transfer_Mode::Auto, ]; } /** * @return void */ public static function renderGlobalOptions() { $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'gdriveaddon/configs/global_options', [ 'uploadChunkSize' => $dGlobal->getVal('gdrive_upload_chunksize_in_kb', 1024), 'downloadChunkSize' => $dGlobal->getVal('gdrive_download_chunksize_in_kb', 10 * 1024), 'transferMode' => $dGlobal->getVal('gdrive_transfer_mode', DUP_PRO_Google_Drive_Transfer_Mode::Auto), ] ); } } addons/gdriveaddon/src/Models/GDriveAdapter.php000064400000102147147600374260015524 0ustar00token = $token; $this->storagePath = $storagePath; $this->storagePathId = $storagePathId; $this->sslVerify = $sslVerify; $this->sslCert = $sslCert; $this->ipv4Only = $ipv4Only; if ($token->isValid() && $token->isAboutToExpire()) { $token->refresh(true); } $httpOptions = []; if ($this->sslVerify === false) { $verify = false; } elseif (strlen($this->sslCert) === 0) { $verify = true; } else { $verify = $this->sslCert; } $httpOptions['verify'] = $verify; if ($this->ipv4Only) { $httpOptions['force_ip_resolve'] = 'v4'; } $client = new GoogleClient(); $client->setHttpClientOptions($httpOptions); $client->setAccessToken([ 'created' => $token->getCreated(), 'access_token' => $token->getAccessToken(), 'refresh_token' => $token->getRefreshToken(), 'expires_in' => $token->getExpiresIn(), 'scope' => $token->getScope(), ]); $this->drive = new Drive($client); } /** * Get the Google Drive service. * * @return Drive */ public function getService() { return $this->drive; } /** * Initialize the storage on creation. * * @param string $errorMsg The error message if storage is invalid. * * @return bool true on success or false on failure. */ public function initialize(&$errorMsg = '') { if (! $this->token->isValid()) { $errorMsg = __('Invalid token supplied for google drive', 'duplicator-pro'); return false; } if (! $this->exists('/') && ! $this->createDir('/')) { $errorMsg = __('Unable to create root directory on google drive', 'duplicator-pro'); return false; } if (empty($this->storagePathId)) { $storage = $this->getPathInfo('/'); if ($storage->exists) { $this->storagePathId = $storage->id; } else { $errorMsg = __('Unable to fetch root directory info from Google Drive', 'duplicator-pro'); return false; } } return true; } /** * Destroy the storage on deletion. * * @return bool true on success or false on failure. */ public function destroy() { $this->storagePathId = ''; return $this->delete('/', true); } /** * Check if storage is valid and ready to use. * * @param string $errorMsg The error message if storage is invalid. * * @return bool */ public function isValid(&$errorMsg = '') { if (! $this->token->isValid()) { $errorMsg = 'Invalid token supplied for google drive'; return false; } $root = $this->getPathInfo('/'); if (! $root || !$root->exists) { $errorMsg = 'Root directory does not exist on google drive, false for isValid'; return false; } return true; } /** * Create the directory specified by pathname, recursively if necessary. * * @param string $path The directory path. * * @return bool true on success or false on failure. */ protected function realCreateDir($path) { $path = trim($path, '/'); if (empty($this->storagePathId)) { // if we don't have the storage path id set, we fetch it $storageFolder = $this->getPathInfo('/'); if ($storageFolder->exists) { $this->storagePathId = $storageFolder->id; } else { $path = $this->storagePath . '/' . $path; } } $parts = array_filter(explode('/', $path)); $parent = $this->storagePathId; // At this point, if we don't have a parent, we need to create from the root path. // We assume that a partial path may exist // So we try to search for the path and create it if it doesn't exist // But once we create one directory, we assume that the rest of the path doesn't exist // This saves us a lot of calls to the Google Drive API $pathMayExist = true; foreach ($parts as $part) { $query = "name = '{$part}' and trashed = false and mimeType = '" . self::FOLDER_MIME_TYPE . "'"; if ($parent) { $query .= " and '{$parent}' in parents"; } if ($pathMayExist) { // At first, we try to find the directory $response = $this->drive->files->listFiles([ 'q' => $query, 'fields' => 'files(id)', ]); if ($response->count() > 0) { $file = $response->getFiles()[0]; $parent = $file->getId(); continue; } } $pathMayExist = false; // If we didn't find the directory, we create it $file = new Drive\DriveFile([ 'name' => $part, 'mimeType' => self::FOLDER_MIME_TYPE, ]); if (! empty($parent)) { $file->setParents([$parent]); } try { $file = $this->drive->files->create($file, ['fields' => 'id']); } catch (\Exception $e) { \DUP_PRO_Log::traceObject('[GDriveAdapter] Unable to create directory: ' . $e->getMessage(), $e); return false; } $parent = $file->getId(); } return true; } /** * Create file with content. * * @param string $path The path to file. * @param string $content The content of file. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCreateFile($path, $content) { $response = $this->createNewFile($path, [ 'data' => $content, 'uploadType' => 'multipart', 'fields' => 'id,size', ]); if (!$response) { return false; } return (int) $response->getSize(); } /** * Delete relative path from storage root. * * @param string $path The path to delete. (Accepts directories and files) * @param bool $recursive Allows the deletion of nested directories specified in the pathname. Default to false. * * @return bool true on success or false on failure. */ protected function realDelete($path, $recursive = false) { $info = $this->getPathInfo($path); if (! $info->exists) { return true; // if the path doesn't exist, we can consider it deleted } if ($info->isDir && ! $recursive && ! $this->isDirEmpty($path)) { return false; // if it's a directory and, we are not deleting recursively, we can't delete it } try { $this->drive->files->delete($info->id); } catch (\Exception $e) { return false; } return true; } /** * Get file content. * * @param string $path The path to file. * * @return string|false The content of file or false on failure. */ public function getFileContent($path) { $info = $this->getPathInfo($path); if (! $info->exists) { return false; } try { /** @var Response $response */ $response = $this->drive->files->get($info->id, [ 'alt' => 'media', 'acknowledgeAbuse' => true, ]); return $response->getBody()->getContents(); } catch (\Exception $e) { return false; } } /** * Move and/or rename a file or directory. * * @param string $oldPath Relative storage path * @param string $newPath Relative storage path * * @return bool true on success or false on failure. */ protected function realMove($oldPath, $newPath) { $fileInfo = $this->getPathInfo($oldPath); $oldDirInfo = $this->getPathInfo(dirname($oldPath)); $newDirInfo = $this->getPathInfo(dirname($newPath)); $file = $fileInfo->file; try { $this->drive->files->update($fileInfo->id, $file, [ 'addParents' => $newDirInfo->id, 'removeParents' => $oldDirInfo->id, ]); } catch (\Exception $e) { return false; } return true; } /** * Get path info and cache it, is path not exists return path info with exists property set to false. * * @param string $path Relative storage path, if empty, return root path info. * * @return GDriveStoragePathInfo|false The path info or false on error. */ protected function getRealPathInfo($path) { try { $info = $this->nestedPathInfo($path); } catch (\Exception $e) { $info = false; } return $this->buildPathInfo($info); } /** * Get the list of files and directories inside the specified path. * * @param string $path Relative storage path, if empty, scan root path. * @param bool $files If true, add files to the list. Default to true. * @param bool $folders If true, add folders to the list. Default to true. * * @return string[] The list of files and directories, empty array if path is invalid. */ public function scanDir($path, $files = true, $folders = true) { $info = $this->getPathInfo($path); if (! $info->exists) { return []; } $query = "'{$info->id}' in parents and trashed = false"; if (! $files) { $query .= " and mimeType = '" . self::FOLDER_MIME_TYPE . "'"; } if (! $folders) { $query .= " and mimeType != '" . self::FOLDER_MIME_TYPE . "'"; } $nextPageToken = null; $result = []; do { $response = $this->drive->files->listFiles([ 'q' => $query, 'pageToken' => $nextPageToken, ]); $result = array_merge($result, array_map(function ($file) { $info = $this->buildPathInfo($file); return $info->path; }, $response->getFiles())); } while ($nextPageToken = $response->getNextPageToken()); return $result; } /** * Check if directory is empty. * * @param string $path The folder path * @param string[] $filters Filters to exclude files and folders from the check, if start and end with /, use regex. * * @return bool True is ok, false otherwise */ public function isDirEmpty($path, $filters = []) { $regexFilters = $normalFilters = []; foreach ($filters as $filter) { if ($filter[0] === '/' && substr($filter, -1) === '/') { $regexFilters[] = $filter; // It's a regex filter as it starts and ends with a slash } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $this->startTrackingTime(); $chunkSize = max(self::CHUNK_SIZE_STEP, floor($length / self::CHUNK_SIZE_STEP) * self::CHUNK_SIZE_STEP); $sessionKey = md5($sourceFile . $storageFile); $source = fopen($sourceFile, 'rb'); if (! $source) { \DUP_PRO_Log::info(sprintf('[GDriveAdapter] Unable to open source file %s', $sourceFile)); return false; } fseek($source, $offset); $storageFile = '/' . trim($storageFile, '/'); $targetPath = dirname($storageFile); if ($targetPath === '/' && ! empty($this->storagePathId)) { $target = new Drive\DriveFile(); $target->setId($this->storagePathId); } else { $target = $this->getPathInfo($targetPath); if (! $target->exists) { $this->createDir($targetPath); $target = $this->getPathInfo($targetPath); } } if (! $target) { \DUP_PRO_Log::info(sprintf('[GDriveAdapter] Unable to get target path info for %s', $targetPath)); return false; } $client = $this->drive->getClient(); $client->setDefer(true); $file = new Drive\DriveFile([ 'name' => basename($storageFile), 'parents' => [$target->id], ]); // The file create call returns the request object as we have set client defer to true /** @var Request $request */ $request = $this->drive->files->create($file); $media = new MediaFileUpload( $client, $request, 'application/octet-stream', '', true, $chunkSize ); $media->setFileSize($filesize = filesize($sourceFile)); $uploadSession = []; if (! empty($extraData[$sessionKey])) { $uploadSession = $extraData[$sessionKey]; $resumeUri = $uploadSession['resume_uri']; try { $this->forceSet($media, 'progress', $offset); $this->forceSet($media, 'resumeUri', $resumeUri); } catch (\Exception $e) { \DUP_PRO_Log::info('[GDriveAdapter] Unable to set resume uri: ' . $e->getMessage()); return false; } \DUP_PRO_Log::trace(sprintf('[GDriveAdapter] Resuming upload for %s from offset %s timeout %d', $sourceFile, $offset, $timeout)); } do { $chunk = fread($source, $chunkSize); if (! $chunk) { \DUP_PRO_Log::trace(sprintf('[GDriveAdapter] Unable to read chunk from %s', $sourceFile)); $status = true; // we can't set it to false, because drive sdk returns false when chunk upload is successful. break; } try { $status = $media->nextChunk($chunk); } catch (\Exception $e) { // upload failed. \DUP_PRO_Log::info("Failed to upload to Google Drive, " . $e->getMessage()); \DUP_PRO_Log::traceException($e); if (! isset($uploadSession['resume_uri'])) { // if we don't have a resume uri, we can't resume the upload. This happens when the first chunk fails. return false; } try { // We try to salvage the upload and update information from Google. $media->resume($uploadSession['resume_uri']); $uploadSession['resume_uri'] = $media->getResumeUri(); \DUP_PRO_Log::info("Progress retrieved " . $media->getProgress() . " bytes uploaded: " . ($media->getProgress() - $offset)); return $media->getProgress() - $offset; } catch (\Exception $e) { return false; } } $uploadSession['resume_uri'] = $media->getResumeUri(); $extraData[$sessionKey] = $uploadSession; $message = '[GDriveAdapter] Uploaded %d/%d bytes, requested [%d, %d] of %s'; \DUP_PRO_Log::trace(sprintf($message, $media->getProgress(), $filesize, $offset, $chunkSize, $sourceFile)); if ($length > 0) { /** * @todo Review the code because chunkSize should be normalized lenght so there should * be no need to check lenght but for now we'll leave it that way * * if we have a length, we need to stop when we reach it, in this case is used length and not chunkSize */ break; } } while (!feof($source) && ! $status && ! $this->hasReachedTimeout($timeout)); if (feof($source)) { // if we reached the end of the file, we can delete the cached resume uri unset($extraData[$sessionKey]); \DUP_PRO_Log::trace(sprintf('[GDriveAdapter] File %s copied successfully to %s', $sourceFile, $storageFile)); } $client->setDefer(false); // On the final chunk upload, we get the file info if ($status instanceof Drive\DriveFile) { unset($extraData[$sessionKey]); return $filesize - $offset; } // If we have false as status, it means the upload is not finished yet if ($status === false) { $uploadSession['resume_uri'] = $media->getResumeUri(); $extraData[$sessionKey] = $uploadSession; return $media->getProgress() - $offset; } return false; } /** * Generate info on create dir, this method is exendable by child classes if StoragePathInfo is extended. * * @param string $path Dir path * * @return GDriveStoragePathInfo */ protected function generateCreateDirInfo($path) { return $this->getRealPathInfo($path); } /** * Start tracking the time for the current operation * * @return void */ protected function startTrackingTime() { $this->startTime = (int) (microtime(true) * 1000000); } /** * Get the elapsed time since the start of the current operation * * @return int */ protected function getElapsedTime() { return (int) (microtime(true) * 1000000) - $this->startTime; } /** * Check if the operation has reached the timeout * * @param int $timeout The timeout in microseconds * * @return bool */ protected function hasReachedTimeout($timeout) { return $timeout > 0 && $this->getElapsedTime() >= ($timeout - 1000000); } /** * Generate info on delete item, this methos is exendable by child classes if StoragePathInfo is extended. * * @param string $path Item path * * @return GDriveStoragePathInfo */ protected function generateDeleteInfo($path) { $info = new GDriveStoragePathInfo(); $info->path = $path; $info->exists = false; $info->isDir = false; $info->size = 0; $info->created = 0; $info->modified = 0; return $info; } /** * Create a new file in the specified path. * * @param string $path The path to create the file in * @param array $options The options to create the file with * * @return false|Drive\DriveFile */ protected function createNewFile($path, $options = []) { $path = '/' . trim($path, '/'); $parent = $this->getPathInfo(dirname($path)); if (! $parent->exists) { if ($this->createDir(dirname($path))) { $parent = $this->getPathInfo(dirname($path)); } else { return false; } } $file = new Drive\DriveFile([ 'name' => basename($path), 'parents' => [$parent->id], ]); try { return $this->drive->files->create($file, $options); } catch (\Exception $e) { return false; } } /** * Traverse the path folder by folder and fetch the file info. * * @param string $path The path get information for * @param ?string $parent The parent folder id * * @return false|Drive\DriveFile */ protected function nestedPathInfo($path, $parent = null) { $path = trim($path, '/'); $traversed = explode('/', $this->storagePath); // keep track of the traversed path, by default the root folder is traversed if (! $parent) { $parent = $this->storagePathId; } if (! $parent) { // if we don't have a parent, we need to traverse from the root folder $path = $this->storagePath . '/' . $path; $traversed = []; // we are traversing from the root folder, so we reset the traversed path $info = false; } else { $info = $this->drive->files->get($parent, ['fields' => 'id,name,mimeType,size,createdTime,modifiedTime,md5Checksum,webViewLink']); } $parts = array_filter(explode('/', $path)); foreach ($parts as $index => $part) { $query = "name = '{$part}' and trashed = false"; if ($parent) { $query .= " and '{$parent}' in parents"; } if ($index < count($parts) - 1) { // if we are not in the last iteration, it's most definitely a folder $query .= " and mimeType = '" . self::FOLDER_MIME_TYPE . "'"; } $result = $this->drive->files->listFiles([ 'q' => $query, 'fields' => 'files(id,name,mimeType,size,createdTime,modifiedTime,md5Checksum,webViewLink)', ]); $traversed[] = $part; if ($result->count() === 0) { // if we didn't find anything, we can stop here return false; } foreach ($result->getFiles() as $file) { if ($file->getName() !== $part) { continue; // we are looking for a file/folder with the same name } if ($index < (count($parts) - 1) && $file->getMimeType() !== self::FOLDER_MIME_TYPE) { // if we are not in the last iteration, we are most definitely looking for a folder, so we skip if it's not continue; } // At this point we have found the file or folder we were looking for $props = $file->getProperties(); $props['path'] = implode('/', $traversed); $file->setProperties($props); // add the path to the file properties $parent = $file->getId(); $info = $file; // we need to keep looking for the next part continue 2; } // if we got here, we didn't find the file or folder we were looking for $info = false; break; } return $info; } /** * Build the path info object from Google Drive's file info. * * @param Drive\DriveFile|false $file The file info * * @return GDriveStoragePathInfo */ protected function buildPathInfo($file) { $info = new GDriveStoragePathInfo(); if (! $file) { $info->exists = false; return $info; } $props = $file->getProperties(); $info->exists = true; $info->id = $file->getId(); $info->name = $file->getName(); $info->mimeType = $file->getMimeType(); $info->isDir = $info->mimeType === self::FOLDER_MIME_TYPE; $info->size = (int) $file->getSize(); $info->webUrl = $file->getWebViewLink(); $info->created = $file->getCreatedTime() ? strtotime($file->getCreatedTime()) : time(); $info->modified = $file->getModifiedTime() ? strtotime($file->getModifiedTime()) : time(); $info->md5Checksum = $file->getMd5Checksum(); if (isset($props['path'])) { // if we have the path in the properties, that's a path from the storage folder // so we remove the storage folder and the slash after that from the path $info->path = substr($props['path'], strlen($this->storagePath) + 1); } else { // if we don't have the path in the properties, we "assume" it's under the storage folder $info->path = $file->getName(); } $info->file = $file; return $info; } /** * Forcefully set a property on an object * * @param object $object The object to set the property on * @param string $property The property to set * @param mixed $value The value to set * * @return void */ protected function forceSet($object, $property, $value) { if (!is_object($object)) { throw new Exception('Object must be an object'); } if (!property_exists($object, $property)) { throw new Exception('Property ' . $property . ' does not exist on object ' . get_class($object)); } $reflection = new \ReflectionProperty($object, $property); $reflection->setAccessible(true); $reflection->setValue($object, $value); } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $this->startTrackingTime(); $client = $this->drive->getClient(); $originalHttpClient = null; try { $originalHttpClient = $client->getHttpClient(); if (wp_mkdir_p(dirname($destFile)) == false) { return false; } if ($offset === 0 && @file_exists($destFile) && !@unlink($destFile)) { return false; } if (!$this->isFile($storageFile)) { return false; } if ($timeout > 0) { $baseUri = $originalHttpClient->getConfig('base_uri'); $client->setHttpClient(new \VendorDuplicator\GuzzleHttp\Client([ 'base_uri' => $baseUri, 'http_errors' => \false, ])); } if ($timeout === 0 && $offset == 0 && $length < 0) { $contents = $this->getFileContent($storageFile); if ($contents === false) { return false; } return file_put_contents($destFile, $contents); } $sessionKey = md5($storageFile . $destFile); if (! isset($extraData[$sessionKey]['fileId'])) { $extraData[$sessionKey]['fileId'] = $this->getPathInfo($storageFile)->id; } if (($handle = $this->getDestFileHandle($destFile)) === false) { return false; } $bytesWritten = 0; $length = $length < 0 ? self::CHUNK_SIZE_STEP * 20 : $length; $fileSize = $this->fileSize($storageFile); do { if (@fseek($handle, $offset) === -1) { return false; } $client->setDefer(true); /** @var RequestInterface $request */ $request = $this->drive->files->get($extraData[$sessionKey]['fileId'], [ 'alt' => 'media', 'acknowledgeAbuse' => true, ]); $client->setDefer(false); $request = $request->withHeader('Range', 'bytes=' . $offset . '-' . ($length > 0 ? ($offset + $length - 1) : '')); $response = $client->execute($request, null); $contents = $response->getBody()->getContents(); $client->setHttpClient($originalHttpClient); if (@fwrite($handle, $contents) === false) { return false; } if ($timeout === 0) { return $length; } $bytesWritten += strlen($contents); $offset += strlen($contents); } while ($offset < $fileSize && !$this->hasReachedTimeout($timeout)); return $bytesWritten; } catch (\Exception $e) { \DUP_PRO_Log::trace('[GDriveAdapter] Unable to get file content: ' . $e->getMessage()); return false; } finally { if ($originalHttpClient !== null) { $client->setHttpClient($originalHttpClient); } } } /** * Returns the source file handle * * @param string $destFilePath The source file path * * @return resource|false returns the file handle or false on failure */ private function getDestFileHandle($destFilePath) { if ($this->lastDestFilePath === $destFilePath) { return $this->destFileHandle; } if (is_resource($this->destFileHandle)) { fclose($this->destFileHandle); } if (($this->destFileHandle = SnapIO::fopen($destFilePath, 'cb')) === false) { return false; } $this->lastDestFilePath = $destFilePath; return $this->destFileHandle; } } addons/gdriveaddon/src/Models/GDriveStoragePathInfo.php000064400000001104147600374260017170 0ustar00 $mappedPath) { if (strpos($className, $namespace) !== 0) { continue; } $filepath = self::getFilenameFromClass($className, $namespace, $mappedPath); if (file_exists($filepath)) { include $filepath; return; } } } } /** * Return namespace mapping * * @return string[] */ protected static function getNamespacesVendorMapping() { return [ self::ROOT_VENDOR . 'Firebase\\JWT' => self::VENDOR_PATH . 'firebase/php-jwt/src/', self::ROOT_VENDOR . 'Google\\Service' => self::VENDOR_PATH . 'google/apiclient-services/src', self::ROOT_VENDOR . 'Google\\Auth' => self::VENDOR_PATH . 'google/auth/src', self::ROOT_VENDOR . 'Google' => self::VENDOR_PATH . 'google/apiclient/src', self::ROOT_VENDOR . 'GuzzleHttp\\Promise' => self::VENDOR_PATH . 'guzzlehttp/promises/src', self::ROOT_VENDOR . 'GuzzleHttp\\Psr7' => self::VENDOR_PATH . 'guzzlehttp/psr7/src', self::ROOT_VENDOR . 'GuzzleHttp' => self::VENDOR_PATH . 'guzzlehttp/guzzle/src', self::ROOT_VENDOR . 'Monolog' => self::VENDOR_PATH . 'monolog/monolog/src/Monolog', self::ROOT_VENDOR . 'Psr\\Http\\Message' => self::VENDOR_PATH . 'psr/http-message/src', self::ROOT_VENDOR . 'Psr\\Log' => self::VENDOR_PATH . 'psr/log/Psr/Log', self::ROOT_VENDOR . 'Psr\\Cache' => self::VENDOR_PATH . 'psr/cache/src', ]; } } addons/gdriveaddon/src/Utils/GoogleClient.php000064400000001657147600374260015277 0ustar00 */ protected $customHttpOptions = []; /** * Set http client options * * @param array $options options * * @return void */ public function setHttpClientOptions(array $options) { $this->customHttpOptions = $options; } /** * Create a new http client. * * @return GuzzleClient */ protected function createDefaultHttpClient() { $options = [ 'base_uri' => $this->getConfig('base_path'), 'http_errors' => false, ]; $options = array_merge($options, $this->customHttpOptions); $guzzleClient = new GuzzleClient($options); return $guzzleClient; } } addons/gdriveaddon/template/gdriveaddon/configs/google_drive.php000064400000025630147600374260021230 0ustar00 $tplData * @var GDriveStorage $storage */ $storage = $tplData["storage"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var \VendorDuplicator\Google\Service\Drive\User $userInfo */ $userInfo = $tplData["userInfo"]; /** @var string */ $quotaString = $tplData["quotaString"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?> isAuthorized()) : ?>
 



getDisplayName()); ?>
getEmailAddress()); ?> 0) { ?>


//Google Drive/

" data-tooltip="" >

render('admin_pages/storages/parts/provider_foot'); // Alerts for Google Drive $alertConnStatus = new DUP_PRO_UI_Dialog(); $alertConnStatus->title = __('Google Drive Authorization Error', 'duplicator-pro'); $alertConnStatus->message = ''; // javascript inserted message $alertConnStatus->initAlert(); ?> addons/gdriveaddon/template/gdriveaddon/configs/global_options.php000064400000010167147600374260021575 0ustar00 $tplData */ ?>


 KB

 KB

>   value="" name="gdrive_transfer_mode" id="gdrive_transfer_mode_stream" >   " data-tooltip="">
addons/gdriveaddon/vendor-prefixed/firebase/php-jwt/src/JWT.php000064400000053074147600374260020542 0ustar00 * @author Anant Narayanan * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD * @link https://github.com/firebase/php-jwt */ class JWT { const ASN1_INTEGER = 0x2; const ASN1_SEQUENCE = 0x10; const ASN1_BIT_STRING = 0x3; /** * When checking nbf, iat or expiration times, * we want to provide some extra leeway time to * account for clock skew. */ public static $leeway = 0; /** * Allow the current timestamp to be specified. * Useful for fixing a value within unit testing. * * Will default to PHP time() value if null. */ public static $timestamp = null; public static $supported_algs = array('ES384' => array('openssl', 'SHA384'), 'ES256' => array('openssl', 'SHA256'), 'HS256' => array('hash_hmac', 'SHA256'), 'HS384' => array('hash_hmac', 'SHA384'), 'HS512' => array('hash_hmac', 'SHA512'), 'RS256' => array('openssl', 'SHA256'), 'RS384' => array('openssl', 'SHA384'), 'RS512' => array('openssl', 'SHA512'), 'EdDSA' => array('sodium_crypto', 'EdDSA')); /** * Decodes a JWT string into a PHP object. * * @param string $jwt The JWT * @param Key|array|mixed $keyOrKeyArray The Key or array of Key objects. * If the algorithm used is asymmetric, this is the public key * Each Key object contains an algorithm and matching key. * Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', * 'HS512', 'RS256', 'RS384', and 'RS512' * @param array $allowed_algs [DEPRECATED] List of supported verification algorithms. Only * should be used for backwards compatibility. * * @return object The JWT's payload as a PHP object * * @throws InvalidArgumentException Provided JWT was empty * @throws UnexpectedValueException Provided JWT was invalid * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' * @throws BeforeValidException Provided JWT is trying to be used before it's been created as defined by 'iat' * @throws ExpiredException Provided JWT has since expired, as defined by the 'exp' claim * * @uses jsonDecode * @uses urlsafeB64Decode */ public static function decode($jwt, $keyOrKeyArray, array $allowed_algs = array()) { $timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp; if (empty($keyOrKeyArray)) { throw new InvalidArgumentException('Key may not be empty'); } $tks = \explode('.', $jwt); if (\count($tks) != 3) { throw new UnexpectedValueException('Wrong number of segments'); } list($headb64, $bodyb64, $cryptob64) = $tks; if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) { throw new UnexpectedValueException('Invalid header encoding'); } if (null === ($payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64)))) { throw new UnexpectedValueException('Invalid claims encoding'); } if (\false === ($sig = static::urlsafeB64Decode($cryptob64))) { throw new UnexpectedValueException('Invalid signature encoding'); } if (empty($header->alg)) { throw new UnexpectedValueException('Empty algorithm'); } if (empty(static::$supported_algs[$header->alg])) { throw new UnexpectedValueException('Algorithm not supported'); } list($keyMaterial, $algorithm) = self::getKeyMaterialAndAlgorithm($keyOrKeyArray, empty($header->kid) ? null : $header->kid); if (empty($algorithm)) { // Use deprecated "allowed_algs" to determine if the algorithm is supported. // This opens up the possibility of an attack in some implementations. // @see https://github.com/firebase/php-jwt/issues/351 if (!\in_array($header->alg, $allowed_algs)) { throw new UnexpectedValueException('Algorithm not allowed'); } } else { // Check the algorithm if (!self::constantTimeEquals($algorithm, $header->alg)) { // See issue #351 throw new UnexpectedValueException('Incorrect key for this algorithm'); } } if ($header->alg === 'ES256' || $header->alg === 'ES384') { // OpenSSL expects an ASN.1 DER sequence for ES256/ES384 signatures $sig = self::signatureToDER($sig); } if (!static::verify("{$headb64}.{$bodyb64}", $sig, $keyMaterial, $header->alg)) { throw new SignatureInvalidException('Signature verification failed'); } // Check the nbf if it is defined. This is the time that the // token can actually be used. If it's not yet that time, abort. if (isset($payload->nbf) && $payload->nbf > $timestamp + static::$leeway) { throw new BeforeValidException('Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf)); } // Check that this token has been created before 'now'. This prevents // using tokens that have been created for later use (and haven't // correctly used the nbf claim). if (isset($payload->iat) && $payload->iat > $timestamp + static::$leeway) { throw new BeforeValidException('Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat)); } // Check if this token has expired. if (isset($payload->exp) && $timestamp - static::$leeway >= $payload->exp) { throw new ExpiredException('Expired token'); } return $payload; } /** * Converts and signs a PHP object or array into a JWT string. * * @param object|array $payload PHP object or array * @param string|resource $key The secret key. * If the algorithm used is asymmetric, this is the private key * @param string $alg The signing algorithm. * Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', * 'HS512', 'RS256', 'RS384', and 'RS512' * @param mixed $keyId * @param array $head An array with header elements to attach * * @return string A signed JWT * * @uses jsonEncode * @uses urlsafeB64Encode */ public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null) { $header = array('typ' => 'JWT', 'alg' => $alg); if ($keyId !== null) { $header['kid'] = $keyId; } if (isset($head) && \is_array($head)) { $header = \array_merge($head, $header); } $segments = array(); $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); $signing_input = \implode('.', $segments); $signature = static::sign($signing_input, $key, $alg); $segments[] = static::urlsafeB64Encode($signature); return \implode('.', $segments); } /** * Sign a string with a given key and algorithm. * * @param string $msg The message to sign * @param string|resource $key The secret key * @param string $alg The signing algorithm. * Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', * 'HS512', 'RS256', 'RS384', and 'RS512' * * @return string An encrypted message * * @throws DomainException Unsupported algorithm or bad key was specified */ public static function sign($msg, $key, $alg = 'HS256') { if (empty(static::$supported_algs[$alg])) { throw new DomainException('Algorithm not supported'); } list($function, $algorithm) = static::$supported_algs[$alg]; switch ($function) { case 'hash_hmac': return \hash_hmac($algorithm, $msg, $key, \true); case 'openssl': $signature = ''; $success = \openssl_sign($msg, $signature, $key, $algorithm); if (!$success) { throw new DomainException("OpenSSL unable to sign data"); } if ($alg === 'ES256') { $signature = self::signatureFromDER($signature, 256); } elseif ($alg === 'ES384') { $signature = self::signatureFromDER($signature, 384); } return $signature; case 'sodium_crypto': if (!\function_exists('sodium_crypto_sign_detached')) { throw new DomainException('libsodium is not available'); } try { // The last non-empty line is used as the key. $lines = \array_filter(\explode("\n", $key)); $key = \base64_decode(\end($lines)); return \sodium_crypto_sign_detached($msg, $key); } catch (Exception $e) { throw new DomainException($e->getMessage(), 0, $e); } } } /** * Verify a signature with the message, key and method. Not all methods * are symmetric, so we must have a separate verify and sign method. * * @param string $msg The original message (header and body) * @param string $signature The original signature * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key * @param string $alg The algorithm * * @return bool * * @throws DomainException Invalid Algorithm, bad key, or OpenSSL failure */ private static function verify($msg, $signature, $key, $alg) { if (empty(static::$supported_algs[$alg])) { throw new DomainException('Algorithm not supported'); } list($function, $algorithm) = static::$supported_algs[$alg]; switch ($function) { case 'openssl': $success = \openssl_verify($msg, $signature, $key, $algorithm); if ($success === 1) { return \true; } elseif ($success === 0) { return \false; } // returns 1 on success, 0 on failure, -1 on error. throw new DomainException('OpenSSL error: ' . \openssl_error_string()); case 'sodium_crypto': if (!\function_exists('sodium_crypto_sign_verify_detached')) { throw new DomainException('libsodium is not available'); } try { // The last non-empty line is used as the key. $lines = \array_filter(\explode("\n", $key)); $key = \base64_decode(\end($lines)); return \sodium_crypto_sign_verify_detached($signature, $msg, $key); } catch (Exception $e) { throw new DomainException($e->getMessage(), 0, $e); } case 'hash_hmac': default: $hash = \hash_hmac($algorithm, $msg, $key, \true); return self::constantTimeEquals($signature, $hash); } } /** * Decode a JSON string into a PHP object. * * @param string $input JSON string * * @return object Object representation of JSON string * * @throws DomainException Provided string was invalid JSON */ public static function jsonDecode($input) { if (\version_compare(\PHP_VERSION, '5.4.0', '>=') && !(\defined('JSON_C_VERSION') && \PHP_INT_SIZE > 4)) { /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you * to specify that large ints (like Steam Transaction IDs) should be treated as * strings, rather than the PHP default behaviour of converting them to floats. */ $obj = \json_decode($input, \false, 512, \JSON_BIGINT_AS_STRING); } else { /** Not all servers will support that, however, so for older versions we must * manually detect large ints in the JSON string and quote them (thus converting *them to strings) before decoding, hence the preg_replace() call. */ $max_int_length = \strlen((string) \PHP_INT_MAX) - 1; $json_without_bigints = \preg_replace('/:\\s*(-?\\d{' . $max_int_length . ',})/', ': "$1"', $input); $obj = \json_decode($json_without_bigints); } if ($errno = \json_last_error()) { static::handleJsonError($errno); } elseif ($obj === null && $input !== 'null') { throw new DomainException('Null result with non-null input'); } return $obj; } /** * Encode a PHP object into a JSON string. * * @param object|array $input A PHP object or array * * @return string JSON representation of the PHP object or array * * @throws DomainException Provided object could not be encoded to valid JSON */ public static function jsonEncode($input) { $json = \json_encode($input); if ($errno = \json_last_error()) { static::handleJsonError($errno); } elseif ($json === 'null' && $input !== null) { throw new DomainException('Null result with non-null input'); } return $json; } /** * Decode a string with URL-safe Base64. * * @param string $input A Base64 encoded string * * @return string A decoded string */ public static function urlsafeB64Decode($input) { $remainder = \strlen($input) % 4; if ($remainder) { $padlen = 4 - $remainder; $input .= \str_repeat('=', $padlen); } return \base64_decode(\strtr($input, '-_', '+/')); } /** * Encode a string with URL-safe Base64. * * @param string $input The string you want encoded * * @return string The base64 encode of what you passed in */ public static function urlsafeB64Encode($input) { return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_')); } /** * Determine if an algorithm has been provided for each Key * * @param Key|array|mixed $keyOrKeyArray * @param string|null $kid * * @throws UnexpectedValueException * * @return array containing the keyMaterial and algorithm */ private static function getKeyMaterialAndAlgorithm($keyOrKeyArray, $kid = null) { if (\is_string($keyOrKeyArray) || \is_resource($keyOrKeyArray) || $keyOrKeyArray instanceof OpenSSLAsymmetricKey) { return array($keyOrKeyArray, null); } if ($keyOrKeyArray instanceof Key) { return array($keyOrKeyArray->getKeyMaterial(), $keyOrKeyArray->getAlgorithm()); } if (\is_array($keyOrKeyArray) || $keyOrKeyArray instanceof ArrayAccess) { if (!isset($kid)) { throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); } if (!isset($keyOrKeyArray[$kid])) { throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key'); } $key = $keyOrKeyArray[$kid]; if ($key instanceof Key) { return array($key->getKeyMaterial(), $key->getAlgorithm()); } return array($key, null); } throw new UnexpectedValueException('$keyOrKeyArray must be a string|resource key, an array of string|resource keys, ' . 'an instance of Firebase\\JWT\\Key key or an array of Firebase\\JWT\\Key keys'); } /** * @param string $left * @param string $right * @return bool */ public static function constantTimeEquals($left, $right) { if (\function_exists('hash_equals')) { return \hash_equals($left, $right); } $len = \min(static::safeStrlen($left), static::safeStrlen($right)); $status = 0; for ($i = 0; $i < $len; $i++) { $status |= \ord($left[$i]) ^ \ord($right[$i]); } $status |= static::safeStrlen($left) ^ static::safeStrlen($right); return $status === 0; } /** * Helper method to create a JSON error. * * @param int $errno An error number from json_last_error() * * @return void */ private static function handleJsonError($errno) { $messages = array(\JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', \JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON', \JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', \JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', \JSON_ERROR_UTF8 => 'Malformed UTF-8 characters'); throw new DomainException(isset($messages[$errno]) ? $messages[$errno] : 'Unknown JSON error: ' . $errno); } /** * Get the number of bytes in cryptographic strings. * * @param string $str * * @return int */ private static function safeStrlen($str) { if (\function_exists('mb_strlen')) { return \mb_strlen($str, '8bit'); } return \strlen($str); } /** * Convert an ECDSA signature to an ASN.1 DER sequence * * @param string $sig The ECDSA signature to convert * @return string The encoded DER object */ private static function signatureToDER($sig) { // Separate the signature into r-value and s-value list($r, $s) = \str_split($sig, (int) (\strlen($sig) / 2)); // Trim leading zeros $r = \ltrim($r, "\x00"); $s = \ltrim($s, "\x00"); // Convert r-value and s-value from unsigned big-endian integers to // signed two's complement if (\ord($r[0]) > 0x7f) { $r = "\x00" . $r; } if (\ord($s[0]) > 0x7f) { $s = "\x00" . $s; } return self::encodeDER(self::ASN1_SEQUENCE, self::encodeDER(self::ASN1_INTEGER, $r) . self::encodeDER(self::ASN1_INTEGER, $s)); } /** * Encodes a value into a DER object. * * @param int $type DER tag * @param string $value the value to encode * @return string the encoded object */ private static function encodeDER($type, $value) { $tag_header = 0; if ($type === self::ASN1_SEQUENCE) { $tag_header |= 0x20; } // Type $der = \chr($tag_header | $type); // Length $der .= \chr(\strlen($value)); return $der . $value; } /** * Encodes signature from a DER object. * * @param string $der binary signature in DER format * @param int $keySize the number of bits in the key * @return string the signature */ private static function signatureFromDER($der, $keySize) { // OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE list($offset, $_) = self::readDER($der); list($offset, $r) = self::readDER($der, $offset); list($offset, $s) = self::readDER($der, $offset); // Convert r-value and s-value from signed two's compliment to unsigned // big-endian integers $r = \ltrim($r, "\x00"); $s = \ltrim($s, "\x00"); // Pad out r and s so that they are $keySize bits long $r = \str_pad($r, $keySize / 8, "\x00", \STR_PAD_LEFT); $s = \str_pad($s, $keySize / 8, "\x00", \STR_PAD_LEFT); return $r . $s; } /** * Reads binary DER-encoded data and decodes into a single object * * @param string $der the binary data in DER format * @param int $offset the offset of the data stream containing the object * to decode * @return array [$offset, $data] the new offset and the decoded object */ private static function readDER($der, $offset = 0) { $pos = $offset; $size = \strlen($der); $constructed = \ord($der[$pos]) >> 5 & 0x1; $type = \ord($der[$pos++]) & 0x1f; // Length $len = \ord($der[$pos++]); if ($len & 0x80) { $n = $len & 0x1f; $len = 0; while ($n-- && $pos < $size) { $len = $len << 8 | \ord($der[$pos++]); } } // Value if ($type == self::ASN1_BIT_STRING) { $pos++; // Skip the first contents octet (padding indicator) $data = \substr($der, $pos, $len - 1); $pos += $len - 1; } elseif (!$constructed) { $data = \substr($der, $pos, $len); $pos += $len; } else { $data = null; } return array($pos, $data); } } addons/gdriveaddon/vendor-prefixed/firebase/php-jwt/src/Key.php000064400000002612147600374260020616 0ustar00keyMaterial = $keyMaterial; $this->algorithm = $algorithm; } /** * Return the algorithm valid for this key * * @return string */ public function getAlgorithm() { return $this->algorithm; } /** * @return string|resource|OpenSSLAsymmetricKey */ public function getKeyMaterial() { return $this->keyMaterial; } } addons/gdriveaddon/vendor-prefixed/firebase/php-jwt/src/JWK.php000064400000012404147600374260020521 0ustar00 * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD * @link https://github.com/firebase/php-jwt */ class JWK { /** * Parse a set of JWK keys * * @param array $jwks The JSON Web Key Set as an associative array * * @return array An associative array that represents the set of keys * * @throws InvalidArgumentException Provided JWK Set is empty * @throws UnexpectedValueException Provided JWK Set was invalid * @throws DomainException OpenSSL failure * * @uses parseKey */ public static function parseKeySet(array $jwks) { $keys = array(); if (!isset($jwks['keys'])) { throw new UnexpectedValueException('"keys" member must exist in the JWK Set'); } if (empty($jwks['keys'])) { throw new InvalidArgumentException('JWK Set did not contain any keys'); } foreach ($jwks['keys'] as $k => $v) { $kid = isset($v['kid']) ? $v['kid'] : $k; if ($key = self::parseKey($v)) { $keys[$kid] = $key; } } if (0 === \count($keys)) { throw new UnexpectedValueException('No supported algorithms found in JWK Set'); } return $keys; } /** * Parse a JWK key * * @param array $jwk An individual JWK * * @return resource|array An associative array that represents the key * * @throws InvalidArgumentException Provided JWK is empty * @throws UnexpectedValueException Provided JWK was invalid * @throws DomainException OpenSSL failure * * @uses createPemFromModulusAndExponent */ public static function parseKey(array $jwk) { if (empty($jwk)) { throw new InvalidArgumentException('JWK must not be empty'); } if (!isset($jwk['kty'])) { throw new UnexpectedValueException('JWK must contain a "kty" parameter'); } switch ($jwk['kty']) { case 'RSA': if (!empty($jwk['d'])) { throw new UnexpectedValueException('RSA private keys are not supported'); } if (!isset($jwk['n']) || !isset($jwk['e'])) { throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"'); } $pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']); $publicKey = \openssl_pkey_get_public($pem); if (\false === $publicKey) { throw new DomainException('OpenSSL error: ' . \openssl_error_string()); } return $publicKey; default: // Currently only RSA is supported break; } } /** * Create a public key represented in PEM format from RSA modulus and exponent information * * @param string $n The RSA modulus encoded in Base64 * @param string $e The RSA exponent encoded in Base64 * * @return string The RSA public key represented in PEM format * * @uses encodeLength */ private static function createPemFromModulusAndExponent($n, $e) { $modulus = JWT::urlsafeB64Decode($n); $publicExponent = JWT::urlsafeB64Decode($e); $components = array('modulus' => \pack('Ca*a*', 2, self::encodeLength(\strlen($modulus)), $modulus), 'publicExponent' => \pack('Ca*a*', 2, self::encodeLength(\strlen($publicExponent)), $publicExponent)); $rsaPublicKey = \pack('Ca*a*a*', 48, self::encodeLength(\strlen($components['modulus']) + \strlen($components['publicExponent'])), $components['modulus'], $components['publicExponent']); // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. $rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA $rsaPublicKey = \chr(0) . $rsaPublicKey; $rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey; $rsaPublicKey = \pack('Ca*a*', 48, self::encodeLength(\strlen($rsaOID . $rsaPublicKey)), $rsaOID . $rsaPublicKey); $rsaPublicKey = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($rsaPublicKey), 64) . '-----END PUBLIC KEY-----'; return $rsaPublicKey; } /** * DER-encode the length * * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. * * @param int $length * @return string */ private static function encodeLength($length) { if ($length <= 0x7f) { return \chr($length); } $temp = \ltrim(\pack('N', $length), \chr(0)); return \pack('Ca*', 0x80 | \strlen($temp), $temp); } } addons/gdriveaddon/vendor-prefixed/firebase/php-jwt/src/SignatureInvalidException.php000064400000000167147600374260025220 0ustar00http = $http; $this->cache = $cache; $this->jwt = $jwt ?: $this->getJwtService(); } /** * Verifies an id token and returns the authenticated apiLoginTicket. * Throws an exception if the id token is not valid. * The audience parameter can be used to control which id tokens are * accepted. By default, the id token must have been issued to this OAuth2 client. * * @param string $idToken the ID token in JWT format * @param string $audience Optional. The audience to verify against JWt "aud" * @return array|false the token payload, if successful */ public function verifyIdToken($idToken, $audience = null) { if (empty($idToken)) { throw new LogicException('id_token cannot be null'); } // set phpseclib constants if applicable $this->setPhpsecConstants(); // Check signature $certs = $this->getFederatedSignOnCerts(); foreach ($certs as $cert) { try { $args = [$idToken]; $publicKey = $this->getPublicKey($cert); if (\class_exists(Key::class)) { $args[] = new Key($publicKey, 'RS256'); } else { $args[] = $publicKey; $args[] = ['RS256']; } $payload = \call_user_func_array([$this->jwt, 'decode'], $args); if (\property_exists($payload, 'aud')) { if ($audience && $payload->aud != $audience) { return \false; } } // support HTTP and HTTPS issuers // @see https://developers.google.com/identity/sign-in/web/backend-auth $issuers = [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS]; if (!isset($payload->iss) || !\in_array($payload->iss, $issuers)) { return \false; } return (array) $payload; } catch (ExpiredException $e) { // @phpstan-ignore-line return \false; } catch (ExpiredExceptionV3 $e) { return \false; } catch (SignatureInvalidException $e) { // continue } catch (DomainException $e) { // continue } } return \false; } private function getCache() { return $this->cache; } /** * Retrieve and cache a certificates file. * * @param string $url location * @throws \VendorDuplicator\Google\Exception * @return array certificates */ private function retrieveCertsFromLocation($url) { // If we're retrieving a local file, just grab it. if (0 !== \strpos($url, 'http')) { if (!($file = \file_get_contents($url))) { throw new GoogleException("Failed to retrieve verification certificates: '" . $url . "'."); } return \json_decode($file, \true); } // @phpstan-ignore-next-line $response = $this->http->get($url); if ($response->getStatusCode() == 200) { return \json_decode((string) $response->getBody(), \true); } throw new GoogleException(\sprintf('Failed to retrieve verification certificates: "%s".', $response->getBody()->getContents()), $response->getStatusCode()); } // Gets federated sign-on certificates to use for verifying identity tokens. // Returns certs as array structure, where keys are key ids, and values // are PEM encoded certificates. private function getFederatedSignOnCerts() { $certs = null; if ($cache = $this->getCache()) { $cacheItem = $cache->getItem('federated_signon_certs_v3'); $certs = $cacheItem->get(); } if (!$certs) { $certs = $this->retrieveCertsFromLocation(self::FEDERATED_SIGNON_CERT_URL); if ($cache) { $cacheItem->expiresAt(new DateTime('+1 hour')); $cacheItem->set($certs); $cache->save($cacheItem); } } if (!isset($certs['keys'])) { throw new InvalidArgumentException('federated sign-on certs expects "keys" to be set'); } return $certs['keys']; } private function getJwtService() { $jwtClass = 'JWT'; if (\class_exists('VendorDuplicator\\Firebase\\JWT\\JWT')) { $jwtClass = 'VendorDuplicator\\Firebase\\JWT\\JWT'; } if (\property_exists($jwtClass, 'leeway') && $jwtClass::$leeway < 1) { // Ensures JWT leeway is at least 1 // @see https://github.com/google/google-api-php-client/issues/827 $jwtClass::$leeway = 1; } // @phpstan-ignore-next-line return new $jwtClass(); } private function getPublicKey($cert) { $bigIntClass = $this->getBigIntClass(); $modulus = new $bigIntClass($this->jwt->urlsafeB64Decode($cert['n']), 256); $exponent = new $bigIntClass($this->jwt->urlsafeB64Decode($cert['e']), 256); $component = ['n' => $modulus, 'e' => $exponent]; if (\class_exists('VendorDuplicator\\phpseclib3\\Crypt\\RSA\\PublicKey')) { /** @var PublicKey $loader */ $loader = PublicKeyLoader::load($component); return $loader->toString('PKCS8'); } $rsaClass = $this->getRsaClass(); $rsa = new $rsaClass(); $rsa->loadKey($component); return $rsa->getPublicKey(); } private function getRsaClass() { if (\class_exists('VendorDuplicator\\phpseclib3\\Crypt\\RSA')) { return 'VendorDuplicator\\phpseclib3\\Crypt\\RSA'; } if (\class_exists('VendorDuplicator\\phpseclib\\Crypt\\RSA')) { return 'VendorDuplicator\\phpseclib\\Crypt\\RSA'; } return 'Crypt_RSA'; } private function getBigIntClass() { if (\class_exists('VendorDuplicator\\phpseclib3\\Math\\BigInteger')) { return 'VendorDuplicator\\phpseclib3\\Math\\BigInteger'; } if (\class_exists('VendorDuplicator\\phpseclib\\Math\\BigInteger')) { return 'VendorDuplicator\\phpseclib\\Math\\BigInteger'; } return 'Math_BigInteger'; } private function getOpenSslConstant() { if (\class_exists('VendorDuplicator\\phpseclib3\\Crypt\\AES')) { return 'VendorDuplicator\\phpseclib3\\Crypt\\AES::ENGINE_OPENSSL'; } if (\class_exists('VendorDuplicator\\phpseclib\\Crypt\\RSA')) { return 'VendorDuplicator\\phpseclib\\Crypt\\RSA::MODE_OPENSSL'; } if (\class_exists('VendorDuplicator\\Crypt_RSA')) { return 'CRYPT_RSA_MODE_OPENSSL'; } throw new Exception('Cannot find RSA class'); } /** * phpseclib calls "phpinfo" by default, which requires special * whitelisting in the AppEngine VM environment. This function * sets constants to bypass the need for phpseclib to check phpinfo * * @see phpseclib/Math/BigInteger * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 */ private function setPhpsecConstants() { if (\filter_var(\getenv('GAE_VM'), \FILTER_VALIDATE_BOOLEAN)) { if (!\defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { \define('MATH_BIGINTEGER_OPENSSL_ENABLED', \true); } if (!\defined('CRYPT_RSA_MODE')) { \define('CRYPT_RSA_MODE', \constant($this->getOpenSslConstant())); } } } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/AccessToken/Revoke.php000064400000004436147600374260023604 0ustar00http = $http; } /** * Revoke an OAuth2 access token or refresh token. This method will revoke the current access * token, if a token isn't provided. * * @param string|array $token The token (access token or a refresh token) that should be revoked. * @return boolean Returns True if the revocation was successful, otherwise False. */ public function revokeToken($token) { if (\is_array($token)) { if (isset($token['refresh_token'])) { $token = $token['refresh_token']; } else { $token = $token['access_token']; } } $body = Psr7\Utils::streamFor(\http_build_query(['token' => $token])); $request = new Request('POST', Client::OAUTH2_REVOKE_URI, ['Cache-Control' => 'no-store', 'Content-Type' => 'application/x-www-form-urlencoded'], $body); $httpHandler = HttpHandlerFactory::build($this->http); $response = $httpHandler($request); return $response->getStatusCode() == 200; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/AuthHandler/Guzzle5AuthHandler.php000064400000005505147600374260026031 0ustar00cache = $cache; $this->cacheConfig = $cacheConfig; } public function attachCredentials(ClientInterface $http, CredentialsLoader $credentials, callable $tokenCallback = null) { // use the provided cache if ($this->cache) { $credentials = new FetchAuthTokenCache($credentials, $this->cacheConfig, $this->cache); } return $this->attachCredentialsCache($http, $credentials, $tokenCallback); } public function attachCredentialsCache(ClientInterface $http, FetchAuthTokenCache $credentials, callable $tokenCallback = null) { // if we end up needing to make an HTTP request to retrieve credentials, we // can use our existing one, but we need to throw exceptions so the error // bubbles up. $authHttp = $this->createAuthHttp($http); $authHttpHandler = HttpHandlerFactory::build($authHttp); $subscriber = new AuthTokenSubscriber($credentials, $authHttpHandler, $tokenCallback); $http->setDefaultOption('auth', 'google_auth'); $http->getEmitter()->attach($subscriber); return $http; } public function attachToken(ClientInterface $http, array $token, array $scopes) { $tokenFunc = function ($scopes) use($token) { return $token['access_token']; }; $subscriber = new ScopedAccessTokenSubscriber($tokenFunc, $scopes, $this->cacheConfig, $this->cache); $http->setDefaultOption('auth', 'scoped'); $http->getEmitter()->attach($subscriber); return $http; } public function attachKey(ClientInterface $http, $key) { $subscriber = new SimpleSubscriber(['key' => $key]); $http->setDefaultOption('auth', 'simple'); $http->getEmitter()->attach($subscriber); return $http; } private function createAuthHttp(ClientInterface $http) { return new Client(['base_url' => $http->getBaseUrl(), 'defaults' => ['exceptions' => \true, 'verify' => $http->getDefaultOption('verify'), 'proxy' => $http->getDefaultOption('proxy')]]); } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/AuthHandler/Guzzle7AuthHandler.php000064400000001345147600374260026031 0ustar00cache = $cache; $this->cacheConfig = $cacheConfig; } public function attachCredentials(ClientInterface $http, CredentialsLoader $credentials, callable $tokenCallback = null) { // use the provided cache if ($this->cache) { $credentials = new FetchAuthTokenCache($credentials, $this->cacheConfig, $this->cache); } return $this->attachCredentialsCache($http, $credentials, $tokenCallback); } public function attachCredentialsCache(ClientInterface $http, FetchAuthTokenCache $credentials, callable $tokenCallback = null) { // if we end up needing to make an HTTP request to retrieve credentials, we // can use our existing one, but we need to throw exceptions so the error // bubbles up. $authHttp = $this->createAuthHttp($http); $authHttpHandler = HttpHandlerFactory::build($authHttp); $middleware = new AuthTokenMiddleware($credentials, $authHttpHandler, $tokenCallback); $config = $http->getConfig(); $config['handler']->remove('google_auth'); $config['handler']->push($middleware, 'google_auth'); $config['auth'] = 'google_auth'; $http = new Client($config); return $http; } public function attachToken(ClientInterface $http, array $token, array $scopes) { $tokenFunc = function ($scopes) use($token) { return $token['access_token']; }; $middleware = new ScopedAccessTokenMiddleware($tokenFunc, $scopes, $this->cacheConfig, $this->cache); $config = $http->getConfig(); $config['handler']->remove('google_auth'); $config['handler']->push($middleware, 'google_auth'); $config['auth'] = 'scoped'; $http = new Client($config); return $http; } public function attachKey(ClientInterface $http, $key) { $middleware = new SimpleMiddleware(['key' => $key]); $config = $http->getConfig(); $config['handler']->remove('google_auth'); $config['handler']->push($middleware, 'google_auth'); $config['auth'] = 'simple'; $http = new Client($config); return $http; } private function createAuthHttp(ClientInterface $http) { return new Client(['http_errors' => \true] + $http->getConfig()); } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Http/REST.php000064400000014336147600374260021643 0ustar00|false|null $expectedClass * @param array $config * @param array $retryMap * @return mixed|T|null * @throws \VendorDuplicator\Google\Service\Exception on server side error (ie: not authenticated, * invalid or malformed post body, invalid url) */ public static function execute(ClientInterface $client, RequestInterface $request, $expectedClass = null, $config = [], $retryMap = null) { $runner = new Runner($config, \sprintf('%s %s', $request->getMethod(), (string) $request->getUri()), [__CLASS__, 'doExecute'], [$client, $request, $expectedClass]); if (null !== $retryMap) { $runner->setRetryMap($retryMap); } return $runner->run(); } /** * Executes a Psr\Http\Message\RequestInterface * * @template T * @param ClientInterface $client * @param RequestInterface $request * @param class-string|false|null $expectedClass * @return mixed|T|null * @throws \VendorDuplicator\Google\Service\Exception on server side error (ie: not authenticated, * invalid or malformed post body, invalid url) */ public static function doExecute(ClientInterface $client, RequestInterface $request, $expectedClass = null) { try { $httpHandler = HttpHandlerFactory::build($client); $response = $httpHandler($request); } catch (RequestException $e) { // if Guzzle throws an exception, catch it and handle the response if (!$e->hasResponse()) { throw $e; } $response = $e->getResponse(); // specific checking for Guzzle 5: convert to PSR7 response if (\interface_exists('VendorDuplicator\\GuzzleHttp\\Message\\ResponseInterface') && $response instanceof \VendorDuplicator\GuzzleHttp\Message\ResponseInterface) { $response = new Response($response->getStatusCode(), $response->getHeaders() ?: [], $response->getBody(), $response->getProtocolVersion(), $response->getReasonPhrase()); } } return self::decodeHttpResponse($response, $request, $expectedClass); } /** * Decode an HTTP Response. * @static * * @template T * @param RequestInterface $response The http response to be decoded. * @param ResponseInterface $response * @param class-string|false|null $expectedClass * @return mixed|T|null * @throws \VendorDuplicator\Google\Service\Exception */ public static function decodeHttpResponse(ResponseInterface $response, RequestInterface $request = null, $expectedClass = null) { $code = $response->getStatusCode(); // retry strategy if (\intVal($code) >= 400) { // if we errored out, it should be safe to grab the response body $body = (string) $response->getBody(); // Check if we received errors, and add those to the Exception for convenience throw new GoogleServiceException($body, $code, null, self::getResponseErrors($body)); } // Ensure we only pull the entire body into memory if the request is not // of media type $body = self::decodeBody($response, $request); if ($expectedClass = self::determineExpectedClass($expectedClass, $request)) { $json = \json_decode($body, \true); return new $expectedClass($json); } return $response; } private static function decodeBody(ResponseInterface $response, RequestInterface $request = null) { if (self::isAltMedia($request)) { // don't decode the body, it's probably a really long string return ''; } return (string) $response->getBody(); } private static function determineExpectedClass($expectedClass, RequestInterface $request = null) { // "false" is used to explicitly prevent an expected class from being returned if (\false === $expectedClass) { return null; } // if we don't have a request, we just use what's passed in if (null === $request) { return $expectedClass; } // return what we have in the request header if one was not supplied return $expectedClass ?: $request->getHeaderLine('X-Php-Expected-Class'); } private static function getResponseErrors($body) { $json = \json_decode($body, \true); if (isset($json['error']['errors'])) { return $json['error']['errors']; } return null; } private static function isAltMedia(RequestInterface $request = null) { if ($request && ($qs = $request->getUri()->getQuery())) { \parse_str($qs, $query); if (isset($query['alt']) && $query['alt'] == 'media') { return \true; } } return \false; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Http/MediaFileUpload.php000064400000023245147600374260024051 0ustar00client = $client; $this->request = $request; $this->mimeType = $mimeType; $this->data = $data; $this->resumable = $resumable; $this->chunkSize = $chunkSize; $this->progress = 0; $this->process(); } /** * Set the size of the file that is being uploaded. * @param int $size - int file size in bytes */ public function setFileSize($size) { $this->size = $size; } /** * Return the progress on the upload * @return int progress in bytes uploaded. */ public function getProgress() { return $this->progress; } /** * Send the next part of the file to upload. * @param string|bool $chunk Optional. The next set of bytes to send. If false will * use $data passed at construct time. */ public function nextChunk($chunk = \false) { $resumeUri = $this->getResumeUri(); if (\false == $chunk) { $chunk = \substr($this->data, $this->progress, $this->chunkSize); } $lastBytePos = $this->progress + \strlen($chunk) - 1; $headers = ['content-range' => "bytes {$this->progress}-{$lastBytePos}/{$this->size}", 'content-length' => (string) \strlen($chunk), 'expect' => '']; $request = new Request('PUT', $resumeUri, $headers, Psr7\Utils::streamFor($chunk)); return $this->makePutRequest($request); } /** * Return the HTTP result code from the last call made. * @return int code */ public function getHttpResultCode() { return $this->httpResultCode; } /** * Sends a PUT-Request to google drive and parses the response, * setting the appropiate variables from the response() * * @param RequestInterface $request the Request which will be send * * @return false|mixed false when the upload is unfinished or the decoded http response * */ private function makePutRequest(RequestInterface $request) { $response = $this->client->execute($request); $this->httpResultCode = $response->getStatusCode(); if (308 == $this->httpResultCode) { // Track the amount uploaded. $range = $response->getHeaderLine('range'); if ($range) { $range_array = \explode('-', $range); $this->progress = (int) $range_array[1] + 1; } // Allow for changing upload URLs. $location = $response->getHeaderLine('location'); if ($location) { $this->resumeUri = $location; } // No problems, but upload not complete. return \false; } return REST::decodeHttpResponse($response, $this->request); } /** * Resume a previously unfinished upload * @param string $resumeUri the resume-URI of the unfinished, resumable upload. */ public function resume($resumeUri) { $this->resumeUri = $resumeUri; $headers = ['content-range' => "bytes */{$this->size}", 'content-length' => '0']; $httpRequest = new Request('PUT', $this->resumeUri, $headers); return $this->makePutRequest($httpRequest); } /** * @return RequestInterface * @visible for testing */ private function process() { $this->transformToUploadUrl(); $request = $this->request; $postBody = ''; $contentType = \false; $meta = \json_decode((string) $request->getBody(), \true); $uploadType = $this->getUploadType($meta); $request = $request->withUri(Uri::withQueryValue($request->getUri(), 'uploadType', $uploadType)); $mimeType = $this->mimeType ?: $request->getHeaderLine('content-type'); if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { $contentType = $mimeType; $postBody = \is_string($meta) ? $meta : \json_encode($meta); } elseif (self::UPLOAD_MEDIA_TYPE == $uploadType) { $contentType = $mimeType; $postBody = $this->data; } elseif (self::UPLOAD_MULTIPART_TYPE == $uploadType) { // This is a multipart/related upload. $boundary = $this->boundary ?: \mt_rand(); $boundary = \str_replace('"', '', $boundary); $contentType = 'multipart/related; boundary=' . $boundary; $related = "--{$boundary}\r\n"; $related .= "Content-Type: application/json; charset=UTF-8\r\n"; $related .= "\r\n" . \json_encode($meta) . "\r\n"; $related .= "--{$boundary}\r\n"; $related .= "Content-Type: {$mimeType}\r\n"; $related .= "Content-Transfer-Encoding: base64\r\n"; $related .= "\r\n" . \base64_encode($this->data) . "\r\n"; $related .= "--{$boundary}--"; $postBody = $related; } $request = $request->withBody(Psr7\Utils::streamFor($postBody)); if ($contentType) { $request = $request->withHeader('content-type', $contentType); } return $this->request = $request; } /** * Valid upload types: * - resumable (UPLOAD_RESUMABLE_TYPE) * - media (UPLOAD_MEDIA_TYPE) * - multipart (UPLOAD_MULTIPART_TYPE) * @param string|false $meta * @return string * @visible for testing */ public function getUploadType($meta) { if ($this->resumable) { return self::UPLOAD_RESUMABLE_TYPE; } if (\false == $meta && $this->data) { return self::UPLOAD_MEDIA_TYPE; } return self::UPLOAD_MULTIPART_TYPE; } public function getResumeUri() { if (null === $this->resumeUri) { $this->resumeUri = $this->fetchResumeUri(); } return $this->resumeUri; } private function fetchResumeUri() { $body = $this->request->getBody(); $headers = ['content-type' => 'application/json; charset=UTF-8', 'content-length' => $body->getSize(), 'x-upload-content-type' => $this->mimeType, 'x-upload-content-length' => $this->size, 'expect' => '']; foreach ($headers as $key => $value) { $this->request = $this->request->withHeader($key, $value); } $response = $this->client->execute($this->request, \false); $location = $response->getHeaderLine('location'); $code = $response->getStatusCode(); if (200 == $code && \true == $location) { return $location; } $message = $code; $body = \json_decode((string) $this->request->getBody(), \true); if (isset($body['error']['errors'])) { $message .= ': '; foreach ($body['error']['errors'] as $error) { $message .= "{$error['domain']}, {$error['message']};"; } $message = \rtrim($message, ';'); } $error = "Failed to start the resumable upload (HTTP {$message})"; $this->client->getLogger()->error($error); throw new GoogleException($error); } private function transformToUploadUrl() { $parts = \parse_url((string) $this->request->getUri()); if (!isset($parts['path'])) { $parts['path'] = ''; } $parts['path'] = '/upload' . $parts['path']; $uri = Uri::fromParts($parts); $this->request = $this->request->withUri($uri); } public function setChunkSize($chunkSize) { $this->chunkSize = $chunkSize; } public function getRequest() { return $this->request; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Http/Batch.php000064400000017073147600374260022110 0ustar00client = $client; $this->boundary = $boundary ?: \mt_rand(); $this->rootUrl = \rtrim($rootUrl ?: $this->client->getConfig('base_path'), '/'); $this->batchPath = $batchPath ?: self::BATCH_PATH; } public function add(RequestInterface $request, $key = \false) { if (\false == $key) { $key = \mt_rand(); } $this->requests[$key] = $request; } public function execute() { $body = ''; $classes = []; $batchHttpTemplate = <<requests as $key => $request) { $firstLine = \sprintf('%s %s HTTP/%s', $request->getMethod(), $request->getRequestTarget(), $request->getProtocolVersion()); $content = (string) $request->getBody(); $headers = ''; foreach ($request->getHeaders() as $name => $values) { $headers .= \sprintf("%s:%s\r\n", $name, \implode(', ', $values)); } $body .= \sprintf($batchHttpTemplate, $this->boundary, $key, $firstLine, $headers, $content ? "\n" . $content : ''); $classes['response-' . $key] = $request->getHeaderLine('X-Php-Expected-Class'); } $body .= "--{$this->boundary}--"; $body = \trim($body); $url = $this->rootUrl . '/' . $this->batchPath; $headers = ['Content-Type' => \sprintf('multipart/mixed; boundary=%s', $this->boundary), 'Content-Length' => (string) \strlen($body)]; $request = new Request('POST', $url, $headers, $body); $response = $this->client->execute($request); return $this->parseResponse($response, $classes); } public function parseResponse(ResponseInterface $response, $classes = []) { $contentType = $response->getHeaderLine('content-type'); $contentType = \explode(';', $contentType); $boundary = \false; foreach ($contentType as $part) { $part = \explode('=', $part, 2); if (isset($part[0]) && 'boundary' == \trim($part[0])) { $boundary = $part[1]; } } $body = (string) $response->getBody(); if (!empty($body)) { $body = \str_replace("--{$boundary}--", "--{$boundary}", $body); $parts = \explode("--{$boundary}", $body); $responses = []; $requests = \array_values($this->requests); foreach ($parts as $i => $part) { $part = \trim($part); if (!empty($part)) { list($rawHeaders, $part) = \explode("\r\n\r\n", $part, 2); $headers = $this->parseRawHeaders($rawHeaders); $status = \substr($part, 0, \strpos($part, "\n")); $status = \explode(" ", $status); $status = $status[1]; list($partHeaders, $partBody) = $this->parseHttpResponse($part, 0); $response = new Response((int) $status, $partHeaders, Psr7\Utils::streamFor($partBody)); // Need content id. $key = $headers['content-id']; try { $response = REST::decodeHttpResponse($response, $requests[$i - 1]); } catch (GoogleServiceException $e) { // Store the exception as the response, so successful responses // can be processed. $response = $e; } $responses[$key] = $response; } } return $responses; } return null; } private function parseRawHeaders($rawHeaders) { $headers = []; $responseHeaderLines = \explode("\r\n", $rawHeaders); foreach ($responseHeaderLines as $headerLine) { if ($headerLine && \strpos($headerLine, ':') !== \false) { list($header, $value) = \explode(': ', $headerLine, 2); $header = \strtolower($header); if (isset($headers[$header])) { $headers[$header] = \array_merge((array) $headers[$header], (array) $value); } else { $headers[$header] = $value; } } } return $headers; } /** * Used by the IO lib and also the batch processing. * * @param string $respData * @param int $headerSize * @return array */ private function parseHttpResponse($respData, $headerSize) { // check proxy header foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) { if (\stripos($respData, $established_header) !== \false) { // existed, remove it $respData = \str_ireplace($established_header, '', $respData); // Subtract the proxy header size unless the cURL bug prior to 7.30.0 // is present which prevented the proxy header size from being taken into // account. // @TODO look into this // if (!$this->needsQuirk()) { // $headerSize -= strlen($established_header); // } break; } } if ($headerSize) { $responseBody = \substr($respData, $headerSize); $responseHeaders = \substr($respData, 0, $headerSize); } else { $responseSegments = \explode("\r\n\r\n", $respData, 2); $responseHeaders = $responseSegments[0]; $responseBody = isset($responseSegments[1]) ? $responseSegments[1] : null; } $responseHeaders = $this->parseRawHeaders($responseHeaders); return [$responseHeaders, $responseBody]; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Service/Resource.php000064400000024243147600374260023334 0ustar00 ['type' => 'string', 'location' => 'query'], 'fields' => ['type' => 'string', 'location' => 'query'], 'trace' => ['type' => 'string', 'location' => 'query'], 'userIp' => ['type' => 'string', 'location' => 'query'], 'quotaUser' => ['type' => 'string', 'location' => 'query'], 'data' => ['type' => 'string', 'location' => 'body'], 'mimeType' => ['type' => 'string', 'location' => 'header'], 'uploadType' => ['type' => 'string', 'location' => 'query'], 'mediaUpload' => ['type' => 'complex', 'location' => 'query'], 'prettyPrint' => ['type' => 'string', 'location' => 'query']]; /** @var string $rootUrl */ private $rootUrl; /** @var \VendorDuplicator\Google\Client $client */ private $client; /** @var string $serviceName */ private $serviceName; /** @var string $servicePath */ private $servicePath; /** @var string $resourceName */ private $resourceName; /** @var array $methods */ private $methods; public function __construct($service, $serviceName, $resourceName, $resource) { $this->rootUrl = $service->rootUrl; $this->client = $service->getClient(); $this->servicePath = $service->servicePath; $this->serviceName = $serviceName; $this->resourceName = $resourceName; $this->methods = \is_array($resource) && isset($resource['methods']) ? $resource['methods'] : [$resourceName => $resource]; } /** * TODO: This function needs simplifying. * * @template T * @param string $name * @param array $arguments * @param class-string $expectedClass - optional, the expected class name * @return mixed|T|ResponseInterface|RequestInterface * @throws \VendorDuplicator\Google\Exception */ public function call($name, $arguments, $expectedClass = null) { if (!isset($this->methods[$name])) { $this->client->getLogger()->error('Service method unknown', ['service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name]); throw new GoogleException("Unknown function: " . "{$this->serviceName}->{$this->resourceName}->{$name}()"); } $method = $this->methods[$name]; $parameters = $arguments[0]; // postBody is a special case since it's not defined in the discovery // document as parameter, but we abuse the param entry for storing it. $postBody = null; if (isset($parameters['postBody'])) { if ($parameters['postBody'] instanceof Model) { // In the cases the post body is an existing object, we want // to use the smart method to create a simple object for // for JSONification. $parameters['postBody'] = $parameters['postBody']->toSimpleObject(); } elseif (\is_object($parameters['postBody'])) { // If the post body is another kind of object, we will try and // wrangle it into a sensible format. $parameters['postBody'] = $this->convertToArrayAndStripNulls($parameters['postBody']); } $postBody = (array) $parameters['postBody']; unset($parameters['postBody']); } // TODO: optParams here probably should have been // handled already - this may well be redundant code. if (isset($parameters['optParams'])) { $optParams = $parameters['optParams']; unset($parameters['optParams']); $parameters = \array_merge($parameters, $optParams); } if (!isset($method['parameters'])) { $method['parameters'] = []; } $method['parameters'] = \array_merge($this->stackParameters, $method['parameters']); foreach ($parameters as $key => $val) { if ($key != 'postBody' && !isset($method['parameters'][$key])) { $this->client->getLogger()->error('Service parameter unknown', ['service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'parameter' => $key]); throw new GoogleException("({$name}) unknown parameter: '{$key}'"); } } foreach ($method['parameters'] as $paramName => $paramSpec) { if (isset($paramSpec['required']) && $paramSpec['required'] && !isset($parameters[$paramName])) { $this->client->getLogger()->error('Service parameter missing', ['service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'parameter' => $paramName]); throw new GoogleException("({$name}) missing required param: '{$paramName}'"); } if (isset($parameters[$paramName])) { $value = $parameters[$paramName]; $parameters[$paramName] = $paramSpec; $parameters[$paramName]['value'] = $value; unset($parameters[$paramName]['required']); } else { // Ensure we don't pass nulls. unset($parameters[$paramName]); } } $this->client->getLogger()->info('Service Call', ['service' => $this->serviceName, 'resource' => $this->resourceName, 'method' => $name, 'arguments' => $parameters]); // build the service uri $url = $this->createRequestUri($method['path'], $parameters); // NOTE: because we're creating the request by hand, // and because the service has a rootUrl property // the "base_uri" of the Http Client is not accounted for $request = new Request($method['httpMethod'], $url, $postBody ? ['content-type' => 'application/json'] : [], $postBody ? \json_encode($postBody) : ''); // support uploads if (isset($parameters['data'])) { $mimeType = isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream'; $data = $parameters['data']['value']; $upload = new MediaFileUpload($this->client, $request, $mimeType, $data); // pull down the modified request $request = $upload->getRequest(); } // if this is a media type, we will return the raw response // rather than using an expected class if (isset($parameters['alt']) && $parameters['alt']['value'] == 'media') { $expectedClass = null; } // if the client is marked for deferring, rather than // execute the request, return the response if ($this->client->shouldDefer()) { // @TODO find a better way to do this $request = $request->withHeader('X-Php-Expected-Class', $expectedClass); return $request; } return $this->client->execute($request, $expectedClass); } protected function convertToArrayAndStripNulls($o) { $o = (array) $o; foreach ($o as $k => $v) { if ($v === null) { unset($o[$k]); } elseif (\is_object($v) || \is_array($v)) { $o[$k] = $this->convertToArrayAndStripNulls($o[$k]); } } return $o; } /** * Parse/expand request parameters and create a fully qualified * request uri. * @static * @param string $restPath * @param array $params * @return string $requestUrl */ public function createRequestUri($restPath, $params) { // Override the default servicePath address if the $restPath use a / if ('/' == \substr($restPath, 0, 1)) { $requestUrl = \substr($restPath, 1); } else { $requestUrl = $this->servicePath . $restPath; } // code for leading slash if ($this->rootUrl) { if ('/' !== \substr($this->rootUrl, -1) && '/' !== \substr($requestUrl, 0, 1)) { $requestUrl = '/' . $requestUrl; } $requestUrl = $this->rootUrl . $requestUrl; } $uriTemplateVars = []; $queryVars = []; foreach ($params as $paramName => $paramSpec) { if ($paramSpec['type'] == 'boolean') { $paramSpec['value'] = $paramSpec['value'] ? 'true' : 'false'; } if ($paramSpec['location'] == 'path') { $uriTemplateVars[$paramName] = $paramSpec['value']; } elseif ($paramSpec['location'] == 'query') { if (\is_array($paramSpec['value'])) { foreach ($paramSpec['value'] as $value) { $queryVars[] = $paramName . '=' . \rawurlencode(\rawurldecode($value)); } } else { $queryVars[] = $paramName . '=' . \rawurlencode(\rawurldecode($paramSpec['value'])); } } } if (\count($uriTemplateVars)) { $uriTemplateParser = new UriTemplate(); $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); } if (\count($queryVars)) { $requestUrl .= '?' . \implode('&', $queryVars); } return $requestUrl; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Service/Exception.php000064400000003765147600374260023511 0ustar00>|null $errors List of errors returned in an HTTP * response or null. Defaults to []. */ public function __construct($message, $code = 0, Exception $previous = null, $errors = []) { if (\version_compare(\PHP_VERSION, '5.3.0') >= 0) { parent::__construct($message, $code, $previous); } else { parent::__construct($message, $code); } $this->errors = $errors; } /** * An example of the possible errors returned. * * [ * { * "domain": "global", * "reason": "authError", * "message": "Invalid Credentials", * "locationType": "header", * "location": "Authorization", * } * ] * * @return array>|null List of errors returned in an HTTP response or null. */ public function getErrors() { return $this->errors; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Task/Exception.php000064400000001351147600374260023000 0ustar00getComposer(); $extra = $composer->getPackage()->getExtra(); $servicesToKeep = isset($extra['google/apiclient-services']) ? $extra['google/apiclient-services'] : []; if ($servicesToKeep) { $vendorDir = $composer->getConfig()->get('vendor-dir'); $serviceDir = \sprintf('%s/google/apiclient-services/src/Google/Service', $vendorDir); if (!\is_dir($serviceDir)) { // path for google/apiclient-services >= 0.200.0 $serviceDir = \sprintf('%s/google/apiclient-services/src', $vendorDir); } self::verifyServicesToKeep($serviceDir, $servicesToKeep); $finder = self::getServicesToRemove($serviceDir, $servicesToKeep); $filesystem = $filesystem ?: new Filesystem(); if (0 !== ($count = \count($finder))) { $event->getIO()->write(\sprintf('Removing %s google services', $count)); foreach ($finder as $file) { $realpath = $file->getRealPath(); $filesystem->remove($realpath); $filesystem->remove($realpath . '.php'); } } } } /** * @throws InvalidArgumentException when the service doesn't exist */ private static function verifyServicesToKeep($serviceDir, array $servicesToKeep) { $finder = (new Finder())->directories()->depth('== 0'); foreach ($servicesToKeep as $service) { if (!\preg_match('/^[a-zA-Z0-9]*$/', $service)) { throw new InvalidArgumentException(\sprintf('Invalid Google service name "%s"', $service)); } try { $finder->in($serviceDir . '/' . $service); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException(\sprintf('VendorDuplicator\\Google service "%s" does not exist or was removed previously', $service)); } } } private static function getServicesToRemove($serviceDir, array $servicesToKeep) { // find all files in the current directory return (new Finder())->directories()->depth('== 0')->in($serviceDir)->exclude($servicesToKeep); } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Task/Retryable.php000064400000001400147600374260022766 0ustar00 self::TASK_RETRY_ALWAYS, '503' => self::TASK_RETRY_ALWAYS, 'rateLimitExceeded' => self::TASK_RETRY_ALWAYS, 'userRateLimitExceeded' => self::TASK_RETRY_ALWAYS, 6 => self::TASK_RETRY_ALWAYS, // CURLE_COULDNT_RESOLVE_HOST 7 => self::TASK_RETRY_ALWAYS, // CURLE_COULDNT_CONNECT 28 => self::TASK_RETRY_ALWAYS, // CURLE_OPERATION_TIMEOUTED 35 => self::TASK_RETRY_ALWAYS, // CURLE_SSL_CONNECT_ERROR 52 => self::TASK_RETRY_ALWAYS, // CURLE_GOT_NOTHING 'lighthouseError' => self::TASK_RETRY_NEVER, ]; /** * Creates a new task runner with exponential backoff support. * * @param array $config The task runner config * @param string $name The name of the current task (used for logging) * @param callable $action The task to run and possibly retry * @param array $arguments The task arguments * @throws \VendorDuplicator\Google\Task\Exception when misconfigured */ // @phpstan-ignore-next-line public function __construct($config, $name, $action, array $arguments = []) { if (isset($config['initial_delay'])) { if ($config['initial_delay'] < 0) { throw new GoogleTaskException('Task configuration `initial_delay` must not be negative.'); } $this->delay = $config['initial_delay']; } if (isset($config['max_delay'])) { if ($config['max_delay'] <= 0) { throw new GoogleTaskException('Task configuration `max_delay` must be greater than 0.'); } $this->maxDelay = $config['max_delay']; } if (isset($config['factor'])) { if ($config['factor'] <= 0) { throw new GoogleTaskException('Task configuration `factor` must be greater than 0.'); } $this->factor = $config['factor']; } if (isset($config['jitter'])) { if ($config['jitter'] <= 0) { throw new GoogleTaskException('Task configuration `jitter` must be greater than 0.'); } $this->jitter = $config['jitter']; } if (isset($config['retries'])) { if ($config['retries'] < 0) { throw new GoogleTaskException('Task configuration `retries` must not be negative.'); } $this->maxAttempts += $config['retries']; } if (!\is_callable($action)) { throw new GoogleTaskException('Task argument `$action` must be a valid callable.'); } $this->action = $action; $this->arguments = $arguments; } /** * Checks if a retry can be attempted. * * @return boolean */ public function canAttempt() { return $this->attempts < $this->maxAttempts; } /** * Runs the task and (if applicable) automatically retries when errors occur. * * @return mixed * @throws \VendorDuplicator\Google\Service\Exception on failure when no retries are available. */ public function run() { while ($this->attempt()) { try { return \call_user_func_array($this->action, $this->arguments); } catch (GoogleServiceException $exception) { $allowedRetries = $this->allowedRetries($exception->getCode(), $exception->getErrors()); if (!$this->canAttempt() || !$allowedRetries) { throw $exception; } if ($allowedRetries > 0) { $this->maxAttempts = \min($this->maxAttempts, $this->attempts + $allowedRetries); } } } } /** * Runs a task once, if possible. This is useful for bypassing the `run()` * loop. * * NOTE: If this is not the first attempt, this function will sleep in * accordance to the backoff configurations before running the task. * * @return boolean */ public function attempt() { if (!$this->canAttempt()) { return \false; } if ($this->attempts > 0) { $this->backOff(); } $this->attempts++; return \true; } /** * Sleeps in accordance to the backoff configurations. */ private function backOff() { $delay = $this->getDelay(); \usleep((int) ($delay * 1000000)); } /** * Gets the delay (in seconds) for the current backoff period. * * @return int */ private function getDelay() { $jitter = $this->getJitter(); $factor = $this->attempts > 1 ? $this->factor + $jitter : 1 + \abs($jitter); return $this->delay = \min($this->maxDelay, $this->delay * $factor); } /** * Gets the current jitter (random number between -$this->jitter and * $this->jitter). * * @return float */ private function getJitter() { return $this->jitter * 2 * \mt_rand() / \mt_getrandmax() - $this->jitter; } /** * Gets the number of times the associated task can be retried. * * NOTE: -1 is returned if the task can be retried indefinitely * * @return integer */ public function allowedRetries($code, $errors = []) { if (isset($this->retryMap[$code])) { return $this->retryMap[$code]; } if (!empty($errors) && isset($errors[0]['reason'], $this->retryMap[$errors[0]['reason']])) { return $this->retryMap[$errors[0]['reason']]; } return 0; } public function setRetryMap($retryMap) { $this->retryMap = $retryMap; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Utils/UriTemplate.php000064400000024455147600374260023505 0ustar00 "reserved", "/" => "segments", "." => "dotprefix", "#" => "fragment", ";" => "semicolon", "?" => "form", "&" => "continuation"]; /** * @var array * These are the characters which should not be URL encoded in reserved * strings. */ private $reserved = ["=", ",", "!", "@", "|", ":", "/", "?", "#", "[", "]", '$', "&", "'", "(", ")", "*", "+", ";"]; private $reservedEncoded = ["%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F", "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29", "%2A", "%2B", "%3B"]; public function parse($string, array $parameters) { return $this->resolveNextSection($string, $parameters); } /** * This function finds the first matching {...} block and * executes the replacement. It then calls itself to find * subsequent blocks, if any. */ private function resolveNextSection($string, $parameters) { $start = \strpos($string, "{"); if ($start === \false) { return $string; } $end = \strpos($string, "}"); if ($end === \false) { return $string; } $string = $this->replace($string, $start, $end, $parameters); return $this->resolveNextSection($string, $parameters); } private function replace($string, $start, $end, $parameters) { // We know a data block will have {} round it, so we can strip that. $data = \substr($string, $start + 1, $end - $start - 1); // If the first character is one of the reserved operators, it effects // the processing of the stream. if (isset($this->operators[$data[0]])) { $op = $this->operators[$data[0]]; $data = \substr($data, 1); $prefix = ""; $prefix_on_missing = \false; switch ($op) { case "reserved": // Reserved means certain characters should not be URL encoded $data = $this->replaceVars($data, $parameters, ",", null, \true); break; case "fragment": // Comma separated with fragment prefix. Bare values only. $prefix = "#"; $prefix_on_missing = \true; $data = $this->replaceVars($data, $parameters, ",", null, \true); break; case "segments": // Slash separated data. Bare values only. $prefix = "/"; $data = $this->replaceVars($data, $parameters, "/"); break; case "dotprefix": // Dot separated data. Bare values only. $prefix = "."; $prefix_on_missing = \true; $data = $this->replaceVars($data, $parameters, "."); break; case "semicolon": // Semicolon prefixed and separated. Uses the key name $prefix = ";"; $data = $this->replaceVars($data, $parameters, ";", "=", \false, \true, \false); break; case "form": // Standard URL format. Uses the key name $prefix = "?"; $data = $this->replaceVars($data, $parameters, "&", "="); break; case "continuation": // Standard URL, but with leading ampersand. Uses key name. $prefix = "&"; $data = $this->replaceVars($data, $parameters, "&", "="); break; } // Add the initial prefix character if data is valid. if ($data || $data !== \false && $prefix_on_missing) { $data = $prefix . $data; } } else { // If no operator we replace with the defaults. $data = $this->replaceVars($data, $parameters); } // This is chops out the {...} and replaces with the new section. return \substr($string, 0, $start) . $data . \substr($string, $end + 1); } private function replaceVars($section, $parameters, $sep = ",", $combine = null, $reserved = \false, $tag_empty = \false, $combine_on_empty = \true) { if (\strpos($section, ",") === \false) { // If we only have a single value, we can immediately process. return $this->combine($section, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty); } else { // If we have multiple values, we need to split and loop over them. // Each is treated individually, then glued together with the // separator character. $vars = \explode(",", $section); return $this->combineList( $vars, $sep, $parameters, $combine, $reserved, \false, // Never emit empty strings in multi-param replacements $combine_on_empty ); } } public function combine($key, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty) { $length = \false; $explode = \false; $skip_final_combine = \false; $value = \false; // Check for length restriction. if (\strpos($key, ":") !== \false) { list($key, $length) = \explode(":", $key); } // Check for explode parameter. if ($key[\strlen($key) - 1] == "*") { $explode = \true; $key = \substr($key, 0, -1); $skip_final_combine = \true; } // Define the list separator. $list_sep = $explode ? $sep : ","; if (isset($parameters[$key])) { $data_type = $this->getDataType($parameters[$key]); switch ($data_type) { case self::TYPE_SCALAR: $value = $this->getValue($parameters[$key], $length); break; case self::TYPE_LIST: $values = []; foreach ($parameters[$key] as $pkey => $pvalue) { $pvalue = $this->getValue($pvalue, $length); if ($combine && $explode) { $values[$pkey] = $key . $combine . $pvalue; } else { $values[$pkey] = $pvalue; } } $value = \implode($list_sep, $values); if ($value == '') { return ''; } break; case self::TYPE_MAP: $values = []; foreach ($parameters[$key] as $pkey => $pvalue) { $pvalue = $this->getValue($pvalue, $length); if ($explode) { $pkey = $this->getValue($pkey, $length); $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine. } else { $values[] = $pkey; $values[] = $pvalue; } } $value = \implode($list_sep, $values); if ($value == '') { return \false; } break; } } elseif ($tag_empty) { // If we are just indicating empty values with their key name, return that. return $key; } else { // Otherwise we can skip this variable due to not being defined. return \false; } if ($reserved) { $value = \str_replace($this->reservedEncoded, $this->reserved, $value); } // If we do not need to include the key name, we just return the raw // value. if (!$combine || $skip_final_combine) { return $value; } // Else we combine the key name: foo=bar, if value is not the empty string. return $key . ($value != '' || $combine_on_empty ? $combine . $value : ''); } /** * Return the type of a passed in value */ private function getDataType($data) { if (\is_array($data)) { \reset($data); if (\key($data) !== 0) { return self::TYPE_MAP; } return self::TYPE_LIST; } return self::TYPE_SCALAR; } /** * Utility function that merges multiple combine calls * for multi-key templates. */ private function combineList($vars, $sep, $parameters, $combine, $reserved, $tag_empty, $combine_on_empty) { $ret = []; foreach ($vars as $var) { $response = $this->combine($var, $parameters, $sep, $combine, $reserved, $tag_empty, $combine_on_empty); if ($response === \false) { continue; } $ret[] = $response; } return \implode($sep, $ret); } /** * Utility function to encode and trim values */ private function getValue($value, $length) { if ($length) { $value = \substr($value, 0, $length); } $value = \rawurlencode($value); return $value; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/aliases.php000064400000010740147600374260021563 0ustar00 'VendorDuplicator\\Google_Client', 'VendorDuplicator\\Google\\Service' => 'VendorDuplicator\\Google_Service', 'VendorDuplicator\\Google\\AccessToken\\Revoke' => 'VendorDuplicator\\Google_AccessToken_Revoke', 'VendorDuplicator\\Google\\AccessToken\\Verify' => 'VendorDuplicator\\Google_AccessToken_Verify', 'VendorDuplicator\\Google\\Model' => 'VendorDuplicator\\Google_Model', 'VendorDuplicator\\Google\\Utils\\UriTemplate' => 'VendorDuplicator\\Google_Utils_UriTemplate', 'VendorDuplicator\\Google\\AuthHandler\\Guzzle6AuthHandler' => 'VendorDuplicator\\Google_AuthHandler_Guzzle6AuthHandler', 'VendorDuplicator\\Google\\AuthHandler\\Guzzle7AuthHandler' => 'VendorDuplicator\\Google_AuthHandler_Guzzle7AuthHandler', 'VendorDuplicator\\Google\\AuthHandler\\Guzzle5AuthHandler' => 'VendorDuplicator\\Google_AuthHandler_Guzzle5AuthHandler', 'VendorDuplicator\\Google\\AuthHandler\\AuthHandlerFactory' => 'VendorDuplicator\\Google_AuthHandler_AuthHandlerFactory', 'VendorDuplicator\\Google\\Http\\Batch' => 'VendorDuplicator\\Google_Http_Batch', 'VendorDuplicator\\Google\\Http\\MediaFileUpload' => 'VendorDuplicator\\Google_Http_MediaFileUpload', 'VendorDuplicator\\Google\\Http\\REST' => 'VendorDuplicator\\Google_Http_REST', 'VendorDuplicator\\Google\\Task\\Retryable' => 'VendorDuplicator\\Google_Task_Retryable', 'VendorDuplicator\\Google\\Task\\Exception' => 'VendorDuplicator\\Google_Task_Exception', 'VendorDuplicator\\Google\\Task\\Runner' => 'VendorDuplicator\\Google_Task_Runner', 'VendorDuplicator\\Google\\Collection' => 'VendorDuplicator\\Google_Collection', 'VendorDuplicator\\Google\\Service\\Exception' => 'VendorDuplicator\\Google_Service_Exception', 'VendorDuplicator\\Google\\Service\\Resource' => 'VendorDuplicator\\Google_Service_Resource', 'VendorDuplicator\\Google\\Exception' => 'VendorDuplicator\\Google_Exception']; foreach ($classMap as $class => $alias) { \class_alias($class, $alias); } /** * This class needs to be defined explicitly as scripts must be recognized by * the autoloader. */ class Google_Task_Composer extends \VendorDuplicator\Google\Task\Composer { } /** * This class needs to be defined explicitly as scripts must be recognized by * the autoloader. */ \class_alias('VendorDuplicator\\Google_Task_Composer', 'VendorDuplicator\\Google_Task_Composer', \false); /** @phpstan-ignore-next-line */ if (\false) { class Google_AccessToken_Revoke extends \VendorDuplicator\Google\AccessToken\Revoke { } class Google_AccessToken_Verify extends \VendorDuplicator\Google\AccessToken\Verify { } class Google_AuthHandler_AuthHandlerFactory extends \VendorDuplicator\Google\AuthHandler\AuthHandlerFactory { } class Google_AuthHandler_Guzzle5AuthHandler extends \VendorDuplicator\Google\AuthHandler\Guzzle5AuthHandler { } class Google_AuthHandler_Guzzle6AuthHandler extends \VendorDuplicator\Google\AuthHandler\Guzzle6AuthHandler { } class Google_AuthHandler_Guzzle7AuthHandler extends \VendorDuplicator\Google\AuthHandler\Guzzle7AuthHandler { } class Google_Client extends \VendorDuplicator\Google\Client { } class Google_Collection extends \VendorDuplicator\Google\Collection { } class Google_Exception extends \VendorDuplicator\Google\Exception { } class Google_Http_Batch extends \VendorDuplicator\Google\Http\Batch { } class Google_Http_MediaFileUpload extends \VendorDuplicator\Google\Http\MediaFileUpload { } class Google_Http_REST extends \VendorDuplicator\Google\Http\REST { } class Google_Model extends \VendorDuplicator\Google\Model { } class Google_Service extends \VendorDuplicator\Google\Service { } class Google_Service_Exception extends \VendorDuplicator\Google\Service\Exception { } class Google_Service_Resource extends \VendorDuplicator\Google\Service\Resource { } class Google_Task_Exception extends \VendorDuplicator\Google\Task\Exception { } interface Google_Task_Retryable extends \VendorDuplicator\Google\Task\Retryable { } class Google_Task_Runner extends \VendorDuplicator\Google\Task\Runner { } class Google_Utils_UriTemplate extends \VendorDuplicator\Google\Utils\UriTemplate { } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Service.php000064400000003515147600374260021544 0ustar00client = $clientOrConfig; } elseif (\is_array($clientOrConfig)) { $this->client = new Client($clientOrConfig ?: []); } else { $errorMessage = 'constructor must be array or instance of Google\\Client'; if (\class_exists('TypeError')) { throw new TypeError($errorMessage); } \trigger_error($errorMessage, \E_USER_ERROR); } } /** * Return the associated Google\Client class. * @return \VendorDuplicator\Google\Client */ public function getClient() { return $this->client; } /** * Create a new HTTP Batch handler for this service * * @return Batch */ public function createBatch() { return new Batch($this->client, \false, $this->rootUrl, $this->batchPath); } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Collection.php000064400000005713147600374260022241 0ustar00{$this->collection_key}) && \is_array($this->{$this->collection_key})) { \reset($this->{$this->collection_key}); } } /** @return mixed */ #[\ReturnTypeWillChange] public function current() { $this->coerceType($this->key()); if (\is_array($this->{$this->collection_key})) { return \current($this->{$this->collection_key}); } } /** @return mixed */ #[\ReturnTypeWillChange] public function key() { if (isset($this->{$this->collection_key}) && \is_array($this->{$this->collection_key})) { return \key($this->{$this->collection_key}); } } /** @return mixed */ #[\ReturnTypeWillChange] public function next() { return \next($this->{$this->collection_key}); } /** @return bool */ #[\ReturnTypeWillChange] public function valid() { $key = $this->key(); return $key !== null && $key !== \false; } /** @return int */ #[\ReturnTypeWillChange] public function count() { if (!isset($this->{$this->collection_key})) { return 0; } return \count($this->{$this->collection_key}); } /** @return bool */ #[\ReturnTypeWillChange] public function offsetExists($offset) { if (!\is_numeric($offset)) { return parent::offsetExists($offset); } return isset($this->{$this->collection_key}[$offset]); } /** @return mixed */ public function offsetGet($offset) { if (!\is_numeric($offset)) { return parent::offsetGet($offset); } $this->coerceType($offset); return $this->{$this->collection_key}[$offset]; } /** @return void */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { if (!\is_numeric($offset)) { parent::offsetSet($offset, $value); } $this->{$this->collection_key}[$offset] = $value; } /** @return void */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { if (!\is_numeric($offset)) { parent::offsetUnset($offset); } unset($this->{$this->collection_key}[$offset]); } private function coerceType($offset) { $keyType = $this->keyType($this->collection_key); if ($keyType && !\is_object($this->{$this->collection_key}[$offset])) { $this->{$this->collection_key}[$offset] = new $keyType($this->{$this->collection_key}[$offset]); } } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Client.php000064400000115614147600374260021366 0ustar00config = \array_merge([ 'application_name' => '', // Don't change these unless you're working against a special development // or testing environment. 'base_path' => self::API_BASE_PATH, // https://developers.google.com/console 'client_id' => '', 'client_secret' => '', // Can be a path to JSON credentials or an array representing those // credentials (@see Google\Client::setAuthConfig), or an instance of // Google\Auth\CredentialsLoader. 'credentials' => null, // @see Google\Client::setScopes 'scopes' => null, // Sets X-Goog-User-Project, which specifies a user project to bill // for access charges associated with the request 'quota_project' => null, 'redirect_uri' => null, 'state' => null, // Simple API access key, also from the API console. Ensure you get // a Server key, and not a Browser key. 'developer_key' => '', // For use with Google Cloud Platform // fetch the ApplicationDefaultCredentials, if applicable // @see https://developers.google.com/identity/protocols/application-default-credentials 'use_application_default_credentials' => \false, 'signing_key' => null, 'signing_algorithm' => null, 'subject' => null, // Other OAuth2 parameters. 'hd' => '', 'prompt' => '', 'openid.realm' => '', 'include_granted_scopes' => null, 'login_hint' => '', 'request_visible_actions' => '', 'access_type' => 'online', 'approval_prompt' => 'auto', // Task Runner retry configuration // @see Google\Task\Runner 'retry' => [], 'retry_map' => null, // Cache class implementing Psr\Cache\CacheItemPoolInterface. // Defaults to Google\Auth\Cache\MemoryCacheItemPool. 'cache' => null, // cache config for downstream auth caching 'cache_config' => [], // function to be called when an access token is fetched // follows the signature function ($cacheKey, $accessToken) 'token_callback' => null, // Service class used in Google\Client::verifyIdToken. // Explicitly pass this in to avoid setting JWT::$leeway 'jwt' => null, // Setting api_format_v2 will return more detailed error messages // from certain APIs. 'api_format_v2' => \false, ], $config); if (!\is_null($this->config['credentials'])) { if ($this->config['credentials'] instanceof CredentialsLoader) { $this->credentials = $this->config['credentials']; } else { $this->setAuthConfig($this->config['credentials']); } unset($this->config['credentials']); } if (!\is_null($this->config['scopes'])) { $this->setScopes($this->config['scopes']); unset($this->config['scopes']); } // Set a default token callback to update the in-memory access token if (\is_null($this->config['token_callback'])) { $this->config['token_callback'] = function ($cacheKey, $newAccessToken) { $this->setAccessToken([ 'access_token' => $newAccessToken, 'expires_in' => 3600, // Google default 'created' => \time(), ]); }; } if (!\is_null($this->config['cache'])) { $this->setCache($this->config['cache']); unset($this->config['cache']); } } /** * Get a string containing the version of the library. * * @return string */ public function getLibraryVersion() { return self::LIBVER; } /** * For backwards compatibility * alias for fetchAccessTokenWithAuthCode * * @param string $code string code from accounts.google.com * @return array access token * @deprecated */ public function authenticate($code) { return $this->fetchAccessTokenWithAuthCode($code); } /** * Attempt to exchange a code for an valid authentication token. * Helper wrapped around the OAuth 2.0 implementation. * * @param string $code code from accounts.google.com * @return array access token */ public function fetchAccessTokenWithAuthCode($code) { if (\strlen($code) == 0) { throw new InvalidArgumentException("Invalid code"); } $auth = $this->getOAuth2Service(); $auth->setCode($code); $auth->setRedirectUri($this->getRedirectUri()); $httpHandler = HttpHandlerFactory::build($this->getHttpClient()); $creds = $auth->fetchAuthToken($httpHandler); if ($creds && isset($creds['access_token'])) { $creds['created'] = \time(); $this->setAccessToken($creds); } return $creds; } /** * For backwards compatibility * alias for fetchAccessTokenWithAssertion * * @return array access token * @deprecated */ public function refreshTokenWithAssertion() { return $this->fetchAccessTokenWithAssertion(); } /** * Fetches a fresh access token with a given assertion token. * @param ClientInterface $authHttp optional. * @return array access token */ public function fetchAccessTokenWithAssertion(ClientInterface $authHttp = null) { if (!$this->isUsingApplicationDefaultCredentials()) { throw new DomainException('set the JSON service account credentials using' . ' Google\\Client::setAuthConfig or set the path to your JSON file' . ' with the "GOOGLE_APPLICATION_CREDENTIALS" environment variable' . ' and call Google\\Client::useApplicationDefaultCredentials to' . ' refresh a token with assertion.'); } $this->getLogger()->log('info', 'OAuth2 access token refresh with Signed JWT assertion grants.'); $credentials = $this->createApplicationDefaultCredentials(); $httpHandler = HttpHandlerFactory::build($authHttp); $creds = $credentials->fetchAuthToken($httpHandler); if ($creds && isset($creds['access_token'])) { $creds['created'] = \time(); $this->setAccessToken($creds); } return $creds; } /** * For backwards compatibility * alias for fetchAccessTokenWithRefreshToken * * @param string $refreshToken * @return array access token */ public function refreshToken($refreshToken) { return $this->fetchAccessTokenWithRefreshToken($refreshToken); } /** * Fetches a fresh OAuth 2.0 access token with the given refresh token. * @param string $refreshToken * @return array access token */ public function fetchAccessTokenWithRefreshToken($refreshToken = null) { if (null === $refreshToken) { if (!isset($this->token['refresh_token'])) { throw new LogicException('refresh token must be passed in or set as part of setAccessToken'); } $refreshToken = $this->token['refresh_token']; } $this->getLogger()->info('OAuth2 access token refresh'); $auth = $this->getOAuth2Service(); $auth->setRefreshToken($refreshToken); $httpHandler = HttpHandlerFactory::build($this->getHttpClient()); $creds = $auth->fetchAuthToken($httpHandler); if ($creds && isset($creds['access_token'])) { $creds['created'] = \time(); if (!isset($creds['refresh_token'])) { $creds['refresh_token'] = $refreshToken; } $this->setAccessToken($creds); } return $creds; } /** * Create a URL to obtain user authorization. * The authorization endpoint allows the user to first * authenticate, and then grant/deny the access request. * @param string|array $scope The scope is expressed as an array or list of space-delimited strings. * @param array $queryParams Querystring params to add to the authorization URL. * @return string */ public function createAuthUrl($scope = null, array $queryParams = []) { if (empty($scope)) { $scope = $this->prepareScopes(); } if (\is_array($scope)) { $scope = \implode(' ', $scope); } // only accept one of prompt or approval_prompt $approvalPrompt = $this->config['prompt'] ? null : $this->config['approval_prompt']; // include_granted_scopes should be string "true", string "false", or null $includeGrantedScopes = $this->config['include_granted_scopes'] === null ? null : \var_export($this->config['include_granted_scopes'], \true); $params = \array_filter(['access_type' => $this->config['access_type'], 'approval_prompt' => $approvalPrompt, 'hd' => $this->config['hd'], 'include_granted_scopes' => $includeGrantedScopes, 'login_hint' => $this->config['login_hint'], 'openid.realm' => $this->config['openid.realm'], 'prompt' => $this->config['prompt'], 'redirect_uri' => $this->config['redirect_uri'], 'response_type' => 'code', 'scope' => $scope, 'state' => $this->config['state']]) + $queryParams; // If the list of scopes contains plus.login, add request_visible_actions // to auth URL. $rva = $this->config['request_visible_actions']; if (\strlen($rva) > 0 && \false !== \strpos($scope, 'plus.login')) { $params['request_visible_actions'] = $rva; } $auth = $this->getOAuth2Service(); return (string) $auth->buildFullAuthorizationUri($params); } /** * Adds auth listeners to the HTTP client based on the credentials * set in the Google API Client object * * @param ClientInterface $http the http client object. * @return ClientInterface the http client object */ public function authorize(ClientInterface $http = null) { $http = $http ?: $this->getHttpClient(); $authHandler = $this->getAuthHandler(); // These conditionals represent the decision tree for authentication // 1. Check if a Google\Auth\CredentialsLoader instance has been supplied via the "credentials" option // 2. Check for Application Default Credentials // 3a. Check for an Access Token // 3b. If access token exists but is expired, try to refresh it // 4. Check for API Key if ($this->credentials) { return $authHandler->attachCredentials($http, $this->credentials, $this->config['token_callback']); } if ($this->isUsingApplicationDefaultCredentials()) { $credentials = $this->createApplicationDefaultCredentials(); return $authHandler->attachCredentialsCache($http, $credentials, $this->config['token_callback']); } if ($token = $this->getAccessToken()) { $scopes = $this->prepareScopes(); // add refresh subscriber to request a new token if (isset($token['refresh_token']) && $this->isAccessTokenExpired()) { $credentials = $this->createUserRefreshCredentials($scopes, $token['refresh_token']); return $authHandler->attachCredentials($http, $credentials, $this->config['token_callback']); } return $authHandler->attachToken($http, $token, (array) $scopes); } if ($key = $this->config['developer_key']) { return $authHandler->attachKey($http, $key); } return $http; } /** * Set the configuration to use application default credentials for * authentication * * @see https://developers.google.com/identity/protocols/application-default-credentials * @param boolean $useAppCreds */ public function useApplicationDefaultCredentials($useAppCreds = \true) { $this->config['use_application_default_credentials'] = $useAppCreds; } /** * To prevent useApplicationDefaultCredentials from inappropriately being * called in a conditional * * @see https://developers.google.com/identity/protocols/application-default-credentials */ public function isUsingApplicationDefaultCredentials() { return $this->config['use_application_default_credentials']; } /** * Set the access token used for requests. * * Note that at the time requests are sent, tokens are cached. A token will be * cached for each combination of service and authentication scopes. If a * cache pool is not provided, creating a new instance of the client will * allow modification of access tokens. If a persistent cache pool is * provided, in order to change the access token, you must clear the cached * token by calling `$client->getCache()->clear()`. (Use caution in this case, * as calling `clear()` will remove all cache items, including any items not * related to Google API PHP Client.) * * @param string|array $token * @throws InvalidArgumentException */ public function setAccessToken($token) { if (\is_string($token)) { if ($json = \json_decode($token, \true)) { $token = $json; } else { // assume $token is just the token string $token = ['access_token' => $token]; } } if ($token == null) { throw new InvalidArgumentException('invalid json token'); } if (!isset($token['access_token'])) { throw new InvalidArgumentException("Invalid token format"); } $this->token = $token; } public function getAccessToken() { return $this->token; } /** * @return string|null */ public function getRefreshToken() { if (isset($this->token['refresh_token'])) { return $this->token['refresh_token']; } return null; } /** * Returns if the access_token is expired. * @return bool Returns True if the access_token is expired. */ public function isAccessTokenExpired() { if (!$this->token) { return \true; } $created = 0; if (isset($this->token['created'])) { $created = $this->token['created']; } elseif (isset($this->token['id_token'])) { // check the ID token for "iat" // signature verification is not required here, as we are just // using this for convenience to save a round trip request // to the Google API server $idToken = $this->token['id_token']; if (\substr_count($idToken, '.') == 2) { $parts = \explode('.', $idToken); $payload = \json_decode(\base64_decode($parts[1]), \true); if ($payload && isset($payload['iat'])) { $created = $payload['iat']; } } } if (!isset($this->token['expires_in'])) { // if the token does not have an "expires_in", then it's considered expired return \true; } // If the token is set to expire in the next 30 seconds. return $created + ($this->token['expires_in'] - 30) < \time(); } /** * @deprecated See UPGRADING.md for more information */ public function getAuth() { throw new BadMethodCallException('This function no longer exists. See UPGRADING.md for more information'); } /** * @deprecated See UPGRADING.md for more information */ public function setAuth($auth) { throw new BadMethodCallException('This function no longer exists. See UPGRADING.md for more information'); } /** * Set the OAuth 2.0 Client ID. * @param string $clientId */ public function setClientId($clientId) { $this->config['client_id'] = $clientId; } public function getClientId() { return $this->config['client_id']; } /** * Set the OAuth 2.0 Client Secret. * @param string $clientSecret */ public function setClientSecret($clientSecret) { $this->config['client_secret'] = $clientSecret; } public function getClientSecret() { return $this->config['client_secret']; } /** * Set the OAuth 2.0 Redirect URI. * @param string $redirectUri */ public function setRedirectUri($redirectUri) { $this->config['redirect_uri'] = $redirectUri; } public function getRedirectUri() { return $this->config['redirect_uri']; } /** * Set OAuth 2.0 "state" parameter to achieve per-request customization. * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 * @param string $state */ public function setState($state) { $this->config['state'] = $state; } /** * @param string $accessType Possible values for access_type include: * {@code "offline"} to request offline access from the user. * {@code "online"} to request online access from the user. */ public function setAccessType($accessType) { $this->config['access_type'] = $accessType; } /** * @param string $approvalPrompt Possible values for approval_prompt include: * {@code "force"} to force the approval UI to appear. * {@code "auto"} to request auto-approval when possible. (This is the default value) */ public function setApprovalPrompt($approvalPrompt) { $this->config['approval_prompt'] = $approvalPrompt; } /** * Set the login hint, email address or sub id. * @param string $loginHint */ public function setLoginHint($loginHint) { $this->config['login_hint'] = $loginHint; } /** * Set the application name, this is included in the User-Agent HTTP header. * @param string $applicationName */ public function setApplicationName($applicationName) { $this->config['application_name'] = $applicationName; } /** * If 'plus.login' is included in the list of requested scopes, you can use * this method to define types of app activities that your app will write. * You can find a list of available types here: * @link https://developers.google.com/+/api/moment-types * * @param array $requestVisibleActions Array of app activity types */ public function setRequestVisibleActions($requestVisibleActions) { if (\is_array($requestVisibleActions)) { $requestVisibleActions = \implode(" ", $requestVisibleActions); } $this->config['request_visible_actions'] = $requestVisibleActions; } /** * Set the developer key to use, these are obtained through the API Console. * @see http://code.google.com/apis/console-help/#generatingdevkeys * @param string $developerKey */ public function setDeveloperKey($developerKey) { $this->config['developer_key'] = $developerKey; } /** * Set the hd (hosted domain) parameter streamlines the login process for * Google Apps hosted accounts. By including the domain of the user, you * restrict sign-in to accounts at that domain. * @param string $hd the domain to use. */ public function setHostedDomain($hd) { $this->config['hd'] = $hd; } /** * Set the prompt hint. Valid values are none, consent and select_account. * If no value is specified and the user has not previously authorized * access, then the user is shown a consent screen. * @param string $prompt * {@code "none"} Do not display any authentication or consent screens. Must not be specified with other values. * {@code "consent"} Prompt the user for consent. * {@code "select_account"} Prompt the user to select an account. */ public function setPrompt($prompt) { $this->config['prompt'] = $prompt; } /** * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which * an authentication request is valid. * @param string $realm the URL-space to use. */ public function setOpenidRealm($realm) { $this->config['openid.realm'] = $realm; } /** * If this is provided with the value true, and the authorization request is * granted, the authorization will include any previous authorizations * granted to this user/application combination for other scopes. * @param bool $include the URL-space to use. */ public function setIncludeGrantedScopes($include) { $this->config['include_granted_scopes'] = $include; } /** * sets function to be called when an access token is fetched * @param callable $tokenCallback - function ($cacheKey, $accessToken) */ public function setTokenCallback(callable $tokenCallback) { $this->config['token_callback'] = $tokenCallback; } /** * Revoke an OAuth2 access token or refresh token. This method will revoke the current access * token, if a token isn't provided. * * @param string|array|null $token The token (access token or a refresh token) that should be revoked. * @return boolean Returns True if the revocation was successful, otherwise False. */ public function revokeToken($token = null) { $tokenRevoker = new Revoke($this->getHttpClient()); return $tokenRevoker->revokeToken($token ?: $this->getAccessToken()); } /** * Verify an id_token. This method will verify the current id_token, if one * isn't provided. * * @throws LogicException If no token was provided and no token was set using `setAccessToken`. * @throws UnexpectedValueException If the token is not a valid JWT. * @param string|null $idToken The token (id_token) that should be verified. * @return array|false Returns the token payload as an array if the verification was * successful, false otherwise. */ public function verifyIdToken($idToken = null) { $tokenVerifier = new Verify($this->getHttpClient(), $this->getCache(), $this->config['jwt']); if (null === $idToken) { $token = $this->getAccessToken(); if (!isset($token['id_token'])) { throw new LogicException('id_token must be passed in or set as part of setAccessToken'); } $idToken = $token['id_token']; } return $tokenVerifier->verifyIdToken($idToken, $this->getClientId()); } /** * Set the scopes to be requested. Must be called before createAuthUrl(). * Will remove any previously configured scopes. * @param string|array $scope_or_scopes, ie: * array( * 'https://www.googleapis.com/auth/plus.login', * 'https://www.googleapis.com/auth/moderator' * ); */ public function setScopes($scope_or_scopes) { $this->requestedScopes = []; $this->addScope($scope_or_scopes); } /** * This functions adds a scope to be requested as part of the OAuth2.0 flow. * Will append any scopes not previously requested to the scope parameter. * A single string will be treated as a scope to request. An array of strings * will each be appended. * @param string|string[] $scope_or_scopes e.g. "profile" */ public function addScope($scope_or_scopes) { if (\is_string($scope_or_scopes) && !\in_array($scope_or_scopes, $this->requestedScopes)) { $this->requestedScopes[] = $scope_or_scopes; } elseif (\is_array($scope_or_scopes)) { foreach ($scope_or_scopes as $scope) { $this->addScope($scope); } } } /** * Returns the list of scopes requested by the client * @return array the list of scopes * */ public function getScopes() { return $this->requestedScopes; } /** * @return string|null * @visible For Testing */ public function prepareScopes() { if (empty($this->requestedScopes)) { return null; } return \implode(' ', $this->requestedScopes); } /** * Helper method to execute deferred HTTP requests. * * @template T * @param RequestInterface $request * @param class-string|false|null $expectedClass * @throws \VendorDuplicator\Google\Exception * @return mixed|T|ResponseInterface */ public function execute(RequestInterface $request, $expectedClass = null) { $request = $request->withHeader('User-Agent', \sprintf('%s %s%s', $this->config['application_name'], self::USER_AGENT_SUFFIX, $this->getLibraryVersion()))->withHeader('x-goog-api-client', \sprintf('gl-php/%s gdcl/%s', \phpversion(), $this->getLibraryVersion())); if ($this->config['api_format_v2']) { $request = $request->withHeader('X-GOOG-API-FORMAT-VERSION', '2'); } // call the authorize method // this is where most of the grunt work is done $http = $this->authorize(); return REST::execute($http, $request, $expectedClass, $this->config['retry'], $this->config['retry_map']); } /** * Declare whether batch calls should be used. This may increase throughput * by making multiple requests in one connection. * * @param boolean $useBatch True if the batch support should * be enabled. Defaults to False. */ public function setUseBatch($useBatch) { // This is actually an alias for setDefer. $this->setDefer($useBatch); } /** * Are we running in Google AppEngine? * return bool */ public function isAppEngine() { return isset($_SERVER['SERVER_SOFTWARE']) && \strpos($_SERVER['SERVER_SOFTWARE'], 'VendorDuplicator\\Google App Engine') !== \false; } public function setConfig($name, $value) { $this->config[$name] = $value; } public function getConfig($name, $default = null) { return isset($this->config[$name]) ? $this->config[$name] : $default; } /** * For backwards compatibility * alias for setAuthConfig * * @param string $file the configuration file * @throws \VendorDuplicator\Google\Exception * @deprecated */ public function setAuthConfigFile($file) { $this->setAuthConfig($file); } /** * Set the auth config from new or deprecated JSON config. * This structure should match the file downloaded from * the "Download JSON" button on in the Google Developer * Console. * @param string|array $config the configuration json * @throws \VendorDuplicator\Google\Exception */ public function setAuthConfig($config) { if (\is_string($config)) { if (!\file_exists($config)) { throw new InvalidArgumentException(\sprintf('file "%s" does not exist', $config)); } $json = \file_get_contents($config); if (!($config = \json_decode($json, \true))) { throw new LogicException('invalid json for auth config'); } } $key = isset($config['installed']) ? 'installed' : 'web'; if (isset($config['type']) && $config['type'] == 'service_account') { // application default credentials $this->useApplicationDefaultCredentials(); // set the information from the config $this->setClientId($config['client_id']); $this->config['client_email'] = $config['client_email']; $this->config['signing_key'] = $config['private_key']; $this->config['signing_algorithm'] = 'HS256'; } elseif (isset($config[$key])) { // old-style $this->setClientId($config[$key]['client_id']); $this->setClientSecret($config[$key]['client_secret']); if (isset($config[$key]['redirect_uris'])) { $this->setRedirectUri($config[$key]['redirect_uris'][0]); } } else { // new-style $this->setClientId($config['client_id']); $this->setClientSecret($config['client_secret']); if (isset($config['redirect_uris'])) { $this->setRedirectUri($config['redirect_uris'][0]); } } } /** * Use when the service account has been delegated domain wide access. * * @param string $subject an email address account to impersonate */ public function setSubject($subject) { $this->config['subject'] = $subject; } /** * Declare whether making API calls should make the call immediately, or * return a request which can be called with ->execute(); * * @param boolean $defer True if calls should not be executed right away. */ public function setDefer($defer) { $this->deferExecution = $defer; } /** * Whether or not to return raw requests * @return boolean */ public function shouldDefer() { return $this->deferExecution; } /** * @return OAuth2 implementation */ public function getOAuth2Service() { if (!isset($this->auth)) { $this->auth = $this->createOAuth2Service(); } return $this->auth; } /** * create a default google auth object */ protected function createOAuth2Service() { $auth = new OAuth2(['clientId' => $this->getClientId(), 'clientSecret' => $this->getClientSecret(), 'authorizationUri' => self::OAUTH2_AUTH_URL, 'tokenCredentialUri' => self::OAUTH2_TOKEN_URI, 'redirectUri' => $this->getRedirectUri(), 'issuer' => $this->config['client_id'], 'signingKey' => $this->config['signing_key'], 'signingAlgorithm' => $this->config['signing_algorithm']]); return $auth; } /** * Set the Cache object * @param CacheItemPoolInterface $cache */ public function setCache(CacheItemPoolInterface $cache) { $this->cache = $cache; } /** * @return CacheItemPoolInterface */ public function getCache() { if (!$this->cache) { $this->cache = $this->createDefaultCache(); } return $this->cache; } /** * @param array $cacheConfig */ public function setCacheConfig(array $cacheConfig) { $this->config['cache_config'] = $cacheConfig; } /** * Set the Logger object * @param LoggerInterface $logger */ public function setLogger(LoggerInterface $logger) { $this->logger = $logger; } /** * @return LoggerInterface */ public function getLogger() { if (!isset($this->logger)) { $this->logger = $this->createDefaultLogger(); } return $this->logger; } protected function createDefaultLogger() { $logger = new Logger('google-api-php-client'); if ($this->isAppEngine()) { $handler = new MonologSyslogHandler('app', \LOG_USER, Logger::NOTICE); } else { $handler = new MonologStreamHandler('php://stderr', Logger::NOTICE); } $logger->pushHandler($handler); return $logger; } protected function createDefaultCache() { return new MemoryCacheItemPool(); } /** * Set the Http Client object * @param ClientInterface $http */ public function setHttpClient(ClientInterface $http) { $this->http = $http; } /** * @return ClientInterface */ public function getHttpClient() { if (null === $this->http) { $this->http = $this->createDefaultHttpClient(); } return $this->http; } /** * Set the API format version. * * `true` will use V2, which may return more useful error messages. * * @param bool $value */ public function setApiFormatV2($value) { $this->config['api_format_v2'] = (bool) $value; } protected function createDefaultHttpClient() { $guzzleVersion = null; if (\defined('VendorDuplicator\\GuzzleHttp\\ClientInterface::MAJOR_VERSION')) { $guzzleVersion = ClientInterface::MAJOR_VERSION; } elseif (\defined('VendorDuplicator\\GuzzleHttp\\ClientInterface::VERSION')) { $guzzleVersion = (int) \substr(ClientInterface::VERSION, 0, 1); } if (5 === $guzzleVersion) { $options = ['base_url' => $this->config['base_path'], 'defaults' => ['exceptions' => \false]]; if ($this->isAppEngine()) { if (\class_exists(StreamHandler::class)) { // set StreamHandler on AppEngine by default $options['handler'] = new StreamHandler(); $options['defaults']['verify'] = '/etc/ca-certificates.crt'; } } } elseif (6 === $guzzleVersion || 7 === $guzzleVersion) { // guzzle 6 or 7 $options = ['base_uri' => $this->config['base_path'], 'http_errors' => \false]; } else { throw new LogicException('Could not find supported version of Guzzle.'); } return new GuzzleClient($options); } /** * @return FetchAuthTokenCache */ private function createApplicationDefaultCredentials() { $scopes = $this->prepareScopes(); $sub = $this->config['subject']; $signingKey = $this->config['signing_key']; // create credentials using values supplied in setAuthConfig if ($signingKey) { $serviceAccountCredentials = ['client_id' => $this->config['client_id'], 'client_email' => $this->config['client_email'], 'private_key' => $signingKey, 'type' => 'service_account', 'quota_project_id' => $this->config['quota_project']]; $credentials = CredentialsLoader::makeCredentials($scopes, $serviceAccountCredentials); } else { // When $sub is provided, we cannot pass cache classes to ::getCredentials // because FetchAuthTokenCache::setSub does not exist. // The result is when $sub is provided, calls to ::onGce are not cached. $credentials = ApplicationDefaultCredentials::getCredentials($scopes, null, $sub ? null : $this->config['cache_config'], $sub ? null : $this->getCache(), $this->config['quota_project']); } // for service account domain-wide authority (impersonating a user) // @see https://developers.google.com/identity/protocols/OAuth2ServiceAccount if ($sub) { if (!$credentials instanceof ServiceAccountCredentials) { throw new DomainException('domain-wide authority requires service account credentials'); } $credentials->setSub($sub); } // If we are not using FetchAuthTokenCache yet, create it now if (!$credentials instanceof FetchAuthTokenCache) { $credentials = new FetchAuthTokenCache($credentials, $this->config['cache_config'], $this->getCache()); } return $credentials; } protected function getAuthHandler() { // Be very careful using the cache, as the underlying auth library's cache // implementation is naive, and the cache keys do not account for user // sessions. // // @see https://github.com/google/google-api-php-client/issues/821 return AuthHandlerFactory::build($this->getCache(), $this->config['cache_config']); } private function createUserRefreshCredentials($scope, $refreshToken) { $creds = \array_filter(['client_id' => $this->getClientId(), 'client_secret' => $this->getClientSecret(), 'refresh_token' => $refreshToken]); return new UserRefreshCredentials($scope, $creds); } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Model.php000064400000024026147600374260021204 0ustar00mapTypes($array); } $this->gapiInit(); } /** * Getter that handles passthrough access to the data array, and lazy object creation. * @param string $key Property name. * @return mixed The value if any, or null. */ public function __get($key) { $keyType = $this->keyType($key); $keyDataType = $this->dataType($key); if ($keyType && !isset($this->processed[$key])) { if (isset($this->modelData[$key])) { $val = $this->modelData[$key]; } elseif ($keyDataType == 'array' || $keyDataType == 'map') { $val = []; } else { $val = null; } if ($this->isAssociativeArray($val)) { if ($keyDataType && 'map' == $keyDataType) { foreach ($val as $arrayKey => $arrayItem) { $this->modelData[$key][$arrayKey] = new $keyType($arrayItem); } } else { $this->modelData[$key] = new $keyType($val); } } elseif (\is_array($val)) { $arrayObject = []; foreach ($val as $arrayIndex => $arrayItem) { $arrayObject[$arrayIndex] = new $keyType($arrayItem); } $this->modelData[$key] = $arrayObject; } $this->processed[$key] = \true; } return isset($this->modelData[$key]) ? $this->modelData[$key] : null; } /** * Initialize this object's properties from an array. * * @param array $array Used to seed this object's properties. * @return void */ protected function mapTypes($array) { // Hard initialise simple types, lazy load more complex ones. foreach ($array as $key => $val) { if ($keyType = $this->keyType($key)) { $dataType = $this->dataType($key); if ($dataType == 'array' || $dataType == 'map') { $this->{$key} = []; foreach ($val as $itemKey => $itemVal) { if ($itemVal instanceof $keyType) { $this->{$key}[$itemKey] = $itemVal; } else { $this->{$key}[$itemKey] = new $keyType($itemVal); } } } elseif ($val instanceof $keyType) { $this->{$key} = $val; } else { $this->{$key} = new $keyType($val); } unset($array[$key]); } elseif (\property_exists($this, $key)) { $this->{$key} = $val; unset($array[$key]); } elseif (\property_exists($this, $camelKey = $this->camelCase($key))) { // This checks if property exists as camelCase, leaving it in array as snake_case // in case of backwards compatibility issues. $this->{$camelKey} = $val; } } $this->modelData = $array; } /** * Blank initialiser to be used in subclasses to do post-construction initialisation - this * avoids the need for subclasses to have to implement the variadics handling in their * constructors. */ protected function gapiInit() { return; } /** * Create a simplified object suitable for straightforward * conversion to JSON. This is relatively expensive * due to the usage of reflection, but shouldn't be called * a whole lot, and is the most straightforward way to filter. */ public function toSimpleObject() { $object = new stdClass(); // Process all other data. foreach ($this->modelData as $key => $val) { $result = $this->getSimpleValue($val); if ($result !== null) { $object->{$key} = $this->nullPlaceholderCheck($result); } } // Process all public properties. $reflect = new ReflectionObject($this); $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); foreach ($props as $member) { $name = $member->getName(); $result = $this->getSimpleValue($this->{$name}); if ($result !== null) { $name = $this->getMappedName($name); $object->{$name} = $this->nullPlaceholderCheck($result); } } return $object; } /** * Handle different types of values, primarily * other objects and map and array data types. */ private function getSimpleValue($value) { if ($value instanceof Model) { return $value->toSimpleObject(); } elseif (\is_array($value)) { $return = []; foreach ($value as $key => $a_value) { $a_value = $this->getSimpleValue($a_value); if ($a_value !== null) { $key = $this->getMappedName($key); $return[$key] = $this->nullPlaceholderCheck($a_value); } } return $return; } return $value; } /** * Check whether the value is the null placeholder and return true null. */ private function nullPlaceholderCheck($value) { if ($value === self::NULL_VALUE) { return null; } return $value; } /** * If there is an internal name mapping, use that. */ private function getMappedName($key) { if (isset($this->internal_gapi_mappings, $this->internal_gapi_mappings[$key])) { $key = $this->internal_gapi_mappings[$key]; } return $key; } /** * Returns true only if the array is associative. * @param array $array * @return bool True if the array is associative. */ protected function isAssociativeArray($array) { if (!\is_array($array)) { return \false; } $keys = \array_keys($array); foreach ($keys as $key) { if (\is_string($key)) { return \true; } } return \false; } /** * Verify if $obj is an array. * @throws \VendorDuplicator\Google\Exception Thrown if $obj isn't an array. * @param array $obj Items that should be validated. * @param string $method Method expecting an array as an argument. */ public function assertIsArray($obj, $method) { if ($obj && !\is_array($obj)) { throw new GoogleException("Incorrect parameter type passed to {$method}(). Expected an array."); } } /** @return bool */ #[\ReturnTypeWillChange] public function offsetExists($offset) { return isset($this->{$offset}) || isset($this->modelData[$offset]); } /** @return mixed */ #[\ReturnTypeWillChange] public function offsetGet($offset) { return isset($this->{$offset}) ? $this->{$offset} : $this->__get($offset); } /** @return void */ #[\ReturnTypeWillChange] public function offsetSet($offset, $value) { if (\property_exists($this, $offset)) { $this->{$offset} = $value; } else { $this->modelData[$offset] = $value; $this->processed[$offset] = \true; } } /** @return void */ #[\ReturnTypeWillChange] public function offsetUnset($offset) { unset($this->modelData[$offset]); } protected function keyType($key) { $keyType = $key . "Type"; // ensure keyType is a valid class if (\property_exists($this, $keyType) && $this->{$keyType} !== null && \class_exists($this->{$keyType})) { return $this->{$keyType}; } } protected function dataType($key) { $dataType = $key . "DataType"; if (\property_exists($this, $dataType)) { return $this->{$dataType}; } } public function __isset($key) { return isset($this->modelData[$key]); } public function __unset($key) { unset($this->modelData[$key]); } /** * Convert a string to camelCase * @param string $value * @return string */ private function camelCase($value) { $value = \ucwords(\str_replace(['-', '_'], ' ', $value)); $value = \str_replace(' ', '', $value); $value[0] = \strtolower($value[0]); return $value; } } addons/gdriveaddon/vendor-prefixed/google/apiclient/src/Exception.php000064400000001310147600374260022071 0ustar00 * $driveService = new Google\Service\Drive(...); * $changes = $driveService->changes; * */ class Changes extends \VendorDuplicator\Google\Service\Resource { /** * Gets the starting pageToken for listing future changes. * (changes.getStartPageToken) * * @param array $optParams Optional parameters. * * @opt_param string driveId The ID of the shared drive for which the starting * pageToken for listing future changes from that shared drive is returned. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param string teamDriveId Deprecated use driveId instead. * @return StartPageToken */ public function getStartPageToken($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('getStartPageToken', [$params], StartPageToken::class); } /** * Lists the changes for a user or shared drive. (changes.listChanges) * * @param string $pageToken The token for continuing a previous list request on * the next page. This should be set to the value of 'nextPageToken' from the * previous response or to the response from the getStartPageToken method. * @param array $optParams Optional parameters. * * @opt_param string driveId The shared drive from which changes are returned. * If specified the change IDs will be reflective of the shared drive; use the * combined drive ID and change ID as an identifier. * @opt_param bool includeCorpusRemovals Whether changes should include the file * resource if the file is still accessible by the user at the time of the * request, even when a file was removed from the list of changes and there will * be no further change entries for this file. * @opt_param bool includeItemsFromAllDrives Whether both My Drive and shared * drive items should be included in results. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool includeRemoved Whether to include changes indicating that * items have been removed from the list of changes, for example by deletion or * loss of access. * @opt_param bool includeTeamDriveItems Deprecated use * includeItemsFromAllDrives instead. * @opt_param int pageSize The maximum number of changes to return per page. * @opt_param bool restrictToMyDrive Whether to restrict the results to changes * inside the My Drive hierarchy. This omits changes to files such as those in * the Application Data folder or shared files which have not been added to My * Drive. * @opt_param string spaces A comma-separated list of spaces to query within the * corpora. Supported values are 'drive' and 'appDataFolder'. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param string teamDriveId Deprecated use driveId instead. * @return ChangeList */ public function listChanges($pageToken, $optParams = []) { $params = ['pageToken' => $pageToken]; $params = \array_merge($params, $optParams); return $this->call('list', [$params], ChangeList::class); } /** * Subscribes to changes for a user. To use this method, you must include the * pageToken query parameter. (changes.watch) * * @param string $pageToken The token for continuing a previous list request on * the next page. This should be set to the value of 'nextPageToken' from the * previous response or to the response from the getStartPageToken method. * @param Channel $postBody * @param array $optParams Optional parameters. * * @opt_param string driveId The shared drive from which changes are returned. * If specified the change IDs will be reflective of the shared drive; use the * combined drive ID and change ID as an identifier. * @opt_param bool includeCorpusRemovals Whether changes should include the file * resource if the file is still accessible by the user at the time of the * request, even when a file was removed from the list of changes and there will * be no further change entries for this file. * @opt_param bool includeItemsFromAllDrives Whether both My Drive and shared * drive items should be included in results. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool includeRemoved Whether to include changes indicating that * items have been removed from the list of changes, for example by deletion or * loss of access. * @opt_param bool includeTeamDriveItems Deprecated use * includeItemsFromAllDrives instead. * @opt_param int pageSize The maximum number of changes to return per page. * @opt_param bool restrictToMyDrive Whether to restrict the results to changes * inside the My Drive hierarchy. This omits changes to files such as those in * the Application Data folder or shared files which have not been added to My * Drive. * @opt_param string spaces A comma-separated list of spaces to query within the * corpora. Supported values are 'drive' and 'appDataFolder'. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param string teamDriveId Deprecated use driveId instead. * @return Channel */ public function watch($pageToken, Channel $postBody, $optParams = []) { $params = ['pageToken' => $pageToken, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('watch', [$params], Channel::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Changes::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Changes'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Drives.php000064400000013662147600374260026065 0ustar00 * $driveService = new Google\Service\Drive(...); * $drives = $driveService->drives; * */ class Drives extends \VendorDuplicator\Google\Service\Resource { /** * Creates a shared drive. (drives.create) * * @param string $requestId An ID, such as a random UUID, which uniquely * identifies this user's request for idempotent creation of a shared drive. A * repeated request by the same user and with the same request ID will avoid * creating duplicates by attempting to create the same shared drive. If the * shared drive already exists a 409 error will be returned. * @param Drive $postBody * @param array $optParams Optional parameters. * @return Drive */ public function create($requestId, Drive $postBody, $optParams = []) { $params = ['requestId' => $requestId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], Drive::class); } /** * Permanently deletes a shared drive for which the user is an organizer. The * shared drive cannot contain any untrashed items. (drives.delete) * * @param string $driveId The ID of the shared drive. * @param array $optParams Optional parameters. * * @opt_param bool allowItemDeletion Whether any items inside the shared drive * should also be deleted. This option is only supported when * useDomainAdminAccess is also set to true. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * they are an administrator of the domain to which the shared drive belongs. */ public function delete($driveId, $optParams = []) { $params = ['driveId' => $driveId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Gets a shared drive's metadata by ID. (drives.get) * * @param string $driveId The ID of the shared drive. * @param array $optParams Optional parameters. * * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * they are an administrator of the domain to which the shared drive belongs. * @return Drive */ public function get($driveId, $optParams = []) { $params = ['driveId' => $driveId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], Drive::class); } /** * Hides a shared drive from the default view. (drives.hide) * * @param string $driveId The ID of the shared drive. * @param array $optParams Optional parameters. * @return Drive */ public function hide($driveId, $optParams = []) { $params = ['driveId' => $driveId]; $params = \array_merge($params, $optParams); return $this->call('hide', [$params], Drive::class); } /** * Lists the user's shared drives. (drives.listDrives) * * @param array $optParams Optional parameters. * * @opt_param int pageSize Maximum number of shared drives to return per page. * @opt_param string pageToken Page token for shared drives. * @opt_param string q Query string for searching shared drives. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then all shared drives of the domain in which * the requester is an administrator are returned. * @return DriveList */ public function listDrives($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('list', [$params], DriveList::class); } /** * Restores a shared drive to the default view. (drives.unhide) * * @param string $driveId The ID of the shared drive. * @param array $optParams Optional parameters. * @return Drive */ public function unhide($driveId, $optParams = []) { $params = ['driveId' => $driveId]; $params = \array_merge($params, $optParams); return $this->call('unhide', [$params], Drive::class); } /** * Updates the metadata for a shared drive. (drives.update) * * @param string $driveId The ID of the shared drive. * @param Drive $postBody * @param array $optParams Optional parameters. * * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator. If set to true, then the requester is granted access if * they're an administrator of the domain to which the shared drive belongs. * @return Drive */ public function update($driveId, Drive $postBody, $optParams = []) { $params = ['driveId' => $driveId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], Drive::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Drives::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Drives'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Channels.php000064400000002772147600374260026364 0ustar00 * $driveService = new Google\Service\Drive(...); * $channels = $driveService->channels; * */ class Channels extends \VendorDuplicator\Google\Service\Resource { /** * Stop watching resources through this channel (channels.stop) * * @param Channel $postBody * @param array $optParams Optional parameters. */ public function stop(Channel $postBody, $optParams = []) { $params = ['postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('stop', [$params]); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Channels::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Channels'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Files.php000064400000042302147600374260025664 0ustar00 * $driveService = new Google\Service\Drive(...); * $files = $driveService->files; * */ class Files extends \VendorDuplicator\Google\Service\Resource { /** * Creates a copy of a file and applies any requested updates with patch * semantics. Folders cannot be copied. (files.copy) * * @param string $fileId The ID of the file. * @param DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param bool enforceSingleParent Deprecated. Copying files into multiple * folders is no longer supported. Use shortcuts instead. * @opt_param bool ignoreDefaultVisibility Whether to ignore the domain's * default visibility settings for the created file. Domain administrators can * choose to make all uploaded files visible to the domain by default; this * parameter bypasses that behavior for the request. Permissions are still * inherited from parent folders. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool keepRevisionForever Whether to set the 'keepForever' field in * the new head revision. This is only applicable to files with binary content * in Google Drive. Only 200 revisions for the file can be kept forever. If the * limit is reached, try deleting pinned revisions. * @opt_param string ocrLanguage A language hint for OCR processing during image * import (ISO 639-1 code). * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @return DriveFile */ public function copy($fileId, DriveFile $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('copy', [$params], DriveFile::class); } /** * Creates a file. (files.create) * * @param DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param bool enforceSingleParent Deprecated. Creating files in multiple * folders is no longer supported. * @opt_param bool ignoreDefaultVisibility Whether to ignore the domain's * default visibility settings for the created file. Domain administrators can * choose to make all uploaded files visible to the domain by default; this * parameter bypasses that behavior for the request. Permissions are still * inherited from parent folders. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool keepRevisionForever Whether to set the 'keepForever' field in * the new head revision. This is only applicable to files with binary content * in Google Drive. Only 200 revisions for the file can be kept forever. If the * limit is reached, try deleting pinned revisions. * @opt_param string ocrLanguage A language hint for OCR processing during image * import (ISO 639-1 code). * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool useContentAsIndexableText Whether to use the uploaded content * as indexable text. * @return DriveFile */ public function create(DriveFile $postBody, $optParams = []) { $params = ['postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], DriveFile::class); } /** * Permanently deletes a file owned by the user without moving it to the trash. * If the file belongs to a shared drive the user must be an organizer on the * parent. If the target is a folder, all descendants owned by the user are also * deleted. (files.delete) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param bool enforceSingleParent Deprecated. If an item is not in a shared * drive and its last parent is deleted but the item itself is not, the item * will be placed under its owner's root. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. */ public function delete($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Permanently deletes all trashed files of a user or shared drive. * (files.emptyTrash) * * @param array $optParams Optional parameters. * * @opt_param string driveId If set, empties the trash of the provided shared * drive. * @opt_param bool enforceSingleParent Deprecated. If an item is not in a shared * drive and its last parent is deleted but the item itself is not, the item * will be placed under its owner's root. */ public function emptyTrash($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('emptyTrash', [$params]); } /** * Exports a Google Workspace document to the requested MIME type and returns * exported byte content. Note that the exported content is limited to 10MB. * (files.export) * * @param string $fileId The ID of the file. * @param string $mimeType The MIME type of the format requested for this * export. * @param array $optParams Optional parameters. */ public function export($fileId, $mimeType, $optParams = []) { $params = ['fileId' => $fileId, 'mimeType' => $mimeType]; $params = \array_merge($params, $optParams); return $this->call('export', [$params]); } /** * Generates a set of file IDs which can be provided in create or copy requests. * (files.generateIds) * * @param array $optParams Optional parameters. * * @opt_param int count The number of IDs to return. * @opt_param string space The space in which the IDs can be used to create new * files. Supported values are 'drive' and 'appDataFolder'. (Default: 'drive') * @opt_param string type The type of items which the IDs can be used for. * Supported values are 'files' and 'shortcuts'. Note that 'shortcuts' are only * supported in the drive 'space'. (Default: 'files') * @return GeneratedIds */ public function generateIds($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('generateIds', [$params], GeneratedIds::class); } /** * Gets a file's metadata or content by ID. (files.get) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param bool acknowledgeAbuse Whether the user is acknowledging the risk * of downloading known malware or other abusive files. This is only applicable * when alt=media. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @return DriveFile */ public function get($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], DriveFile::class); } /** * Lists or searches files. (files.listFiles) * * @param array $optParams Optional parameters. * * @opt_param string corpora Groupings of files to which the query applies. * Supported groupings are: 'user' (files created by, opened by, or shared * directly with the user), 'drive' (files in the specified shared drive as * indicated by the 'driveId'), 'domain' (files shared to the user's domain), * and 'allDrives' (A combination of 'user' and 'drive' for all drives where the * user is a member). When able, use 'user' or 'drive', instead of 'allDrives', * for efficiency. * @opt_param string corpus The source of files to list. Deprecated: use * 'corpora' instead. * @opt_param string driveId ID of the shared drive to search. * @opt_param bool includeItemsFromAllDrives Whether both My Drive and shared * drive items should be included in results. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool includeTeamDriveItems Deprecated use * includeItemsFromAllDrives instead. * @opt_param string orderBy A comma-separated list of sort keys. Valid keys are * 'createdTime', 'folder', 'modifiedByMeTime', 'modifiedTime', 'name', * 'name_natural', 'quotaBytesUsed', 'recency', 'sharedWithMeTime', 'starred', * and 'viewedByMeTime'. Each key sorts ascending by default, but may be * reversed with the 'desc' modifier. Example usage: * ?orderBy=folder,modifiedTime desc,name. Please note that there is a current * limitation for users with approximately one million files in which the * requested sort order is ignored. * @opt_param int pageSize The maximum number of files to return per page. * Partial or empty result pages are possible even before the end of the files * list has been reached. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @opt_param string q A query for filtering the file results. See the "Search * for Files" guide for supported syntax. * @opt_param string spaces A comma-separated list of spaces to query within the * corpora. Supported values are 'drive' and 'appDataFolder'. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param string teamDriveId Deprecated use driveId instead. * @return FileList */ public function listFiles($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('list', [$params], FileList::class); } /** * Lists the labels on a file. (files.listLabels) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param int maxResults The maximum number of labels to return per page. * When not set, this defaults to 100. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @return LabelList */ public function listLabels($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('listLabels', [$params], LabelList::class); } /** * Modifies the set of labels on a file. (files.modifyLabels) * * @param string $fileId The ID of the file for which the labels are modified. * @param ModifyLabelsRequest $postBody * @param array $optParams Optional parameters. * @return ModifyLabelsResponse */ public function modifyLabels($fileId, ModifyLabelsRequest $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('modifyLabels', [$params], ModifyLabelsResponse::class); } /** * Updates a file's metadata and/or content. When calling this method, only * populate fields in the request that you want to modify. When updating fields, * some fields might change automatically, such as modifiedDate. This method * supports patch semantics. (files.update) * * @param string $fileId The ID of the file. * @param DriveFile $postBody * @param array $optParams Optional parameters. * * @opt_param string addParents A comma-separated list of parent IDs to add. * @opt_param bool enforceSingleParent Deprecated. Adding files to multiple * folders is no longer supported. Use shortcuts instead. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool keepRevisionForever Whether to set the 'keepForever' field in * the new head revision. This is only applicable to files with binary content * in Google Drive. Only 200 revisions for the file can be kept forever. If the * limit is reached, try deleting pinned revisions. * @opt_param string ocrLanguage A language hint for OCR processing during image * import (ISO 639-1 code). * @opt_param string removeParents A comma-separated list of parent IDs to * remove. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool useContentAsIndexableText Whether to use the uploaded content * as indexable text. * @return DriveFile */ public function update($fileId, DriveFile $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], DriveFile::class); } /** * Subscribe to changes on a file. (files.watch) * * @param string $fileId The ID of the file. * @param Channel $postBody * @param array $optParams Optional parameters. * * @opt_param bool acknowledgeAbuse Whether the user is acknowledging the risk * of downloading known malware or other abusive files. This is only applicable * when alt=media. * @opt_param string includeLabels A comma-separated list of IDs of labels to * include in the labelInfo part of the response. * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @return Channel */ public function watch($fileId, Channel $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('watch', [$params], Channel::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Files::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Files'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Revisions.php000064400000007641147600374260026612 0ustar00 * $driveService = new Google\Service\Drive(...); * $revisions = $driveService->revisions; * */ class Revisions extends \VendorDuplicator\Google\Service\Resource { /** * Permanently deletes a file version. You can only delete revisions for files * with binary content in Google Drive, like images or videos. Revisions for * other files, like Google Docs or Sheets, and the last remaining file version * can't be deleted. (revisions.delete) * * @param string $fileId The ID of the file. * @param string $revisionId The ID of the revision. * @param array $optParams Optional parameters. */ public function delete($fileId, $revisionId, $optParams = []) { $params = ['fileId' => $fileId, 'revisionId' => $revisionId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Gets a revision's metadata or content by ID. (revisions.get) * * @param string $fileId The ID of the file. * @param string $revisionId The ID of the revision. * @param array $optParams Optional parameters. * * @opt_param bool acknowledgeAbuse Whether the user is acknowledging the risk * of downloading known malware or other abusive files. This is only applicable * when alt=media. * @return Revision */ public function get($fileId, $revisionId, $optParams = []) { $params = ['fileId' => $fileId, 'revisionId' => $revisionId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], Revision::class); } /** * Lists a file's revisions. (revisions.listRevisions) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param int pageSize The maximum number of revisions to return per page. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @return RevisionList */ public function listRevisions($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('list', [$params], RevisionList::class); } /** * Updates a revision with patch semantics. (revisions.update) * * @param string $fileId The ID of the file. * @param string $revisionId The ID of the revision. * @param Revision $postBody * @param array $optParams Optional parameters. * @return Revision */ public function update($fileId, $revisionId, Revision $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], Revision::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Revisions::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Revisions'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/About.php000064400000002767147600374260025707 0ustar00 * $driveService = new Google\Service\Drive(...); * $about = $driveService->about; * */ class About extends \VendorDuplicator\Google\Service\Resource { /** * Gets information about the user, the user's Drive, and system capabilities. * (about.get) * * @param array $optParams Optional parameters. * @return AboutModel */ public function get($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('get', [$params], AboutModel::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(About::class, 'VendorDuplicator\\Google_Service_Drive_Resource_About'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Comments.php000064400000010475147600374260026415 0ustar00 * $driveService = new Google\Service\Drive(...); * $comments = $driveService->comments; * */ class Comments extends \VendorDuplicator\Google\Service\Resource { /** * Creates a comment on a file. (comments.create) * * @param string $fileId The ID of the file. * @param Comment $postBody * @param array $optParams Optional parameters. * @return Comment */ public function create($fileId, Comment $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], Comment::class); } /** * Deletes a comment. (comments.delete) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. */ public function delete($fileId, $commentId, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Gets a comment by ID. (comments.get) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted Whether to return deleted comments. Deleted * comments will not include their original content. * @return Comment */ public function get($fileId, $commentId, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], Comment::class); } /** * Lists a file's comments. (comments.listComments) * * @param string $fileId The ID of the file. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted Whether to include deleted comments. Deleted * comments will not include their original content. * @opt_param int pageSize The maximum number of comments to return per page. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @opt_param string startModifiedTime The minimum value of 'modifiedTime' for * the result comments (RFC 3339 date-time). * @return CommentList */ public function listComments($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('list', [$params], CommentList::class); } /** * Updates a comment with patch semantics. (comments.update) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param Comment $postBody * @param array $optParams Optional parameters. * @return Comment */ public function update($fileId, $commentId, Comment $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], Comment::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Comments::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Comments'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Teamdrives.php000064400000011253147600374260026726 0ustar00 * $driveService = new Google\Service\Drive(...); * $teamdrives = $driveService->teamdrives; * */ class Teamdrives extends \VendorDuplicator\Google\Service\Resource { /** * Deprecated use drives.create instead. (teamdrives.create) * * @param string $requestId An ID, such as a random UUID, which uniquely * identifies this user's request for idempotent creation of a Team Drive. A * repeated request by the same user and with the same request ID will avoid * creating duplicates by attempting to create the same Team Drive. If the Team * Drive already exists a 409 error will be returned. * @param TeamDrive $postBody * @param array $optParams Optional parameters. * @return TeamDrive */ public function create($requestId, TeamDrive $postBody, $optParams = []) { $params = ['requestId' => $requestId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], TeamDrive::class); } /** * Deprecated use drives.delete instead. (teamdrives.delete) * * @param string $teamDriveId The ID of the Team Drive * @param array $optParams Optional parameters. */ public function delete($teamDriveId, $optParams = []) { $params = ['teamDriveId' => $teamDriveId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Deprecated use drives.get instead. (teamdrives.get) * * @param string $teamDriveId The ID of the Team Drive * @param array $optParams Optional parameters. * * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * they are an administrator of the domain to which the Team Drive belongs. * @return TeamDrive */ public function get($teamDriveId, $optParams = []) { $params = ['teamDriveId' => $teamDriveId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], TeamDrive::class); } /** * Deprecated use drives.list instead. (teamdrives.listTeamdrives) * * @param array $optParams Optional parameters. * * @opt_param int pageSize Maximum number of Team Drives to return. * @opt_param string pageToken Page token for Team Drives. * @opt_param string q Query string for searching Team Drives. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then all Team Drives of the domain in which * the requester is an administrator are returned. * @return TeamDriveList */ public function listTeamdrives($optParams = []) { $params = []; $params = \array_merge($params, $optParams); return $this->call('list', [$params], TeamDriveList::class); } /** * Deprecated use drives.update instead (teamdrives.update) * * @param string $teamDriveId The ID of the Team Drive * @param TeamDrive $postBody * @param array $optParams Optional parameters. * * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * they are an administrator of the domain to which the Team Drive belongs. * @return TeamDrive */ public function update($teamDriveId, TeamDrive $postBody, $optParams = []) { $params = ['teamDriveId' => $teamDriveId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], TeamDrive::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Teamdrives::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Teamdrives'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Permissions.php000064400000022353147600374260027141 0ustar00 * $driveService = new Google\Service\Drive(...); * $permissions = $driveService->permissions; * */ class Permissions extends \VendorDuplicator\Google\Service\Resource { /** * Creates a permission for a file or shared drive. For more information on * creating permissions, see Share files, folders & drives. (permissions.create) * * @param string $fileId The ID of the file or shared drive. * @param Permission $postBody * @param array $optParams Optional parameters. * * @opt_param string emailMessage A plain text custom message to include in the * notification email. * @opt_param bool enforceSingleParent Deprecated. See moveToNewOwnersRoot for * details. * @opt_param bool moveToNewOwnersRoot This parameter will only take effect if * the item is not in a shared drive and the request is attempting to transfer * the ownership of the item. If set to true, the item will be moved to the new * owner's My Drive root folder and all prior parents removed. If set to false, * parents are not changed. * @opt_param bool sendNotificationEmail Whether to send a notification email * when sharing to users or groups. This defaults to true for users and groups, * and is not allowed for other requests. It must not be disabled for ownership * transfers. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool transferOwnership Whether to transfer ownership to the * specified user and downgrade the current owner to a writer. This parameter is * required as an acknowledgement of the side effect. File owners can only * transfer ownership of files existing on My Drive. Files existing in a shared * drive are owned by the organization that owns that shared drive. Ownership * transfers are not supported for files and folders in shared drives. * Organizers of a shared drive can move items from that shared drive into their * My Drive which transfers the ownership to them. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * the file ID parameter refers to a shared drive and the requester is an * administrator of the domain to which the shared drive belongs. * @return Permission */ public function create($fileId, Permission $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], Permission::class); } /** * Deletes a permission. (permissions.delete) * * @param string $fileId The ID of the file or shared drive. * @param string $permissionId The ID of the permission. * @param array $optParams Optional parameters. * * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * the file ID parameter refers to a shared drive and the requester is an * administrator of the domain to which the shared drive belongs. */ public function delete($fileId, $permissionId, $optParams = []) { $params = ['fileId' => $fileId, 'permissionId' => $permissionId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Gets a permission by ID. (permissions.get) * * @param string $fileId The ID of the file. * @param string $permissionId The ID of the permission. * @param array $optParams Optional parameters. * * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * the file ID parameter refers to a shared drive and the requester is an * administrator of the domain to which the shared drive belongs. * @return Permission */ public function get($fileId, $permissionId, $optParams = []) { $params = ['fileId' => $fileId, 'permissionId' => $permissionId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], Permission::class); } /** * Lists a file's or shared drive's permissions. (permissions.listPermissions) * * @param string $fileId The ID of the file or shared drive. * @param array $optParams Optional parameters. * * @opt_param string includePermissionsForView Specifies which additional view's * permissions to include in the response. Only 'published' is supported. * @opt_param int pageSize The maximum number of permissions to return per page. * When not set for files in a shared drive, at most 100 results will be * returned. When not set for files that are not in a shared drive, the entire * list will be returned. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * the file ID parameter refers to a shared drive and the requester is an * administrator of the domain to which the shared drive belongs. * @return PermissionList */ public function listPermissions($fileId, $optParams = []) { $params = ['fileId' => $fileId]; $params = \array_merge($params, $optParams); return $this->call('list', [$params], PermissionList::class); } /** * Updates a permission with patch semantics. (permissions.update) * * @param string $fileId The ID of the file or shared drive. * @param string $permissionId The ID of the permission. * @param Permission $postBody * @param array $optParams Optional parameters. * * @opt_param bool removeExpiration Whether to remove the expiration date. * @opt_param bool supportsAllDrives Whether the requesting application supports * both My Drives and shared drives. * @opt_param bool supportsTeamDrives Deprecated use supportsAllDrives instead. * @opt_param bool transferOwnership Whether to transfer ownership to the * specified user and downgrade the current owner to a writer. This parameter is * required as an acknowledgement of the side effect. File owners can only * transfer ownership of files existing on My Drive. Files existing in a shared * drive are owned by the organization that owns that shared drive. Ownership * transfers are not supported for files and folders in shared drives. * Organizers of a shared drive can move items from that shared drive into their * My Drive which transfers the ownership to them. * @opt_param bool useDomainAdminAccess Issue the request as a domain * administrator; if set to true, then the requester will be granted access if * the file ID parameter refers to a shared drive and the requester is an * administrator of the domain to which the shared drive belongs. * @return Permission */ public function update($fileId, $permissionId, Permission $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], Permission::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Permissions::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Permissions'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Resource/Replies.php000064400000011100147600374260026215 0ustar00 * $driveService = new Google\Service\Drive(...); * $replies = $driveService->replies; * */ class Replies extends \VendorDuplicator\Google\Service\Resource { /** * Creates a reply to a comment. (replies.create) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param Reply $postBody * @param array $optParams Optional parameters. * @return Reply */ public function create($fileId, $commentId, Reply $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('create', [$params], Reply::class); } /** * Deletes a reply. (replies.delete) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param array $optParams Optional parameters. */ public function delete($fileId, $commentId, $replyId, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId]; $params = \array_merge($params, $optParams); return $this->call('delete', [$params]); } /** * Gets a reply by ID. (replies.get) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted Whether to return deleted replies. Deleted * replies will not include their original content. * @return Reply */ public function get($fileId, $commentId, $replyId, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId]; $params = \array_merge($params, $optParams); return $this->call('get', [$params], Reply::class); } /** * Lists a comment's replies. (replies.listReplies) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param array $optParams Optional parameters. * * @opt_param bool includeDeleted Whether to include deleted replies. Deleted * replies will not include their original content. * @opt_param int pageSize The maximum number of replies to return per page. * @opt_param string pageToken The token for continuing a previous list request * on the next page. This should be set to the value of 'nextPageToken' from the * previous response. * @return ReplyList */ public function listReplies($fileId, $commentId, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId]; $params = \array_merge($params, $optParams); return $this->call('list', [$params], ReplyList::class); } /** * Updates a reply with patch semantics. (replies.update) * * @param string $fileId The ID of the file. * @param string $commentId The ID of the comment. * @param string $replyId The ID of the reply. * @param Reply $postBody * @param array $optParams Optional parameters. * @return Reply */ public function update($fileId, $commentId, $replyId, Reply $postBody, $optParams = []) { $params = ['fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody]; $params = \array_merge($params, $optParams); return $this->call('update', [$params], Reply::class); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Replies::class, 'VendorDuplicator\\Google_Service_Drive_Resource_Replies'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileContentHints.php000064400000003225147600374260027246 0ustar00indexableText = $indexableText; } /** * @return string */ public function getIndexableText() { return $this->indexableText; } /** * @param DriveFileContentHintsThumbnail */ public function setThumbnail(DriveFileContentHintsThumbnail $thumbnail) { $this->thumbnail = $thumbnail; } /** * @return DriveFileContentHintsThumbnail */ public function getThumbnail() { return $this->thumbnail; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileContentHints::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileContentHints'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/ModifyLabelsRequest.php000064400000003226147600374260026760 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param LabelModification[] */ public function setLabelModifications($labelModifications) { $this->labelModifications = $labelModifications; } /** * @return LabelModification[] */ public function getLabelModifications() { return $this->labelModifications; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(ModifyLabelsRequest::class, 'VendorDuplicator\\Google_Service_Drive_ModifyLabelsRequest'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/TeamDriveBackgroundImageFile.php000064400000004074147600374260030403 0ustar00addonsid = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param float */ public function setWidth($width) { $this->width = $width; } /** * @return float */ public function getWidth() { return $this->width; } /** * @param float */ public function setXCoordinate($xCoordinate) { $this->xCoordinate = $xCoordinate; } /** * @return float */ public function getXCoordinate() { return $this->xCoordinate; } /** * @param float */ public function setYCoordinate($yCoordinate) { $this->yCoordinate = $yCoordinate; } /** * @return float */ public function getYCoordinate() { return $this->yCoordinate; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(TeamDriveBackgroundImageFile::class, 'VendorDuplicator\\Google_Service_Drive_TeamDriveBackgroundImageFile'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/LabelList.php000064400000003471147600374260024712 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param Label[] */ public function setLabels($labels) { $this->labels = $labels; } /** * @return Label[] */ public function getLabels() { return $this->labels; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(LabelList::class, 'VendorDuplicator\\Google_Service_Drive_LabelList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/ReplyList.php000064400000003502147600374260024761 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } /** * @param Reply[] */ public function setReplies($replies) { $this->replies = $replies; } /** * @return Reply[] */ public function getReplies() { return $this->replies; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(ReplyList::class, 'VendorDuplicator\\Google_Service_Drive_ReplyList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/LabelModification.php000064400000004403147600374260026400 0ustar00fieldModifications = $fieldModifications; } /** * @return LabelFieldModification[] */ public function getFieldModifications() { return $this->fieldModifications; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setLabelId($labelId) { $this->labelId = $labelId; } /** * @return string */ public function getLabelId() { return $this->labelId; } /** * @param bool */ public function setRemoveLabel($removeLabel) { $this->removeLabel = $removeLabel; } /** * @return bool */ public function getRemoveLabel() { return $this->removeLabel; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(LabelModification::class, 'VendorDuplicator\\Google_Service_Drive_LabelModification'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Permission.php000064400000013433147600374260025166 0ustar00allowFileDiscovery = $allowFileDiscovery; } /** * @return bool */ public function getAllowFileDiscovery() { return $this->allowFileDiscovery; } /** * @param bool */ public function setDeleted($deleted) { $this->deleted = $deleted; } /** * @return bool */ public function getDeleted() { return $this->deleted; } /** * @param string */ public function setDisplayName($displayName) { $this->displayName = $displayName; } /** * @return string */ public function getDisplayName() { return $this->displayName; } /** * @param string */ public function setDomain($domain) { $this->domain = $domain; } /** * @return string */ public function getDomain() { return $this->domain; } /** * @param string */ public function setEmailAddress($emailAddress) { $this->emailAddress = $emailAddress; } /** * @return string */ public function getEmailAddress() { return $this->emailAddress; } /** * @param string */ public function setExpirationTime($expirationTime) { $this->expirationTime = $expirationTime; } /** * @return string */ public function getExpirationTime() { return $this->expirationTime; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param bool */ public function setPendingOwner($pendingOwner) { $this->pendingOwner = $pendingOwner; } /** * @return bool */ public function getPendingOwner() { return $this->pendingOwner; } /** * @param PermissionPermissionDetails[] */ public function setPermissionDetails($permissionDetails) { $this->permissionDetails = $permissionDetails; } /** * @return PermissionPermissionDetails[] */ public function getPermissionDetails() { return $this->permissionDetails; } /** * @param string */ public function setPhotoLink($photoLink) { $this->photoLink = $photoLink; } /** * @return string */ public function getPhotoLink() { return $this->photoLink; } /** * @param string */ public function setRole($role) { $this->role = $role; } /** * @return string */ public function getRole() { return $this->role; } /** * @param PermissionTeamDrivePermissionDetails[] */ public function setTeamDrivePermissionDetails($teamDrivePermissionDetails) { $this->teamDrivePermissionDetails = $teamDrivePermissionDetails; } /** * @return PermissionTeamDrivePermissionDetails[] */ public function getTeamDrivePermissionDetails() { return $this->teamDrivePermissionDetails; } /** * @param string */ public function setType($type) { $this->type = $type; } /** * @return string */ public function getType() { return $this->type; } /** * @param string */ public function setView($view) { $this->view = $view; } /** * @return string */ public function getView() { return $this->view; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Permission::class, 'VendorDuplicator\\Google_Service_Drive_Permission'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveRestrictions.php000064400000005625147600374260026524 0ustar00adminManagedRestrictions = $adminManagedRestrictions; } /** * @return bool */ public function getAdminManagedRestrictions() { return $this->adminManagedRestrictions; } /** * @param bool */ public function setCopyRequiresWriterPermission($copyRequiresWriterPermission) { $this->copyRequiresWriterPermission = $copyRequiresWriterPermission; } /** * @return bool */ public function getCopyRequiresWriterPermission() { return $this->copyRequiresWriterPermission; } /** * @param bool */ public function setDomainUsersOnly($domainUsersOnly) { $this->domainUsersOnly = $domainUsersOnly; } /** * @return bool */ public function getDomainUsersOnly() { return $this->domainUsersOnly; } /** * @param bool */ public function setDriveMembersOnly($driveMembersOnly) { $this->driveMembersOnly = $driveMembersOnly; } /** * @return bool */ public function getDriveMembersOnly() { return $this->driveMembersOnly; } /** * @param bool */ public function setSharingFoldersRequiresOrganizerPermission($sharingFoldersRequiresOrganizerPermission) { $this->sharingFoldersRequiresOrganizerPermission = $sharingFoldersRequiresOrganizerPermission; } /** * @return bool */ public function getSharingFoldersRequiresOrganizerPermission() { return $this->sharingFoldersRequiresOrganizerPermission; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveRestrictions::class, 'VendorDuplicator\\Google_Service_Drive_DriveRestrictions'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileShortcutDetails.php000064400000003611147600374260027746 0ustar00targetId = $targetId; } /** * @return string */ public function getTargetId() { return $this->targetId; } /** * @param string */ public function setTargetMimeType($targetMimeType) { $this->targetMimeType = $targetMimeType; } /** * @return string */ public function getTargetMimeType() { return $this->targetMimeType; } /** * @param string */ public function setTargetResourceKey($targetResourceKey) { $this->targetResourceKey = $targetResourceKey; } /** * @return string */ public function getTargetResourceKey() { return $this->targetResourceKey; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileShortcutDetails::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileShortcutDetails'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Comment.php000064400000011145147600374260024436 0ustar00anchor = $anchor; } /** * @return string */ public function getAnchor() { return $this->anchor; } /** * @param User */ public function setAuthor(User $author) { $this->author = $author; } /** * @return User */ public function getAuthor() { return $this->author; } /** * @param string */ public function setContent($content) { $this->content = $content; } /** * @return string */ public function getContent() { return $this->content; } /** * @param string */ public function setCreatedTime($createdTime) { $this->createdTime = $createdTime; } /** * @return string */ public function getCreatedTime() { return $this->createdTime; } /** * @param bool */ public function setDeleted($deleted) { $this->deleted = $deleted; } /** * @return bool */ public function getDeleted() { return $this->deleted; } /** * @param string */ public function setHtmlContent($htmlContent) { $this->htmlContent = $htmlContent; } /** * @return string */ public function getHtmlContent() { return $this->htmlContent; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setModifiedTime($modifiedTime) { $this->modifiedTime = $modifiedTime; } /** * @return string */ public function getModifiedTime() { return $this->modifiedTime; } /** * @param CommentQuotedFileContent */ public function setQuotedFileContent(CommentQuotedFileContent $quotedFileContent) { $this->quotedFileContent = $quotedFileContent; } /** * @return CommentQuotedFileContent */ public function getQuotedFileContent() { return $this->quotedFileContent; } /** * @param Reply[] */ public function setReplies($replies) { $this->replies = $replies; } /** * @return Reply[] */ public function getReplies() { return $this->replies; } /** * @param bool */ public function setResolved($resolved) { $this->resolved = $resolved; } /** * @return bool */ public function getResolved() { return $this->resolved; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Comment::class, 'VendorDuplicator\\Google_Service_Drive_Comment'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Change.php000064400000010116147600374260024216 0ustar00changeType = $changeType; } /** * @return string */ public function getChangeType() { return $this->changeType; } /** * @param Drive */ public function setDrive(Drive $drive) { $this->drive = $drive; } /** * @return Drive */ public function getDrive() { return $this->drive; } /** * @param string */ public function setDriveId($driveId) { $this->driveId = $driveId; } /** * @return string */ public function getDriveId() { return $this->driveId; } /** * @param DriveFile */ public function setFile(DriveFile $file) { $this->file = $file; } /** * @return DriveFile */ public function getFile() { return $this->file; } /** * @param string */ public function setFileId($fileId) { $this->fileId = $fileId; } /** * @return string */ public function getFileId() { return $this->fileId; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param bool */ public function setRemoved($removed) { $this->removed = $removed; } /** * @return bool */ public function getRemoved() { return $this->removed; } /** * @param TeamDrive */ public function setTeamDrive(TeamDrive $teamDrive) { $this->teamDrive = $teamDrive; } /** * @return TeamDrive */ public function getTeamDrive() { return $this->teamDrive; } /** * @param string */ public function setTeamDriveId($teamDriveId) { $this->teamDriveId = $teamDriveId; } /** * @return string */ public function getTeamDriveId() { return $this->teamDriveId; } /** * @param string */ public function setTime($time) { $this->time = $time; } /** * @return string */ public function getTime() { return $this->time; } /** * @param string */ public function setType($type) { $this->type = $type; } /** * @return string */ public function getType() { return $this->type; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Change::class, 'VendorDuplicator\\Google_Service_Drive_Change'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileImageMediaMetadata.php000064400000016621147600374260030176 0ustar00addonsaperture = $aperture; } /** * @return float */ public function getAperture() { return $this->aperture; } /** * @param string */ public function setCameraMake($cameraMake) { $this->cameraMake = $cameraMake; } /** * @return string */ public function getCameraMake() { return $this->cameraMake; } /** * @param string */ public function setCameraModel($cameraModel) { $this->cameraModel = $cameraModel; } /** * @return string */ public function getCameraModel() { return $this->cameraModel; } /** * @param string */ public function setColorSpace($colorSpace) { $this->colorSpace = $colorSpace; } /** * @return string */ public function getColorSpace() { return $this->colorSpace; } /** * @param float */ public function setExposureBias($exposureBias) { $this->exposureBias = $exposureBias; } /** * @return float */ public function getExposureBias() { return $this->exposureBias; } /** * @param string */ public function setExposureMode($exposureMode) { $this->exposureMode = $exposureMode; } /** * @return string */ public function getExposureMode() { return $this->exposureMode; } /** * @param float */ public function setExposureTime($exposureTime) { $this->exposureTime = $exposureTime; } /** * @return float */ public function getExposureTime() { return $this->exposureTime; } /** * @param bool */ public function setFlashUsed($flashUsed) { $this->flashUsed = $flashUsed; } /** * @return bool */ public function getFlashUsed() { return $this->flashUsed; } /** * @param float */ public function setFocalLength($focalLength) { $this->focalLength = $focalLength; } /** * @return float */ public function getFocalLength() { return $this->focalLength; } /** * @param int */ public function setHeight($height) { $this->height = $height; } /** * @return int */ public function getHeight() { return $this->height; } /** * @param int */ public function setIsoSpeed($isoSpeed) { $this->isoSpeed = $isoSpeed; } /** * @return int */ public function getIsoSpeed() { return $this->isoSpeed; } /** * @param string */ public function setLens($lens) { $this->lens = $lens; } /** * @return string */ public function getLens() { return $this->lens; } /** * @param DriveFileImageMediaMetadataLocation */ public function setLocation(DriveFileImageMediaMetadataLocation $location) { $this->location = $location; } /** * @return DriveFileImageMediaMetadataLocation */ public function getLocation() { return $this->location; } /** * @param float */ public function setMaxApertureValue($maxApertureValue) { $this->maxApertureValue = $maxApertureValue; } /** * @return float */ public function getMaxApertureValue() { return $this->maxApertureValue; } /** * @param string */ public function setMeteringMode($meteringMode) { $this->meteringMode = $meteringMode; } /** * @return string */ public function getMeteringMode() { return $this->meteringMode; } /** * @param int */ public function setRotation($rotation) { $this->rotation = $rotation; } /** * @return int */ public function getRotation() { return $this->rotation; } /** * @param string */ public function setSensor($sensor) { $this->sensor = $sensor; } /** * @return string */ public function getSensor() { return $this->sensor; } /** * @param int */ public function setSubjectDistance($subjectDistance) { $this->subjectDistance = $subjectDistance; } /** * @return int */ public function getSubjectDistance() { return $this->subjectDistance; } /** * @param string */ public function setTime($time) { $this->time = $time; } /** * @return string */ public function getTime() { return $this->time; } /** * @param string */ public function setWhiteBalance($whiteBalance) { $this->whiteBalance = $whiteBalance; } /** * @return string */ public function getWhiteBalance() { return $this->whiteBalance; } /** * @param int */ public function setWidth($width) { $this->width = $width; } /** * @return int */ public function getWidth() { return $this->width; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileImageMediaMetadata::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileImageMediaMetadata'); vendor-prefixed/google/apiclient-services/src/Drive/PermissionTeamDrivePermissionDetails.php000064400000004343147600374260032267 0ustar00addons/gdriveaddoninherited = $inherited; } /** * @return bool */ public function getInherited() { return $this->inherited; } /** * @param string */ public function setInheritedFrom($inheritedFrom) { $this->inheritedFrom = $inheritedFrom; } /** * @return string */ public function getInheritedFrom() { return $this->inheritedFrom; } /** * @param string */ public function setRole($role) { $this->role = $role; } /** * @return string */ public function getRole() { return $this->role; } /** * @param string */ public function setTeamDrivePermissionType($teamDrivePermissionType) { $this->teamDrivePermissionType = $teamDrivePermissionType; } /** * @return string */ public function getTeamDrivePermissionType() { return $this->teamDrivePermissionType; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(PermissionTeamDrivePermissionDetails::class, 'VendorDuplicator\\Google_Service_Drive_PermissionTeamDrivePermissionDetails'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileContentHintsThumbnail.php000064400000002757147600374260031044 0ustar00addonsimage = $image; } /** * @return string */ public function getImage() { return $this->image; } /** * @param string */ public function setMimeType($mimeType) { $this->mimeType = $mimeType; } /** * @return string */ public function getMimeType() { return $this->mimeType; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileContentHintsThumbnail::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileContentHintsThumbnail'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/TeamDrive.php000064400000011056147600374260024715 0ustar00backgroundImageFile = $backgroundImageFile; } /** * @return TeamDriveBackgroundImageFile */ public function getBackgroundImageFile() { return $this->backgroundImageFile; } /** * @param string */ public function setBackgroundImageLink($backgroundImageLink) { $this->backgroundImageLink = $backgroundImageLink; } /** * @return string */ public function getBackgroundImageLink() { return $this->backgroundImageLink; } /** * @param TeamDriveCapabilities */ public function setCapabilities(TeamDriveCapabilities $capabilities) { $this->capabilities = $capabilities; } /** * @return TeamDriveCapabilities */ public function getCapabilities() { return $this->capabilities; } /** * @param string */ public function setColorRgb($colorRgb) { $this->colorRgb = $colorRgb; } /** * @return string */ public function getColorRgb() { return $this->colorRgb; } /** * @param string */ public function setCreatedTime($createdTime) { $this->createdTime = $createdTime; } /** * @return string */ public function getCreatedTime() { return $this->createdTime; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setName($name) { $this->name = $name; } /** * @return string */ public function getName() { return $this->name; } /** * @param string */ public function setOrgUnitId($orgUnitId) { $this->orgUnitId = $orgUnitId; } /** * @return string */ public function getOrgUnitId() { return $this->orgUnitId; } /** * @param TeamDriveRestrictions */ public function setRestrictions(TeamDriveRestrictions $restrictions) { $this->restrictions = $restrictions; } /** * @return TeamDriveRestrictions */ public function getRestrictions() { return $this->restrictions; } /** * @param string */ public function setThemeId($themeId) { $this->themeId = $themeId; } /** * @return string */ public function getThemeId() { return $this->themeId; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(TeamDrive::class, 'VendorDuplicator\\Google_Service_Drive_TeamDrive'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/LabelField.php000064400000006321147600374260025017 0ustar00dateString = $dateString; } /** * @return string[] */ public function getDateString() { return $this->dateString; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string[] */ public function setInteger($integer) { $this->integer = $integer; } /** * @return string[] */ public function getInteger() { return $this->integer; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string[] */ public function setSelection($selection) { $this->selection = $selection; } /** * @return string[] */ public function getSelection() { return $this->selection; } /** * @param string[] */ public function setText($text) { $this->text = $text; } /** * @return string[] */ public function getText() { return $this->text; } /** * @param User[] */ public function setUser($user) { $this->user = $user; } /** * @return User[] */ public function getUser() { return $this->user; } /** * @param string */ public function setValueType($valueType) { $this->valueType = $valueType; } /** * @return string */ public function getValueType() { return $this->valueType; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(LabelField::class, 'VendorDuplicator\\Google_Service_Drive_LabelField'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/ModifyLabelsResponse.php000064400000003121147600374260027120 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param Label[] */ public function setModifiedLabels($modifiedLabels) { $this->modifiedLabels = $modifiedLabels; } /** * @return Label[] */ public function getModifiedLabels() { return $this->modifiedLabels; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(ModifyLabelsResponse::class, 'VendorDuplicator\\Google_Service_Drive_ModifyLabelsResponse'); vendor-prefixed/google/apiclient-services/src/Drive/DriveFileImageMediaMetadataLocation.php000064400000002776147600374260031675 0ustar00addons/gdriveaddonaltitude = $altitude; } public function getAltitude() { return $this->altitude; } public function setLatitude($latitude) { $this->latitude = $latitude; } public function getLatitude() { return $this->latitude; } public function setLongitude($longitude) { $this->longitude = $longitude; } public function getLongitude() { return $this->longitude; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileImageMediaMetadataLocation::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileImageMediaMetadataLocation'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/LabelFieldModification.php000064400000007047147600374260027353 0ustar00fieldId = $fieldId; } /** * @return string */ public function getFieldId() { return $this->fieldId; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string[] */ public function setSetDateValues($setDateValues) { $this->setDateValues = $setDateValues; } /** * @return string[] */ public function getSetDateValues() { return $this->setDateValues; } /** * @param string[] */ public function setSetIntegerValues($setIntegerValues) { $this->setIntegerValues = $setIntegerValues; } /** * @return string[] */ public function getSetIntegerValues() { return $this->setIntegerValues; } /** * @param string[] */ public function setSetSelectionValues($setSelectionValues) { $this->setSelectionValues = $setSelectionValues; } /** * @return string[] */ public function getSetSelectionValues() { return $this->setSelectionValues; } /** * @param string[] */ public function setSetTextValues($setTextValues) { $this->setTextValues = $setTextValues; } /** * @return string[] */ public function getSetTextValues() { return $this->setTextValues; } /** * @param string[] */ public function setSetUserValues($setUserValues) { $this->setUserValues = $setUserValues; } /** * @return string[] */ public function getSetUserValues() { return $this->setUserValues; } /** * @param bool */ public function setUnsetValues($unsetValues) { $this->unsetValues = $unsetValues; } /** * @return bool */ public function getUnsetValues() { return $this->unsetValues; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(LabelFieldModification::class, 'VendorDuplicator\\Google_Service_Drive_LabelFieldModification'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileLabelInfo.php000064400000002361147600374260026461 0ustar00labels = $labels; } /** * @return Label[] */ public function getLabels() { return $this->labels; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileLabelInfo::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileLabelInfo'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/User.php000064400000005166147600374260023760 0ustar00displayName = $displayName; } /** * @return string */ public function getDisplayName() { return $this->displayName; } /** * @param string */ public function setEmailAddress($emailAddress) { $this->emailAddress = $emailAddress; } /** * @return string */ public function getEmailAddress() { return $this->emailAddress; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param bool */ public function setMe($me) { $this->me = $me; } /** * @return bool */ public function getMe() { return $this->me; } /** * @param string */ public function setPermissionId($permissionId) { $this->permissionId = $permissionId; } /** * @return string */ public function getPermissionId() { return $this->permissionId; } /** * @param string */ public function setPhotoLink($photoLink) { $this->photoLink = $photoLink; } /** * @return string */ public function getPhotoLink() { return $this->photoLink; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(User::class, 'VendorDuplicator\\Google_Service_Drive_User'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/PermissionPermissionDetails.php000064400000004211147600374260030460 0ustar00addonsinherited = $inherited; } /** * @return bool */ public function getInherited() { return $this->inherited; } /** * @param string */ public function setInheritedFrom($inheritedFrom) { $this->inheritedFrom = $inheritedFrom; } /** * @return string */ public function getInheritedFrom() { return $this->inheritedFrom; } /** * @param string */ public function setPermissionType($permissionType) { $this->permissionType = $permissionType; } /** * @return string */ public function getPermissionType() { return $this->permissionType; } /** * @param string */ public function setRole($role) { $this->role = $role; } /** * @return string */ public function getRole() { return $this->role; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(PermissionPermissionDetails::class, 'VendorDuplicator\\Google_Service_Drive_PermissionPermissionDetails'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/About.php000064400000012614147600374260024110 0ustar00appInstalled = $appInstalled; } /** * @return bool */ public function getAppInstalled() { return $this->appInstalled; } /** * @param bool */ public function setCanCreateDrives($canCreateDrives) { $this->canCreateDrives = $canCreateDrives; } /** * @return bool */ public function getCanCreateDrives() { return $this->canCreateDrives; } /** * @param bool */ public function setCanCreateTeamDrives($canCreateTeamDrives) { $this->canCreateTeamDrives = $canCreateTeamDrives; } /** * @return bool */ public function getCanCreateTeamDrives() { return $this->canCreateTeamDrives; } /** * @param AboutDriveThemes[] */ public function setDriveThemes($driveThemes) { $this->driveThemes = $driveThemes; } /** * @return AboutDriveThemes[] */ public function getDriveThemes() { return $this->driveThemes; } /** * @param string[] */ public function setExportFormats($exportFormats) { $this->exportFormats = $exportFormats; } /** * @return string[] */ public function getExportFormats() { return $this->exportFormats; } /** * @param string[] */ public function setFolderColorPalette($folderColorPalette) { $this->folderColorPalette = $folderColorPalette; } /** * @return string[] */ public function getFolderColorPalette() { return $this->folderColorPalette; } /** * @param string[] */ public function setImportFormats($importFormats) { $this->importFormats = $importFormats; } /** * @return string[] */ public function getImportFormats() { return $this->importFormats; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string[] */ public function setMaxImportSizes($maxImportSizes) { $this->maxImportSizes = $maxImportSizes; } /** * @return string[] */ public function getMaxImportSizes() { return $this->maxImportSizes; } /** * @param string */ public function setMaxUploadSize($maxUploadSize) { $this->maxUploadSize = $maxUploadSize; } /** * @return string */ public function getMaxUploadSize() { return $this->maxUploadSize; } /** * @param AboutStorageQuota */ public function setStorageQuota(AboutStorageQuota $storageQuota) { $this->storageQuota = $storageQuota; } /** * @return AboutStorageQuota */ public function getStorageQuota() { return $this->storageQuota; } /** * @param AboutTeamDriveThemes[] */ public function setTeamDriveThemes($teamDriveThemes) { $this->teamDriveThemes = $teamDriveThemes; } /** * @return AboutTeamDriveThemes[] */ public function getTeamDriveThemes() { return $this->teamDriveThemes; } /** * @param User */ public function setUser(User $user) { $this->user = $user; } /** * @return User */ public function getUser() { return $this->user; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(About::class, 'VendorDuplicator\\Google_Service_Drive_About'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFile.php000064400000053635147600374260024717 0ustar00appProperties = $appProperties; } /** * @return string[] */ public function getAppProperties() { return $this->appProperties; } /** * @param DriveFileCapabilities */ public function setCapabilities(DriveFileCapabilities $capabilities) { $this->capabilities = $capabilities; } /** * @return DriveFileCapabilities */ public function getCapabilities() { return $this->capabilities; } /** * @param DriveFileContentHints */ public function setContentHints(DriveFileContentHints $contentHints) { $this->contentHints = $contentHints; } /** * @return DriveFileContentHints */ public function getContentHints() { return $this->contentHints; } /** * @param ContentRestriction[] */ public function setContentRestrictions($contentRestrictions) { $this->contentRestrictions = $contentRestrictions; } /** * @return ContentRestriction[] */ public function getContentRestrictions() { return $this->contentRestrictions; } /** * @param bool */ public function setCopyRequiresWriterPermission($copyRequiresWriterPermission) { $this->copyRequiresWriterPermission = $copyRequiresWriterPermission; } /** * @return bool */ public function getCopyRequiresWriterPermission() { return $this->copyRequiresWriterPermission; } /** * @param string */ public function setCreatedTime($createdTime) { $this->createdTime = $createdTime; } /** * @return string */ public function getCreatedTime() { return $this->createdTime; } /** * @param string */ public function setDescription($description) { $this->description = $description; } /** * @return string */ public function getDescription() { return $this->description; } /** * @param string */ public function setDriveId($driveId) { $this->driveId = $driveId; } /** * @return string */ public function getDriveId() { return $this->driveId; } /** * @param bool */ public function setExplicitlyTrashed($explicitlyTrashed) { $this->explicitlyTrashed = $explicitlyTrashed; } /** * @return bool */ public function getExplicitlyTrashed() { return $this->explicitlyTrashed; } /** * @param string[] */ public function setExportLinks($exportLinks) { $this->exportLinks = $exportLinks; } /** * @return string[] */ public function getExportLinks() { return $this->exportLinks; } /** * @param string */ public function setFileExtension($fileExtension) { $this->fileExtension = $fileExtension; } /** * @return string */ public function getFileExtension() { return $this->fileExtension; } /** * @param string */ public function setFolderColorRgb($folderColorRgb) { $this->folderColorRgb = $folderColorRgb; } /** * @return string */ public function getFolderColorRgb() { return $this->folderColorRgb; } /** * @param string */ public function setFullFileExtension($fullFileExtension) { $this->fullFileExtension = $fullFileExtension; } /** * @return string */ public function getFullFileExtension() { return $this->fullFileExtension; } /** * @param bool */ public function setHasAugmentedPermissions($hasAugmentedPermissions) { $this->hasAugmentedPermissions = $hasAugmentedPermissions; } /** * @return bool */ public function getHasAugmentedPermissions() { return $this->hasAugmentedPermissions; } /** * @param bool */ public function setHasThumbnail($hasThumbnail) { $this->hasThumbnail = $hasThumbnail; } /** * @return bool */ public function getHasThumbnail() { return $this->hasThumbnail; } /** * @param string */ public function setHeadRevisionId($headRevisionId) { $this->headRevisionId = $headRevisionId; } /** * @return string */ public function getHeadRevisionId() { return $this->headRevisionId; } /** * @param string */ public function setIconLink($iconLink) { $this->iconLink = $iconLink; } /** * @return string */ public function getIconLink() { return $this->iconLink; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param DriveFileImageMediaMetadata */ public function setImageMediaMetadata(DriveFileImageMediaMetadata $imageMediaMetadata) { $this->imageMediaMetadata = $imageMediaMetadata; } /** * @return DriveFileImageMediaMetadata */ public function getImageMediaMetadata() { return $this->imageMediaMetadata; } /** * @param bool */ public function setIsAppAuthorized($isAppAuthorized) { $this->isAppAuthorized = $isAppAuthorized; } /** * @return bool */ public function getIsAppAuthorized() { return $this->isAppAuthorized; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param DriveFileLabelInfo */ public function setLabelInfo(DriveFileLabelInfo $labelInfo) { $this->labelInfo = $labelInfo; } /** * @return DriveFileLabelInfo */ public function getLabelInfo() { return $this->labelInfo; } /** * @param User */ public function setLastModifyingUser(User $lastModifyingUser) { $this->lastModifyingUser = $lastModifyingUser; } /** * @return User */ public function getLastModifyingUser() { return $this->lastModifyingUser; } /** * @param DriveFileLinkShareMetadata */ public function setLinkShareMetadata(DriveFileLinkShareMetadata $linkShareMetadata) { $this->linkShareMetadata = $linkShareMetadata; } /** * @return DriveFileLinkShareMetadata */ public function getLinkShareMetadata() { return $this->linkShareMetadata; } /** * @param string */ public function setMd5Checksum($md5Checksum) { $this->md5Checksum = $md5Checksum; } /** * @return string */ public function getMd5Checksum() { return $this->md5Checksum; } /** * @param string */ public function setMimeType($mimeType) { $this->mimeType = $mimeType; } /** * @return string */ public function getMimeType() { return $this->mimeType; } /** * @param bool */ public function setModifiedByMe($modifiedByMe) { $this->modifiedByMe = $modifiedByMe; } /** * @return bool */ public function getModifiedByMe() { return $this->modifiedByMe; } /** * @param string */ public function setModifiedByMeTime($modifiedByMeTime) { $this->modifiedByMeTime = $modifiedByMeTime; } /** * @return string */ public function getModifiedByMeTime() { return $this->modifiedByMeTime; } /** * @param string */ public function setModifiedTime($modifiedTime) { $this->modifiedTime = $modifiedTime; } /** * @return string */ public function getModifiedTime() { return $this->modifiedTime; } /** * @param string */ public function setName($name) { $this->name = $name; } /** * @return string */ public function getName() { return $this->name; } /** * @param string */ public function setOriginalFilename($originalFilename) { $this->originalFilename = $originalFilename; } /** * @return string */ public function getOriginalFilename() { return $this->originalFilename; } /** * @param bool */ public function setOwnedByMe($ownedByMe) { $this->ownedByMe = $ownedByMe; } /** * @return bool */ public function getOwnedByMe() { return $this->ownedByMe; } /** * @param User[] */ public function setOwners($owners) { $this->owners = $owners; } /** * @return User[] */ public function getOwners() { return $this->owners; } /** * @param string[] */ public function setParents($parents) { $this->parents = $parents; } /** * @return string[] */ public function getParents() { return $this->parents; } /** * @param string[] */ public function setPermissionIds($permissionIds) { $this->permissionIds = $permissionIds; } /** * @return string[] */ public function getPermissionIds() { return $this->permissionIds; } /** * @param Permission[] */ public function setPermissions($permissions) { $this->permissions = $permissions; } /** * @return Permission[] */ public function getPermissions() { return $this->permissions; } /** * @param string[] */ public function setProperties($properties) { $this->properties = $properties; } /** * @return string[] */ public function getProperties() { return $this->properties; } /** * @param string */ public function setQuotaBytesUsed($quotaBytesUsed) { $this->quotaBytesUsed = $quotaBytesUsed; } /** * @return string */ public function getQuotaBytesUsed() { return $this->quotaBytesUsed; } /** * @param string */ public function setResourceKey($resourceKey) { $this->resourceKey = $resourceKey; } /** * @return string */ public function getResourceKey() { return $this->resourceKey; } /** * @param string */ public function setSha1Checksum($sha1Checksum) { $this->sha1Checksum = $sha1Checksum; } /** * @return string */ public function getSha1Checksum() { return $this->sha1Checksum; } /** * @param string */ public function setSha256Checksum($sha256Checksum) { $this->sha256Checksum = $sha256Checksum; } /** * @return string */ public function getSha256Checksum() { return $this->sha256Checksum; } /** * @param bool */ public function setShared($shared) { $this->shared = $shared; } /** * @return bool */ public function getShared() { return $this->shared; } /** * @param string */ public function setSharedWithMeTime($sharedWithMeTime) { $this->sharedWithMeTime = $sharedWithMeTime; } /** * @return string */ public function getSharedWithMeTime() { return $this->sharedWithMeTime; } /** * @param User */ public function setSharingUser(User $sharingUser) { $this->sharingUser = $sharingUser; } /** * @return User */ public function getSharingUser() { return $this->sharingUser; } /** * @param DriveFileShortcutDetails */ public function setShortcutDetails(DriveFileShortcutDetails $shortcutDetails) { $this->shortcutDetails = $shortcutDetails; } /** * @return DriveFileShortcutDetails */ public function getShortcutDetails() { return $this->shortcutDetails; } /** * @param string */ public function setSize($size) { $this->size = $size; } /** * @return string */ public function getSize() { return $this->size; } /** * @param string[] */ public function setSpaces($spaces) { $this->spaces = $spaces; } /** * @return string[] */ public function getSpaces() { return $this->spaces; } /** * @param bool */ public function setStarred($starred) { $this->starred = $starred; } /** * @return bool */ public function getStarred() { return $this->starred; } /** * @param string */ public function setTeamDriveId($teamDriveId) { $this->teamDriveId = $teamDriveId; } /** * @return string */ public function getTeamDriveId() { return $this->teamDriveId; } /** * @param string */ public function setThumbnailLink($thumbnailLink) { $this->thumbnailLink = $thumbnailLink; } /** * @return string */ public function getThumbnailLink() { return $this->thumbnailLink; } /** * @param string */ public function setThumbnailVersion($thumbnailVersion) { $this->thumbnailVersion = $thumbnailVersion; } /** * @return string */ public function getThumbnailVersion() { return $this->thumbnailVersion; } /** * @param bool */ public function setTrashed($trashed) { $this->trashed = $trashed; } /** * @return bool */ public function getTrashed() { return $this->trashed; } /** * @param string */ public function setTrashedTime($trashedTime) { $this->trashedTime = $trashedTime; } /** * @return string */ public function getTrashedTime() { return $this->trashedTime; } /** * @param User */ public function setTrashingUser(User $trashingUser) { $this->trashingUser = $trashingUser; } /** * @return User */ public function getTrashingUser() { return $this->trashingUser; } /** * @param string */ public function setVersion($version) { $this->version = $version; } /** * @return string */ public function getVersion() { return $this->version; } /** * @param DriveFileVideoMediaMetadata */ public function setVideoMediaMetadata(DriveFileVideoMediaMetadata $videoMediaMetadata) { $this->videoMediaMetadata = $videoMediaMetadata; } /** * @return DriveFileVideoMediaMetadata */ public function getVideoMediaMetadata() { return $this->videoMediaMetadata; } /** * @param bool */ public function setViewedByMe($viewedByMe) { $this->viewedByMe = $viewedByMe; } /** * @return bool */ public function getViewedByMe() { return $this->viewedByMe; } /** * @param string */ public function setViewedByMeTime($viewedByMeTime) { $this->viewedByMeTime = $viewedByMeTime; } /** * @return string */ public function getViewedByMeTime() { return $this->viewedByMeTime; } /** * @param bool */ public function setViewersCanCopyContent($viewersCanCopyContent) { $this->viewersCanCopyContent = $viewersCanCopyContent; } /** * @return bool */ public function getViewersCanCopyContent() { return $this->viewersCanCopyContent; } /** * @param string */ public function setWebContentLink($webContentLink) { $this->webContentLink = $webContentLink; } /** * @return string */ public function getWebContentLink() { return $this->webContentLink; } /** * @param string */ public function setWebViewLink($webViewLink) { $this->webViewLink = $webViewLink; } /** * @return string */ public function getWebViewLink() { return $this->webViewLink; } /** * @param bool */ public function setWritersCanShare($writersCanShare) { $this->writersCanShare = $writersCanShare; } /** * @return bool */ public function getWritersCanShare() { return $this->writersCanShare; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFile::class, 'VendorDuplicator\\Google_Service_Drive_DriveFile'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/PermissionList.php000064400000003604147600374260026021 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } /** * @param Permission[] */ public function setPermissions($permissions) { $this->permissions = $permissions; } /** * @return Permission[] */ public function getPermissions() { return $this->permissions; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(PermissionList::class, 'VendorDuplicator\\Google_Service_Drive_PermissionList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/TeamDriveCapabilities.php000064400000021442147600374260027227 0ustar00canAddChildren = $canAddChildren; } /** * @return bool */ public function getCanAddChildren() { return $this->canAddChildren; } /** * @param bool */ public function setCanChangeCopyRequiresWriterPermissionRestriction($canChangeCopyRequiresWriterPermissionRestriction) { $this->canChangeCopyRequiresWriterPermissionRestriction = $canChangeCopyRequiresWriterPermissionRestriction; } /** * @return bool */ public function getCanChangeCopyRequiresWriterPermissionRestriction() { return $this->canChangeCopyRequiresWriterPermissionRestriction; } /** * @param bool */ public function setCanChangeDomainUsersOnlyRestriction($canChangeDomainUsersOnlyRestriction) { $this->canChangeDomainUsersOnlyRestriction = $canChangeDomainUsersOnlyRestriction; } /** * @return bool */ public function getCanChangeDomainUsersOnlyRestriction() { return $this->canChangeDomainUsersOnlyRestriction; } /** * @param bool */ public function setCanChangeSharingFoldersRequiresOrganizerPermissionRestriction($canChangeSharingFoldersRequiresOrganizerPermissionRestriction) { $this->canChangeSharingFoldersRequiresOrganizerPermissionRestriction = $canChangeSharingFoldersRequiresOrganizerPermissionRestriction; } /** * @return bool */ public function getCanChangeSharingFoldersRequiresOrganizerPermissionRestriction() { return $this->canChangeSharingFoldersRequiresOrganizerPermissionRestriction; } /** * @param bool */ public function setCanChangeTeamDriveBackground($canChangeTeamDriveBackground) { $this->canChangeTeamDriveBackground = $canChangeTeamDriveBackground; } /** * @return bool */ public function getCanChangeTeamDriveBackground() { return $this->canChangeTeamDriveBackground; } /** * @param bool */ public function setCanChangeTeamMembersOnlyRestriction($canChangeTeamMembersOnlyRestriction) { $this->canChangeTeamMembersOnlyRestriction = $canChangeTeamMembersOnlyRestriction; } /** * @return bool */ public function getCanChangeTeamMembersOnlyRestriction() { return $this->canChangeTeamMembersOnlyRestriction; } /** * @param bool */ public function setCanComment($canComment) { $this->canComment = $canComment; } /** * @return bool */ public function getCanComment() { return $this->canComment; } /** * @param bool */ public function setCanCopy($canCopy) { $this->canCopy = $canCopy; } /** * @return bool */ public function getCanCopy() { return $this->canCopy; } /** * @param bool */ public function setCanDeleteChildren($canDeleteChildren) { $this->canDeleteChildren = $canDeleteChildren; } /** * @return bool */ public function getCanDeleteChildren() { return $this->canDeleteChildren; } /** * @param bool */ public function setCanDeleteTeamDrive($canDeleteTeamDrive) { $this->canDeleteTeamDrive = $canDeleteTeamDrive; } /** * @return bool */ public function getCanDeleteTeamDrive() { return $this->canDeleteTeamDrive; } /** * @param bool */ public function setCanDownload($canDownload) { $this->canDownload = $canDownload; } /** * @return bool */ public function getCanDownload() { return $this->canDownload; } /** * @param bool */ public function setCanEdit($canEdit) { $this->canEdit = $canEdit; } /** * @return bool */ public function getCanEdit() { return $this->canEdit; } /** * @param bool */ public function setCanListChildren($canListChildren) { $this->canListChildren = $canListChildren; } /** * @return bool */ public function getCanListChildren() { return $this->canListChildren; } /** * @param bool */ public function setCanManageMembers($canManageMembers) { $this->canManageMembers = $canManageMembers; } /** * @return bool */ public function getCanManageMembers() { return $this->canManageMembers; } /** * @param bool */ public function setCanReadRevisions($canReadRevisions) { $this->canReadRevisions = $canReadRevisions; } /** * @return bool */ public function getCanReadRevisions() { return $this->canReadRevisions; } /** * @param bool */ public function setCanRemoveChildren($canRemoveChildren) { $this->canRemoveChildren = $canRemoveChildren; } /** * @return bool */ public function getCanRemoveChildren() { return $this->canRemoveChildren; } /** * @param bool */ public function setCanRename($canRename) { $this->canRename = $canRename; } /** * @return bool */ public function getCanRename() { return $this->canRename; } /** * @param bool */ public function setCanRenameTeamDrive($canRenameTeamDrive) { $this->canRenameTeamDrive = $canRenameTeamDrive; } /** * @return bool */ public function getCanRenameTeamDrive() { return $this->canRenameTeamDrive; } /** * @param bool */ public function setCanResetTeamDriveRestrictions($canResetTeamDriveRestrictions) { $this->canResetTeamDriveRestrictions = $canResetTeamDriveRestrictions; } /** * @return bool */ public function getCanResetTeamDriveRestrictions() { return $this->canResetTeamDriveRestrictions; } /** * @param bool */ public function setCanShare($canShare) { $this->canShare = $canShare; } /** * @return bool */ public function getCanShare() { return $this->canShare; } /** * @param bool */ public function setCanTrashChildren($canTrashChildren) { $this->canTrashChildren = $canTrashChildren; } /** * @return bool */ public function getCanTrashChildren() { return $this->canTrashChildren; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(TeamDriveCapabilities::class, 'VendorDuplicator\\Google_Service_Drive_TeamDriveCapabilities'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Channel.php000064400000007315147600374260024410 0ustar00address = $address; } /** * @return string */ public function getAddress() { return $this->address; } /** * @param string */ public function setExpiration($expiration) { $this->expiration = $expiration; } /** * @return string */ public function getExpiration() { return $this->expiration; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string[] */ public function setParams($params) { $this->params = $params; } /** * @return string[] */ public function getParams() { return $this->params; } /** * @param bool */ public function setPayload($payload) { $this->payload = $payload; } /** * @return bool */ public function getPayload() { return $this->payload; } /** * @param string */ public function setResourceId($resourceId) { $this->resourceId = $resourceId; } /** * @return string */ public function getResourceId() { return $this->resourceId; } /** * @param string */ public function setResourceUri($resourceUri) { $this->resourceUri = $resourceUri; } /** * @return string */ public function getResourceUri() { return $this->resourceUri; } /** * @param string */ public function setToken($token) { $this->token = $token; } /** * @return string */ public function getToken() { return $this->token; } /** * @param string */ public function setType($type) { $this->type = $type; } /** * @return string */ public function getType() { return $this->type; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Channel::class, 'VendorDuplicator\\Google_Service_Drive_Channel'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/FileList.php000064400000004231147600374260024545 0ustar00files = $files; } /** * @return DriveFile[] */ public function getFiles() { return $this->files; } /** * @param bool */ public function setIncompleteSearch($incompleteSearch) { $this->incompleteSearch = $incompleteSearch; } /** * @return bool */ public function getIncompleteSearch() { return $this->incompleteSearch; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(FileList::class, 'VendorDuplicator\\Google_Service_Drive_FileList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/RevisionList.php000064400000003546147600374260025474 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } /** * @param Revision[] */ public function setRevisions($revisions) { $this->revisions = $revisions; } /** * @return Revision[] */ public function getRevisions() { return $this->revisions; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(RevisionList::class, 'VendorDuplicator\\Google_Service_Drive_RevisionList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/AboutDriveThemes.php000064400000003453147600374260026251 0ustar00backgroundImageLink = $backgroundImageLink; } /** * @return string */ public function getBackgroundImageLink() { return $this->backgroundImageLink; } /** * @param string */ public function setColorRgb($colorRgb) { $this->colorRgb = $colorRgb; } /** * @return string */ public function getColorRgb() { return $this->colorRgb; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(AboutDriveThemes::class, 'VendorDuplicator\\Google_Service_Drive_AboutDriveThemes'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/TeamDriveList.php000064400000003565147600374260025557 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } /** * @param TeamDrive[] */ public function setTeamDrives($teamDrives) { $this->teamDrives = $teamDrives; } /** * @return TeamDrive[] */ public function getTeamDrives() { return $this->teamDrives; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(TeamDriveList::class, 'VendorDuplicator\\Google_Service_Drive_TeamDriveList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveBackgroundImageFile.php000064400000004060147600374260027646 0ustar00id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param float */ public function setWidth($width) { $this->width = $width; } /** * @return float */ public function getWidth() { return $this->width; } /** * @param float */ public function setXCoordinate($xCoordinate) { $this->xCoordinate = $xCoordinate; } /** * @return float */ public function getXCoordinate() { return $this->xCoordinate; } /** * @param float */ public function setYCoordinate($yCoordinate) { $this->yCoordinate = $yCoordinate; } /** * @return float */ public function getYCoordinate() { return $this->yCoordinate; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveBackgroundImageFile::class, 'VendorDuplicator\\Google_Service_Drive_DriveBackgroundImageFile'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/AboutStorageQuota.php000064400000004152147600374260026445 0ustar00limit = $limit; } /** * @return string */ public function getLimit() { return $this->limit; } /** * @param string */ public function setUsage($usage) { $this->usage = $usage; } /** * @return string */ public function getUsage() { return $this->usage; } /** * @param string */ public function setUsageInDrive($usageInDrive) { $this->usageInDrive = $usageInDrive; } /** * @return string */ public function getUsageInDrive() { return $this->usageInDrive; } /** * @param string */ public function setUsageInDriveTrash($usageInDriveTrash) { $this->usageInDriveTrash = $usageInDriveTrash; } /** * @return string */ public function getUsageInDriveTrash() { return $this->usageInDriveTrash; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(AboutStorageQuota::class, 'VendorDuplicator\\Google_Service_Drive_AboutStorageQuota'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/ContentRestriction.php000064400000004674147600374260026705 0ustar00readOnly = $readOnly; } /** * @return bool */ public function getReadOnly() { return $this->readOnly; } /** * @param string */ public function setReason($reason) { $this->reason = $reason; } /** * @return string */ public function getReason() { return $this->reason; } /** * @param User */ public function setRestrictingUser(User $restrictingUser) { $this->restrictingUser = $restrictingUser; } /** * @return User */ public function getRestrictingUser() { return $this->restrictingUser; } /** * @param string */ public function setRestrictionTime($restrictionTime) { $this->restrictionTime = $restrictionTime; } /** * @return string */ public function getRestrictionTime() { return $this->restrictionTime; } /** * @param string */ public function setType($type) { $this->type = $type; } /** * @return string */ public function getType() { return $this->type; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(ContentRestriction::class, 'VendorDuplicator\\Google_Service_Drive_ContentRestriction'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveCapabilities.php000064400000020506147600374260026420 0ustar00canAddChildren = $canAddChildren; } /** * @return bool */ public function getCanAddChildren() { return $this->canAddChildren; } /** * @param bool */ public function setCanChangeCopyRequiresWriterPermissionRestriction($canChangeCopyRequiresWriterPermissionRestriction) { $this->canChangeCopyRequiresWriterPermissionRestriction = $canChangeCopyRequiresWriterPermissionRestriction; } /** * @return bool */ public function getCanChangeCopyRequiresWriterPermissionRestriction() { return $this->canChangeCopyRequiresWriterPermissionRestriction; } /** * @param bool */ public function setCanChangeDomainUsersOnlyRestriction($canChangeDomainUsersOnlyRestriction) { $this->canChangeDomainUsersOnlyRestriction = $canChangeDomainUsersOnlyRestriction; } /** * @return bool */ public function getCanChangeDomainUsersOnlyRestriction() { return $this->canChangeDomainUsersOnlyRestriction; } /** * @param bool */ public function setCanChangeDriveBackground($canChangeDriveBackground) { $this->canChangeDriveBackground = $canChangeDriveBackground; } /** * @return bool */ public function getCanChangeDriveBackground() { return $this->canChangeDriveBackground; } /** * @param bool */ public function setCanChangeDriveMembersOnlyRestriction($canChangeDriveMembersOnlyRestriction) { $this->canChangeDriveMembersOnlyRestriction = $canChangeDriveMembersOnlyRestriction; } /** * @return bool */ public function getCanChangeDriveMembersOnlyRestriction() { return $this->canChangeDriveMembersOnlyRestriction; } /** * @param bool */ public function setCanChangeSharingFoldersRequiresOrganizerPermissionRestriction($canChangeSharingFoldersRequiresOrganizerPermissionRestriction) { $this->canChangeSharingFoldersRequiresOrganizerPermissionRestriction = $canChangeSharingFoldersRequiresOrganizerPermissionRestriction; } /** * @return bool */ public function getCanChangeSharingFoldersRequiresOrganizerPermissionRestriction() { return $this->canChangeSharingFoldersRequiresOrganizerPermissionRestriction; } /** * @param bool */ public function setCanComment($canComment) { $this->canComment = $canComment; } /** * @return bool */ public function getCanComment() { return $this->canComment; } /** * @param bool */ public function setCanCopy($canCopy) { $this->canCopy = $canCopy; } /** * @return bool */ public function getCanCopy() { return $this->canCopy; } /** * @param bool */ public function setCanDeleteChildren($canDeleteChildren) { $this->canDeleteChildren = $canDeleteChildren; } /** * @return bool */ public function getCanDeleteChildren() { return $this->canDeleteChildren; } /** * @param bool */ public function setCanDeleteDrive($canDeleteDrive) { $this->canDeleteDrive = $canDeleteDrive; } /** * @return bool */ public function getCanDeleteDrive() { return $this->canDeleteDrive; } /** * @param bool */ public function setCanDownload($canDownload) { $this->canDownload = $canDownload; } /** * @return bool */ public function getCanDownload() { return $this->canDownload; } /** * @param bool */ public function setCanEdit($canEdit) { $this->canEdit = $canEdit; } /** * @return bool */ public function getCanEdit() { return $this->canEdit; } /** * @param bool */ public function setCanListChildren($canListChildren) { $this->canListChildren = $canListChildren; } /** * @return bool */ public function getCanListChildren() { return $this->canListChildren; } /** * @param bool */ public function setCanManageMembers($canManageMembers) { $this->canManageMembers = $canManageMembers; } /** * @return bool */ public function getCanManageMembers() { return $this->canManageMembers; } /** * @param bool */ public function setCanReadRevisions($canReadRevisions) { $this->canReadRevisions = $canReadRevisions; } /** * @return bool */ public function getCanReadRevisions() { return $this->canReadRevisions; } /** * @param bool */ public function setCanRename($canRename) { $this->canRename = $canRename; } /** * @return bool */ public function getCanRename() { return $this->canRename; } /** * @param bool */ public function setCanRenameDrive($canRenameDrive) { $this->canRenameDrive = $canRenameDrive; } /** * @return bool */ public function getCanRenameDrive() { return $this->canRenameDrive; } /** * @param bool */ public function setCanResetDriveRestrictions($canResetDriveRestrictions) { $this->canResetDriveRestrictions = $canResetDriveRestrictions; } /** * @return bool */ public function getCanResetDriveRestrictions() { return $this->canResetDriveRestrictions; } /** * @param bool */ public function setCanShare($canShare) { $this->canShare = $canShare; } /** * @return bool */ public function getCanShare() { return $this->canShare; } /** * @param bool */ public function setCanTrashChildren($canTrashChildren) { $this->canTrashChildren = $canTrashChildren; } /** * @return bool */ public function getCanTrashChildren() { return $this->canTrashChildren; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveCapabilities::class, 'VendorDuplicator\\Google_Service_Drive_DriveCapabilities'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveList.php000064400000003471147600374260024744 0ustar00drives = $drives; } /** * @return Drive[] */ public function getDrives() { return $this->drives; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveList::class, 'VendorDuplicator\\Google_Service_Drive_DriveList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/AboutTeamDriveThemes.php000064400000003467147600374260027065 0ustar00backgroundImageLink = $backgroundImageLink; } /** * @return string */ public function getBackgroundImageLink() { return $this->backgroundImageLink; } /** * @param string */ public function setColorRgb($colorRgb) { $this->colorRgb = $colorRgb; } /** * @return string */ public function getColorRgb() { return $this->colorRgb; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(AboutTeamDriveThemes::class, 'VendorDuplicator\\Google_Service_Drive_AboutTeamDriveThemes'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileVideoMediaMetadata.php000064400000003436147600374260030222 0ustar00addonsdurationMillis = $durationMillis; } /** * @return string */ public function getDurationMillis() { return $this->durationMillis; } /** * @param int */ public function setHeight($height) { $this->height = $height; } /** * @return int */ public function getHeight() { return $this->height; } /** * @param int */ public function setWidth($width) { $this->width = $width; } /** * @return int */ public function getWidth() { return $this->width; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileVideoMediaMetadata::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileVideoMediaMetadata'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Reply.php000064400000006742147600374260024136 0ustar00action = $action; } /** * @return string */ public function getAction() { return $this->action; } /** * @param User */ public function setAuthor(User $author) { $this->author = $author; } /** * @return User */ public function getAuthor() { return $this->author; } /** * @param string */ public function setContent($content) { $this->content = $content; } /** * @return string */ public function getContent() { return $this->content; } /** * @param string */ public function setCreatedTime($createdTime) { $this->createdTime = $createdTime; } /** * @return string */ public function getCreatedTime() { return $this->createdTime; } /** * @param bool */ public function setDeleted($deleted) { $this->deleted = $deleted; } /** * @return bool */ public function getDeleted() { return $this->deleted; } /** * @param string */ public function setHtmlContent($htmlContent) { $this->htmlContent = $htmlContent; } /** * @return string */ public function getHtmlContent() { return $this->htmlContent; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setModifiedTime($modifiedTime) { $this->modifiedTime = $modifiedTime; } /** * @return string */ public function getModifiedTime() { return $this->modifiedTime; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Reply::class, 'VendorDuplicator\\Google_Service_Drive_Reply'); gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileLinkShareMetadata.php000064400000003251147600374260030067 0ustar00addonssecurityUpdateEligible = $securityUpdateEligible; } /** * @return bool */ public function getSecurityUpdateEligible() { return $this->securityUpdateEligible; } /** * @param bool */ public function setSecurityUpdateEnabled($securityUpdateEnabled) { $this->securityUpdateEnabled = $securityUpdateEnabled; } /** * @return bool */ public function getSecurityUpdateEnabled() { return $this->securityUpdateEnabled; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileLinkShareMetadata::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileLinkShareMetadata'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/GeneratedIds.php000064400000003332147600374260025371 0ustar00ids = $ids; } /** * @return string[] */ public function getIds() { return $this->ids; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setSpace($space) { $this->space = $space; } /** * @return string */ public function getSpace() { return $this->space; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(GeneratedIds::class, 'VendorDuplicator\\Google_Service_Drive_GeneratedIds'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/StartPageToken.php000064400000002742147600374260025732 0ustar00kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setStartPageToken($startPageToken) { $this->startPageToken = $startPageToken; } /** * @return string */ public function getStartPageToken() { return $this->startPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(StartPageToken::class, 'VendorDuplicator\\Google_Service_Drive_StartPageToken'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Revision.php000064400000012413147600374260024631 0ustar00exportLinks = $exportLinks; } /** * @return string[] */ public function getExportLinks() { return $this->exportLinks; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param bool */ public function setKeepForever($keepForever) { $this->keepForever = $keepForever; } /** * @return bool */ public function getKeepForever() { return $this->keepForever; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param User */ public function setLastModifyingUser(User $lastModifyingUser) { $this->lastModifyingUser = $lastModifyingUser; } /** * @return User */ public function getLastModifyingUser() { return $this->lastModifyingUser; } /** * @param string */ public function setMd5Checksum($md5Checksum) { $this->md5Checksum = $md5Checksum; } /** * @return string */ public function getMd5Checksum() { return $this->md5Checksum; } /** * @param string */ public function setMimeType($mimeType) { $this->mimeType = $mimeType; } /** * @return string */ public function getMimeType() { return $this->mimeType; } /** * @param string */ public function setModifiedTime($modifiedTime) { $this->modifiedTime = $modifiedTime; } /** * @return string */ public function getModifiedTime() { return $this->modifiedTime; } /** * @param string */ public function setOriginalFilename($originalFilename) { $this->originalFilename = $originalFilename; } /** * @return string */ public function getOriginalFilename() { return $this->originalFilename; } /** * @param bool */ public function setPublishAuto($publishAuto) { $this->publishAuto = $publishAuto; } /** * @return bool */ public function getPublishAuto() { return $this->publishAuto; } /** * @param bool */ public function setPublished($published) { $this->published = $published; } /** * @return bool */ public function getPublished() { return $this->published; } /** * @param string */ public function setPublishedLink($publishedLink) { $this->publishedLink = $publishedLink; } /** * @return string */ public function getPublishedLink() { return $this->publishedLink; } /** * @param bool */ public function setPublishedOutsideDomain($publishedOutsideDomain) { $this->publishedOutsideDomain = $publishedOutsideDomain; } /** * @return bool */ public function getPublishedOutsideDomain() { return $this->publishedOutsideDomain; } /** * @param string */ public function setSize($size) { $this->size = $size; } /** * @return string */ public function getSize() { return $this->size; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Revision::class, 'VendorDuplicator\\Google_Service_Drive_Revision'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/CommentQuotedFileContent.php000064400000002735147600374260027760 0ustar00mimeType = $mimeType; } /** * @return string */ public function getMimeType() { return $this->mimeType; } /** * @param string */ public function setValue($value) { $this->value = $value; } /** * @return string */ public function getValue() { return $this->value; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(CommentQuotedFileContent::class, 'VendorDuplicator\\Google_Service_Drive_CommentQuotedFileContent'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/DriveFileCapabilities.php000064400000035164147600374260027226 0ustar00canAcceptOwnership = $canAcceptOwnership; } /** * @return bool */ public function getCanAcceptOwnership() { return $this->canAcceptOwnership; } /** * @param bool */ public function setCanAddChildren($canAddChildren) { $this->canAddChildren = $canAddChildren; } /** * @return bool */ public function getCanAddChildren() { return $this->canAddChildren; } /** * @param bool */ public function setCanAddFolderFromAnotherDrive($canAddFolderFromAnotherDrive) { $this->canAddFolderFromAnotherDrive = $canAddFolderFromAnotherDrive; } /** * @return bool */ public function getCanAddFolderFromAnotherDrive() { return $this->canAddFolderFromAnotherDrive; } /** * @param bool */ public function setCanAddMyDriveParent($canAddMyDriveParent) { $this->canAddMyDriveParent = $canAddMyDriveParent; } /** * @return bool */ public function getCanAddMyDriveParent() { return $this->canAddMyDriveParent; } /** * @param bool */ public function setCanChangeCopyRequiresWriterPermission($canChangeCopyRequiresWriterPermission) { $this->canChangeCopyRequiresWriterPermission = $canChangeCopyRequiresWriterPermission; } /** * @return bool */ public function getCanChangeCopyRequiresWriterPermission() { return $this->canChangeCopyRequiresWriterPermission; } /** * @param bool */ public function setCanChangeSecurityUpdateEnabled($canChangeSecurityUpdateEnabled) { $this->canChangeSecurityUpdateEnabled = $canChangeSecurityUpdateEnabled; } /** * @return bool */ public function getCanChangeSecurityUpdateEnabled() { return $this->canChangeSecurityUpdateEnabled; } /** * @param bool */ public function setCanChangeViewersCanCopyContent($canChangeViewersCanCopyContent) { $this->canChangeViewersCanCopyContent = $canChangeViewersCanCopyContent; } /** * @return bool */ public function getCanChangeViewersCanCopyContent() { return $this->canChangeViewersCanCopyContent; } /** * @param bool */ public function setCanComment($canComment) { $this->canComment = $canComment; } /** * @return bool */ public function getCanComment() { return $this->canComment; } /** * @param bool */ public function setCanCopy($canCopy) { $this->canCopy = $canCopy; } /** * @return bool */ public function getCanCopy() { return $this->canCopy; } /** * @param bool */ public function setCanDelete($canDelete) { $this->canDelete = $canDelete; } /** * @return bool */ public function getCanDelete() { return $this->canDelete; } /** * @param bool */ public function setCanDeleteChildren($canDeleteChildren) { $this->canDeleteChildren = $canDeleteChildren; } /** * @return bool */ public function getCanDeleteChildren() { return $this->canDeleteChildren; } /** * @param bool */ public function setCanDownload($canDownload) { $this->canDownload = $canDownload; } /** * @return bool */ public function getCanDownload() { return $this->canDownload; } /** * @param bool */ public function setCanEdit($canEdit) { $this->canEdit = $canEdit; } /** * @return bool */ public function getCanEdit() { return $this->canEdit; } /** * @param bool */ public function setCanListChildren($canListChildren) { $this->canListChildren = $canListChildren; } /** * @return bool */ public function getCanListChildren() { return $this->canListChildren; } /** * @param bool */ public function setCanModifyContent($canModifyContent) { $this->canModifyContent = $canModifyContent; } /** * @return bool */ public function getCanModifyContent() { return $this->canModifyContent; } /** * @param bool */ public function setCanModifyContentRestriction($canModifyContentRestriction) { $this->canModifyContentRestriction = $canModifyContentRestriction; } /** * @return bool */ public function getCanModifyContentRestriction() { return $this->canModifyContentRestriction; } /** * @param bool */ public function setCanModifyLabels($canModifyLabels) { $this->canModifyLabels = $canModifyLabels; } /** * @return bool */ public function getCanModifyLabels() { return $this->canModifyLabels; } /** * @param bool */ public function setCanMoveChildrenOutOfDrive($canMoveChildrenOutOfDrive) { $this->canMoveChildrenOutOfDrive = $canMoveChildrenOutOfDrive; } /** * @return bool */ public function getCanMoveChildrenOutOfDrive() { return $this->canMoveChildrenOutOfDrive; } /** * @param bool */ public function setCanMoveChildrenOutOfTeamDrive($canMoveChildrenOutOfTeamDrive) { $this->canMoveChildrenOutOfTeamDrive = $canMoveChildrenOutOfTeamDrive; } /** * @return bool */ public function getCanMoveChildrenOutOfTeamDrive() { return $this->canMoveChildrenOutOfTeamDrive; } /** * @param bool */ public function setCanMoveChildrenWithinDrive($canMoveChildrenWithinDrive) { $this->canMoveChildrenWithinDrive = $canMoveChildrenWithinDrive; } /** * @return bool */ public function getCanMoveChildrenWithinDrive() { return $this->canMoveChildrenWithinDrive; } /** * @param bool */ public function setCanMoveChildrenWithinTeamDrive($canMoveChildrenWithinTeamDrive) { $this->canMoveChildrenWithinTeamDrive = $canMoveChildrenWithinTeamDrive; } /** * @return bool */ public function getCanMoveChildrenWithinTeamDrive() { return $this->canMoveChildrenWithinTeamDrive; } /** * @param bool */ public function setCanMoveItemIntoTeamDrive($canMoveItemIntoTeamDrive) { $this->canMoveItemIntoTeamDrive = $canMoveItemIntoTeamDrive; } /** * @return bool */ public function getCanMoveItemIntoTeamDrive() { return $this->canMoveItemIntoTeamDrive; } /** * @param bool */ public function setCanMoveItemOutOfDrive($canMoveItemOutOfDrive) { $this->canMoveItemOutOfDrive = $canMoveItemOutOfDrive; } /** * @return bool */ public function getCanMoveItemOutOfDrive() { return $this->canMoveItemOutOfDrive; } /** * @param bool */ public function setCanMoveItemOutOfTeamDrive($canMoveItemOutOfTeamDrive) { $this->canMoveItemOutOfTeamDrive = $canMoveItemOutOfTeamDrive; } /** * @return bool */ public function getCanMoveItemOutOfTeamDrive() { return $this->canMoveItemOutOfTeamDrive; } /** * @param bool */ public function setCanMoveItemWithinDrive($canMoveItemWithinDrive) { $this->canMoveItemWithinDrive = $canMoveItemWithinDrive; } /** * @return bool */ public function getCanMoveItemWithinDrive() { return $this->canMoveItemWithinDrive; } /** * @param bool */ public function setCanMoveItemWithinTeamDrive($canMoveItemWithinTeamDrive) { $this->canMoveItemWithinTeamDrive = $canMoveItemWithinTeamDrive; } /** * @return bool */ public function getCanMoveItemWithinTeamDrive() { return $this->canMoveItemWithinTeamDrive; } /** * @param bool */ public function setCanMoveTeamDriveItem($canMoveTeamDriveItem) { $this->canMoveTeamDriveItem = $canMoveTeamDriveItem; } /** * @return bool */ public function getCanMoveTeamDriveItem() { return $this->canMoveTeamDriveItem; } /** * @param bool */ public function setCanReadDrive($canReadDrive) { $this->canReadDrive = $canReadDrive; } /** * @return bool */ public function getCanReadDrive() { return $this->canReadDrive; } /** * @param bool */ public function setCanReadLabels($canReadLabels) { $this->canReadLabels = $canReadLabels; } /** * @return bool */ public function getCanReadLabels() { return $this->canReadLabels; } /** * @param bool */ public function setCanReadRevisions($canReadRevisions) { $this->canReadRevisions = $canReadRevisions; } /** * @return bool */ public function getCanReadRevisions() { return $this->canReadRevisions; } /** * @param bool */ public function setCanReadTeamDrive($canReadTeamDrive) { $this->canReadTeamDrive = $canReadTeamDrive; } /** * @return bool */ public function getCanReadTeamDrive() { return $this->canReadTeamDrive; } /** * @param bool */ public function setCanRemoveChildren($canRemoveChildren) { $this->canRemoveChildren = $canRemoveChildren; } /** * @return bool */ public function getCanRemoveChildren() { return $this->canRemoveChildren; } /** * @param bool */ public function setCanRemoveMyDriveParent($canRemoveMyDriveParent) { $this->canRemoveMyDriveParent = $canRemoveMyDriveParent; } /** * @return bool */ public function getCanRemoveMyDriveParent() { return $this->canRemoveMyDriveParent; } /** * @param bool */ public function setCanRename($canRename) { $this->canRename = $canRename; } /** * @return bool */ public function getCanRename() { return $this->canRename; } /** * @param bool */ public function setCanShare($canShare) { $this->canShare = $canShare; } /** * @return bool */ public function getCanShare() { return $this->canShare; } /** * @param bool */ public function setCanTrash($canTrash) { $this->canTrash = $canTrash; } /** * @return bool */ public function getCanTrash() { return $this->canTrash; } /** * @param bool */ public function setCanTrashChildren($canTrashChildren) { $this->canTrashChildren = $canTrashChildren; } /** * @return bool */ public function getCanTrashChildren() { return $this->canTrashChildren; } /** * @param bool */ public function setCanUntrash($canUntrash) { $this->canUntrash = $canUntrash; } /** * @return bool */ public function getCanUntrash() { return $this->canUntrash; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(DriveFileCapabilities::class, 'VendorDuplicator\\Google_Service_Drive_DriveFileCapabilities'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/TeamDriveRestrictions.php000064400000005632147600374260027331 0ustar00adminManagedRestrictions = $adminManagedRestrictions; } /** * @return bool */ public function getAdminManagedRestrictions() { return $this->adminManagedRestrictions; } /** * @param bool */ public function setCopyRequiresWriterPermission($copyRequiresWriterPermission) { $this->copyRequiresWriterPermission = $copyRequiresWriterPermission; } /** * @return bool */ public function getCopyRequiresWriterPermission() { return $this->copyRequiresWriterPermission; } /** * @param bool */ public function setDomainUsersOnly($domainUsersOnly) { $this->domainUsersOnly = $domainUsersOnly; } /** * @return bool */ public function getDomainUsersOnly() { return $this->domainUsersOnly; } /** * @param bool */ public function setSharingFoldersRequiresOrganizerPermission($sharingFoldersRequiresOrganizerPermission) { $this->sharingFoldersRequiresOrganizerPermission = $sharingFoldersRequiresOrganizerPermission; } /** * @return bool */ public function getSharingFoldersRequiresOrganizerPermission() { return $this->sharingFoldersRequiresOrganizerPermission; } /** * @param bool */ public function setTeamMembersOnly($teamMembersOnly) { $this->teamMembersOnly = $teamMembersOnly; } /** * @return bool */ public function getTeamMembersOnly() { return $this->teamMembersOnly; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(TeamDriveRestrictions::class, 'VendorDuplicator\\Google_Service_Drive_TeamDriveRestrictions'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Drive.php000064400000011414147600374260024104 0ustar00backgroundImageFile = $backgroundImageFile; } /** * @return DriveBackgroundImageFile */ public function getBackgroundImageFile() { return $this->backgroundImageFile; } /** * @param string */ public function setBackgroundImageLink($backgroundImageLink) { $this->backgroundImageLink = $backgroundImageLink; } /** * @return string */ public function getBackgroundImageLink() { return $this->backgroundImageLink; } /** * @param DriveCapabilities */ public function setCapabilities(DriveCapabilities $capabilities) { $this->capabilities = $capabilities; } /** * @return DriveCapabilities */ public function getCapabilities() { return $this->capabilities; } /** * @param string */ public function setColorRgb($colorRgb) { $this->colorRgb = $colorRgb; } /** * @return string */ public function getColorRgb() { return $this->colorRgb; } /** * @param string */ public function setCreatedTime($createdTime) { $this->createdTime = $createdTime; } /** * @return string */ public function getCreatedTime() { return $this->createdTime; } /** * @param bool */ public function setHidden($hidden) { $this->hidden = $hidden; } /** * @return bool */ public function getHidden() { return $this->hidden; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setName($name) { $this->name = $name; } /** * @return string */ public function getName() { return $this->name; } /** * @param string */ public function setOrgUnitId($orgUnitId) { $this->orgUnitId = $orgUnitId; } /** * @return string */ public function getOrgUnitId() { return $this->orgUnitId; } /** * @param DriveRestrictions */ public function setRestrictions(DriveRestrictions $restrictions) { $this->restrictions = $restrictions; } /** * @return DriveRestrictions */ public function getRestrictions() { return $this->restrictions; } /** * @param string */ public function setThemeId($themeId) { $this->themeId = $themeId; } /** * @return string */ public function getThemeId() { return $this->themeId; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Drive::class, 'VendorDuplicator\\Google_Service_Drive_Drive'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/Label.php000064400000003772147600374260024062 0ustar00fields = $fields; } /** * @return LabelField[] */ public function getFields() { return $this->fields; } /** * @param string */ public function setId($id) { $this->id = $id; } /** * @return string */ public function getId() { return $this->id; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setRevisionId($revisionId) { $this->revisionId = $revisionId; } /** * @return string */ public function getRevisionId() { return $this->revisionId; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Label::class, 'VendorDuplicator\\Google_Service_Drive_Label'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/ChangeList.php000064400000004265147600374260025062 0ustar00changes = $changes; } /** * @return Change[] */ public function getChanges() { return $this->changes; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNewStartPageToken($newStartPageToken) { $this->newStartPageToken = $newStartPageToken; } /** * @return string */ public function getNewStartPageToken() { return $this->newStartPageToken; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(ChangeList::class, 'VendorDuplicator\\Google_Service_Drive_ChangeList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive/CommentList.php000064400000003527147600374260025277 0ustar00comments = $comments; } /** * @return Comment[] */ public function getComments() { return $this->comments; } /** * @param string */ public function setKind($kind) { $this->kind = $kind; } /** * @return string */ public function getKind() { return $this->kind; } /** * @param string */ public function setNextPageToken($nextPageToken) { $this->nextPageToken = $nextPageToken; } /** * @return string */ public function getNextPageToken() { return $this->nextPageToken; } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(CommentList::class, 'VendorDuplicator\\Google_Service_Drive_CommentList'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/src/Drive.php000064400000054750147600374260023045 0ustar00 * Manages files in Drive including uploading, downloading, searching, detecting * changes, and updating sharing permissions.

* *

* For more information about this service, see the API * Documentation *

* * @author Google, Inc. */ class Drive extends \VendorDuplicator\Google\Service { /** See, edit, create, and delete all of your Google Drive files. */ const DRIVE = "https://www.googleapis.com/auth/drive"; /** See, create, and delete its own configuration data in your Google Drive. */ const DRIVE_APPDATA = "https://www.googleapis.com/auth/drive.appdata"; /** See, edit, create, and delete only the specific Google Drive files you use with this app. */ const DRIVE_FILE = "https://www.googleapis.com/auth/drive.file"; /** View and manage metadata of files in your Google Drive. */ const DRIVE_METADATA = "https://www.googleapis.com/auth/drive.metadata"; /** See information about your Google Drive files. */ const DRIVE_METADATA_READONLY = "https://www.googleapis.com/auth/drive.metadata.readonly"; /** View the photos, videos and albums in your Google Photos. */ const DRIVE_PHOTOS_READONLY = "https://www.googleapis.com/auth/drive.photos.readonly"; /** See and download all your Google Drive files. */ const DRIVE_READONLY = "https://www.googleapis.com/auth/drive.readonly"; /** Modify your Google Apps Script scripts' behavior. */ const DRIVE_SCRIPTS = "https://www.googleapis.com/auth/drive.scripts"; public $about; public $changes; public $channels; public $comments; public $drives; public $files; public $permissions; public $replies; public $revisions; public $teamdrives; /** * Constructs the internal representation of the Drive service. * * @param Client|array $clientOrConfig The client used to deliver requests, or a * config array to pass to a new Client instance. * @param string $rootUrl The root URL used for requests to the service. */ public function __construct($clientOrConfig = [], $rootUrl = null) { parent::__construct($clientOrConfig); $this->rootUrl = $rootUrl ?: 'https://www.googleapis.com/'; $this->servicePath = 'drive/v3/'; $this->batchPath = 'batch/drive/v3'; $this->version = 'v3'; $this->serviceName = 'drive'; $this->about = new Drive\Resource\About($this, $this->serviceName, 'about', ['methods' => ['get' => ['path' => 'about', 'httpMethod' => 'GET', 'parameters' => []]]]); $this->changes = new Drive\Resource\Changes($this, $this->serviceName, 'changes', ['methods' => ['getStartPageToken' => ['path' => 'changes/startPageToken', 'httpMethod' => 'GET', 'parameters' => ['driveId' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'teamDriveId' => ['location' => 'query', 'type' => 'string']]], 'list' => ['path' => 'changes', 'httpMethod' => 'GET', 'parameters' => ['pageToken' => ['location' => 'query', 'type' => 'string', 'required' => \true], 'driveId' => ['location' => 'query', 'type' => 'string'], 'includeCorpusRemovals' => ['location' => 'query', 'type' => 'boolean'], 'includeItemsFromAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'includeRemoved' => ['location' => 'query', 'type' => 'boolean'], 'includeTeamDriveItems' => ['location' => 'query', 'type' => 'boolean'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'restrictToMyDrive' => ['location' => 'query', 'type' => 'boolean'], 'spaces' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'teamDriveId' => ['location' => 'query', 'type' => 'string']]], 'watch' => ['path' => 'changes/watch', 'httpMethod' => 'POST', 'parameters' => ['pageToken' => ['location' => 'query', 'type' => 'string', 'required' => \true], 'driveId' => ['location' => 'query', 'type' => 'string'], 'includeCorpusRemovals' => ['location' => 'query', 'type' => 'boolean'], 'includeItemsFromAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'includeRemoved' => ['location' => 'query', 'type' => 'boolean'], 'includeTeamDriveItems' => ['location' => 'query', 'type' => 'boolean'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'restrictToMyDrive' => ['location' => 'query', 'type' => 'boolean'], 'spaces' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'teamDriveId' => ['location' => 'query', 'type' => 'string']]]]]); $this->channels = new Drive\Resource\Channels($this, $this->serviceName, 'channels', ['methods' => ['stop' => ['path' => 'channels/stop', 'httpMethod' => 'POST', 'parameters' => []]]]); $this->comments = new Drive\Resource\Comments($this, $this->serviceName, 'comments', ['methods' => ['create' => ['path' => 'files/{fileId}/comments', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'delete' => ['path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'DELETE', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'get' => ['path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'includeDeleted' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'files/{fileId}/comments', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'includeDeleted' => ['location' => 'query', 'type' => 'boolean'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string'], 'startModifiedTime' => ['location' => 'query', 'type' => 'string']]], 'update' => ['path' => 'files/{fileId}/comments/{commentId}', 'httpMethod' => 'PATCH', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]]]]); $this->drives = new Drive\Resource\Drives($this, $this->serviceName, 'drives', ['methods' => ['create' => ['path' => 'drives', 'httpMethod' => 'POST', 'parameters' => ['requestId' => ['location' => 'query', 'type' => 'string', 'required' => \true]]], 'delete' => ['path' => 'drives/{driveId}', 'httpMethod' => 'DELETE', 'parameters' => ['driveId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'allowItemDeletion' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'get' => ['path' => 'drives/{driveId}', 'httpMethod' => 'GET', 'parameters' => ['driveId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'hide' => ['path' => 'drives/{driveId}/hide', 'httpMethod' => 'POST', 'parameters' => ['driveId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'list' => ['path' => 'drives', 'httpMethod' => 'GET', 'parameters' => ['pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string'], 'q' => ['location' => 'query', 'type' => 'string'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'unhide' => ['path' => 'drives/{driveId}/unhide', 'httpMethod' => 'POST', 'parameters' => ['driveId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'update' => ['path' => 'drives/{driveId}', 'httpMethod' => 'PATCH', 'parameters' => ['driveId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]]]]); $this->files = new Drive\Resource\Files($this, $this->serviceName, 'files', ['methods' => ['copy' => ['path' => 'files/{fileId}/copy', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'enforceSingleParent' => ['location' => 'query', 'type' => 'boolean'], 'ignoreDefaultVisibility' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'keepRevisionForever' => ['location' => 'query', 'type' => 'boolean'], 'ocrLanguage' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean']]], 'create' => ['path' => 'files', 'httpMethod' => 'POST', 'parameters' => ['enforceSingleParent' => ['location' => 'query', 'type' => 'boolean'], 'ignoreDefaultVisibility' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'keepRevisionForever' => ['location' => 'query', 'type' => 'boolean'], 'ocrLanguage' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'useContentAsIndexableText' => ['location' => 'query', 'type' => 'boolean']]], 'delete' => ['path' => 'files/{fileId}', 'httpMethod' => 'DELETE', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'enforceSingleParent' => ['location' => 'query', 'type' => 'boolean'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean']]], 'emptyTrash' => ['path' => 'files/trash', 'httpMethod' => 'DELETE', 'parameters' => ['driveId' => ['location' => 'query', 'type' => 'string'], 'enforceSingleParent' => ['location' => 'query', 'type' => 'boolean']]], 'export' => ['path' => 'files/{fileId}/export', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'mimeType' => ['location' => 'query', 'type' => 'string', 'required' => \true]]], 'generateIds' => ['path' => 'files/generateIds', 'httpMethod' => 'GET', 'parameters' => ['count' => ['location' => 'query', 'type' => 'integer'], 'space' => ['location' => 'query', 'type' => 'string'], 'type' => ['location' => 'query', 'type' => 'string']]], 'get' => ['path' => 'files/{fileId}', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'acknowledgeAbuse' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'files', 'httpMethod' => 'GET', 'parameters' => ['corpora' => ['location' => 'query', 'type' => 'string'], 'corpus' => ['location' => 'query', 'type' => 'string'], 'driveId' => ['location' => 'query', 'type' => 'string'], 'includeItemsFromAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'includeTeamDriveItems' => ['location' => 'query', 'type' => 'boolean'], 'orderBy' => ['location' => 'query', 'type' => 'string'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string'], 'q' => ['location' => 'query', 'type' => 'string'], 'spaces' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'teamDriveId' => ['location' => 'query', 'type' => 'string']]], 'listLabels' => ['path' => 'files/{fileId}/listLabels', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'maxResults' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string']]], 'modifyLabels' => ['path' => 'files/{fileId}/modifyLabels', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'update' => ['path' => 'files/{fileId}', 'httpMethod' => 'PATCH', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'addParents' => ['location' => 'query', 'type' => 'string'], 'enforceSingleParent' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'keepRevisionForever' => ['location' => 'query', 'type' => 'boolean'], 'ocrLanguage' => ['location' => 'query', 'type' => 'string'], 'removeParents' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'useContentAsIndexableText' => ['location' => 'query', 'type' => 'boolean']]], 'watch' => ['path' => 'files/{fileId}/watch', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'acknowledgeAbuse' => ['location' => 'query', 'type' => 'boolean'], 'includeLabels' => ['location' => 'query', 'type' => 'string'], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean']]]]]); $this->permissions = new Drive\Resource\Permissions($this, $this->serviceName, 'permissions', ['methods' => ['create' => ['path' => 'files/{fileId}/permissions', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'emailMessage' => ['location' => 'query', 'type' => 'string'], 'enforceSingleParent' => ['location' => 'query', 'type' => 'boolean'], 'moveToNewOwnersRoot' => ['location' => 'query', 'type' => 'boolean'], 'sendNotificationEmail' => ['location' => 'query', 'type' => 'boolean'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'transferOwnership' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'delete' => ['path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'DELETE', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'permissionId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'get' => ['path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'permissionId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'files/{fileId}/permissions', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'includePermissionsForView' => ['location' => 'query', 'type' => 'string'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'update' => ['path' => 'files/{fileId}/permissions/{permissionId}', 'httpMethod' => 'PATCH', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'permissionId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'removeExpiration' => ['location' => 'query', 'type' => 'boolean'], 'supportsAllDrives' => ['location' => 'query', 'type' => 'boolean'], 'supportsTeamDrives' => ['location' => 'query', 'type' => 'boolean'], 'transferOwnership' => ['location' => 'query', 'type' => 'boolean'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]]]]); $this->replies = new Drive\Resource\Replies($this, $this->serviceName, 'replies', ['methods' => ['create' => ['path' => 'files/{fileId}/comments/{commentId}/replies', 'httpMethod' => 'POST', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'delete' => ['path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'DELETE', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'replyId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'get' => ['path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'replyId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'includeDeleted' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'files/{fileId}/comments/{commentId}/replies', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'includeDeleted' => ['location' => 'query', 'type' => 'boolean'], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string']]], 'update' => ['path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', 'httpMethod' => 'PATCH', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'commentId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'replyId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]]]]); $this->revisions = new Drive\Resource\Revisions($this, $this->serviceName, 'revisions', ['methods' => ['delete' => ['path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'DELETE', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'revisionId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'get' => ['path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'revisionId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'acknowledgeAbuse' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'files/{fileId}/revisions', 'httpMethod' => 'GET', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string']]], 'update' => ['path' => 'files/{fileId}/revisions/{revisionId}', 'httpMethod' => 'PATCH', 'parameters' => ['fileId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'revisionId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]]]]); $this->teamdrives = new Drive\Resource\Teamdrives($this, $this->serviceName, 'teamdrives', ['methods' => ['create' => ['path' => 'teamdrives', 'httpMethod' => 'POST', 'parameters' => ['requestId' => ['location' => 'query', 'type' => 'string', 'required' => \true]]], 'delete' => ['path' => 'teamdrives/{teamDriveId}', 'httpMethod' => 'DELETE', 'parameters' => ['teamDriveId' => ['location' => 'path', 'type' => 'string', 'required' => \true]]], 'get' => ['path' => 'teamdrives/{teamDriveId}', 'httpMethod' => 'GET', 'parameters' => ['teamDriveId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'list' => ['path' => 'teamdrives', 'httpMethod' => 'GET', 'parameters' => ['pageSize' => ['location' => 'query', 'type' => 'integer'], 'pageToken' => ['location' => 'query', 'type' => 'string'], 'q' => ['location' => 'query', 'type' => 'string'], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]], 'update' => ['path' => 'teamdrives/{teamDriveId}', 'httpMethod' => 'PATCH', 'parameters' => ['teamDriveId' => ['location' => 'path', 'type' => 'string', 'required' => \true], 'useDomainAdminAccess' => ['location' => 'query', 'type' => 'boolean']]]]]); } } // Adding a class alias for backwards compatibility with the previous class name. \class_alias(Drive::class, 'VendorDuplicator\\Google_Service_Drive'); addons/gdriveaddon/vendor-prefixed/google/apiclient-services/autoload.php000064400000002715147600374260023007 0ustar00 'VendorDuplicator\\Google_Client', 'VendorDuplicator\\Google\\Service' => 'VendorDuplicator\\Google_Service', 'VendorDuplicator\\Google\\Service\\Resource' => 'VendorDuplicator\\Google_Service_Resource', 'VendorDuplicator\\Google\\Model' => 'VendorDuplicator\\Google_Model', 'VendorDuplicator\\Google\\Collection' => 'VendorDuplicator\\Google_Collection']; foreach ($servicesClassMap as $alias => $class) { \class_alias($class, $alias); } } } \spl_autoload_register(function ($class) { if (0 === \strpos($class, 'VendorDuplicator\\Google_Service_')) { // Autoload the new class, which will also create an alias for the // old class by changing underscores to namespaces: // Google_Service_Speech_Resource_Operations // => Google\Service\Speech\Resource\Operations $classExists = \class_exists($newClass = \str_replace('_', '\\', $class)); if ($classExists) { return \true; } } }, \true, \true); addons/gdriveaddon/vendor-prefixed/google/auth/src/Cache/InvalidArgumentException.php000064400000001515147600374260025106 0ustar00key = $key; } /** * {@inheritdoc} */ public function getKey() { return $this->key; } /** * {@inheritdoc} */ public function get() { return $this->isHit() ? $this->value : null; } /** * {@inheritdoc} */ public function isHit() { if (!$this->isHit) { return \false; } if ($this->expiration === null) { return \true; } return $this->currentTime()->getTimestamp() < $this->expiration->getTimestamp(); } /** * {@inheritdoc} */ public function set($value) { $this->isHit = \true; $this->value = $value; return $this; } /** * {@inheritdoc} */ public function expiresAt($expiration) { if ($this->isValidExpiration($expiration)) { $this->expiration = $expiration; return $this; } $implementationMessage = \interface_exists('DateTimeInterface') ? 'implement interface DateTimeInterface' : 'be an instance of DateTime'; $error = \sprintf('Argument 1 passed to %s::expiresAt() must %s, %s given', \get_class($this), $implementationMessage, \gettype($expiration)); $this->handleError($error); } /** * {@inheritdoc} */ public function expiresAfter($time) { if (\is_int($time)) { $this->expiration = $this->currentTime()->add(new \DateInterval("PT{$time}S")); } elseif ($time instanceof \DateInterval) { $this->expiration = $this->currentTime()->add($time); } elseif ($time === null) { $this->expiration = $time; } else { $message = 'Argument 1 passed to %s::expiresAfter() must be an ' . 'instance of DateInterval or of the type integer, %s given'; $error = \sprintf($message, \get_class($this), \gettype($time)); $this->handleError($error); } return $this; } /** * Handles an error. * * @param string $error * @throws \TypeError */ private function handleError($error) { if (\class_exists('TypeError')) { throw new \TypeError($error); } \trigger_error($error, \E_USER_ERROR); } /** * Determines if an expiration is valid based on the rules defined by PSR6. * * @param mixed $expiration * @return bool */ private function isValidExpiration($expiration) { if ($expiration === null) { return \true; } if ($expiration instanceof \DateTimeInterface) { return \true; } return \false; } protected function currentTime() { return new \DateTime('now', new \DateTimeZone('UTC')); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Cache/SysVCacheItemPool.php000064400000013250147600374260023436 0ustar00options = $options + ['variableKey' => self::VAR_KEY, 'proj' => self::DEFAULT_PROJ, 'memsize' => self::DEFAULT_MEMSIZE, 'perm' => self::DEFAULT_PERM]; $this->items = []; $this->deferredItems = []; $this->sysvKey = \ftok(__FILE__, $this->options['proj']); } public function getItem($key) { $this->loadItems(); return \current($this->getItems([$key])); } /** * {@inheritdoc} */ public function getItems(array $keys = []) { $this->loadItems(); $items = []; foreach ($keys as $key) { $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new Item($key); } return $items; } /** * {@inheritdoc} */ public function hasItem($key) { $this->loadItems(); return isset($this->items[$key]) && $this->items[$key]->isHit(); } /** * {@inheritdoc} */ public function clear() { $this->items = []; $this->deferredItems = []; return $this->saveCurrentItems(); } /** * {@inheritdoc} */ public function deleteItem($key) { return $this->deleteItems([$key]); } /** * {@inheritdoc} */ public function deleteItems(array $keys) { if (!$this->hasLoadedItems) { $this->loadItems(); } foreach ($keys as $key) { unset($this->items[$key]); } return $this->saveCurrentItems(); } /** * {@inheritdoc} */ public function save(CacheItemInterface $item) { if (!$this->hasLoadedItems) { $this->loadItems(); } $this->items[$item->getKey()] = $item; return $this->saveCurrentItems(); } /** * {@inheritdoc} */ public function saveDeferred(CacheItemInterface $item) { $this->deferredItems[$item->getKey()] = $item; return \true; } /** * {@inheritdoc} */ public function commit() { foreach ($this->deferredItems as $item) { if ($this->save($item) === \false) { return \false; } } $this->deferredItems = []; return \true; } /** * Save the current items. * * @return bool true when success, false upon failure */ private function saveCurrentItems() { $shmid = \shm_attach($this->sysvKey, $this->options['memsize'], $this->options['perm']); if ($shmid !== \false) { $ret = \shm_put_var($shmid, $this->options['variableKey'], $this->items); \shm_detach($shmid); return $ret; } return \false; } /** * Load the items from the shared memory. * * @return bool true when success, false upon failure */ private function loadItems() { $shmid = \shm_attach($this->sysvKey, $this->options['memsize'], $this->options['perm']); if ($shmid !== \false) { $data = @\shm_get_var($shmid, $this->options['variableKey']); if (!empty($data)) { $this->items = $data; } else { $this->items = []; } \shm_detach($shmid); $this->hasLoadedItems = \true; return \true; } return \false; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Cache/MemoryCacheItemPool.php000064400000010436147600374260024005 0ustar00getItems([$key])); } /** * {@inheritdoc} * * @return array * A traversable collection of Cache Items keyed by the cache keys of * each item. A Cache item will be returned for each key, even if that * key is not found. However, if no keys are specified then an empty * traversable MUST be returned instead. */ public function getItems(array $keys = []) { $items = []; foreach ($keys as $key) { $items[$key] = $this->hasItem($key) ? clone $this->items[$key] : new Item($key); } return $items; } /** * {@inheritdoc} * * @return bool * True if item exists in the cache, false otherwise. */ public function hasItem($key) { $this->isValidKey($key); return isset($this->items[$key]) && $this->items[$key]->isHit(); } /** * {@inheritdoc} * * @return bool * True if the pool was successfully cleared. False if there was an error. */ public function clear() { $this->items = []; $this->deferredItems = []; return \true; } /** * {@inheritdoc} * * @return bool * True if the item was successfully removed. False if there was an error. */ public function deleteItem($key) { return $this->deleteItems([$key]); } /** * {@inheritdoc} * * @return bool * True if the items were successfully removed. False if there was an error. */ public function deleteItems(array $keys) { \array_walk($keys, [$this, 'isValidKey']); foreach ($keys as $key) { unset($this->items[$key]); } return \true; } /** * {@inheritdoc} * * @return bool * True if the item was successfully persisted. False if there was an error. */ public function save(CacheItemInterface $item) { $this->items[$item->getKey()] = $item; return \true; } /** * {@inheritdoc} * * @return bool * False if the item could not be queued or if a commit was attempted and failed. True otherwise. */ public function saveDeferred(CacheItemInterface $item) { $this->deferredItems[$item->getKey()] = $item; return \true; } /** * {@inheritdoc} * * @return bool * True if all not-yet-saved items were successfully saved or there were none. False otherwise. */ public function commit() { foreach ($this->deferredItems as $item) { $this->save($item); } $this->deferredItems = []; return \true; } /** * Determines if the provided key is valid. * * @param string $key * @return bool * @throws InvalidArgumentException */ private function isValidKey($key) { $invalidCharacters = '{}()/\\\\@:'; if (!\is_string($key) || \preg_match("#[{$invalidCharacters}]#", $key)) { throw new InvalidArgumentException('The provided key is not valid: ' . \var_export($key, \true)); } return \true; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/InsecureCredentials.php000064400000003510147600374260025320 0ustar00 '']; /** * Fetches the auth token. In this case it returns an empty string. * * @param callable $httpHandler * @return array A set of auth related metadata, containing the following * keys: * - access_token (string) */ public function fetchAuthToken(callable $httpHandler = null) { return $this->token; } /** * Returns the cache key. In this case it returns a null value, disabling * caching. * * @return string|null */ public function getCacheKey() { return null; } /** * Fetches the last received token. In this case, it returns the same empty string * auth token. * * @return array */ public function getLastReceivedToken() { return $this->token; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/ServiceAccountCredentials.php000064400000023752147600374260026472 0ustar00push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'auth' => 'google_auth' // authorize all requests * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); */ class ServiceAccountCredentials extends CredentialsLoader implements GetQuotaProjectInterface, SignBlobInterface, ProjectIdProviderInterface { use ServiceAccountSignerTrait; /** * The OAuth2 instance used to conduct authorization. * * @var OAuth2 */ protected $auth; /** * The quota project associated with the JSON credentials * * @var string */ protected $quotaProject; /* * @var string|null */ protected $projectId; /* * @var array|null */ private $lastReceivedJwtAccessToken; /* * @var bool */ private $useJwtAccessWithScope = \false; /* * @var ServiceAccountJwtAccessCredentials|null */ private $jwtAccessCredentials; /** * Create a new ServiceAccountCredentials. * * @param string|array $scope the scope of the access request, expressed * either as an Array or as a space-delimited String. * @param string|array $jsonKey JSON credential file path or JSON credentials * as an associative array * @param string $sub an email address account to impersonate, in situations when * the service account has been delegated domain wide access. * @param string $targetAudience The audience for the ID token. */ public function __construct($scope, $jsonKey, $sub = null, $targetAudience = null) { if (\is_string($jsonKey)) { if (!\file_exists($jsonKey)) { throw new \InvalidArgumentException('file does not exist'); } $jsonKeyStream = \file_get_contents($jsonKey); if (!($jsonKey = \json_decode($jsonKeyStream, \true))) { throw new \LogicException('invalid json for auth config'); } } if (!\array_key_exists('client_email', $jsonKey)) { throw new \InvalidArgumentException('json key is missing the client_email field'); } if (!\array_key_exists('private_key', $jsonKey)) { throw new \InvalidArgumentException('json key is missing the private_key field'); } if (\array_key_exists('quota_project_id', $jsonKey)) { $this->quotaProject = (string) $jsonKey['quota_project_id']; } if ($scope && $targetAudience) { throw new InvalidArgumentException('Scope and targetAudience cannot both be supplied'); } $additionalClaims = []; if ($targetAudience) { $additionalClaims = ['target_audience' => $targetAudience]; } $this->auth = new OAuth2(['audience' => self::TOKEN_CREDENTIAL_URI, 'issuer' => $jsonKey['client_email'], 'scope' => $scope, 'signingAlgorithm' => 'RS256', 'signingKey' => $jsonKey['private_key'], 'sub' => $sub, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI, 'additionalClaims' => $additionalClaims]); $this->projectId = isset($jsonKey['project_id']) ? $jsonKey['project_id'] : null; } /** * When called, the ServiceAccountCredentials will use an instance of * ServiceAccountJwtAccessCredentials to fetch (self-sign) an access token * even when only scopes are supplied. Otherwise, * ServiceAccountJwtAccessCredentials is only called when no scopes and an * authUrl (audience) is suppled. */ public function useJwtAccessWithScope() { $this->useJwtAccessWithScope = \true; } /** * @param callable $httpHandler * * @return array A set of auth related metadata, containing the following * keys: * - access_token (string) * - expires_in (int) * - token_type (string) */ public function fetchAuthToken(callable $httpHandler = null) { if ($this->useSelfSignedJwt()) { $jwtCreds = $this->createJwtAccessCredentials(); $accessToken = $jwtCreds->fetchAuthToken($httpHandler); if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) { // Keep self-signed JWTs in memory as the last received token $this->lastReceivedJwtAccessToken = $lastReceivedToken; } return $accessToken; } return $this->auth->fetchAuthToken($httpHandler); } /** * @return string */ public function getCacheKey() { $key = $this->auth->getIssuer() . ':' . $this->auth->getCacheKey(); if ($sub = $this->auth->getSub()) { $key .= ':' . $sub; } return $key; } /** * @return array */ public function getLastReceivedToken() { // If self-signed JWTs are being used, fetch the last received token // from memory. Else, fetch it from OAuth2 return $this->useSelfSignedJwt() ? $this->lastReceivedJwtAccessToken : $this->auth->getLastReceivedToken(); } /** * Get the project ID from the service account keyfile. * * Returns null if the project ID does not exist in the keyfile. * * @param callable $httpHandler Not used by this credentials type. * @return string|null */ public function getProjectId(callable $httpHandler = null) { return $this->projectId; } /** * Updates metadata with the authorization token. * * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request * @return array updated metadata hashmap */ public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null) { // scope exists. use oauth implementation if (!$this->useSelfSignedJwt()) { return parent::updateMetadata($metadata, $authUri, $httpHandler); } $jwtCreds = $this->createJwtAccessCredentials(); if ($this->auth->getScope()) { // Prefer user-provided "scope" to "audience" $updatedMetadata = $jwtCreds->updateMetadata($metadata, null, $httpHandler); } else { $updatedMetadata = $jwtCreds->updateMetadata($metadata, $authUri, $httpHandler); } if ($lastReceivedToken = $jwtCreds->getLastReceivedToken()) { // Keep self-signed JWTs in memory as the last received token $this->lastReceivedJwtAccessToken = $lastReceivedToken; } return $updatedMetadata; } private function createJwtAccessCredentials() { if (!$this->jwtAccessCredentials) { // Create credentials for self-signing a JWT (JwtAccess) $credJson = array('private_key' => $this->auth->getSigningKey(), 'client_email' => $this->auth->getIssuer()); $this->jwtAccessCredentials = new ServiceAccountJwtAccessCredentials($credJson, $this->auth->getScope()); } return $this->jwtAccessCredentials; } /** * @param string $sub an email address account to impersonate, in situations when * the service account has been delegated domain wide access. */ public function setSub($sub) { $this->auth->setSub($sub); } /** * Get the client name from the keyfile. * * In this case, it returns the keyfile's client_email key. * * @param callable $httpHandler Not used by this credentials type. * @return string */ public function getClientName(callable $httpHandler = null) { return $this->auth->getIssuer(); } /** * Get the quota project used for this API request * * @return string|null */ public function getQuotaProject() { return $this->quotaProject; } private function useSelfSignedJwt() { // If claims are set, this call is for "id_tokens" if ($this->auth->getAdditionalClaims()) { return \false; } // When true, ServiceAccountCredentials will always use JwtAccess for access tokens if ($this->useJwtAccessWithScope) { return \true; } return \is_null($this->auth->getScope()); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/IAMCredentials.php000064400000004561147600374260024160 0ustar00selector = $selector; $this->token = $token; } /** * export a callback function which updates runtime metadata. * * @return array updateMetadata function */ public function getUpdateMetadataFunc() { return array($this, 'updateMetadata'); } /** * Updates metadata with the appropriate header metadata. * * @param array $metadata metadata hashmap * @param string $unusedAuthUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request * Note: this param is unused here, only included here for * consistency with other credentials class * * @return array updated metadata hashmap */ public function updateMetadata($metadata, $unusedAuthUri = null, callable $httpHandler = null) { $metadata_copy = $metadata; $metadata_copy[self::SELECTOR_KEY] = $this->selector; $metadata_copy[self::TOKEN_KEY] = $this->token; return $metadata_copy; } } gdriveaddon/vendor-prefixed/google/auth/src/Credentials/ServiceAccountJwtAccessCredentials.php000064400000013646147600374260030223 0ustar00addonsquotaProject = (string) $jsonKey['quota_project_id']; } $this->auth = new OAuth2(['issuer' => $jsonKey['client_email'], 'sub' => $jsonKey['client_email'], 'signingAlgorithm' => 'RS256', 'signingKey' => $jsonKey['private_key'], 'scope' => $scope]); $this->projectId = isset($jsonKey['project_id']) ? $jsonKey['project_id'] : null; } /** * Updates metadata with the authorization token. * * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request * @return array updated metadata hashmap */ public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null) { $scope = $this->auth->getScope(); if (empty($authUri) && empty($scope)) { return $metadata; } $this->auth->setAudience($authUri); return parent::updateMetadata($metadata, $authUri, $httpHandler); } /** * Implements FetchAuthTokenInterface#fetchAuthToken. * * @param callable $httpHandler * * @return array|void A set of auth related metadata, containing the * following keys: * - access_token (string) */ public function fetchAuthToken(callable $httpHandler = null) { $audience = $this->auth->getAudience(); $scope = $this->auth->getScope(); if (empty($audience) && empty($scope)) { return null; } if (!empty($audience) && !empty($scope)) { throw new \UnexpectedValueException('Cannot sign both audience and scope in JwtAccess'); } $access_token = $this->auth->toJwt(); // Set the self-signed access token in OAuth2 for getLastReceivedToken $this->auth->setAccessToken($access_token); return array('access_token' => $access_token); } /** * @return string */ public function getCacheKey() { return $this->auth->getCacheKey(); } /** * @return array */ public function getLastReceivedToken() { return $this->auth->getLastReceivedToken(); } /** * Get the project ID from the service account keyfile. * * Returns null if the project ID does not exist in the keyfile. * * @param callable $httpHandler Not used by this credentials type. * @return string|null */ public function getProjectId(callable $httpHandler = null) { return $this->projectId; } /** * Get the client name from the keyfile. * * In this case, it returns the keyfile's client_email key. * * @param callable $httpHandler Not used by this credentials type. * @return string */ public function getClientName(callable $httpHandler = null) { return $this->auth->getIssuer(); } /** * Get the quota project used for this API request * * @return string|null */ public function getQuotaProject() { return $this->quotaProject; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/AppIdentityCredentials.php000064400000015262147600374260026004 0ustar00push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/books/v1', * 'auth' => 'google_auth' * ]); * * $res = $client->get('volumes?q=Henry+David+Thoreau&country=US'); * ``` */ class AppIdentityCredentials extends CredentialsLoader implements SignBlobInterface, ProjectIdProviderInterface { /** * Result of fetchAuthToken. * * @var array */ protected $lastReceivedToken; /** * Array of OAuth2 scopes to be requested. * * @var array */ private $scope; /** * @var string */ private $clientName; /** * @param array $scope One or more scopes. */ public function __construct($scope = array()) { $this->scope = $scope; } /** * Determines if this an App Engine instance, by accessing the * SERVER_SOFTWARE environment variable (prod) or the APPENGINE_RUNTIME * environment variable (dev). * * @return bool true if this an App Engine Instance, false otherwise */ public static function onAppEngine() { $appEngineProduction = isset($_SERVER['SERVER_SOFTWARE']) && 0 === \strpos($_SERVER['SERVER_SOFTWARE'], 'VendorDuplicator\\Google App Engine'); if ($appEngineProduction) { return \true; } $appEngineDevAppServer = isset($_SERVER['APPENGINE_RUNTIME']) && $_SERVER['APPENGINE_RUNTIME'] == 'php'; if ($appEngineDevAppServer) { return \true; } return \false; } /** * Implements FetchAuthTokenInterface#fetchAuthToken. * * Fetches the auth tokens using the AppIdentityService if available. * As the AppIdentityService uses protobufs to fetch the access token, * the GuzzleHttp\ClientInterface instance passed in will not be used. * * @param callable $httpHandler callback which delivers psr7 request * @return array A set of auth related metadata, containing the following * keys: * - access_token (string) * - expiration_time (string) */ public function fetchAuthToken(callable $httpHandler = null) { try { $this->checkAppEngineContext(); } catch (\Exception $e) { return []; } // AppIdentityService expects an array when multiple scopes are supplied $scope = \is_array($this->scope) ? $this->scope : \explode(' ', $this->scope); $token = AppIdentityService::getAccessToken($scope); $this->lastReceivedToken = $token; return $token; } /** * Sign a string using AppIdentityService. * * @param string $stringToSign The string to sign. * @param bool $forceOpenSsl [optional] Does not apply to this credentials * type. * @return string The signature, base64-encoded. * @throws \Exception If AppEngine SDK or mock is not available. */ public function signBlob($stringToSign, $forceOpenSsl = \false) { $this->checkAppEngineContext(); return \base64_encode(AppIdentityService::signForApp($stringToSign)['signature']); } /** * Get the project ID from AppIdentityService. * * Returns null if AppIdentityService is unavailable. * * @param callable $httpHandler Not used by this type. * @return string|null */ public function getProjectId(callable $httpHander = null) { try { $this->checkAppEngineContext(); } catch (\Exception $e) { return null; } return AppIdentityService::getApplicationId(); } /** * Get the client name from AppIdentityService. * * Subsequent calls to this method will return a cached value. * * @param callable $httpHandler Not used in this implementation. * @return string * @throws \Exception If AppEngine SDK or mock is not available. */ public function getClientName(callable $httpHandler = null) { $this->checkAppEngineContext(); if (!$this->clientName) { $this->clientName = AppIdentityService::getServiceAccountName(); } return $this->clientName; } /** * @return array|null */ public function getLastReceivedToken() { if ($this->lastReceivedToken) { return ['access_token' => $this->lastReceivedToken['access_token'], 'expires_at' => $this->lastReceivedToken['expiration_time']]; } return null; } /** * Caching is handled by the underlying AppIdentityService, return empty string * to prevent caching. * * @return string */ public function getCacheKey() { return ''; } private function checkAppEngineContext() { if (!self::onAppEngine() || !\class_exists('VendorDuplicator\\google\\appengine\\api\\app_identity\\AppIdentityService')) { throw new \Exception('This class must be run in App Engine, or you must include the AppIdentityService ' . 'mock class defined in tests/mocks/AppIdentityService.php'); } } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/GCECredentials.php000064400000037261147600374260024153 0ustar00push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'auth' => 'google_auth' * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); */ class GCECredentials extends CredentialsLoader implements SignBlobInterface, ProjectIdProviderInterface, GetQuotaProjectInterface { // phpcs:disable const cacheKey = 'GOOGLE_AUTH_PHP_GCE'; // phpcs:enable /** * The metadata IP address on appengine instances. * * The IP is used instead of the domain 'metadata' to avoid slow responses * when not on Compute Engine. */ const METADATA_IP = '169.254.169.254'; /** * The metadata path of the default token. */ const TOKEN_URI_PATH = 'v1/instance/service-accounts/default/token'; /** * The metadata path of the default id token. */ const ID_TOKEN_URI_PATH = 'v1/instance/service-accounts/default/identity'; /** * The metadata path of the client ID. */ const CLIENT_ID_URI_PATH = 'v1/instance/service-accounts/default/email'; /** * The metadata path of the project ID. */ const PROJECT_ID_URI_PATH = 'v1/project/project-id'; /** * The header whose presence indicates GCE presence. */ const FLAVOR_HEADER = 'Metadata-Flavor'; /** * Note: the explicit `timeout` and `tries` below is a workaround. The underlying * issue is that resolving an unknown host on some networks will take * 20-30 seconds; making this timeout short fixes the issue, but * could lead to false negatives in the event that we are on GCE, but * the metadata resolution was particularly slow. The latter case is * "unlikely" since the expected 4-nines time is about 0.5 seconds. * This allows us to limit the total ping maximum timeout to 1.5 seconds * for developer desktop scenarios. */ const MAX_COMPUTE_PING_TRIES = 3; const COMPUTE_PING_CONNECTION_TIMEOUT_S = 0.5; /** * Flag used to ensure that the onGCE test is only done once;. * * @var bool */ private $hasCheckedOnGce = \false; /** * Flag that stores the value of the onGCE check. * * @var bool */ private $isOnGce = \false; /** * Result of fetchAuthToken. */ protected $lastReceivedToken; /** * @var string|null */ private $clientName; /** * @var string|null */ private $projectId; /** * @var Iam|null */ private $iam; /** * @var string */ private $tokenUri; /** * @var string */ private $targetAudience; /** * @var string|null */ private $quotaProject; /** * @var string|null */ private $serviceAccountIdentity; /** * @param Iam $iam [optional] An IAM instance. * @param string|array $scope [optional] the scope of the access request, * expressed either as an array or as a space-delimited string. * @param string $targetAudience [optional] The audience for the ID token. * @param string $quotaProject [optional] Specifies a project to bill for access * charges associated with the request. * @param string $serviceAccountIdentity [optional] Specify a service * account identity name to use instead of "default". */ public function __construct(Iam $iam = null, $scope = null, $targetAudience = null, $quotaProject = null, $serviceAccountIdentity = null) { $this->iam = $iam; if ($scope && $targetAudience) { throw new InvalidArgumentException('Scope and targetAudience cannot both be supplied'); } $tokenUri = self::getTokenUri($serviceAccountIdentity); if ($scope) { if (\is_string($scope)) { $scope = \explode(' ', $scope); } $scope = \implode(',', $scope); $tokenUri = $tokenUri . '?scopes=' . $scope; } elseif ($targetAudience) { $tokenUri = self::getIdTokenUri($serviceAccountIdentity); $tokenUri = $tokenUri . '?audience=' . $targetAudience; $this->targetAudience = $targetAudience; } $this->tokenUri = $tokenUri; $this->quotaProject = $quotaProject; $this->serviceAccountIdentity = $serviceAccountIdentity; } /** * The full uri for accessing the default token. * * @param string $serviceAccountIdentity [optional] Specify a service * account identity name to use instead of "default". * @return string */ public static function getTokenUri($serviceAccountIdentity = null) { $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; $base .= self::TOKEN_URI_PATH; if ($serviceAccountIdentity) { return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base); } return $base; } /** * The full uri for accessing the default service account. * * @param string $serviceAccountIdentity [optional] Specify a service * account identity name to use instead of "default". * @return string */ public static function getClientNameUri($serviceAccountIdentity = null) { $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; $base .= self::CLIENT_ID_URI_PATH; if ($serviceAccountIdentity) { return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base); } return $base; } /** * The full uri for accesesing the default identity token. * * @param string $serviceAccountIdentity [optional] Specify a service * account identity name to use instead of "default". * @return string */ private static function getIdTokenUri($serviceAccountIdentity = null) { $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; $base .= self::ID_TOKEN_URI_PATH; if ($serviceAccountIdentity) { return \str_replace('/default/', '/' . $serviceAccountIdentity . '/', $base); } return $base; } /** * The full uri for accessing the default project ID. * * @return string */ private static function getProjectIdUri() { $base = 'http://' . self::METADATA_IP . '/computeMetadata/'; return $base . self::PROJECT_ID_URI_PATH; } /** * Determines if this an App Engine Flexible instance, by accessing the * GAE_INSTANCE environment variable. * * @return bool true if this an App Engine Flexible Instance, false otherwise */ public static function onAppEngineFlexible() { return \substr(\getenv('GAE_INSTANCE'), 0, 4) === 'aef-'; } /** * Determines if this a GCE instance, by accessing the expected metadata * host. * If $httpHandler is not specified a the default HttpHandler is used. * * @param callable $httpHandler callback which delivers psr7 request * @return bool True if this a GCEInstance, false otherwise */ public static function onGce(callable $httpHandler = null) { $httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); $checkUri = 'http://' . self::METADATA_IP; for ($i = 1; $i <= self::MAX_COMPUTE_PING_TRIES; $i++) { try { // Comment from: oauth2client/client.py // // Note: the explicit `timeout` below is a workaround. The underlying // issue is that resolving an unknown host on some networks will take // 20-30 seconds; making this timeout short fixes the issue, but // could lead to false negatives in the event that we are on GCE, but // the metadata resolution was particularly slow. The latter case is // "unlikely". $resp = $httpHandler(new Request('GET', $checkUri, [self::FLAVOR_HEADER => 'VendorDuplicator\\Google']), ['timeout' => self::COMPUTE_PING_CONNECTION_TIMEOUT_S]); return $resp->getHeaderLine(self::FLAVOR_HEADER) == 'VendorDuplicator\\Google'; } catch (ClientException $e) { } catch (ServerException $e) { } catch (RequestException $e) { } catch (ConnectException $e) { } } return \false; } /** * Implements FetchAuthTokenInterface#fetchAuthToken. * * Fetches the auth tokens from the GCE metadata host if it is available. * If $httpHandler is not specified a the default HttpHandler is used. * * @param callable $httpHandler callback which delivers psr7 request * * @return array A set of auth related metadata, based on the token type. * * Access tokens have the following keys: * - access_token (string) * - expires_in (int) * - token_type (string) * ID tokens have the following keys: * - id_token (string) * * @throws \Exception */ public function fetchAuthToken(callable $httpHandler = null) { $httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); if (!$this->hasCheckedOnGce) { $this->isOnGce = self::onGce($httpHandler); $this->hasCheckedOnGce = \true; } if (!$this->isOnGce) { return array(); // return an empty array with no access token } $response = $this->getFromMetadata($httpHandler, $this->tokenUri); if ($this->targetAudience) { return ['id_token' => $response]; } if (null === ($json = \json_decode($response, \true))) { throw new \Exception('Invalid JSON response'); } $json['expires_at'] = \time() + $json['expires_in']; // store this so we can retrieve it later $this->lastReceivedToken = $json; return $json; } /** * @return string */ public function getCacheKey() { return self::cacheKey; } /** * @return array|null */ public function getLastReceivedToken() { if ($this->lastReceivedToken) { return ['access_token' => $this->lastReceivedToken['access_token'], 'expires_at' => $this->lastReceivedToken['expires_at']]; } return null; } /** * Get the client name from GCE metadata. * * Subsequent calls will return a cached value. * * @param callable $httpHandler callback which delivers psr7 request * @return string */ public function getClientName(callable $httpHandler = null) { if ($this->clientName) { return $this->clientName; } $httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); if (!$this->hasCheckedOnGce) { $this->isOnGce = self::onGce($httpHandler); $this->hasCheckedOnGce = \true; } if (!$this->isOnGce) { return ''; } $this->clientName = $this->getFromMetadata($httpHandler, self::getClientNameUri($this->serviceAccountIdentity)); return $this->clientName; } /** * Sign a string using the default service account private key. * * This implementation uses IAM's signBlob API. * * @see https://cloud.google.com/iam/credentials/reference/rest/v1/projects.serviceAccounts/signBlob SignBlob * * @param string $stringToSign The string to sign. * @param bool $forceOpenSsl [optional] Does not apply to this credentials * type. * @param string $accessToken The access token to use to sign the blob. If * provided, saves a call to the metadata server for a new access * token. **Defaults to** `null`. * @return string */ public function signBlob($stringToSign, $forceOpenSsl = \false, $accessToken = null) { $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); // Providing a signer is useful for testing, but it's undocumented // because it's not something a user would generally need to do. $signer = $this->iam ?: new Iam($httpHandler); $email = $this->getClientName($httpHandler); if (\is_null($accessToken)) { $previousToken = $this->getLastReceivedToken(); $accessToken = $previousToken ? $previousToken['access_token'] : $this->fetchAuthToken($httpHandler)['access_token']; } return $signer->signBlob($email, $accessToken, $stringToSign); } /** * Fetch the default Project ID from compute engine. * * Returns null if called outside GCE. * * @param callable $httpHandler Callback which delivers psr7 request * @return string|null */ public function getProjectId(callable $httpHandler = null) { if ($this->projectId) { return $this->projectId; } $httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); if (!$this->hasCheckedOnGce) { $this->isOnGce = self::onGce($httpHandler); $this->hasCheckedOnGce = \true; } if (!$this->isOnGce) { return null; } $this->projectId = $this->getFromMetadata($httpHandler, self::getProjectIdUri()); return $this->projectId; } /** * Fetch the value of a GCE metadata server URI. * * @param callable $httpHandler An HTTP Handler to deliver PSR7 requests. * @param string $uri The metadata URI. * @return string */ private function getFromMetadata(callable $httpHandler, $uri) { $resp = $httpHandler(new Request('GET', $uri, [self::FLAVOR_HEADER => 'VendorDuplicator\\Google'])); return (string) $resp->getBody(); } /** * Get the quota project used for this API request * * @return string|null */ public function getQuotaProject() { return $this->quotaProject; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Credentials/UserRefreshCredentials.php000064400000007744147600374260026015 0ustar00auth = new OAuth2(['clientId' => $jsonKey['client_id'], 'clientSecret' => $jsonKey['client_secret'], 'refresh_token' => $jsonKey['refresh_token'], 'scope' => $scope, 'tokenCredentialUri' => self::TOKEN_CREDENTIAL_URI]); if (\array_key_exists('quota_project_id', $jsonKey)) { $this->quotaProject = (string) $jsonKey['quota_project_id']; } } /** * @param callable $httpHandler * * @return array A set of auth related metadata, containing the following * keys: * - access_token (string) * - expires_in (int) * - scope (string) * - token_type (string) * - id_token (string) */ public function fetchAuthToken(callable $httpHandler = null) { return $this->auth->fetchAuthToken($httpHandler); } /** * @return string */ public function getCacheKey() { return $this->auth->getClientId() . ':' . $this->auth->getCacheKey(); } /** * @return array */ public function getLastReceivedToken() { return $this->auth->getLastReceivedToken(); } /** * Get the quota project used for this API request * * @return string|null */ public function getQuotaProject() { return $this->quotaProject; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/HttpHandler/Guzzle6HttpHandler.php000064400000003466147600374260025063 0ustar00client = $client; } /** * Accepts a PSR-7 request and an array of options and returns a PSR-7 response. * * @param RequestInterface $request * @param array $options * @return ResponseInterface */ public function __invoke(RequestInterface $request, array $options = []) { return $this->client->send($request, $options); } /** * Accepts a PSR-7 request and an array of options and returns a PromiseInterface * * @param RequestInterface $request * @param array $options * * @return \VendorDuplicator\GuzzleHttp\Promise\PromiseInterface */ public function async(RequestInterface $request, array $options = []) { return $this->client->sendAsync($request, $options); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/HttpHandler/Guzzle7HttpHandler.php000064400000001310147600374260025046 0ustar00client = $client; } /** * Accepts a PSR-7 Request and an array of options and returns a PSR-7 response. * * @param RequestInterface $request * @param array $options * @return ResponseInterface */ public function __invoke(RequestInterface $request, array $options = []) { $response = $this->client->send($this->createGuzzle5Request($request, $options)); return $this->createPsr7Response($response); } /** * Accepts a PSR-7 request and an array of options and returns a PromiseInterface * * @param RequestInterface $request * @param array $options * @return Promise */ public function async(RequestInterface $request, array $options = []) { if (!\class_exists('VendorDuplicator\\GuzzleHttp\\Promise\\Promise')) { throw new Exception('Install guzzlehttp/promises to use async with Guzzle 5'); } $futureResponse = $this->client->send($this->createGuzzle5Request($request, ['future' => \true] + $options)); $promise = new Promise(function () use($futureResponse) { try { $futureResponse->wait(); } catch (Exception $e) { // The promise is already delivered when the exception is // thrown, so don't rethrow it. } }, [$futureResponse, 'cancel']); $futureResponse->then([$promise, 'resolve'], [$promise, 'reject']); return $promise->then(function (Guzzle5ResponseInterface $response) { // Adapt the Guzzle 5 Response to a PSR-7 Response. return $this->createPsr7Response($response); }, function (Exception $e) { return new RejectedPromise($e); }); } private function createGuzzle5Request(RequestInterface $request, array $options) { return $this->client->createRequest($request->getMethod(), $request->getUri(), \array_merge_recursive(['headers' => $request->getHeaders(), 'body' => $request->getBody()], $options)); } private function createPsr7Response(Guzzle5ResponseInterface $response) { return new Response($response->getStatusCode(), $response->getHeaders() ?: [], $response->getBody(), $response->getProtocolVersion(), $response->getReasonPhrase()); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/HttpHandler/HttpHandlerFactory.php000064400000003457147600374260025124 0ustar00' */ class AuthTokenMiddleware { /** * @var callback */ private $httpHandler; /** * @var FetchAuthTokenInterface */ private $fetcher; /** * @var callable */ private $tokenCallback; /** * Creates a new AuthTokenMiddleware. * * @param FetchAuthTokenInterface $fetcher is used to fetch the auth token * @param callable $httpHandler (optional) callback which delivers psr7 request * @param callable $tokenCallback (optional) function to be called when a new token is fetched. */ public function __construct(FetchAuthTokenInterface $fetcher, callable $httpHandler = null, callable $tokenCallback = null) { $this->fetcher = $fetcher; $this->httpHandler = $httpHandler; $this->tokenCallback = $tokenCallback; } /** * Updates the request with an Authorization header when auth is 'google_auth'. * * use Google\Auth\Middleware\AuthTokenMiddleware; * use Google\Auth\OAuth2; * use GuzzleHttp\Client; * use GuzzleHttp\HandlerStack; * * $config = [...]; * $oauth2 = new OAuth2($config) * $middleware = new AuthTokenMiddleware($oauth2); * $stack = HandlerStack::create(); * $stack->push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'auth' => 'google_auth' // authorize all requests * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); * * @param callable $handler * @return \Closure */ public function __invoke(callable $handler) { return function (RequestInterface $request, array $options) use($handler) { // Requests using "auth"="google_auth" will be authorized. if (!isset($options['auth']) || $options['auth'] !== 'google_auth') { return $handler($request, $options); } $request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken()); if ($quotaProject = $this->getQuotaProject()) { $request = $request->withHeader(GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, $quotaProject); } return $handler($request, $options); }; } /** * Call fetcher to fetch the token. * * @return string */ private function fetchToken() { $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler); if (\array_key_exists('access_token', $auth_tokens)) { // notify the callback if applicable if ($this->tokenCallback) { \call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); } return $auth_tokens['access_token']; } if (\array_key_exists('id_token', $auth_tokens)) { return $auth_tokens['id_token']; } } private function getQuotaProject() { if ($this->fetcher instanceof GetQuotaProjectInterface) { return $this->fetcher->getQuotaProject(); } } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Middleware/ProxyAuthTokenMiddleware.php000064400000010702147600374260026150 0ustar00' */ class ProxyAuthTokenMiddleware { /** * @var callback */ private $httpHandler; /** * @var FetchAuthTokenInterface */ private $fetcher; /** * @var callable */ private $tokenCallback; /** * Creates a new ProxyAuthTokenMiddleware. * * @param FetchAuthTokenInterface $fetcher is used to fetch the auth token * @param callable $httpHandler (optional) callback which delivers psr7 request * @param callable $tokenCallback (optional) function to be called when a new token is fetched. */ public function __construct(FetchAuthTokenInterface $fetcher, callable $httpHandler = null, callable $tokenCallback = null) { $this->fetcher = $fetcher; $this->httpHandler = $httpHandler; $this->tokenCallback = $tokenCallback; } /** * Updates the request with an Authorization header when auth is 'google_auth'. * * use Google\Auth\Middleware\ProxyAuthTokenMiddleware; * use Google\Auth\OAuth2; * use GuzzleHttp\Client; * use GuzzleHttp\HandlerStack; * * $config = [...]; * $oauth2 = new OAuth2($config) * $middleware = new ProxyAuthTokenMiddleware($oauth2); * $stack = HandlerStack::create(); * $stack->push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'proxy_auth' => 'google_auth' // authorize all requests * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); * * @param callable $handler * @return \Closure */ public function __invoke(callable $handler) { return function (RequestInterface $request, array $options) use($handler) { // Requests using "proxy_auth"="google_auth" will be authorized. if (!isset($options['proxy_auth']) || $options['proxy_auth'] !== 'google_auth') { return $handler($request, $options); } $request = $request->withHeader('proxy-authorization', 'Bearer ' . $this->fetchToken()); if ($quotaProject = $this->getQuotaProject()) { $request = $request->withHeader(GetQuotaProjectInterface::X_GOOG_USER_PROJECT_HEADER, $quotaProject); } return $handler($request, $options); }; } /** * Call fetcher to fetch the token. * * @return string */ private function fetchToken() { $auth_tokens = $this->fetcher->fetchAuthToken($this->httpHandler); if (\array_key_exists('access_token', $auth_tokens)) { // notify the callback if applicable if ($this->tokenCallback) { \call_user_func($this->tokenCallback, $this->fetcher->getCacheKey(), $auth_tokens['access_token']); } return $auth_tokens['access_token']; } if (\array_key_exists('id_token', $auth_tokens)) { return $auth_tokens['id_token']; } } private function getQuotaProject() { if ($this->fetcher instanceof GetQuotaProjectInterface) { return $this->fetcher->getQuotaProject(); } } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Middleware/SimpleMiddleware.php000064400000005505147600374260024442 0ustar00config = \array_merge(['key' => null], $config); } /** * Updates the request query with the developer key if auth is set to simple. * * use Google\Auth\Middleware\SimpleMiddleware; * use GuzzleHttp\Client; * use GuzzleHttp\HandlerStack; * * $my_key = 'is not the same as yours'; * $middleware = new SimpleMiddleware(['key' => $my_key]); * $stack = HandlerStack::create(); * $stack->push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/discovery/v1/', * 'auth' => 'simple' * ]); * * $res = $client->get('drive/v2/rest'); * * @param callable $handler * @return \Closure */ public function __invoke(callable $handler) { return function (RequestInterface $request, array $options) use($handler) { // Requests using "auth"="scoped" will be authorized. if (!isset($options['auth']) || $options['auth'] !== 'simple') { return $handler($request, $options); } $query = Query::parse($request->getUri()->getQuery()); $params = \array_merge($query, $this->config); $uri = $request->getUri()->withQuery(Query::build($params)); $request = $request->withUri($uri); return $handler($request, $options); }; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Middleware/ScopedAccessTokenMiddleware.php000064400000011673147600374260026554 0ustar00' */ class ScopedAccessTokenMiddleware { use CacheTrait; const DEFAULT_CACHE_LIFETIME = 1500; /** * @var CacheItemPoolInterface */ private $cache; /** * @var array configuration */ private $cacheConfig; /** * @var callable */ private $tokenFunc; /** * @var array|string */ private $scopes; /** * Creates a new ScopedAccessTokenMiddleware. * * @param callable $tokenFunc a token generator function * @param array|string $scopes the token authentication scopes * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache an implementation of CacheItemPoolInterface */ public function __construct(callable $tokenFunc, $scopes, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $this->tokenFunc = $tokenFunc; if (!(\is_string($scopes) || \is_array($scopes))) { throw new \InvalidArgumentException('wants scope should be string or array'); } $this->scopes = $scopes; if (!\is_null($cache)) { $this->cache = $cache; $this->cacheConfig = \array_merge(['lifetime' => self::DEFAULT_CACHE_LIFETIME, 'prefix' => ''], $cacheConfig); } } /** * Updates the request with an Authorization header when auth is 'scoped'. * * E.g this could be used to authenticate using the AppEngine * AppIdentityService. * * use google\appengine\api\app_identity\AppIdentityService; * use Google\Auth\Middleware\ScopedAccessTokenMiddleware; * use GuzzleHttp\Client; * use GuzzleHttp\HandlerStack; * * $scope = 'https://www.googleapis.com/auth/taskqueue' * $middleware = new ScopedAccessTokenMiddleware( * 'AppIdentityService::getAccessToken', * $scope, * [ 'prefix' => 'VendorDuplicator\\Google\Auth\ScopedAccessToken::' ], * $cache = new Memcache() * ); * $stack = HandlerStack::create(); * $stack->push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_url' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'auth' => 'scoped' // authorize all requests * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); * * @param callable $handler * @return \Closure */ public function __invoke(callable $handler) { return function (RequestInterface $request, array $options) use($handler) { // Requests using "auth"="scoped" will be authorized. if (!isset($options['auth']) || $options['auth'] !== 'scoped') { return $handler($request, $options); } $request = $request->withHeader('authorization', 'Bearer ' . $this->fetchToken()); return $handler($request, $options); }; } /** * @return string */ private function getCacheKey() { $key = null; if (\is_string($this->scopes)) { $key .= $this->scopes; } elseif (\is_array($this->scopes)) { $key .= \implode(':', $this->scopes); } return $key; } /** * Determine if token is available in the cache, if not call tokenFunc to * fetch it. * * @return string */ private function fetchToken() { $cacheKey = $this->getCacheKey(); $cached = $this->getCachedValue($cacheKey); if (!empty($cached)) { return $cached; } $token = \call_user_func($this->tokenFunc, $this->scopes); $this->setCachedValue($cacheKey, $token); return $token; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/Iam.php000064400000006032147600374260017640 0ustar00httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); } /** * Sign a string using the IAM signBlob API. * * Note that signing using IAM requires your service account to have the * `iam.serviceAccounts.signBlob` permission, part of the "Service Account * Token Creator" IAM role. * * @param string $email The service account email. * @param string $accessToken An access token from the service account. * @param string $stringToSign The string to be signed. * @param array $delegates [optional] A list of service account emails to * add to the delegate chain. If omitted, the value of `$email` will * be used. * @return string The signed string, base64-encoded. */ public function signBlob($email, $accessToken, $stringToSign, array $delegates = []) { $httpHandler = $this->httpHandler; $name = \sprintf(self::SERVICE_ACCOUNT_NAME, $email); $uri = self::IAM_API_ROOT . '/' . \sprintf(self::SIGN_BLOB_PATH, $name); if ($delegates) { foreach ($delegates as &$delegate) { $delegate = \sprintf(self::SERVICE_ACCOUNT_NAME, $delegate); } } else { $delegates = [$name]; } $body = ['delegates' => $delegates, 'payload' => \base64_encode($stringToSign)]; $headers = ['Authorization' => 'Bearer ' . $accessToken]; $request = new Psr7\Request('POST', $uri, $headers, Utils::streamFor(\json_encode($body))); $res = $httpHandler($request); $body = \json_decode((string) $res->getBody(), \true); return $body['signedBlob']; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/CredentialsLoader.php000064400000023673147600374260022530 0ustar00setDefaultOption('auth', 'google_auth'); $subscriber = new Subscriber\AuthTokenSubscriber($fetcher, $httpHandler, $tokenCallback); $client->getEmitter()->attach($subscriber); return $client; } $middleware = new Middleware\AuthTokenMiddleware($fetcher, $httpHandler, $tokenCallback); $stack = \VendorDuplicator\GuzzleHttp\HandlerStack::create(); $stack->push($middleware); return new \VendorDuplicator\GuzzleHttp\Client(['handler' => $stack, 'auth' => 'google_auth'] + $httpClientOptions); } /** * Create a new instance of InsecureCredentials. * * @return InsecureCredentials */ public static function makeInsecureCredentials() { return new InsecureCredentials(); } /** * export a callback function which updates runtime metadata. * * @return array updateMetadata function * @deprecated */ public function getUpdateMetadataFunc() { return array($this, 'updateMetadata'); } /** * Updates metadata with the authorization token. * * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request * @return array updated metadata hashmap */ public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null) { if (isset($metadata[self::AUTH_METADATA_KEY])) { // Auth metadata has already been set return $metadata; } $result = $this->fetchAuthToken($httpHandler); if (!isset($result['access_token'])) { return $metadata; } $metadata_copy = $metadata; $metadata_copy[self::AUTH_METADATA_KEY] = array('Bearer ' . $result['access_token']); return $metadata_copy; } /** * Gets a callable which returns the default device certification. * * @throws UnexpectedValueException * @return callable|null */ public static function getDefaultClientCertSource() { if (!($clientCertSourceJson = self::loadDefaultClientCertSourceFile())) { return null; } $clientCertSourceCmd = $clientCertSourceJson['cert_provider_command']; return function () use($clientCertSourceCmd) { $cmd = \array_map('escapeshellarg', $clientCertSourceCmd); \exec(\implode(' ', $cmd), $output, $returnVar); if (0 === $returnVar) { return \implode(\PHP_EOL, $output); } throw new RuntimeException('"cert_provider_command" failed with a nonzero exit code'); }; } /** * Determines whether or not the default device certificate should be loaded. * * @return bool */ public static function shouldLoadClientCertSource() { return \filter_var(\getenv(self::MTLS_CERT_ENV_VAR), \FILTER_VALIDATE_BOOLEAN); } private static function loadDefaultClientCertSourceFile() { $rootEnv = self::isOnWindows() ? 'APPDATA' : 'HOME'; $path = \sprintf('%s/%s', \getenv($rootEnv), self::MTLS_WELL_KNOWN_PATH); if (!\file_exists($path)) { return null; } $jsonKey = \file_get_contents($path); $clientCertSourceJson = \json_decode($jsonKey, \true); if (!$clientCertSourceJson) { throw new UnexpectedValueException('Invalid client cert source JSON'); } if (!isset($clientCertSourceJson['cert_provider_command'])) { throw new UnexpectedValueException('cert source requires "cert_provider_command"'); } if (!\is_array($clientCertSourceJson['cert_provider_command'])) { throw new UnexpectedValueException('cert source expects "cert_provider_command" to be an array'); } return $clientCertSourceJson; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/GCECache.php000064400000004657147600374260020467 0ustar00cache = $cache; $this->cacheConfig = \array_merge(['lifetime' => 1500, 'prefix' => ''], (array) $cacheConfig); } /** * Caches the result of onGce so the metadata server is not called multiple * times. * * @param callable $httpHandler callback which delivers psr7 request * @return bool True if this a GCEInstance, false otherwise */ public function onGce(callable $httpHandler = null) { if (\is_null($this->cache)) { return GCECredentials::onGce($httpHandler); } $cacheKey = self::GCE_CACHE_KEY; $onGce = $this->getCachedValue($cacheKey); if (\is_null($onGce)) { $onGce = GCECredentials::onGce($httpHandler); $this->setCachedValue($cacheKey, $onGce); } return $onGce; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/ServiceAccountSignerTrait.php000064400000003551147600374260024226 0ustar00auth->getSigningKey(); $signedString = ''; if (\class_exists('VendorDuplicator\\phpseclib\\Crypt\\RSA') && !$forceOpenssl) { $rsa = new RSA(); $rsa->loadKey($privateKey); $rsa->setSignatureMode(RSA::SIGNATURE_PKCS1); $rsa->setHash('sha256'); $signedString = $rsa->sign($stringToSign); } elseif (\extension_loaded('openssl')) { \openssl_sign($stringToSign, $signedString, $privateKey, 'sha256WithRSAEncryption'); } else { // @codeCoverageIgnoreStart throw new \RuntimeException('OpenSSL is not installed.'); } // @codeCoverageIgnoreEnd return \base64_encode($signedString); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/GetQuotaProjectInterface.php000064400000001703147600374260024033 0ustar00cache)) { return; } $key = $this->getFullCacheKey($k); if (\is_null($key)) { return; } $cacheItem = $this->cache->getItem($key); if ($cacheItem->isHit()) { return $cacheItem->get(); } } /** * Saves the value in the cache when that is available. */ private function setCachedValue($k, $v) { if (\is_null($this->cache)) { return; } $key = $this->getFullCacheKey($k); if (\is_null($key)) { return; } $cacheItem = $this->cache->getItem($key); $cacheItem->set($v); $cacheItem->expiresAfter($this->cacheConfig['lifetime']); return $this->cache->save($cacheItem); } private function getFullCacheKey($key) { if (\is_null($key)) { return; } $key = $this->cacheConfig['prefix'] . $key; // ensure we do not have illegal characters $key = \preg_replace('|[^a-zA-Z0-9_\\.!]|', '', $key); // Hash keys if they exceed $maxKeyLength (defaults to 64) if ($this->maxKeyLength && \strlen($key) > $this->maxKeyLength) { $key = \substr(\hash('sha256', $key), 0, $this->maxKeyLength); } return $key; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/OAuth2.php000064400000106015147600374260020236 0ustar00 self::DEFAULT_EXPIRY_SECONDS, 'extensionParams' => [], 'authorizationUri' => null, 'redirectUri' => null, 'tokenCredentialUri' => null, 'state' => null, 'username' => null, 'password' => null, 'clientId' => null, 'clientSecret' => null, 'issuer' => null, 'sub' => null, 'audience' => null, 'signingKey' => null, 'signingKeyId' => null, 'signingAlgorithm' => null, 'scope' => null, 'additionalClaims' => []], $config); $this->setAuthorizationUri($opts['authorizationUri']); $this->setRedirectUri($opts['redirectUri']); $this->setTokenCredentialUri($opts['tokenCredentialUri']); $this->setState($opts['state']); $this->setUsername($opts['username']); $this->setPassword($opts['password']); $this->setClientId($opts['clientId']); $this->setClientSecret($opts['clientSecret']); $this->setIssuer($opts['issuer']); $this->setSub($opts['sub']); $this->setExpiry($opts['expiry']); $this->setAudience($opts['audience']); $this->setSigningKey($opts['signingKey']); $this->setSigningKeyId($opts['signingKeyId']); $this->setSigningAlgorithm($opts['signingAlgorithm']); $this->setScope($opts['scope']); $this->setExtensionParams($opts['extensionParams']); $this->setAdditionalClaims($opts['additionalClaims']); $this->updateToken($opts); } /** * Verifies the idToken if present. * * - if none is present, return null * - if present, but invalid, raises DomainException. * - otherwise returns the payload in the idtoken as a PHP object. * * The behavior of this method varies depending on the version of * `firebase/php-jwt` you are using. In versions lower than 3.0.0, if * `$publicKey` is null, the key is decoded without being verified. In * newer versions, if a public key is not given, this method will throw an * `\InvalidArgumentException`. * * @param string $publicKey The public key to use to authenticate the token * @param array $allowed_algs List of supported verification algorithms * @throws \DomainException if the token is missing an audience. * @throws \DomainException if the audience does not match the one set in * the OAuth2 class instance. * @throws \UnexpectedValueException If the token is invalid * @throws SignatureInvalidException If the signature is invalid. * @throws BeforeValidException If the token is not yet valid. * @throws ExpiredException If the token has expired. * @return null|object */ public function verifyIdToken($publicKey = null, $allowed_algs = array()) { $idToken = $this->getIdToken(); if (\is_null($idToken)) { return null; } $resp = $this->jwtDecode($idToken, $publicKey, $allowed_algs); if (!\property_exists($resp, 'aud')) { throw new \DomainException('No audience found the id token'); } if ($resp->aud != $this->getAudience()) { throw new \DomainException('Wrong audience present in the id token'); } return $resp; } /** * Obtains the encoded jwt from the instance data. * * @param array $config array optional configuration parameters * @return string */ public function toJwt(array $config = []) { if (\is_null($this->getSigningKey())) { throw new \DomainException('No signing key available'); } if (\is_null($this->getSigningAlgorithm())) { throw new \DomainException('No signing algorithm specified'); } $now = \time(); $opts = \array_merge(['skew' => self::DEFAULT_SKEW_SECONDS], $config); $assertion = ['iss' => $this->getIssuer(), 'exp' => $now + $this->getExpiry(), 'iat' => $now - $opts['skew']]; foreach ($assertion as $k => $v) { if (\is_null($v)) { throw new \DomainException($k . ' should not be null'); } } if (!\is_null($this->getAudience())) { $assertion['aud'] = $this->getAudience(); } if (!\is_null($this->getScope())) { $assertion['scope'] = $this->getScope(); } if (empty($assertion['scope']) && empty($assertion['aud'])) { throw new \DomainException('one of scope or aud should not be null'); } if (!\is_null($this->getSub())) { $assertion['sub'] = $this->getSub(); } $assertion += $this->getAdditionalClaims(); return $this->jwtEncode($assertion, $this->getSigningKey(), $this->getSigningAlgorithm(), $this->getSigningKeyId()); } /** * Generates a request for token credentials. * * @return RequestInterface the authorization Url. */ public function generateCredentialsRequest() { $uri = $this->getTokenCredentialUri(); if (\is_null($uri)) { throw new \DomainException('No token credential URI was set.'); } $grantType = $this->getGrantType(); $params = array('grant_type' => $grantType); switch ($grantType) { case 'authorization_code': $params['code'] = $this->getCode(); $params['redirect_uri'] = $this->getRedirectUri(); $this->addClientCredentials($params); break; case 'password': $params['username'] = $this->getUsername(); $params['password'] = $this->getPassword(); $this->addClientCredentials($params); break; case 'refresh_token': $params['refresh_token'] = $this->getRefreshToken(); $this->addClientCredentials($params); break; case self::JWT_URN: $params['assertion'] = $this->toJwt(); break; default: if (!\is_null($this->getRedirectUri())) { # Grant type was supposed to be 'authorization_code', as there # is a redirect URI. throw new \DomainException('Missing authorization code'); } unset($params['grant_type']); if (!\is_null($grantType)) { $params['grant_type'] = $grantType; } $params = \array_merge($params, $this->getExtensionParams()); } $headers = ['Cache-Control' => 'no-store', 'Content-Type' => 'application/x-www-form-urlencoded']; return new Request('POST', $uri, $headers, Query::build($params)); } /** * Fetches the auth tokens based on the current state. * * @param callable $httpHandler callback which delivers psr7 request * @return array the response */ public function fetchAuthToken(callable $httpHandler = null) { if (\is_null($httpHandler)) { $httpHandler = HttpHandlerFactory::build(HttpClientCache::getHttpClient()); } $response = $httpHandler($this->generateCredentialsRequest()); $credentials = $this->parseTokenResponse($response); $this->updateToken($credentials); return $credentials; } /** * Obtains a key that can used to cache the results of #fetchAuthToken. * * The key is derived from the scopes. * * @return string a key that may be used to cache the auth token. */ public function getCacheKey() { if (\is_array($this->scope)) { return \implode(':', $this->scope); } if ($this->audience) { return $this->audience; } // If scope has not set, return null to indicate no caching. return null; } /** * Parses the fetched tokens. * * @param ResponseInterface $resp the response. * @return array the tokens parsed from the response body. * @throws \Exception */ public function parseTokenResponse(ResponseInterface $resp) { $body = (string) $resp->getBody(); if ($resp->hasHeader('Content-Type') && $resp->getHeaderLine('Content-Type') == 'application/x-www-form-urlencoded') { $res = array(); \parse_str($body, $res); return $res; } // Assume it's JSON; if it's not throw an exception if (null === ($res = \json_decode($body, \true))) { throw new \Exception('Invalid JSON response'); } return $res; } /** * Updates an OAuth 2.0 client. * * Example: * ``` * $oauth->updateToken([ * 'refresh_token' => 'n4E9O119d', * 'access_token' => 'FJQbwq9', * 'expires_in' => 3600 * ]); * ``` * * @param array $config * The configuration parameters related to the token. * * - refresh_token * The refresh token associated with the access token * to be refreshed. * * - access_token * The current access token for this client. * * - id_token * The current ID token for this client. * * - expires_in * The time in seconds until access token expiration. * * - expires_at * The time as an integer number of seconds since the Epoch * * - issued_at * The timestamp that the token was issued at. */ public function updateToken(array $config) { $opts = \array_merge(['extensionParams' => [], 'access_token' => null, 'id_token' => null, 'expires_in' => null, 'expires_at' => null, 'issued_at' => null], $config); $this->setExpiresAt($opts['expires_at']); $this->setExpiresIn($opts['expires_in']); // By default, the token is issued at `Time.now` when `expiresIn` is set, // but this can be used to supply a more precise time. if (!\is_null($opts['issued_at'])) { $this->setIssuedAt($opts['issued_at']); } $this->setAccessToken($opts['access_token']); $this->setIdToken($opts['id_token']); // The refresh token should only be updated if a value is explicitly // passed in, as some access token responses do not include a refresh // token. if (\array_key_exists('refresh_token', $opts)) { $this->setRefreshToken($opts['refresh_token']); } } /** * Builds the authorization Uri that the user should be redirected to. * * @param array $config configuration options that customize the return url * @return UriInterface the authorization Url. * @throws InvalidArgumentException */ public function buildFullAuthorizationUri(array $config = []) { if (\is_null($this->getAuthorizationUri())) { throw new InvalidArgumentException('requires an authorizationUri to have been set'); } $params = \array_merge(['response_type' => 'code', 'access_type' => 'offline', 'client_id' => $this->clientId, 'redirect_uri' => $this->redirectUri, 'state' => $this->state, 'scope' => $this->getScope()], $config); // Validate the auth_params if (\is_null($params['client_id'])) { throw new InvalidArgumentException('missing the required client identifier'); } if (\is_null($params['redirect_uri'])) { throw new InvalidArgumentException('missing the required redirect URI'); } if (!empty($params['prompt']) && !empty($params['approval_prompt'])) { throw new InvalidArgumentException('prompt and approval_prompt are mutually exclusive'); } // Construct the uri object; return it if it is valid. $result = clone $this->authorizationUri; $existingParams = Query::parse($result->getQuery()); $result = $result->withQuery(Query::build(\array_merge($existingParams, $params))); if ($result->getScheme() != 'https') { throw new InvalidArgumentException('Authorization endpoint must be protected by TLS'); } return $result; } /** * Sets the authorization server's HTTP endpoint capable of authenticating * the end-user and obtaining authorization. * * @param string $uri */ public function setAuthorizationUri($uri) { $this->authorizationUri = $this->coerceUri($uri); } /** * Gets the authorization server's HTTP endpoint capable of authenticating * the end-user and obtaining authorization. * * @return UriInterface */ public function getAuthorizationUri() { return $this->authorizationUri; } /** * Gets the authorization server's HTTP endpoint capable of issuing tokens * and refreshing expired tokens. * * @return string */ public function getTokenCredentialUri() { return $this->tokenCredentialUri; } /** * Sets the authorization server's HTTP endpoint capable of issuing tokens * and refreshing expired tokens. * * @param string $uri */ public function setTokenCredentialUri($uri) { $this->tokenCredentialUri = $this->coerceUri($uri); } /** * Gets the redirection URI used in the initial request. * * @return string */ public function getRedirectUri() { return $this->redirectUri; } /** * Sets the redirection URI used in the initial request. * * @param string $uri */ public function setRedirectUri($uri) { if (\is_null($uri)) { $this->redirectUri = null; return; } // redirect URI must be absolute if (!$this->isAbsoluteUri($uri)) { // "postmessage" is a reserved URI string in Google-land // @see https://developers.google.com/identity/sign-in/web/server-side-flow if ('postmessage' !== (string) $uri) { throw new InvalidArgumentException('Redirect URI must be absolute'); } } $this->redirectUri = (string) $uri; } /** * Gets the scope of the access requests as a space-delimited String. * * @return string */ public function getScope() { if (\is_null($this->scope)) { return $this->scope; } return \implode(' ', $this->scope); } /** * Sets the scope of the access request, expressed either as an Array or as * a space-delimited String. * * @param string|array $scope * @throws InvalidArgumentException */ public function setScope($scope) { if (\is_null($scope)) { $this->scope = null; } elseif (\is_string($scope)) { $this->scope = \explode(' ', $scope); } elseif (\is_array($scope)) { foreach ($scope as $s) { $pos = \strpos($s, ' '); if ($pos !== \false) { throw new InvalidArgumentException('array scope values should not contain spaces'); } } $this->scope = $scope; } else { throw new InvalidArgumentException('scopes should be a string or array of strings'); } } /** * Gets the current grant type. * * @return string */ public function getGrantType() { if (!\is_null($this->grantType)) { return $this->grantType; } // Returns the inferred grant type, based on the current object instance // state. if (!\is_null($this->code)) { return 'authorization_code'; } if (!\is_null($this->refreshToken)) { return 'refresh_token'; } if (!\is_null($this->username) && !\is_null($this->password)) { return 'password'; } if (!\is_null($this->issuer) && !\is_null($this->signingKey)) { return self::JWT_URN; } return null; } /** * Sets the current grant type. * * @param $grantType * @throws InvalidArgumentException */ public function setGrantType($grantType) { if (\in_array($grantType, self::$knownGrantTypes)) { $this->grantType = $grantType; } else { // validate URI if (!$this->isAbsoluteUri($grantType)) { throw new InvalidArgumentException('invalid grant type'); } $this->grantType = (string) $grantType; } } /** * Gets an arbitrary string designed to allow the client to maintain state. * * @return string */ public function getState() { return $this->state; } /** * Sets an arbitrary string designed to allow the client to maintain state. * * @param string $state */ public function setState($state) { $this->state = $state; } /** * Gets the authorization code issued to this client. */ public function getCode() { return $this->code; } /** * Sets the authorization code issued to this client. * * @param string $code */ public function setCode($code) { $this->code = $code; } /** * Gets the resource owner's username. */ public function getUsername() { return $this->username; } /** * Sets the resource owner's username. * * @param string $username */ public function setUsername($username) { $this->username = $username; } /** * Gets the resource owner's password. */ public function getPassword() { return $this->password; } /** * Sets the resource owner's password. * * @param $password */ public function setPassword($password) { $this->password = $password; } /** * Sets a unique identifier issued to the client to identify itself to the * authorization server. */ public function getClientId() { return $this->clientId; } /** * Sets a unique identifier issued to the client to identify itself to the * authorization server. * * @param $clientId */ public function setClientId($clientId) { $this->clientId = $clientId; } /** * Gets a shared symmetric secret issued by the authorization server, which * is used to authenticate the client. */ public function getClientSecret() { return $this->clientSecret; } /** * Sets a shared symmetric secret issued by the authorization server, which * is used to authenticate the client. * * @param $clientSecret */ public function setClientSecret($clientSecret) { $this->clientSecret = $clientSecret; } /** * Gets the Issuer ID when using assertion profile. */ public function getIssuer() { return $this->issuer; } /** * Sets the Issuer ID when using assertion profile. * * @param string $issuer */ public function setIssuer($issuer) { $this->issuer = $issuer; } /** * Gets the target sub when issuing assertions. */ public function getSub() { return $this->sub; } /** * Sets the target sub when issuing assertions. * * @param string $sub */ public function setSub($sub) { $this->sub = $sub; } /** * Gets the target audience when issuing assertions. */ public function getAudience() { return $this->audience; } /** * Sets the target audience when issuing assertions. * * @param string $audience */ public function setAudience($audience) { $this->audience = $audience; } /** * Gets the signing key when using an assertion profile. */ public function getSigningKey() { return $this->signingKey; } /** * Sets the signing key when using an assertion profile. * * @param string $signingKey */ public function setSigningKey($signingKey) { $this->signingKey = $signingKey; } /** * Gets the signing key id when using an assertion profile. * * @return string */ public function getSigningKeyId() { return $this->signingKeyId; } /** * Sets the signing key id when using an assertion profile. * * @param string $signingKeyId */ public function setSigningKeyId($signingKeyId) { $this->signingKeyId = $signingKeyId; } /** * Gets the signing algorithm when using an assertion profile. * * @return string */ public function getSigningAlgorithm() { return $this->signingAlgorithm; } /** * Sets the signing algorithm when using an assertion profile. * * @param string $signingAlgorithm */ public function setSigningAlgorithm($signingAlgorithm) { if (\is_null($signingAlgorithm)) { $this->signingAlgorithm = null; } elseif (!\in_array($signingAlgorithm, self::$knownSigningAlgorithms)) { throw new InvalidArgumentException('unknown signing algorithm'); } else { $this->signingAlgorithm = $signingAlgorithm; } } /** * Gets the set of parameters used by extension when using an extension * grant type. */ public function getExtensionParams() { return $this->extensionParams; } /** * Sets the set of parameters used by extension when using an extension * grant type. * * @param $extensionParams */ public function setExtensionParams($extensionParams) { $this->extensionParams = $extensionParams; } /** * Gets the number of seconds assertions are valid for. */ public function getExpiry() { return $this->expiry; } /** * Sets the number of seconds assertions are valid for. * * @param int $expiry */ public function setExpiry($expiry) { $this->expiry = $expiry; } /** * Gets the lifetime of the access token in seconds. */ public function getExpiresIn() { return $this->expiresIn; } /** * Sets the lifetime of the access token in seconds. * * @param int $expiresIn */ public function setExpiresIn($expiresIn) { if (\is_null($expiresIn)) { $this->expiresIn = null; $this->issuedAt = null; } else { $this->issuedAt = \time(); $this->expiresIn = (int) $expiresIn; } } /** * Gets the time the current access token expires at. * * @return int */ public function getExpiresAt() { if (!\is_null($this->expiresAt)) { return $this->expiresAt; } if (!\is_null($this->issuedAt) && !\is_null($this->expiresIn)) { return $this->issuedAt + $this->expiresIn; } return null; } /** * Returns true if the acccess token has expired. * * @return bool */ public function isExpired() { $expiration = $this->getExpiresAt(); $now = \time(); return !\is_null($expiration) && $now >= $expiration; } /** * Sets the time the current access token expires at. * * @param int $expiresAt */ public function setExpiresAt($expiresAt) { $this->expiresAt = $expiresAt; } /** * Gets the time the current access token was issued at. */ public function getIssuedAt() { return $this->issuedAt; } /** * Sets the time the current access token was issued at. * * @param int $issuedAt */ public function setIssuedAt($issuedAt) { $this->issuedAt = $issuedAt; } /** * Gets the current access token. */ public function getAccessToken() { return $this->accessToken; } /** * Sets the current access token. * * @param string $accessToken */ public function setAccessToken($accessToken) { $this->accessToken = $accessToken; } /** * Gets the current ID token. */ public function getIdToken() { return $this->idToken; } /** * Sets the current ID token. * * @param $idToken */ public function setIdToken($idToken) { $this->idToken = $idToken; } /** * Gets the refresh token associated with the current access token. */ public function getRefreshToken() { return $this->refreshToken; } /** * Sets the refresh token associated with the current access token. * * @param $refreshToken */ public function setRefreshToken($refreshToken) { $this->refreshToken = $refreshToken; } /** * Sets additional claims to be included in the JWT token * * @param array $additionalClaims */ public function setAdditionalClaims(array $additionalClaims) { $this->additionalClaims = $additionalClaims; } /** * Gets the additional claims to be included in the JWT token. * * @return array */ public function getAdditionalClaims() { return $this->additionalClaims; } /** * The expiration of the last received token. * * @return array|null */ public function getLastReceivedToken() { if ($token = $this->getAccessToken()) { // the bare necessity of an auth token $authToken = ['access_token' => $token, 'expires_at' => $this->getExpiresAt()]; } elseif ($idToken = $this->getIdToken()) { $authToken = ['id_token' => $idToken, 'expires_at' => $this->getExpiresAt()]; } else { return null; } if ($expiresIn = $this->getExpiresIn()) { $authToken['expires_in'] = $expiresIn; } if ($issuedAt = $this->getIssuedAt()) { $authToken['issued_at'] = $issuedAt; } if ($refreshToken = $this->getRefreshToken()) { $authToken['refresh_token'] = $refreshToken; } return $authToken; } /** * Get the client ID. * * Alias of {@see Google\Auth\OAuth2::getClientId()}. * * @param callable $httpHandler * @return string * @access private */ public function getClientName(callable $httpHandler = null) { return $this->getClientId(); } /** * @todo handle uri as array * * @param string $uri * @return null|UriInterface */ private function coerceUri($uri) { if (\is_null($uri)) { return; } return Utils::uriFor($uri); } /** * @param string $idToken * @param string|array|null $publicKey * @param array $allowedAlgs * @return object */ private function jwtDecode($idToken, $publicKey, $allowedAlgs) { return JWT::decode($idToken, $publicKey, $allowedAlgs); } private function jwtEncode($assertion, $signingKey, $signingAlgorithm, $signingKeyId = null) { return JWT::encode($assertion, $signingKey, $signingAlgorithm, $signingKeyId); } /** * Determines if the URI is absolute based on its scheme and host or path * (RFC 3986). * * @param string $uri * @return bool */ private function isAbsoluteUri($uri) { $uri = $this->coerceUri($uri); return $uri->getScheme() && ($uri->getHost() || $uri->getPath()); } /** * @param array $params * @return array */ private function addClientCredentials(&$params) { $clientId = $this->getClientId(); $clientSecret = $this->getClientSecret(); if ($clientId && $clientSecret) { $params['client_id'] = $clientId; $params['client_secret'] = $clientSecret; } return $params; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/SignBlobInterface.php000064400000003014147600374260022447 0ustar00fetcher = $fetcher; $this->cache = $cache; $this->cacheConfig = \array_merge(['lifetime' => 1500, 'prefix' => ''], (array) $cacheConfig); } /** * @return FetchAuthTokenInterface */ public function getFetcher() { return $this->fetcher; } /** * Implements FetchAuthTokenInterface#fetchAuthToken. * * Checks the cache for a valid auth token and fetches the auth tokens * from the supplied fetcher. * * @param callable $httpHandler callback which delivers psr7 request * @return array the response * @throws \Exception */ public function fetchAuthToken(callable $httpHandler = null) { if ($cached = $this->fetchAuthTokenFromCache()) { return $cached; } $auth_token = $this->fetcher->fetchAuthToken($httpHandler); $this->saveAuthTokenInCache($auth_token); return $auth_token; } /** * @return string */ public function getCacheKey() { return $this->getFullCacheKey($this->fetcher->getCacheKey()); } /** * @return array|null */ public function getLastReceivedToken() { return $this->fetcher->getLastReceivedToken(); } /** * Get the client name from the fetcher. * * @param callable $httpHandler An HTTP handler to deliver PSR7 requests. * @return string */ public function getClientName(callable $httpHandler = null) { if (!$this->fetcher instanceof SignBlobInterface) { throw new \RuntimeException('Credentials fetcher does not implement ' . 'VendorDuplicator\\Google\\Auth\\SignBlobInterface'); } return $this->fetcher->getClientName($httpHandler); } /** * Sign a blob using the fetcher. * * @param string $stringToSign The string to sign. * @param bool $forceOpenSsl Require use of OpenSSL for local signing. Does * not apply to signing done using external services. **Defaults to** * `false`. * @return string The resulting signature. * @throws \RuntimeException If the fetcher does not implement * `Google\Auth\SignBlobInterface`. */ public function signBlob($stringToSign, $forceOpenSsl = \false) { if (!$this->fetcher instanceof SignBlobInterface) { throw new \RuntimeException('Credentials fetcher does not implement ' . 'VendorDuplicator\\Google\\Auth\\SignBlobInterface'); } // Pass the access token from cache to GCECredentials for signing a blob. // This saves a call to the metadata server when a cached token exists. if ($this->fetcher instanceof Credentials\GCECredentials) { $cached = $this->fetchAuthTokenFromCache(); $accessToken = isset($cached['access_token']) ? $cached['access_token'] : null; return $this->fetcher->signBlob($stringToSign, $forceOpenSsl, $accessToken); } return $this->fetcher->signBlob($stringToSign, $forceOpenSsl); } /** * Get the quota project used for this API request from the credentials * fetcher. * * @return string|null */ public function getQuotaProject() { if ($this->fetcher instanceof GetQuotaProjectInterface) { return $this->fetcher->getQuotaProject(); } } /* * Get the Project ID from the fetcher. * * @param callable $httpHandler Callback which delivers psr7 request * @return string|null * @throws \RuntimeException If the fetcher does not implement * `Google\Auth\ProvidesProjectIdInterface`. */ public function getProjectId(callable $httpHandler = null) { if (!$this->fetcher instanceof ProjectIdProviderInterface) { throw new \RuntimeException('Credentials fetcher does not implement ' . 'VendorDuplicator\\Google\\Auth\\ProvidesProjectIdInterface'); } return $this->fetcher->getProjectId($httpHandler); } /** * Updates metadata with the authorization token. * * @param array $metadata metadata hashmap * @param string $authUri optional auth uri * @param callable $httpHandler callback which delivers psr7 request * @return array updated metadata hashmap * @throws \RuntimeException If the fetcher does not implement * `Google\Auth\UpdateMetadataInterface`. */ public function updateMetadata($metadata, $authUri = null, callable $httpHandler = null) { if (!$this->fetcher instanceof UpdateMetadataInterface) { throw new \RuntimeException('Credentials fetcher does not implement ' . 'VendorDuplicator\\Google\\Auth\\UpdateMetadataInterface'); } $cached = $this->fetchAuthTokenFromCache($authUri); if ($cached) { // Set the access token in the `Authorization` metadata header so // the downstream call to updateMetadata know they don't need to // fetch another token. if (isset($cached['access_token'])) { $metadata[self::AUTH_METADATA_KEY] = ['Bearer ' . $cached['access_token']]; } } $newMetadata = $this->fetcher->updateMetadata($metadata, $authUri, $httpHandler); if (!$cached && ($token = $this->fetcher->getLastReceivedToken())) { $this->saveAuthTokenInCache($token, $authUri); } return $newMetadata; } private function fetchAuthTokenFromCache($authUri = null) { // Use the cached value if its available. // // TODO: correct caching; update the call to setCachedValue to set the expiry // to the value returned with the auth token. // // TODO: correct caching; enable the cache to be cleared. // if $authUri is set, use it as the cache key $cacheKey = $authUri ? $this->getFullCacheKey($authUri) : $this->fetcher->getCacheKey(); $cached = $this->getCachedValue($cacheKey); if (\is_array($cached)) { if (empty($cached['expires_at'])) { // If there is no expiration data, assume token is not expired. // (for JwtAccess and ID tokens) return $cached; } if (\time() < $cached['expires_at']) { // access token is not expired return $cached; } } return null; } private function saveAuthTokenInCache($authToken, $authUri = null) { if (isset($authToken['access_token']) || isset($authToken['id_token'])) { // if $authUri is set, use it as the cache key $cacheKey = $authUri ? $this->getFullCacheKey($authUri) : $this->fetcher->getCacheKey(); $this->setCachedValue($cacheKey, $authToken); } } } addons/gdriveaddon/vendor-prefixed/google/auth/src/AccessToken.php000064400000041631147600374260021340 0ustar00httpHandler = $httpHandler ?: HttpHandlerFactory::build(HttpClientCache::getHttpClient()); $this->cache = $cache ?: new MemoryCacheItemPool(); } /** * Verifies an id token and returns the authenticated apiLoginTicket. * Throws an exception if the id token is not valid. * The audience parameter can be used to control which id tokens are * accepted. By default, the id token must have been issued to this OAuth2 client. * * @param string $token The JSON Web Token to be verified. * @param array $options [optional] Configuration options. * @param string $options.audience The indended recipient of the token. * @param string $options.issuer The intended issuer of the token. * @param string $options.cacheKey The cache key of the cached certs. Defaults to * the sha1 of $certsLocation if provided, otherwise is set to * "federated_signon_certs_v3". * @param string $options.certsLocation The location (remote or local) from which * to retrieve certificates, if not cached. This value should only be * provided in limited circumstances in which you are sure of the * behavior. * @param bool $options.throwException Whether the function should throw an * exception if the verification fails. This is useful for * determining the reason verification failed. * @return array|bool the token payload, if successful, or false if not. * @throws InvalidArgumentException If certs could not be retrieved from a local file. * @throws InvalidArgumentException If received certs are in an invalid format. * @throws InvalidArgumentException If the cert alg is not supported. * @throws RuntimeException If certs could not be retrieved from a remote location. * @throws UnexpectedValueException If the token issuer does not match. * @throws UnexpectedValueException If the token audience does not match. */ public function verify($token, array $options = []) { $audience = isset($options['audience']) ? $options['audience'] : null; $issuer = isset($options['issuer']) ? $options['issuer'] : null; $certsLocation = isset($options['certsLocation']) ? $options['certsLocation'] : self::FEDERATED_SIGNON_CERT_URL; $cacheKey = isset($options['cacheKey']) ? $options['cacheKey'] : $this->getCacheKeyFromCertLocation($certsLocation); $throwException = isset($options['throwException']) ? $options['throwException'] : \false; // for backwards compatibility // Check signature against each available cert. $certs = $this->getCerts($certsLocation, $cacheKey, $options); $alg = $this->determineAlg($certs); if (!\in_array($alg, ['RS256', 'ES256'])) { throw new InvalidArgumentException('unrecognized "alg" in certs, expected ES256 or RS256'); } try { if ($alg == 'RS256') { return $this->verifyRs256($token, $certs, $audience, $issuer); } return $this->verifyEs256($token, $certs, $audience, $issuer); } catch (ExpiredException $e) { // firebase/php-jwt 3+ } catch (\VendorDuplicator\ExpiredException $e) { // firebase/php-jwt 2 } catch (SignatureInvalidException $e) { // firebase/php-jwt 3+ } catch (\VendorDuplicator\SignatureInvalidException $e) { // firebase/php-jwt 2 } catch (InvalidTokenException $e) { // simplejwt } catch (DomainException $e) { } catch (InvalidArgumentException $e) { } catch (UnexpectedValueException $e) { } if ($throwException) { throw $e; } return \false; } /** * Identifies the expected algorithm to verify by looking at the "alg" key * of the provided certs. * * @param array $certs Certificate array according to the JWK spec (see * https://tools.ietf.org/html/rfc7517). * @return string The expected algorithm, such as "ES256" or "RS256". */ private function determineAlg(array $certs) { $alg = null; foreach ($certs as $cert) { if (empty($cert['alg'])) { throw new InvalidArgumentException('certs expects "alg" to be set'); } $alg = $alg ?: $cert['alg']; if ($alg != $cert['alg']) { throw new InvalidArgumentException('More than one alg detected in certs'); } } return $alg; } /** * Verifies an ES256-signed JWT. * * @param string $token The JSON Web Token to be verified. * @param array $certs Certificate array according to the JWK spec (see * https://tools.ietf.org/html/rfc7517). * @param string|null $audience If set, returns false if the provided * audience does not match the "aud" claim on the JWT. * @param string|null $issuer If set, returns false if the provided * issuer does not match the "iss" claim on the JWT. * @return array|bool the token payload, if successful, or false if not. */ private function verifyEs256($token, array $certs, $audience = null, $issuer = null) { $this->checkSimpleJwt(); $jwkset = new KeySet(); foreach ($certs as $cert) { $jwkset->add(KeyFactory::create($cert, 'php')); } // Validate the signature using the key set and ES256 algorithm. $jwt = $this->callSimpleJwtDecode([$token, $jwkset, 'ES256']); $payload = $jwt->getClaims(); if (isset($payload['aud'])) { if ($audience && $payload['aud'] != $audience) { throw new UnexpectedValueException('Audience does not match'); } } // @see https://cloud.google.com/iap/docs/signed-headers-howto#verifying_the_jwt_payload $issuer = $issuer ?: self::IAP_ISSUER; if (!isset($payload['iss']) || $payload['iss'] !== $issuer) { throw new UnexpectedValueException('Issuer does not match'); } return $payload; } /** * Verifies an RS256-signed JWT. * * @param string $token The JSON Web Token to be verified. * @param array $certs Certificate array according to the JWK spec (see * https://tools.ietf.org/html/rfc7517). * @param string|null $audience If set, returns false if the provided * audience does not match the "aud" claim on the JWT. * @param string|null $issuer If set, returns false if the provided * issuer does not match the "iss" claim on the JWT. * @return array|bool the token payload, if successful, or false if not. */ private function verifyRs256($token, array $certs, $audience = null, $issuer = null) { $this->checkAndInitializePhpsec(); $keys = []; foreach ($certs as $cert) { if (empty($cert['kid'])) { throw new InvalidArgumentException('certs expects "kid" to be set'); } if (empty($cert['n']) || empty($cert['e'])) { throw new InvalidArgumentException('RSA certs expects "n" and "e" to be set'); } $rsa = new RSA(); $rsa->loadKey(['n' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [$cert['n']]), 256), 'e' => new BigInteger($this->callJwtStatic('urlsafeB64Decode', [$cert['e']]), 256)]); // create an array of key IDs to certs for the JWT library $keys[$cert['kid']] = $rsa->getPublicKey(); } $payload = $this->callJwtStatic('decode', [$token, $keys, ['RS256']]); if (\property_exists($payload, 'aud')) { if ($audience && $payload->aud != $audience) { throw new UnexpectedValueException('Audience does not match'); } } // support HTTP and HTTPS issuers // @see https://developers.google.com/identity/sign-in/web/backend-auth $issuers = $issuer ? [$issuer] : [self::OAUTH2_ISSUER, self::OAUTH2_ISSUER_HTTPS]; if (!isset($payload->iss) || !\in_array($payload->iss, $issuers)) { throw new UnexpectedValueException('Issuer does not match'); } return (array) $payload; } /** * Revoke an OAuth2 access token or refresh token. This method will revoke the current access * token, if a token isn't provided. * * @param string|array $token The token (access token or a refresh token) that should be revoked. * @param array $options [optional] Configuration options. * @return bool Returns True if the revocation was successful, otherwise False. */ public function revoke($token, array $options = []) { if (\is_array($token)) { if (isset($token['refresh_token'])) { $token = $token['refresh_token']; } else { $token = $token['access_token']; } } $body = Utils::streamFor(\http_build_query(['token' => $token])); $request = new Request('POST', self::OAUTH2_REVOKE_URI, ['Cache-Control' => 'no-store', 'Content-Type' => 'application/x-www-form-urlencoded'], $body); $httpHandler = $this->httpHandler; $response = $httpHandler($request, $options); return $response->getStatusCode() == 200; } /** * Gets federated sign-on certificates to use for verifying identity tokens. * Returns certs as array structure, where keys are key ids, and values * are PEM encoded certificates. * * @param string $location The location from which to retrieve certs. * @param string $cacheKey The key under which to cache the retrieved certs. * @param array $options [optional] Configuration options. * @return array * @throws InvalidArgumentException If received certs are in an invalid format. */ private function getCerts($location, $cacheKey, array $options = []) { $cacheItem = $this->cache->getItem($cacheKey); $certs = $cacheItem ? $cacheItem->get() : null; $gotNewCerts = \false; if (!$certs) { $certs = $this->retrieveCertsFromLocation($location, $options); $gotNewCerts = \true; } if (!isset($certs['keys'])) { if ($location !== self::IAP_CERT_URL) { throw new InvalidArgumentException('federated sign-on certs expects "keys" to be set'); } throw new InvalidArgumentException('certs expects "keys" to be set'); } // Push caching off until after verifying certs are in a valid format. // Don't want to cache bad data. if ($gotNewCerts) { $cacheItem->expiresAt(new DateTime('+1 hour')); $cacheItem->set($certs); $this->cache->save($cacheItem); } return $certs['keys']; } /** * Retrieve and cache a certificates file. * * @param $url string location * @param array $options [optional] Configuration options. * @return array certificates * @throws InvalidArgumentException If certs could not be retrieved from a local file. * @throws RuntimeException If certs could not be retrieved from a remote location. */ private function retrieveCertsFromLocation($url, array $options = []) { // If we're retrieving a local file, just grab it. if (\strpos($url, 'http') !== 0) { if (!\file_exists($url)) { throw new InvalidArgumentException(\sprintf('Failed to retrieve verification certificates from path: %s.', $url)); } return \json_decode(\file_get_contents($url), \true); } $httpHandler = $this->httpHandler; $response = $httpHandler(new Request('GET', $url), $options); if ($response->getStatusCode() == 200) { return \json_decode((string) $response->getBody(), \true); } throw new RuntimeException(\sprintf('Failed to retrieve verification certificates: "%s".', $response->getBody()->getContents()), $response->getStatusCode()); } private function checkAndInitializePhpsec() { // @codeCoverageIgnoreStart if (!\class_exists('VendorDuplicator\\phpseclib\\Crypt\\RSA')) { throw new RuntimeException('Please require phpseclib/phpseclib v2 to use this utility.'); } // @codeCoverageIgnoreEnd $this->setPhpsecConstants(); } private function checkSimpleJwt() { // @codeCoverageIgnoreStart if (!\class_exists('VendorDuplicator\\SimpleJWT\\JWT')) { throw new RuntimeException('Please require kelvinmo/simplejwt ^0.2 to use this utility.'); } // @codeCoverageIgnoreEnd } /** * phpseclib calls "phpinfo" by default, which requires special * whitelisting in the AppEngine VM environment. This function * sets constants to bypass the need for phpseclib to check phpinfo * * @see phpseclib/Math/BigInteger * @see https://github.com/GoogleCloudPlatform/getting-started-php/issues/85 * @codeCoverageIgnore */ private function setPhpsecConstants() { if (\filter_var(\getenv('GAE_VM'), \FILTER_VALIDATE_BOOLEAN)) { if (!\defined('MATH_BIGINTEGER_OPENSSL_ENABLED')) { \define('MATH_BIGINTEGER_OPENSSL_ENABLED', \true); } if (!\defined('CRYPT_RSA_MODE')) { \define('CRYPT_RSA_MODE', RSA::MODE_OPENSSL); } } } /** * Provide a hook to mock calls to the JWT static methods. * * @param string $method * @param array $args * @return mixed */ protected function callJwtStatic($method, array $args = []) { $class = 'VendorDuplicator\\Firebase\\JWT\\JWT'; return \call_user_func_array([$class, $method], $args); } /** * Provide a hook to mock calls to the JWT static methods. * * @param array $args * @return mixed */ protected function callSimpleJwtDecode(array $args = []) { return \call_user_func_array(['VendorDuplicator\\SimpleJWT\\JWT', 'decode'], $args); } /** * Generate a cache key based on the cert location using sha1 with the * exception of using "federated_signon_certs_v3" to preserve BC. * * @param string $certsLocation * @return string */ private function getCacheKeyFromCertLocation($certsLocation) { $key = $certsLocation === self::FEDERATED_SIGNON_CERT_URL ? 'federated_signon_certs_v3' : \sha1($certsLocation); return 'google_auth_certs_cache|' . $key; } } addons/gdriveaddon/vendor-prefixed/google/auth/src/UpdateMetadataInterface.php000064400000002301147600374260023631 0ustar00push($middleware); * * $client = new Client([ * 'handler' => $stack, * 'base_uri' => 'https://www.googleapis.com/taskqueue/v1beta2/projects/', * 'auth' => 'google_auth' // authorize all requests * ]); * * $res = $client->get('myproject/taskqueues/myqueue'); * ``` */ class ApplicationDefaultCredentials { /** * Obtains an AuthTokenSubscriber that uses the default FetchAuthTokenInterface * implementation to use in this environment. * * If supplied, $scope is used to in creating the credentials instance if * this does not fallback to the compute engine defaults. * * @param string|array scope the scope of the access request, expressed * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @return AuthTokenSubscriber * @throws DomainException if no implementation can be obtained. */ public static function getSubscriber($scope = null, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache); return new AuthTokenSubscriber($creds, $httpHandler); } /** * Obtains an AuthTokenMiddleware that uses the default FetchAuthTokenInterface * implementation to use in this environment. * * If supplied, $scope is used to in creating the credentials instance if * this does not fallback to the compute engine defaults. * * @param string|array scope the scope of the access request, expressed * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @param string $quotaProject specifies a project to bill for access * charges associated with the request. * @return AuthTokenMiddleware * @throws DomainException if no implementation can be obtained. */ public static function getMiddleware($scope = null, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null, $quotaProject = null) { $creds = self::getCredentials($scope, $httpHandler, $cacheConfig, $cache, $quotaProject); return new AuthTokenMiddleware($creds, $httpHandler); } /** * Obtains the default FetchAuthTokenInterface implementation to use * in this environment. * * @param string|array $scope the scope of the access request, expressed * either as an Array or as a space-delimited String. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @param string $quotaProject specifies a project to bill for access * charges associated with the request. * @param string|array $defaultScope The default scope to use if no * user-defined scopes exist, expressed either as an Array or as a * space-delimited string. * * @return CredentialsLoader * @throws DomainException if no implementation can be obtained. */ public static function getCredentials($scope = null, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null, $quotaProject = null, $defaultScope = null) { $creds = null; $jsonKey = CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile(); $anyScope = $scope ?: $defaultScope; if (!$httpHandler) { if (!($client = HttpClientCache::getHttpClient())) { $client = new Client(); HttpClientCache::setHttpClient($client); } $httpHandler = HttpHandlerFactory::build($client); } if (!\is_null($jsonKey)) { if ($quotaProject) { $jsonKey['quota_project_id'] = $quotaProject; } $creds = CredentialsLoader::makeCredentials($scope, $jsonKey, $defaultScope); } elseif (AppIdentityCredentials::onAppEngine() && !GCECredentials::onAppEngineFlexible()) { $creds = new AppIdentityCredentials($anyScope); } elseif (self::onGce($httpHandler, $cacheConfig, $cache)) { $creds = new GCECredentials(null, $anyScope, null, $quotaProject); } if (\is_null($creds)) { throw new DomainException(self::notFound()); } if (!\is_null($cache)) { $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache); } return $creds; } /** * Obtains an AuthTokenMiddleware which will fetch an ID token to use in the * Authorization header. The middleware is configured with the default * FetchAuthTokenInterface implementation to use in this environment. * * If supplied, $targetAudience is used to set the "aud" on the resulting * ID token. * * @param string $targetAudience The audience for the ID token. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @return AuthTokenMiddleware * @throws DomainException if no implementation can be obtained. */ public static function getIdTokenMiddleware($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache); return new AuthTokenMiddleware($creds, $httpHandler); } /** * Obtains an ProxyAuthTokenMiddleware which will fetch an ID token to use in the * Authorization header. The middleware is configured with the default * FetchAuthTokenInterface implementation to use in this environment. * * If supplied, $targetAudience is used to set the "aud" on the resulting * ID token. * * @param string $targetAudience The audience for the ID token. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @return ProxyAuthTokenMiddleware * @throws DomainException if no implementation can be obtained. */ public static function getProxyIdTokenMiddleware($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $creds = self::getIdTokenCredentials($targetAudience, $httpHandler, $cacheConfig, $cache); return new ProxyAuthTokenMiddleware($creds, $httpHandler); } /** * Obtains the default FetchAuthTokenInterface implementation to use * in this environment, configured with a $targetAudience for fetching an ID * token. * * @param string $targetAudience The audience for the ID token. * @param callable $httpHandler callback which delivers psr7 request * @param array $cacheConfig configuration for the cache when it's present * @param CacheItemPoolInterface $cache A cache implementation, may be * provided if you have one already available for use. * @return CredentialsLoader * @throws DomainException if no implementation can be obtained. * @throws InvalidArgumentException if JSON "type" key is invalid */ public static function getIdTokenCredentials($targetAudience, callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $creds = null; $jsonKey = CredentialsLoader::fromEnv() ?: CredentialsLoader::fromWellKnownFile(); if (!$httpHandler) { if (!($client = HttpClientCache::getHttpClient())) { $client = new Client(); HttpClientCache::setHttpClient($client); } $httpHandler = HttpHandlerFactory::build($client); } if (!\is_null($jsonKey)) { if (!\array_key_exists('type', $jsonKey)) { throw new \InvalidArgumentException('json key is missing the type field'); } if ($jsonKey['type'] == 'authorized_user') { throw new InvalidArgumentException('ID tokens are not supported for end user credentials'); } if ($jsonKey['type'] != 'service_account') { throw new InvalidArgumentException('invalid value in the type field'); } $creds = new ServiceAccountCredentials(null, $jsonKey, null, $targetAudience); } elseif (self::onGce($httpHandler, $cacheConfig, $cache)) { $creds = new GCECredentials(null, null, $targetAudience); } if (\is_null($creds)) { throw new DomainException(self::notFound()); } if (!\is_null($cache)) { $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache); } return $creds; } private static function notFound() { $msg = 'Could not load the default credentials. Browse to '; $msg .= 'https://developers.google.com'; $msg .= '/accounts/docs/application-default-credentials'; $msg .= ' for more information'; return $msg; } private static function onGce(callable $httpHandler = null, array $cacheConfig = null, CacheItemPoolInterface $cache = null) { $gceCacheConfig = []; foreach (['lifetime', 'prefix'] as $key) { if (isset($cacheConfig['gce_' . $key])) { $gceCacheConfig[$key] = $cacheConfig['gce_' . $key]; } } return (new GCECache($gceCacheConfig, $cache))->onGce($httpHandler); } } addons/gdriveaddon/vendor-prefixed/google/auth/src/FetchAuthTokenInterface.php000064400000003173147600374260023632 0ustar00 3) { // Maximum class file path depth in this project is 3. $classPath = \array_slice($classPath, 0, 3); } $filePath = \dirname(__FILE__) . '/src/' . \implode('/', $classPath) . '.php'; if (\file_exists($filePath)) { require_once $filePath; } } \spl_autoload_register('VendorDuplicator\\oauth2client_php_autoload'); addons/gdriveaddon/vendor-prefixed/google/auth/renovate.json000064400000005777147600374260020367 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();;{ "extends": [ "config:base", ":preserveSemverRanges" ] } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php000064400000005231147600374260024334 0ustar00filename = $cookieFile; $this->storeSessionCookies = $storeSessionCookies; if (\file_exists($cookieFile)) { $this->load($cookieFile); } } /** * Saves the file when shutting down */ public function __destruct() { $this->save($this->filename); } /** * Saves the cookies to a file. * * @param string $filename File to save * @throws \RuntimeException if the file cannot be found or created */ public function save($filename) { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $jsonStr = \VendorDuplicator\GuzzleHttp\json_encode($json); if (\false === \file_put_contents($filename, $jsonStr, \LOCK_EX)) { throw new \RuntimeException("Unable to save file {$filename}"); } } /** * Load cookies from a JSON formatted file. * * Old cookies are kept unless overwritten by newly loaded ones. * * @param string $filename Cookie file to load. * @throws \RuntimeException if the file cannot be loaded. */ public function load($filename) { $json = \file_get_contents($filename); if (\false === $json) { throw new \RuntimeException("Unable to load file {$filename}"); } elseif ($json === '') { return; } $data = \VendorDuplicator\GuzzleHttp\json_decode($json, \true); if (\is_array($data)) { foreach (\json_decode($json, \true) as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie file: {$filename}"); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SetCookie.php000064400000024257147600374260023564 0ustar00 null, 'Value' => null, 'Domain' => null, 'Path' => '/', 'Max-Age' => null, 'Expires' => null, 'Secure' => \false, 'Discard' => \false, 'HttpOnly' => \false]; /** @var array Cookie data */ private $data; /** * Create a new SetCookie object from a string * * @param string $cookie Set-Cookie header string * * @return self */ public static function fromString($cookie) { // Create the default return array $data = self::$defaults; // Explode the cookie string using a series of semicolons $pieces = \array_filter(\array_map('trim', \explode(';', $cookie))); // The name of the cookie (first kvp) must exist and include an equal sign. if (empty($pieces[0]) || !\strpos($pieces[0], '=')) { return new self($data); } // Add the cookie pieces into the parsed data array foreach ($pieces as $part) { $cookieParts = \explode('=', $part, 2); $key = \trim($cookieParts[0]); $value = isset($cookieParts[1]) ? \trim($cookieParts[1], " \n\r\t\x00\v") : \true; // Only check for non-cookies when cookies have been found if (empty($data['Name'])) { $data['Name'] = $key; $data['Value'] = $value; } else { foreach (\array_keys(self::$defaults) as $search) { if (!\strcasecmp($search, $key)) { $data[$search] = $value; continue 2; } } $data[$key] = $value; } } return new self($data); } /** * @param array $data Array of cookie data provided by a Cookie parser */ public function __construct(array $data = []) { $this->data = \array_replace(self::$defaults, $data); // Extract the Expires value and turn it into a UNIX timestamp if needed if (!$this->getExpires() && $this->getMaxAge()) { // Calculate the Expires date $this->setExpires(\time() + $this->getMaxAge()); } elseif ($this->getExpires() && !\is_numeric($this->getExpires())) { $this->setExpires($this->getExpires()); } } public function __toString() { $str = $this->data['Name'] . '=' . $this->data['Value'] . '; '; foreach ($this->data as $k => $v) { if ($k !== 'Name' && $k !== 'Value' && $v !== null && $v !== \false) { if ($k === 'Expires') { $str .= 'Expires=' . \gmdate('D, d M Y H:i:s \\G\\M\\T', $v) . '; '; } else { $str .= ($v === \true ? $k : "{$k}={$v}") . '; '; } } } return \rtrim($str, '; '); } public function toArray() { return $this->data; } /** * Get the cookie name * * @return string */ public function getName() { return $this->data['Name']; } /** * Set the cookie name * * @param string $name Cookie name */ public function setName($name) { $this->data['Name'] = $name; } /** * Get the cookie value * * @return string */ public function getValue() { return $this->data['Value']; } /** * Set the cookie value * * @param string $value Cookie value */ public function setValue($value) { $this->data['Value'] = $value; } /** * Get the domain * * @return string|null */ public function getDomain() { return $this->data['Domain']; } /** * Set the domain of the cookie * * @param string $domain */ public function setDomain($domain) { $this->data['Domain'] = $domain; } /** * Get the path * * @return string */ public function getPath() { return $this->data['Path']; } /** * Set the path of the cookie * * @param string $path Path of the cookie */ public function setPath($path) { $this->data['Path'] = $path; } /** * Maximum lifetime of the cookie in seconds * * @return int|null */ public function getMaxAge() { return $this->data['Max-Age']; } /** * Set the max-age of the cookie * * @param int $maxAge Max age of the cookie in seconds */ public function setMaxAge($maxAge) { $this->data['Max-Age'] = $maxAge; } /** * The UNIX timestamp when the cookie Expires * * @return mixed */ public function getExpires() { return $this->data['Expires']; } /** * Set the unix timestamp for which the cookie will expire * * @param int $timestamp Unix timestamp */ public function setExpires($timestamp) { $this->data['Expires'] = \is_numeric($timestamp) ? (int) $timestamp : \strtotime($timestamp); } /** * Get whether or not this is a secure cookie * * @return bool|null */ public function getSecure() { return $this->data['Secure']; } /** * Set whether or not the cookie is secure * * @param bool $secure Set to true or false if secure */ public function setSecure($secure) { $this->data['Secure'] = $secure; } /** * Get whether or not this is a session cookie * * @return bool|null */ public function getDiscard() { return $this->data['Discard']; } /** * Set whether or not this is a session cookie * * @param bool $discard Set to true or false if this is a session cookie */ public function setDiscard($discard) { $this->data['Discard'] = $discard; } /** * Get whether or not this is an HTTP only cookie * * @return bool */ public function getHttpOnly() { return $this->data['HttpOnly']; } /** * Set whether or not this is an HTTP only cookie * * @param bool $httpOnly Set to true or false if this is HTTP only */ public function setHttpOnly($httpOnly) { $this->data['HttpOnly'] = $httpOnly; } /** * Check if the cookie matches a path value. * * A request-path path-matches a given cookie-path if at least one of * the following conditions holds: * * - The cookie-path and the request-path are identical. * - The cookie-path is a prefix of the request-path, and the last * character of the cookie-path is %x2F ("/"). * - The cookie-path is a prefix of the request-path, and the first * character of the request-path that is not included in the cookie- * path is a %x2F ("/") character. * * @param string $requestPath Path to check against * * @return bool */ public function matchesPath($requestPath) { $cookiePath = $this->getPath(); // Match on exact matches or when path is the default empty "/" if ($cookiePath === '/' || $cookiePath == $requestPath) { return \true; } // Ensure that the cookie-path is a prefix of the request path. if (0 !== \strpos($requestPath, $cookiePath)) { return \false; } // Match if the last character of the cookie-path is "/" if (\substr($cookiePath, -1, 1) === '/') { return \true; } // Match if the first character not included in cookie path is "/" return \substr($requestPath, \strlen($cookiePath), 1) === '/'; } /** * Check if the cookie matches a domain value * * @param string $domain Domain to check against * * @return bool */ public function matchesDomain($domain) { $cookieDomain = $this->getDomain(); if (null === $cookieDomain) { return \true; } // Remove the leading '.' as per spec in RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.2.3 $cookieDomain = \ltrim(\strtolower($cookieDomain), '.'); $domain = \strtolower($domain); // Domain not set or exact match. if ('' === $cookieDomain || $domain === $cookieDomain) { return \true; } // Matching the subdomain according to RFC 6265. // http://tools.ietf.org/html/rfc6265#section-5.1.3 if (\filter_var($domain, \FILTER_VALIDATE_IP)) { return \false; } return (bool) \preg_match('/\\.' . \preg_quote($cookieDomain, '/') . '$/', $domain); } /** * Check if the cookie is expired * * @return bool */ public function isExpired() { return $this->getExpires() !== null && \time() > $this->getExpires(); } /** * Check if the cookie is valid according to RFC 6265 * * @return bool|string Returns true if valid or an error message if invalid */ public function validate() { // Names must not be empty, but can be 0 $name = $this->getName(); if (empty($name) && !\is_numeric($name)) { return 'The cookie name must not be empty'; } // Check if any of the invalid characters are present in the cookie name if (\preg_match('/[\\x00-\\x20\\x22\\x28-\\x29\\x2c\\x2f\\x3a-\\x40\\x5c\\x7b\\x7d\\x7f]/', $name)) { return 'Cookie name must not contain invalid characters: ASCII ' . 'Control characters (0-31;127), space, tab and the ' . 'following characters: ()<>@,;:\\"/?={}'; } // Value must not be empty, but can be 0 $value = $this->getValue(); if (empty($value) && !\is_numeric($value)) { return 'The cookie value must not be empty'; } // Domains must not be empty, but can be 0 // A "0" is not a valid internet domain, but may be used as server name // in a private network. $domain = $this->getDomain(); if (empty($domain) && !\is_numeric($domain)) { return 'The cookie domain must not be empty'; } return \true; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJar.php000064400000021520147600374260023533 0ustar00strictMode = $strictMode; foreach ($cookieArray as $cookie) { if (!$cookie instanceof SetCookie) { $cookie = new SetCookie($cookie); } $this->setCookie($cookie); } } /** * Create a new Cookie jar from an associative array and domain. * * @param array $cookies Cookies to create the jar from * @param string $domain Domain to set the cookies to * * @return self */ public static function fromArray(array $cookies, $domain) { $cookieJar = new self(); foreach ($cookies as $name => $value) { $cookieJar->setCookie(new SetCookie(['Domain' => $domain, 'Name' => $name, 'Value' => $value, 'Discard' => \true])); } return $cookieJar; } /** * @deprecated */ public static function getCookieValue($value) { return $value; } /** * Evaluate if this cookie should be persisted to storage * that survives between requests. * * @param SetCookie $cookie Being evaluated. * @param bool $allowSessionCookies If we should persist session cookies * @return bool */ public static function shouldPersist(SetCookie $cookie, $allowSessionCookies = \false) { if ($cookie->getExpires() || $allowSessionCookies) { if (!$cookie->getDiscard()) { return \true; } } return \false; } /** * Finds and returns the cookie based on the name * * @param string $name cookie name to search for * @return SetCookie|null cookie that was found or null if not found */ public function getCookieByName($name) { // don't allow a non string name if ($name === null || !\is_scalar($name)) { return null; } foreach ($this->cookies as $cookie) { if ($cookie->getName() !== null && \strcasecmp($cookie->getName(), $name) === 0) { return $cookie; } } return null; } public function toArray() { return \array_map(function (SetCookie $cookie) { return $cookie->toArray(); }, $this->getIterator()->getArrayCopy()); } public function clear($domain = null, $path = null, $name = null) { if (!$domain) { $this->cookies = []; return; } elseif (!$path) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($domain) { return !$cookie->matchesDomain($domain); }); } elseif (!$name) { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain) { return !($cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } else { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) use($path, $domain, $name) { return !($cookie->getName() == $name && $cookie->matchesPath($path) && $cookie->matchesDomain($domain)); }); } } public function clearSessionCookies() { $this->cookies = \array_filter($this->cookies, function (SetCookie $cookie) { return !$cookie->getDiscard() && $cookie->getExpires(); }); } public function setCookie(SetCookie $cookie) { // If the name string is empty (but not 0), ignore the set-cookie // string entirely. $name = $cookie->getName(); if (!$name && $name !== '0') { return \false; } // Only allow cookies with set and valid domain, name, value $result = $cookie->validate(); if ($result !== \true) { if ($this->strictMode) { throw new \RuntimeException('Invalid cookie: ' . $result); } else { $this->removeCookieIfEmpty($cookie); return \false; } } // Resolve conflicts with previously set cookies foreach ($this->cookies as $i => $c) { // Two cookies are identical, when their path, and domain are // identical. if ($c->getPath() != $cookie->getPath() || $c->getDomain() != $cookie->getDomain() || $c->getName() != $cookie->getName()) { continue; } // The previously set cookie is a discard cookie and this one is // not so allow the new cookie to be set if (!$cookie->getDiscard() && $c->getDiscard()) { unset($this->cookies[$i]); continue; } // If the new cookie's expiration is further into the future, then // replace the old cookie if ($cookie->getExpires() > $c->getExpires()) { unset($this->cookies[$i]); continue; } // If the value has changed, we better change it if ($cookie->getValue() !== $c->getValue()) { unset($this->cookies[$i]); continue; } // The cookie exists, so no need to continue return \false; } $this->cookies[] = $cookie; return \true; } public function count() { return \count($this->cookies); } public function getIterator() { return new \ArrayIterator(\array_values($this->cookies)); } public function extractCookies(RequestInterface $request, ResponseInterface $response) { if ($cookieHeader = $response->getHeader('Set-Cookie')) { foreach ($cookieHeader as $cookie) { $sc = SetCookie::fromString($cookie); if (!$sc->getDomain()) { $sc->setDomain($request->getUri()->getHost()); } if (0 !== \strpos($sc->getPath(), '/')) { $sc->setPath($this->getCookiePathFromRequest($request)); } if (!$sc->matchesDomain($request->getUri()->getHost())) { continue; } // Note: At this point `$sc->getDomain()` being a public suffix should // be rejected, but we don't want to pull in the full PSL dependency. $this->setCookie($sc); } } } /** * Computes cookie path following RFC 6265 section 5.1.4 * * @link https://tools.ietf.org/html/rfc6265#section-5.1.4 * * @param RequestInterface $request * @return string */ private function getCookiePathFromRequest(RequestInterface $request) { $uriPath = $request->getUri()->getPath(); if ('' === $uriPath) { return '/'; } if (0 !== \strpos($uriPath, '/')) { return '/'; } if ('/' === $uriPath) { return '/'; } if (0 === ($lastSlashPos = \strrpos($uriPath, '/'))) { return '/'; } return \substr($uriPath, 0, $lastSlashPos); } public function withCookieHeader(RequestInterface $request) { $values = []; $uri = $request->getUri(); $scheme = $uri->getScheme(); $host = $uri->getHost(); $path = $uri->getPath() ?: '/'; foreach ($this->cookies as $cookie) { if ($cookie->matchesPath($path) && $cookie->matchesDomain($host) && !$cookie->isExpired() && (!$cookie->getSecure() || $scheme === 'https')) { $values[] = $cookie->getName() . '=' . $cookie->getValue(); } } return $values ? $request->withHeader('Cookie', \implode('; ', $values)) : $request; } /** * If a cookie already exists and the server asks to set it again with a * null value, the cookie must be deleted. * * @param SetCookie $cookie */ private function removeCookieIfEmpty(SetCookie $cookie) { $cookieValue = $cookie->getValue(); if ($cookieValue === null || $cookieValue === '') { $this->clear($cookie->getDomain(), $cookie->getPath(), $cookie->getName()); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php000064400000003654147600374260025107 0ustar00sessionKey = $sessionKey; $this->storeSessionCookies = $storeSessionCookies; $this->load(); } /** * Saves cookies to session when shutting down */ public function __destruct() { $this->save(); } /** * Save cookies to the client session */ public function save() { $json = []; foreach ($this as $cookie) { /** @var SetCookie $cookie */ if (CookieJar::shouldPersist($cookie, $this->storeSessionCookies)) { $json[] = $cookie->toArray(); } } $_SESSION[$this->sessionKey] = \json_encode($json); } /** * Load the contents of the client session into the data array */ protected function load() { if (!isset($_SESSION[$this->sessionKey])) { return; } $data = \json_decode($_SESSION[$this->sessionKey], \true); if (\is_array($data)) { foreach ($data as $cookie) { $this->setCookie(new SetCookie($cookie)); } } elseif (\strlen($data)) { throw new \RuntimeException("Invalid cookie data"); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php000064400000005411147600374260025355 0ustar00stream = $stream; $msg = $msg ?: 'Could not seek the stream to position ' . $pos; parent::__construct($msg); } /** * @return StreamInterface */ public function getStream() { return $this->stream; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/BadResponseException.php000064400000001403147600374260026474 0ustar00getStatusCode() : 0; parent::__construct($message, $code, $previous); $this->request = $request; $this->response = $response; $this->handlerContext = $handlerContext; } /** * Wrap non-RequestExceptions with a RequestException * * @param RequestInterface $request * @param \Exception $e * * @return RequestException */ public static function wrapException(RequestInterface $request, \Exception $e) { return $e instanceof RequestException ? $e : new RequestException($e->getMessage(), $request, null, $e); } /** * Factory method to create a new exception with a normalized error message * * @param RequestInterface $request Request * @param ResponseInterface $response Response received * @param \Exception $previous Previous exception * @param array $ctx Optional handler context. * * @return self */ public static function create(RequestInterface $request, ResponseInterface $response = null, \Exception $previous = null, array $ctx = []) { if (!$response) { return new self('Error completing request', $request, null, $previous, $ctx); } $level = (int) \floor($response->getStatusCode() / 100); if ($level === 4) { $label = 'Client error'; $className = ClientException::class; } elseif ($level === 5) { $label = 'Server error'; $className = ServerException::class; } else { $label = 'Unsuccessful request'; $className = __CLASS__; } $uri = $request->getUri(); $uri = static::obfuscateUri($uri); // Client Error: `GET /` resulted in a `404 Not Found` response: // ... (truncated) $message = \sprintf('%s: `%s %s` resulted in a `%s %s` response', $label, $request->getMethod(), $uri, $response->getStatusCode(), $response->getReasonPhrase()); $summary = static::getResponseBodySummary($response); if ($summary !== null) { $message .= ":\n{$summary}\n"; } return new $className($message, $request, $response, $previous, $ctx); } /** * Get a short summary of the response * * Will return `null` if the response is not printable. * * @param ResponseInterface $response * * @return string|null */ public static function getResponseBodySummary(ResponseInterface $response) { return \VendorDuplicator\GuzzleHttp\Psr7\get_message_body_summary($response); } /** * Obfuscates URI if there is a username and a password present * * @param UriInterface $uri * * @return UriInterface */ private static function obfuscateUri(UriInterface $uri) { $userInfo = $uri->getUserInfo(); if (\false !== ($pos = \strpos($userInfo, ':'))) { return $uri->withUserInfo(\substr($userInfo, 0, $pos), '***'); } return $uri; } /** * Get the request that caused the exception * * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Get the associated response * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Check if a response was received * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Get contextual information about the error from the underlying handler. * * The contents of this array will vary depending on which handler you are * using. It may also be just an empty array. Relying on this data will * couple you to a specific handler, but can give more debug information * when needed. * * @return array */ public function getHandlerContext() { return $this->handlerContext; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Exception/GuzzleException.php000064400000000751147600374260025554 0ustar00headers)) { throw new \RuntimeException('No headers have been received'); } // HTTP-version SP status-code SP reason-phrase $startLine = \explode(' ', \array_shift($this->headers), 3); $headers = \VendorDuplicator\GuzzleHttp\headers_from_lines($this->headers); $normalizedKeys = \VendorDuplicator\GuzzleHttp\normalize_header_keys($headers); if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding'])) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } } // Attach a response to the easy handle with the parsed headers. $this->response = new Response($startLine[1], $headers, $this->sink, \substr($startLine[0], 5), isset($startLine[2]) ? (string) $startLine[2] : null); } public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/MockHandler.php000064400000013520147600374260024221 0ustar00onFulfilled = $onFulfilled; $this->onRejected = $onRejected; if ($queue) { \call_user_func_array([$this, 'append'], $queue); } } public function __invoke(RequestInterface $request, array $options) { if (!$this->queue) { throw new \OutOfBoundsException('Mock queue is empty'); } if (isset($options['delay']) && \is_numeric($options['delay'])) { \usleep($options['delay'] * 1000); } $this->lastRequest = $request; $this->lastOptions = $options; $response = \array_shift($this->queue); if (isset($options['on_headers'])) { if (!\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $response = new RequestException($msg, $request, $response, $e); } } if (\is_callable($response)) { $response = \call_user_func($response, $request, $options); } $response = $response instanceof \Exception ? \VendorDuplicator\GuzzleHttp\Promise\rejection_for($response) : \VendorDuplicator\GuzzleHttp\Promise\promise_for($response); return $response->then(function ($value) use($request, $options) { $this->invokeStats($request, $options, $value); if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value); } if (isset($options['sink'])) { $contents = (string) $value->getBody(); $sink = $options['sink']; if (\is_resource($sink)) { \fwrite($sink, $contents); } elseif (\is_string($sink)) { \file_put_contents($sink, $contents); } elseif ($sink instanceof \VendorDuplicator\Psr\Http\Message\StreamInterface) { $sink->write($contents); } } return $value; }, function ($reason) use($request, $options) { $this->invokeStats($request, $options, null, $reason); if ($this->onRejected) { \call_user_func($this->onRejected, $reason); } return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); } /** * Adds one or more variadic requests, exceptions, callables, or promises * to the queue. */ public function append() { foreach (\func_get_args() as $value) { if ($value instanceof ResponseInterface || $value instanceof \Exception || $value instanceof PromiseInterface || \is_callable($value)) { $this->queue[] = $value; } else { throw new \InvalidArgumentException('Expected a response or ' . 'exception. Found ' . \VendorDuplicator\GuzzleHttp\describe_type($value)); } } } /** * Get the last received request. * * @return RequestInterface */ public function getLastRequest() { return $this->lastRequest; } /** * Get the last received request options. * * @return array */ public function getLastOptions() { return $this->lastOptions; } /** * Returns the number of remaining items in the queue. * * @return int */ public function count() { return \count($this->queue); } public function reset() { $this->queue = []; } private function invokeStats(RequestInterface $request, array $options, ResponseInterface $response = null, $reason = null) { if (isset($options['on_stats'])) { $transferTime = isset($options['transfer_time']) ? $options['transfer_time'] : 0; $stats = new TransferStats($request, $response, $transferTime, $reason); \call_user_func($options['on_stats'], $stats); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/Proxy.php000064400000003273147600374260023157 0ustar00withoutHeader('Expect'); // Append a content-length header if body size is zero to match // cURL's behavior. if (0 === $request->getBody()->getSize()) { $request = $request->withHeader('Content-Length', '0'); } return $this->createResponse($request, $options, $this->createStream($request, $options), $startTime); } catch (\InvalidArgumentException $e) { throw $e; } catch (\Exception $e) { // Determine if the error was a networking error. $message = $e->getMessage(); // This list can probably get more comprehensive. if (\strpos($message, 'getaddrinfo') || \strpos($message, 'Connection refused') || \strpos($message, "couldn't connect to host") || \strpos($message, "connection attempt failed")) { $e = new ConnectException($e->getMessage(), $request, $e); } $e = RequestException::wrapException($request, $e); $this->invokeStats($options, $request, $startTime, null, $e); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($e); } } private function invokeStats(array $options, RequestInterface $request, $startTime, ResponseInterface $response = null, $error = null) { if (isset($options['on_stats'])) { $stats = new TransferStats($request, $response, Utils::currentTime() - $startTime, $error, []); \call_user_func($options['on_stats'], $stats); } } private function createResponse(RequestInterface $request, array $options, $stream, $startTime) { $hdrs = $this->lastHeaders; $this->lastHeaders = []; $parts = \explode(' ', \array_shift($hdrs), 3); $ver = \explode('/', $parts[0])[1]; $status = $parts[1]; $reason = isset($parts[2]) ? $parts[2] : null; $headers = \VendorDuplicator\GuzzleHttp\headers_from_lines($hdrs); list($stream, $headers) = $this->checkDecode($options, $headers, $stream); $stream = Psr7\stream_for($stream); $sink = $stream; if (\strcasecmp('HEAD', $request->getMethod())) { $sink = $this->createSink($stream, $options); } $response = new Psr7\Response($status, $headers, $sink, $ver, $reason); if (isset($options['on_headers'])) { try { $options['on_headers']($response); } catch (\Exception $e) { $msg = 'An error was encountered during the on_headers event'; $ex = new RequestException($msg, $request, $response, $e); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($ex); } } // Do not drain when the request is a HEAD request because they have // no body. if ($sink !== $stream) { $this->drain($stream, $sink, $response->getHeaderLine('Content-Length')); } $this->invokeStats($options, $request, $startTime, $response, null); return new FulfilledPromise($response); } private function createSink(StreamInterface $stream, array $options) { if (!empty($options['stream'])) { return $stream; } $sink = isset($options['sink']) ? $options['sink'] : \fopen('php://temp', 'r+'); return \is_string($sink) ? new Psr7\LazyOpenStream($sink, 'w+') : Psr7\stream_for($sink); } private function checkDecode(array $options, array $headers, $stream) { // Automatically decode responses when instructed. if (!empty($options['decode_content'])) { $normalizedKeys = \VendorDuplicator\GuzzleHttp\normalize_header_keys($headers); if (isset($normalizedKeys['content-encoding'])) { $encoding = $headers[$normalizedKeys['content-encoding']]; if ($encoding[0] === 'gzip' || $encoding[0] === 'deflate') { $stream = new Psr7\InflateStream(Psr7\stream_for($stream)); $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; // Remove content-encoding header unset($headers[$normalizedKeys['content-encoding']]); // Fix content-length header if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']]; $length = (int) $stream->getSize(); if ($length === 0) { unset($headers[$normalizedKeys['content-length']]); } else { $headers[$normalizedKeys['content-length']] = [$length]; } } } } } return [$stream, $headers]; } /** * Drains the source stream into the "sink" client option. * * @param StreamInterface $source * @param StreamInterface $sink * @param string $contentLength Header specifying the amount of * data to read. * * @return StreamInterface * @throws \RuntimeException when the sink option is invalid. */ private function drain(StreamInterface $source, StreamInterface $sink, $contentLength) { // If a content-length header is provided, then stop reading once // that number of bytes has been read. This can prevent infinitely // reading from a stream when dealing with servers that do not honor // Connection: Close headers. Psr7\copy_to_stream($source, $sink, \strlen($contentLength) > 0 && (int) $contentLength > 0 ? (int) $contentLength : -1); $sink->seek(0); $source->close(); return $sink; } /** * Create a resource and check to ensure it was created successfully * * @param callable $callback Callable that returns stream resource * * @return resource * @throws \RuntimeException on error */ private function createResource(callable $callback) { $errors = null; \set_error_handler(function ($_, $msg, $file, $line) use(&$errors) { $errors[] = ['message' => $msg, 'file' => $file, 'line' => $line]; return \true; }); $resource = $callback(); \restore_error_handler(); if (!$resource) { $message = 'Error creating resource: '; foreach ($errors as $err) { foreach ($err as $key => $value) { $message .= "[{$key}] {$value}" . \PHP_EOL; } } throw new \RuntimeException(\trim($message)); } return $resource; } private function createStream(RequestInterface $request, array $options) { static $methods; if (!$methods) { $methods = \array_flip(\get_class_methods(__CLASS__)); } // HTTP/1.1 streams using the PHP stream wrapper require a // Connection: close header if ($request->getProtocolVersion() == '1.1' && !$request->hasHeader('Connection')) { $request = $request->withHeader('Connection', 'close'); } // Ensure SSL is verified by default if (!isset($options['verify'])) { $options['verify'] = \true; } $params = []; $context = $this->getDefaultContext($request); if (isset($options['on_headers']) && !\is_callable($options['on_headers'])) { throw new \InvalidArgumentException('on_headers must be callable'); } if (!empty($options)) { foreach ($options as $key => $value) { $method = "add_{$key}"; if (isset($methods[$method])) { $this->{$method}($request, $context, $value, $params); } } } if (isset($options['stream_context'])) { if (!\is_array($options['stream_context'])) { throw new \InvalidArgumentException('stream_context must be an array'); } $context = \array_replace_recursive($context, $options['stream_context']); } // Microsoft NTLM authentication only supported with curl handler if (isset($options['auth']) && \is_array($options['auth']) && isset($options['auth'][2]) && 'ntlm' == $options['auth'][2]) { throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler'); } $uri = $this->resolveHost($request, $options); $context = $this->createResource(function () use($context, $params) { return \stream_context_create($context, $params); }); return $this->createResource(function () use($uri, &$http_response_header, $context, $options) { $resource = \fopen((string) $uri, 'r', null, $context); $this->lastHeaders = $http_response_header; if (isset($options['read_timeout'])) { $readTimeout = $options['read_timeout']; $sec = (int) $readTimeout; $usec = ($readTimeout - $sec) * 100000; \stream_set_timeout($resource, $sec, $usec); } return $resource; }); } private function resolveHost(RequestInterface $request, array $options) { $uri = $request->getUri(); if (isset($options['force_ip_resolve']) && !\filter_var($uri->getHost(), \FILTER_VALIDATE_IP)) { if ('v4' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_A); if (!isset($records[0]['ip'])) { throw new ConnectException(\sprintf("Could not resolve IPv4 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost($records[0]['ip']); } elseif ('v6' === $options['force_ip_resolve']) { $records = \dns_get_record($uri->getHost(), \DNS_AAAA); if (!isset($records[0]['ipv6'])) { throw new ConnectException(\sprintf("Could not resolve IPv6 address for host '%s'", $uri->getHost()), $request); } $uri = $uri->withHost('[' . $records[0]['ipv6'] . ']'); } } return $uri; } private function getDefaultContext(RequestInterface $request) { $headers = ''; foreach ($request->getHeaders() as $name => $value) { foreach ($value as $val) { $headers .= "{$name}: {$val}\r\n"; } } $context = ['http' => ['method' => $request->getMethod(), 'header' => $headers, 'protocol_version' => $request->getProtocolVersion(), 'ignore_errors' => \true, 'follow_location' => 0]]; $body = (string) $request->getBody(); if (!empty($body)) { $context['http']['content'] = $body; // Prevent the HTTP handler from adding a Content-Type header. if (!$request->hasHeader('Content-Type')) { $context['http']['header'] .= "Content-Type:\r\n"; } } $context['http']['header'] = \rtrim($context['http']['header']); return $context; } private function add_proxy(RequestInterface $request, &$options, $value, &$params) { if (!\is_array($value)) { $options['http']['proxy'] = $value; } else { $scheme = $request->getUri()->getScheme(); if (isset($value[$scheme])) { if (!isset($value['no']) || !\VendorDuplicator\GuzzleHttp\is_host_in_noproxy($request->getUri()->getHost(), $value['no'])) { $options['http']['proxy'] = $value[$scheme]; } } } } private function add_timeout(RequestInterface $request, &$options, $value, &$params) { if ($value > 0) { $options['http']['timeout'] = $value; } } private function add_verify(RequestInterface $request, &$options, $value, &$params) { if ($value === \true) { // PHP 5.6 or greater will find the system cert by default. When // < 5.6, use the Guzzle bundled cacert. if (\PHP_VERSION_ID < 50600) { $options['ssl']['cafile'] = \VendorDuplicator\GuzzleHttp\default_ca_bundle(); } } elseif (\is_string($value)) { $options['ssl']['cafile'] = $value; if (!\file_exists($value)) { throw new \RuntimeException("SSL CA bundle not found: {$value}"); } } elseif ($value === \false) { $options['ssl']['verify_peer'] = \false; $options['ssl']['verify_peer_name'] = \false; return; } else { throw new \InvalidArgumentException('Invalid verify request option'); } $options['ssl']['verify_peer'] = \true; $options['ssl']['verify_peer_name'] = \true; $options['ssl']['allow_self_signed'] = \false; } private function add_cert(RequestInterface $request, &$options, $value, &$params) { if (\is_array($value)) { $options['ssl']['passphrase'] = $value[1]; $value = $value[0]; } if (!\file_exists($value)) { throw new \RuntimeException("SSL certificate not found: {$value}"); } $options['ssl']['local_cert'] = $value; } private function add_progress(RequestInterface $request, &$options, $value, &$params) { $this->addNotification($params, function ($code, $a, $b, $c, $transferred, $total) use($value) { if ($code == \STREAM_NOTIFY_PROGRESS) { $value($total, $transferred, null, null); } }); } private function add_debug(RequestInterface $request, &$options, $value, &$params) { if ($value === \false) { return; } static $map = [\STREAM_NOTIFY_CONNECT => 'CONNECT', \STREAM_NOTIFY_AUTH_REQUIRED => 'AUTH_REQUIRED', \STREAM_NOTIFY_AUTH_RESULT => 'AUTH_RESULT', \STREAM_NOTIFY_MIME_TYPE_IS => 'MIME_TYPE_IS', \STREAM_NOTIFY_FILE_SIZE_IS => 'FILE_SIZE_IS', \STREAM_NOTIFY_REDIRECTED => 'REDIRECTED', \STREAM_NOTIFY_PROGRESS => 'PROGRESS', \STREAM_NOTIFY_FAILURE => 'FAILURE', \STREAM_NOTIFY_COMPLETED => 'COMPLETED', \STREAM_NOTIFY_RESOLVE => 'RESOLVE']; static $args = ['severity', 'message', 'message_code', 'bytes_transferred', 'bytes_max']; $value = \VendorDuplicator\GuzzleHttp\debug_resource($value); $ident = $request->getMethod() . ' ' . $request->getUri()->withFragment(''); $this->addNotification($params, function () use($ident, $value, $map, $args) { $passed = \func_get_args(); $code = \array_shift($passed); \fprintf($value, '<%s> [%s] ', $ident, $map[$code]); foreach (\array_filter($passed) as $i => $v) { \fwrite($value, $args[$i] . ': "' . $v . '" '); } \fwrite($value, "\n"); }); } private function addNotification(array &$params, callable $notify) { // Wrap the existing function if needed. if (!isset($params['notification'])) { $params['notification'] = $notify; } else { $params['notification'] = $this->callArray([$params['notification'], $notify]); } } private function callArray(array $functions) { return function () use($functions) { $args = \func_get_args(); foreach ($functions as $fn) { \call_user_func_array($fn, $args); } }; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlFactory.php000064400000047765147600374260024311 0ustar00maxHandles = $maxHandles; } public function create(RequestInterface $request, array $options) { if (isset($options['curl']['body_as_string'])) { $options['_body_as_string'] = $options['curl']['body_as_string']; unset($options['curl']['body_as_string']); } $easy = new EasyHandle(); $easy->request = $request; $easy->options = $options; $conf = $this->getDefaultConf($easy); $this->applyMethod($easy, $conf); $this->applyHandlerOptions($easy, $conf); $this->applyHeaders($easy, $conf); unset($conf['_headers']); // Add handler options from the request configuration options if (isset($options['curl'])) { $conf = \array_replace($conf, $options['curl']); } $conf[\CURLOPT_HEADERFUNCTION] = $this->createHeaderFn($easy); $easy->handle = $this->handles ? \array_pop($this->handles) : \curl_init(); \curl_setopt_array($easy->handle, $conf); return $easy; } public function release(EasyHandle $easy) { $resource = $easy->handle; unset($easy->handle); if (\count($this->handles) >= $this->maxHandles) { \curl_close($resource); } else { // Remove all callback functions as they can hold onto references // and are not cleaned up by curl_reset. Using curl_setopt_array // does not work for some reason, so removing each one // individually. \curl_setopt($resource, \CURLOPT_HEADERFUNCTION, null); \curl_setopt($resource, \CURLOPT_READFUNCTION, null); \curl_setopt($resource, \CURLOPT_WRITEFUNCTION, null); \curl_setopt($resource, \CURLOPT_PROGRESSFUNCTION, null); \curl_reset($resource); $this->handles[] = $resource; } } /** * Completes a cURL transaction, either returning a response promise or a * rejected promise. * * @param callable $handler * @param EasyHandle $easy * @param CurlFactoryInterface $factory Dictates how the handle is released * * @return \VendorDuplicator\GuzzleHttp\Promise\PromiseInterface */ public static function finish(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { if (isset($easy->options['on_stats'])) { self::invokeStats($easy); } if (!$easy->response || $easy->errno) { return self::finishError($handler, $easy, $factory); } // Return the response if it is present and there is no error. $factory->release($easy); // Rewind the body of the response if possible. $body = $easy->response->getBody(); if ($body->isSeekable()) { $body->rewind(); } return new FulfilledPromise($easy->response); } private static function invokeStats(EasyHandle $easy) { $curlStats = \curl_getinfo($easy->handle); $curlStats['appconnect_time'] = \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME); $stats = new TransferStats($easy->request, $easy->response, $curlStats['total_time'], $easy->errno, $curlStats); \call_user_func($easy->options['on_stats'], $stats); } private static function finishError(callable $handler, EasyHandle $easy, CurlFactoryInterface $factory) { // Get error information and release the handle to the factory. $ctx = ['errno' => $easy->errno, 'error' => \curl_error($easy->handle), 'appconnect_time' => \curl_getinfo($easy->handle, \CURLINFO_APPCONNECT_TIME)] + \curl_getinfo($easy->handle); $ctx[self::CURL_VERSION_STR] = \curl_version()['version']; $factory->release($easy); // Retry when nothing is present or when curl failed to rewind. if (empty($easy->options['_err_message']) && (!$easy->errno || $easy->errno == 65)) { return self::retryFailedRewind($handler, $easy, $ctx); } return self::createRejection($easy, $ctx); } private static function createRejection(EasyHandle $easy, array $ctx) { static $connectionErrors = [\CURLE_OPERATION_TIMEOUTED => \true, \CURLE_COULDNT_RESOLVE_HOST => \true, \CURLE_COULDNT_CONNECT => \true, \CURLE_SSL_CONNECT_ERROR => \true, \CURLE_GOT_NOTHING => \true]; // If an exception was encountered during the onHeaders event, then // return a rejected promise that wraps that exception. if ($easy->onHeadersException) { return \VendorDuplicator\GuzzleHttp\Promise\rejection_for(new RequestException('An error was encountered during the on_headers event', $easy->request, $easy->response, $easy->onHeadersException, $ctx)); } if (\version_compare($ctx[self::CURL_VERSION_STR], self::LOW_CURL_VERSION_NUMBER)) { $message = \sprintf('cURL error %s: %s (%s)', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html'); } else { $message = \sprintf('cURL error %s: %s (%s) for %s', $ctx['errno'], $ctx['error'], 'see https://curl.haxx.se/libcurl/c/libcurl-errors.html', $easy->request->getUri()); } // Create a connection exception if it was a specific error code. $error = isset($connectionErrors[$easy->errno]) ? new ConnectException($message, $easy->request, null, $ctx) : new RequestException($message, $easy->request, $easy->response, null, $ctx); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($error); } private function getDefaultConf(EasyHandle $easy) { $conf = ['_headers' => $easy->request->getHeaders(), \CURLOPT_CUSTOMREQUEST => $easy->request->getMethod(), \CURLOPT_URL => (string) $easy->request->getUri()->withFragment(''), \CURLOPT_RETURNTRANSFER => \false, \CURLOPT_HEADER => \false, \CURLOPT_CONNECTTIMEOUT => 150]; if (\defined('CURLOPT_PROTOCOLS')) { $conf[\CURLOPT_PROTOCOLS] = \CURLPROTO_HTTP | \CURLPROTO_HTTPS; } $version = $easy->request->getProtocolVersion(); if ($version == 1.1) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_1; } elseif ($version == 2.0) { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_2_0; } else { $conf[\CURLOPT_HTTP_VERSION] = \CURL_HTTP_VERSION_1_0; } return $conf; } private function applyMethod(EasyHandle $easy, array &$conf) { $body = $easy->request->getBody(); $size = $body->getSize(); if ($size === null || $size > 0) { $this->applyBody($easy->request, $easy->options, $conf); return; } $method = $easy->request->getMethod(); if ($method === 'PUT' || $method === 'POST') { // See http://tools.ietf.org/html/rfc7230#section-3.3.2 if (!$easy->request->hasHeader('Content-Length')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Length: 0'; } } elseif ($method === 'HEAD') { $conf[\CURLOPT_NOBODY] = \true; unset($conf[\CURLOPT_WRITEFUNCTION], $conf[\CURLOPT_READFUNCTION], $conf[\CURLOPT_FILE], $conf[\CURLOPT_INFILE]); } } private function applyBody(RequestInterface $request, array $options, array &$conf) { $size = $request->hasHeader('Content-Length') ? (int) $request->getHeaderLine('Content-Length') : null; // Send the body as a string if the size is less than 1MB OR if the // [curl][body_as_string] request value is set. if ($size !== null && $size < 1000000 || !empty($options['_body_as_string'])) { $conf[\CURLOPT_POSTFIELDS] = (string) $request->getBody(); // Don't duplicate the Content-Length header $this->removeHeader('Content-Length', $conf); $this->removeHeader('Transfer-Encoding', $conf); } else { $conf[\CURLOPT_UPLOAD] = \true; if ($size !== null) { $conf[\CURLOPT_INFILESIZE] = $size; $this->removeHeader('Content-Length', $conf); } $body = $request->getBody(); if ($body->isSeekable()) { $body->rewind(); } $conf[\CURLOPT_READFUNCTION] = function ($ch, $fd, $length) use($body) { return $body->read($length); }; } // If the Expect header is not present, prevent curl from adding it if (!$request->hasHeader('Expect')) { $conf[\CURLOPT_HTTPHEADER][] = 'Expect:'; } // cURL sometimes adds a content-type by default. Prevent this. if (!$request->hasHeader('Content-Type')) { $conf[\CURLOPT_HTTPHEADER][] = 'Content-Type:'; } } private function applyHeaders(EasyHandle $easy, array &$conf) { foreach ($conf['_headers'] as $name => $values) { foreach ($values as $value) { $value = (string) $value; if ($value === '') { // cURL requires a special format for empty headers. // See https://github.com/guzzle/guzzle/issues/1882 for more details. $conf[\CURLOPT_HTTPHEADER][] = "{$name};"; } else { $conf[\CURLOPT_HTTPHEADER][] = "{$name}: {$value}"; } } } // Remove the Accept header if one was not set if (!$easy->request->hasHeader('Accept')) { $conf[\CURLOPT_HTTPHEADER][] = 'Accept:'; } } /** * Remove a header from the options array. * * @param string $name Case-insensitive header to remove * @param array $options Array of options to modify */ private function removeHeader($name, array &$options) { foreach (\array_keys($options['_headers']) as $key) { if (!\strcasecmp($key, $name)) { unset($options['_headers'][$key]); return; } } } private function applyHandlerOptions(EasyHandle $easy, array &$conf) { $options = $easy->options; if (isset($options['verify'])) { if ($options['verify'] === \false) { unset($conf[\CURLOPT_CAINFO]); $conf[\CURLOPT_SSL_VERIFYHOST] = 0; $conf[\CURLOPT_SSL_VERIFYPEER] = \false; } else { $conf[\CURLOPT_SSL_VERIFYHOST] = 2; $conf[\CURLOPT_SSL_VERIFYPEER] = \true; if (\is_string($options['verify'])) { // Throw an error if the file/folder/link path is not valid or doesn't exist. if (!\file_exists($options['verify'])) { throw new \InvalidArgumentException("SSL CA bundle not found: {$options['verify']}"); } // If it's a directory or a link to a directory use CURLOPT_CAPATH. // If not, it's probably a file, or a link to a file, so use CURLOPT_CAINFO. if (\is_dir($options['verify']) || \is_link($options['verify']) && \is_dir(\readlink($options['verify']))) { $conf[\CURLOPT_CAPATH] = $options['verify']; } else { $conf[\CURLOPT_CAINFO] = $options['verify']; } } } } if (!empty($options['decode_content'])) { $accept = $easy->request->getHeaderLine('Accept-Encoding'); if ($accept) { $conf[\CURLOPT_ENCODING] = $accept; } else { $conf[\CURLOPT_ENCODING] = ''; // Don't let curl send the header over the wire $conf[\CURLOPT_HTTPHEADER][] = 'Accept-Encoding:'; } } if (isset($options['sink'])) { $sink = $options['sink']; if (!\is_string($sink)) { $sink = \VendorDuplicator\GuzzleHttp\Psr7\stream_for($sink); } elseif (!\is_dir(\dirname($sink))) { // Ensure that the directory exists before failing in curl. throw new \RuntimeException(\sprintf('Directory %s does not exist for sink value of %s', \dirname($sink), $sink)); } else { $sink = new LazyOpenStream($sink, 'w+'); } $easy->sink = $sink; $conf[\CURLOPT_WRITEFUNCTION] = function ($ch, $write) use($sink) { return $sink->write($write); }; } else { // Use a default temp stream if no sink was set. $conf[\CURLOPT_FILE] = \fopen('php://temp', 'w+'); $easy->sink = Psr7\stream_for($conf[\CURLOPT_FILE]); } $timeoutRequiresNoSignal = \false; if (isset($options['timeout'])) { $timeoutRequiresNoSignal |= $options['timeout'] < 1; $conf[\CURLOPT_TIMEOUT_MS] = $options['timeout'] * 1000; } // CURL default value is CURL_IPRESOLVE_WHATEVER if (isset($options['force_ip_resolve'])) { if ('v4' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V4; } elseif ('v6' === $options['force_ip_resolve']) { $conf[\CURLOPT_IPRESOLVE] = \CURL_IPRESOLVE_V6; } } if (isset($options['connect_timeout'])) { $timeoutRequiresNoSignal |= $options['connect_timeout'] < 1; $conf[\CURLOPT_CONNECTTIMEOUT_MS] = $options['connect_timeout'] * 1000; } if ($timeoutRequiresNoSignal && \strtoupper(\substr(\PHP_OS, 0, 3)) !== 'WIN') { $conf[\CURLOPT_NOSIGNAL] = \true; } if (isset($options['proxy'])) { if (!\is_array($options['proxy'])) { $conf[\CURLOPT_PROXY] = $options['proxy']; } else { $scheme = $easy->request->getUri()->getScheme(); if (isset($options['proxy'][$scheme])) { $host = $easy->request->getUri()->getHost(); if (!isset($options['proxy']['no']) || !\VendorDuplicator\GuzzleHttp\is_host_in_noproxy($host, $options['proxy']['no'])) { $conf[\CURLOPT_PROXY] = $options['proxy'][$scheme]; } } } } if (isset($options['cert'])) { $cert = $options['cert']; if (\is_array($cert)) { $conf[\CURLOPT_SSLCERTPASSWD] = $cert[1]; $cert = $cert[0]; } if (!\file_exists($cert)) { throw new \InvalidArgumentException("SSL certificate not found: {$cert}"); } $conf[\CURLOPT_SSLCERT] = $cert; } if (isset($options['ssl_key'])) { if (\is_array($options['ssl_key'])) { if (\count($options['ssl_key']) === 2) { list($sslKey, $conf[\CURLOPT_SSLKEYPASSWD]) = $options['ssl_key']; } else { list($sslKey) = $options['ssl_key']; } } $sslKey = isset($sslKey) ? $sslKey : $options['ssl_key']; if (!\file_exists($sslKey)) { throw new \InvalidArgumentException("SSL private key not found: {$sslKey}"); } $conf[\CURLOPT_SSLKEY] = $sslKey; } if (isset($options['progress'])) { $progress = $options['progress']; if (!\is_callable($progress)) { throw new \InvalidArgumentException('progress client option must be callable'); } $conf[\CURLOPT_NOPROGRESS] = \false; $conf[\CURLOPT_PROGRESSFUNCTION] = function () use($progress) { $args = \func_get_args(); // PHP 5.5 pushed the handle onto the start of the args if (\is_resource($args[0])) { \array_shift($args); } \call_user_func_array($progress, $args); }; } if (!empty($options['debug'])) { $conf[\CURLOPT_STDERR] = \VendorDuplicator\GuzzleHttp\debug_resource($options['debug']); $conf[\CURLOPT_VERBOSE] = \true; } } /** * This function ensures that a response was set on a transaction. If one * was not set, then the request is retried if possible. This error * typically means you are sending a payload, curl encountered a * "Connection died, retrying a fresh connect" error, tried to rewind the * stream, and then encountered a "necessary data rewind wasn't possible" * error, causing the request to be sent through curl_multi_info_read() * without an error status. */ private static function retryFailedRewind(callable $handler, EasyHandle $easy, array $ctx) { try { // Only rewind if the body has been read from. $body = $easy->request->getBody(); if ($body->tell() > 0) { $body->rewind(); } } catch (\RuntimeException $e) { $ctx['error'] = 'The connection unexpectedly failed without ' . 'providing an error. The request would have been retried, ' . 'but attempting to rewind the request body failed. ' . 'Exception: ' . $e; return self::createRejection($easy, $ctx); } // Retry no more than 3 times before giving up. if (!isset($easy->options['_curl_retries'])) { $easy->options['_curl_retries'] = 1; } elseif ($easy->options['_curl_retries'] == 2) { $ctx['error'] = 'The cURL request was retried 3 times ' . 'and did not succeed. The most likely reason for the failure ' . 'is that cURL was unable to rewind the body of the request ' . 'and subsequent retries resulted in the same error. Turn on ' . 'the debug option to see what went wrong. See ' . 'https://bugs.php.net/bug.php?id=47204 for more information.'; return self::createRejection($easy, $ctx); } else { $easy->options['_curl_retries']++; } return $handler($easy->request, $easy->options); } private function createHeaderFn(EasyHandle $easy) { if (isset($easy->options['on_headers'])) { $onHeaders = $easy->options['on_headers']; if (!\is_callable($onHeaders)) { throw new \InvalidArgumentException('on_headers must be callable'); } } else { $onHeaders = null; } return function ($ch, $h) use($onHeaders, $easy, &$startingResponse) { $value = \trim($h); if ($value === '') { $startingResponse = \true; $easy->createResponse(); if ($onHeaders !== null) { try { $onHeaders($easy->response); } catch (\Exception $e) { // Associate the exception with the handle and trigger // a curl header write error by returning 0. $easy->onHeadersException = $e; return -1; } } } elseif ($startingResponse) { $startingResponse = \false; $easy->headers = [$value]; } else { $easy->headers[] = $value; } return \strlen($h); }; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlHandler.php000064400000002411147600374260024232 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(3); } public function __invoke(RequestInterface $request, array $options) { if (isset($options['delay'])) { \usleep($options['delay'] * 1000); } $easy = $this->factory->create($request, $options); \curl_exec($easy->handle); $easy->errno = \curl_errno($easy->handle); return CurlFactory::finish($this, $easy, $this->factory); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php000064400000014175147600374260025257 0ustar00factory = isset($options['handle_factory']) ? $options['handle_factory'] : new CurlFactory(50); if (isset($options['select_timeout'])) { $this->selectTimeout = $options['select_timeout']; } elseif ($selectTimeout = \getenv('GUZZLE_CURL_SELECT_TIMEOUT')) { $this->selectTimeout = $selectTimeout; } else { $this->selectTimeout = 1; } $this->options = isset($options['options']) ? $options['options'] : []; } public function __get($name) { if ($name === '_mh') { $this->_mh = \curl_multi_init(); foreach ($this->options as $option => $value) { // A warning is raised in case of a wrong option. \curl_multi_setopt($this->_mh, $option, $value); } // Further calls to _mh will return the value directly, without entering the // __get() method at all. return $this->_mh; } throw new \BadMethodCallException(); } public function __destruct() { if (isset($this->_mh)) { \curl_multi_close($this->_mh); unset($this->_mh); } } public function __invoke(RequestInterface $request, array $options) { $easy = $this->factory->create($request, $options); $id = (int) $easy->handle; $promise = new Promise([$this, 'execute'], function () use($id) { return $this->cancel($id); }); $this->addRequest(['easy' => $easy, 'deferred' => $promise]); return $promise; } /** * Ticks the curl event loop. */ public function tick() { // Add any delayed handles if needed. if ($this->delays) { $currentTime = Utils::currentTime(); foreach ($this->delays as $id => $delay) { if ($currentTime >= $delay) { unset($this->delays[$id]); \curl_multi_add_handle($this->_mh, $this->handles[$id]['easy']->handle); } } } // Step through the task queue which may add additional requests. P\queue()->run(); if ($this->active && \curl_multi_select($this->_mh, $this->selectTimeout) === -1) { // Perform a usleep if a select returns -1. // See: https://bugs.php.net/bug.php?id=61141 \usleep(250); } while (\curl_multi_exec($this->_mh, $this->active) === \CURLM_CALL_MULTI_PERFORM) { } $this->processMessages(); } /** * Runs until all outstanding connections have completed. */ public function execute() { $queue = P\queue(); while ($this->handles || !$queue->isEmpty()) { // If there are no transfers, then sleep for the next delay if (!$this->active && $this->delays) { \usleep($this->timeToNext()); } $this->tick(); } } private function addRequest(array $entry) { $easy = $entry['easy']; $id = (int) $easy->handle; $this->handles[$id] = $entry; if (empty($easy->options['delay'])) { \curl_multi_add_handle($this->_mh, $easy->handle); } else { $this->delays[$id] = Utils::currentTime() + $easy->options['delay'] / 1000; } } /** * Cancels a handle from sending and removes references to it. * * @param int $id Handle ID to cancel and remove. * * @return bool True on success, false on failure. */ private function cancel($id) { // Cannot cancel if it has been processed. if (!isset($this->handles[$id])) { return \false; } $handle = $this->handles[$id]['easy']->handle; unset($this->delays[$id], $this->handles[$id]); \curl_multi_remove_handle($this->_mh, $handle); \curl_close($handle); return \true; } private function processMessages() { while ($done = \curl_multi_info_read($this->_mh)) { $id = (int) $done['handle']; \curl_multi_remove_handle($this->_mh, $done['handle']); if (!isset($this->handles[$id])) { // Probably was cancelled. continue; } $entry = $this->handles[$id]; unset($this->handles[$id], $this->delays[$id]); $entry['easy']->errno = $done['result']; $entry['deferred']->resolve(CurlFactory::finish($this, $entry['easy'], $this->factory)); } } private function timeToNext() { $currentTime = Utils::currentTime(); $nextTime = \PHP_INT_MAX; foreach ($this->delays as $time) { if ($time < $nextTime) { $nextTime = $time; } } return \max(0, $nextTime - $currentTime) * 1000000; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Utils.php000064400000005477147600374260021571 0ustar00getHost()) { $asciiHost = self::idnToAsci($uri->getHost(), $options, $info); if ($asciiHost === \false) { $errorBitSet = isset($info['errors']) ? $info['errors'] : 0; $errorConstants = \array_filter(\array_keys(\get_defined_constants()), function ($name) { return \substr($name, 0, 11) === 'IDNA_ERROR_'; }); $errors = []; foreach ($errorConstants as $errorConstant) { if ($errorBitSet & \constant($errorConstant)) { $errors[] = $errorConstant; } } $errorMessage = 'IDN conversion failed'; if ($errors) { $errorMessage .= ' (errors: ' . \implode(', ', $errors) . ')'; } throw new InvalidArgumentException($errorMessage); } else { if ($uri->getHost() !== $asciiHost) { // Replace URI only if the ASCII version is different $uri = $uri->withHost($asciiHost); } } } return $uri; } /** * @param string $domain * @param int $options * @param array $info * * @return string|false */ private static function idnToAsci($domain, $options, &$info = []) { if (\preg_match('%^[ -~]+$%', $domain) === 1) { return $domain; } if (\extension_loaded('intl') && \defined('INTL_IDNA_VARIANT_UTS46')) { return \idn_to_ascii($domain, $options, \INTL_IDNA_VARIANT_UTS46, $info); } /* * The Idn class is marked as @internal. Verify that class and method exists. */ if (\method_exists(Idn::class, 'idn_to_ascii')) { return Idn::idn_to_ascii($domain, $options, Idn::INTL_IDNA_VARIANT_UTS46, $info); } throw new \RuntimeException('ext-intl or symfony/polyfill-intl-idn not loaded or too old'); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/MessageFormatter.php000064400000014617147600374260023735 0ustar00>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}"; const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}'; /** @var string Template used to format log messages */ private $template; /** * @param string $template Log message template */ public function __construct($template = self::CLF) { $this->template = $template ?: self::CLF; } /** * Returns a formatted message string. * * @param RequestInterface $request Request that was sent * @param ResponseInterface $response Response that was received * @param \Exception $error Exception that was received * * @return string */ public function format(RequestInterface $request, ResponseInterface $response = null, \Exception $error = null) { $cache = []; return \preg_replace_callback('/{\\s*([A-Za-z_\\-\\.0-9]+)\\s*}/', function (array $matches) use($request, $response, $error, &$cache) { if (isset($cache[$matches[1]])) { return $cache[$matches[1]]; } $result = ''; switch ($matches[1]) { case 'request': $result = Psr7\str($request); break; case 'response': $result = $response ? Psr7\str($response) : ''; break; case 'req_headers': $result = \trim($request->getMethod() . ' ' . $request->getRequestTarget()) . ' HTTP/' . $request->getProtocolVersion() . "\r\n" . $this->headers($request); break; case 'res_headers': $result = $response ? \sprintf('HTTP/%s %d %s', $response->getProtocolVersion(), $response->getStatusCode(), $response->getReasonPhrase()) . "\r\n" . $this->headers($response) : 'NULL'; break; case 'req_body': $result = $request->getBody(); break; case 'res_body': $result = $response ? $response->getBody() : 'NULL'; break; case 'ts': case 'date_iso_8601': $result = \gmdate('c'); break; case 'date_common_log': $result = \date('d/M/Y:H:i:s O'); break; case 'method': $result = $request->getMethod(); break; case 'version': $result = $request->getProtocolVersion(); break; case 'uri': case 'url': $result = $request->getUri(); break; case 'target': $result = $request->getRequestTarget(); break; case 'req_version': $result = $request->getProtocolVersion(); break; case 'res_version': $result = $response ? $response->getProtocolVersion() : 'NULL'; break; case 'host': $result = $request->getHeaderLine('Host'); break; case 'hostname': $result = \gethostname(); break; case 'code': $result = $response ? $response->getStatusCode() : 'NULL'; break; case 'phrase': $result = $response ? $response->getReasonPhrase() : 'NULL'; break; case 'error': $result = $error ? $error->getMessage() : 'NULL'; break; default: // handle prefixed dynamic headers if (\strpos($matches[1], 'req_header_') === 0) { $result = $request->getHeaderLine(\substr($matches[1], 11)); } elseif (\strpos($matches[1], 'res_header_') === 0) { $result = $response ? $response->getHeaderLine(\substr($matches[1], 11)) : 'NULL'; } } $cache[$matches[1]] = $result; return $result; }, $this->template); } /** * Get headers from message as string * * @return string */ private function headers(MessageInterface $message) { $result = ''; foreach ($message->getHeaders() as $name => $values) { $result .= $name . ': ' . \implode(', ', $values) . "\r\n"; } return \trim($result); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/functions.php000064400000023352147600374260022471 0ustar00expand($template, $variables); } /** * Debug function used to describe the provided value type and class. * * @param mixed $input * * @return string Returns a string containing the type of the variable and * if a class is provided, the class name. */ function describe_type($input) { switch (\gettype($input)) { case 'object': return 'object(' . \get_class($input) . ')'; case 'array': return 'array(' . \count($input) . ')'; default: \ob_start(); \var_dump($input); // normalize float vs double return \str_replace('double(', 'float(', \rtrim(\ob_get_clean())); } } /** * Parses an array of header lines into an associative array of headers. * * @param iterable $lines Header lines array of strings in the following * format: "Name: Value" * @return array */ function headers_from_lines($lines) { $headers = []; foreach ($lines as $line) { $parts = \explode(':', $line, 2); $headers[\trim($parts[0])][] = isset($parts[1]) ? \trim($parts[1]) : null; } return $headers; } /** * Returns a debug stream based on the provided variable. * * @param mixed $value Optional value * * @return resource */ function debug_resource($value = null) { if (\is_resource($value)) { return $value; } elseif (\defined('STDOUT')) { return \STDOUT; } return \fopen('php://output', 'w'); } /** * Chooses and creates a default handler to use based on the environment. * * The returned handler is not wrapped by any default middlewares. * * @return callable Returns the best handler for the given system. * @throws \RuntimeException if no viable Handler is available. */ function choose_handler() { $handler = null; if (\function_exists('curl_multi_exec') && \function_exists('curl_exec')) { $handler = Proxy::wrapSync(new CurlMultiHandler(), new CurlHandler()); } elseif (\function_exists('curl_exec')) { $handler = new CurlHandler(); } elseif (\function_exists('curl_multi_exec')) { $handler = new CurlMultiHandler(); } if (\ini_get('allow_url_fopen')) { $handler = $handler ? Proxy::wrapStreaming($handler, new StreamHandler()) : new StreamHandler(); } elseif (!$handler) { throw new \RuntimeException('VendorDuplicator\\GuzzleHttp requires cURL, the ' . 'allow_url_fopen ini setting, or a custom HTTP handler.'); } return $handler; } /** * Get the default User-Agent string to use with Guzzle * * @return string */ function default_user_agent() { static $defaultAgent = ''; if (!$defaultAgent) { $defaultAgent = 'VendorDuplicator\\GuzzleHttp/' . Client::VERSION; if (\extension_loaded('curl') && \function_exists('curl_version')) { $defaultAgent .= ' curl/' . \curl_version()['version']; } $defaultAgent .= ' PHP/' . \PHP_VERSION; } return $defaultAgent; } /** * Returns the default cacert bundle for the current system. * * First, the openssl.cafile and curl.cainfo php.ini settings are checked. * If those settings are not configured, then the common locations for * bundles found on Red Hat, CentOS, Fedora, Ubuntu, Debian, FreeBSD, OS X * and Windows are checked. If any of these file locations are found on * disk, they will be utilized. * * Note: the result of this function is cached for subsequent calls. * * @return string * @throws \RuntimeException if no bundle can be found. */ function default_ca_bundle() { static $cached = null; static $cafiles = [ // Red Hat, CentOS, Fedora (provided by the ca-certificates package) '/etc/pki/tls/certs/ca-bundle.crt', // Ubuntu, Debian (provided by the ca-certificates package) '/etc/ssl/certs/ca-certificates.crt', // FreeBSD (provided by the ca_root_nss package) '/usr/local/share/certs/ca-root-nss.crt', // SLES 12 (provided by the ca-certificates package) '/var/lib/ca-certificates/ca-bundle.pem', // OS X provided by homebrew (using the default path) '/usr/local/etc/openssl/cert.pem', // Google app engine '/etc/ca-certificates.crt', // Windows? 'C:\\windows\\system32\\curl-ca-bundle.crt', 'C:\\windows\\curl-ca-bundle.crt', ]; if ($cached) { return $cached; } if ($ca = \ini_get('openssl.cafile')) { return $cached = $ca; } if ($ca = \ini_get('curl.cainfo')) { return $cached = $ca; } foreach ($cafiles as $filename) { if (\file_exists($filename)) { return $cached = $filename; } } throw new \RuntimeException(<< ['prefix' => '', 'joiner' => ',', 'query' => \false], '+' => ['prefix' => '', 'joiner' => ',', 'query' => \false], '#' => ['prefix' => '#', 'joiner' => ',', 'query' => \false], '.' => ['prefix' => '.', 'joiner' => '.', 'query' => \false], '/' => ['prefix' => '/', 'joiner' => '/', 'query' => \false], ';' => ['prefix' => ';', 'joiner' => ';', 'query' => \true], '?' => ['prefix' => '?', 'joiner' => '&', 'query' => \true], '&' => ['prefix' => '&', 'joiner' => '&', 'query' => \true]]; /** @var array Delimiters */ private static $delims = [':', '/', '?', '#', '[', ']', '@', '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=']; /** @var array Percent encoded delimiters */ private static $delimsPct = ['%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40', '%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D']; public function expand($template, array $variables) { if (\false === \strpos($template, '{')) { return $template; } $this->template = $template; $this->variables = $variables; return \preg_replace_callback('/\\{([^\\}]+)\\}/', [$this, 'expandMatch'], $this->template); } /** * Parse an expression into parts * * @param string $expression Expression to parse * * @return array Returns an associative array of parts */ private function parseExpression($expression) { $result = []; if (isset(self::$operatorHash[$expression[0]])) { $result['operator'] = $expression[0]; $expression = \substr($expression, 1); } else { $result['operator'] = ''; } foreach (\explode(',', $expression) as $value) { $value = \trim($value); $varspec = []; if ($colonPos = \strpos($value, ':')) { $varspec['value'] = \substr($value, 0, $colonPos); $varspec['modifier'] = ':'; $varspec['position'] = (int) \substr($value, $colonPos + 1); } elseif (\substr($value, -1) === '*') { $varspec['modifier'] = '*'; $varspec['value'] = \substr($value, 0, -1); } else { $varspec['value'] = (string) $value; $varspec['modifier'] = ''; } $result['values'][] = $varspec; } return $result; } /** * Process an expansion * * @param array $matches Matches met in the preg_replace_callback * * @return string Returns the replacement string */ private function expandMatch(array $matches) { static $rfc1738to3986 = ['+' => '%20', '%7e' => '~']; $replacements = []; $parsed = self::parseExpression($matches[1]); $prefix = self::$operatorHash[$parsed['operator']]['prefix']; $joiner = self::$operatorHash[$parsed['operator']]['joiner']; $useQuery = self::$operatorHash[$parsed['operator']]['query']; foreach ($parsed['values'] as $value) { if (!isset($this->variables[$value['value']])) { continue; } $variable = $this->variables[$value['value']]; $actuallyUseQuery = $useQuery; $expanded = ''; if (\is_array($variable)) { $isAssoc = $this->isAssoc($variable); $kvp = []; foreach ($variable as $key => $var) { if ($isAssoc) { $key = \rawurlencode($key); $isNestedArray = \is_array($var); } else { $isNestedArray = \false; } if (!$isNestedArray) { $var = \rawurlencode($var); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $var = $this->decodeReserved($var); } } if ($value['modifier'] === '*') { if ($isAssoc) { if ($isNestedArray) { // Nested arrays must allow for deeply nested // structures. $var = \strtr(\http_build_query([$key => $var]), $rfc1738to3986); } else { $var = $key . '=' . $var; } } elseif ($key > 0 && $actuallyUseQuery) { $var = $value['value'] . '=' . $var; } } $kvp[$key] = $var; } if (empty($variable)) { $actuallyUseQuery = \false; } elseif ($value['modifier'] === '*') { $expanded = \implode($joiner, $kvp); if ($isAssoc) { // Don't prepend the value name when using the explode // modifier with an associative array. $actuallyUseQuery = \false; } } else { if ($isAssoc) { // When an associative array is encountered and the // explode modifier is not set, then the result must be // a comma separated list of keys followed by their // respective values. foreach ($kvp as $k => &$v) { $v = $k . ',' . $v; } } $expanded = \implode(',', $kvp); } } else { if ($value['modifier'] === ':') { $variable = \substr($variable, 0, $value['position']); } $expanded = \rawurlencode($variable); if ($parsed['operator'] === '+' || $parsed['operator'] === '#') { $expanded = $this->decodeReserved($expanded); } } if ($actuallyUseQuery) { if (!$expanded && $joiner !== '&') { $expanded = $value['value']; } else { $expanded = $value['value'] . '=' . $expanded; } } $replacements[] = $expanded; } $ret = \implode($joiner, $replacements); if ($ret && $prefix) { return $prefix . $ret; } return $ret; } /** * Determines if an array is associative. * * This makes the assumption that input arrays are sequences or hashes. * This assumption is a tradeoff for accuracy in favor of speed, but it * should work in almost every case where input is supplied for a URI * template. * * @param array $array Array to check * * @return bool */ private function isAssoc(array $array) { return $array && \array_keys($array)[0] !== 0; } /** * Removes percent encoding on reserved characters (used with + and # * modifiers). * * @param string $string String to fix * * @return string */ private function decodeReserved($string) { return \str_replace(self::$delimsPct, self::$delims, $string); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/ClientInterface.php000064400000005621147600374260023517 0ustar00 'http://www.foo.com/1.0/', * 'timeout' => 0, * 'allow_redirects' => false, * 'proxy' => '192.168.16.1:10' * ]); * * Client configuration settings include the following options: * * - handler: (callable) Function that transfers HTTP requests over the * wire. The function is called with a Psr7\Http\Message\RequestInterface * and array of transfer options, and must return a * GuzzleHttp\Promise\PromiseInterface that is fulfilled with a * Psr7\Http\Message\ResponseInterface on success. * If no handler is provided, a default handler will be created * that enables all of the request options below by attaching all of the * default middleware to the handler. * - base_uri: (string|UriInterface) Base URI of the client that is merged * into relative URIs. Can be a string or instance of UriInterface. * - **: any request option * * @param array $config Client configuration settings. * * @see \VendorDuplicator\GuzzleHttp\RequestOptions for a list of available request options. */ public function __construct(array $config = []) { if (!isset($config['handler'])) { $config['handler'] = HandlerStack::create(); } elseif (!\is_callable($config['handler'])) { throw new \InvalidArgumentException('handler must be a callable'); } // Convert the base_uri to a UriInterface if (isset($config['base_uri'])) { $config['base_uri'] = Psr7\uri_for($config['base_uri']); } $this->configureDefaults($config); } /** * @param string $method * @param array $args * * @return Promise\PromiseInterface */ public function __call($method, $args) { if (\count($args) < 1) { throw new \InvalidArgumentException('Magic request methods require a URI and optional options array'); } $uri = $args[0]; $opts = isset($args[1]) ? $args[1] : []; return \substr($method, -5) === 'Async' ? $this->requestAsync(\substr($method, 0, -5), $uri, $opts) : $this->request($method, $uri, $opts); } /** * Asynchronously send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function sendAsync(RequestInterface $request, array $options = []) { // Merge the base URI into the request URI if needed. $options = $this->prepareDefaults($options); return $this->transfer($request->withUri($this->buildUri($request->getUri(), $options), $request->hasHeader('Host')), $options); } /** * Send an HTTP request. * * @param array $options Request options to apply to the given * request and to the transfer. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function send(RequestInterface $request, array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->sendAsync($request, $options)->wait(); } /** * Create and send an asynchronous HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. Use an array to provide a URL * template and additional variables to use in the URL template expansion. * * @param string $method HTTP method * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ public function requestAsync($method, $uri = '', array $options = []) { $options = $this->prepareDefaults($options); // Remove request modifying parameter because it can be done up-front. $headers = isset($options['headers']) ? $options['headers'] : []; $body = isset($options['body']) ? $options['body'] : null; $version = isset($options['version']) ? $options['version'] : '1.1'; // Merge the URI into the base URI. $uri = $this->buildUri($uri, $options); if (\is_array($body)) { $this->invalidBody(); } $request = new Psr7\Request($method, $uri, $headers, $body, $version); // Remove the option so that they are not doubly-applied. unset($options['headers'], $options['body'], $options['version']); return $this->transfer($request, $options); } /** * Create and send an HTTP request. * * Use an absolute path to override the base path of the client, or a * relative path to append to the base path of the client. The URL can * contain the query string as well. * * @param string $method HTTP method. * @param string|UriInterface $uri URI object or string. * @param array $options Request options to apply. See \GuzzleHttp\RequestOptions. * * @return ResponseInterface * @throws GuzzleException */ public function request($method, $uri = '', array $options = []) { $options[RequestOptions::SYNCHRONOUS] = \true; return $this->requestAsync($method, $uri, $options)->wait(); } /** * Get a client configuration option. * * These options include default request options of the client, a "handler" * (if utilized by the concrete client), and a "base_uri" if utilized by * the concrete client. * * @param string|null $option The config option to retrieve. * * @return mixed */ public function getConfig($option = null) { return $option === null ? $this->config : (isset($this->config[$option]) ? $this->config[$option] : null); } /** * @param string|null $uri * * @return UriInterface */ private function buildUri($uri, array $config) { // for BC we accept null which would otherwise fail in uri_for $uri = Psr7\uri_for($uri === null ? '' : $uri); if (isset($config['base_uri'])) { $uri = Psr7\UriResolver::resolve(Psr7\uri_for($config['base_uri']), $uri); } if (isset($config['idn_conversion']) && $config['idn_conversion'] !== \false) { $idnOptions = $config['idn_conversion'] === \true ? \IDNA_DEFAULT : $config['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; } /** * Configures the default options for a client. * * @param array $config * @return void */ private function configureDefaults(array $config) { $defaults = ['allow_redirects' => RedirectMiddleware::$defaultSettings, 'http_errors' => \true, 'decode_content' => \true, 'verify' => \true, 'cookies' => \false, 'idn_conversion' => \true]; // Use the standard Linux HTTP_PROXY and HTTPS_PROXY if set. // We can only trust the HTTP_PROXY environment variable in a CLI // process due to the fact that PHP has no reliable mechanism to // get environment variables that start with "HTTP_". if (\php_sapi_name() === 'cli' && \getenv('HTTP_PROXY')) { $defaults['proxy']['http'] = \getenv('HTTP_PROXY'); } if ($proxy = \getenv('HTTPS_PROXY')) { $defaults['proxy']['https'] = $proxy; } if ($noProxy = \getenv('NO_PROXY')) { $cleanedNoProxy = \str_replace(' ', '', $noProxy); $defaults['proxy']['no'] = \explode(',', $cleanedNoProxy); } $this->config = $config + $defaults; if (!empty($config['cookies']) && $config['cookies'] === \true) { $this->config['cookies'] = new CookieJar(); } // Add the default user-agent header. if (!isset($this->config['headers'])) { $this->config['headers'] = ['User-Agent' => default_user_agent()]; } else { // Add the User-Agent header if one was not already set. foreach (\array_keys($this->config['headers']) as $name) { if (\strtolower($name) === 'user-agent') { return; } } $this->config['headers']['User-Agent'] = default_user_agent(); } } /** * Merges default options into the array. * * @param array $options Options to modify by reference * * @return array */ private function prepareDefaults(array $options) { $defaults = $this->config; if (!empty($defaults['headers'])) { // Default headers are only added if they are not present. $defaults['_conditional'] = $defaults['headers']; unset($defaults['headers']); } // Special handling for headers is required as they are added as // conditional headers and as headers passed to a request ctor. if (\array_key_exists('headers', $options)) { // Allows default headers to be unset. if ($options['headers'] === null) { $defaults['_conditional'] = []; unset($options['headers']); } elseif (!\is_array($options['headers'])) { throw new \InvalidArgumentException('headers must be an array'); } } // Shallow merge defaults underneath options. $result = $options + $defaults; // Remove null values. foreach ($result as $k => $v) { if ($v === null) { unset($result[$k]); } } return $result; } /** * Transfers the given request and applies request options. * * The URI of the request is not modified and the request options are used * as-is without merging in default options. * * @param array $options See \GuzzleHttp\RequestOptions. * * @return Promise\PromiseInterface */ private function transfer(RequestInterface $request, array $options) { // save_to -> sink if (isset($options['save_to'])) { $options['sink'] = $options['save_to']; unset($options['save_to']); } // exceptions -> http_errors if (isset($options['exceptions'])) { $options['http_errors'] = $options['exceptions']; unset($options['exceptions']); } $request = $this->applyOptions($request, $options); /** @var HandlerStack $handler */ $handler = $options['handler']; try { return Promise\promise_for($handler($request, $options)); } catch (\Exception $e) { return Promise\rejection_for($e); } } /** * Applies the array of request options to a request. * * @param RequestInterface $request * @param array $options * * @return RequestInterface */ private function applyOptions(RequestInterface $request, array &$options) { $modify = ['set_headers' => []]; if (isset($options['headers'])) { $modify['set_headers'] = $options['headers']; unset($options['headers']); } if (isset($options['form_params'])) { if (isset($options['multipart'])) { throw new \InvalidArgumentException('You cannot use ' . 'form_params and multipart at the same time. Use the ' . 'form_params option if you want to send application/' . 'x-www-form-urlencoded requests, and the multipart ' . 'option to send multipart/form-data requests.'); } $options['body'] = \http_build_query($options['form_params'], '', '&'); unset($options['form_params']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded'; } if (isset($options['multipart'])) { $options['body'] = new Psr7\MultipartStream($options['multipart']); unset($options['multipart']); } if (isset($options['json'])) { $options['body'] = \VendorDuplicator\GuzzleHttp\json_encode($options['json']); unset($options['json']); // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'application/json'; } if (!empty($options['decode_content']) && $options['decode_content'] !== \true) { // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']); $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; } if (isset($options['body'])) { if (\is_array($options['body'])) { $this->invalidBody(); } $modify['body'] = Psr7\stream_for($options['body']); unset($options['body']); } if (!empty($options['auth']) && \is_array($options['auth'])) { $value = $options['auth']; $type = isset($value[2]) ? \strtolower($value[2]) : 'basic'; switch ($type) { case 'basic': // Ensure that we don't have the header in different case and set the new value. $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']); $modify['set_headers']['Authorization'] = 'Basic ' . \base64_encode("{$value[0]}:{$value[1]}"); break; case 'digest': // @todo: Do not rely on curl $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_DIGEST; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; case 'ntlm': $options['curl'][\CURLOPT_HTTPAUTH] = \CURLAUTH_NTLM; $options['curl'][\CURLOPT_USERPWD] = "{$value[0]}:{$value[1]}"; break; } } if (isset($options['query'])) { $value = $options['query']; if (\is_array($value)) { $value = \http_build_query($value, null, '&', \PHP_QUERY_RFC3986); } if (!\is_string($value)) { throw new \InvalidArgumentException('query must be a string or array'); } $modify['query'] = $value; unset($options['query']); } // Ensure that sink is not an invalid value. if (isset($options['sink'])) { // TODO: Add more sink validation? if (\is_bool($options['sink'])) { throw new \InvalidArgumentException('sink must not be a boolean'); } } $request = Psr7\modify_request($request, $modify); if ($request->getBody() instanceof Psr7\MultipartStream) { // Use a multipart/form-data POST if a Content-Type is not set. // Ensure that we don't have the header in different case and set the new value. $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']); $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary=' . $request->getBody()->getBoundary(); } // Merge in conditional headers if they are not present. if (isset($options['_conditional'])) { // Build up the changes so it's in a single clone of the message. $modify = []; foreach ($options['_conditional'] as $k => $v) { if (!$request->hasHeader($k)) { $modify['set_headers'][$k] = $v; } } $request = Psr7\modify_request($request, $modify); // Don't pass this internal value along to middleware/handlers. unset($options['_conditional']); } return $request; } /** * Throw Exception with pre-set message. * @return void * @throws \InvalidArgumentException Invalid body. */ private function invalidBody() { throw new \InvalidArgumentException('Passing in the "body" request ' . 'option as an array to send a POST request has been deprecated. ' . 'Please use the "form_params" request option to send a ' . 'application/x-www-form-urlencoded request, or the "multipart" ' . 'request option to send a multipart/form-data request.'); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/Pool.php000064400000011317147600374260021370 0ustar00 $rfn) { if ($rfn instanceof RequestInterface) { (yield $key => $client->sendAsync($rfn, $opts)); } elseif (\is_callable($rfn)) { (yield $key => $rfn($opts)); } else { throw new \InvalidArgumentException('Each value yielded by ' . 'the iterator must be a Psr7\\Http\\Message\\RequestInterface ' . 'or a callable that returns a promise that fulfills ' . 'with a Psr7\\Message\\Http\\ResponseInterface object.'); } } }; $this->each = new EachPromise($requests(), $config); } /** * Get promise * * @return PromiseInterface */ public function promise() { return $this->each->promise(); } /** * Sends multiple requests concurrently and returns an array of responses * and exceptions that uses the same ordering as the provided requests. * * IMPORTANT: This method keeps every request and response in memory, and * as such, is NOT recommended when sending a large number or an * indeterminate number of requests concurrently. * * @param ClientInterface $client Client used to send the requests * @param array|\Iterator $requests Requests to send concurrently. * @param array $options Passes through the options available in * {@see GuzzleHttp\Pool::__construct} * * @return array Returns an array containing the response or an exception * in the same order that the requests were sent. * @throws \InvalidArgumentException if the event format is incorrect. */ public static function batch(ClientInterface $client, $requests, array $options = []) { $res = []; self::cmpCallback($options, 'fulfilled', $res); self::cmpCallback($options, 'rejected', $res); $pool = new static($client, $requests, $options); $pool->promise()->wait(); \ksort($res); return $res; } /** * Execute callback(s) * * @return void */ private static function cmpCallback(array &$options, $name, array &$results) { if (!isset($options[$name])) { $options[$name] = function ($v, $k) use(&$results) { $results[$k] = $v; }; } else { $currentFn = $options[$name]; $options[$name] = function ($v, $k) use(&$results, $currentFn) { $currentFn($v, $k); $results[$k] = $v; }; } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/RetryMiddleware.php000064400000006415147600374260023565 0ustar00decider = $decider; $this->nextHandler = $nextHandler; $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; } /** * Default exponential backoff delay function. * * @param int $retries * * @return int milliseconds. */ public static function exponentialDelay($retries) { return (int) \pow(2, $retries - 1) * 1000; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { if (!isset($options['retries'])) { $options['retries'] = 0; } $fn = $this->nextHandler; return $fn($request, $options)->then($this->onFulfilled($request, $options), $this->onRejected($request, $options)); } /** * Execute fulfilled closure * * @return mixed */ private function onFulfilled(RequestInterface $req, array $options) { return function ($value) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, $value, null)) { return $value; } return $this->doRetry($req, $options, $value); }; } /** * Execute rejected closure * * @return callable */ private function onRejected(RequestInterface $req, array $options) { return function ($reason) use($req, $options) { if (!\call_user_func($this->decider, $options['retries'], $req, null, $reason)) { return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); } return $this->doRetry($req, $options); }; } /** * @return self */ private function doRetry(RequestInterface $request, array $options, ResponseInterface $response = null) { $options['delay'] = \call_user_func($this->delay, ++$options['retries'], $response); return $this($request, $options); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/RequestOptions.php000064400000024151147600374260023463 0ustar00withCookieHeader($request); return $handler($request, $options)->then(function ($response) use($cookieJar, $request) { $cookieJar->extractCookies($request, $response); return $response; }); }; }; } /** * Middleware that throws exceptions for 4xx or 5xx responses when the * "http_error" request option is set to true. * * @return callable Returns a function that accepts the next handler. */ public static function httpErrors() { return function (callable $handler) { return function ($request, array $options) use($handler) { if (empty($options['http_errors'])) { return $handler($request, $options); } return $handler($request, $options)->then(function (ResponseInterface $response) use($request) { $code = $response->getStatusCode(); if ($code < 400) { return $response; } throw RequestException::create($request, $response); }); }; }; } /** * Middleware that pushes history data to an ArrayAccess container. * * @param array|\ArrayAccess $container Container to hold the history (by reference). * * @return callable Returns a function that accepts the next handler. * @throws \InvalidArgumentException if container is not an array or ArrayAccess. */ public static function history(&$container) { if (!\is_array($container) && !$container instanceof \ArrayAccess) { throw new \InvalidArgumentException('history container must be an array or object implementing ArrayAccess'); } return function (callable $handler) use(&$container) { return function ($request, array $options) use($handler, &$container) { return $handler($request, $options)->then(function ($value) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => $value, 'error' => null, 'options' => $options]; return $value; }, function ($reason) use($request, &$container, $options) { $container[] = ['request' => $request, 'response' => null, 'error' => $reason, 'options' => $options]; return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * Middleware that invokes a callback before and after sending a request. * * The provided listener cannot modify or alter the response. It simply * "taps" into the chain to be notified before returning the promise. The * before listener accepts a request and options array, and the after * listener accepts a request, options array, and response promise. * * @param callable $before Function to invoke before forwarding the request. * @param callable $after Function invoked after forwarding. * * @return callable Returns a function that accepts the next handler. */ public static function tap(callable $before = null, callable $after = null) { return function (callable $handler) use($before, $after) { return function ($request, array $options) use($handler, $before, $after) { if ($before) { $before($request, $options); } $response = $handler($request, $options); if ($after) { $after($request, $options, $response); } return $response; }; }; } /** * Middleware that handles request redirects. * * @return callable Returns a function that accepts the next handler. */ public static function redirect() { return function (callable $handler) { return new RedirectMiddleware($handler); }; } /** * Middleware that retries requests based on the boolean result of * invoking the provided "decider" function. * * If no delay function is provided, a simple implementation of exponential * backoff will be utilized. * * @param callable $decider Function that accepts the number of retries, * a request, [response], and [exception] and * returns true if the request is to be retried. * @param callable $delay Function that accepts the number of retries and * returns the number of milliseconds to delay. * * @return callable Returns a function that accepts the next handler. */ public static function retry(callable $decider, callable $delay = null) { return function (callable $handler) use($decider, $delay) { return new RetryMiddleware($decider, $handler, $delay); }; } /** * Middleware that logs requests, responses, and errors using a message * formatter. * * @param LoggerInterface $logger Logs messages. * @param MessageFormatter $formatter Formatter used to create message strings. * @param string $logLevel Level at which to log requests. * * @return callable Returns a function that accepts the next handler. */ public static function log(LoggerInterface $logger, MessageFormatter $formatter, $logLevel = 'info') { return function (callable $handler) use($logger, $formatter, $logLevel) { return function ($request, array $options) use($handler, $logger, $formatter, $logLevel) { return $handler($request, $options)->then(function ($response) use($logger, $request, $formatter, $logLevel) { $message = $formatter->format($request, $response); $logger->log($logLevel, $message); return $response; }, function ($reason) use($logger, $request, $formatter) { $response = $reason instanceof RequestException ? $reason->getResponse() : null; $message = $formatter->format($request, $response, $reason); $logger->notice($message); return \VendorDuplicator\GuzzleHttp\Promise\rejection_for($reason); }); }; }; } /** * This middleware adds a default content-type if possible, a default * content-length or transfer-encoding header, and the expect header. * * @return callable */ public static function prepareBody() { return function (callable $handler) { return new PrepareBodyMiddleware($handler); }; } /** * Middleware that applies a map function to the request before passing to * the next handler. * * @param callable $fn Function that accepts a RequestInterface and returns * a RequestInterface. * @return callable */ public static function mapRequest(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($fn($request), $options); }; }; } /** * Middleware that applies a map function to the resolved promise's * response. * * @param callable $fn Function that accepts a ResponseInterface and * returns a ResponseInterface. * @return callable */ public static function mapResponse(callable $fn) { return function (callable $handler) use($fn) { return function ($request, array $options) use($handler, $fn) { return $handler($request, $options)->then($fn); }; }; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/TransferStats.php000064400000006044147600374260023263 0ustar00request = $request; $this->response = $response; $this->transferTime = $transferTime; $this->handlerErrorData = $handlerErrorData; $this->handlerStats = $handlerStats; } /** * @return RequestInterface */ public function getRequest() { return $this->request; } /** * Returns the response that was received (if any). * * @return ResponseInterface|null */ public function getResponse() { return $this->response; } /** * Returns true if a response was received. * * @return bool */ public function hasResponse() { return $this->response !== null; } /** * Gets handler specific error data. * * This might be an exception, a integer representing an error code, or * anything else. Relying on this value assumes that you know what handler * you are using. * * @return mixed */ public function getHandlerErrorData() { return $this->handlerErrorData; } /** * Get the effective URI the request was sent to. * * @return UriInterface */ public function getEffectiveUri() { return $this->request->getUri(); } /** * Get the estimated time the request was being transferred by the handler. * * @return float|null Time in seconds. */ public function getTransferTime() { return $this->transferTime; } /** * Gets an array of all of the handler specific transfer data. * * @return array */ public function getHandlerStats() { return $this->handlerStats; } /** * Get a specific handler statistic from the handler by name. * * @param string $stat Handler specific transfer stat to retrieve. * * @return mixed|null */ public function getHandlerStat($stat) { return isset($this->handlerStats[$stat]) ? $this->handlerStats[$stat] : null; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/functions_include.php000064400000000321147600374260024163 0ustar00nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; // Don't do anything if the request has no body. if ($request->getBody()->getSize() === 0) { return $fn($request, $options); } $modify = []; // Add a default content-type if possible. if (!$request->hasHeader('Content-Type')) { if ($uri = $request->getBody()->getMetadata('uri')) { if ($type = Psr7\mimetype_from_filename($uri)) { $modify['set_headers']['Content-Type'] = $type; } } } // Add a default content-length or transfer-encoding header. if (!$request->hasHeader('Content-Length') && !$request->hasHeader('Transfer-Encoding')) { $size = $request->getBody()->getSize(); if ($size !== null) { $modify['set_headers']['Content-Length'] = $size; } else { $modify['set_headers']['Transfer-Encoding'] = 'chunked'; } } // Add the expect header if needed. $this->addExpectHeader($request, $options, $modify); return $fn(Psr7\modify_request($request, $modify), $options); } /** * Add expect header * * @return void */ private function addExpectHeader(RequestInterface $request, array $options, array &$modify) { // Determine if the Expect header should be used if ($request->hasHeader('Expect')) { return; } $expect = isset($options['expect']) ? $options['expect'] : null; // Return if disabled or if you're not using HTTP/1.1 or HTTP/2.0 if ($expect === \false || $request->getProtocolVersion() < 1.1) { return; } // The expect header is unconditionally enabled if ($expect === \true) { $modify['set_headers']['Expect'] = '100-Continue'; return; } // By default, send the expect header when the payload is > 1mb if ($expect === null) { $expect = 1048576; } // Always add if the body cannot be rewound, the size cannot be // determined, or the size is greater than the cutoff threshold $body = $request->getBody(); $size = $body->getSize(); if ($size === null || $size >= (int) $expect || !$body->isSeekable()) { $modify['set_headers']['Expect'] = '100-Continue'; } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/RedirectMiddleware.php000064400000017610147600374260024220 0ustar00 5, 'protocols' => ['http', 'https'], 'strict' => \false, 'referer' => \false, 'track_redirects' => \false]; /** @var callable */ private $nextHandler; /** * @param callable $nextHandler Next handler to invoke. */ public function __construct(callable $nextHandler) { $this->nextHandler = $nextHandler; } /** * @param RequestInterface $request * @param array $options * * @return PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $fn = $this->nextHandler; if (empty($options['allow_redirects'])) { return $fn($request, $options); } if ($options['allow_redirects'] === \true) { $options['allow_redirects'] = self::$defaultSettings; } elseif (!\is_array($options['allow_redirects'])) { throw new \InvalidArgumentException('allow_redirects must be true, false, or array'); } else { // Merge the default settings with the provided settings $options['allow_redirects'] += self::$defaultSettings; } if (empty($options['allow_redirects']['max'])) { return $fn($request, $options); } return $fn($request, $options)->then(function (ResponseInterface $response) use($request, $options) { return $this->checkRedirect($request, $options, $response); }); } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return ResponseInterface|PromiseInterface */ public function checkRedirect(RequestInterface $request, array $options, ResponseInterface $response) { if (\substr($response->getStatusCode(), 0, 1) != '3' || !$response->hasHeader('Location')) { return $response; } $this->guardMax($request, $options); $nextRequest = $this->modifyRequest($request, $options, $response); // If authorization is handled by curl, unset it if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $nextRequest->getUri()) && \defined('\\CURLOPT_HTTPAUTH')) { unset($options['curl'][\CURLOPT_HTTPAUTH], $options['curl'][\CURLOPT_USERPWD]); } if (isset($options['allow_redirects']['on_redirect'])) { \call_user_func($options['allow_redirects']['on_redirect'], $request, $response, $nextRequest->getUri()); } /** @var PromiseInterface|ResponseInterface $promise */ $promise = $this($nextRequest, $options); // Add headers to be able to track history of redirects. if (!empty($options['allow_redirects']['track_redirects'])) { return $this->withTracking($promise, (string) $nextRequest->getUri(), $response->getStatusCode()); } return $promise; } /** * Enable tracking on promise. * * @return PromiseInterface */ private function withTracking(PromiseInterface $promise, $uri, $statusCode) { return $promise->then(function (ResponseInterface $response) use($uri, $statusCode) { // Note that we are pushing to the front of the list as this // would be an earlier response than what is currently present // in the history header. $historyHeader = $response->getHeader(self::HISTORY_HEADER); $statusHeader = $response->getHeader(self::STATUS_HISTORY_HEADER); \array_unshift($historyHeader, $uri); \array_unshift($statusHeader, $statusCode); return $response->withHeader(self::HISTORY_HEADER, $historyHeader)->withHeader(self::STATUS_HISTORY_HEADER, $statusHeader); }); } /** * Check for too many redirects. * * @return void * * @throws TooManyRedirectsException Too many redirects. */ private function guardMax(RequestInterface $request, array &$options) { $current = isset($options['__redirect_count']) ? $options['__redirect_count'] : 0; $options['__redirect_count'] = $current + 1; $max = $options['allow_redirects']['max']; if ($options['__redirect_count'] > $max) { throw new TooManyRedirectsException("Will not follow more than {$max} redirects", $request); } } /** * @param RequestInterface $request * @param array $options * @param ResponseInterface $response * * @return RequestInterface */ public function modifyRequest(RequestInterface $request, array $options, ResponseInterface $response) { // Request modifications to apply. $modify = []; $protocols = $options['allow_redirects']['protocols']; // Use a GET request if this is an entity enclosing request and we are // not forcing RFC compliance, but rather emulating what all browsers // would do. $statusCode = $response->getStatusCode(); if ($statusCode == 303 || $statusCode <= 302 && !$options['allow_redirects']['strict']) { $modify['method'] = 'GET'; $modify['body'] = ''; } $uri = self::redirectUri($request, $response, $protocols); if (isset($options['idn_conversion']) && $options['idn_conversion'] !== \false) { $idnOptions = $options['idn_conversion'] === \true ? \IDNA_DEFAULT : $options['idn_conversion']; $uri = Utils::idnUriConvert($uri, $idnOptions); } $modify['uri'] = $uri; Psr7\rewind_body($request); // Add the Referer header if it is told to do so and only // add the header if we are not redirecting from https to http. if ($options['allow_redirects']['referer'] && $modify['uri']->getScheme() === $request->getUri()->getScheme()) { $uri = $request->getUri()->withUserInfo(''); $modify['set_headers']['Referer'] = (string) $uri; } else { $modify['remove_headers'][] = 'Referer'; } // Remove Authorization and Cookie headers if URI is cross-origin. if (Psr7\UriComparator::isCrossOrigin($request->getUri(), $modify['uri'])) { $modify['remove_headers'][] = 'Authorization'; $modify['remove_headers'][] = 'Cookie'; } return Psr7\modify_request($request, $modify); } /** * Set the appropriate URL on the request based on the location header. * * @param RequestInterface $request * @param ResponseInterface $response * @param array $protocols * * @return UriInterface */ private static function redirectUri(RequestInterface $request, ResponseInterface $response, array $protocols) { $location = Psr7\UriResolver::resolve($request->getUri(), new Psr7\Uri($response->getHeaderLine('Location'))); // Ensure that the redirect URI is allowed based on the protocols. if (!\in_array($location->getScheme(), $protocols)) { throw new BadResponseException(\sprintf('Redirect URI, %s, does not use one of the allowed redirect protocols: %s', $location, \implode(', ', $protocols)), $request, $response); } return $location; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/src/HandlerStack.php000064400000017110147600374260023017 0ustar00push(Middleware::httpErrors(), 'http_errors'); $stack->push(Middleware::redirect(), 'allow_redirects'); $stack->push(Middleware::cookies(), 'cookies'); $stack->push(Middleware::prepareBody(), 'prepare_body'); return $stack; } /** * @param callable $handler Underlying HTTP handler. */ public function __construct(callable $handler = null) { $this->handler = $handler; } /** * Invokes the handler stack as a composed handler * * @param RequestInterface $request * @param array $options * * @return ResponseInterface|PromiseInterface */ public function __invoke(RequestInterface $request, array $options) { $handler = $this->resolve(); return $handler($request, $options); } /** * Dumps a string representation of the stack. * * @return string */ public function __toString() { $depth = 0; $stack = []; if ($this->handler) { $stack[] = "0) Handler: " . $this->debugCallable($this->handler); } $result = ''; foreach (\array_reverse($this->stack) as $tuple) { $depth++; $str = "{$depth}) Name: '{$tuple[1]}', "; $str .= "Function: " . $this->debugCallable($tuple[0]); $result = "> {$str}\n{$result}"; $stack[] = $str; } foreach (\array_keys($stack) as $k) { $result .= "< {$stack[$k]}\n"; } return $result; } /** * Set the HTTP handler that actually returns a promise. * * @param callable $handler Accepts a request and array of options and * returns a Promise. */ public function setHandler(callable $handler) { $this->handler = $handler; $this->cached = null; } /** * Returns true if the builder has a handler. * * @return bool */ public function hasHandler() { return (bool) $this->handler; } /** * Unshift a middleware to the bottom of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function unshift(callable $middleware, $name = null) { \array_unshift($this->stack, [$middleware, $name]); $this->cached = null; } /** * Push a middleware to the top of the stack. * * @param callable $middleware Middleware function * @param string $name Name to register for this middleware. */ public function push(callable $middleware, $name = '') { $this->stack[] = [$middleware, $name]; $this->cached = null; } /** * Add a middleware before another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function before($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \true); } /** * Add a middleware after another middleware by name. * * @param string $findName Middleware to find * @param callable $middleware Middleware function * @param string $withName Name to register for this middleware. */ public function after($findName, callable $middleware, $withName = '') { $this->splice($findName, $withName, $middleware, \false); } /** * Remove a middleware by instance or name from the stack. * * @param callable|string $remove Middleware to remove by instance or name. */ public function remove($remove) { $this->cached = null; $idx = \is_callable($remove) ? 0 : 1; $this->stack = \array_values(\array_filter($this->stack, function ($tuple) use($idx, $remove) { return $tuple[$idx] !== $remove; })); } /** * Compose the middleware and handler into a single callable function. * * @return callable */ public function resolve() { if (!$this->cached) { if (!($prev = $this->handler)) { throw new \LogicException('No handler has been specified'); } foreach (\array_reverse($this->stack) as $fn) { $prev = $fn[0]($prev); } $this->cached = $prev; } return $this->cached; } /** * @param string $name * @return int */ private function findByName($name) { foreach ($this->stack as $k => $v) { if ($v[1] === $name) { return $k; } } throw new \InvalidArgumentException("Middleware not found: {$name}"); } /** * Splices a function into the middleware list at a specific position. * * @param string $findName * @param string $withName * @param callable $middleware * @param bool $before */ private function splice($findName, $withName, callable $middleware, $before) { $this->cached = null; $idx = $this->findByName($findName); $tuple = [$middleware, $withName]; if ($before) { if ($idx === 0) { \array_unshift($this->stack, $tuple); } else { $replacement = [$tuple, $this->stack[$idx]]; \array_splice($this->stack, $idx, 1, $replacement); } } elseif ($idx === \count($this->stack) - 1) { $this->stack[] = $tuple; } else { $replacement = [$this->stack[$idx], $tuple]; \array_splice($this->stack, $idx, 1, $replacement); } } /** * Provides a debug string for a given callable. * * @param array|callable $fn Function to write as a string. * * @return string */ private function debugCallable($fn) { if (\is_string($fn)) { return "callable({$fn})"; } if (\is_array($fn)) { return \is_string($fn[0]) ? "callable({$fn[0]}::{$fn[1]})" : "callable(['" . \get_class($fn[0]) . "', '{$fn[1]}'])"; } return 'callable(' . \spl_object_hash($fn) . ')'; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/guzzle/Dockerfile000064400000000603147600374260021145 0ustar00FROM composer:latest as setup RUN mkdir /guzzle WORKDIR /guzzle RUN set -xe \ && composer init --name=guzzlehttp/test --description="Simple project for testing Guzzle scripts" --author="Márk Sági-Kazár " --no-interaction \ && composer require guzzlehttp/guzzle FROM php:7.3 RUN mkdir /guzzle WORKDIR /guzzle COPY --from=setup /guzzle /guzzle addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/AggregateException.php000064400000000555147600374260024547 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\Utils::queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface */ public static function queue(TaskQueueInterface $assign = null) { static $queue; if ($assign) { $queue = $assign; } elseif (!$queue) { $queue = new TaskQueue(); } return $queue; } /** * Adds a function to run in the task queue when it is next `run()` and * returns a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface */ public static function task(callable $task) { $queue = self::queue(); $promise = new Promise([$queue, 'run']); $queue->add(function () use($task, $promise) { try { if (Is::pending($promise)) { $promise->resolve($task()); } } catch (\Throwable $e) { $promise->reject($e); } catch (\Exception $e) { $promise->reject($e); } }); return $promise; } /** * Synchronously waits on a promise to resolve and returns an inspection * state array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the * array will contain a "value" key mapping to the fulfilled value of the * promise. If the promise is rejected, the array will contain a "reason" * key mapping to the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array */ public static function inspect(PromiseInterface $promise) { try { return ['state' => PromiseInterface::FULFILLED, 'value' => $promise->wait()]; } catch (RejectionException $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e->getReason()]; } catch (\Throwable $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } catch (\Exception $e) { return ['state' => PromiseInterface::REJECTED, 'reason' => $e]; } } /** * Waits on all of the provided promises, but does not unwrap rejected * promises as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array */ public static function inspectAll($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = self::inspect($promise); } return $results; } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same * order the promises were provided). An exception is thrown if any of the * promises are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 */ public static function unwrap($promises) { $results = []; foreach ($promises as $key => $promise) { $results[$key] = $promise->wait(); } return $results; } /** * Given an array of promises, return a promise that is fulfilled when all * the items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface */ public static function all($promises, $recursive = \false) { $results = []; $promise = Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = $value; }, function ($reason, $idx, Promise $aggregate) { $aggregate->reject($reason); })->then(function () use(&$results) { \ksort($results); return $results; }); if (\true === $recursive) { $promise = $promise->then(function ($results) use($recursive, &$promises) { foreach ($promises as $promise) { if (Is::pending($promise)) { return self::all($promises, $recursive); } } return $results; }); } return $promise; } /** * Initiate a competitive race between multiple promises or values (values * will become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise * is fulfilled with an array that contains the fulfillment values of the * winners in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number * of fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function some($count, $promises) { $results = []; $rejections = []; return Each::of($promises, function ($value, $idx, PromiseInterface $p) use(&$results, $count) { if (Is::settled($p)) { return; } $results[$idx] = $value; if (\count($results) >= $count) { $p->resolve(null); } }, function ($reason) use(&$rejections) { $rejections[] = $reason; })->then(function () use(&$results, &$rejections, $count) { if (\count($results) !== $count) { throw new AggregateException('Not enough promises to fulfill count', $rejections); } \ksort($results); return \array_values($results); }); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function any($promises) { return self::some(1, $promises)->then(function ($values) { return $values[0]; }); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface */ public static function settle($promises) { $results = []; return Each::of($promises, function ($value, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::FULFILLED, 'value' => $value]; }, function ($reason, $idx) use(&$results) { $results[$idx] = ['state' => PromiseInterface::REJECTED, 'reason' => $reason]; })->then(function () use(&$results) { \ksort($results); return $results; }); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/functions.php000064400000023541147600374260023012 0ustar00 * while ($eventLoop->isRunning()) { * GuzzleHttp\Promise\queue()->run(); * } * * * @param TaskQueueInterface $assign Optionally specify a new queue instance. * * @return TaskQueueInterface * * @deprecated queue will be removed in guzzlehttp/promises:2.0. Use Utils::queue instead. */ function queue(TaskQueueInterface $assign = null) { return Utils::queue($assign); } /** * Adds a function to run in the task queue when it is next `run()` and returns * a promise that is fulfilled or rejected with the result. * * @param callable $task Task function to run. * * @return PromiseInterface * * @deprecated task will be removed in guzzlehttp/promises:2.0. Use Utils::task instead. */ function task(callable $task) { return Utils::task($task); } /** * Creates a promise for a value if the value is not a promise. * * @param mixed $value Promise or value. * * @return PromiseInterface * * @deprecated promise_for will be removed in guzzlehttp/promises:2.0. Use Create::promiseFor instead. */ function promise_for($value) { return Create::promiseFor($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. If * the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface * * @deprecated rejection_for will be removed in guzzlehttp/promises:2.0. Use Create::rejectionFor instead. */ function rejection_for($reason) { return Create::rejectionFor($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable * * @deprecated exception_for will be removed in guzzlehttp/promises:2.0. Use Create::exceptionFor instead. */ function exception_for($reason) { return Create::exceptionFor($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator * * @deprecated iter_for will be removed in guzzlehttp/promises:2.0. Use Create::iterFor instead. */ function iter_for($value) { return Create::iterFor($value); } /** * Synchronously waits on a promise to resolve and returns an inspection state * array. * * Returns a state associative array containing a "state" key mapping to a * valid promise state. If the state of the promise is "fulfilled", the array * will contain a "value" key mapping to the fulfilled value of the promise. If * the promise is rejected, the array will contain a "reason" key mapping to * the rejection reason of the promise. * * @param PromiseInterface $promise Promise or value. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspect instead. */ function inspect(PromiseInterface $promise) { return Utils::inspect($promise); } /** * Waits on all of the provided promises, but does not unwrap rejected promises * as thrown exception. * * Returns an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param PromiseInterface[] $promises Traversable of promises to wait upon. * * @return array * * @deprecated inspect will be removed in guzzlehttp/promises:2.0. Use Utils::inspectAll instead. */ function inspect_all($promises) { return Utils::inspectAll($promises); } /** * Waits on all of the provided promises and returns the fulfilled values. * * Returns an array that contains the value of each promise (in the same order * the promises were provided). An exception is thrown if any of the promises * are rejected. * * @param iterable $promises Iterable of PromiseInterface objects to wait on. * * @return array * * @throws \Exception on error * @throws \Throwable on error in PHP >=7 * * @deprecated unwrap will be removed in guzzlehttp/promises:2.0. Use Utils::unwrap instead. */ function unwrap($promises) { return Utils::unwrap($promises); } /** * Given an array of promises, return a promise that is fulfilled when all the * items in the array are fulfilled. * * The promise's fulfillment value is an array with fulfillment values at * respective positions to the original array. If any promise in the array * rejects, the returned promise is rejected with the rejection reason. * * @param mixed $promises Promises or values. * @param bool $recursive If true, resolves new promises that might have been added to the stack during its own resolution. * * @return PromiseInterface * * @deprecated all will be removed in guzzlehttp/promises:2.0. Use Utils::all instead. */ function all($promises, $recursive = \false) { return Utils::all($promises, $recursive); } /** * Initiate a competitive race between multiple promises or values (values will * become immediately fulfilled promises). * * When count amount of promises have been fulfilled, the returned promise is * fulfilled with an array that contains the fulfillment values of the winners * in order of resolution. * * This promise is rejected with a {@see AggregateException} if the number of * fulfilled promises is less than the desired $count. * * @param int $count Total number of promises. * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated some will be removed in guzzlehttp/promises:2.0. Use Utils::some instead. */ function some($count, $promises) { return Utils::some($count, $promises); } /** * Like some(), with 1 as count. However, if the promise fulfills, the * fulfillment value is not an array of 1 but the value directly. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated any will be removed in guzzlehttp/promises:2.0. Use Utils::any instead. */ function any($promises) { return Utils::any($promises); } /** * Returns a promise that is fulfilled when all of the provided promises have * been fulfilled or rejected. * * The returned promise is fulfilled with an array of inspection state arrays. * * @see inspect for the inspection state array format. * * @param mixed $promises Promises or values. * * @return PromiseInterface * * @deprecated settle will be removed in guzzlehttp/promises:2.0. Use Utils::settle instead. */ function settle($promises) { return Utils::settle($promises); } /** * Given an iterator that yields promises or values, returns a promise that is * fulfilled with a null value when the iterator has been consumed or the * aggregate promise has been fulfilled or rejected. * * $onFulfilled is a function that accepts the fulfilled value, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * $onRejected is a function that accepts the rejection reason, iterator index, * and the aggregate promise. The callback can invoke any necessary side * effects and choose to resolve or reject the aggregate if needed. * * @param mixed $iterable Iterator or array to iterate over. * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each will be removed in guzzlehttp/promises:2.0. Use Each::of instead. */ function each($iterable, callable $onFulfilled = null, callable $onRejected = null) { return Each::of($iterable, $onFulfilled, $onRejected); } /** * Like each, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow for * dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface * * @deprecated each_limit will be removed in guzzlehttp/promises:2.0. Use Each::ofLimit instead. */ function each_limit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return Each::ofLimit($iterable, $concurrency, $onFulfilled, $onRejected); } /** * Like each_limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface * * @deprecated each_limit_all will be removed in guzzlehttp/promises:2.0. Use Each::ofLimitAll instead. */ function each_limit_all($iterable, $concurrency, callable $onFulfilled = null) { return Each::ofLimitAll($iterable, $concurrency, $onFulfilled); } /** * Returns true if a promise is fulfilled. * * @return bool * * @deprecated is_fulfilled will be removed in guzzlehttp/promises:2.0. Use Is::fulfilled instead. */ function is_fulfilled(PromiseInterface $promise) { return Is::fulfilled($promise); } /** * Returns true if a promise is rejected. * * @return bool * * @deprecated is_rejected will be removed in guzzlehttp/promises:2.0. Use Is::rejected instead. */ function is_rejected(PromiseInterface $promise) { return Is::rejected($promise); } /** * Returns true if a promise is fulfilled or rejected. * * @return bool * * @deprecated is_settled will be removed in guzzlehttp/promises:2.0. Use Is::settled instead. */ function is_settled(PromiseInterface $promise) { return Is::settled($promise); } /** * Create a new coroutine. * * @see Coroutine * * @return PromiseInterface * * @deprecated coroutine will be removed in guzzlehttp/promises:2.0. Use Coroutine::of instead. */ function coroutine(callable $generatorFn) { return Coroutine::of($generatorFn); } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/Is.php000064400000001765147600374260021361 0ustar00getState() === PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled or rejected. * * @return bool */ public static function settled(PromiseInterface $promise) { return $promise->getState() !== PromiseInterface::PENDING; } /** * Returns true if a promise is fulfilled. * * @return bool */ public static function fulfilled(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::FULFILLED; } /** * Returns true if a promise is rejected. * * @return bool */ public static function rejected(PromiseInterface $promise) { return $promise->getState() === PromiseInterface::REJECTED; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/RejectionException.php000064400000002254147600374260024601 0ustar00reason = $reason; $message = 'The promise was rejected'; if ($description) { $message .= ' with reason: ' . $description; } elseif (\is_string($reason) || \is_object($reason) && \method_exists($reason, '__toString')) { $message .= ' with reason: ' . $this->reason; } elseif ($reason instanceof \JsonSerializable) { $message .= ' with reason: ' . \json_encode($this->reason, \JSON_PRETTY_PRINT); } parent::__construct($message); } /** * Returns the rejection reason. * * @return mixed */ public function getReason() { return $this->reason; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/PromisorInterface.php000064400000000405147600374260024427 0ustar00run(); */ class TaskQueue implements TaskQueueInterface { private $enableShutdown = \true; private $queue = []; public function __construct($withShutdown = \true) { if ($withShutdown) { \register_shutdown_function(function () { if ($this->enableShutdown) { // Only run the tasks if an E_ERROR didn't occur. $err = \error_get_last(); if (!$err || $err['type'] ^ \E_ERROR) { $this->run(); } } }); } } public function isEmpty() { return !$this->queue; } public function add(callable $task) { $this->queue[] = $task; } public function run() { while ($task = \array_shift($this->queue)) { /** @var callable $task */ $task(); } } /** * The task queue will be run and exhausted by default when the process * exits IFF the exit is not the result of a PHP E_ERROR error. * * You can disable running the automatic shutdown of the queue by calling * this function. If you disable the task queue shutdown process, then you * MUST either run the task queue (as a result of running your event loop * or manually using the run() method) or wait on each outstanding promise. * * Note: This shutdown will occur before any destructors are triggered. */ public function disableShutdown() { $this->enableShutdown = \false; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/PromiseInterface.php000064400000005431147600374260024237 0ustar00then([$promise, 'resolve'], [$promise, 'reject']); return $promise; } return new FulfilledPromise($value); } /** * Creates a rejected promise for a reason if the reason is not a promise. * If the provided reason is a promise, then it is returned as-is. * * @param mixed $reason Promise or reason. * * @return PromiseInterface */ public static function rejectionFor($reason) { if ($reason instanceof PromiseInterface) { return $reason; } return new RejectedPromise($reason); } /** * Create an exception for a rejected promise value. * * @param mixed $reason * * @return \Exception|\Throwable */ public static function exceptionFor($reason) { if ($reason instanceof \Exception || $reason instanceof \Throwable) { return $reason; } return new RejectionException($reason); } /** * Returns an iterator for the given value. * * @param mixed $value * * @return \Iterator */ public static function iterFor($value) { if ($value instanceof \Iterator) { return $value; } if (\is_array($value)) { return new \ArrayIterator($value); } return new \ArrayIterator([$value]); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/Each.php000064400000005153147600374260021641 0ustar00 $onFulfilled, 'rejected' => $onRejected]))->promise(); } /** * Like of, but only allows a certain number of outstanding promises at any * given time. * * $concurrency may be an integer or a function that accepts the number of * pending promises and returns a numeric concurrency limit value to allow * for dynamic a concurrency size. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * @param callable $onRejected * * @return PromiseInterface */ public static function ofLimit($iterable, $concurrency, callable $onFulfilled = null, callable $onRejected = null) { return (new EachPromise($iterable, ['fulfilled' => $onFulfilled, 'rejected' => $onRejected, 'concurrency' => $concurrency]))->promise(); } /** * Like limit, but ensures that no promise in the given $iterable argument * is rejected. If any promise is rejected, then the aggregate promise is * rejected with the encountered rejection. * * @param mixed $iterable * @param int|callable $concurrency * @param callable $onFulfilled * * @return PromiseInterface */ public static function ofLimitAll($iterable, $concurrency, callable $onFulfilled = null) { return self::ofLimit($iterable, $concurrency, $onFulfilled, function ($reason, $idx, PromiseInterface $aggregate) { $aggregate->reject($reason); }); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/RejectedPromise.php000064400000004303147600374260024061 0ustar00reason = $reason; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // If there's no onRejected callback then just return self. if (!$onRejected) { return $this; } $queue = Utils::queue(); $reason = $this->reason; $p = new Promise([$queue, 'run']); $queue->add(static function () use($p, $reason, $onRejected) { if (Is::pending($p)) { try { // Return a resolved promise if onRejected does not throw. $p->resolve($onRejected($reason)); } catch (\Throwable $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } catch (\Exception $e) { // onRejected threw, so return a rejected promise. $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { if ($unwrap) { throw Create::exceptionFor($this->reason); } return null; } public function getState() { return self::REJECTED; } public function resolve($value) { throw new \LogicException("Cannot resolve a rejected promise"); } public function reject($reason) { if ($reason !== $this->reason) { throw new \LogicException("Cannot reject a rejected promise"); } } public function cancel() { // pass } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/FulfilledPromise.php000064400000003637147600374260024253 0ustar00value = $value; } public function then(callable $onFulfilled = null, callable $onRejected = null) { // Return itself if there is no onFulfilled function. if (!$onFulfilled) { return $this; } $queue = Utils::queue(); $p = new Promise([$queue, 'run']); $value = $this->value; $queue->add(static function () use($p, $value, $onFulfilled) { if (Is::pending($p)) { try { $p->resolve($onFulfilled($value)); } catch (\Throwable $e) { $p->reject($e); } catch (\Exception $e) { $p->reject($e); } } }); return $p; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true, $defaultDelivery = null) { return $unwrap ? $this->value : null; } public function getState() { return self::FULFILLED; } public function resolve($value) { if ($value !== $this->value) { throw new \LogicException("Cannot resolve a fulfilled promise"); } } public function reject($reason) { throw new \LogicException("Cannot reject a fulfilled promise"); } public function cancel() { // pass } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/functions_include.php000064400000000331147600374260024505 0ustar00waitFn = $waitFn; $this->cancelFn = $cancelFn; } public function then(callable $onFulfilled = null, callable $onRejected = null) { if ($this->state === self::PENDING) { $p = new Promise(null, [$this, 'cancel']); $this->handlers[] = [$p, $onFulfilled, $onRejected]; $p->waitList = $this->waitList; $p->waitList[] = $this; return $p; } // Return a fulfilled promise and immediately invoke any callbacks. if ($this->state === self::FULFILLED) { $promise = Create::promiseFor($this->result); return $onFulfilled ? $promise->then($onFulfilled) : $promise; } // It's either cancelled or rejected, so return a rejected promise // and immediately invoke any callbacks. $rejection = Create::rejectionFor($this->result); return $onRejected ? $rejection->then(null, $onRejected) : $rejection; } public function otherwise(callable $onRejected) { return $this->then(null, $onRejected); } public function wait($unwrap = \true) { $this->waitIfPending(); if ($this->result instanceof PromiseInterface) { return $this->result->wait($unwrap); } if ($unwrap) { if ($this->state === self::FULFILLED) { return $this->result; } // It's rejected so "unwrap" and throw an exception. throw Create::exceptionFor($this->result); } } public function getState() { return $this->state; } public function cancel() { if ($this->state !== self::PENDING) { return; } $this->waitFn = $this->waitList = null; if ($this->cancelFn) { $fn = $this->cancelFn; $this->cancelFn = null; try { $fn(); } catch (\Throwable $e) { $this->reject($e); } catch (\Exception $e) { $this->reject($e); } } // Reject the promise only if it wasn't rejected in a then callback. /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject(new CancellationException('Promise has been cancelled')); } } public function resolve($value) { $this->settle(self::FULFILLED, $value); } public function reject($reason) { $this->settle(self::REJECTED, $reason); } private function settle($state, $value) { if ($this->state !== self::PENDING) { // Ignore calls with the same resolution. if ($state === $this->state && $value === $this->result) { return; } throw $this->state === $state ? new \LogicException("The promise is already {$state}.") : new \LogicException("Cannot change a {$this->state} promise to {$state}"); } if ($value === $this) { throw new \LogicException('Cannot fulfill or reject a promise with itself'); } // Clear out the state of the promise but stash the handlers. $this->state = $state; $this->result = $value; $handlers = $this->handlers; $this->handlers = null; $this->waitList = $this->waitFn = null; $this->cancelFn = null; if (!$handlers) { return; } // If the value was not a settled promise or a thenable, then resolve // it in the task queue using the correct ID. if (!\is_object($value) || !\method_exists($value, 'then')) { $id = $state === self::FULFILLED ? 1 : 2; // It's a success, so resolve the handlers in the queue. Utils::queue()->add(static function () use($id, $value, $handlers) { foreach ($handlers as $handler) { self::callHandler($id, $value, $handler); } }); } elseif ($value instanceof Promise && Is::pending($value)) { // We can just merge our handlers onto the next promise. $value->handlers = \array_merge($value->handlers, $handlers); } else { // Resolve the handlers when the forwarded promise is resolved. $value->then(static function ($value) use($handlers) { foreach ($handlers as $handler) { self::callHandler(1, $value, $handler); } }, static function ($reason) use($handlers) { foreach ($handlers as $handler) { self::callHandler(2, $reason, $handler); } }); } } /** * Call a stack of handlers using a specific callback index and value. * * @param int $index 1 (resolve) or 2 (reject). * @param mixed $value Value to pass to the callback. * @param array $handler Array of handler data (promise and callbacks). */ private static function callHandler($index, $value, array $handler) { /** @var PromiseInterface $promise */ $promise = $handler[0]; // The promise may have been cancelled or resolved before placing // this thunk in the queue. if (Is::settled($promise)) { return; } try { if (isset($handler[$index])) { /* * If $f throws an exception, then $handler will be in the exception * stack trace. Since $handler contains a reference to the callable * itself we get a circular reference. We clear the $handler * here to avoid that memory leak. */ $f = $handler[$index]; unset($handler); $promise->resolve($f($value)); } elseif ($index === 1) { // Forward resolution values as-is. $promise->resolve($value); } else { // Forward rejections down the chain. $promise->reject($value); } } catch (\Throwable $reason) { $promise->reject($reason); } catch (\Exception $reason) { $promise->reject($reason); } } private function waitIfPending() { if ($this->state !== self::PENDING) { return; } elseif ($this->waitFn) { $this->invokeWaitFn(); } elseif ($this->waitList) { $this->invokeWaitList(); } else { // If there's no wait function, then reject the promise. $this->reject('Cannot wait on a promise that has ' . 'no internal wait function. You must provide a wait ' . 'function when constructing the promise to be able to ' . 'wait on a promise.'); } Utils::queue()->run(); /** @psalm-suppress RedundantCondition */ if ($this->state === self::PENDING) { $this->reject('Invoking the wait callback did not resolve the promise'); } } private function invokeWaitFn() { try { $wfn = $this->waitFn; $this->waitFn = null; $wfn(\true); } catch (\Exception $reason) { if ($this->state === self::PENDING) { // The promise has not been resolved yet, so reject the promise // with the exception. $this->reject($reason); } else { // The promise was already resolved, so there's a problem in // the application. throw $reason; } } } private function invokeWaitList() { $waitList = $this->waitList; $this->waitList = null; foreach ($waitList as $result) { do { $result->waitIfPending(); $result = $result->result; } while ($result instanceof Promise); if ($result instanceof PromiseInterface) { $result->wait(\false); } } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/CancellationException.php000064400000000310147600374260025242 0ustar00then(function ($v) { echo $v; }); * * @param callable $generatorFn Generator function to wrap into a promise. * * @return Promise * * @link https://github.com/petkaantonov/bluebird/blob/master/API.md#generators inspiration */ final class Coroutine implements PromiseInterface { /** * @var PromiseInterface|null */ private $currentPromise; /** * @var Generator */ private $generator; /** * @var Promise */ private $result; public function __construct(callable $generatorFn) { $this->generator = $generatorFn(); $this->result = new Promise(function () { while (isset($this->currentPromise)) { $this->currentPromise->wait(); } }); try { $this->nextCoroutine($this->generator->current()); } catch (\Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * Create a new coroutine. * * @return self */ public static function of(callable $generatorFn) { return new self($generatorFn); } public function then(callable $onFulfilled = null, callable $onRejected = null) { return $this->result->then($onFulfilled, $onRejected); } public function otherwise(callable $onRejected) { return $this->result->otherwise($onRejected); } public function wait($unwrap = \true) { return $this->result->wait($unwrap); } public function getState() { return $this->result->getState(); } public function resolve($value) { $this->result->resolve($value); } public function reject($reason) { $this->result->reject($reason); } public function cancel() { $this->currentPromise->cancel(); $this->result->cancel(); } private function nextCoroutine($yielded) { $this->currentPromise = Create::promiseFor($yielded)->then([$this, '_handleSuccess'], [$this, '_handleFailure']); } /** * @internal */ public function _handleSuccess($value) { unset($this->currentPromise); try { $next = $this->generator->send($value); if ($this->generator->valid()) { $this->nextCoroutine($next); } else { $this->result->resolve($value); } } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } /** * @internal */ public function _handleFailure($reason) { unset($this->currentPromise); try { $nextYield = $this->generator->throw(Create::exceptionFor($reason)); // The throw was caught, so keep iterating on the coroutine $this->nextCoroutine($nextYield); } catch (Exception $exception) { $this->result->reject($exception); } catch (Throwable $throwable) { $this->result->reject($throwable); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/promises/src/EachPromise.php000064400000016437147600374260023207 0ustar00iterable = Create::iterFor($iterable); if (isset($config['concurrency'])) { $this->concurrency = $config['concurrency']; } if (isset($config['fulfilled'])) { $this->onFulfilled = $config['fulfilled']; } if (isset($config['rejected'])) { $this->onRejected = $config['rejected']; } } /** @psalm-suppress InvalidNullableReturnType */ public function promise() { if ($this->aggregate) { return $this->aggregate; } try { $this->createPromise(); /** @psalm-assert Promise $this->aggregate */ $this->iterable->rewind(); $this->refillPending(); } catch (\Throwable $e) { $this->aggregate->reject($e); } catch (\Exception $e) { $this->aggregate->reject($e); } /** * @psalm-suppress NullableReturnStatement * @phpstan-ignore-next-line */ return $this->aggregate; } private function createPromise() { $this->mutex = \false; $this->aggregate = new Promise(function () { if ($this->checkIfFinished()) { return; } \reset($this->pending); // Consume a potentially fluctuating list of promises while // ensuring that indexes are maintained (precluding array_shift). while ($promise = \current($this->pending)) { \next($this->pending); $promise->wait(); if (Is::settled($this->aggregate)) { return; } } }); // Clear the references when the promise is resolved. $clearFn = function () { $this->iterable = $this->concurrency = $this->pending = null; $this->onFulfilled = $this->onRejected = null; $this->nextPendingIndex = 0; }; $this->aggregate->then($clearFn, $clearFn); } private function refillPending() { if (!$this->concurrency) { // Add all pending promises. while ($this->addPending() && $this->advanceIterator()) { } return; } // Add only up to N pending promises. $concurrency = \is_callable($this->concurrency) ? \call_user_func($this->concurrency, \count($this->pending)) : $this->concurrency; $concurrency = \max($concurrency - \count($this->pending), 0); // Concurrency may be set to 0 to disallow new promises. if (!$concurrency) { return; } // Add the first pending promise. $this->addPending(); // Note this is special handling for concurrency=1 so that we do // not advance the iterator after adding the first promise. This // helps work around issues with generators that might not have the // next value to yield until promise callbacks are called. while (--$concurrency && $this->advanceIterator() && $this->addPending()) { } } private function addPending() { if (!$this->iterable || !$this->iterable->valid()) { return \false; } $promise = Create::promiseFor($this->iterable->current()); $key = $this->iterable->key(); // Iterable keys may not be unique, so we use a counter to // guarantee uniqueness $idx = $this->nextPendingIndex++; $this->pending[$idx] = $promise->then(function ($value) use($idx, $key) { if ($this->onFulfilled) { \call_user_func($this->onFulfilled, $value, $key, $this->aggregate); } $this->step($idx); }, function ($reason) use($idx, $key) { if ($this->onRejected) { \call_user_func($this->onRejected, $reason, $key, $this->aggregate); } $this->step($idx); }); return \true; } private function advanceIterator() { // Place a lock on the iterator so that we ensure to not recurse, // preventing fatal generator errors. if ($this->mutex) { return \false; } $this->mutex = \true; try { $this->iterable->next(); $this->mutex = \false; return \true; } catch (\Throwable $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } catch (\Exception $e) { $this->aggregate->reject($e); $this->mutex = \false; return \false; } } private function step($idx) { // If the promise was already resolved, then ignore this step. if (Is::settled($this->aggregate)) { return; } unset($this->pending[$idx]); // Only refill pending promises if we are not locked, preventing the // EachPromise to recursively invoke the provided iterator, which // cause a fatal error: "Cannot resume an already running generator" if ($this->advanceIterator() && !$this->checkIfFinished()) { // Add more pending promises if possible. $this->refillPending(); } } private function checkIfFinished() { if (!$this->pending && !$this->iterable->valid()) { // Resolve the promise if there's nothing left to do. $this->aggregate->resolve(null); return \true; } return \false; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Stream.php000064400000015215147600374260021266 0ustar00size = $options['size']; } $this->customMetadata = isset($options['metadata']) ? $options['metadata'] : []; $this->stream = $stream; $meta = \stream_get_meta_data($this->stream); $this->seekable = $meta['seekable']; $this->readable = (bool) \preg_match(self::READABLE_MODES, $meta['mode']); $this->writable = (bool) \preg_match(self::WRITABLE_MODES, $meta['mode']); $this->uri = $this->getMetadata('uri'); } /** * Closes the stream when the destructed */ public function __destruct() { $this->close(); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { return ''; } } public function getContents() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $contents = \stream_get_contents($this->stream); if ($contents === \false) { throw new \RuntimeException('Unable to read stream contents'); } return $contents; } public function close() { if (isset($this->stream)) { if (\is_resource($this->stream)) { \fclose($this->stream); } $this->detach(); } } public function detach() { if (!isset($this->stream)) { return null; } $result = $this->stream; unset($this->stream); $this->size = $this->uri = null; $this->readable = $this->writable = $this->seekable = \false; return $result; } public function getSize() { if ($this->size !== null) { return $this->size; } if (!isset($this->stream)) { return null; } // Clear the stat cache if the stream has a URI if ($this->uri) { \clearstatcache(\true, $this->uri); } $stats = \fstat($this->stream); if (isset($stats['size'])) { $this->size = $stats['size']; return $this->size; } return null; } public function isReadable() { return $this->readable; } public function isWritable() { return $this->writable; } public function isSeekable() { return $this->seekable; } public function eof() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } return \feof($this->stream); } public function tell() { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } $result = \ftell($this->stream); if ($result === \false) { throw new \RuntimeException('Unable to determine stream position'); } return $result; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $whence = (int) $whence; if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->seekable) { throw new \RuntimeException('Stream is not seekable'); } if (\fseek($this->stream, $offset, $whence) === -1) { throw new \RuntimeException('Unable to seek to stream position ' . $offset . ' with whence ' . \var_export($whence, \true)); } } public function read($length) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->readable) { throw new \RuntimeException('Cannot read from non-readable stream'); } if ($length < 0) { throw new \RuntimeException('Length parameter cannot be negative'); } if (0 === $length) { return ''; } $string = \fread($this->stream, $length); if (\false === $string) { throw new \RuntimeException('Unable to read from stream'); } return $string; } public function write($string) { if (!isset($this->stream)) { throw new \RuntimeException('Stream is detached'); } if (!$this->writable) { throw new \RuntimeException('Cannot write to a non-writable stream'); } // We can't know the size after writing anything $this->size = null; $result = \fwrite($this->stream, $string); if ($result === \false) { throw new \RuntimeException('Unable to write to stream'); } return $result; } public function getMetadata($key = null) { if (!isset($this->stream)) { return $key ? null : []; } elseif (!$key) { return $this->customMetadata + \stream_get_meta_data($this->stream); } elseif (isset($this->customMetadata[$key])) { return $this->customMetadata[$key]; } $meta = \stream_get_meta_data($this->stream); return isset($meta[$key]) ? $meta[$key] : null; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/LazyOpenStream.php000064400000001641147600374260022746 0ustar00filename = $filename; $this->mode = $mode; } /** * Creates the underlying stream lazily when required. * * @return StreamInterface */ protected function createStream() { return Utils::streamFor(Utils::tryFopen($this->filename, $this->mode)); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Utils.php000064400000033714147600374260021137 0ustar00 $keys * * @return array */ public static function caselessRemove($keys, array $data) { $result = []; foreach ($keys as &$key) { $key = \strtolower($key); } foreach ($data as $k => $v) { if (!\in_array(\strtolower($k), $keys)) { $result[$k] = $v; } } return $result; } /** * Copy the contents of a stream into another stream until the given number * of bytes have been read. * * @param StreamInterface $source Stream to read from * @param StreamInterface $dest Stream to write to * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @throws \RuntimeException on error. */ public static function copyToStream(StreamInterface $source, StreamInterface $dest, $maxLen = -1) { $bufferSize = 8192; if ($maxLen === -1) { while (!$source->eof()) { if (!$dest->write($source->read($bufferSize))) { break; } } } else { $remaining = $maxLen; while ($remaining > 0 && !$source->eof()) { $buf = $source->read(\min($bufferSize, $remaining)); $len = \strlen($buf); if (!$len) { break; } $remaining -= $len; $dest->write($buf); } } } /** * Copy the contents of a stream into a string until the given number of * bytes have been read. * * @param StreamInterface $stream Stream to read * @param int $maxLen Maximum number of bytes to read. Pass -1 * to read the entire stream. * * @return string * * @throws \RuntimeException on error. */ public static function copyToString(StreamInterface $stream, $maxLen = -1) { $buffer = ''; if ($maxLen === -1) { while (!$stream->eof()) { $buf = $stream->read(1048576); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; } return $buffer; } $len = 0; while (!$stream->eof() && $len < $maxLen) { $buf = $stream->read($maxLen - $len); // Using a loose equality here to match on '' and false. if ($buf == null) { break; } $buffer .= $buf; $len = \strlen($buffer); } return $buffer; } /** * Calculate a hash of a stream. * * This method reads the entire stream to calculate a rolling hash, based * on PHP's `hash_init` functions. * * @param StreamInterface $stream Stream to calculate the hash for * @param string $algo Hash algorithm (e.g. md5, crc32, etc) * @param bool $rawOutput Whether or not to use raw output * * @return string Returns the hash of the stream * * @throws \RuntimeException on error. */ public static function hash(StreamInterface $stream, $algo, $rawOutput = \false) { $pos = $stream->tell(); if ($pos > 0) { $stream->rewind(); } $ctx = \hash_init($algo); while (!$stream->eof()) { \hash_update($ctx, $stream->read(1048576)); } $out = \hash_final($ctx, (bool) $rawOutput); $stream->seek($pos); return $out; } /** * Clone and modify a request with the given changes. * * This method is useful for reducing the number of clones needed to mutate * a message. * * The changes can be one of: * - method: (string) Changes the HTTP method. * - set_headers: (array) Sets the given headers. * - remove_headers: (array) Remove the given headers. * - body: (mixed) Sets the given body. * - uri: (UriInterface) Set the URI. * - query: (string) Set the query string value of the URI. * - version: (string) Set the protocol version. * * @param RequestInterface $request Request to clone and modify. * @param array $changes Changes to apply. * * @return RequestInterface */ public static function modifyRequest(RequestInterface $request, array $changes) { if (!$changes) { return $request; } $headers = $request->getHeaders(); if (!isset($changes['uri'])) { $uri = $request->getUri(); } else { // Remove the host header if one is on the URI if ($host = $changes['uri']->getHost()) { $changes['set_headers']['Host'] = $host; if ($port = $changes['uri']->getPort()) { $standardPorts = ['http' => 80, 'https' => 443]; $scheme = $changes['uri']->getScheme(); if (isset($standardPorts[$scheme]) && $port != $standardPorts[$scheme]) { $changes['set_headers']['Host'] .= ':' . $port; } } } $uri = $changes['uri']; } if (!empty($changes['remove_headers'])) { $headers = self::caselessRemove($changes['remove_headers'], $headers); } if (!empty($changes['set_headers'])) { $headers = self::caselessRemove(\array_keys($changes['set_headers']), $headers); $headers = $changes['set_headers'] + $headers; } if (isset($changes['query'])) { $uri = $uri->withQuery($changes['query']); } if ($request instanceof ServerRequestInterface) { $new = (new ServerRequest(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion(), $request->getServerParams()))->withParsedBody($request->getParsedBody())->withQueryParams($request->getQueryParams())->withCookieParams($request->getCookieParams())->withUploadedFiles($request->getUploadedFiles()); foreach ($request->getAttributes() as $key => $value) { $new = $new->withAttribute($key, $value); } return $new; } return new Request(isset($changes['method']) ? $changes['method'] : $request->getMethod(), $uri, $headers, isset($changes['body']) ? $changes['body'] : $request->getBody(), isset($changes['version']) ? $changes['version'] : $request->getProtocolVersion()); } /** * Read a line from the stream up to the maximum allowed buffer length. * * @param StreamInterface $stream Stream to read from * @param int|null $maxLength Maximum buffer length * * @return string */ public static function readLine(StreamInterface $stream, $maxLength = null) { $buffer = ''; $size = 0; while (!$stream->eof()) { // Using a loose equality here to match on '' and false. if (null == ($byte = $stream->read(1))) { return $buffer; } $buffer .= $byte; // Break when a new line is found or the max length - 1 is reached if ($byte === "\n" || ++$size === $maxLength - 1) { break; } } return $buffer; } /** * Create a new stream based on the input type. * * Options is an associative array that can contain the following keys: * - metadata: Array of custom metadata. * - size: Size of the stream. * * This method accepts the following `$resource` types: * - `Psr\Http\Message\StreamInterface`: Returns the value as-is. * - `string`: Creates a stream object that uses the given string as the contents. * - `resource`: Creates a stream object that wraps the given PHP stream resource. * - `Iterator`: If the provided value implements `Iterator`, then a read-only * stream object will be created that wraps the given iterable. Each time the * stream is read from, data from the iterator will fill a buffer and will be * continuously called until the buffer is equal to the requested read size. * Subsequent read calls will first read from the buffer and then call `next` * on the underlying iterator until it is exhausted. * - `object` with `__toString()`: If the object has the `__toString()` method, * the object will be cast to a string and then a stream will be returned that * uses the string value. * - `NULL`: When `null` is passed, an empty stream object is returned. * - `callable` When a callable is passed, a read-only stream object will be * created that invokes the given callable. The callable is invoked with the * number of suggested bytes to read. The callable can return any number of * bytes, but MUST return `false` when there is no more data to return. The * stream object that wraps the callable will invoke the callable until the * number of requested bytes are available. Any additional bytes will be * buffered and used in subsequent reads. * * @param resource|string|int|float|bool|StreamInterface|callable|\Iterator|null $resource Entity body data * @param array $options Additional options * * @return StreamInterface * * @throws \InvalidArgumentException if the $resource arg is not valid. */ public static function streamFor($resource = '', array $options = []) { if (\is_scalar($resource)) { $stream = self::tryFopen('php://temp', 'r+'); if ($resource !== '') { \fwrite($stream, $resource); \fseek($stream, 0); } return new Stream($stream, $options); } switch (\gettype($resource)) { case 'resource': /* * The 'php://input' is a special stream with quirks and inconsistencies. * We avoid using that stream by reading it into php://temp */ $metaData = \stream_get_meta_data($resource); if (isset($metaData['uri']) && $metaData['uri'] === 'php://input') { $stream = self::tryFopen('php://temp', 'w+'); \fwrite($stream, \stream_get_contents($resource)); \fseek($stream, 0); $resource = $stream; } return new Stream($resource, $options); case 'object': if ($resource instanceof StreamInterface) { return $resource; } elseif ($resource instanceof \Iterator) { return new PumpStream(function () use($resource) { if (!$resource->valid()) { return \false; } $result = $resource->current(); $resource->next(); return $result; }, $options); } elseif (\method_exists($resource, '__toString')) { return Utils::streamFor((string) $resource, $options); } break; case 'NULL': return new Stream(self::tryFopen('php://temp', 'r+'), $options); } if (\is_callable($resource)) { return new PumpStream($resource, $options); } throw new \InvalidArgumentException('Invalid resource type: ' . \gettype($resource)); } /** * Safely opens a PHP stream resource using a filename. * * When fopen fails, PHP normally raises a warning. This function adds an * error handler that checks for errors and throws an exception instead. * * @param string $filename File to open * @param string $mode Mode used to open the file * * @return resource * * @throws \RuntimeException if the file cannot be opened */ public static function tryFopen($filename, $mode) { $ex = null; \set_error_handler(function () use($filename, $mode, &$ex) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, \func_get_args()[1])); return \true; }); try { $handle = \fopen($filename, $mode); } catch (\Throwable $e) { $ex = new \RuntimeException(\sprintf('Unable to open "%s" using mode "%s": %s', $filename, $mode, $e->getMessage()), 0, $e); } \restore_error_handler(); if ($ex) { /** @var $ex \RuntimeException */ throw $ex; } return $handle; } /** * Returns a UriInterface for the given value. * * This function accepts a string or UriInterface and returns a * UriInterface for the given value. If the value is already a * UriInterface, it is returned as-is. * * @param string|UriInterface $uri * * @return UriInterface * * @throws \InvalidArgumentException */ public static function uriFor($uri) { if ($uri instanceof UriInterface) { return $uri; } if (\is_string($uri)) { return new Uri($uri); } throw new \InvalidArgumentException('URI must be a string or UriInterface'); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Response.php000064400000010357147600374260021633 0ustar00 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-status', 208 => 'Already Reported', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => 'Switch Proxy', 307 => 'Temporary Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', 418 => 'I\'m a teapot', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Unordered Collection', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable For Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 511 => 'Network Authentication Required']; /** @var string */ private $reasonPhrase = ''; /** @var int */ private $statusCode = 200; /** * @param int $status Status code * @param array $headers Response headers * @param string|resource|StreamInterface|null $body Response body * @param string $version Protocol version * @param string|null $reason Reason phrase (when empty a default will be used based on the status code) */ public function __construct($status = 200, array $headers = [], $body = null, $version = '1.1', $reason = null) { $this->assertStatusCodeIsInteger($status); $status = (int) $status; $this->assertStatusCodeRange($status); $this->statusCode = $status; if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } $this->setHeaders($headers); if ($reason == '' && isset(self::$phrases[$this->statusCode])) { $this->reasonPhrase = self::$phrases[$this->statusCode]; } else { $this->reasonPhrase = (string) $reason; } $this->protocol = $version; } public function getStatusCode() { return $this->statusCode; } public function getReasonPhrase() { return $this->reasonPhrase; } public function withStatus($code, $reasonPhrase = '') { $this->assertStatusCodeIsInteger($code); $code = (int) $code; $this->assertStatusCodeRange($code); $new = clone $this; $new->statusCode = $code; if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { $reasonPhrase = self::$phrases[$new->statusCode]; } $new->reasonPhrase = (string) $reasonPhrase; return $new; } private function assertStatusCodeIsInteger($statusCode) { if (\filter_var($statusCode, \FILTER_VALIDATE_INT) === \false) { throw new \InvalidArgumentException('Status code must be an integer value.'); } } private function assertStatusCodeRange($statusCode) { if ($statusCode < 100 || $statusCode >= 600) { throw new \InvalidArgumentException('Status code must be an integer value between 1xx and 5xx.'); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Rfc7230.php000064400000001271147600374260021056 0ustar00@,;:\\\"/[\\]?={}\x01- ]++):[ \t]*+((?:[ \t]*+[!-~\x80-\xff]++)*+)[ \t]*+\r?\n)m"; const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/functions.php000064400000032243147600374260022043 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array * * @deprecated parse_query will be removed in guzzlehttp/psr7:2.0. Use Query::parse instead. */ function parse_query($str, $urlEncoding = \true) { return Query::parse($str, $urlEncoding); } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse_query()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string * * @deprecated build_query will be removed in guzzlehttp/psr7:2.0. Use Query::build instead. */ function build_query(array $params, $encoding = \PHP_QUERY_RFC3986) { return Query::build($params, $encoding); } /** * Determines the mimetype of a file by looking at its extension. * * @param string $filename * * @return string|null * * @deprecated mimetype_from_filename will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromFilename instead. */ function mimetype_from_filename($filename) { return MimeType::fromFilename($filename); } /** * Maps a file extensions to a mimetype. * * @param $extension string The file extension. * * @return string|null * * @link http://svn.apache.org/repos/asf/httpd/httpd/branches/1.3.x/conf/mime.types * @deprecated mimetype_from_extension will be removed in guzzlehttp/psr7:2.0. Use MimeType::fromExtension instead. */ function mimetype_from_extension($extension) { return MimeType::fromExtension($extension); } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array * * @internal * * @deprecated _parse_message will be removed in guzzlehttp/psr7:2.0. Use Message::parseMessage instead. */ function _parse_message($message) { return Message::parseMessage($message); } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string * * @internal * * @deprecated _parse_request_uri will be removed in guzzlehttp/psr7:2.0. Use Message::parseRequestUri instead. */ function _parse_request_uri($path, array $headers) { return Message::parseRequestUri($path, $headers); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null * * @deprecated get_message_body_summary will be removed in guzzlehttp/psr7:2.0. Use Message::bodySummary instead. */ function get_message_body_summary(MessageInterface $message, $truncateAt = 120) { return Message::bodySummary($message, $truncateAt); } /** * Remove the items given by the keys, case insensitively from the data. * * @param iterable $keys * * @return array * * @internal * * @deprecated _caseless_remove will be removed in guzzlehttp/psr7:2.0. Use Utils::caselessRemove instead. */ function _caseless_remove($keys, array $data) { return Utils::caselessRemove($keys, $data); } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/PumpStream.php000064400000010005147600374260022120 0ustar00source = $source; $this->size = isset($options['size']) ? $options['size'] : null; $this->metadata = isset($options['metadata']) ? $options['metadata'] : []; $this->buffer = new BufferStream(); } public function __toString() { try { return Utils::copyToString($this); } catch (\Exception $e) { return ''; } } public function close() { $this->detach(); } public function detach() { $this->tellPos = \false; $this->source = null; return null; } public function getSize() { return $this->size; } public function tell() { return $this->tellPos; } public function eof() { return !$this->source; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a PumpStream'); } public function isWritable() { return \false; } public function write($string) { throw new \RuntimeException('Cannot write to a PumpStream'); } public function isReadable() { return \true; } public function read($length) { $data = $this->buffer->read($length); $readLen = \strlen($data); $this->tellPos += $readLen; $remaining = $length - $readLen; if ($remaining) { $this->pump($remaining); $data .= $this->buffer->read($remaining); $this->tellPos += \strlen($data) - $readLen; } return $data; } public function getContents() { $result = ''; while (!$this->eof()) { $result .= $this->read(1000000); } return $result; } public function getMetadata($key = null) { if (!$key) { return $this->metadata; } return isset($this->metadata[$key]) ? $this->metadata[$key] : null; } private function pump($length) { if ($this->source) { do { $data = \call_user_func($this->source, $length); if ($data === \false || $data === null) { $this->source = null; return; } $this->buffer->write($data); $length -= \strlen($data); } while ($length > 0); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/FnStream.php000064400000007570147600374260021557 0ustar00methods = $methods; // Create the functions on the class foreach ($methods as $name => $fn) { $this->{'_fn_' . $name} = $fn; } } /** * Lazily determine which methods are not implemented. * * @throws \BadMethodCallException */ public function __get($name) { throw new \BadMethodCallException(\str_replace('_fn_', '', $name) . '() is not implemented in the FnStream'); } /** * The close method is called on the underlying stream only if possible. */ public function __destruct() { if (isset($this->_fn_close)) { \call_user_func($this->_fn_close); } } /** * An unserialize would allow the __destruct to run when the unserialized value goes out of scope. * * @throws \LogicException */ public function __wakeup() { throw new \LogicException('FnStream should never be unserialized'); } /** * Adds custom functionality to an underlying stream by intercepting * specific method calls. * * @param StreamInterface $stream Stream to decorate * @param array $methods Hash of method name to a closure * * @return FnStream */ public static function decorate(StreamInterface $stream, array $methods) { // If any of the required methods were not provided, then simply // proxy to the decorated stream. foreach (\array_diff(self::$slots, \array_keys($methods)) as $diff) { $methods[$diff] = [$stream, $diff]; } return new self($methods); } public function __toString() { return \call_user_func($this->_fn___toString); } public function close() { return \call_user_func($this->_fn_close); } public function detach() { return \call_user_func($this->_fn_detach); } public function getSize() { return \call_user_func($this->_fn_getSize); } public function tell() { return \call_user_func($this->_fn_tell); } public function eof() { return \call_user_func($this->_fn_eof); } public function isSeekable() { return \call_user_func($this->_fn_isSeekable); } public function rewind() { \call_user_func($this->_fn_rewind); } public function seek($offset, $whence = \SEEK_SET) { \call_user_func($this->_fn_seek, $offset, $whence); } public function isWritable() { return \call_user_func($this->_fn_isWritable); } public function write($string) { return \call_user_func($this->_fn_write, $string); } public function isReadable() { return \call_user_func($this->_fn_isReadable); } public function read($length) { return \call_user_func($this->_fn_read, $length); } public function getContents() { return \call_user_func($this->_fn_getContents); } public function getMetadata($key = null) { return \call_user_func($this->_fn_getMetadata, $key); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Uri.php000064400000053154147600374260020576 0ustar00 80, 'https' => 443, 'ftp' => 21, 'gopher' => 70, 'nntp' => 119, 'news' => 119, 'telnet' => 23, 'tn3270' => 23, 'imap' => 143, 'pop' => 110, 'ldap' => 389]; private static $charUnreserved = 'a-zA-Z0-9_\\-\\.~'; private static $charSubDelims = '!\\$&\'\\(\\)\\*\\+,;='; private static $replaceQuery = ['=' => '%3D', '&' => '%26']; /** @var string Uri scheme. */ private $scheme = ''; /** @var string Uri user info. */ private $userInfo = ''; /** @var string Uri host. */ private $host = ''; /** @var int|null Uri port. */ private $port; /** @var string Uri path. */ private $path = ''; /** @var string Uri query string. */ private $query = ''; /** @var string Uri fragment. */ private $fragment = ''; /** * @param string $uri URI to parse */ public function __construct($uri = '') { // weak type check to also accept null until we can add scalar type hints if ($uri != '') { $parts = self::parse($uri); if ($parts === \false) { throw new \InvalidArgumentException("Unable to parse URI: {$uri}"); } $this->applyParts($parts); } } /** * UTF-8 aware \parse_url() replacement. * * The internal function produces broken output for non ASCII domain names * (IDN) when used with locales other than "C". * * On the other hand, cURL understands IDN correctly only when UTF-8 locale * is configured ("C.UTF-8", "en_US.UTF-8", etc.). * * @see https://bugs.php.net/bug.php?id=52923 * @see https://www.php.net/manual/en/function.parse-url.php#114817 * @see https://curl.haxx.se/libcurl/c/CURLOPT_URL.html#ENCODING * * @param string $url * * @return array|false */ private static function parse($url) { // If IPv6 $prefix = ''; if (\preg_match('%^(.*://\\[[0-9:a-f]+\\])(.*?)$%', $url, $matches)) { $prefix = $matches[1]; $url = $matches[2]; } $encodedUrl = \preg_replace_callback('%[^:/@?&=#]+%usD', static function ($matches) { return \urlencode($matches[0]); }, $url); $result = \parse_url($prefix . $encodedUrl); if ($result === \false) { return \false; } return \array_map('urldecode', $result); } public function __toString() { return self::composeComponents($this->scheme, $this->getAuthority(), $this->path, $this->query, $this->fragment); } /** * Composes a URI reference string from its various components. * * Usually this method does not need to be called manually but instead is used indirectly via * `Psr\Http\Message\UriInterface::__toString`. * * PSR-7 UriInterface treats an empty component the same as a missing component as * getQuery(), getFragment() etc. always return a string. This explains the slight * difference to RFC 3986 Section 5.3. * * Another adjustment is that the authority separator is added even when the authority is missing/empty * for the "file" scheme. This is because PHP stream functions like `file_get_contents` only work with * `file:///myfile` but not with `file:/myfile` although they are equivalent according to RFC 3986. But * `file:///` is the more common syntax for the file scheme anyway (Chrome for example redirects to * that format). * * @param string $scheme * @param string $authority * @param string $path * @param string $query * @param string $fragment * * @return string * * @link https://tools.ietf.org/html/rfc3986#section-5.3 */ public static function composeComponents($scheme, $authority, $path, $query, $fragment) { $uri = ''; // weak type checks to also accept null until we can add scalar type hints if ($scheme != '') { $uri .= $scheme . ':'; } if ($authority != '' || $scheme === 'file') { $uri .= '//' . $authority; } $uri .= $path; if ($query != '') { $uri .= '?' . $query; } if ($fragment != '') { $uri .= '#' . $fragment; } return $uri; } /** * Whether the URI has the default port of the current scheme. * * `Psr\Http\Message\UriInterface::getPort` may return null or the standard port. This method can be used * independently of the implementation. * * @param UriInterface $uri * * @return bool */ public static function isDefaultPort(UriInterface $uri) { return $uri->getPort() === null || isset(self::$defaultPorts[$uri->getScheme()]) && $uri->getPort() === self::$defaultPorts[$uri->getScheme()]; } /** * Whether the URI is absolute, i.e. it has a scheme. * * An instance of UriInterface can either be an absolute URI or a relative reference. This method returns true * if it is the former. An absolute URI has a scheme. A relative reference is used to express a URI relative * to another URI, the base URI. Relative references can be divided into several forms: * - network-path references, e.g. '//example.com/path' * - absolute-path references, e.g. '/path' * - relative-path references, e.g. 'subpath' * * @param UriInterface $uri * * @return bool * * @see Uri::isNetworkPathReference * @see Uri::isAbsolutePathReference * @see Uri::isRelativePathReference * @link https://tools.ietf.org/html/rfc3986#section-4 */ public static function isAbsolute(UriInterface $uri) { return $uri->getScheme() !== ''; } /** * Whether the URI is a network-path reference. * * A relative reference that begins with two slash characters is termed an network-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isNetworkPathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() !== ''; } /** * Whether the URI is a absolute-path reference. * * A relative reference that begins with a single slash character is termed an absolute-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isAbsolutePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && isset($uri->getPath()[0]) && $uri->getPath()[0] === '/'; } /** * Whether the URI is a relative-path reference. * * A relative reference that does not begin with a slash character is termed a relative-path reference. * * @param UriInterface $uri * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.2 */ public static function isRelativePathReference(UriInterface $uri) { return $uri->getScheme() === '' && $uri->getAuthority() === '' && (!isset($uri->getPath()[0]) || $uri->getPath()[0] !== '/'); } /** * Whether the URI is a same-document reference. * * A same-document reference refers to a URI that is, aside from its fragment * component, identical to the base URI. When no base URI is given, only an empty * URI reference (apart from its fragment) is considered a same-document reference. * * @param UriInterface $uri The URI to check * @param UriInterface|null $base An optional base URI to compare against * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-4.4 */ public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null) { if ($base !== null) { $uri = UriResolver::resolve($base, $uri); return $uri->getScheme() === $base->getScheme() && $uri->getAuthority() === $base->getAuthority() && $uri->getPath() === $base->getPath() && $uri->getQuery() === $base->getQuery(); } return $uri->getScheme() === '' && $uri->getAuthority() === '' && $uri->getPath() === '' && $uri->getQuery() === ''; } /** * Removes dot segments from a path and returns the new path. * * @param string $path * * @return string * * @deprecated since version 1.4. Use UriResolver::removeDotSegments instead. * @see UriResolver::removeDotSegments */ public static function removeDotSegments($path) { return UriResolver::removeDotSegments($path); } /** * Converts the relative URI into a new URI that is resolved against the base URI. * * @param UriInterface $base Base URI * @param string|UriInterface $rel Relative URI * * @return UriInterface * * @deprecated since version 1.4. Use UriResolver::resolve instead. * @see UriResolver::resolve */ public static function resolve(UriInterface $base, $rel) { if (!$rel instanceof UriInterface) { $rel = new self($rel); } return UriResolver::resolve($base, $rel); } /** * Creates a new URI with a specific query string value removed. * * Any existing query string values that exactly match the provided key are * removed. * * @param UriInterface $uri URI to use as a base. * @param string $key Query string key to remove. * * @return UriInterface */ public static function withoutQueryValue(UriInterface $uri, $key) { $result = self::getFilteredQueryString($uri, [$key]); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with a specific query string value. * * Any existing query string values that exactly match the provided key are * removed and replaced with the given key value pair. * * A value of null will set the query string key without a value, e.g. "key" * instead of "key=value". * * @param UriInterface $uri URI to use as a base. * @param string $key Key to set. * @param string|null $value Value to set * * @return UriInterface */ public static function withQueryValue(UriInterface $uri, $key, $value) { $result = self::getFilteredQueryString($uri, [$key]); $result[] = self::generateQueryString($key, $value); return $uri->withQuery(\implode('&', $result)); } /** * Creates a new URI with multiple specific query string values. * * It has the same behavior as withQueryValue() but for an associative array of key => value. * * @param UriInterface $uri URI to use as a base. * @param array $keyValueArray Associative array of key and values * * @return UriInterface */ public static function withQueryValues(UriInterface $uri, array $keyValueArray) { $result = self::getFilteredQueryString($uri, \array_keys($keyValueArray)); foreach ($keyValueArray as $key => $value) { $result[] = self::generateQueryString($key, $value); } return $uri->withQuery(\implode('&', $result)); } /** * Creates a URI from a hash of `parse_url` components. * * @param array $parts * * @return UriInterface * * @link http://php.net/manual/en/function.parse-url.php * * @throws \InvalidArgumentException If the components do not form a valid URI. */ public static function fromParts(array $parts) { $uri = new self(); $uri->applyParts($parts); $uri->validateState(); return $uri; } public function getScheme() { return $this->scheme; } public function getAuthority() { $authority = $this->host; if ($this->userInfo !== '') { $authority = $this->userInfo . '@' . $authority; } if ($this->port !== null) { $authority .= ':' . $this->port; } return $authority; } public function getUserInfo() { return $this->userInfo; } public function getHost() { return $this->host; } public function getPort() { return $this->port; } public function getPath() { return $this->path; } public function getQuery() { return $this->query; } public function getFragment() { return $this->fragment; } public function withScheme($scheme) { $scheme = $this->filterScheme($scheme); if ($this->scheme === $scheme) { return $this; } $new = clone $this; $new->scheme = $scheme; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withUserInfo($user, $password = null) { $info = $this->filterUserInfoComponent($user); if ($password !== null) { $info .= ':' . $this->filterUserInfoComponent($password); } if ($this->userInfo === $info) { return $this; } $new = clone $this; $new->userInfo = $info; $new->validateState(); return $new; } public function withHost($host) { $host = $this->filterHost($host); if ($this->host === $host) { return $this; } $new = clone $this; $new->host = $host; $new->validateState(); return $new; } public function withPort($port) { $port = $this->filterPort($port); if ($this->port === $port) { return $this; } $new = clone $this; $new->port = $port; $new->removeDefaultPort(); $new->validateState(); return $new; } public function withPath($path) { $path = $this->filterPath($path); if ($this->path === $path) { return $this; } $new = clone $this; $new->path = $path; $new->validateState(); return $new; } public function withQuery($query) { $query = $this->filterQueryAndFragment($query); if ($this->query === $query) { return $this; } $new = clone $this; $new->query = $query; return $new; } public function withFragment($fragment) { $fragment = $this->filterQueryAndFragment($fragment); if ($this->fragment === $fragment) { return $this; } $new = clone $this; $new->fragment = $fragment; return $new; } /** * Apply parse_url parts to a URI. * * @param array $parts Array of parse_url parts to apply. */ private function applyParts(array $parts) { $this->scheme = isset($parts['scheme']) ? $this->filterScheme($parts['scheme']) : ''; $this->userInfo = isset($parts['user']) ? $this->filterUserInfoComponent($parts['user']) : ''; $this->host = isset($parts['host']) ? $this->filterHost($parts['host']) : ''; $this->port = isset($parts['port']) ? $this->filterPort($parts['port']) : null; $this->path = isset($parts['path']) ? $this->filterPath($parts['path']) : ''; $this->query = isset($parts['query']) ? $this->filterQueryAndFragment($parts['query']) : ''; $this->fragment = isset($parts['fragment']) ? $this->filterQueryAndFragment($parts['fragment']) : ''; if (isset($parts['pass'])) { $this->userInfo .= ':' . $this->filterUserInfoComponent($parts['pass']); } $this->removeDefaultPort(); } /** * @param string $scheme * * @return string * * @throws \InvalidArgumentException If the scheme is invalid. */ private function filterScheme($scheme) { if (!\is_string($scheme)) { throw new \InvalidArgumentException('Scheme must be a string'); } return \strtr($scheme, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param string $component * * @return string * * @throws \InvalidArgumentException If the user info is invalid. */ private function filterUserInfoComponent($component) { if (!\is_string($component)) { throw new \InvalidArgumentException('User info must be a string'); } return \preg_replace_callback('/(?:[^%' . self::$charUnreserved . self::$charSubDelims . ']+|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $component); } /** * @param string $host * * @return string * * @throws \InvalidArgumentException If the host is invalid. */ private function filterHost($host) { if (!\is_string($host)) { throw new \InvalidArgumentException('Host must be a string'); } return \strtr($host, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'); } /** * @param int|null $port * * @return int|null * * @throws \InvalidArgumentException If the port is invalid. */ private function filterPort($port) { if ($port === null) { return null; } $port = (int) $port; if (0 > $port || 0xffff < $port) { throw new \InvalidArgumentException(\sprintf('Invalid port: %d. Must be between 0 and 65535', $port)); } return $port; } /** * @param UriInterface $uri * @param array $keys * * @return array */ private static function getFilteredQueryString(UriInterface $uri, array $keys) { $current = $uri->getQuery(); if ($current === '') { return []; } $decodedKeys = \array_map('rawurldecode', $keys); return \array_filter(\explode('&', $current), function ($part) use($decodedKeys) { return !\in_array(\rawurldecode(\explode('=', $part)[0]), $decodedKeys, \true); }); } /** * @param string $key * @param string|null $value * * @return string */ private static function generateQueryString($key, $value) { // Query string separators ("=", "&") within the key or value need to be encoded // (while preventing double-encoding) before setting the query string. All other // chars that need percent-encoding will be encoded by withQuery(). $queryString = \strtr($key, self::$replaceQuery); if ($value !== null) { $queryString .= '=' . \strtr($value, self::$replaceQuery); } return $queryString; } private function removeDefaultPort() { if ($this->port !== null && self::isDefaultPort($this)) { $this->port = null; } } /** * Filters the path of a URI * * @param string $path * * @return string * * @throws \InvalidArgumentException If the path is invalid. */ private function filterPath($path) { if (!\is_string($path)) { throw new \InvalidArgumentException('Path must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $path); } /** * Filters the query string or fragment of a URI. * * @param string $str * * @return string * * @throws \InvalidArgumentException If the query or fragment is invalid. */ private function filterQueryAndFragment($str) { if (!\is_string($str)) { throw new \InvalidArgumentException('Query and fragment must be a string'); } return \preg_replace_callback('/(?:[^' . self::$charUnreserved . self::$charSubDelims . '%:@\\/\\?]++|%(?![A-Fa-f0-9]{2}))/', [$this, 'rawurlencodeMatchZero'], $str); } private function rawurlencodeMatchZero(array $match) { return \rawurlencode($match[0]); } private function validateState() { if ($this->host === '' && ($this->scheme === 'http' || $this->scheme === 'https')) { $this->host = self::HTTP_DEFAULT_HOST; } if ($this->getAuthority() === '') { if (0 === \strpos($this->path, '//')) { throw new \InvalidArgumentException('The path of a URI without an authority must not start with two slashes "//"'); } if ($this->scheme === '' && \false !== \strpos(\explode('/', $this->path, 2)[0], ':')) { throw new \InvalidArgumentException('A relative URI must not have a path beginning with a segment containing a colon'); } } elseif (isset($this->path[0]) && $this->path[0] !== '/') { @\trigger_error('The path of a URI with an authority must start with a slash "/" or be empty. Automagically fixing the URI ' . 'by adding a leading slash to the path is deprecated since version 1.4 and will throw an exception instead.', \E_USER_DEPRECATED); $this->path = '/' . $this->path; //throw new \InvalidArgumentException('The path of a URI with an authority must start with a slash "/" or be empty'); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/UploadedFile.php000064400000016331147600374260022370 0ustar00setError($errorStatus); $this->setSize($size); $this->setClientFilename($clientFilename); $this->setClientMediaType($clientMediaType); if ($this->isOk()) { $this->setStreamOrFile($streamOrFile); } } /** * Depending on the value set file or stream variable * * @param mixed $streamOrFile * * @throws InvalidArgumentException */ private function setStreamOrFile($streamOrFile) { if (\is_string($streamOrFile)) { $this->file = $streamOrFile; } elseif (\is_resource($streamOrFile)) { $this->stream = new Stream($streamOrFile); } elseif ($streamOrFile instanceof StreamInterface) { $this->stream = $streamOrFile; } else { throw new InvalidArgumentException('Invalid stream or file provided for UploadedFile'); } } /** * @param int $error * * @throws InvalidArgumentException */ private function setError($error) { if (\false === \is_int($error)) { throw new InvalidArgumentException('Upload file error status must be an integer'); } if (\false === \in_array($error, UploadedFile::$errors)) { throw new InvalidArgumentException('Invalid error status for UploadedFile'); } $this->error = $error; } /** * @param int $size * * @throws InvalidArgumentException */ private function setSize($size) { if (\false === \is_int($size)) { throw new InvalidArgumentException('Upload file size must be an integer'); } $this->size = $size; } /** * @param mixed $param * * @return bool */ private function isStringOrNull($param) { return \in_array(\gettype($param), ['string', 'NULL']); } /** * @param mixed $param * * @return bool */ private function isStringNotEmpty($param) { return \is_string($param) && \false === empty($param); } /** * @param string|null $clientFilename * * @throws InvalidArgumentException */ private function setClientFilename($clientFilename) { if (\false === $this->isStringOrNull($clientFilename)) { throw new InvalidArgumentException('Upload file client filename must be a string or null'); } $this->clientFilename = $clientFilename; } /** * @param string|null $clientMediaType * * @throws InvalidArgumentException */ private function setClientMediaType($clientMediaType) { if (\false === $this->isStringOrNull($clientMediaType)) { throw new InvalidArgumentException('Upload file client media type must be a string or null'); } $this->clientMediaType = $clientMediaType; } /** * Return true if there is no upload error * * @return bool */ private function isOk() { return $this->error === \UPLOAD_ERR_OK; } /** * @return bool */ public function isMoved() { return $this->moved; } /** * @throws RuntimeException if is moved or not ok */ private function validateActive() { if (\false === $this->isOk()) { throw new RuntimeException('Cannot retrieve stream due to upload error'); } if ($this->isMoved()) { throw new RuntimeException('Cannot retrieve stream after it has already been moved'); } } /** * {@inheritdoc} * * @throws RuntimeException if the upload was not successful. */ public function getStream() { $this->validateActive(); if ($this->stream instanceof StreamInterface) { return $this->stream; } return new LazyOpenStream($this->file, 'r+'); } /** * {@inheritdoc} * * @see http://php.net/is_uploaded_file * @see http://php.net/move_uploaded_file * * @param string $targetPath Path to which to move the uploaded file. * * @throws RuntimeException if the upload was not successful. * @throws InvalidArgumentException if the $path specified is invalid. * @throws RuntimeException on any error during the move operation, or on * the second or subsequent call to the method. */ public function moveTo($targetPath) { $this->validateActive(); if (\false === $this->isStringNotEmpty($targetPath)) { throw new InvalidArgumentException('Invalid path provided for move operation; must be a non-empty string'); } if ($this->file) { $this->moved = \php_sapi_name() == 'cli' ? \rename($this->file, $targetPath) : \move_uploaded_file($this->file, $targetPath); } else { Utils::copyToStream($this->getStream(), new LazyOpenStream($targetPath, 'w')); $this->moved = \true; } if (\false === $this->moved) { throw new RuntimeException(\sprintf('Uploaded file could not be moved to %s', $targetPath)); } } /** * {@inheritdoc} * * @return int|null The file size in bytes or null if unknown. */ public function getSize() { return $this->size; } /** * {@inheritdoc} * * @see http://php.net/manual/en/features.file-upload.errors.php * * @return int One of PHP's UPLOAD_ERR_XXX constants. */ public function getError() { return $this->error; } /** * {@inheritdoc} * * @return string|null The filename sent by the client or null if none * was provided. */ public function getClientFilename() { return $this->clientFilename; } /** * {@inheritdoc} */ public function getClientMediaType() { return $this->clientMediaType; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/NoSeekStream.php000064400000000730147600374260022367 0ustar00getPath() === '' && ($uri->getScheme() === 'http' || $uri->getScheme() === 'https')) { $uri = $uri->withPath('/'); } if ($flags & self::REMOVE_DEFAULT_HOST && $uri->getScheme() === 'file' && $uri->getHost() === 'localhost') { $uri = $uri->withHost(''); } if ($flags & self::REMOVE_DEFAULT_PORT && $uri->getPort() !== null && Uri::isDefaultPort($uri)) { $uri = $uri->withPort(null); } if ($flags & self::REMOVE_DOT_SEGMENTS && !Uri::isRelativePathReference($uri)) { $uri = $uri->withPath(UriResolver::removeDotSegments($uri->getPath())); } if ($flags & self::REMOVE_DUPLICATE_SLASHES) { $uri = $uri->withPath(\preg_replace('#//++#', '/', $uri->getPath())); } if ($flags & self::SORT_QUERY_PARAMETERS && $uri->getQuery() !== '') { $queryKeyValues = \explode('&', $uri->getQuery()); \sort($queryKeyValues); $uri = $uri->withQuery(\implode('&', $queryKeyValues)); } return $uri; } /** * Whether two URIs can be considered equivalent. * * Both URIs are normalized automatically before comparison with the given $normalizations bitmask. The method also * accepts relative URI references and returns true when they are equivalent. This of course assumes they will be * resolved against the same base URI. If this is not the case, determination of equivalence or difference of * relative references does not mean anything. * * @param UriInterface $uri1 An URI to compare * @param UriInterface $uri2 An URI to compare * @param int $normalizations A bitmask of normalizations to apply, see constants * * @return bool * * @link https://tools.ietf.org/html/rfc3986#section-6.1 */ public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS) { return (string) self::normalize($uri1, $normalizations) === (string) self::normalize($uri2, $normalizations); } private static function capitalizePercentEncoding(UriInterface $uri) { $regex = '/(?:%[A-Fa-f0-9]{2})++/'; $callback = function (array $match) { return \strtoupper($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private static function decodeUnreservedCharacters(UriInterface $uri) { $regex = '/%(?:2D|2E|5F|7E|3[0-9]|[46][1-9A-F]|[57][0-9A])/i'; $callback = function (array $match) { return \rawurldecode($match[0]); }; return $uri->withPath(\preg_replace_callback($regex, $callback, $uri->getPath()))->withQuery(\preg_replace_callback($regex, $callback, $uri->getQuery())); } private function __construct() { // cannot be instantiated } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/StreamDecoratorTrait.php000064400000006336147600374260024141 0ustar00stream = $stream; } /** * Magic method used to create a new stream if streams are not added in * the constructor of a decorator (e.g., LazyOpenStream). * * @param string $name Name of the property (allows "stream" only). * * @return StreamInterface */ public function __get($name) { if ($name == 'stream') { $this->stream = $this->createStream(); return $this->stream; } throw new \UnexpectedValueException("{$name} not found on class"); } public function __toString() { try { if ($this->isSeekable()) { $this->seek(0); } return $this->getContents(); } catch (\Exception $e) { // Really, PHP? https://bugs.php.net/bug.php?id=53648 \trigger_error('StreamDecorator::__toString exception: ' . (string) $e, \E_USER_ERROR); return ''; } } public function getContents() { return Utils::copyToString($this); } /** * Allow decorators to implement custom methods * * @param string $method Missing method name * @param array $args Method arguments * * @return mixed */ public function __call($method, array $args) { $result = \call_user_func_array([$this->stream, $method], $args); // Always return the wrapped object if the result is a return $this return $result === $this->stream ? $this : $result; } public function close() { $this->stream->close(); } public function getMetadata($key = null) { return $this->stream->getMetadata($key); } public function detach() { return $this->stream->detach(); } public function getSize() { return $this->stream->getSize(); } public function eof() { return $this->stream->eof(); } public function tell() { return $this->stream->tell(); } public function isReadable() { return $this->stream->isReadable(); } public function isWritable() { return $this->stream->isWritable(); } public function isSeekable() { return $this->stream->isSeekable(); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { $this->stream->seek($offset, $whence); } public function read($length) { return $this->stream->read($length); } public function write($string) { return $this->stream->write($string); } /** * Implement in subclasses to dynamically create streams when requested. * * @return StreamInterface * * @throws \BadMethodCallException */ protected function createStream() { throw new \BadMethodCallException('Not implemented'); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/MimeType.php000064400000007447147600374260021574 0ustar00 'video/3gpp', '7z' => 'application/x-7z-compressed', 'aac' => 'audio/x-aac', 'ai' => 'application/postscript', 'aif' => 'audio/x-aiff', 'asc' => 'text/plain', 'asf' => 'video/x-ms-asf', 'atom' => 'application/atom+xml', 'avi' => 'video/x-msvideo', 'bmp' => 'image/bmp', 'bz2' => 'application/x-bzip2', 'cer' => 'application/pkix-cert', 'crl' => 'application/pkix-crl', 'crt' => 'application/x-x509-ca-cert', 'css' => 'text/css', 'csv' => 'text/csv', 'cu' => 'application/cu-seeme', 'deb' => 'application/x-debian-package', 'doc' => 'application/msword', 'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'dvi' => 'application/x-dvi', 'eot' => 'application/vnd.ms-fontobject', 'eps' => 'application/postscript', 'epub' => 'application/epub+zip', 'etx' => 'text/x-setext', 'flac' => 'audio/flac', 'flv' => 'video/x-flv', 'gif' => 'image/gif', 'gz' => 'application/gzip', 'htm' => 'text/html', 'html' => 'text/html', 'ico' => 'image/x-icon', 'ics' => 'text/calendar', 'ini' => 'text/plain', 'iso' => 'application/x-iso9660-image', 'jar' => 'application/java-archive', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'js' => 'text/javascript', 'json' => 'application/json', 'latex' => 'application/x-latex', 'log' => 'text/plain', 'm4a' => 'audio/mp4', 'm4v' => 'video/mp4', 'mid' => 'audio/midi', 'midi' => 'audio/midi', 'mov' => 'video/quicktime', 'mkv' => 'video/x-matroska', 'mp3' => 'audio/mpeg', 'mp4' => 'video/mp4', 'mp4a' => 'audio/mp4', 'mp4v' => 'video/mp4', 'mpe' => 'video/mpeg', 'mpeg' => 'video/mpeg', 'mpg' => 'video/mpeg', 'mpg4' => 'video/mp4', 'oga' => 'audio/ogg', 'ogg' => 'audio/ogg', 'ogv' => 'video/ogg', 'ogx' => 'application/ogg', 'pbm' => 'image/x-portable-bitmap', 'pdf' => 'application/pdf', 'pgm' => 'image/x-portable-graymap', 'png' => 'image/png', 'pnm' => 'image/x-portable-anymap', 'ppm' => 'image/x-portable-pixmap', 'ppt' => 'application/vnd.ms-powerpoint', 'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation', 'ps' => 'application/postscript', 'qt' => 'video/quicktime', 'rar' => 'application/x-rar-compressed', 'ras' => 'image/x-cmu-raster', 'rss' => 'application/rss+xml', 'rtf' => 'application/rtf', 'sgm' => 'text/sgml', 'sgml' => 'text/sgml', 'svg' => 'image/svg+xml', 'swf' => 'application/x-shockwave-flash', 'tar' => 'application/x-tar', 'tif' => 'image/tiff', 'tiff' => 'image/tiff', 'torrent' => 'application/x-bittorrent', 'ttf' => 'application/x-font-ttf', 'txt' => 'text/plain', 'wav' => 'audio/x-wav', 'webm' => 'video/webm', 'webp' => 'image/webp', 'wma' => 'audio/x-ms-wma', 'wmv' => 'video/x-ms-wmv', 'woff' => 'application/x-font-woff', 'wsdl' => 'application/wsdl+xml', 'xbm' => 'image/x-xbitmap', 'xls' => 'application/vnd.ms-excel', 'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'xml' => 'application/xml', 'xpm' => 'image/x-xpixmap', 'xwd' => 'image/x-xwindowdump', 'yaml' => 'text/yaml', 'yml' => 'text/yaml', 'zip' => 'application/zip']; $extension = \strtolower($extension); return isset($mimetypes[$extension]) ? $mimetypes[$extension] : null; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/AppendStream.php000064400000013145147600374260022416 0ustar00addStream($stream); } } public function __toString() { try { $this->rewind(); return $this->getContents(); } catch (\Exception $e) { return ''; } } /** * Add a stream to the AppendStream * * @param StreamInterface $stream Stream to append. Must be readable. * * @throws \InvalidArgumentException if the stream is not readable */ public function addStream(StreamInterface $stream) { if (!$stream->isReadable()) { throw new \InvalidArgumentException('Each stream must be readable'); } // The stream is only seekable if all streams are seekable if (!$stream->isSeekable()) { $this->seekable = \false; } $this->streams[] = $stream; } public function getContents() { return Utils::copyToString($this); } /** * Closes each attached stream. * * {@inheritdoc} */ public function close() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->close(); } $this->streams = []; } /** * Detaches each attached stream. * * Returns null as it's not clear which underlying stream resource to return. * * {@inheritdoc} */ public function detach() { $this->pos = $this->current = 0; $this->seekable = \true; foreach ($this->streams as $stream) { $stream->detach(); } $this->streams = []; return null; } public function tell() { return $this->pos; } /** * Tries to calculate the size by adding the size of each stream. * * If any of the streams do not return a valid number, then the size of the * append stream cannot be determined and null is returned. * * {@inheritdoc} */ public function getSize() { $size = 0; foreach ($this->streams as $stream) { $s = $stream->getSize(); if ($s === null) { return null; } $size += $s; } return $size; } public function eof() { return !$this->streams || $this->current >= \count($this->streams) - 1 && $this->streams[$this->current]->eof(); } public function rewind() { $this->seek(0); } /** * Attempts to seek to the given position. Only supports SEEK_SET. * * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if (!$this->seekable) { throw new \RuntimeException('This AppendStream is not seekable'); } elseif ($whence !== \SEEK_SET) { throw new \RuntimeException('The AppendStream can only seek with SEEK_SET'); } $this->pos = $this->current = 0; // Rewind each stream foreach ($this->streams as $i => $stream) { try { $stream->rewind(); } catch (\Exception $e) { throw new \RuntimeException('Unable to seek stream ' . $i . ' of the AppendStream', 0, $e); } } // Seek to the actual position by reading from each stream while ($this->pos < $offset && !$this->eof()) { $result = $this->read(\min(8096, $offset - $this->pos)); if ($result === '') { break; } } } /** * Reads from all of the appended streams until the length is met or EOF. * * {@inheritdoc} */ public function read($length) { $buffer = ''; $total = \count($this->streams) - 1; $remaining = $length; $progressToNext = \false; while ($remaining > 0) { // Progress to the next stream if needed. if ($progressToNext || $this->streams[$this->current]->eof()) { $progressToNext = \false; if ($this->current === $total) { break; } $this->current++; } $result = $this->streams[$this->current]->read($remaining); // Using a loose comparison here to match on '', false, and null if ($result == null) { $progressToNext = \true; continue; } $buffer .= $result; $remaining = $length - \strlen($buffer); } $this->pos += \strlen($buffer); return $buffer; } public function isReadable() { return \true; } public function isWritable() { return \false; } public function isSeekable() { return $this->seekable; } public function write($string) { throw new \RuntimeException('Cannot write to an AppendStream'); } public function getMetadata($key = null) { return $key ? null : []; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/LimitStream.php000064400000010076147600374260022265 0ustar00stream = $stream; $this->setLimit($limit); $this->setOffset($offset); } public function eof() { // Always return true if the underlying stream is EOF if ($this->stream->eof()) { return \true; } // No limit and the underlying stream is not at EOF if ($this->limit == -1) { return \false; } return $this->stream->tell() >= $this->offset + $this->limit; } /** * Returns the size of the limited subset of data * {@inheritdoc} */ public function getSize() { if (null === ($length = $this->stream->getSize())) { return null; } elseif ($this->limit == -1) { return $length - $this->offset; } else { return \min($this->limit, $length - $this->offset); } } /** * Allow for a bounded seek on the read limited stream * {@inheritdoc} */ public function seek($offset, $whence = \SEEK_SET) { if ($whence !== \SEEK_SET || $offset < 0) { throw new \RuntimeException(\sprintf('Cannot seek to offset %s with whence %s', $offset, $whence)); } $offset += $this->offset; if ($this->limit !== -1) { if ($offset > $this->offset + $this->limit) { $offset = $this->offset + $this->limit; } } $this->stream->seek($offset); } /** * Give a relative tell() * {@inheritdoc} */ public function tell() { return $this->stream->tell() - $this->offset; } /** * Set the offset to start limiting from * * @param int $offset Offset to seek to and begin byte limiting from * * @throws \RuntimeException if the stream cannot be seeked. */ public function setOffset($offset) { $current = $this->stream->tell(); if ($current !== $offset) { // If the stream cannot seek to the offset position, then read to it if ($this->stream->isSeekable()) { $this->stream->seek($offset); } elseif ($current > $offset) { throw new \RuntimeException("Could not seek to stream offset {$offset}"); } else { $this->stream->read($offset - $current); } } $this->offset = $offset; } /** * Set the limit of bytes that the decorator allows to be read from the * stream. * * @param int $limit Number of bytes to allow to be read from the stream. * Use -1 for no limit. */ public function setLimit($limit) { $this->limit = $limit; } public function read($length) { if ($this->limit == -1) { return $this->stream->read($length); } // Check if the current position is less than the total allowed // bytes + original offset $remaining = $this->offset + $this->limit - $this->stream->tell(); if ($remaining > 0) { // Only return the amount of requested data, ensuring that the byte // limit is not exceeded return $this->stream->read(\min($remaining, $length)); } return ''; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/MessageTrait.php000064400000017046147600374260022427 0ustar00 array of values */ private $headers = []; /** @var array Map of lowercase header name => original name at registration */ private $headerNames = []; /** @var string */ private $protocol = '1.1'; /** @var StreamInterface|null */ private $stream; public function getProtocolVersion() { return $this->protocol; } public function withProtocolVersion($version) { if ($this->protocol === $version) { return $this; } $new = clone $this; $new->protocol = $version; return $new; } public function getHeaders() { return $this->headers; } public function hasHeader($header) { return isset($this->headerNames[\strtolower($header)]); } public function getHeader($header) { $header = \strtolower($header); if (!isset($this->headerNames[$header])) { return []; } $header = $this->headerNames[$header]; return $this->headers[$header]; } public function getHeaderLine($header) { return \implode(', ', $this->getHeader($header)); } public function withHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { unset($new->headers[$new->headerNames[$normalized]]); } $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; return $new; } public function withAddedHeader($header, $value) { $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); $new = clone $this; if (isset($new->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $new->headers[$header] = \array_merge($this->headers[$header], $value); } else { $new->headerNames[$normalized] = $header; $new->headers[$header] = $value; } return $new; } public function withoutHeader($header) { $normalized = \strtolower($header); if (!isset($this->headerNames[$normalized])) { return $this; } $header = $this->headerNames[$normalized]; $new = clone $this; unset($new->headers[$header], $new->headerNames[$normalized]); return $new; } public function getBody() { if (!$this->stream) { $this->stream = Utils::streamFor(''); } return $this->stream; } public function withBody(StreamInterface $body) { if ($body === $this->stream) { return $this; } $new = clone $this; $new->stream = $body; return $new; } private function setHeaders(array $headers) { $this->headerNames = $this->headers = []; foreach ($headers as $header => $value) { if (\is_int($header)) { // Numeric array keys are converted to int by PHP but having a header name '123' is not forbidden by the spec // and also allowed in withHeader(). So we need to cast it to string again for the following assertion to pass. $header = (string) $header; } $this->assertHeader($header); $value = $this->normalizeHeaderValue($value); $normalized = \strtolower($header); if (isset($this->headerNames[$normalized])) { $header = $this->headerNames[$normalized]; $this->headers[$header] = \array_merge($this->headers[$header], $value); } else { $this->headerNames[$normalized] = $header; $this->headers[$header] = $value; } } } /** * @param mixed $value * * @return string[] */ private function normalizeHeaderValue($value) { if (!\is_array($value)) { return $this->trimAndValidateHeaderValues([$value]); } if (\count($value) === 0) { throw new \InvalidArgumentException('Header value can not be an empty array.'); } return $this->trimAndValidateHeaderValues($value); } /** * Trims whitespace from the header values. * * Spaces and tabs ought to be excluded by parsers when extracting the field value from a header field. * * header-field = field-name ":" OWS field-value OWS * OWS = *( SP / HTAB ) * * @param mixed[] $values Header values * * @return string[] Trimmed header values * * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 */ private function trimAndValidateHeaderValues(array $values) { return \array_map(function ($value) { if (!\is_scalar($value) && null !== $value) { throw new \InvalidArgumentException(\sprintf('Header value must be scalar or null but %s provided.', \is_object($value) ? \get_class($value) : \gettype($value))); } $trimmed = \trim((string) $value, " \t"); $this->assertValue($trimmed); return $trimmed; }, \array_values($values)); } /** * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * @param mixed $header * * @return void */ private function assertHeader($header) { if (!\is_string($header)) { throw new \InvalidArgumentException(\sprintf('Header name must be a string but %s provided.', \is_object($header) ? \get_class($header) : \gettype($header))); } if ($header === '') { throw new \InvalidArgumentException('Header name can not be empty.'); } if (!\preg_match('/^[a-zA-Z0-9\'`#$%&*+.^_|~!-]+$/D', $header)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header name.', $header)); } } /** * @param string $value * * @return void * * @see https://tools.ietf.org/html/rfc7230#section-3.2 * * field-value = *( field-content / obs-fold ) * field-content = field-vchar [ 1*( SP / HTAB ) field-vchar ] * field-vchar = VCHAR / obs-text * VCHAR = %x21-7E * obs-text = %x80-FF * obs-fold = CRLF 1*( SP / HTAB ) */ private function assertValue($value) { // The regular expression intentionally does not support the obs-fold production, because as // per RFC 7230#3.2.4: // // A sender MUST NOT generate a message that includes // line folding (i.e., that has any field-value that contains a match to // the obs-fold rule) unless the message is intended for packaging // within the message/http media type. // // Clients must not send a request with line folding and a server sending folded headers is // likely very rare. Line folding is a fairly obscure feature of HTTP/1.1 and thus not accepting // folding is not likely to break any legitimate use case. if (!\preg_match('/^[\\x20\\x09\\x21-\\x7E\\x80-\\xFF]*$/D', $value)) { throw new \InvalidArgumentException(\sprintf('"%s" is not valid header value.', $value)); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/InflateStream.php000064400000003527147600374260022574 0ustar00read(10); $filenameHeaderLength = $this->getLengthOfPossibleFilenameHeader($stream, $header); // Skip the header, that is 10 + length of filename + 1 (nil) bytes $stream = new LimitStream($stream, -1, 10 + $filenameHeaderLength); $resource = StreamWrapper::getResource($stream); \stream_filter_append($resource, 'zlib.inflate', \STREAM_FILTER_READ); $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource)); } /** * @param StreamInterface $stream * @param $header * * @return int */ private function getLengthOfPossibleFilenameHeader(StreamInterface $stream, $header) { $filename_header_length = 0; if (\substr(\bin2hex($header), 6, 2) === '08') { // we have a filename, read until nil $filename_header_length = 1; while ($stream->read(1) !== \chr(0)) { $filename_header_length++; } } return $filename_header_length; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Message.php000064400000017657147600374260021433 0ustar00getMethod() . ' ' . $message->getRequestTarget()) . ' HTTP/' . $message->getProtocolVersion(); if (!$message->hasHeader('host')) { $msg .= "\r\nHost: " . $message->getUri()->getHost(); } } elseif ($message instanceof ResponseInterface) { $msg = 'HTTP/' . $message->getProtocolVersion() . ' ' . $message->getStatusCode() . ' ' . $message->getReasonPhrase(); } else { throw new \InvalidArgumentException('Unknown message type'); } foreach ($message->getHeaders() as $name => $values) { if (\strtolower($name) === 'set-cookie') { foreach ($values as $value) { $msg .= "\r\n{$name}: " . $value; } } else { $msg .= "\r\n{$name}: " . \implode(', ', $values); } } return "{$msg}\r\n\r\n" . $message->getBody(); } /** * Get a short summary of the message body. * * Will return `null` if the response is not printable. * * @param MessageInterface $message The message to get the body summary * @param int $truncateAt The maximum allowed size of the summary * * @return string|null */ public static function bodySummary(MessageInterface $message, $truncateAt = 120) { $body = $message->getBody(); if (!$body->isSeekable() || !$body->isReadable()) { return null; } $size = $body->getSize(); if ($size === 0) { return null; } $summary = $body->read($truncateAt); $body->rewind(); if ($size > $truncateAt) { $summary .= ' (truncated...)'; } // Matches any printable character, including unicode characters: // letters, marks, numbers, punctuation, spacing, and separators. if (\preg_match('/[^\\pL\\pM\\pN\\pP\\pS\\pZ\\n\\r\\t]/u', $summary)) { return null; } return $summary; } /** * Attempts to rewind a message body and throws an exception on failure. * * The body of the message will only be rewound if a call to `tell()` * returns a value other than `0`. * * @param MessageInterface $message Message to rewind * * @throws \RuntimeException */ public static function rewindBody(MessageInterface $message) { $body = $message->getBody(); if ($body->tell()) { $body->rewind(); } } /** * Parses an HTTP message into an associative array. * * The array contains the "start-line" key containing the start line of * the message, "headers" key containing an associative array of header * array values, and a "body" key containing the body of the message. * * @param string $message HTTP request or response to parse. * * @return array */ public static function parseMessage($message) { if (!$message) { throw new \InvalidArgumentException('Invalid message'); } $message = \ltrim($message, "\r\n"); $messageParts = \preg_split("/\r?\n\r?\n/", $message, 2); if ($messageParts === \false || \count($messageParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing header delimiter'); } list($rawHeaders, $body) = $messageParts; $rawHeaders .= "\r\n"; // Put back the delimiter we split previously $headerParts = \preg_split("/\r?\n/", $rawHeaders, 2); if ($headerParts === \false || \count($headerParts) !== 2) { throw new \InvalidArgumentException('Invalid message: Missing status line'); } list($startLine, $rawHeaders) = $headerParts; if (\preg_match("/(?:^HTTP\\/|^[A-Z]+ \\S+ HTTP\\/)(\\d+(?:\\.\\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') { // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0 $rawHeaders = \preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders); } /** @var array[] $headerLines */ $count = \preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, \PREG_SET_ORDER); // If these aren't the same, then one line didn't match and there's an invalid header. if ($count !== \substr_count($rawHeaders, "\n")) { // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4 if (\preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) { throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding'); } throw new \InvalidArgumentException('Invalid header syntax'); } $headers = []; foreach ($headerLines as $headerLine) { $headers[$headerLine[1]][] = $headerLine[2]; } return ['start-line' => $startLine, 'headers' => $headers, 'body' => $body]; } /** * Constructs a URI for an HTTP request message. * * @param string $path Path from the start-line * @param array $headers Array of headers (each value an array). * * @return string */ public static function parseRequestUri($path, array $headers) { $hostKey = \array_filter(\array_keys($headers), function ($k) { return \strtolower($k) === 'host'; }); // If no host is found, then a full URI cannot be constructed. if (!$hostKey) { return $path; } $host = $headers[\reset($hostKey)][0]; $scheme = \substr($host, -4) === ':443' ? 'https' : 'http'; return $scheme . '://' . $host . '/' . \ltrim($path, '/'); } /** * Parses a request message string into a request object. * * @param string $message Request message string. * * @return Request */ public static function parseRequest($message) { $data = self::parseMessage($message); $matches = []; if (!\preg_match('/^[\\S]+\\s+([a-zA-Z]+:\\/\\/|\\/).*/', $data['start-line'], $matches)) { throw new \InvalidArgumentException('Invalid request string'); } $parts = \explode(' ', $data['start-line'], 3); $version = isset($parts[2]) ? \explode('/', $parts[2])[1] : '1.1'; $request = new Request($parts[0], $matches[1] === '/' ? self::parseRequestUri($parts[1], $data['headers']) : $parts[1], $data['headers'], $data['body'], $version); return $matches[1] === '/' ? $request : $request->withRequestTarget($parts[1]); } /** * Parses a response message string into a response object. * * @param string $message Response message string. * * @return Response */ public static function parseResponse($message) { $data = self::parseMessage($message); // According to https://tools.ietf.org/html/rfc7230#section-3.1.2 the space // between status-code and reason-phrase is required. But browsers accept // responses without space and reason as well. if (!\preg_match('/^HTTP\\/.* [0-9]{3}( .*|$)/', $data['start-line'])) { throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']); } $parts = \explode(' ', $data['start-line'], 3); return new Response((int) $parts[1], $data['headers'], $data['body'], \explode('/', $parts[0])[1], isset($parts[2]) ? $parts[2] : null); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/functions_include.php000064400000000316147600374260023542 0ustar00stream = $stream; $this->maxLength = $maxLength; } public function write($string) { $diff = $this->maxLength - $this->stream->getSize(); // Begin returning 0 when the underlying stream is too large. if ($diff <= 0) { return 0; } // Write the stream or a subset of the stream if needed. if (\strlen($string) < $diff) { return $this->stream->write($string); } return $this->stream->write(\substr($string, 0, $diff)); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/UriResolver.php000064400000021036147600374260022312 0ustar00getScheme() != '') { return $rel->withPath(self::removeDotSegments($rel->getPath())); } if ($rel->getAuthority() != '') { $targetAuthority = $rel->getAuthority(); $targetPath = self::removeDotSegments($rel->getPath()); $targetQuery = $rel->getQuery(); } else { $targetAuthority = $base->getAuthority(); if ($rel->getPath() === '') { $targetPath = $base->getPath(); $targetQuery = $rel->getQuery() != '' ? $rel->getQuery() : $base->getQuery(); } else { if ($rel->getPath()[0] === '/') { $targetPath = $rel->getPath(); } else { if ($targetAuthority != '' && $base->getPath() === '') { $targetPath = '/' . $rel->getPath(); } else { $lastSlashPos = \strrpos($base->getPath(), '/'); if ($lastSlashPos === \false) { $targetPath = $rel->getPath(); } else { $targetPath = \substr($base->getPath(), 0, $lastSlashPos + 1) . $rel->getPath(); } } } $targetPath = self::removeDotSegments($targetPath); $targetQuery = $rel->getQuery(); } } return new Uri(Uri::composeComponents($base->getScheme(), $targetAuthority, $targetPath, $targetQuery, $rel->getFragment())); } /** * Returns the target URI as a relative reference from the base URI. * * This method is the counterpart to resolve(): * * (string) $target === (string) UriResolver::resolve($base, UriResolver::relativize($base, $target)) * * One use-case is to use the current request URI as base URI and then generate relative links in your documents * to reduce the document size or offer self-contained downloadable document archives. * * $base = new Uri('http://example.com/a/b/'); * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/c')); // prints 'c'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/x/y')); // prints '../x/y'. * echo UriResolver::relativize($base, new Uri('http://example.com/a/b/?q')); // prints '?q'. * echo UriResolver::relativize($base, new Uri('http://example.org/a/b/')); // prints '//example.org/a/b/'. * * This method also accepts a target that is already relative and will try to relativize it further. Only a * relative-path reference will be returned as-is. * * echo UriResolver::relativize($base, new Uri('/a/b/c')); // prints 'c' as well * * @param UriInterface $base Base URI * @param UriInterface $target Target URI * * @return UriInterface The relative URI reference */ public static function relativize(UriInterface $base, UriInterface $target) { if ($target->getScheme() !== '' && ($base->getScheme() !== $target->getScheme() || $target->getAuthority() === '' && $base->getAuthority() !== '')) { return $target; } if (Uri::isRelativePathReference($target)) { // As the target is already highly relative we return it as-is. It would be possible to resolve // the target with `$target = self::resolve($base, $target);` and then try make it more relative // by removing a duplicate query. But let's not do that automatically. return $target; } if ($target->getAuthority() !== '' && $base->getAuthority() !== $target->getAuthority()) { return $target->withScheme(''); } // We must remove the path before removing the authority because if the path starts with two slashes, the URI // would turn invalid. And we also cannot set a relative path before removing the authority, as that is also // invalid. $emptyPathUri = $target->withScheme('')->withPath('')->withUserInfo('')->withPort(null)->withHost(''); if ($base->getPath() !== $target->getPath()) { return $emptyPathUri->withPath(self::getRelativePath($base, $target)); } if ($base->getQuery() === $target->getQuery()) { // Only the target fragment is left. And it must be returned even if base and target fragment are the same. return $emptyPathUri->withQuery(''); } // If the base URI has a query but the target has none, we cannot return an empty path reference as it would // inherit the base query component when resolving. if ($target->getQuery() === '') { $segments = \explode('/', $target->getPath()); $lastSegment = \end($segments); return $emptyPathUri->withPath($lastSegment === '' ? './' : $lastSegment); } return $emptyPathUri; } private static function getRelativePath(UriInterface $base, UriInterface $target) { $sourceSegments = \explode('/', $base->getPath()); $targetSegments = \explode('/', $target->getPath()); \array_pop($sourceSegments); $targetLastSegment = \array_pop($targetSegments); foreach ($sourceSegments as $i => $segment) { if (isset($targetSegments[$i]) && $segment === $targetSegments[$i]) { unset($sourceSegments[$i], $targetSegments[$i]); } else { break; } } $targetSegments[] = $targetLastSegment; $relativePath = \str_repeat('../', \count($sourceSegments)) . \implode('/', $targetSegments); // A reference to am empty last segment or an empty first sub-segment must be prefixed with "./". // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used // as the first segment of a relative-path reference, as it would be mistaken for a scheme name. if ('' === $relativePath || \false !== \strpos(\explode('/', $relativePath, 2)[0], ':')) { $relativePath = "./{$relativePath}"; } elseif ('/' === $relativePath[0]) { if ($base->getAuthority() != '' && $base->getPath() === '') { // In this case an extra slash is added by resolve() automatically. So we must not add one here. $relativePath = ".{$relativePath}"; } else { $relativePath = "./{$relativePath}"; } } return $relativePath; } private function __construct() { // cannot be instantiated } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/StreamWrapper.php000064400000006330147600374260022625 0ustar00isReadable()) { $mode = $stream->isWritable() ? 'r+' : 'r'; } elseif ($stream->isWritable()) { $mode = 'w'; } else { throw new \InvalidArgumentException('The stream must be readable, ' . 'writable, or both.'); } return \fopen('guzzle://stream', $mode, null, self::createStreamContext($stream)); } /** * Creates a stream context that can be used to open a stream as a php stream resource. * * @param StreamInterface $stream * * @return resource */ public static function createStreamContext(StreamInterface $stream) { return \stream_context_create(['guzzle' => ['stream' => $stream]]); } /** * Registers the stream wrapper if needed */ public static function register() { if (!\in_array('guzzle', \stream_get_wrappers())) { \stream_wrapper_register('guzzle', __CLASS__); } } public function stream_open($path, $mode, $options, &$opened_path) { $options = \stream_context_get_options($this->context); if (!isset($options['guzzle']['stream'])) { return \false; } $this->mode = $mode; $this->stream = $options['guzzle']['stream']; return \true; } public function stream_read($count) { return $this->stream->read($count); } public function stream_write($data) { return (int) $this->stream->write($data); } public function stream_tell() { return $this->stream->tell(); } public function stream_eof() { return $this->stream->eof(); } public function stream_seek($offset, $whence) { $this->stream->seek($offset, $whence); return \true; } public function stream_cast($cast_as) { $stream = clone $this->stream; return $stream->detach(); } public function stream_stat() { static $modeMap = ['r' => 33060, 'rb' => 33060, 'r+' => 33206, 'w' => 33188, 'wb' => 33188]; return ['dev' => 0, 'ino' => 0, 'mode' => $modeMap[$this->mode], 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => $this->stream->getSize() ?: 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } public function url_stat($path, $flags) { return ['dev' => 0, 'ino' => 0, 'mode' => 0, 'nlink' => 0, 'uid' => 0, 'gid' => 0, 'rdev' => 0, 'size' => 0, 'atime' => 0, 'mtime' => 0, 'ctime' => 0, 'blksize' => 0, 'blocks' => 0]; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Query.php000064400000006672147600374260021147 0ustar00 '1', 'foo[b]' => '2'])`. * * @param string $str Query string to parse * @param int|bool $urlEncoding How the query string is encoded * * @return array */ public static function parse($str, $urlEncoding = \true) { $result = []; if ($str === '') { return $result; } if ($urlEncoding === \true) { $decoder = function ($value) { return \rawurldecode(\str_replace('+', ' ', $value)); }; } elseif ($urlEncoding === \PHP_QUERY_RFC3986) { $decoder = 'rawurldecode'; } elseif ($urlEncoding === \PHP_QUERY_RFC1738) { $decoder = 'urldecode'; } else { $decoder = function ($str) { return $str; }; } foreach (\explode('&', $str) as $kvp) { $parts = \explode('=', $kvp, 2); $key = $decoder($parts[0]); $value = isset($parts[1]) ? $decoder($parts[1]) : null; if (!isset($result[$key])) { $result[$key] = $value; } else { if (!\is_array($result[$key])) { $result[$key] = [$result[$key]]; } $result[$key][] = $value; } } return $result; } /** * Build a query string from an array of key value pairs. * * This function can use the return value of `parse()` to build a query * string. This function does not modify the provided keys when an array is * encountered (like `http_build_query()` would). * * @param array $params Query string parameters. * @param int|false $encoding Set to false to not encode, PHP_QUERY_RFC3986 * to encode using RFC3986, or PHP_QUERY_RFC1738 * to encode using RFC1738. * * @return string */ public static function build(array $params, $encoding = \PHP_QUERY_RFC3986) { if (!$params) { return ''; } if ($encoding === \false) { $encoder = function ($str) { return $str; }; } elseif ($encoding === \PHP_QUERY_RFC3986) { $encoder = 'rawurlencode'; } elseif ($encoding === \PHP_QUERY_RFC1738) { $encoder = 'urlencode'; } else { throw new \InvalidArgumentException('Invalid type'); } $qs = ''; foreach ($params as $k => $v) { $k = $encoder($k); if (!\is_array($v)) { $qs .= $k; if ($v !== null) { $qs .= '=' . $encoder($v); } $qs .= '&'; } else { foreach ($v as $vv) { $qs .= $k; if ($vv !== null) { $qs .= '=' . $encoder($vv); } $qs .= '&'; } } } return $qs ? (string) \substr($qs, 0, -1) : ''; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/BufferStream.php000064400000006035147600374260022420 0ustar00hwm = $hwm; } public function __toString() { return $this->getContents(); } public function getContents() { $buffer = $this->buffer; $this->buffer = ''; return $buffer; } public function close() { $this->buffer = ''; } public function detach() { $this->close(); return null; } public function getSize() { return \strlen($this->buffer); } public function isReadable() { return \true; } public function isWritable() { return \true; } public function isSeekable() { return \false; } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { throw new \RuntimeException('Cannot seek a BufferStream'); } public function eof() { return \strlen($this->buffer) === 0; } public function tell() { throw new \RuntimeException('Cannot determine the position of a BufferStream'); } /** * Reads data from the buffer. */ public function read($length) { $currentLength = \strlen($this->buffer); if ($length >= $currentLength) { // No need to slice the buffer because we don't have enough data. $result = $this->buffer; $this->buffer = ''; } else { // Slice up the result to provide a subset of the buffer. $result = \substr($this->buffer, 0, $length); $this->buffer = \substr($this->buffer, $length); } return $result; } /** * Writes data to the buffer. */ public function write($string) { $this->buffer .= $string; // TODO: What should happen here? if (\strlen($this->buffer) >= $this->hwm) { return \false; } return \strlen($string); } public function getMetadata($key = null) { if ($key == 'hwm') { return $this->hwm; } return $key ? null : []; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/ServerRequest.php000064400000022625147600374260022655 0ustar00serverParams = $serverParams; parent::__construct($method, $uri, $headers, $body, $version); } /** * Return an UploadedFile instance array. * * @param array $files A array which respect $_FILES structure * * @return array * * @throws InvalidArgumentException for unrecognized values */ public static function normalizeFiles(array $files) { $normalized = []; foreach ($files as $key => $value) { if ($value instanceof UploadedFileInterface) { $normalized[$key] = $value; } elseif (\is_array($value) && isset($value['tmp_name'])) { $normalized[$key] = self::createUploadedFileFromSpec($value); } elseif (\is_array($value)) { $normalized[$key] = self::normalizeFiles($value); continue; } else { throw new InvalidArgumentException('Invalid value in files specification'); } } return $normalized; } /** * Create and return an UploadedFile instance from a $_FILES specification. * * If the specification represents an array of values, this method will * delegate to normalizeNestedFileSpec() and return that return value. * * @param array $value $_FILES struct * * @return array|UploadedFileInterface */ private static function createUploadedFileFromSpec(array $value) { if (\is_array($value['tmp_name'])) { return self::normalizeNestedFileSpec($value); } return new UploadedFile($value['tmp_name'], (int) $value['size'], (int) $value['error'], $value['name'], $value['type']); } /** * Normalize an array of file specifications. * * Loops through all nested files and returns a normalized array of * UploadedFileInterface instances. * * @param array $files * * @return UploadedFileInterface[] */ private static function normalizeNestedFileSpec(array $files = []) { $normalizedFiles = []; foreach (\array_keys($files['tmp_name']) as $key) { $spec = ['tmp_name' => $files['tmp_name'][$key], 'size' => $files['size'][$key], 'error' => $files['error'][$key], 'name' => $files['name'][$key], 'type' => $files['type'][$key]]; $normalizedFiles[$key] = self::createUploadedFileFromSpec($spec); } return $normalizedFiles; } /** * Return a ServerRequest populated with superglobals: * $_GET * $_POST * $_COOKIE * $_FILES * $_SERVER * * @return ServerRequestInterface */ public static function fromGlobals() { $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET'; $headers = \getallheaders(); $uri = self::getUriFromGlobals(); $body = new CachingStream(new LazyOpenStream('php://input', 'r+')); $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? \str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1'; $serverRequest = new ServerRequest($method, $uri, $headers, $body, $protocol, $_SERVER); return $serverRequest->withCookieParams($_COOKIE)->withQueryParams($_GET)->withParsedBody($_POST)->withUploadedFiles(self::normalizeFiles($_FILES)); } private static function extractHostAndPortFromAuthority($authority) { $uri = 'http://' . $authority; $parts = \parse_url($uri); if (\false === $parts) { return [null, null]; } $host = isset($parts['host']) ? $parts['host'] : null; $port = isset($parts['port']) ? $parts['port'] : null; return [$host, $port]; } /** * Get a Uri populated with values from $_SERVER. * * @return UriInterface */ public static function getUriFromGlobals() { $uri = new Uri(''); $uri = $uri->withScheme(!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' ? 'https' : 'http'); $hasPort = \false; if (isset($_SERVER['HTTP_HOST'])) { list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']); if ($host !== null) { $uri = $uri->withHost($host); } if ($port !== null) { $hasPort = \true; $uri = $uri->withPort($port); } } elseif (isset($_SERVER['SERVER_NAME'])) { $uri = $uri->withHost($_SERVER['SERVER_NAME']); } elseif (isset($_SERVER['SERVER_ADDR'])) { $uri = $uri->withHost($_SERVER['SERVER_ADDR']); } if (!$hasPort && isset($_SERVER['SERVER_PORT'])) { $uri = $uri->withPort($_SERVER['SERVER_PORT']); } $hasQuery = \false; if (isset($_SERVER['REQUEST_URI'])) { $requestUriParts = \explode('?', $_SERVER['REQUEST_URI'], 2); $uri = $uri->withPath($requestUriParts[0]); if (isset($requestUriParts[1])) { $hasQuery = \true; $uri = $uri->withQuery($requestUriParts[1]); } } if (!$hasQuery && isset($_SERVER['QUERY_STRING'])) { $uri = $uri->withQuery($_SERVER['QUERY_STRING']); } return $uri; } /** * {@inheritdoc} */ public function getServerParams() { return $this->serverParams; } /** * {@inheritdoc} */ public function getUploadedFiles() { return $this->uploadedFiles; } /** * {@inheritdoc} */ public function withUploadedFiles(array $uploadedFiles) { $new = clone $this; $new->uploadedFiles = $uploadedFiles; return $new; } /** * {@inheritdoc} */ public function getCookieParams() { return $this->cookieParams; } /** * {@inheritdoc} */ public function withCookieParams(array $cookies) { $new = clone $this; $new->cookieParams = $cookies; return $new; } /** * {@inheritdoc} */ public function getQueryParams() { return $this->queryParams; } /** * {@inheritdoc} */ public function withQueryParams(array $query) { $new = clone $this; $new->queryParams = $query; return $new; } /** * {@inheritdoc} */ public function getParsedBody() { return $this->parsedBody; } /** * {@inheritdoc} */ public function withParsedBody($data) { $new = clone $this; $new->parsedBody = $data; return $new; } /** * {@inheritdoc} */ public function getAttributes() { return $this->attributes; } /** * {@inheritdoc} */ public function getAttribute($attribute, $default = null) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $default; } return $this->attributes[$attribute]; } /** * {@inheritdoc} */ public function withAttribute($attribute, $value) { $new = clone $this; $new->attributes[$attribute] = $value; return $new; } /** * {@inheritdoc} */ public function withoutAttribute($attribute) { if (\false === \array_key_exists($attribute, $this->attributes)) { return $this; } $new = clone $this; unset($new->attributes[$attribute]); return $new; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/MultipartStream.php000064400000011016147600374260023163 0ustar00boundary = $boundary ?: \sha1(\uniqid('', \true)); $this->stream = $this->createStream($elements); } /** * Get the boundary * * @return string */ public function getBoundary() { return $this->boundary; } public function isWritable() { return \false; } /** * Get the headers needed before transferring the content of a POST file */ private function getHeaders(array $headers) { $str = ''; foreach ($headers as $key => $value) { $str .= "{$key}: {$value}\r\n"; } return "--{$this->boundary}\r\n" . \trim($str) . "\r\n\r\n"; } /** * Create the aggregate stream that will be used to upload the POST data */ protected function createStream(array $elements) { $stream = new AppendStream(); foreach ($elements as $element) { $this->addElement($stream, $element); } // Add the trailing boundary with CRLF $stream->addStream(Utils::streamFor("--{$this->boundary}--\r\n")); return $stream; } private function addElement(AppendStream $stream, array $element) { foreach (['contents', 'name'] as $key) { if (!\array_key_exists($key, $element)) { throw new \InvalidArgumentException("A '{$key}' key is required"); } } $element['contents'] = Utils::streamFor($element['contents']); if (empty($element['filename'])) { $uri = $element['contents']->getMetadata('uri'); if (\substr($uri, 0, 6) !== 'php://') { $element['filename'] = $uri; } } list($body, $headers) = $this->createElement($element['name'], $element['contents'], isset($element['filename']) ? $element['filename'] : null, isset($element['headers']) ? $element['headers'] : []); $stream->addStream(Utils::streamFor($this->getHeaders($headers))); $stream->addStream($body); $stream->addStream(Utils::streamFor("\r\n")); } /** * @return array */ private function createElement($name, StreamInterface $stream, $filename, array $headers) { // Set a default content-disposition header if one was no provided $disposition = $this->getHeader($headers, 'content-disposition'); if (!$disposition) { $headers['Content-Disposition'] = $filename === '0' || $filename ? \sprintf('form-data; name="%s"; filename="%s"', $name, \basename($filename)) : "form-data; name=\"{$name}\""; } // Set a default content-length header if one was no provided $length = $this->getHeader($headers, 'content-length'); if (!$length) { if ($length = $stream->getSize()) { $headers['Content-Length'] = (string) $length; } } // Set a default Content-Type if one was not supplied $type = $this->getHeader($headers, 'content-type'); if (!$type && ($filename === '0' || $filename)) { if ($type = MimeType::fromFilename($filename)) { $headers['Content-Type'] = $type; } } return [$stream, $headers]; } private function getHeader(array $headers, $key) { $lowercaseHeader = \strtolower($key); foreach ($headers as $k => $v) { if (\strtolower($k) === $lowercaseHeader) { return $v; } } return null; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/CachingStream.php000064400000010506147600374260022541 0ustar00remoteStream = $stream; $this->stream = $target ?: new Stream(Utils::tryFopen('php://temp', 'r+')); } public function getSize() { $remoteSize = $this->remoteStream->getSize(); if (null === $remoteSize) { return null; } return \max($this->stream->getSize(), $remoteSize); } public function rewind() { $this->seek(0); } public function seek($offset, $whence = \SEEK_SET) { if ($whence == \SEEK_SET) { $byte = $offset; } elseif ($whence == \SEEK_CUR) { $byte = $offset + $this->tell(); } elseif ($whence == \SEEK_END) { $size = $this->remoteStream->getSize(); if ($size === null) { $size = $this->cacheEntireStream(); } $byte = $size + $offset; } else { throw new \InvalidArgumentException('Invalid whence'); } $diff = $byte - $this->stream->getSize(); if ($diff > 0) { // Read the remoteStream until we have read in at least the amount // of bytes requested, or we reach the end of the file. while ($diff > 0 && !$this->remoteStream->eof()) { $this->read($diff); $diff = $byte - $this->stream->getSize(); } } else { // We can just do a normal seek since we've already seen this byte. $this->stream->seek($byte); } } public function read($length) { // Perform a regular read on any previously read data from the buffer $data = $this->stream->read($length); $remaining = $length - \strlen($data); // More data was requested so read from the remote stream if ($remaining) { // If data was written to the buffer in a position that would have // been filled from the remote stream, then we must skip bytes on // the remote stream to emulate overwriting bytes from that // position. This mimics the behavior of other PHP stream wrappers. $remoteData = $this->remoteStream->read($remaining + $this->skipReadBytes); if ($this->skipReadBytes) { $len = \strlen($remoteData); $remoteData = \substr($remoteData, $this->skipReadBytes); $this->skipReadBytes = \max(0, $this->skipReadBytes - $len); } $data .= $remoteData; $this->stream->write($remoteData); } return $data; } public function write($string) { // When appending to the end of the currently read stream, you'll want // to skip bytes from being read from the remote stream to emulate // other stream wrappers. Basically replacing bytes of data of a fixed // length. $overflow = \strlen($string) + $this->tell() - $this->remoteStream->tell(); if ($overflow > 0) { $this->skipReadBytes += $overflow; } return $this->stream->write($string); } public function eof() { return $this->stream->eof() && $this->remoteStream->eof(); } /** * Close both the remote stream and buffer stream */ public function close() { $this->remoteStream->close() && $this->stream->close(); } private function cacheEntireStream() { $target = new FnStream(['write' => 'strlen']); Utils::copyToStream($this, $target); return $this->tell(); } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Header.php000064400000004232147600374260021220 0ustar00]+>|[^=]+/', $kvp, $matches)) { $m = $matches[0]; if (isset($m[1])) { $part[\trim($m[0], $trimmed)] = \trim($m[1], $trimmed); } else { $part[] = \trim($m[0], $trimmed); } } } if ($part) { $params[] = $part; } } return $params; } /** * Converts an array of header values that may contain comma separated * headers into an array of headers with no comma separated values. * * @param string|array $header Header to normalize. * * @return array Returns the normalized header field values. */ public static function normalize($header) { if (!\is_array($header)) { return \array_map('trim', \explode(',', $header)); } $result = []; foreach ($header as $value) { foreach ((array) $value as $v) { if (\strpos($v, ',') === \false) { $result[] = $v; continue; } foreach (\preg_split('/,(?=([^"]*"[^"]*")*[^"]*$)/', $v) as $vv) { $result[] = \trim($vv); } } } return $result; } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/Request.php000064400000007156147600374260021470 0ustar00assertMethod($method); if (!$uri instanceof UriInterface) { $uri = new Uri($uri); } $this->method = \strtoupper($method); $this->uri = $uri; $this->setHeaders($headers); $this->protocol = $version; if (!isset($this->headerNames['host'])) { $this->updateHostFromUri(); } if ($body !== '' && $body !== null) { $this->stream = Utils::streamFor($body); } } public function getRequestTarget() { if ($this->requestTarget !== null) { return $this->requestTarget; } $target = $this->uri->getPath(); if ($target == '') { $target = '/'; } if ($this->uri->getQuery() != '') { $target .= '?' . $this->uri->getQuery(); } return $target; } public function withRequestTarget($requestTarget) { if (\preg_match('#\\s#', $requestTarget)) { throw new InvalidArgumentException('Invalid request target provided; cannot contain whitespace'); } $new = clone $this; $new->requestTarget = $requestTarget; return $new; } public function getMethod() { return $this->method; } public function withMethod($method) { $this->assertMethod($method); $new = clone $this; $new->method = \strtoupper($method); return $new; } public function getUri() { return $this->uri; } public function withUri(UriInterface $uri, $preserveHost = \false) { if ($uri === $this->uri) { return $this; } $new = clone $this; $new->uri = $uri; if (!$preserveHost || !isset($this->headerNames['host'])) { $new->updateHostFromUri(); } return $new; } private function updateHostFromUri() { $host = $this->uri->getHost(); if ($host == '') { return; } if (($port = $this->uri->getPort()) !== null) { $host .= ':' . $port; } if (isset($this->headerNames['host'])) { $header = $this->headerNames['host']; } else { $header = 'Host'; $this->headerNames['host'] = 'Host'; } // Ensure Host is the first header. // See: http://tools.ietf.org/html/rfc7230#section-5.4 $this->headers = [$header => [$host]] + $this->headers; } private function assertMethod($method) { if (!\is_string($method) || $method === '') { throw new \InvalidArgumentException('Method must be a non-empty string.'); } } } addons/gdriveaddon/vendor-prefixed/guzzlehttp/psr7/src/UriComparator.php000064400000002265147600374260022623 0ustar00getHost(), $modified->getHost()) !== 0) { return \true; } if ($original->getScheme() !== $modified->getScheme()) { return \true; } if (self::computePort($original) !== self::computePort($modified)) { return \true; } return \false; } /** * @return int */ private static function computePort(UriInterface $uri) { $port = $uri->getPort(); if (null !== $port) { return $port; } return 'https' === $uri->getScheme() ? 443 : 80; } private function __construct() { // cannot be instantiated } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/ChromePHPFormatter.php000064400000003602147600374260027067 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Logger; /** * Formats a log message according to the ChromePHP array format * * @author Christophe Coevoet */ class ChromePHPFormatter implements FormatterInterface { /** * Translates Monolog log levels to Wildfire levels. */ private $logLevels = array(Logger::DEBUG => 'log', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warn', Logger::ERROR => 'error', Logger::CRITICAL => 'error', Logger::ALERT => 'error', Logger::EMERGENCY => 'error'); /** * {@inheritdoc} */ public function format(array $record) { // Retrieve the line and file if set and remove them from the formatted extra $backtrace = 'unknown'; if (isset($record['extra']['file'], $record['extra']['line'])) { $backtrace = $record['extra']['file'] . ' : ' . $record['extra']['line']; unset($record['extra']['file'], $record['extra']['line']); } $message = array('message' => $record['message']); if ($record['context']) { $message['context'] = $record['context']; } if ($record['extra']) { $message['extra'] = $record['extra']; } if (\count($message) === 1) { $message = \reset($message); } return array($record['channel'], $message, $backtrace, $this->logLevels[$record['level']]); } public function formatBatch(array $records) { $formatted = array(); foreach ($records as $record) { $formatted[] = $this->format($record); } return $formatted; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/ElasticaFormatter.php000064400000003505147600374260027031 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Elastica\Document; /** * Format a log message into an Elastica Document * * @author Jelle Vink */ class ElasticaFormatter extends NormalizerFormatter { /** * @var string Elastic search index name */ protected $index; /** * @var string Elastic search document type */ protected $type; /** * @param string $index Elastic Search index name * @param string $type Elastic Search document type */ public function __construct($index, $type) { // elasticsearch requires a ISO 8601 format date with optional millisecond precision. parent::__construct('Y-m-d\\TH:i:s.uP'); $this->index = $index; $this->type = $type; } /** * {@inheritdoc} */ public function format(array $record) { $record = parent::format($record); return $this->getDocument($record); } /** * Getter index * @return string */ public function getIndex() { return $this->index; } /** * Getter type * @return string */ public function getType() { return $this->type; } /** * Convert a log message into an Elastica Document * * @param array $record Log message * @return Document */ protected function getDocument($record) { $document = new Document(); $document->setData($record); $document->setType($this->type); $document->setIndex($this->index); return $document; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php000064400000006301147600374260026566 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Utils; /** * Formats a record for use with the MongoDBHandler. * * @author Florian Plattner */ class MongoDBFormatter implements FormatterInterface { private $exceptionTraceAsString; private $maxNestingLevel; /** * @param int $maxNestingLevel 0 means infinite nesting, the $record itself is level 1, $record['context'] is 2 * @param bool $exceptionTraceAsString set to false to log exception traces as a sub documents instead of strings */ public function __construct($maxNestingLevel = 3, $exceptionTraceAsString = \true) { $this->maxNestingLevel = \max($maxNestingLevel, 0); $this->exceptionTraceAsString = (bool) $exceptionTraceAsString; } /** * {@inheritDoc} */ public function format(array $record) { return $this->formatArray($record); } /** * {@inheritDoc} */ public function formatBatch(array $records) { foreach ($records as $key => $record) { $records[$key] = $this->format($record); } return $records; } protected function formatArray(array $record, $nestingLevel = 0) { if ($this->maxNestingLevel == 0 || $nestingLevel <= $this->maxNestingLevel) { foreach ($record as $name => $value) { if ($value instanceof \DateTime) { $record[$name] = $this->formatDate($value, $nestingLevel + 1); } elseif ($value instanceof \Exception) { $record[$name] = $this->formatException($value, $nestingLevel + 1); } elseif (\is_array($value)) { $record[$name] = $this->formatArray($value, $nestingLevel + 1); } elseif (\is_object($value)) { $record[$name] = $this->formatObject($value, $nestingLevel + 1); } } } else { $record = '[...]'; } return $record; } protected function formatObject($value, $nestingLevel) { $objectVars = \get_object_vars($value); $objectVars['class'] = Utils::getClass($value); return $this->formatArray($objectVars, $nestingLevel); } protected function formatException(\Exception $exception, $nestingLevel) { $formattedException = array('class' => Utils::getClass($exception), 'message' => $exception->getMessage(), 'code' => (int) $exception->getCode(), 'file' => $exception->getFile() . ':' . $exception->getLine()); if ($this->exceptionTraceAsString === \true) { $formattedException['trace'] = $exception->getTraceAsString(); } else { $formattedException['trace'] = $exception->getTrace(); } return $this->formatArray($formattedException, $nestingLevel); } protected function formatDate(\DateTime $value, $nestingLevel) { return new \MongoDate($value->getTimestamp()); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/LogglyFormatter.php000064400000002511147600374260026535 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; /** * Encodes message information into JSON in a format compatible with Loggly. * * @author Adam Pancutt */ class LogglyFormatter extends JsonFormatter { /** * Overrides the default batch mode to new lines for compatibility with the * Loggly bulk API. * * @param int $batchMode */ public function __construct($batchMode = self::BATCH_MODE_NEWLINES, $appendNewline = \false) { parent::__construct($batchMode, $appendNewline); } /** * Appends the 'timestamp' parameter for indexing by Loggly. * * @see https://www.loggly.com/docs/automated-parsing/#json * @see \VendorDuplicator\Monolog\Formatter\JsonFormatter::format() */ public function format(array $record) { if (isset($record["datetime"]) && $record["datetime"] instanceof \DateTime) { $record["timestamp"] = $record["datetime"]->format("Y-m-d\\TH:i:s.uO"); // TODO 2.0 unset the 'datetime' parameter, retained for BC } return parent::format($record); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/LogstashFormatter.php000064400000012143147600374260027066 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; /** * Serializes a log message to Logstash Event Format * * @see http://logstash.net/ * @see https://github.com/logstash/logstash/blob/master/lib/logstash/event.rb * * @author Tim Mower */ class LogstashFormatter extends NormalizerFormatter { const V0 = 0; const V1 = 1; /** * @var string the name of the system for the Logstash log message, used to fill the @source field */ protected $systemName; /** * @var string an application name for the Logstash log message, used to fill the @type field */ protected $applicationName; /** * @var string a prefix for 'extra' fields from the Monolog record (optional) */ protected $extraPrefix; /** * @var string a prefix for 'context' fields from the Monolog record (optional) */ protected $contextPrefix; /** * @var int logstash format version to use */ protected $version; /** * @param string $applicationName the application that sends the data, used as the "type" field of logstash * @param string $systemName the system/machine name, used as the "source" field of logstash, defaults to the hostname of the machine * @param string $extraPrefix prefix for extra keys inside logstash "fields" * @param string $contextPrefix prefix for context keys inside logstash "fields", defaults to ctxt_ * @param int $version the logstash format version to use, defaults to 0 */ public function __construct($applicationName, $systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $version = self::V0) { // logstash requires a ISO 8601 format date with optional millisecond precision. parent::__construct('Y-m-d\\TH:i:s.uP'); $this->systemName = $systemName ?: \gethostname(); $this->applicationName = $applicationName; $this->extraPrefix = $extraPrefix; $this->contextPrefix = $contextPrefix; $this->version = $version; } /** * {@inheritdoc} */ public function format(array $record) { $record = parent::format($record); if ($this->version === self::V1) { $message = $this->formatV1($record); } else { $message = $this->formatV0($record); } return $this->toJson($message) . "\n"; } protected function formatV0(array $record) { if (empty($record['datetime'])) { $record['datetime'] = \gmdate('c'); } $message = array('@timestamp' => $record['datetime'], '@source' => $this->systemName, '@fields' => array()); if (isset($record['message'])) { $message['@message'] = $record['message']; } if (isset($record['channel'])) { $message['@tags'] = array($record['channel']); $message['@fields']['channel'] = $record['channel']; } if (isset($record['level'])) { $message['@fields']['level'] = $record['level']; } if ($this->applicationName) { $message['@type'] = $this->applicationName; } if (isset($record['extra']['server'])) { $message['@source_host'] = $record['extra']['server']; } if (isset($record['extra']['url'])) { $message['@source_path'] = $record['extra']['url']; } if (!empty($record['extra'])) { foreach ($record['extra'] as $key => $val) { $message['@fields'][$this->extraPrefix . $key] = $val; } } if (!empty($record['context'])) { foreach ($record['context'] as $key => $val) { $message['@fields'][$this->contextPrefix . $key] = $val; } } return $message; } protected function formatV1(array $record) { if (empty($record['datetime'])) { $record['datetime'] = \gmdate('c'); } $message = array('@timestamp' => $record['datetime'], '@version' => 1, 'host' => $this->systemName); if (isset($record['message'])) { $message['message'] = $record['message']; } if (isset($record['channel'])) { $message['type'] = $record['channel']; $message['channel'] = $record['channel']; } if (isset($record['level_name'])) { $message['level'] = $record['level_name']; } if ($this->applicationName) { $message['type'] = $this->applicationName; } if (!empty($record['extra'])) { foreach ($record['extra'] as $key => $val) { $message[$this->extraPrefix . $key] = $val; } } if (!empty($record['context'])) { foreach ($record['context'] as $key => $val) { $message[$this->contextPrefix . $key] = $val; } } return $message; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/LineFormatter.php000064400000013066147600374260026176 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Utils; /** * Formats incoming records into a one-line string * * This is especially useful for logging to files * * @author Jordi Boggiano * @author Christophe Coevoet */ class LineFormatter extends NormalizerFormatter { const SIMPLE_FORMAT = "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"; protected $format; protected $allowInlineLineBreaks; protected $ignoreEmptyContextAndExtra; protected $includeStacktraces; /** * @param string $format The format of the message * @param string $dateFormat The format of the timestamp: one supported by DateTime::format * @param bool $allowInlineLineBreaks Whether to allow inline line breaks in log entries * @param bool $ignoreEmptyContextAndExtra */ public function __construct($format = null, $dateFormat = null, $allowInlineLineBreaks = \false, $ignoreEmptyContextAndExtra = \false) { $this->format = $format ?: static::SIMPLE_FORMAT; $this->allowInlineLineBreaks = $allowInlineLineBreaks; $this->ignoreEmptyContextAndExtra = $ignoreEmptyContextAndExtra; parent::__construct($dateFormat); } public function includeStacktraces($include = \true) { $this->includeStacktraces = $include; if ($this->includeStacktraces) { $this->allowInlineLineBreaks = \true; } } public function allowInlineLineBreaks($allow = \true) { $this->allowInlineLineBreaks = $allow; } public function ignoreEmptyContextAndExtra($ignore = \true) { $this->ignoreEmptyContextAndExtra = $ignore; } /** * {@inheritdoc} */ public function format(array $record) { $vars = parent::format($record); $output = $this->format; foreach ($vars['extra'] as $var => $val) { if (\false !== \strpos($output, '%extra.' . $var . '%')) { $output = \str_replace('%extra.' . $var . '%', $this->stringify($val), $output); unset($vars['extra'][$var]); } } foreach ($vars['context'] as $var => $val) { if (\false !== \strpos($output, '%context.' . $var . '%')) { $output = \str_replace('%context.' . $var . '%', $this->stringify($val), $output); unset($vars['context'][$var]); } } if ($this->ignoreEmptyContextAndExtra) { if (empty($vars['context'])) { unset($vars['context']); $output = \str_replace('%context%', '', $output); } if (empty($vars['extra'])) { unset($vars['extra']); $output = \str_replace('%extra%', '', $output); } } foreach ($vars as $var => $val) { if (\false !== \strpos($output, '%' . $var . '%')) { $output = \str_replace('%' . $var . '%', $this->stringify($val), $output); } } // remove leftover %extra.xxx% and %context.xxx% if any if (\false !== \strpos($output, '%')) { $output = \preg_replace('/%(?:extra|context)\\..+?%/', '', $output); } return $output; } public function formatBatch(array $records) { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } public function stringify($value) { return $this->replaceNewlines($this->convertToString($value)); } protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof \Exception && !$e instanceof \Throwable) { throw new \InvalidArgumentException('Exception/Throwable expected, got ' . \gettype($e) . ' / ' . Utils::getClass($e)); } $previousText = ''; if ($previous = $e->getPrevious()) { do { $previousText .= ', ' . Utils::getClass($previous) . '(code: ' . $previous->getCode() . '): ' . $previous->getMessage() . ' at ' . $previous->getFile() . ':' . $previous->getLine(); } while ($previous = $previous->getPrevious()); } $str = '[object] (' . Utils::getClass($e) . '(code: ' . $e->getCode() . '): ' . $e->getMessage() . ' at ' . $e->getFile() . ':' . $e->getLine() . $previousText . ')'; if ($this->includeStacktraces) { $str .= "\n[stacktrace]\n" . $e->getTraceAsString() . "\n"; } return $str; } protected function convertToString($data) { if (null === $data || \is_bool($data)) { return \var_export($data, \true); } if (\is_scalar($data)) { return (string) $data; } if (\version_compare(\PHP_VERSION, '5.4.0', '>=')) { return $this->toJson($data, \true); } return \str_replace('\\/', '/', $this->toJson($data, \true)); } protected function replaceNewlines($str) { if ($this->allowInlineLineBreaks) { if (0 === \strpos($str, '{')) { return \str_replace(array('\\r', '\\n'), array("\r", "\n"), $str); } return $str; } return \str_replace(array("\r\n", "\r", "\n"), ' ', $str); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/FormatterInterface.php000064400000001442147600374260027202 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; /** * Interface for formatters * * @author Jordi Boggiano */ interface FormatterInterface { /** * Formats a log record. * * @param array $record A record to format * @return mixed The formatted record */ public function format(array $record); /** * Formats a set of log records. * * @param array $records A set of records to format * @return mixed The formatted set of records */ public function formatBatch(array $records); } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php000064400000012676147600374260027437 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use Exception; use VendorDuplicator\Monolog\Utils; /** * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets * * @author Jordi Boggiano */ class NormalizerFormatter implements FormatterInterface { const SIMPLE_DATE = "Y-m-d H:i:s"; protected $dateFormat; protected $maxDepth; /** * @param string $dateFormat The format of the timestamp: one supported by DateTime::format * @param int $maxDepth */ public function __construct($dateFormat = null, $maxDepth = 9) { $this->dateFormat = $dateFormat ?: static::SIMPLE_DATE; $this->maxDepth = $maxDepth; if (!\function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s NormalizerFormatter'); } } /** * {@inheritdoc} */ public function format(array $record) { return $this->normalize($record); } /** * {@inheritdoc} */ public function formatBatch(array $records) { foreach ($records as $key => $record) { $records[$key] = $this->format($record); } return $records; } /** * @return int */ public function getMaxDepth() { return $this->maxDepth; } /** * @param int $maxDepth */ public function setMaxDepth($maxDepth) { $this->maxDepth = $maxDepth; } protected function normalize($data, $depth = 0) { if ($depth > $this->maxDepth) { return 'Over ' . $this->maxDepth . ' levels deep, aborting normalization'; } if (null === $data || \is_scalar($data)) { if (\is_float($data)) { if (\is_infinite($data)) { return ($data > 0 ? '' : '-') . 'INF'; } if (\is_nan($data)) { return 'NaN'; } } return $data; } if (\is_array($data)) { $normalized = array(); $count = 1; foreach ($data as $key => $value) { if ($count++ > 1000) { $normalized['...'] = 'Over 1000 items (' . \count($data) . ' total), aborting normalization'; break; } $normalized[$key] = $this->normalize($value, $depth + 1); } return $normalized; } if ($data instanceof \DateTime) { return $data->format($this->dateFormat); } if (\is_object($data)) { // TODO 2.0 only check for Throwable if ($data instanceof Exception || \PHP_VERSION_ID > 70000 && $data instanceof \Throwable) { return $this->normalizeException($data); } // non-serializable objects that implement __toString stringified if (\method_exists($data, '__toString') && !$data instanceof \JsonSerializable) { $value = $data->__toString(); } else { // the rest is json-serialized in some way $value = $this->toJson($data, \true); } return \sprintf("[object] (%s: %s)", Utils::getClass($data), $value); } if (\is_resource($data)) { return \sprintf('[resource] (%s)', \get_resource_type($data)); } return '[unknown(' . \gettype($data) . ')]'; } protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof Exception && !$e instanceof \Throwable) { throw new \InvalidArgumentException('Exception/Throwable expected, got ' . \gettype($e) . ' / ' . Utils::getClass($e)); } $data = array('class' => Utils::getClass($e), 'message' => $e->getMessage(), 'code' => (int) $e->getCode(), 'file' => $e->getFile() . ':' . $e->getLine()); if ($e instanceof \SoapFault) { if (isset($e->faultcode)) { $data['faultcode'] = $e->faultcode; } if (isset($e->faultactor)) { $data['faultactor'] = $e->faultactor; } if (isset($e->detail)) { if (\is_string($e->detail)) { $data['detail'] = $e->detail; } elseif (\is_object($e->detail) || \is_array($e->detail)) { $data['detail'] = $this->toJson($e->detail, \true); } } } $trace = $e->getTrace(); foreach ($trace as $frame) { if (isset($frame['file'])) { $data['trace'][] = $frame['file'] . ':' . $frame['line']; } } if ($previous = $e->getPrevious()) { $data['previous'] = $this->normalizeException($previous); } return $data; } /** * Return the JSON representation of a value * * @param mixed $data * @param bool $ignoreErrors * @throws \RuntimeException if encoding fails and errors are not ignored * @return string */ protected function toJson($data, $ignoreErrors = \false) { return Utils::jsonEncode($data, null, $ignoreErrors); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php000064400000012412147600374260026212 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use Exception; use VendorDuplicator\Monolog\Utils; use Throwable; /** * Encodes whatever record data is passed to it as json * * This can be useful to log to databases or remote APIs * * @author Jordi Boggiano */ class JsonFormatter extends NormalizerFormatter { const BATCH_MODE_JSON = 1; const BATCH_MODE_NEWLINES = 2; protected $batchMode; protected $appendNewline; /** * @var bool */ protected $includeStacktraces = \false; /** * @param int $batchMode * @param bool $appendNewline * @param int $maxDepth */ public function __construct($batchMode = self::BATCH_MODE_JSON, $appendNewline = \true, $maxDepth = 9) { parent::__construct(null, $maxDepth); $this->batchMode = $batchMode; $this->appendNewline = $appendNewline; } /** * The batch mode option configures the formatting style for * multiple records. By default, multiple records will be * formatted as a JSON-encoded array. However, for * compatibility with some API endpoints, alternative styles * are available. * * @return int */ public function getBatchMode() { return $this->batchMode; } /** * True if newlines are appended to every formatted record * * @return bool */ public function isAppendingNewlines() { return $this->appendNewline; } /** * {@inheritdoc} */ public function format(array $record) { return $this->toJson($this->normalize($record), \true) . ($this->appendNewline ? "\n" : ''); } /** * {@inheritdoc} */ public function formatBatch(array $records) { switch ($this->batchMode) { case static::BATCH_MODE_NEWLINES: return $this->formatBatchNewlines($records); case static::BATCH_MODE_JSON: default: return $this->formatBatchJson($records); } } /** * @param bool $include */ public function includeStacktraces($include = \true) { $this->includeStacktraces = $include; } /** * Return a JSON-encoded array of records. * * @param array $records * @return string */ protected function formatBatchJson(array $records) { return $this->toJson($this->normalize($records), \true); } /** * Use new lines to separate records instead of a * JSON-encoded array. * * @param array $records * @return string */ protected function formatBatchNewlines(array $records) { $instance = $this; $oldNewline = $this->appendNewline; $this->appendNewline = \false; \array_walk($records, function (&$value, $key) use($instance) { $value = $instance->format($value); }); $this->appendNewline = $oldNewline; return \implode("\n", $records); } /** * Normalizes given $data. * * @param mixed $data * * @return mixed */ protected function normalize($data, $depth = 0) { if ($depth > $this->maxDepth) { return 'Over ' . $this->maxDepth . ' levels deep, aborting normalization'; } if (\is_array($data)) { $normalized = array(); $count = 1; foreach ($data as $key => $value) { if ($count++ > 1000) { $normalized['...'] = 'Over 1000 items (' . \count($data) . ' total), aborting normalization'; break; } $normalized[$key] = $this->normalize($value, $depth + 1); } return $normalized; } if ($data instanceof Exception || $data instanceof Throwable) { return $this->normalizeException($data); } if (\is_resource($data)) { return parent::normalize($data); } return $data; } /** * Normalizes given exception with or without its own stack trace based on * `includeStacktraces` property. * * @param Exception|Throwable $e * * @return array */ protected function normalizeException($e) { // TODO 2.0 only check for Throwable if (!$e instanceof Exception && !$e instanceof Throwable) { throw new \InvalidArgumentException('Exception/Throwable expected, got ' . \gettype($e) . ' / ' . Utils::getClass($e)); } $data = array('class' => Utils::getClass($e), 'message' => $e->getMessage(), 'code' => (int) $e->getCode(), 'file' => $e->getFile() . ':' . $e->getLine()); if ($this->includeStacktraces) { $trace = $e->getTrace(); foreach ($trace as $frame) { if (isset($frame['file'])) { $data['trace'][] = $frame['file'] . ':' . $frame['line']; } } } if ($previous = $e->getPrevious()) { $data['previous'] = $this->normalizeException($previous); } return $data; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php000064400000004171147600374260026705 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Utils; /** * Class FluentdFormatter * * Serializes a log message to Fluentd unix socket protocol * * Fluentd config: * * * type unix * path /var/run/td-agent/td-agent.sock * * * Monolog setup: * * $logger = new Monolog\Logger('fluent.tag'); * $fluentHandler = new Monolog\Handler\SocketHandler('unix:///var/run/td-agent/td-agent.sock'); * $fluentHandler->setFormatter(new Monolog\Formatter\FluentdFormatter()); * $logger->pushHandler($fluentHandler); * * @author Andrius Putna */ class FluentdFormatter implements FormatterInterface { /** * @var bool $levelTag should message level be a part of the fluentd tag */ protected $levelTag = \false; public function __construct($levelTag = \false) { if (!\function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s FluentdUnixFormatter'); } $this->levelTag = (bool) $levelTag; } public function isUsingLevelsInTag() { return $this->levelTag; } public function format(array $record) { $tag = $record['channel']; if ($this->levelTag) { $tag .= '.' . \strtolower($record['level_name']); } $message = array('message' => $record['message'], 'context' => $record['context'], 'extra' => $record['extra']); if (!$this->levelTag) { $message['level'] = $record['level']; $message['level_name'] = $record['level_name']; } return Utils::jsonEncode(array($tag, $record['datetime']->getTimestamp(), $message)); } public function formatBatch(array $records) { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/FlowdockFormatter.php000064400000004500147600374260027050 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; /** * formats the record to be used in the FlowdockHandler * * @author Dominik Liebler */ class FlowdockFormatter implements FormatterInterface { /** * @var string */ private $source; /** * @var string */ private $sourceEmail; /** * @param string $source * @param string $sourceEmail */ public function __construct($source, $sourceEmail) { $this->source = $source; $this->sourceEmail = $sourceEmail; } /** * {@inheritdoc} */ public function format(array $record) { $tags = array('#logs', '#' . \strtolower($record['level_name']), '#' . $record['channel']); foreach ($record['extra'] as $value) { $tags[] = '#' . $value; } $subject = \sprintf('in %s: %s - %s', $this->source, $record['level_name'], $this->getShortMessage($record['message'])); $record['flowdock'] = array('source' => $this->source, 'from_address' => $this->sourceEmail, 'subject' => $subject, 'content' => $record['message'], 'tags' => $tags, 'project' => $this->source); return $record; } /** * {@inheritdoc} */ public function formatBatch(array $records) { $formatted = array(); foreach ($records as $record) { $formatted[] = $this->format($record); } return $formatted; } /** * @param string $message * * @return string */ public function getShortMessage($message) { static $hasMbString; if (null === $hasMbString) { $hasMbString = \function_exists('mb_strlen'); } $maxLength = 45; if ($hasMbString) { if (\mb_strlen($message, 'UTF-8') > $maxLength) { $message = \mb_substr($message, 0, $maxLength - 4, 'UTF-8') . ' ...'; } } else { if (\strlen($message) > $maxLength) { $message = \substr($message, 0, $maxLength - 4) . ' ...'; } } return $message; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/ScalarFormatter.php000064400000002037147600374260026510 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; /** * Formats data into an associative array of scalar values. * Objects and arrays will be JSON encoded. * * @author Andrew Lawson */ class ScalarFormatter extends NormalizerFormatter { /** * {@inheritdoc} */ public function format(array $record) { foreach ($record as $key => $value) { $record[$key] = $this->normalizeValue($value); } return $record; } /** * @param mixed $value * @return mixed */ protected function normalizeValue($value) { $normalized = $this->normalize($value); if (\is_array($normalized) || \is_object($normalized)) { return $this->toJson($normalized, \true); } return $normalized; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php000064400000005724147600374260027056 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Logger; /** * Serializes a log message according to Wildfire's header requirements * * @author Eric Clemmons (@ericclemmons) * @author Christophe Coevoet * @author Kirill chEbba Chebunin */ class WildfireFormatter extends NormalizerFormatter { const TABLE = 'table'; /** * Translates Monolog log levels to Wildfire levels. */ private $logLevels = array(Logger::DEBUG => 'LOG', Logger::INFO => 'INFO', Logger::NOTICE => 'INFO', Logger::WARNING => 'WARN', Logger::ERROR => 'ERROR', Logger::CRITICAL => 'ERROR', Logger::ALERT => 'ERROR', Logger::EMERGENCY => 'ERROR'); /** * {@inheritdoc} */ public function format(array $record) { // Retrieve the line and file if set and remove them from the formatted extra $file = $line = ''; if (isset($record['extra']['file'])) { $file = $record['extra']['file']; unset($record['extra']['file']); } if (isset($record['extra']['line'])) { $line = $record['extra']['line']; unset($record['extra']['line']); } $record = $this->normalize($record); $message = array('message' => $record['message']); $handleError = \false; if ($record['context']) { $message['context'] = $record['context']; $handleError = \true; } if ($record['extra']) { $message['extra'] = $record['extra']; $handleError = \true; } if (\count($message) === 1) { $message = \reset($message); } if (isset($record['context'][self::TABLE])) { $type = 'TABLE'; $label = $record['channel'] . ': ' . $record['message']; $message = $record['context'][self::TABLE]; } else { $type = $this->logLevels[$record['level']]; $label = $record['channel']; } // Create JSON object describing the appearance of the message in the console $json = $this->toJson(array(array('Type' => $type, 'File' => $file, 'Line' => $line, 'Label' => $label), $message), $handleError); // The message itself is a serialization of the above JSON object + it's length return \sprintf('%s|%s|', \strlen($json), $json); } public function formatBatch(array $records) { throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter'); } protected function normalize($data, $depth = 0) { if (\is_object($data) && !$data instanceof \DateTime) { return $data; } return parent::normalize($data, $depth); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php000064400000010771147600374260026213 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * Formats incoming records into an HTML table * * This is especially useful for html email logging * * @author Tiago Brito */ class HtmlFormatter extends NormalizerFormatter { /** * Translates Monolog log levels to html color priorities. */ protected $logLevels = array(Logger::DEBUG => '#cccccc', Logger::INFO => '#468847', Logger::NOTICE => '#3a87ad', Logger::WARNING => '#c09853', Logger::ERROR => '#f0ad4e', Logger::CRITICAL => '#FF7708', Logger::ALERT => '#C12A19', Logger::EMERGENCY => '#000000'); /** * @param string $dateFormat The format of the timestamp: one supported by DateTime::format */ public function __construct($dateFormat = null) { parent::__construct($dateFormat); } /** * Creates an HTML table row * * @param string $th Row header content * @param string $td Row standard cell content * @param bool $escapeTd false if td content must not be html escaped * @return string */ protected function addRow($th, $td = ' ', $escapeTd = \true) { $th = \htmlspecialchars($th, \ENT_NOQUOTES, 'UTF-8'); if ($escapeTd) { $td = '
' . \htmlspecialchars($td, \ENT_NOQUOTES, 'UTF-8') . '
'; } return "\n{$th}:\n" . $td . "\n"; } /** * Create a HTML h1 tag * * @param string $title Text to be in the h1 * @param int $level Error level * @return string */ protected function addTitle($title, $level) { $title = \htmlspecialchars($title, \ENT_NOQUOTES, 'UTF-8'); return '

' . $title . '

'; } /** * Formats a log record. * * @param array $record A record to format * @return mixed The formatted record */ public function format(array $record) { $output = $this->addTitle($record['level_name'], $record['level']); $output .= ''; $output .= $this->addRow('Message', (string) $record['message']); $output .= $this->addRow('Time', $record['datetime']->format($this->dateFormat)); $output .= $this->addRow('Channel', $record['channel']); if ($record['context']) { $embeddedTable = '
'; foreach ($record['context'] as $key => $value) { $embeddedTable .= $this->addRow($key, $this->convertToString($value)); } $embeddedTable .= '
'; $output .= $this->addRow('Context', $embeddedTable, \false); } if ($record['extra']) { $embeddedTable = ''; foreach ($record['extra'] as $key => $value) { $embeddedTable .= $this->addRow($key, $this->convertToString($value)); } $embeddedTable .= '
'; $output .= $this->addRow('Extra', $embeddedTable, \false); } return $output . ''; } /** * Formats a set of log records. * * @param array $records A set of records to format * @return mixed The formatted set of records */ public function formatBatch(array $records) { $message = ''; foreach ($records as $record) { $message .= $this->format($record); } return $message; } protected function convertToString($data) { if (null === $data || \is_scalar($data)) { return (string) $data; } $data = $this->normalize($data); if (\version_compare(\PHP_VERSION, '5.4.0', '>=')) { return Utils::jsonEncode($data, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE, \true); } return \str_replace('\\/', '/', Utils::jsonEncode($data, null, \true)); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Formatter/GelfMessageFormatter.php000064400000010327147600374260027466 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Formatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Gelf\Message; /** * Serializes a log message to GELF * @see http://www.graylog2.org/about/gelf * * @author Matt Lehner */ class GelfMessageFormatter extends NormalizerFormatter { const DEFAULT_MAX_LENGTH = 32766; /** * @var string the name of the system for the Gelf log message */ protected $systemName; /** * @var string a prefix for 'extra' fields from the Monolog record (optional) */ protected $extraPrefix; /** * @var string a prefix for 'context' fields from the Monolog record (optional) */ protected $contextPrefix; /** * @var int max length per field */ protected $maxLength; /** * Translates Monolog log levels to Graylog2 log priorities. */ private $logLevels = array(Logger::DEBUG => 7, Logger::INFO => 6, Logger::NOTICE => 5, Logger::WARNING => 4, Logger::ERROR => 3, Logger::CRITICAL => 2, Logger::ALERT => 1, Logger::EMERGENCY => 0); public function __construct($systemName = null, $extraPrefix = null, $contextPrefix = 'ctxt_', $maxLength = null) { parent::__construct('U.u'); $this->systemName = $systemName ?: \gethostname(); $this->extraPrefix = $extraPrefix; $this->contextPrefix = $contextPrefix; $this->maxLength = \is_null($maxLength) ? self::DEFAULT_MAX_LENGTH : $maxLength; } /** * {@inheritdoc} */ public function format(array $record) { $record = parent::format($record); if (!isset($record['datetime'], $record['message'], $record['level'])) { throw new \InvalidArgumentException('The record should at least contain datetime, message and level keys, ' . \var_export($record, \true) . ' given'); } $message = new Message(); $message->setTimestamp($record['datetime'])->setShortMessage((string) $record['message'])->setHost($this->systemName)->setLevel($this->logLevels[$record['level']]); // message length + system name length + 200 for padding / metadata $len = 200 + \strlen((string) $record['message']) + \strlen($this->systemName); if ($len > $this->maxLength) { $message->setShortMessage(\substr($record['message'], 0, $this->maxLength)); } if (isset($record['channel'])) { $message->setFacility($record['channel']); } if (isset($record['extra']['line'])) { $message->setLine($record['extra']['line']); unset($record['extra']['line']); } if (isset($record['extra']['file'])) { $message->setFile($record['extra']['file']); unset($record['extra']['file']); } foreach ($record['extra'] as $key => $val) { $val = \is_scalar($val) || null === $val ? $val : $this->toJson($val); $len = \strlen($this->extraPrefix . $key . $val); if ($len > $this->maxLength) { $message->setAdditional($this->extraPrefix . $key, \substr($val, 0, $this->maxLength)); break; } $message->setAdditional($this->extraPrefix . $key, $val); } foreach ($record['context'] as $key => $val) { $val = \is_scalar($val) || null === $val ? $val : $this->toJson($val); $len = \strlen($this->contextPrefix . $key . $val); if ($len > $this->maxLength) { $message->setAdditional($this->contextPrefix . $key, \substr($val, 0, $this->maxLength)); break; } $message->setAdditional($this->contextPrefix . $key, $val); } if (null === $message->getFile() && isset($record['context']['exception']['file'])) { if (\preg_match("/^(.+):([0-9]+)\$/", $record['context']['exception']['file'], $matches)) { $message->setFile($matches[1]); $message->setLine($matches[2]); } } return $message; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/Curl/Util.php000064400000002666147600374260024663 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\Curl; class Util { private static $retriableErrorCodes = array(\CURLE_COULDNT_RESOLVE_HOST, \CURLE_COULDNT_CONNECT, \CURLE_HTTP_NOT_FOUND, \CURLE_READ_ERROR, \CURLE_OPERATION_TIMEOUTED, \CURLE_HTTP_POST_ERROR, \CURLE_SSL_CONNECT_ERROR); /** * Executes a CURL request with optional retries and exception on failure * * @param resource $ch curl handler * @throws \RuntimeException */ public static function execute($ch, $retries = 5, $closeAfterDone = \true) { while ($retries--) { if (\curl_exec($ch) === \false) { $curlErrno = \curl_errno($ch); if (\false === \in_array($curlErrno, self::$retriableErrorCodes, \true) || !$retries) { $curlError = \curl_error($ch); if ($closeAfterDone) { \curl_close($ch); } throw new \RuntimeException(\sprintf('Curl error (code %s): %s', $curlErrno, $curlError)); } continue; } if ($closeAfterDone) { \curl_close($ch); } break; } } } monolog/monolog/src/Monolog/Handler/FingersCrossed/ChannelLevelActivationStrategy.php000064400000003676147600374260034011 0ustar00addons/gdriveaddon/vendor-prefixed * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\FingersCrossed; use VendorDuplicator\Monolog\Logger; /** * Channel and Error level based monolog activation strategy. Allows to trigger activation * based on level per channel. e.g. trigger activation on level 'ERROR' by default, except * for records of the 'sql' channel; those should trigger activation on level 'WARN'. * * Example: * * * $activationStrategy = new ChannelLevelActivationStrategy( * Logger::CRITICAL, * array( * 'request' => Logger::ALERT, * 'sensitive' => Logger::ERROR, * ) * ); * $handler = new FingersCrossedHandler(new StreamHandler('php://stderr'), $activationStrategy); * * * @author Mike Meessen */ class ChannelLevelActivationStrategy implements ActivationStrategyInterface { private $defaultActionLevel; private $channelToActionLevel; /** * @param int $defaultActionLevel The default action level to be used if the record's category doesn't match any * @param array $channelToActionLevel An array that maps channel names to action levels. */ public function __construct($defaultActionLevel, $channelToActionLevel = array()) { $this->defaultActionLevel = Logger::toMonologLevel($defaultActionLevel); $this->channelToActionLevel = \array_map('VendorDuplicator\\Monolog\\Logger::toMonologLevel', $channelToActionLevel); } public function isHandlerActivated(array $record) { if (isset($this->channelToActionLevel[$record['channel']])) { return $record['level'] >= $this->channelToActionLevel[$record['channel']]; } return $record['level'] >= $this->defaultActionLevel; } } vendor-prefixed/monolog/monolog/src/Monolog/Handler/FingersCrossed/ErrorLevelActivationStrategy.php000064400000001425147600374260033520 0ustar00addons/gdriveaddon * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\FingersCrossed; use VendorDuplicator\Monolog\Logger; /** * Error level based activation strategy. * * @author Johannes M. Schmitt */ class ErrorLevelActivationStrategy implements ActivationStrategyInterface { private $actionLevel; public function __construct($actionLevel) { $this->actionLevel = Logger::toMonologLevel($actionLevel); } public function isHandlerActivated(array $record) { return $record['level'] >= $this->actionLevel; } } vendor-prefixed/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php000064400000001230147600374260033331 0ustar00addons/gdriveaddon * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\FingersCrossed; /** * Interface for activation strategies for the FingersCrossedHandler. * * @author Johannes M. Schmitt */ interface ActivationStrategyInterface { /** * Returns whether the given record activates the handler. * * @param array $record * @return bool */ public function isHandlerActivated(array $record); } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php000064400000017646147600374260026276 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\Slack; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\Monolog\Formatter\NormalizerFormatter; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Slack record utility helping to log to Slack webhooks or API. * * @author Greg Kedzierski * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks * @see https://api.slack.com/docs/message-attachments */ class SlackRecord { const COLOR_DANGER = 'danger'; const COLOR_WARNING = 'warning'; const COLOR_GOOD = 'good'; const COLOR_DEFAULT = '#e3e4e6'; /** * Slack channel (encoded ID or name) * @var string|null */ private $channel; /** * Name of a bot * @var string|null */ private $username; /** * User icon e.g. 'ghost', 'http://example.com/user.png' * @var string */ private $userIcon; /** * Whether the message should be added to Slack as attachment (plain text otherwise) * @var bool */ private $useAttachment; /** * Whether the the context/extra messages added to Slack as attachments are in a short style * @var bool */ private $useShortAttachment; /** * Whether the attachment should include context and extra data * @var bool */ private $includeContextAndExtra; /** * Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @var array */ private $excludeFields; /** * @var FormatterInterface */ private $formatter; /** * @var NormalizerFormatter */ private $normalizerFormatter; public function __construct($channel = null, $username = null, $useAttachment = \true, $userIcon = null, $useShortAttachment = \false, $includeContextAndExtra = \false, array $excludeFields = array(), FormatterInterface $formatter = null) { $this->channel = $channel; $this->username = $username; $this->userIcon = \trim($userIcon, ':'); $this->useAttachment = $useAttachment; $this->useShortAttachment = $useShortAttachment; $this->includeContextAndExtra = $includeContextAndExtra; $this->excludeFields = $excludeFields; $this->formatter = $formatter; if ($this->includeContextAndExtra) { $this->normalizerFormatter = new NormalizerFormatter(); } } public function getSlackData(array $record) { $dataArray = array(); $record = $this->excludeFields($record); if ($this->username) { $dataArray['username'] = $this->username; } if ($this->channel) { $dataArray['channel'] = $this->channel; } if ($this->formatter && !$this->useAttachment) { $message = $this->formatter->format($record); } else { $message = $record['message']; } if ($this->useAttachment) { $attachment = array('fallback' => $message, 'text' => $message, 'color' => $this->getAttachmentColor($record['level']), 'fields' => array(), 'mrkdwn_in' => array('fields'), 'ts' => $record['datetime']->getTimestamp()); if ($this->useShortAttachment) { $attachment['title'] = $record['level_name']; } else { $attachment['title'] = 'Message'; $attachment['fields'][] = $this->generateAttachmentField('Level', $record['level_name']); } if ($this->includeContextAndExtra) { foreach (array('extra', 'context') as $key) { if (empty($record[$key])) { continue; } if ($this->useShortAttachment) { $attachment['fields'][] = $this->generateAttachmentField($key, $record[$key]); } else { // Add all extra fields as individual fields in attachment $attachment['fields'] = \array_merge($attachment['fields'], $this->generateAttachmentFields($record[$key])); } } } $dataArray['attachments'] = array($attachment); } else { $dataArray['text'] = $message; } if ($this->userIcon) { if (\filter_var($this->userIcon, \FILTER_VALIDATE_URL)) { $dataArray['icon_url'] = $this->userIcon; } else { $dataArray['icon_emoji'] = ":{$this->userIcon}:"; } } return $dataArray; } /** * Returned a Slack message attachment color associated with * provided level. * * @param int $level * @return string */ public function getAttachmentColor($level) { switch (\true) { case $level >= Logger::ERROR: return self::COLOR_DANGER; case $level >= Logger::WARNING: return self::COLOR_WARNING; case $level >= Logger::INFO: return self::COLOR_GOOD; default: return self::COLOR_DEFAULT; } } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param array $fields * * @return string */ public function stringify($fields) { $normalized = $this->normalizerFormatter->format($fields); $prettyPrintFlag = \defined('JSON_PRETTY_PRINT') ? \JSON_PRETTY_PRINT : 128; $flags = 0; if (\PHP_VERSION_ID >= 50400) { $flags = \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE; } $hasSecondDimension = \count(\array_filter($normalized, 'is_array')); $hasNonNumericKeys = !\count(\array_filter(\array_keys($normalized), 'is_numeric')); return $hasSecondDimension || $hasNonNumericKeys ? Utils::jsonEncode($normalized, $prettyPrintFlag | $flags) : Utils::jsonEncode($normalized, $flags); } /** * Sets the formatter * * @param FormatterInterface $formatter */ public function setFormatter(FormatterInterface $formatter) { $this->formatter = $formatter; } /** * Generates attachment field * * @param string $title * @param string|array $value * * @return array */ private function generateAttachmentField($title, $value) { $value = \is_array($value) ? \sprintf('```%s```', $this->stringify($value)) : $value; return array('title' => \ucfirst($title), 'value' => $value, 'short' => \false); } /** * Generates a collection of attachment fields from array * * @param array $data * * @return array */ private function generateAttachmentFields(array $data) { $fields = array(); foreach ($this->normalizerFormatter->format($data) as $key => $value) { $fields[] = $this->generateAttachmentField($key, $value); } return $fields; } /** * Get a copy of record with fields excluded according to $this->excludeFields * * @param array $record * * @return array */ private function excludeFields(array $record) { foreach ($this->excludeFields as $field) { $keys = \explode('.', $field); $node =& $record; $lastKey = \end($keys); foreach ($keys as $key) { if (!isset($node[$key])) { break; } if ($lastKey === $key) { unset($node[$key]); break; } $node =& $node[$key]; } } return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SyslogUdp/UdpSocket.php000064400000002625147600374260026666 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler\SyslogUdp; class UdpSocket { const DATAGRAM_MAX_LENGTH = 65023; protected $ip; protected $port; protected $socket; public function __construct($ip, $port = 514) { $this->ip = $ip; $this->port = $port; $this->socket = \socket_create(\AF_INET, \SOCK_DGRAM, \SOL_UDP); } public function write($line, $header = "") { $this->send($this->assembleMessage($line, $header)); } public function close() { if (\is_resource($this->socket)) { \socket_close($this->socket); $this->socket = null; } } protected function send($chunk) { if (!\is_resource($this->socket)) { throw new \LogicException('The UdpSocket to ' . $this->ip . ':' . $this->port . ' has been closed and can not be written to anymore'); } \socket_sendto($this->socket, $chunk, \strlen($chunk), $flags = 0, $this->ip, $this->port); } protected function assembleMessage($line, $header) { $chunkSize = self::DATAGRAM_MAX_LENGTH - \strlen($header); return $header . \substr($line, 0, $chunkSize); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/StreamHandler.php000064400000013232147600374260025561 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * Stores to any stream resource * * Can be used to store into php://stderr, remote and local files, etc. * * @author Jordi Boggiano */ class StreamHandler extends AbstractProcessingHandler { /** @private 512KB */ const CHUNK_SIZE = 524288; /** @var resource|null */ protected $stream; protected $url; private $errorMessage; protected $filePermission; protected $useLocking; private $dirCreated; /** * @param resource|string $stream * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes * * @throws \Exception If a missing directory is not buildable * @throws \InvalidArgumentException If stream is not a resource or string */ public function __construct($stream, $level = Logger::DEBUG, $bubble = \true, $filePermission = null, $useLocking = \false) { parent::__construct($level, $bubble); if (\is_resource($stream)) { $this->stream = $stream; $this->streamSetChunkSize(); } elseif (\is_string($stream)) { $this->url = Utils::canonicalizePath($stream); } else { throw new \InvalidArgumentException('A stream must either be a resource or a string.'); } $this->filePermission = $filePermission; $this->useLocking = $useLocking; } /** * {@inheritdoc} */ public function close() { if ($this->url && \is_resource($this->stream)) { \fclose($this->stream); } $this->stream = null; $this->dirCreated = null; } /** * Return the currently active stream if it is open * * @return resource|null */ public function getStream() { return $this->stream; } /** * Return the stream URL if it was configured with a URL and not an active resource * * @return string|null */ public function getUrl() { return $this->url; } /** * {@inheritdoc} */ protected function write(array $record) { if (!\is_resource($this->stream)) { if (null === $this->url || '' === $this->url) { throw new \LogicException('Missing stream url, the stream can not be opened. This may be caused by a premature call to close().'); } $this->createDir(); $this->errorMessage = null; \set_error_handler(array($this, 'customErrorHandler')); $this->stream = \fopen($this->url, 'a'); if ($this->filePermission !== null) { @\chmod($this->url, $this->filePermission); } \restore_error_handler(); if (!\is_resource($this->stream)) { $this->stream = null; throw new \UnexpectedValueException(\sprintf('The stream or file "%s" could not be opened in append mode: ' . $this->errorMessage, $this->url)); } $this->streamSetChunkSize(); } if ($this->useLocking) { // ignoring errors here, there's not much we can do about them \flock($this->stream, \LOCK_EX); } $this->streamWrite($this->stream, $record); if ($this->useLocking) { \flock($this->stream, \LOCK_UN); } } /** * Write to stream * @param resource $stream * @param array $record */ protected function streamWrite($stream, array $record) { \fwrite($stream, (string) $record['formatted']); } protected function streamSetChunkSize() { if (\version_compare(\PHP_VERSION, '5.4.0', '>=')) { return \stream_set_chunk_size($this->stream, self::CHUNK_SIZE); } return \false; } private function customErrorHandler($code, $msg) { $this->errorMessage = \preg_replace('{^(fopen|mkdir)\\(.*?\\): }', '', $msg); } /** * @param string $stream * * @return null|string */ private function getDirFromStream($stream) { $pos = \strpos($stream, '://'); if ($pos === \false) { return \dirname($stream); } if ('file://' === \substr($stream, 0, 7)) { return \dirname(\substr($stream, 7)); } return null; } private function createDir() { // Do not try to create dir if it has already been tried. if ($this->dirCreated) { return; } $dir = $this->getDirFromStream($this->url); if (null !== $dir && !\is_dir($dir)) { $this->errorMessage = null; \set_error_handler(array($this, 'customErrorHandler')); $status = \mkdir($dir, 0777, \true); \restore_error_handler(); if (\false === $status && !\is_dir($dir)) { throw new \UnexpectedValueException(\sprintf('There is no existing directory at "%s" and its not buildable: ' . $this->errorMessage, $dir)); } } $this->dirCreated = \true; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/MongoDBHandler.php000064400000003226147600374260025615 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\NormalizerFormatter; /** * Logs to a MongoDB database. * * usage example: * * $log = new Logger('application'); * $mongodb = new MongoDBHandler(new \Mongo("mongodb://localhost:27017"), "logs", "prod"); * $log->pushHandler($mongodb); * * @author Thomas Tourlourat */ class MongoDBHandler extends AbstractProcessingHandler { protected $mongoCollection; public function __construct($mongo, $database, $collection, $level = Logger::DEBUG, $bubble = \true) { if (!($mongo instanceof \MongoClient || $mongo instanceof \Mongo || $mongo instanceof \VendorDuplicator\MongoDB\Client)) { throw new \InvalidArgumentException('MongoClient, Mongo or MongoDB\\Client instance required'); } $this->mongoCollection = $mongo->selectCollection($database, $collection); parent::__construct($level, $bubble); } protected function write(array $record) { if ($this->mongoCollection instanceof \VendorDuplicator\MongoDB\Collection) { $this->mongoCollection->insertOne($record["formatted"]); } else { $this->mongoCollection->save($record["formatted"]); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new NormalizerFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php000064400000004117147600374260025222 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * IFTTTHandler uses cURL to trigger IFTTT Maker actions * * Register a secret key and trigger/event name at https://ifttt.com/maker * * value1 will be the channel from monolog's Logger constructor, * value2 will be the level name (ERROR, WARNING, ..) * value3 will be the log record's message * * @author Nehal Patel */ class IFTTTHandler extends AbstractProcessingHandler { private $eventName; private $secretKey; /** * @param string $eventName The name of the IFTTT Maker event that should be triggered * @param string $secretKey A valid IFTTT secret key * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = \true) { $this->eventName = $eventName; $this->secretKey = $secretKey; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ public function write(array $record) { $postData = array("value1" => $record["channel"], "value2" => $record["level_name"], "value3" => $record["message"]); $postString = Utils::jsonEncode($postData); $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_URL, "https://maker.ifttt.com/trigger/" . $this->eventName . "/with/key/" . $this->secretKey); \curl_setopt($ch, \CURLOPT_POST, \true); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, \true); \curl_setopt($ch, \CURLOPT_POSTFIELDS, $postString); \curl_setopt($ch, \CURLOPT_HTTPHEADER, array("Content-Type: application/json")); Curl\Util::execute($ch); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/RollbarHandler.php000064400000007250147600374260025726 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\RollbarNotifier; use Exception; use VendorDuplicator\Monolog\Logger; /** * Sends errors to Rollbar * * If the context data contains a `payload` key, that is used as an array * of payload options to RollbarNotifier's report_message/report_exception methods. * * Rollbar's context info will contain the context + extra keys from the log record * merged, and then on top of that a few keys: * * - level (rollbar level name) * - monolog_level (monolog level name, raw level, as rollbar only has 5 but monolog 8) * - channel * - datetime (unix timestamp) * * @author Paul Statezny */ class RollbarHandler extends AbstractProcessingHandler { /** * Rollbar notifier * * @var RollbarNotifier */ protected $rollbarNotifier; protected $levelMap = array(Logger::DEBUG => 'debug', Logger::INFO => 'info', Logger::NOTICE => 'info', Logger::WARNING => 'warning', Logger::ERROR => 'error', Logger::CRITICAL => 'critical', Logger::ALERT => 'critical', Logger::EMERGENCY => 'critical'); /** * Records whether any log records have been added since the last flush of the rollbar notifier * * @var bool */ private $hasRecords = \false; protected $initialized = \false; /** * @param RollbarNotifier $rollbarNotifier RollbarNotifier object constructed with valid token * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(RollbarNotifier $rollbarNotifier, $level = Logger::ERROR, $bubble = \true) { $this->rollbarNotifier = $rollbarNotifier; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors \register_shutdown_function(array($this, 'close')); $this->initialized = \true; } $context = $record['context']; $payload = array(); if (isset($context['payload'])) { $payload = $context['payload']; unset($context['payload']); } $context = \array_merge($context, $record['extra'], array('level' => $this->levelMap[$record['level']], 'monolog_level' => $record['level_name'], 'channel' => $record['channel'], 'datetime' => $record['datetime']->format('U'))); if (isset($context['exception']) && $context['exception'] instanceof Exception) { $payload['level'] = $context['level']; $exception = $context['exception']; unset($context['exception']); $this->rollbarNotifier->report_exception($exception, $context, $payload); } else { $this->rollbarNotifier->report_message($record['message'], $context['level'], $context, $payload); } $this->hasRecords = \true; } public function flush() { if ($this->hasRecords) { $this->rollbarNotifier->flush(); $this->hasRecords = \false; } } /** * {@inheritdoc} */ public function close() { $this->flush(); } /** * {@inheritdoc} */ public function reset() { $this->flush(); parent::reset(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/NullHandler.php000064400000001732147600374260025242 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Blackhole * * Any record it can handle will be thrown away. This can be used * to put on top of an existing stack to override it temporarily. * * @author Jordi Boggiano */ class NullHandler extends AbstractHandler { /** * @param int $level The minimum logging level at which this handler will be triggered */ public function __construct($level = Logger::DEBUG) { parent::__construct($level, \false); } /** * {@inheritdoc} */ public function handle(array $record) { if ($record['level'] < $this->level) { return \false; } return \true; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php000064400000012702147600374260026114 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\ChromePHPFormatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * Handler sending logs to the ChromePHP extension (http://www.chromephp.com/) * * This also works out of the box with Firefox 43+ * * @author Christophe Coevoet */ class ChromePHPHandler extends AbstractProcessingHandler { /** * Version of the extension */ const VERSION = '4.0'; /** * Header name */ const HEADER_NAME = 'X-ChromeLogger-Data'; /** * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+) */ const USER_AGENT_REGEX = '{\\b(?:Chrome/\\d+(?:\\.\\d+)*|HeadlessChrome|Firefox/(?:4[3-9]|[5-9]\\d|\\d{3,})(?:\\.\\d)*)\\b}'; protected static $initialized = \false; /** * Tracks whether we sent too much data * * Chrome limits the headers to 4KB, so when we sent 3KB we stop sending * * @var bool */ protected static $overflowed = \false; protected static $json = array('version' => self::VERSION, 'columns' => array('label', 'log', 'backtrace', 'type'), 'rows' => array()); protected static $sendHeaders = \true; /** * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); if (!\function_exists('json_encode')) { throw new \RuntimeException('PHP\'s json extension is required to use Monolog\'s ChromePHPHandler'); } } /** * {@inheritdoc} */ public function handleBatch(array $records) { $messages = array(); foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } $messages[] = $this->processRecord($record); } if (!empty($messages)) { $messages = $this->getFormatter()->formatBatch($messages); self::$json['rows'] = \array_merge(self::$json['rows'], $messages); $this->send(); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new ChromePHPFormatter(); } /** * Creates & sends header for a record * * @see sendHeader() * @see send() * @param array $record */ protected function write(array $record) { self::$json['rows'][] = $record['formatted']; $this->send(); } /** * Sends the log header * * @see sendHeader() */ protected function send() { if (self::$overflowed || !self::$sendHeaders) { return; } if (!self::$initialized) { self::$initialized = \true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } self::$json['request_uri'] = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; } $json = Utils::jsonEncode(self::$json, null, \true); $data = \base64_encode(\utf8_encode($json)); if (\strlen($data) > 3 * 1024) { self::$overflowed = \true; $record = array('message' => 'Incomplete logs, chrome header size limit reached', 'context' => array(), 'level' => Logger::WARNING, 'level_name' => Logger::getLevelName(Logger::WARNING), 'channel' => 'monolog', 'datetime' => new \DateTime(), 'extra' => array()); self::$json['rows'][\count(self::$json['rows']) - 1] = $this->getFormatter()->format($record); $json = Utils::jsonEncode(self::$json, null, \true); $data = \base64_encode(\utf8_encode($json)); } if (\trim($data) !== '') { $this->sendHeader(self::HEADER_NAME, $data); } } /** * Send header string to the client * * @param string $header * @param string $content */ protected function sendHeader($header, $content) { if (!\headers_sent() && self::$sendHeaders) { \header(\sprintf('%s: %s', $header, $content)); } } /** * Verifies if the headers are accepted by the current user agent * * @return bool */ protected function headersAccepted() { if (empty($_SERVER['HTTP_USER_AGENT'])) { return \false; } return \preg_match(self::USER_AGENT_REGEX, $_SERVER['HTTP_USER_AGENT']); } /** * BC getter for the sendHeaders property that has been made static */ public function __get($property) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property ' . $property); } return static::$sendHeaders; } /** * BC setter for the sendHeaders property that has been made static */ public function __set($property, $value) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property ' . $property); } static::$sendHeaders = $value; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SlackHandler.php000064400000014347147600374260025373 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack API * * @author Greg Kedzierski * @see https://api.slack.com/ */ class SlackHandler extends SocketHandler { /** * Slack API token * @var string */ private $token; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $token Slack API token * @param string $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] * @throws MissingExtensionException If no OpenSSL PHP extension configured */ public function __construct($token, $channel, $username = null, $useAttachment = \true, $iconEmoji = null, $level = Logger::CRITICAL, $bubble = \true, $useShortAttachment = \false, $includeContextAndExtra = \false, array $excludeFields = array()) { if (!\extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the SlackHandler'); } parent::__construct('ssl://slack.com:443', $level, $bubble); $this->slackRecord = new SlackRecord($channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields, $this->formatter); $this->token = $token; } public function getSlackRecord() { return $this->slackRecord; } public function getToken() { return $this->token; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = $this->prepareContentData($record); return \http_build_query($dataArray); } /** * Prepares content data * * @param array $record * @return array */ protected function prepareContentData($record) { $dataArray = $this->slackRecord->getSlackData($record); $dataArray['token'] = $this->token; if (!empty($dataArray['attachments'])) { $dataArray['attachments'] = Utils::jsonEncode($dataArray['attachments']); } return $dataArray; } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST /api/chat.postMessage HTTP/1.1\r\n"; $header .= "Host: slack.com\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . \strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->finalizeWrite(); } /** * Finalizes the request by reading some bytes and then closing the socket * * If we do not read some but close the socket too early, slack sometimes * drops the request entirely. */ protected function finalizeWrite() { $res = $this->getResource(); if (\is_resource($res)) { @\fread($res, 2048); } $this->closeSocket(); } /** * Returned a Slack message attachment color associated with * provided level. * * @param int $level * @return string * @deprecated Use underlying SlackRecord instead */ protected function getAttachmentColor($level) { \trigger_error('SlackHandler::getAttachmentColor() is deprecated. Use underlying SlackRecord instead.', \E_USER_DEPRECATED); return $this->slackRecord->getAttachmentColor($level); } /** * Stringifies an array of key/value pairs to be used in attachment fields * * @param array $fields * @return string * @deprecated Use underlying SlackRecord instead */ protected function stringify($fields) { \trigger_error('SlackHandler::stringify() is deprecated. Use underlying SlackRecord instead.', \E_USER_DEPRECATED); return $this->slackRecord->stringify($fields); } public function setFormatter(FormatterInterface $formatter) { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter() { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php000064400000015071147600374260027251 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy; use VendorDuplicator\Monolog\Handler\FingersCrossed\ActivationStrategyInterface; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\ResettableInterface; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Buffers all records until a certain level is reached * * The advantage of this approach is that you don't get any clutter in your log files. * Only requests which actually trigger an error (or whatever your actionLevel is) will be * in the logs, but they will contain all records, not only those above the level threshold. * * You can find the various activation strategies in the * Monolog\Handler\FingersCrossed\ namespace. * * @author Jordi Boggiano */ class FingersCrossedHandler extends AbstractHandler { protected $handler; protected $activationStrategy; protected $buffering = \true; protected $bufferSize; protected $buffer = array(); protected $stopBuffering; protected $passthruLevel; /** * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $fingersCrossedHandler). * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action * @param int $bufferSize How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $stopBuffering Whether the handler should stop buffering after being triggered (default true) * @param int $passthruLevel Minimum level to always flush to handler on close, even if strategy not triggered */ public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = \true, $stopBuffering = \true, $passthruLevel = null) { if (null === $activationStrategy) { $activationStrategy = new ErrorLevelActivationStrategy(Logger::WARNING); } // convert simple int activationStrategy to an object if (!$activationStrategy instanceof ActivationStrategyInterface) { $activationStrategy = new ErrorLevelActivationStrategy($activationStrategy); } $this->handler = $handler; $this->activationStrategy = $activationStrategy; $this->bufferSize = $bufferSize; $this->bubble = $bubble; $this->stopBuffering = $stopBuffering; if ($passthruLevel !== null) { $this->passthruLevel = Logger::toMonologLevel($passthruLevel); } if (!$this->handler instanceof HandlerInterface && !\is_callable($this->handler)) { throw new \RuntimeException("The given handler (" . \json_encode($this->handler) . ") is not a callable nor a Monolog\\Handler\\HandlerInterface object"); } } /** * {@inheritdoc} */ public function isHandling(array $record) { return \true; } /** * Manually activate this logger regardless of the activation strategy */ public function activate() { if ($this->stopBuffering) { $this->buffering = \false; } $this->getHandler(\end($this->buffer) ?: null)->handleBatch($this->buffer); $this->buffer = array(); } /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } if ($this->buffering) { $this->buffer[] = $record; if ($this->bufferSize > 0 && \count($this->buffer) > $this->bufferSize) { \array_shift($this->buffer); } if ($this->activationStrategy->isHandlerActivated($record)) { $this->activate(); } } else { $this->getHandler($record)->handle($record); } return \false === $this->bubble; } /** * {@inheritdoc} */ public function close() { $this->flushBuffer(); } public function reset() { $this->flushBuffer(); parent::reset(); if ($this->getHandler() instanceof ResettableInterface) { $this->getHandler()->reset(); } } /** * Clears the buffer without flushing any messages down to the wrapped handler. * * It also resets the handler to its initial buffering state. */ public function clear() { $this->buffer = array(); $this->reset(); } /** * Resets the state of the handler. Stops forwarding records to the wrapped handler. */ private function flushBuffer() { if (null !== $this->passthruLevel) { $level = $this->passthruLevel; $this->buffer = \array_filter($this->buffer, function ($record) use($level) { return $record['level'] >= $level; }); if (\count($this->buffer) > 0) { $this->getHandler(\end($this->buffer) ?: null)->handleBatch($this->buffer); } } $this->buffer = array(); $this->buffering = \true; } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @return HandlerInterface */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = \call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->getHandler()->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->getHandler()->getFormatter(); } } gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FormattableHandlerInterface.php000064400000001675147600374260030340 0ustar00addons * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Interface to describe loggers that have a formatter * * This interface is present in monolog 1.x to ease forward compatibility. * * @author Jordi Boggiano */ interface FormattableHandlerInterface { /** * Sets the formatter. * * @param FormatterInterface $formatter * @return HandlerInterface self */ public function setFormatter(FormatterInterface $formatter) : HandlerInterface; /** * Gets the formatter. * * @return FormatterInterface */ public function getFormatter() : FormatterInterface; } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/MissingExtensionException.php000064400000000722147600374260030215 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; /** * Exception can be thrown if an extension for an handler is missing * * @author Christian Bergau */ class MissingExtensionException extends \Exception { } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ZendMonitorHandler.php000064400000005441147600374260026601 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\NormalizerFormatter; use VendorDuplicator\Monolog\Logger; /** * Handler sending logs to Zend Monitor * * @author Christian Bergau * @author Jason Davis */ class ZendMonitorHandler extends AbstractProcessingHandler { /** * Monolog level / ZendMonitor Custom Event priority map * * @var array */ protected $levelMap = array(); /** * Construct * * @param int $level * @param bool $bubble * @throws MissingExtensionException */ public function __construct($level = Logger::DEBUG, $bubble = \true) { if (!\function_exists('VendorDuplicator\\zend_monitor_custom_event')) { throw new MissingExtensionException('You must have Zend Server installed with Zend Monitor enabled in order to use this handler'); } //zend monitor constants are not defined if zend monitor is not enabled. $this->levelMap = array(Logger::DEBUG => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::INFO => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::NOTICE => \ZEND_MONITOR_EVENT_SEVERITY_INFO, Logger::WARNING => \ZEND_MONITOR_EVENT_SEVERITY_WARNING, Logger::ERROR => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::CRITICAL => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::ALERT => \ZEND_MONITOR_EVENT_SEVERITY_ERROR, Logger::EMERGENCY => \ZEND_MONITOR_EVENT_SEVERITY_ERROR); parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { $this->writeZendMonitorCustomEvent(Logger::getLevelName($record['level']), $record['message'], $record['formatted'], $this->levelMap[$record['level']]); } /** * Write to Zend Monitor Events * @param string $type Text displayed in "Class Name (custom)" field * @param string $message Text displayed in "Error String" * @param mixed $formatted Displayed in Custom Variables tab * @param int $severity Set the event severity level (-1,0,1) */ protected function writeZendMonitorCustomEvent($type, $message, $formatted, $severity) { zend_monitor_custom_event($type, $message, $formatted, $severity); } /** * {@inheritdoc} */ public function getDefaultFormatter() { return new NormalizerFormatter(); } /** * Get the level map * * @return array */ public function getLevelMap() { return $this->levelMap; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php000064400000012447147600374260025572 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\WildfireFormatter; /** * Simple FirePHP Handler (http://www.firephp.org/), which uses the Wildfire protocol. * * @author Eric Clemmons (@ericclemmons) */ class FirePHPHandler extends AbstractProcessingHandler { /** * WildFire JSON header message format */ const PROTOCOL_URI = 'http://meta.wildfirehq.org/Protocol/JsonStream/0.2'; /** * FirePHP structure for parsing messages & their presentation */ const STRUCTURE_URI = 'http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1'; /** * Must reference a "known" plugin, otherwise headers won't display in FirePHP */ const PLUGIN_URI = 'http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3'; /** * Header prefix for Wildfire to recognize & parse headers */ const HEADER_PREFIX = 'X-Wf'; /** * Whether or not Wildfire vendor-specific headers have been generated & sent yet */ protected static $initialized = \false; /** * Shared static message index between potentially multiple handlers * @var int */ protected static $messageIndex = 1; protected static $sendHeaders = \true; /** * Base header creation function used by init headers & record headers * * @param array $meta Wildfire Plugin, Protocol & Structure Indexes * @param string $message Log message * @return array Complete header string ready for the client as key and message as value */ protected function createHeader(array $meta, $message) { $header = \sprintf('%s-%s', self::HEADER_PREFIX, \join('-', $meta)); return array($header => $message); } /** * Creates message header from record * * @see createHeader() * @param array $record * @return array */ protected function createRecordHeader(array $record) { // Wildfire is extensible to support multiple protocols & plugins in a single request, // but we're not taking advantage of that (yet), so we're using "1" for simplicity's sake. return $this->createHeader(array(1, 1, 1, self::$messageIndex++), $record['formatted']); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new WildfireFormatter(); } /** * Wildfire initialization headers to enable message parsing * * @see createHeader() * @see sendHeader() * @return array */ protected function getInitHeaders() { // Initial payload consists of required headers for Wildfire return \array_merge($this->createHeader(array('Protocol', 1), self::PROTOCOL_URI), $this->createHeader(array(1, 'Structure', 1), self::STRUCTURE_URI), $this->createHeader(array(1, 'Plugin', 1), self::PLUGIN_URI)); } /** * Send header string to the client * * @param string $header * @param string $content */ protected function sendHeader($header, $content) { if (!\headers_sent() && self::$sendHeaders) { \header(\sprintf('%s: %s', $header, $content)); } } /** * Creates & sends header for a record, ensuring init headers have been sent prior * * @see sendHeader() * @see sendInitHeaders() * @param array $record */ protected function write(array $record) { if (!self::$sendHeaders) { return; } // WildFire-specific headers must be sent prior to any messages if (!self::$initialized) { self::$initialized = \true; self::$sendHeaders = $this->headersAccepted(); if (!self::$sendHeaders) { return; } foreach ($this->getInitHeaders() as $header => $content) { $this->sendHeader($header, $content); } } $header = $this->createRecordHeader($record); if (\trim(\current($header)) !== '') { $this->sendHeader(\key($header), \current($header)); } } /** * Verifies if the headers are accepted by the current user agent * * @return bool */ protected function headersAccepted() { if (!empty($_SERVER['HTTP_USER_AGENT']) && \preg_match('{\\bFirePHP/\\d+\\.\\d+\\b}', $_SERVER['HTTP_USER_AGENT'])) { return \true; } return isset($_SERVER['HTTP_X_FIREPHP_VERSION']); } /** * BC getter for the sendHeaders property that has been made static */ public function __get($property) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property ' . $property); } return static::$sendHeaders; } /** * BC setter for the sendHeaders property that has been made static */ public function __set($property, $value) { if ('sendHeaders' !== $property) { throw new \InvalidArgumentException('Undefined property ' . $property); } static::$sendHeaders = $value; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php000064400000014163147600374260026042 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\Monolog\Formatter\NormalizerFormatter; /** * Class to record a log on a NewRelic application. * Enabling New Relic High Security mode may prevent capture of useful information. * * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted'] * * @see https://docs.newrelic.com/docs/agents/php-agent * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security */ class NewRelicHandler extends AbstractProcessingHandler { /** * Name of the New Relic application that will receive logs from this handler. * * @var string */ protected $appName; /** * Name of the current transaction * * @var string */ protected $transactionName; /** * Some context and extra data is passed into the handler as arrays of values. Do we send them as is * (useful if we are using the API), or explode them for display on the NewRelic RPM website? * * @var bool */ protected $explodeArrays; /** * {@inheritDoc} * * @param string $appName * @param bool $explodeArrays * @param string $transactionName */ public function __construct($level = Logger::ERROR, $bubble = \true, $appName = null, $explodeArrays = \false, $transactionName = null) { parent::__construct($level, $bubble); $this->appName = $appName; $this->explodeArrays = $explodeArrays; $this->transactionName = $transactionName; } /** * {@inheritDoc} */ protected function write(array $record) { if (!$this->isNewRelicEnabled()) { throw new MissingExtensionException('The newrelic PHP extension is required to use the NewRelicHandler'); } if ($appName = $this->getAppName($record['context'])) { $this->setNewRelicAppName($appName); } if ($transactionName = $this->getTransactionName($record['context'])) { $this->setNewRelicTransactionName($transactionName); unset($record['formatted']['context']['transaction_name']); } if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || \PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable)) { \newrelic_notice_error($record['message'], $record['context']['exception']); unset($record['formatted']['context']['exception']); } else { \newrelic_notice_error($record['message']); } if (isset($record['formatted']['context']) && \is_array($record['formatted']['context'])) { foreach ($record['formatted']['context'] as $key => $parameter) { if (\is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('context_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('context_' . $key, $parameter); } } } if (isset($record['formatted']['extra']) && \is_array($record['formatted']['extra'])) { foreach ($record['formatted']['extra'] as $key => $parameter) { if (\is_array($parameter) && $this->explodeArrays) { foreach ($parameter as $paramKey => $paramValue) { $this->setNewRelicParameter('extra_' . $key . '_' . $paramKey, $paramValue); } } else { $this->setNewRelicParameter('extra_' . $key, $parameter); } } } } /** * Checks whether the NewRelic extension is enabled in the system. * * @return bool */ protected function isNewRelicEnabled() { return \extension_loaded('newrelic'); } /** * Returns the appname where this log should be sent. Each log can override the default appname, set in this * handler's constructor, by providing the appname in it's context. * * @param array $context * @return null|string */ protected function getAppName(array $context) { if (isset($context['appname'])) { return $context['appname']; } return $this->appName; } /** * Returns the name of the current transaction. Each log can override the default transaction name, set in this * handler's constructor, by providing the transaction_name in it's context * * @param array $context * * @return null|string */ protected function getTransactionName(array $context) { if (isset($context['transaction_name'])) { return $context['transaction_name']; } return $this->transactionName; } /** * Sets the NewRelic application that should receive this log. * * @param string $appName */ protected function setNewRelicAppName($appName) { \newrelic_set_appname($appName); } /** * Overwrites the name of the current transaction * * @param string $transactionName */ protected function setNewRelicTransactionName($transactionName) { \newrelic_name_transaction($transactionName); } /** * @param string $key * @param mixed $value */ protected function setNewRelicParameter($key, $value) { if (null === $value || \is_scalar($value)) { \newrelic_add_custom_parameter($key, $value); } else { \newrelic_add_custom_parameter($key, Utils::jsonEncode($value, null, \true)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new NormalizerFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FilterHandler.php000064400000012137147600374260025556 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Simple handler wrapper that filters records based on a list of levels * * It can be configured with an exact list of levels to allow, or a min/max level. * * @author Hennadiy Verkh * @author Jordi Boggiano */ class FilterHandler extends AbstractHandler { /** * Handler or factory callable($record, $this) * * @var callable|\Monolog\Handler\HandlerInterface */ protected $handler; /** * Minimum level for logs that are passed to handler * * @var int[] */ protected $acceptedLevels; /** * Whether the messages that are handled can bubble up the stack or not * * @var bool */ protected $bubble; /** * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $filterHandler). * @param int|array $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided * @param int $maxLevel Maximum level to accept, only used if $minLevelOrList is not an array * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = \true) { $this->handler = $handler; $this->bubble = $bubble; $this->setAcceptedLevels($minLevelOrList, $maxLevel); if (!$this->handler instanceof HandlerInterface && !\is_callable($this->handler)) { throw new \RuntimeException("The given handler (" . \json_encode($this->handler) . ") is not a callable nor a Monolog\\Handler\\HandlerInterface object"); } } /** * @return array */ public function getAcceptedLevels() { return \array_flip($this->acceptedLevels); } /** * @param int|string|array $minLevelOrList A list of levels to accept or a minimum level or level name if maxLevel is provided * @param int|string $maxLevel Maximum level or level name to accept, only used if $minLevelOrList is not an array */ public function setAcceptedLevels($minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY) { if (\is_array($minLevelOrList)) { $acceptedLevels = \array_map('VendorDuplicator\\Monolog\\Logger::toMonologLevel', $minLevelOrList); } else { $minLevelOrList = Logger::toMonologLevel($minLevelOrList); $maxLevel = Logger::toMonologLevel($maxLevel); $acceptedLevels = \array_values(\array_filter(Logger::getLevels(), function ($level) use($minLevelOrList, $maxLevel) { return $level >= $minLevelOrList && $level <= $maxLevel; })); } $this->acceptedLevels = \array_flip($acceptedLevels); } /** * {@inheritdoc} */ public function isHandling(array $record) { return isset($this->acceptedLevels[$record['level']]); } /** * {@inheritdoc} */ public function handle(array $record) { if (!$this->isHandling($record)) { return \false; } if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } $this->getHandler($record)->handle($record); return \false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { $filtered = array(); foreach ($records as $record) { if ($this->isHandling($record)) { $filtered[] = $record; } } if (\count($filtered) > 0) { $this->getHandler($filtered[\count($filtered) - 1])->handleBatch($filtered); } } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @return HandlerInterface */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = \call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->getHandler()->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->getHandler()->getFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php000064400000012631147600374260027114 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Simple handler wrapper that deduplicates log records across multiple requests * * It also includes the BufferHandler functionality and will buffer * all messages until the end of the request or flush() is called. * * This works by storing all log records' messages above $deduplicationLevel * to the file specified by $deduplicationStore. When further logs come in at the end of the * request (or when flush() is called), all those above $deduplicationLevel are checked * against the existing stored logs. If they match and the timestamps in the stored log is * not older than $time seconds, the new log record is discarded. If no log record is new, the * whole data set is discarded. * * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers * that send messages to people, to avoid spamming with the same message over and over in case of * a major component failure like a database server being down which makes all requests fail in the * same way. * * @author Jordi Boggiano */ class DeduplicationHandler extends BufferHandler { /** * @var string */ protected $deduplicationStore; /** * @var int */ protected $deduplicationLevel; /** * @var int */ protected $time; /** * @var bool */ private $gc = \false; /** * @param HandlerInterface $handler Handler. * @param string $deduplicationStore The file/path where the deduplication log should be kept * @param int $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes * @param int $time The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = \true) { parent::__construct($handler, 0, Logger::DEBUG, $bubble, \false); $this->deduplicationStore = $deduplicationStore === null ? \sys_get_temp_dir() . '/monolog-dedup-' . \substr(\md5(__FILE__), 0, 20) . '.log' : $deduplicationStore; $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel); $this->time = $time; } public function flush() { if ($this->bufferSize === 0) { return; } $passthru = null; foreach ($this->buffer as $record) { if ($record['level'] >= $this->deduplicationLevel) { $passthru = $passthru || !$this->isDuplicate($record); if ($passthru) { $this->appendRecord($record); } } } // default of null is valid as well as if no record matches duplicationLevel we just pass through if ($passthru === \true || $passthru === null) { $this->handler->handleBatch($this->buffer); } $this->clear(); if ($this->gc) { $this->collectLogs(); } } private function isDuplicate(array $record) { if (!\file_exists($this->deduplicationStore)) { return \false; } $store = \file($this->deduplicationStore, \FILE_IGNORE_NEW_LINES | \FILE_SKIP_EMPTY_LINES); if (!\is_array($store)) { return \false; } $yesterday = \time() - 86400; $timestampValidity = $record['datetime']->getTimestamp() - $this->time; $expectedMessage = \preg_replace('{[\\r\\n].*}', '', $record['message']); for ($i = \count($store) - 1; $i >= 0; $i--) { list($timestamp, $level, $message) = \explode(':', $store[$i], 3); if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) { return \true; } if ($timestamp < $yesterday) { $this->gc = \true; } } return \false; } private function collectLogs() { if (!\file_exists($this->deduplicationStore)) { return \false; } $handle = \fopen($this->deduplicationStore, 'rw+'); \flock($handle, \LOCK_EX); $validLogs = array(); $timestampValidity = \time() - $this->time; while (!\feof($handle)) { $log = \fgets($handle); if (\substr($log, 0, 10) >= $timestampValidity) { $validLogs[] = $log; } } \ftruncate($handle, 0); \rewind($handle); foreach ($validLogs as $log) { \fwrite($handle, $log); } \flock($handle, \LOCK_UN); \fclose($handle); $this->gc = \false; } private function appendRecord(array $record) { \file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . \preg_replace('{[\\r\\n].*}', '', $record['message']) . "\n", \FILE_APPEND); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/PushoverHandler.php000064400000014454147600374260026150 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Sends notifications through the pushover api to mobile phones * * @author Sebastian Göttschkes * @see https://www.pushover.net/api */ class PushoverHandler extends SocketHandler { private $token; private $users; private $title; private $user; private $retry; private $expire; private $highPriorityLevel; private $emergencyLevel; private $useFormattedMessage = \false; /** * All parameters that can be sent to Pushover * @see https://pushover.net/api * @var array */ private $parameterNames = array('token' => \true, 'user' => \true, 'message' => \true, 'device' => \true, 'title' => \true, 'url' => \true, 'url_title' => \true, 'priority' => \true, 'timestamp' => \true, 'sound' => \true, 'retry' => \true, 'expire' => \true, 'callback' => \true); /** * Sounds the api supports by default * @see https://pushover.net/api#sounds * @var array */ private $sounds = array('pushover', 'bike', 'bugle', 'cashregister', 'classical', 'cosmic', 'falling', 'gamelan', 'incoming', 'intermission', 'magic', 'mechanical', 'pianobar', 'siren', 'spacealarm', 'tugboat', 'alien', 'climb', 'persistent', 'echo', 'updown', 'none'); /** * @param string $token Pushover api token * @param string|array $users Pushover user id or array of ids the message will be sent to * @param string $title Title sent to the Pushover API * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $useSSL Whether to connect via SSL. Required when pushing messages to users that are not * the pushover.net app owner. OpenSSL is required for this option. * @param int $highPriorityLevel The minimum logging level at which this handler will start * sending "high priority" requests to the Pushover API * @param int $emergencyLevel The minimum logging level at which this handler will start * sending "emergency" requests to the Pushover API * @param int $retry The retry parameter specifies how often (in seconds) the Pushover servers will send the same notification to the user. * @param int $expire The expire parameter specifies how many seconds your notification will continue to be retried for (every retry seconds). */ public function __construct($token, $users, $title = null, $level = Logger::CRITICAL, $bubble = \true, $useSSL = \true, $highPriorityLevel = Logger::CRITICAL, $emergencyLevel = Logger::EMERGENCY, $retry = 30, $expire = 25200) { $connectionString = $useSSL ? 'ssl://api.pushover.net:443' : 'api.pushover.net:80'; parent::__construct($connectionString, $level, $bubble); $this->token = $token; $this->users = (array) $users; $this->title = $title ?: \gethostname(); $this->highPriorityLevel = Logger::toMonologLevel($highPriorityLevel); $this->emergencyLevel = Logger::toMonologLevel($emergencyLevel); $this->retry = $retry; $this->expire = $expire; } protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } private function buildContent($record) { // Pushover has a limit of 512 characters on title and message combined. $maxMessageLength = 512 - \strlen($this->title); $message = $this->useFormattedMessage ? $record['formatted'] : $record['message']; $message = \substr($message, 0, $maxMessageLength); $timestamp = $record['datetime']->getTimestamp(); $dataArray = array('token' => $this->token, 'user' => $this->user, 'message' => $message, 'title' => $this->title, 'timestamp' => $timestamp); if (isset($record['level']) && $record['level'] >= $this->emergencyLevel) { $dataArray['priority'] = 2; $dataArray['retry'] = $this->retry; $dataArray['expire'] = $this->expire; } elseif (isset($record['level']) && $record['level'] >= $this->highPriorityLevel) { $dataArray['priority'] = 1; } // First determine the available parameters $context = \array_intersect_key($record['context'], $this->parameterNames); $extra = \array_intersect_key($record['extra'], $this->parameterNames); // Least important info should be merged with subsequent info $dataArray = \array_merge($extra, $context, $dataArray); // Only pass sounds that are supported by the API if (isset($dataArray['sound']) && !\in_array($dataArray['sound'], $this->sounds)) { unset($dataArray['sound']); } return \http_build_query($dataArray); } private function buildHeader($content) { $header = "POST /1/messages.json HTTP/1.1\r\n"; $header .= "Host: api.pushover.net\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . \strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } protected function write(array $record) { foreach ($this->users as $user) { $this->user = $user; parent::write($record); $this->closeSocket(); } $this->user = null; } public function setHighPriorityLevel($value) { $this->highPriorityLevel = $value; } public function setEmergencyLevel($value) { $this->emergencyLevel = $value; } /** * Use the formatted message? * @param bool $value */ public function useFormattedMessage($value) { $this->useFormattedMessage = (bool) $value; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/TestHandler.php000064400000012442147600374260025247 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; /** * Used for testing purposes. * * It records all records and gives you access to them for verification. * * @author Jordi Boggiano * * @method bool hasEmergency($record) * @method bool hasAlert($record) * @method bool hasCritical($record) * @method bool hasError($record) * @method bool hasWarning($record) * @method bool hasNotice($record) * @method bool hasInfo($record) * @method bool hasDebug($record) * * @method bool hasEmergencyRecords() * @method bool hasAlertRecords() * @method bool hasCriticalRecords() * @method bool hasErrorRecords() * @method bool hasWarningRecords() * @method bool hasNoticeRecords() * @method bool hasInfoRecords() * @method bool hasDebugRecords() * * @method bool hasEmergencyThatContains($message) * @method bool hasAlertThatContains($message) * @method bool hasCriticalThatContains($message) * @method bool hasErrorThatContains($message) * @method bool hasWarningThatContains($message) * @method bool hasNoticeThatContains($message) * @method bool hasInfoThatContains($message) * @method bool hasDebugThatContains($message) * * @method bool hasEmergencyThatMatches($message) * @method bool hasAlertThatMatches($message) * @method bool hasCriticalThatMatches($message) * @method bool hasErrorThatMatches($message) * @method bool hasWarningThatMatches($message) * @method bool hasNoticeThatMatches($message) * @method bool hasInfoThatMatches($message) * @method bool hasDebugThatMatches($message) * * @method bool hasEmergencyThatPasses($message) * @method bool hasAlertThatPasses($message) * @method bool hasCriticalThatPasses($message) * @method bool hasErrorThatPasses($message) * @method bool hasWarningThatPasses($message) * @method bool hasNoticeThatPasses($message) * @method bool hasInfoThatPasses($message) * @method bool hasDebugThatPasses($message) */ class TestHandler extends AbstractProcessingHandler { protected $records = array(); protected $recordsByLevel = array(); private $skipReset = \false; public function getRecords() { return $this->records; } public function clear() { $this->records = array(); $this->recordsByLevel = array(); } public function reset() { if (!$this->skipReset) { $this->clear(); } } public function setSkipReset($skipReset) { $this->skipReset = $skipReset; } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } /** * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records * @param int $level Logger::LEVEL constant value */ public function hasRecord($record, $level) { if (\is_string($record)) { $record = array('message' => $record); } return $this->hasRecordThatPasses(function ($rec) use($record) { if ($rec['message'] !== $record['message']) { return \false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return \false; } return \true; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use($message) { return \strpos($rec['message'], $message) !== \false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use($regex) { return \preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses($predicate, $level) { if (!\is_callable($predicate)) { throw new \InvalidArgumentException("Expected a callable for hasRecordThatSucceeds"); } if (!isset($this->recordsByLevel[$level])) { return \false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (\call_user_func($predicate, $rec, $i)) { return \true; } } return \false; } /** * {@inheritdoc} */ protected function write(array $record) { $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function __call($method, $args) { if (\preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = \constant('VendorDuplicator\\Monolog\\Logger::' . \strtoupper($matches[2])); if (\method_exists($this, $genericMethod)) { $args[] = $level; return \call_user_func_array(array($this, $genericMethod), $args); } } throw new \BadMethodCallException('Call to undefined method ' . \get_class($this) . '::' . $method . '()'); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php000064400000006076147600374260026267 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Handler\SyslogUdp\UdpSocket; /** * A Handler for logging to a remote syslogd server. * * @author Jesper Skovgaard Nielsen * @author Dominik Kukacka */ class SyslogUdpHandler extends AbstractSyslogHandler { const RFC3164 = 0; const RFC5424 = 1; private $dateFormats = array(self::RFC3164 => 'M d H:i:s', self::RFC5424 => \DateTime::RFC3339); protected $socket; protected $ident; protected $rfc; /** * @param string $host * @param int $port * @param mixed $facility * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param string $ident Program name or tag for each log message. * @param int $rfc RFC to format the message for. */ public function __construct($host, $port = 514, $facility = \LOG_USER, $level = Logger::DEBUG, $bubble = \true, $ident = 'php', $rfc = self::RFC5424) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->rfc = $rfc; $this->socket = new UdpSocket($host, $port ?: 514); } protected function write(array $record) { $lines = $this->splitMessageIntoLines($record['formatted']); $header = $this->makeCommonSyslogHeader($this->logLevels[$record['level']]); foreach ($lines as $line) { $this->socket->write($line, $header); } } public function close() { $this->socket->close(); } private function splitMessageIntoLines($message) { if (\is_array($message)) { $message = \implode("\n", $message); } return \preg_split('/$\\R?^/m', $message, -1, \PREG_SPLIT_NO_EMPTY); } /** * Make common syslog header (see rfc5424 or rfc3164) */ protected function makeCommonSyslogHeader($severity) { $priority = $severity + $this->facility; if (!($pid = \getmypid())) { $pid = '-'; } if (!($hostname = \gethostname())) { $hostname = '-'; } $date = $this->getDateTime(); if ($this->rfc === self::RFC3164) { return "<{$priority}>" . $date . " " . $hostname . " " . $this->ident . "[" . $pid . "]: "; } else { return "<{$priority}>1 " . $date . " " . $hostname . " " . $this->ident . " " . $pid . " - - "; } } protected function getDateTime() { return \date($this->dateFormats[$this->rfc]); } /** * Inject your own socket, mainly used for testing */ public function setSocket($socket) { $this->socket = $socket; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SyslogHandler.php000064400000003535147600374260025613 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Logs to syslog service. * * usage example: * * $log = new Logger('application'); * $syslog = new SyslogHandler('myfacility', 'local6'); * $formatter = new LineFormatter("%channel%.%level_name%: %message% %extra%"); * $syslog->setFormatter($formatter); * $log->pushHandler($syslog); * * @author Sven Paulus */ class SyslogHandler extends AbstractSyslogHandler { protected $ident; protected $logopts; /** * @param string $ident * @param mixed $facility * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int $logopts Option flags for the openlog() call, defaults to LOG_PID */ public function __construct($ident, $facility = \LOG_USER, $level = Logger::DEBUG, $bubble = \true, $logopts = \LOG_PID) { parent::__construct($facility, $level, $bubble); $this->ident = $ident; $this->logopts = $logopts; } /** * {@inheritdoc} */ public function close() { \closelog(); } /** * {@inheritdoc} */ protected function write(array $record) { if (!\openlog($this->ident, $this->logopts, $this->facility)) { throw new \LogicException('Can\'t open syslog for ident "' . $this->ident . '" and facility "' . $this->facility . '"'); } \syslog($this->logLevels[$record['level']], (string) $record['formatted']); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FlowdockHandler.php000064400000006604147600374260026103 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\Monolog\Formatter\FlowdockFormatter; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Sends notifications through the Flowdock push API * * This must be configured with a FlowdockFormatter instance via setFormatter() * * Notes: * API token - Flowdock API token * * @author Dominik Liebler * @see https://www.flowdock.com/api/push */ class FlowdockHandler extends SocketHandler { /** * @var string */ protected $apiToken; /** * @param string $apiToken * @param bool|int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * * @throws MissingExtensionException if OpenSSL is missing */ public function __construct($apiToken, $level = Logger::DEBUG, $bubble = \true) { if (!\extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FlowdockHandler'); } parent::__construct('ssl://api.flowdock.com:443', $level, $bubble); $this->apiToken = $apiToken; } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { if (!$formatter instanceof FlowdockFormatter) { throw new \InvalidArgumentException('The FlowdockHandler requires an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly'); } return parent::setFormatter($formatter); } /** * Gets the default formatter. * * @return FormatterInterface */ protected function getDefaultFormatter() { throw new \InvalidArgumentException('The FlowdockHandler must be configured (via setFormatter) with an instance of Monolog\\Formatter\\FlowdockFormatter to function correctly'); } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->closeSocket(); } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { return Utils::jsonEncode($record['formatted']['flowdock']); } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST /v1/messages/team_inbox/" . $this->apiToken . " HTTP/1.1\r\n"; $header .= "Host: api.flowdock.com\r\n"; $header .= "Content-Type: application/json\r\n"; $header .= "Content-Length: " . \strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/BufferHandler.php000064400000007767147600374260025557 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\ResettableInterface; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Buffers all records until closing the handler and then pass them as batch. * * This is useful for a MailHandler to send only one mail per request instead of * sending one per log message. * * @author Christophe Coevoet */ class BufferHandler extends AbstractHandler { protected $handler; protected $bufferSize = 0; protected $bufferLimit; protected $flushOnOverflow; protected $buffer = array(); protected $initialized = \false; /** * @param HandlerInterface $handler Handler. * @param int $bufferLimit How many entries should be buffered at most, beyond that the oldest items are removed from the buffer. * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded */ public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = \true, $flushOnOverflow = \false) { parent::__construct($level, $bubble); $this->handler = $handler; $this->bufferLimit = (int) $bufferLimit; $this->flushOnOverflow = $flushOnOverflow; } /** * {@inheritdoc} */ public function handle(array $record) { if ($record['level'] < $this->level) { return \false; } if (!$this->initialized) { // __destructor() doesn't get called on Fatal errors \register_shutdown_function(array($this, 'close')); $this->initialized = \true; } if ($this->bufferLimit > 0 && $this->bufferSize === $this->bufferLimit) { if ($this->flushOnOverflow) { $this->flush(); } else { \array_shift($this->buffer); $this->bufferSize--; } } if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } $this->buffer[] = $record; $this->bufferSize++; return \false === $this->bubble; } public function flush() { if ($this->bufferSize === 0) { return; } $this->handler->handleBatch($this->buffer); $this->clear(); } public function __destruct() { // suppress the parent behavior since we already have register_shutdown_function() // to call close(), and the reference contained there will prevent this from being // GC'd until the end of the request } /** * {@inheritdoc} */ public function close() { $this->flush(); } /** * Clears the buffer without flushing any messages down to the wrapped handler. */ public function clear() { $this->bufferSize = 0; $this->buffer = array(); } public function reset() { $this->flush(); parent::reset(); if ($this->handler instanceof ResettableInterface) { $this->handler->reset(); } } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->handler->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->handler->getFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/PsrHandler.php000064400000002711147600374260025072 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Psr\Log\LoggerInterface; /** * Proxies log messages to an existing PSR-3 compliant logger. * * @author Michael Moussa */ class PsrHandler extends AbstractHandler { /** * PSR-3 compliant logger * * @var LoggerInterface */ protected $logger; /** * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); $this->logger = $logger; } /** * {@inheritDoc} */ public function handle(array $record) { if (!$this->isHandling($record)) { return \false; } $this->logger->log(\strtolower($record['level_name']), $record['message'], $record['context']); return \false === $this->bubble; } } gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ProcessableHandlerInterface.php000064400000002033147600374260030327 0ustar00addons * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Processor\ProcessorInterface; /** * Interface to describe loggers that have processors * * This interface is present in monolog 1.x to ease forward compatibility. * * @author Jordi Boggiano */ interface ProcessableHandlerInterface { /** * Adds a processor in the stack. * * @param ProcessorInterface|callable $callback * @return HandlerInterface self */ public function pushProcessor($callback) : HandlerInterface; /** * Removes the processor on top of the stack and returns it. * * @throws \LogicException In case the processor stack is empty * @return callable */ public function popProcessor() : callable; } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractHandler.php000064400000010556147600374260026077 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\ResettableInterface; /** * Base Handler class providing the Handler structure * * @author Jordi Boggiano */ abstract class AbstractHandler implements HandlerInterface, ResettableInterface { protected $level = Logger::DEBUG; protected $bubble = \true; /** * @var FormatterInterface */ protected $formatter; protected $processors = array(); /** * @param int|string $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($level = Logger::DEBUG, $bubble = \true) { $this->setLevel($level); $this->bubble = $bubble; } /** * {@inheritdoc} */ public function isHandling(array $record) { return $record['level'] >= $this->level; } /** * {@inheritdoc} */ public function handleBatch(array $records) { foreach ($records as $record) { $this->handle($record); } } /** * Closes the handler. * * This will be called automatically when the object is destroyed */ public function close() { } /** * {@inheritdoc} */ public function pushProcessor($callback) { if (!\is_callable($callback)) { throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), ' . \var_export($callback, \true) . ' given'); } \array_unshift($this->processors, $callback); return $this; } /** * {@inheritdoc} */ public function popProcessor() { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return \array_shift($this->processors); } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->formatter = $formatter; return $this; } /** * {@inheritdoc} */ public function getFormatter() { if (!$this->formatter) { $this->formatter = $this->getDefaultFormatter(); } return $this->formatter; } /** * Sets minimum logging level at which this handler will be triggered. * * @param int|string $level Level or level name * @return self */ public function setLevel($level) { $this->level = Logger::toMonologLevel($level); return $this; } /** * Gets minimum logging level at which this handler will be triggered. * * @return int */ public function getLevel() { return $this->level; } /** * Sets the bubbling behavior. * * @param bool $bubble true means that this handler allows bubbling. * false means that bubbling is not permitted. * @return self */ public function setBubble($bubble) { $this->bubble = $bubble; return $this; } /** * Gets the bubbling behavior. * * @return bool true means that this handler allows bubbling. * false means that bubbling is not permitted. */ public function getBubble() { return $this->bubble; } public function __destruct() { try { $this->close(); } catch (\Exception $e) { // do nothing } catch (\Throwable $e) { // do nothing } } public function reset() { foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } /** * Gets the default formatter. * * @return FormatterInterface */ protected function getDefaultFormatter() { return new LineFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php000064400000003500147600374260027553 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; /** * Forwards records to multiple handlers suppressing failures of each handler * and continuing through to give every handler a chance to succeed. * * @author Craig D'Amelio */ class WhatFailureGroupHandler extends GroupHandler { /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } foreach ($this->handlers as $handler) { try { $handler->handle($record); } catch (\Exception $e) { // What failure? } catch (\Throwable $e) { // What failure? } } return \false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { if ($this->processors) { $processed = array(); foreach ($records as $record) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } $processed[] = $record; } $records = $processed; } foreach ($this->handlers as $handler) { try { $handler->handleBatch($records); } catch (\Exception $e) { // What failure? } catch (\Throwable $e) { // What failure? } } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/MandrillHandler.php000064400000004461147600374260026074 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * MandrillHandler uses cURL to send the emails to the Mandrill API * * @author Adam Nicholson */ class MandrillHandler extends MailHandler { protected $message; protected $apiKey; /** * @param string $apiKey A valid Mandrill API key * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = \true) { parent::__construct($level, $bubble); if (!$message instanceof \VendorDuplicator\Swift_Message && \is_callable($message)) { $message = \call_user_func($message); } if (!$message instanceof \VendorDuplicator\Swift_Message) { throw new \InvalidArgumentException('You must provide either a Swift_Message instance or a callable returning it'); } $this->message = $message; $this->apiKey = $apiKey; } /** * {@inheritdoc} */ protected function send($content, array $records) { $message = clone $this->message; $message->setBody($content); if (\version_compare(\VendorDuplicator\Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { $message->setDate(\time()); } $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_URL, 'https://mandrillapp.com/api/1.0/messages/send-raw.json'); \curl_setopt($ch, \CURLOPT_POST, 1); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, 1); \curl_setopt($ch, \CURLOPT_POSTFIELDS, \http_build_query(array('key' => $this->apiKey, 'raw_message' => (string) $message, 'async' => \false))); Curl\Util::execute($ch); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ProcessableHandlerTrait.php000064400000003137147600374260027577 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\ResettableInterface; /** * Helper trait for implementing ProcessableInterface * * This trait is present in monolog 1.x to ease forward compatibility. * * @author Jordi Boggiano */ trait ProcessableHandlerTrait { /** * @var callable[] */ protected $processors = []; /** * {@inheritdoc} * @suppress PhanTypeMismatchReturn */ public function pushProcessor($callback) : HandlerInterface { \array_unshift($this->processors, $callback); return $this; } /** * {@inheritdoc} */ public function popProcessor() : callable { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return \array_shift($this->processors); } /** * Processes a record. */ protected function processRecord(array $record) : array { foreach ($this->processors as $processor) { $record = $processor($record); } return $record; } protected function resetProcessors() : void { foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/HandlerInterface.php000064400000005071147600374260026230 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Interface that all Monolog Handlers must implement * * @author Jordi Boggiano */ interface HandlerInterface { /** * Checks whether the given record will be handled by this handler. * * This is mostly done for performance reasons, to avoid calling processors for nothing. * * Handlers should still check the record levels within handle(), returning false in isHandling() * is no guarantee that handle() will not be called, and isHandling() might not be called * for a given record. * * @param array $record Partial log record containing only a level key * * @return bool */ public function isHandling(array $record); /** * Handles a record. * * All records may be passed to this method, and the handler should discard * those that it does not want to handle. * * The return value of this function controls the bubbling process of the handler stack. * Unless the bubbling is interrupted (by returning true), the Logger class will keep on * calling further handlers in the stack with a given log record. * * @param array $record The record to handle * @return bool true means that this handler handled the record, and that bubbling is not permitted. * false means the record was either not processed or that this handler allows bubbling. */ public function handle(array $record); /** * Handles a set of records at once. * * @param array $records The records to handle (an array of record arrays) */ public function handleBatch(array $records); /** * Adds a processor in the stack. * * @param callable $callback * @return self */ public function pushProcessor($callback); /** * Removes the processor on top of the stack and returns it. * * @return callable */ public function popProcessor(); /** * Sets the formatter. * * @param FormatterInterface $formatter * @return self */ public function setFormatter(FormatterInterface $formatter); /** * Gets the formatter. * * @return FormatterInterface */ public function getFormatter(); } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/GelfHandler.php000064400000004055147600374260025206 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Gelf\IMessagePublisher; use VendorDuplicator\Gelf\PublisherInterface; use VendorDuplicator\Gelf\Publisher; use InvalidArgumentException; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\GelfMessageFormatter; /** * Handler to send messages to a Graylog2 (http://www.graylog2.org) server * * @author Matt Lehner * @author Benjamin Zikarsky */ class GelfHandler extends AbstractProcessingHandler { /** * @var Publisher|PublisherInterface|IMessagePublisher the publisher object that sends the message to the server */ protected $publisher; /** * @param PublisherInterface|IMessagePublisher|Publisher $publisher a publisher object * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($publisher, $level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); if (!$publisher instanceof Publisher && !$publisher instanceof IMessagePublisher && !$publisher instanceof PublisherInterface) { throw new InvalidArgumentException('Invalid publisher, expected a Gelf\\Publisher, Gelf\\IMessagePublisher or Gelf\\PublisherInterface instance'); } $this->publisher = $publisher; } /** * {@inheritdoc} */ protected function write(array $record) { $this->publisher->publish($record['formatted']); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new GelfMessageFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/DynamoDbHandler.php000064400000005006147600374260026023 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Aws\Sdk; use VendorDuplicator\Aws\DynamoDb\DynamoDbClient; use VendorDuplicator\Aws\DynamoDb\Marshaler; use VendorDuplicator\Monolog\Formatter\ScalarFormatter; use VendorDuplicator\Monolog\Logger; /** * Amazon DynamoDB handler (http://aws.amazon.com/dynamodb/) * * @link https://github.com/aws/aws-sdk-php/ * @author Andrew Lawson */ class DynamoDbHandler extends AbstractProcessingHandler { const DATE_FORMAT = 'Y-m-d\\TH:i:s.uO'; /** * @var DynamoDbClient */ protected $client; /** * @var string */ protected $table; /** * @var int */ protected $version; /** * @var Marshaler */ protected $marshaler; /** * @param DynamoDbClient $client * @param string $table * @param int $level * @param bool $bubble */ public function __construct(DynamoDbClient $client, $table, $level = Logger::DEBUG, $bubble = \true) { if (\defined('VendorDuplicator\\Aws\\Sdk::VERSION') && \version_compare(Sdk::VERSION, '3.0', '>=')) { $this->version = 3; $this->marshaler = new Marshaler(); } else { $this->version = 2; } $this->client = $client; $this->table = $table; parent::__construct($level, $bubble); } /** * {@inheritdoc} */ protected function write(array $record) { $filtered = $this->filterEmptyFields($record['formatted']); if ($this->version === 3) { $formatted = $this->marshaler->marshalItem($filtered); } else { /** @phpstan-ignore-next-line */ $formatted = $this->client->formatAttributes($filtered); } $this->client->putItem(array('TableName' => $this->table, 'Item' => $formatted)); } /** * @param array $record * @return array */ protected function filterEmptyFields(array $record) { return \array_filter($record, function ($value) { return !empty($value) || \false === $value || 0 === $value; }); } /** * {@inheritdoc} */ protected function getDefaultFormatter() { return new ScalarFormatter(self::DATE_FORMAT); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php000064400000006757147600374260026572 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Swift; /** * SwiftMailerHandler uses Swift_Mailer to send the emails * * @author Gyula Sallai */ class SwiftMailerHandler extends MailHandler { protected $mailer; private $messageTemplate; /** * @param \Swift_Mailer $mailer The mailer to use * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(\VendorDuplicator\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = \true) { parent::__construct($level, $bubble); $this->mailer = $mailer; $this->messageTemplate = $message; } /** * {@inheritdoc} */ protected function send($content, array $records) { $this->mailer->send($this->buildMessage($content, $records)); } /** * Gets the formatter for the Swift_Message subject. * * @param string $format The format of the subject * @return FormatterInterface */ protected function getSubjectFormatter($format) { return new LineFormatter($format); } /** * Creates instance of Swift_Message to be sent * * @param string $content formatted email body to be sent * @param array $records Log records that formed the content * @return \Swift_Message */ protected function buildMessage($content, array $records) { $message = null; if ($this->messageTemplate instanceof \VendorDuplicator\Swift_Message) { $message = clone $this->messageTemplate; $message->generateId(); } elseif (\is_callable($this->messageTemplate)) { $message = \call_user_func($this->messageTemplate, $content, $records); } if (!$message instanceof \VendorDuplicator\Swift_Message) { throw new \InvalidArgumentException('Could not resolve message as instance of Swift_Message or a callable returning it'); } if ($records) { $subjectFormatter = $this->getSubjectFormatter($message->getSubject()); $message->setSubject($subjectFormatter->format($this->getHighestRecord($records))); } $message->setBody($content); if (\version_compare(Swift::VERSION, '6.0.0', '>=')) { $message->setDate(new \DateTimeImmutable()); } else { $message->setDate(\time()); } return $message; } /** * BC getter, to be removed in 2.0 */ public function __get($name) { if ($name === 'message') { \trigger_error('SwiftMailerHandler->message is deprecated, use ->buildMessage() instead to retrieve the message', \E_USER_DEPRECATED); return $this->buildMessage(null, array()); } throw new \InvalidArgumentException('Invalid property ' . $name); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/LogglyHandler.php000064400000005157147600374260025572 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\LogglyFormatter; /** * Sends errors to Loggly. * * @author Przemek Sobstel * @author Adam Pancutt * @author Gregory Barchard */ class LogglyHandler extends AbstractProcessingHandler { const HOST = 'logs-01.loggly.com'; const ENDPOINT_SINGLE = 'inputs'; const ENDPOINT_BATCH = 'bulk'; protected $token; protected $tag = array(); public function __construct($token, $level = Logger::DEBUG, $bubble = \true) { if (!\extension_loaded('curl')) { throw new \LogicException('The curl extension is needed to use the LogglyHandler'); } $this->token = $token; parent::__construct($level, $bubble); } public function setTag($tag) { $tag = !empty($tag) ? $tag : array(); $this->tag = \is_array($tag) ? $tag : array($tag); } public function addTag($tag) { if (!empty($tag)) { $tag = \is_array($tag) ? $tag : array($tag); $this->tag = \array_unique(\array_merge($this->tag, $tag)); } } protected function write(array $record) { $this->send($record["formatted"], self::ENDPOINT_SINGLE); } public function handleBatch(array $records) { $level = $this->level; $records = \array_filter($records, function ($record) use($level) { return $record['level'] >= $level; }); if ($records) { $this->send($this->getFormatter()->formatBatch($records), self::ENDPOINT_BATCH); } } protected function send($data, $endpoint) { $url = \sprintf("https://%s/%s/%s/", self::HOST, $endpoint, $this->token); $headers = array('Content-Type: application/json'); if (!empty($this->tag)) { $headers[] = 'X-LOGGLY-TAG: ' . \implode(',', $this->tag); } $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_URL, $url); \curl_setopt($ch, \CURLOPT_POST, \true); \curl_setopt($ch, \CURLOPT_POSTFIELDS, $data); \curl_setopt($ch, \CURLOPT_HTTPHEADER, $headers); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, \true); Curl\Util::execute($ch); } protected function getDefaultFormatter() { return new LogglyFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/CubeHandler.php000064400000011071147600374260025203 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * Logs to Cube. * * @link http://square.github.com/cube/ * @author Wan Chen */ class CubeHandler extends AbstractProcessingHandler { private $udpConnection; private $httpConnection; private $scheme; private $host; private $port; private $acceptedSchemes = array('http', 'udp'); /** * Create a Cube handler * * @throws \UnexpectedValueException when given url is not a valid url. * A valid url must consist of three parts : protocol://host:port * Only valid protocols used by Cube are http and udp */ public function __construct($url, $level = Logger::DEBUG, $bubble = \true) { $urlInfo = \parse_url($url); if (!isset($urlInfo['scheme'], $urlInfo['host'], $urlInfo['port'])) { throw new \UnexpectedValueException('URL "' . $url . '" is not valid'); } if (!\in_array($urlInfo['scheme'], $this->acceptedSchemes)) { throw new \UnexpectedValueException('Invalid protocol (' . $urlInfo['scheme'] . ').' . ' Valid options are ' . \implode(', ', $this->acceptedSchemes)); } $this->scheme = $urlInfo['scheme']; $this->host = $urlInfo['host']; $this->port = $urlInfo['port']; parent::__construct($level, $bubble); } /** * Establish a connection to an UDP socket * * @throws \LogicException when unable to connect to the socket * @throws MissingExtensionException when there is no socket extension */ protected function connectUdp() { if (!\extension_loaded('sockets')) { throw new MissingExtensionException('The sockets extension is required to use udp URLs with the CubeHandler'); } $this->udpConnection = \socket_create(\AF_INET, \SOCK_DGRAM, 0); if (!$this->udpConnection) { throw new \LogicException('Unable to create a socket'); } if (!\socket_connect($this->udpConnection, $this->host, $this->port)) { throw new \LogicException('Unable to connect to the socket at ' . $this->host . ':' . $this->port); } } /** * Establish a connection to a http server * @throws \LogicException when no curl extension */ protected function connectHttp() { if (!\extension_loaded('curl')) { throw new \LogicException('The curl extension is needed to use http URLs with the CubeHandler'); } $this->httpConnection = \curl_init('http://' . $this->host . ':' . $this->port . '/1.0/event/put'); if (!$this->httpConnection) { throw new \LogicException('Unable to connect to ' . $this->host . ':' . $this->port); } \curl_setopt($this->httpConnection, \CURLOPT_CUSTOMREQUEST, "POST"); \curl_setopt($this->httpConnection, \CURLOPT_RETURNTRANSFER, \true); } /** * {@inheritdoc} */ protected function write(array $record) { $date = $record['datetime']; $data = array('time' => $date->format('Y-m-d\\TH:i:s.uO')); unset($record['datetime']); if (isset($record['context']['type'])) { $data['type'] = $record['context']['type']; unset($record['context']['type']); } else { $data['type'] = $record['channel']; } $data['data'] = $record['context']; $data['data']['level'] = $record['level']; if ($this->scheme === 'http') { $this->writeHttp(Utils::jsonEncode($data)); } else { $this->writeUdp(Utils::jsonEncode($data)); } } private function writeUdp($data) { if (!$this->udpConnection) { $this->connectUdp(); } \socket_send($this->udpConnection, $data, \strlen($data), 0); } private function writeHttp($data) { if (!$this->httpConnection) { $this->connectHttp(); } \curl_setopt($this->httpConnection, \CURLOPT_POSTFIELDS, '[' . $data . ']'); \curl_setopt($this->httpConnection, \CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: ' . \strlen('[' . $data . ']'))); Curl\Util::execute($this->httpConnection, 5, \false); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php000064400000007252147600374260026707 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\Monolog\Handler\Slack\SlackRecord; /** * Sends notifications through Slack Webhooks * * @author Haralan Dobrev * @see https://api.slack.com/incoming-webhooks */ class SlackWebhookHandler extends AbstractProcessingHandler { /** * Slack Webhook token * @var string */ private $webhookUrl; /** * Instance of the SlackRecord util class preparing data for Slack API. * @var SlackRecord */ private $slackRecord; /** * @param string $webhookUrl Slack Webhook URL * @param string|null $channel Slack channel (encoded ID or name) * @param string|null $username Name of a bot * @param bool $useAttachment Whether the message should be added to Slack as attachment (plain text otherwise) * @param string|null $iconEmoji The emoji name to use (or null) * @param bool $useShortAttachment Whether the the context/extra messages added to Slack as attachments are in a short style * @param bool $includeContextAndExtra Whether the attachment should include context and extra data * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param array $excludeFields Dot separated list of fields to exclude from slack message. E.g. ['context.field1', 'extra.field2'] */ public function __construct($webhookUrl, $channel = null, $username = null, $useAttachment = \true, $iconEmoji = null, $useShortAttachment = \false, $includeContextAndExtra = \false, $level = Logger::CRITICAL, $bubble = \true, array $excludeFields = array()) { parent::__construct($level, $bubble); $this->webhookUrl = $webhookUrl; $this->slackRecord = new SlackRecord($channel, $username, $useAttachment, $iconEmoji, $useShortAttachment, $includeContextAndExtra, $excludeFields, $this->formatter); } public function getSlackRecord() { return $this->slackRecord; } public function getWebhookUrl() { return $this->webhookUrl; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { $postData = $this->slackRecord->getSlackData($record); $postString = Utils::jsonEncode($postData); $ch = \curl_init(); $options = array(\CURLOPT_URL => $this->webhookUrl, \CURLOPT_POST => \true, \CURLOPT_RETURNTRANSFER => \true, \CURLOPT_HTTPHEADER => array('Content-type: application/json'), \CURLOPT_POSTFIELDS => $postString); if (\defined('CURLOPT_SAFE_UPLOAD')) { $options[\CURLOPT_SAFE_UPLOAD] = \true; } \curl_setopt_array($ch, $options); Curl\Util::execute($ch); } public function setFormatter(FormatterInterface $formatter) { parent::setFormatter($formatter); $this->slackRecord->setFormatter($formatter); return $this; } public function getFormatter() { $formatter = parent::getFormatter(); $this->slackRecord->setFormatter($formatter); return $formatter; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/MailHandler.php000064400000003140147600374260025205 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; /** * Base class for all mail handlers * * @author Gyula Sallai */ abstract class MailHandler extends AbstractProcessingHandler { /** * {@inheritdoc} */ public function handleBatch(array $records) { $messages = array(); foreach ($records as $record) { if ($record['level'] < $this->level) { continue; } $messages[] = $this->processRecord($record); } if (!empty($messages)) { $this->send((string) $this->getFormatter()->formatBatch($messages), $messages); } } /** * Send a mail with the given content * * @param string $content formatted email body to be sent * @param array $records the array of log records that formed this content */ protected abstract function send($content, array $records); /** * {@inheritdoc} */ protected function write(array $record) { $this->send((string) $record['formatted'], array($record)); } protected function getHighestRecord(array $records) { $highestRecord = null; foreach ($records as $record) { if ($highestRecord === null || $highestRecord['level'] < $record['level']) { $highestRecord = $record; } } return $highestRecord; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FleepHookHandler.php000064400000006466147600374260026215 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Logger; /** * Sends logs to Fleep.io using Webhook integrations * * You'll need a Fleep.io account to use this handler. * * @see https://fleep.io/integrations/webhooks/ Fleep Webhooks Documentation * @author Ando Roots */ class FleepHookHandler extends SocketHandler { const FLEEP_HOST = 'fleep.io'; const FLEEP_HOOK_URI = '/hook/'; /** * @var string Webhook token (specifies the conversation where logs are sent) */ protected $token; /** * Construct a new Fleep.io Handler. * * For instructions on how to create a new web hook in your conversations * see https://fleep.io/integrations/webhooks/ * * @param string $token Webhook token * @param bool|int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @throws MissingExtensionException */ public function __construct($token, $level = Logger::DEBUG, $bubble = \true) { if (!\extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP extension is required to use the FleepHookHandler'); } $this->token = $token; $connectionString = 'ssl://' . self::FLEEP_HOST . ':443'; parent::__construct($connectionString, $level, $bubble); } /** * Returns the default formatter to use with this handler * * Overloaded to remove empty context and extra arrays from the end of the log message. * * @return LineFormatter */ protected function getDefaultFormatter() { return new LineFormatter(null, null, \true, \true); } /** * Handles a log record * * @param array $record */ public function write(array $record) { parent::write($record); $this->closeSocket(); } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { $header = "POST " . self::FLEEP_HOOK_URI . $this->token . " HTTP/1.1\r\n"; $header .= "Host: " . self::FLEEP_HOST . "\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . \strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = array('message' => $record['formatted']); return \http_build_query($dataArray); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php000064400000016307147600374260027302 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\LineFormatter; /** * Handler sending logs to browser's javascript console with no browser extension required * * @author Olivier Poitrey */ class BrowserConsoleHandler extends AbstractProcessingHandler { protected static $initialized = \false; protected static $records = array(); /** * {@inheritDoc} * * Formatted output may contain some formatting markers to be transferred to `console.log` using the %c format. * * Example of formatted string: * * You can do [[blue text]]{color: blue} or [[green background]]{background-color: green; color: white} */ protected function getDefaultFormatter() { return new LineFormatter('[[%channel%]]{macro: autolabel} [[%level_name%]]{font-weight: bold} %message%'); } /** * {@inheritDoc} */ protected function write(array $record) { // Accumulate records static::$records[] = $record; // Register shutdown handler if not already done if (!static::$initialized) { static::$initialized = \true; $this->registerShutdownFunction(); } } /** * Convert records to javascript console commands and send it to the browser. * This method is automatically called on PHP shutdown if output is HTML or Javascript. */ public static function send() { $format = static::getResponseFormat(); if ($format === 'unknown') { return; } if (\count(static::$records)) { if ($format === 'html') { static::writeOutput(''); } elseif ($format === 'js') { static::writeOutput(static::generateScript()); } static::resetStatic(); } } public function close() { self::resetStatic(); } public function reset() { self::resetStatic(); } /** * Forget all logged records */ public static function resetStatic() { static::$records = array(); } /** * Wrapper for register_shutdown_function to allow overriding */ protected function registerShutdownFunction() { if (\PHP_SAPI !== 'cli') { \register_shutdown_function(array('VendorDuplicator\\Monolog\\Handler\\BrowserConsoleHandler', 'send')); } } /** * Wrapper for echo to allow overriding * * @param string $str */ protected static function writeOutput($str) { echo $str; } /** * Checks the format of the response * * If Content-Type is set to application/javascript or text/javascript -> js * If Content-Type is set to text/html, or is unset -> html * If Content-Type is anything else -> unknown * * @return string One of 'js', 'html' or 'unknown' */ protected static function getResponseFormat() { // Check content type foreach (\headers_list() as $header) { if (\stripos($header, 'content-type:') === 0) { // This handler only works with HTML and javascript outputs // text/javascript is obsolete in favour of application/javascript, but still used if (\stripos($header, 'application/javascript') !== \false || \stripos($header, 'text/javascript') !== \false) { return 'js'; } if (\stripos($header, 'text/html') === \false) { return 'unknown'; } break; } } return 'html'; } private static function generateScript() { $script = array(); foreach (static::$records as $record) { $context = static::dump('Context', $record['context']); $extra = static::dump('Extra', $record['extra']); if (empty($context) && empty($extra)) { $script[] = static::call_array('log', static::handleStyles($record['formatted'])); } else { $script = \array_merge($script, array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))), $context, $extra, array(static::call('groupEnd'))); } } return "(function (c) {if (c && c.groupCollapsed) {\n" . \implode("\n", $script) . "\n}})(console);"; } private static function handleStyles($formatted) { $args = array(); $format = '%c' . $formatted; \preg_match_all('/\\[\\[(.*?)\\]\\]\\{([^}]*)\\}/s', $format, $matches, \PREG_OFFSET_CAPTURE | \PREG_SET_ORDER); foreach (\array_reverse($matches) as $match) { $args[] = '"font-weight: normal"'; $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0])); $pos = $match[0][1]; $format = \substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . \substr($format, $pos + \strlen($match[0][0])); } $args[] = static::quote('font-weight: normal'); $args[] = static::quote($format); return \array_reverse($args); } private static function handleCustomStyles($style, $string) { static $colors = array('blue', 'green', 'red', 'magenta', 'orange', 'black', 'grey'); static $labels = array(); return \preg_replace_callback('/macro\\s*:(.*?)(?:;|$)/', function ($m) use($string, &$colors, &$labels) { if (\trim($m[1]) === 'autolabel') { // Format the string as a label with consistent auto assigned background color if (!isset($labels[$string])) { $labels[$string] = $colors[\count($labels) % \count($colors)]; } $color = $labels[$string]; return "background-color: {$color}; color: white; border-radius: 3px; padding: 0 2px 0 2px"; } return $m[1]; }, $style); } private static function dump($title, array $dict) { $script = array(); $dict = \array_filter($dict); if (empty($dict)) { return $script; } $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title)); foreach ($dict as $key => $value) { $value = \json_encode($value); if (empty($value)) { $value = static::quote(''); } $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value); } return $script; } private static function quote($arg) { return '"' . \addcslashes($arg, "\"\n\\") . '"'; } private static function call() { $args = \func_get_args(); $method = \array_shift($args); return static::call_array($method, $args); } private static function call_array($method, array $args) { return 'c.' . $method . '(' . \implode(', ', $args) . ');'; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/FormattableHandlerTrait.php000064400000002642147600374260027575 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Formatter\LineFormatter; /** * Helper trait for implementing FormattableInterface * * This trait is present in monolog 1.x to ease forward compatibility. * * @author Jordi Boggiano */ trait FormattableHandlerTrait { /** * @var FormatterInterface */ protected $formatter; /** * {@inheritdoc} * @suppress PhanTypeMismatchReturn */ public function setFormatter(FormatterInterface $formatter) : HandlerInterface { $this->formatter = $formatter; return $this; } /** * {@inheritdoc} */ public function getFormatter() : FormatterInterface { if (!$this->formatter) { $this->formatter = $this->getDefaultFormatter(); } return $this->formatter; } /** * Gets the default formatter. * * Overwrite this if the LineFormatter is not a good default for your handler. */ protected function getDefaultFormatter() : FormatterInterface { return new LineFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php000064400000004544147600374260025754 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\ResettableInterface; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * This simple wrapper class can be used to extend handlers functionality. * * Example: A custom filtering that can be applied to any handler. * * Inherit from this class and override handle() like this: * * public function handle(array $record) * { * if ($record meets certain conditions) { * return false; * } * return $this->handler->handle($record); * } * * @author Alexey Karapetov */ class HandlerWrapper implements HandlerInterface, ResettableInterface { /** * @var HandlerInterface */ protected $handler; /** * HandlerWrapper constructor. * @param HandlerInterface $handler */ public function __construct(HandlerInterface $handler) { $this->handler = $handler; } /** * {@inheritdoc} */ public function isHandling(array $record) { return $this->handler->isHandling($record); } /** * {@inheritdoc} */ public function handle(array $record) { return $this->handler->handle($record); } /** * {@inheritdoc} */ public function handleBatch(array $records) { return $this->handler->handleBatch($records); } /** * {@inheritdoc} */ public function pushProcessor($callback) { $this->handler->pushProcessor($callback); return $this; } /** * {@inheritdoc} */ public function popProcessor() { return $this->handler->popProcessor(); } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->handler->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->handler->getFormatter(); } public function reset() { if ($this->handler instanceof ResettableInterface) { return $this->handler->reset(); } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php000064400000013226147600374260026720 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; /** * Stores logs to files that are rotated every day and a limited number of files are kept. * * This rotation is only intended to be used as a workaround. Using logrotate to * handle the rotation is strongly encouraged when you can use it. * * @author Christophe Coevoet * @author Jordi Boggiano */ class RotatingFileHandler extends StreamHandler { const FILE_PER_DAY = 'Y-m-d'; const FILE_PER_MONTH = 'Y-m'; const FILE_PER_YEAR = 'Y'; protected $filename; protected $maxFiles; protected $mustRotate; protected $nextRotation; protected $filenameFormat; protected $dateFormat; /** * @param string $filename * @param int $maxFiles The maximal amount of files to keep (0 means unlimited) * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write) * @param bool $useLocking Try to lock log file before doing any writes */ public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = \true, $filePermission = null, $useLocking = \false) { $this->filename = Utils::canonicalizePath($filename); $this->maxFiles = (int) $maxFiles; $this->nextRotation = new \DateTime('tomorrow'); $this->filenameFormat = '{filename}-{date}'; $this->dateFormat = 'Y-m-d'; parent::__construct($this->getTimedFilename(), $level, $bubble, $filePermission, $useLocking); } /** * {@inheritdoc} */ public function close() { parent::close(); if (\true === $this->mustRotate) { $this->rotate(); } } /** * {@inheritdoc} */ public function reset() { parent::reset(); if (\true === $this->mustRotate) { $this->rotate(); } } public function setFilenameFormat($filenameFormat, $dateFormat) { if (!\preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) { \trigger_error('Invalid date format - format must be one of ' . 'RotatingFileHandler::FILE_PER_DAY ("Y-m-d"), RotatingFileHandler::FILE_PER_MONTH ("Y-m") ' . 'or RotatingFileHandler::FILE_PER_YEAR ("Y"), or you can set one of the ' . 'date formats using slashes, underscores and/or dots instead of dashes.', \E_USER_DEPRECATED); } if (\substr_count($filenameFormat, '{date}') === 0) { \trigger_error('Invalid filename format - format should contain at least `{date}`, because otherwise rotating is impossible.', \E_USER_DEPRECATED); } $this->filenameFormat = $filenameFormat; $this->dateFormat = $dateFormat; $this->url = $this->getTimedFilename(); $this->close(); } /** * {@inheritdoc} */ protected function write(array $record) { // on the first record written, if the log is new, we should rotate (once per day) if (null === $this->mustRotate) { $this->mustRotate = !\file_exists($this->url); } if ($this->nextRotation < $record['datetime']) { $this->mustRotate = \true; $this->close(); } parent::write($record); } /** * Rotates the files. */ protected function rotate() { // update filename $this->url = $this->getTimedFilename(); $this->nextRotation = new \DateTime('tomorrow'); // skip GC of old logs if files are unlimited if (0 === $this->maxFiles) { return; } $logFiles = \glob($this->getGlobPattern()); if ($this->maxFiles >= \count($logFiles)) { // no files to remove return; } // Sorting the files by name to remove the older ones \usort($logFiles, function ($a, $b) { return \strcmp($b, $a); }); foreach (\array_slice($logFiles, $this->maxFiles) as $file) { if (\is_writable($file)) { // suppress errors here as unlink() might fail if two processes // are cleaning up/rotating at the same time \set_error_handler(function ($errno, $errstr, $errfile, $errline) { }); \unlink($file); \restore_error_handler(); } } $this->mustRotate = \false; } protected function getTimedFilename() { $fileInfo = \pathinfo($this->filename); $timedFilename = \str_replace(array('{filename}', '{date}'), array($fileInfo['filename'], \date($this->dateFormat)), $fileInfo['dirname'] . '/' . $this->filenameFormat); if (!empty($fileInfo['extension'])) { $timedFilename .= '.' . $fileInfo['extension']; } return $timedFilename; } protected function getGlobPattern() { $fileInfo = \pathinfo($this->filename); $glob = \str_replace(array('{filename}', '{date}'), array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'), $fileInfo['dirname'] . '/' . $this->filenameFormat); if (!empty($fileInfo['extension'])) { $glob .= '.' . $fileInfo['extension']; } return $glob; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php000064400000003030147600374260030121 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\ResettableInterface; /** * Base Handler class providing the Handler structure * * Classes extending it should (in most cases) only implement write($record) * * @author Jordi Boggiano * @author Christophe Coevoet */ abstract class AbstractProcessingHandler extends AbstractHandler { /** * {@inheritdoc} */ public function handle(array $record) { if (!$this->isHandling($record)) { return \false; } $record = $this->processRecord($record); $record['formatted'] = $this->getFormatter()->format($record); $this->write($record); return \false === $this->bubble; } /** * Writes the record down to the log of the implementing handler * * @param array $record * @return void */ protected abstract function write(array $record); /** * Processes a record. * * @param array $record * @return array */ protected function processRecord(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php000064400000003157147600374260026406 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * @author Robert Kaufmann III */ class LogEntriesHandler extends SocketHandler { /** * @var string */ protected $logToken; /** * @param string $token Log token supplied by LogEntries * @param bool $useSSL Whether or not SSL encryption should be used. * @param int $level The minimum logging level to trigger this handler * @param bool $bubble Whether or not messages that are handled should bubble up the stack. * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct($token, $useSSL = \true, $level = Logger::DEBUG, $bubble = \true, $host = 'data.logentries.com') { if ($useSSL && !\extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler'); } $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; parent::__construct($endpoint, $level, $bubble); $this->logToken = $token; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { return $this->logToken . ' ' . $record['formatted']; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php000064400000003526147600374260026422 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Inspired on LogEntriesHandler. * * @author Robert Kaufmann III * @author Gabriel Machado */ class InsightOpsHandler extends SocketHandler { /** * @var string */ protected $logToken; /** * @param string $token Log token supplied by InsightOps * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'. * @param bool $useSSL Whether or not SSL encryption should be used * @param int $level The minimum logging level to trigger this handler * @param bool $bubble Whether or not messages that are handled should bubble up the stack. * * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing */ public function __construct($token, $region = 'us', $useSSL = \true, $level = Logger::DEBUG, $bubble = \true) { if ($useSSL && !\extension_loaded('openssl')) { throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for InsightOpsHandler'); } $endpoint = $useSSL ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443' : $region . '.data.logs.insight.rapid7.com:80'; parent::__construct($endpoint, $level, $bubble); $this->logToken = $token; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { return $this->logToken . ' ' . $record['formatted']; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SlackbotHandler.php000064400000004472147600374260026076 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Sends notifications through Slack's Slackbot * * @author Haralan Dobrev * @see https://slack.com/apps/A0F81R8ET-slackbot * @deprecated According to Slack the API used on this handler it is deprecated. * Therefore this handler will be removed on 2.x * Slack suggests to use webhooks instead. Please contact slack for more information. */ class SlackbotHandler extends AbstractProcessingHandler { /** * The slug of the Slack team * @var string */ private $slackTeam; /** * Slackbot token * @var string */ private $token; /** * Slack channel name * @var string */ private $channel; /** * @param string $slackTeam Slack team slug * @param string $token Slackbot token * @param string $channel Slack channel (encoded ID or name) * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($slackTeam, $token, $channel, $level = Logger::CRITICAL, $bubble = \true) { @\trigger_error('SlackbotHandler is deprecated and will be removed on 2.x', \E_USER_DEPRECATED); parent::__construct($level, $bubble); $this->slackTeam = $slackTeam; $this->token = $token; $this->channel = $channel; } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { $slackbotUrl = \sprintf('https://%s.slack.com/services/hooks/slackbot?token=%s&channel=%s', $this->slackTeam, $this->token, $this->channel); $ch = \curl_init(); \curl_setopt($ch, \CURLOPT_URL, $slackbotUrl); \curl_setopt($ch, \CURLOPT_POST, \true); \curl_setopt($ch, \CURLOPT_RETURNTRANSFER, \true); \curl_setopt($ch, \CURLOPT_POSTFIELDS, $record['message']); Curl\Util::execute($ch); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/GroupHandler.php000064400000005423147600374260025425 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\ResettableInterface; /** * Forwards records to multiple handlers * * @author Lenar Lõhmus */ class GroupHandler extends AbstractHandler { protected $handlers; /** * @param array $handlers Array of Handlers. * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(array $handlers, $bubble = \true) { foreach ($handlers as $handler) { if (!$handler instanceof HandlerInterface) { throw new \InvalidArgumentException('The first argument of the GroupHandler must be an array of HandlerInterface instances.'); } } $this->handlers = $handlers; $this->bubble = $bubble; } /** * {@inheritdoc} */ public function isHandling(array $record) { foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return \true; } } return \false; } /** * {@inheritdoc} */ public function handle(array $record) { if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } foreach ($this->handlers as $handler) { $handler->handle($record); } return \false === $this->bubble; } /** * {@inheritdoc} */ public function handleBatch(array $records) { if ($this->processors) { $processed = array(); foreach ($records as $record) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } $processed[] = $record; } $records = $processed; } foreach ($this->handlers as $handler) { $handler->handleBatch($records); } } public function reset() { parent::reset(); foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { foreach ($this->handlers as $handler) { $handler->setFormatter($formatter); } return $this; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php000064400000006521147600374260027043 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Formatter\ElasticaFormatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Elastica\Client; use VendorDuplicator\Elastica\Exception\ExceptionInterface; /** * Elastic Search handler * * Usage example: * * $client = new \Elastica\Client(); * $options = array( * 'index' => 'elastic_index_name', * 'type' => 'elastic_doc_type', * ); * $handler = new ElasticSearchHandler($client, $options); * $log = new Logger('application'); * $log->pushHandler($handler); * * @author Jelle Vink */ class ElasticSearchHandler extends AbstractProcessingHandler { /** * @var Client */ protected $client; /** * @var array Handler config options */ protected $options = array(); /** * @param Client $client Elastica Client object * @param array $options Handler configuration * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); $this->client = $client; $this->options = \array_merge(array( 'index' => 'monolog', // Elastic index name 'type' => 'record', // Elastic document type 'ignore_error' => \false, ), $options); } /** * {@inheritDoc} */ protected function write(array $record) { $this->bulkSend(array($record['formatted'])); } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { if ($formatter instanceof ElasticaFormatter) { return parent::setFormatter($formatter); } throw new \InvalidArgumentException('ElasticSearchHandler is only compatible with ElasticaFormatter'); } /** * Getter options * @return array */ public function getOptions() { return $this->options; } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new ElasticaFormatter($this->options['index'], $this->options['type']); } /** * {@inheritdoc} */ public function handleBatch(array $records) { $documents = $this->getFormatter()->formatBatch($records); $this->bulkSend($documents); } /** * Use Elasticsearch bulk API to send list of documents * @param array $documents * @throws \RuntimeException */ protected function bulkSend(array $documents) { try { $this->client->addDocuments($documents); } catch (ExceptionInterface $e) { if (!$this->options['ignore_error']) { throw new \RuntimeException("Error sending messages to Elasticsearch", 0, $e); } } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/RedisHandler.php000064400000005631147600374260025400 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Logger; /** * Logs to a Redis key using rpush * * usage example: * * $log = new Logger('application'); * $redis = new RedisHandler(new Predis\Client("tcp://localhost:6379"), "logs", "prod"); * $log->pushHandler($redis); * * @author Thomas Tourlourat */ class RedisHandler extends AbstractProcessingHandler { private $redisClient; private $redisKey; protected $capSize; /** * @param \Predis\Client|\Redis $redis The redis instance * @param string $key The key name to push records to * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int|false $capSize Number of entries to limit list size to */ public function __construct($redis, $key, $level = Logger::DEBUG, $bubble = \true, $capSize = \false) { if (!($redis instanceof \VendorDuplicator\Predis\Client || $redis instanceof \Redis)) { throw new \InvalidArgumentException('Predis\\Client or Redis instance required'); } $this->redisClient = $redis; $this->redisKey = $key; $this->capSize = $capSize; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { if ($this->capSize) { $this->writeCapped($record); } else { $this->redisClient->rpush($this->redisKey, $record["formatted"]); } } /** * Write and cap the collection * Writes the record to the redis list and caps its * * @param array $record associative record array * @return void */ protected function writeCapped(array $record) { if ($this->redisClient instanceof \Redis) { $mode = \defined('\\Redis::MULTI') ? \Redis::MULTI : 1; $this->redisClient->multi($mode)->rpush($this->redisKey, $record["formatted"])->ltrim($this->redisKey, -$this->capSize, -1)->exec(); } else { $redisKey = $this->redisKey; $capSize = $this->capSize; $this->redisClient->transaction(function ($tx) use($record, $redisKey, $capSize) { $tx->rpush($redisKey, $record["formatted"]); $tx->ltrim($redisKey, -$capSize, -1); }); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/HipChatHandler.php000064400000024753147600374260025660 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Sends notifications through the hipchat api to a hipchat room * * Notes: * API token - HipChat API token * Room - HipChat Room Id or name, where messages are sent * Name - Name used to send the message (from) * notify - Should the message trigger a notification in the clients * version - The API version to use (HipChatHandler::API_V1 | HipChatHandler::API_V2) * * @author Rafael Dohms * @see https://www.hipchat.com/docs/api */ class HipChatHandler extends SocketHandler { /** * Use API version 1 */ const API_V1 = 'v1'; /** * Use API version v2 */ const API_V2 = 'v2'; /** * The maximum allowed length for the name used in the "from" field. */ const MAXIMUM_NAME_LENGTH = 15; /** * The maximum allowed length for the message. */ const MAXIMUM_MESSAGE_LENGTH = 9500; /** * @var string */ private $token; /** * @var string */ private $room; /** * @var string */ private $name; /** * @var bool */ private $notify; /** * @var string */ private $format; /** * @var string */ private $host; /** * @var string */ private $version; /** * @param string $token HipChat API Token * @param string $room The room that should be alerted of the message (Id or Name) * @param string $name Name used in the "from" field. * @param bool $notify Trigger a notification in clients or not * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $useSSL Whether to connect via SSL. * @param string $format The format of the messages (default to text, can be set to html if you have html in the messages) * @param string $host The HipChat server hostname. * @param string $version The HipChat API version (default HipChatHandler::API_V1) */ public function __construct($token, $room, $name = 'VendorDuplicator\\Monolog', $notify = \false, $level = Logger::CRITICAL, $bubble = \true, $useSSL = \true, $format = 'text', $host = 'api.hipchat.com', $version = self::API_V1) { @\trigger_error('The Monolog\\Handler\\HipChatHandler class is deprecated. You should migrate to Slack and the SlackWebhookHandler / SlackbotHandler, see https://www.atlassian.com/partnerships/slack', \E_USER_DEPRECATED); if ($version == self::API_V1 && !$this->validateStringLength($name, static::MAXIMUM_NAME_LENGTH)) { throw new \InvalidArgumentException('The supplied name is too long. HipChat\'s v1 API supports names up to 15 UTF-8 characters.'); } $connectionString = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80'; parent::__construct($connectionString, $level, $bubble); $this->token = $token; $this->name = $name; $this->notify = $notify; $this->room = $room; $this->format = $format; $this->host = $host; $this->version = $version; } /** * {@inheritdoc} * * @param array $record * @return string */ protected function generateDataStream($record) { $content = $this->buildContent($record); return $this->buildHeader($content) . $content; } /** * Builds the body of API call * * @param array $record * @return string */ private function buildContent($record) { $dataArray = array('notify' => $this->version == self::API_V1 ? $this->notify ? 1 : 0 : ($this->notify ? 'true' : 'false'), 'message' => $record['formatted'], 'message_format' => $this->format, 'color' => $this->getAlertColor($record['level'])); if (!$this->validateStringLength($dataArray['message'], static::MAXIMUM_MESSAGE_LENGTH)) { if (\function_exists('mb_substr')) { $dataArray['message'] = \mb_substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH) . ' [truncated]'; } else { $dataArray['message'] = \substr($dataArray['message'], 0, static::MAXIMUM_MESSAGE_LENGTH) . ' [truncated]'; } } // if we are using the legacy API then we need to send some additional information if ($this->version == self::API_V1) { $dataArray['room_id'] = $this->room; } // append the sender name if it is set // always append it if we use the v1 api (it is required in v1) if ($this->version == self::API_V1 || $this->name !== null) { $dataArray['from'] = (string) $this->name; } return \http_build_query($dataArray); } /** * Builds the header of the API Call * * @param string $content * @return string */ private function buildHeader($content) { if ($this->version == self::API_V1) { $header = "POST /v1/rooms/message?format=json&auth_token={$this->token} HTTP/1.1\r\n"; } else { // needed for rooms with special (spaces, etc) characters in the name $room = \rawurlencode($this->room); $header = "POST /v2/room/{$room}/notification?auth_token={$this->token} HTTP/1.1\r\n"; } $header .= "Host: {$this->host}\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . \strlen($content) . "\r\n"; $header .= "\r\n"; return $header; } /** * Assigns a color to each level of log records. * * @param int $level * @return string */ protected function getAlertColor($level) { switch (\true) { case $level >= Logger::ERROR: return 'red'; case $level >= Logger::WARNING: return 'yellow'; case $level >= Logger::INFO: return 'green'; case $level == Logger::DEBUG: return 'gray'; default: return 'yellow'; } } /** * {@inheritdoc} * * @param array $record */ protected function write(array $record) { parent::write($record); $this->finalizeWrite(); } /** * Finalizes the request by reading some bytes and then closing the socket * * If we do not read some but close the socket too early, hipchat sometimes * drops the request entirely. */ protected function finalizeWrite() { $res = $this->getResource(); if (\is_resource($res)) { @\fread($res, 2048); } $this->closeSocket(); } /** * {@inheritdoc} */ public function handleBatch(array $records) { if (\count($records) == 0) { return \true; } $batchRecords = $this->combineRecords($records); $handled = \false; foreach ($batchRecords as $batchRecord) { if ($this->isHandling($batchRecord)) { $this->write($batchRecord); $handled = \true; } } if (!$handled) { return \false; } return \false === $this->bubble; } /** * Combines multiple records into one. Error level of the combined record * will be the highest level from the given records. Datetime will be taken * from the first record. * * @param array $records * @return array */ private function combineRecords(array $records) { $batchRecord = null; $batchRecords = array(); $messages = array(); $formattedMessages = array(); $level = 0; $levelName = null; $datetime = null; foreach ($records as $record) { $record = $this->processRecord($record); if ($record['level'] > $level) { $level = $record['level']; $levelName = $record['level_name']; } if (null === $datetime) { $datetime = $record['datetime']; } $messages[] = $record['message']; $messageStr = \implode(\PHP_EOL, $messages); $formattedMessages[] = $this->getFormatter()->format($record); $formattedMessageStr = \implode('', $formattedMessages); $batchRecord = array('message' => $messageStr, 'formatted' => $formattedMessageStr, 'context' => array(), 'extra' => array()); if (!$this->validateStringLength($batchRecord['formatted'], static::MAXIMUM_MESSAGE_LENGTH)) { // Pop the last message and implode the remaining messages $lastMessage = \array_pop($messages); $lastFormattedMessage = \array_pop($formattedMessages); $batchRecord['message'] = \implode(\PHP_EOL, $messages); $batchRecord['formatted'] = \implode('', $formattedMessages); $batchRecords[] = $batchRecord; $messages = array($lastMessage); $formattedMessages = array($lastFormattedMessage); $batchRecord = null; } } if (null !== $batchRecord) { $batchRecords[] = $batchRecord; } // Set the max level and datetime for all records foreach ($batchRecords as &$batchRecord) { $batchRecord = \array_merge($batchRecord, array('level' => $level, 'level_name' => $levelName, 'datetime' => $datetime)); } return $batchRecords; } /** * Validates the length of a string. * * If the `mb_strlen()` function is available, it will use that, as HipChat * allows UTF-8 characters. Otherwise, it will fall back to `strlen()`. * * Note that this might cause false failures in the specific case of using * a valid name with less than 16 characters, but 16 or more bytes, on a * system where `mb_strlen()` is unavailable. * * @param string $str * @param int $length * * @return bool */ private function validateStringLength($str, $length) { if (\function_exists('mb_strlen')) { return \mb_strlen($str) <= $length; } return \strlen($str) <= $length; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SocketHandler.php000064400000023171147600374260025561 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; /** * Stores to any socket - uses fsockopen() or pfsockopen(). * * @author Pablo de Leon Belloc * @see http://php.net/manual/en/function.fsockopen.php */ class SocketHandler extends AbstractProcessingHandler { private $connectionString; private $connectionTimeout; private $resource; private $timeout = 0; private $writingTimeout = 10; private $lastSentBytes = null; private $chunkSize = null; private $persistent = \false; private $errno; private $errstr; private $lastWritingAt; /** * @param string $connectionString Socket connection string * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($connectionString, $level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); $this->connectionString = $connectionString; $this->connectionTimeout = (float) \ini_get('default_socket_timeout'); } /** * Connect (if necessary) and write to the socket * * @param array $record * * @throws \UnexpectedValueException * @throws \RuntimeException */ protected function write(array $record) { $this->connectIfNotConnected(); $data = $this->generateDataStream($record); $this->writeToSocket($data); } /** * We will not close a PersistentSocket instance so it can be reused in other requests. */ public function close() { if (!$this->isPersistent()) { $this->closeSocket(); } } /** * Close socket, if open */ public function closeSocket() { if (\is_resource($this->resource)) { \fclose($this->resource); $this->resource = null; } } /** * Set socket connection to nbe persistent. It only has effect before the connection is initiated. * * @param bool $persistent */ public function setPersistent($persistent) { $this->persistent = (bool) $persistent; } /** * Set connection timeout. Only has effect before we connect. * * @param float $seconds * * @see http://php.net/manual/en/function.fsockopen.php */ public function setConnectionTimeout($seconds) { $this->validateTimeout($seconds); $this->connectionTimeout = (float) $seconds; } /** * Set write timeout. Only has effect before we connect. * * @param float $seconds * * @see http://php.net/manual/en/function.stream-set-timeout.php */ public function setTimeout($seconds) { $this->validateTimeout($seconds); $this->timeout = (float) $seconds; } /** * Set writing timeout. Only has effect during connection in the writing cycle. * * @param float $seconds 0 for no timeout */ public function setWritingTimeout($seconds) { $this->validateTimeout($seconds); $this->writingTimeout = (float) $seconds; } /** * Set chunk size. Only has effect during connection in the writing cycle. * * @param float $bytes */ public function setChunkSize($bytes) { $this->chunkSize = $bytes; } /** * Get current connection string * * @return string */ public function getConnectionString() { return $this->connectionString; } /** * Get persistent setting * * @return bool */ public function isPersistent() { return $this->persistent; } /** * Get current connection timeout setting * * @return float */ public function getConnectionTimeout() { return $this->connectionTimeout; } /** * Get current in-transfer timeout * * @return float */ public function getTimeout() { return $this->timeout; } /** * Get current local writing timeout * * @return float */ public function getWritingTimeout() { return $this->writingTimeout; } /** * Get current chunk size * * @return float */ public function getChunkSize() { return $this->chunkSize; } /** * Check to see if the socket is currently available. * * UDP might appear to be connected but might fail when writing. See http://php.net/fsockopen for details. * * @return bool */ public function isConnected() { return \is_resource($this->resource) && !\feof($this->resource); // on TCP - other party can close connection. } /** * Wrapper to allow mocking */ protected function pfsockopen() { return @\pfsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking */ protected function fsockopen() { return @\fsockopen($this->connectionString, -1, $this->errno, $this->errstr, $this->connectionTimeout); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-timeout.php */ protected function streamSetTimeout() { $seconds = \floor($this->timeout); $microseconds = \round(($this->timeout - $seconds) * 1000000.0); return \stream_set_timeout($this->resource, $seconds, $microseconds); } /** * Wrapper to allow mocking * * @see http://php.net/manual/en/function.stream-set-chunk-size.php */ protected function streamSetChunkSize() { return \stream_set_chunk_size($this->resource, $this->chunkSize); } /** * Wrapper to allow mocking */ protected function fwrite($data) { return @\fwrite($this->resource, $data); } /** * Wrapper to allow mocking */ protected function streamGetMetadata() { return \stream_get_meta_data($this->resource); } private function validateTimeout($value) { $ok = \filter_var($value, \FILTER_VALIDATE_FLOAT); if ($ok === \false || $value < 0) { throw new \InvalidArgumentException("Timeout must be 0 or a positive float (got {$value})"); } } private function connectIfNotConnected() { if ($this->isConnected()) { return; } $this->connect(); } protected function generateDataStream($record) { return (string) $record['formatted']; } /** * @return resource|null */ protected function getResource() { return $this->resource; } private function connect() { $this->createSocketResource(); $this->setSocketTimeout(); $this->setStreamChunkSize(); } private function createSocketResource() { if ($this->isPersistent()) { $resource = $this->pfsockopen(); } else { $resource = $this->fsockopen(); } if (!$resource) { throw new \UnexpectedValueException("Failed connecting to {$this->connectionString} ({$this->errno}: {$this->errstr})"); } $this->resource = $resource; } private function setSocketTimeout() { if (!$this->streamSetTimeout()) { throw new \UnexpectedValueException("Failed setting timeout with stream_set_timeout()"); } } private function setStreamChunkSize() { if ($this->chunkSize && !$this->streamSetChunkSize()) { throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()"); } } private function writeToSocket($data) { $length = \strlen($data); $sent = 0; $this->lastSentBytes = $sent; while ($this->isConnected() && $sent < $length) { if (0 == $sent) { $chunk = $this->fwrite($data); } else { $chunk = $this->fwrite(\substr($data, $sent)); } if ($chunk === \false) { throw new \RuntimeException("Could not write to socket"); } $sent += $chunk; $socketInfo = $this->streamGetMetadata(); if ($socketInfo['timed_out']) { throw new \RuntimeException("Write timed-out"); } if ($this->writingIsTimedOut($sent)) { throw new \RuntimeException("Write timed-out, no data sent for `{$this->writingTimeout}` seconds, probably we got disconnected (sent {$sent} of {$length})"); } } if (!$this->isConnected() && $sent < $length) { throw new \RuntimeException("End-of-file reached, probably we got disconnected (sent {$sent} of {$length})"); } } private function writingIsTimedOut($sent) { $writingTimeout = (int) \floor($this->writingTimeout); if (0 === $writingTimeout) { return \false; } if ($sent !== $this->lastSentBytes) { $this->lastWritingAt = \time(); $this->lastSentBytes = $sent; return \false; } else { \usleep(100); } if (\time() - $this->lastWritingAt >= $writingTimeout) { $this->closeSocket(); return \true; } return \false; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/PHPConsoleHandler.php000064400000023665147600374260026313 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use Exception; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Utils; use VendorDuplicator\PhpConsole\Connector; use VendorDuplicator\PhpConsole\Handler; use VendorDuplicator\PhpConsole\Helper; /** * Monolog handler for Google Chrome extension "PHP Console" * * Display PHP error/debug log messages in Google Chrome console and notification popups, executes PHP code remotely * * Usage: * 1. Install Google Chrome extension https://chrome.google.com/webstore/detail/php-console/nfhmhhlpfleoednkpnnnkolmclajemef * 2. See overview https://github.com/barbushin/php-console#overview * 3. Install PHP Console library https://github.com/barbushin/php-console#installation * 4. Example (result will looks like http://i.hizliresim.com/vg3Pz4.png) * * $logger = new \Monolog\Logger('all', array(new \Monolog\Handler\PHPConsoleHandler())); * \Monolog\ErrorHandler::register($logger); * echo $undefinedVar; * $logger->addDebug('SELECT * FROM users', array('db', 'time' => 0.012)); * PC::debug($_SERVER); // PHP Console debugger for any type of vars * * @author Sergey Barbushin https://www.linkedin.com/in/barbushin */ class PHPConsoleHandler extends AbstractProcessingHandler { private $options = array( 'enabled' => \true, // bool Is PHP Console server enabled 'classesPartialsTraceIgnore' => array('VendorDuplicator\\Monolog\\'), // array Hide calls of classes started with... 'debugTagsKeysInContext' => array(0, 'tag'), // bool Is PHP Console server enabled 'useOwnErrorsHandler' => \false, // bool Enable errors handling 'useOwnExceptionsHandler' => \false, // bool Enable exceptions handling 'sourcesBasePath' => null, // string Base path of all project sources to strip in errors source paths 'registerHelper' => \true, // bool Register PhpConsole\Helper that allows short debug calls like PC::debug($var, 'ta.g.s') 'serverEncoding' => null, // string|null Server internal encoding 'headersLimit' => null, // int|null Set headers size limit for your web-server 'password' => null, // string|null Protect PHP Console connection by password 'enableSslOnlyMode' => \false, // bool Force connection by SSL for clients with PHP Console installed 'ipMasks' => array(), // array Set IP masks of clients that will be allowed to connect to PHP Console: array('192.168.*.*', '127.0.0.1') 'enableEvalListener' => \false, // bool Enable eval request to be handled by eval dispatcher(if enabled, 'password' option is also required) 'dumperDetectCallbacks' => \false, // bool Convert callback items in dumper vars to (callback SomeClass::someMethod) strings 'dumperLevelLimit' => 5, // int Maximum dumped vars array or object nested dump level 'dumperItemsCountLimit' => 100, // int Maximum dumped var same level array items or object properties number 'dumperItemSizeLimit' => 5000, // int Maximum length of any string or dumped array item 'dumperDumpSizeLimit' => 500000, // int Maximum approximate size of dumped vars result formatted in JSON 'detectDumpTraceAndSource' => \false, // bool Autodetect and append trace data to debug 'dataStorage' => null, ); /** @var Connector */ private $connector; /** * @param array $options See \Monolog\Handler\PHPConsoleHandler::$options for more details * @param Connector|null $connector Instance of \PhpConsole\Connector class (optional) * @param int $level * @param bool $bubble * @throws Exception */ public function __construct(array $options = array(), Connector $connector = null, $level = Logger::DEBUG, $bubble = \true) { if (!\class_exists('VendorDuplicator\\PhpConsole\\Connector')) { throw new Exception('PHP Console library not found. See https://github.com/barbushin/php-console#installation'); } parent::__construct($level, $bubble); $this->options = $this->initOptions($options); $this->connector = $this->initConnector($connector); } private function initOptions(array $options) { $wrongOptions = \array_diff(\array_keys($options), \array_keys($this->options)); if ($wrongOptions) { throw new Exception('Unknown options: ' . \implode(', ', $wrongOptions)); } return \array_replace($this->options, $options); } private function initConnector(Connector $connector = null) { if (!$connector) { if ($this->options['dataStorage']) { Connector::setPostponeStorage($this->options['dataStorage']); } $connector = Connector::getInstance(); } if ($this->options['registerHelper'] && !Helper::isRegistered()) { Helper::register(); } if ($this->options['enabled'] && $connector->isActiveClient()) { if ($this->options['useOwnErrorsHandler'] || $this->options['useOwnExceptionsHandler']) { $handler = Handler::getInstance(); $handler->setHandleErrors($this->options['useOwnErrorsHandler']); $handler->setHandleExceptions($this->options['useOwnExceptionsHandler']); $handler->start(); } if ($this->options['sourcesBasePath']) { $connector->setSourcesBasePath($this->options['sourcesBasePath']); } if ($this->options['serverEncoding']) { $connector->setServerEncoding($this->options['serverEncoding']); } if ($this->options['password']) { $connector->setPassword($this->options['password']); } if ($this->options['enableSslOnlyMode']) { $connector->enableSslOnlyMode(); } if ($this->options['ipMasks']) { $connector->setAllowedIpMasks($this->options['ipMasks']); } if ($this->options['headersLimit']) { $connector->setHeadersLimit($this->options['headersLimit']); } if ($this->options['detectDumpTraceAndSource']) { $connector->getDebugDispatcher()->detectTraceAndSource = \true; } $dumper = $connector->getDumper(); $dumper->levelLimit = $this->options['dumperLevelLimit']; $dumper->itemsCountLimit = $this->options['dumperItemsCountLimit']; $dumper->itemSizeLimit = $this->options['dumperItemSizeLimit']; $dumper->dumpSizeLimit = $this->options['dumperDumpSizeLimit']; $dumper->detectCallbacks = $this->options['dumperDetectCallbacks']; if ($this->options['enableEvalListener']) { $connector->startEvalRequestsListener(); } } return $connector; } public function getConnector() { return $this->connector; } public function getOptions() { return $this->options; } public function handle(array $record) { if ($this->options['enabled'] && $this->connector->isActiveClient()) { return parent::handle($record); } return !$this->bubble; } /** * Writes the record down to the log of the implementing handler * * @param array $record * @return void */ protected function write(array $record) { if ($record['level'] < Logger::NOTICE) { $this->handleDebugRecord($record); } elseif (isset($record['context']['exception']) && $record['context']['exception'] instanceof Exception) { $this->handleExceptionRecord($record); } else { $this->handleErrorRecord($record); } } private function handleDebugRecord(array $record) { $tags = $this->getRecordTags($record); $message = $record['message']; if ($record['context']) { $message .= ' ' . Utils::jsonEncode($this->connector->getDumper()->dump(\array_filter($record['context'])), null, \true); } $this->connector->getDebugDispatcher()->dispatchDebug($message, $tags, $this->options['classesPartialsTraceIgnore']); } private function handleExceptionRecord(array $record) { $this->connector->getErrorsDispatcher()->dispatchException($record['context']['exception']); } private function handleErrorRecord(array $record) { $context = $record['context']; $this->connector->getErrorsDispatcher()->dispatchError(isset($context['code']) ? $context['code'] : null, isset($context['message']) ? $context['message'] : $record['message'], isset($context['file']) ? $context['file'] : null, isset($context['line']) ? $context['line'] : null, $this->options['classesPartialsTraceIgnore']); } private function getRecordTags(array &$record) { $tags = null; if (!empty($record['context'])) { $context =& $record['context']; foreach ($this->options['debugTagsKeysInContext'] as $key) { if (!empty($context[$key])) { $tags = $context[$key]; if ($key === 0) { \array_shift($context); } else { unset($context[$key]); } break; } } } return $tags ?: \strtolower($record['level_name']); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('%message%'); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/SamplingHandler.php000064400000006364147600374260026110 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\FormatterInterface; /** * Sampling handler * * A sampled event stream can be useful for logging high frequency events in * a production environment where you only need an idea of what is happening * and are not concerned with capturing every occurrence. Since the decision to * handle or not handle a particular event is determined randomly, the * resulting sampled log is not guaranteed to contain 1/N of the events that * occurred in the application, but based on the Law of large numbers, it will * tend to be close to this ratio with a large number of attempts. * * @author Bryan Davis * @author Kunal Mehta */ class SamplingHandler extends AbstractHandler { /** * @var callable|HandlerInterface $handler */ protected $handler; /** * @var int $factor */ protected $factor; /** * @param callable|HandlerInterface $handler Handler or factory callable($record|null, $samplingHandler). * @param int $factor Sample factor */ public function __construct($handler, $factor) { parent::__construct(); $this->handler = $handler; $this->factor = $factor; if (!$this->handler instanceof HandlerInterface && !\is_callable($this->handler)) { throw new \RuntimeException("The given handler (" . \json_encode($this->handler) . ") is not a callable nor a Monolog\\Handler\\HandlerInterface object"); } } public function isHandling(array $record) { return $this->getHandler($record)->isHandling($record); } public function handle(array $record) { if ($this->isHandling($record) && \mt_rand(1, $this->factor) === 1) { if ($this->processors) { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } } $this->getHandler($record)->handle($record); } return \false === $this->bubble; } /** * Return the nested handler * * If the handler was provided as a factory callable, this will trigger the handler's instantiation. * * @return HandlerInterface */ public function getHandler(array $record = null) { if (!$this->handler instanceof HandlerInterface) { $this->handler = \call_user_func($this->handler, $record, $this); if (!$this->handler instanceof HandlerInterface) { throw new \RuntimeException("The factory callable should return a HandlerInterface"); } } return $this->handler; } /** * {@inheritdoc} */ public function setFormatter(FormatterInterface $formatter) { $this->getHandler()->setFormatter($formatter); return $this; } /** * {@inheritdoc} */ public function getFormatter() { return $this->getHandler()->getFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/DoctrineCouchDBHandler.php000064400000002052147600374260027263 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\NormalizerFormatter; use VendorDuplicator\Doctrine\CouchDB\CouchDBClient; /** * CouchDB handler for Doctrine CouchDB ODM * * @author Markus Bachmann */ class DoctrineCouchDBHandler extends AbstractProcessingHandler { private $client; public function __construct(CouchDBClient $client, $level = Logger::DEBUG, $bubble = \true) { $this->client = $client; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $this->client->postDocument($record['formatted']); } protected function getDefaultFormatter() { return new NormalizerFormatter(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/RavenHandler.php000064400000016334147600374260025407 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Formatter\FormatterInterface; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Raven_Client; /** * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server * using sentry-php (https://github.com/getsentry/sentry-php) * * @author Marc Abramowitz */ class RavenHandler extends AbstractProcessingHandler { /** * Translates Monolog log levels to Raven log levels. */ protected $logLevels = array(Logger::DEBUG => Raven_Client::DEBUG, Logger::INFO => Raven_Client::INFO, Logger::NOTICE => Raven_Client::INFO, Logger::WARNING => Raven_Client::WARNING, Logger::ERROR => Raven_Client::ERROR, Logger::CRITICAL => Raven_Client::FATAL, Logger::ALERT => Raven_Client::FATAL, Logger::EMERGENCY => Raven_Client::FATAL); /** * @var string should represent the current version of the calling * software. Can be any string (git commit, version number) */ protected $release; /** * @var Raven_Client the client object that sends the message to the server */ protected $ravenClient; /** * @var FormatterInterface The formatter to use for the logs generated via handleBatch() */ protected $batchFormatter; /** * @param Raven_Client $ravenClient * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = \true) { @\trigger_error('The Monolog\\Handler\\RavenHandler class is deprecated. You should rather upgrade to the sentry/sentry 2.x and use Sentry\\Monolog\\Handler, see https://github.com/getsentry/sentry-php/blob/master/src/Monolog/Handler.php', \E_USER_DEPRECATED); parent::__construct($level, $bubble); $this->ravenClient = $ravenClient; } /** * {@inheritdoc} */ public function handleBatch(array $records) { $level = $this->level; // filter records based on their level $records = \array_filter($records, function ($record) use($level) { return $record['level'] >= $level; }); if (!$records) { return; } // the record with the highest severity is the "main" one $record = \array_reduce($records, function ($highest, $record) { if (null === $highest || $record['level'] > $highest['level']) { return $record; } return $highest; }); // the other ones are added as a context item $logs = array(); foreach ($records as $r) { $logs[] = $this->processRecord($r); } if ($logs) { $record['context']['logs'] = (string) $this->getBatchFormatter()->formatBatch($logs); } $this->handle($record); } /** * Sets the formatter for the logs generated by handleBatch(). * * @param FormatterInterface $formatter */ public function setBatchFormatter(FormatterInterface $formatter) { $this->batchFormatter = $formatter; } /** * Gets the formatter for the logs generated by handleBatch(). * * @return FormatterInterface */ public function getBatchFormatter() { if (!$this->batchFormatter) { $this->batchFormatter = $this->getDefaultBatchFormatter(); } return $this->batchFormatter; } /** * {@inheritdoc} */ protected function write(array $record) { $previousUserContext = \false; $options = array(); $options['level'] = $this->logLevels[$record['level']]; $options['tags'] = array(); if (!empty($record['extra']['tags'])) { $options['tags'] = \array_merge($options['tags'], $record['extra']['tags']); unset($record['extra']['tags']); } if (!empty($record['context']['tags'])) { $options['tags'] = \array_merge($options['tags'], $record['context']['tags']); unset($record['context']['tags']); } if (!empty($record['context']['fingerprint'])) { $options['fingerprint'] = $record['context']['fingerprint']; unset($record['context']['fingerprint']); } if (!empty($record['context']['logger'])) { $options['logger'] = $record['context']['logger']; unset($record['context']['logger']); } else { $options['logger'] = $record['channel']; } foreach ($this->getExtraParameters() as $key) { foreach (array('extra', 'context') as $source) { if (!empty($record[$source][$key])) { $options[$key] = $record[$source][$key]; unset($record[$source][$key]); } } } if (!empty($record['context'])) { $options['extra']['context'] = $record['context']; if (!empty($record['context']['user'])) { $previousUserContext = $this->ravenClient->context->user; $this->ravenClient->user_context($record['context']['user']); unset($options['extra']['context']['user']); } } if (!empty($record['extra'])) { $options['extra']['extra'] = $record['extra']; } if (!empty($this->release) && !isset($options['release'])) { $options['release'] = $this->release; } if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || \PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable)) { $options['message'] = $record['formatted']; $this->ravenClient->captureException($record['context']['exception'], $options); } else { $this->ravenClient->captureMessage($record['formatted'], array(), $options); } if ($previousUserContext !== \false) { $this->ravenClient->user_context($previousUserContext); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('[%channel%] %message%'); } /** * Gets the default formatter for the logs generated by handleBatch(). * * @return FormatterInterface */ protected function getDefaultBatchFormatter() { return new LineFormatter(); } /** * Gets extra parameters supported by Raven that can be found in "extra" and "context" * * @return array */ protected function getExtraParameters() { return array('contexts', 'checksum', 'release', 'event_id'); } /** * @param string $value * @return self */ public function setRelease($value) { $this->release = $value; return $this; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/CouchDBHandler.php000064400000003406147600374260025577 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\JsonFormatter; use VendorDuplicator\Monolog\Logger; /** * CouchDB handler * * @author Markus Bachmann */ class CouchDBHandler extends AbstractProcessingHandler { private $options; public function __construct(array $options = array(), $level = Logger::DEBUG, $bubble = \true) { $this->options = \array_merge(array('host' => 'localhost', 'port' => 5984, 'dbname' => 'logger', 'username' => null, 'password' => null), $options); parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $basicAuth = null; if ($this->options['username']) { $basicAuth = \sprintf('%s:%s@', $this->options['username'], $this->options['password']); } $url = 'http://' . $basicAuth . $this->options['host'] . ':' . $this->options['port'] . '/' . $this->options['dbname']; $context = \stream_context_create(array('http' => array('method' => 'POST', 'content' => $record['formatted'], 'ignore_errors' => \true, 'max_redirects' => 0, 'header' => 'Content-type: application/json'))); if (\false === @\file_get_contents($url, null, $context)) { throw new \RuntimeException(\sprintf('Could not connect to %s', $url)); } } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, \false); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php000064400000004523147600374260026064 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Formatter\LineFormatter; use VendorDuplicator\Monolog\Logger; /** * Stores to PHP error_log() handler. * * @author Elan Ruusamäe */ class ErrorLogHandler extends AbstractProcessingHandler { const OPERATING_SYSTEM = 0; const SAPI = 4; protected $messageType; protected $expandNewlines; /** * @param int $messageType Says where the error should go. * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries */ public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = \true, $expandNewlines = \false) { parent::__construct($level, $bubble); if (\false === \in_array($messageType, self::getAvailableTypes())) { $message = \sprintf('The given message type "%s" is not supported', \print_r($messageType, \true)); throw new \InvalidArgumentException($message); } $this->messageType = $messageType; $this->expandNewlines = $expandNewlines; } /** * @return array With all available types */ public static function getAvailableTypes() { return array(self::OPERATING_SYSTEM, self::SAPI); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new LineFormatter('[%datetime%] %channel%.%level_name%: %message% %context% %extra%'); } /** * {@inheritdoc} */ protected function write(array $record) { if ($this->expandNewlines) { $lines = \preg_split('{[\\r\\n]+}', (string) $record['formatted']); foreach ($lines as $line) { \error_log($line, $this->messageType); } } else { \error_log((string) $record['formatted'], $this->messageType); } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AmqpHandler.php000064400000007017147600374260025230 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\JsonFormatter; use VendorDuplicator\PhpAmqpLib\Message\AMQPMessage; use VendorDuplicator\PhpAmqpLib\Channel\AMQPChannel; use AMQPExchange; class AmqpHandler extends AbstractProcessingHandler { /** * @var AMQPExchange|AMQPChannel $exchange */ protected $exchange; /** * @var string */ protected $exchangeName; /** * @param AMQPExchange|AMQPChannel $exchange AMQPExchange (php AMQP ext) or PHP AMQP lib channel, ready for use * @param string $exchangeName * @param int $level * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($exchange, $exchangeName = 'log', $level = Logger::DEBUG, $bubble = \true) { if ($exchange instanceof AMQPExchange) { $exchange->setName($exchangeName); } elseif ($exchange instanceof AMQPChannel) { $this->exchangeName = $exchangeName; } else { throw new \InvalidArgumentException('PhpAmqpLib\\Channel\\AMQPChannel or AMQPExchange instance required'); } $this->exchange = $exchange; parent::__construct($level, $bubble); } /** * {@inheritDoc} */ protected function write(array $record) { $data = $record["formatted"]; $routingKey = $this->getRoutingKey($record); if ($this->exchange instanceof AMQPExchange) { $this->exchange->publish($data, $routingKey, 0, array('delivery_mode' => 2, 'content_type' => 'application/json')); } else { $this->exchange->basic_publish($this->createAmqpMessage($data), $this->exchangeName, $routingKey); } } /** * {@inheritDoc} */ public function handleBatch(array $records) { if ($this->exchange instanceof AMQPExchange) { parent::handleBatch($records); return; } foreach ($records as $record) { if (!$this->isHandling($record)) { continue; } $record = $this->processRecord($record); $data = $this->getFormatter()->format($record); $this->exchange->batch_basic_publish($this->createAmqpMessage($data), $this->exchangeName, $this->getRoutingKey($record)); } $this->exchange->publish_batch(); } /** * Gets the routing key for the AMQP exchange * * @param array $record * @return string */ protected function getRoutingKey(array $record) { $routingKey = \sprintf( '%s.%s', // TODO 2.0 remove substr call \substr($record['level_name'], 0, 4), $record['channel'] ); return \strtolower($routingKey); } /** * @param string $data * @return AMQPMessage */ private function createAmqpMessage($data) { return new AMQPMessage((string) $data, array('delivery_mode' => 2, 'content_type' => 'application/json')); } /** * {@inheritDoc} */ protected function getDefaultFormatter() { return new JsonFormatter(JsonFormatter::BATCH_MODE_JSON, \false); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/NativeMailerHandler.php000064400000012210147600374260026701 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\LineFormatter; /** * NativeMailerHandler uses the mail() function to send the emails * * @author Christophe Coevoet * @author Mark Garrett */ class NativeMailerHandler extends MailHandler { /** * The email addresses to which the message will be sent * @var array */ protected $to; /** * The subject of the email * @var string */ protected $subject; /** * Optional headers for the message * @var array */ protected $headers = array(); /** * Optional parameters for the message * @var array */ protected $parameters = array(); /** * The wordwrap length for the message * @var int */ protected $maxColumnWidth; /** * The Content-type for the message * @var string */ protected $contentType = 'text/plain'; /** * The encoding for the message * @var string */ protected $encoding = 'utf-8'; /** * @param string|array $to The receiver of the mail * @param string $subject The subject of the mail * @param string $from The sender of the mail * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not * @param int $maxColumnWidth The maximum column width that the message lines will have */ public function __construct($to, $subject, $from, $level = Logger::ERROR, $bubble = \true, $maxColumnWidth = 70) { parent::__construct($level, $bubble); $this->to = \is_array($to) ? $to : array($to); $this->subject = $subject; $this->addHeader(\sprintf('From: %s', $from)); $this->maxColumnWidth = $maxColumnWidth; } /** * Add headers to the message * * @param string|array $headers Custom added headers * @return self */ public function addHeader($headers) { foreach ((array) $headers as $header) { if (\strpos($header, "\n") !== \false || \strpos($header, "\r") !== \false) { throw new \InvalidArgumentException('Headers can not contain newline characters for security reasons'); } $this->headers[] = $header; } return $this; } /** * Add parameters to the message * * @param string|array $parameters Custom added parameters * @return self */ public function addParameter($parameters) { $this->parameters = \array_merge($this->parameters, (array) $parameters); return $this; } /** * {@inheritdoc} */ protected function send($content, array $records) { $content = \wordwrap($content, $this->maxColumnWidth); $headers = \ltrim(\implode("\r\n", $this->headers) . "\r\n", "\r\n"); $headers .= 'Content-type: ' . $this->getContentType() . '; charset=' . $this->getEncoding() . "\r\n"; if ($this->getContentType() == 'text/html' && \false === \strpos($headers, 'MIME-Version:')) { $headers .= 'MIME-Version: 1.0' . "\r\n"; } $subject = $this->subject; if ($records) { $subjectFormatter = new LineFormatter($this->subject); $subject = $subjectFormatter->format($this->getHighestRecord($records)); } $parameters = \implode(' ', $this->parameters); foreach ($this->to as $to) { \mail($to, $subject, $content, $headers, $parameters); } } /** * @return string $contentType */ public function getContentType() { return $this->contentType; } /** * @return string $encoding */ public function getEncoding() { return $this->encoding; } /** * @param string $contentType The content type of the email - Defaults to text/plain. Use text/html for HTML * messages. * @return self */ public function setContentType($contentType) { if (\strpos($contentType, "\n") !== \false || \strpos($contentType, "\r") !== \false) { throw new \InvalidArgumentException('The content type can not contain newline characters to prevent email header injection'); } $this->contentType = $contentType; return $this; } /** * @param string $encoding * @return self */ public function setEncoding($encoding) { if (\strpos($encoding, "\n") !== \false || \strpos($encoding, "\r") !== \false) { throw new \InvalidArgumentException('The encoding can not contain newline characters to prevent email header injection'); } $this->encoding = $encoding; return $this; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php000064400000006373147600374260027302 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Handler; use VendorDuplicator\Monolog\Logger; use VendorDuplicator\Monolog\Formatter\LineFormatter; /** * Common syslog functionality */ abstract class AbstractSyslogHandler extends AbstractProcessingHandler { protected $facility; /** * Translates Monolog log levels to syslog log priorities. */ protected $logLevels = array(Logger::DEBUG => \LOG_DEBUG, Logger::INFO => \LOG_INFO, Logger::NOTICE => \LOG_NOTICE, Logger::WARNING => \LOG_WARNING, Logger::ERROR => \LOG_ERR, Logger::CRITICAL => \LOG_CRIT, Logger::ALERT => \LOG_ALERT, Logger::EMERGENCY => \LOG_EMERG); /** * List of valid log facility names. */ protected $facilities = array('auth' => \LOG_AUTH, 'authpriv' => \LOG_AUTHPRIV, 'cron' => \LOG_CRON, 'daemon' => \LOG_DAEMON, 'kern' => \LOG_KERN, 'lpr' => \LOG_LPR, 'mail' => \LOG_MAIL, 'news' => \LOG_NEWS, 'syslog' => \LOG_SYSLOG, 'user' => \LOG_USER, 'uucp' => \LOG_UUCP); /** * @param mixed $facility * @param int $level The minimum logging level at which this handler will be triggered * @param bool $bubble Whether the messages that are handled can bubble up the stack or not */ public function __construct($facility = \LOG_USER, $level = Logger::DEBUG, $bubble = \true) { parent::__construct($level, $bubble); if (!\defined('PHP_WINDOWS_VERSION_BUILD')) { $this->facilities['local0'] = \LOG_LOCAL0; $this->facilities['local1'] = \LOG_LOCAL1; $this->facilities['local2'] = \LOG_LOCAL2; $this->facilities['local3'] = \LOG_LOCAL3; $this->facilities['local4'] = \LOG_LOCAL4; $this->facilities['local5'] = \LOG_LOCAL5; $this->facilities['local6'] = \LOG_LOCAL6; $this->facilities['local7'] = \LOG_LOCAL7; } else { $this->facilities['local0'] = 128; // LOG_LOCAL0 $this->facilities['local1'] = 136; // LOG_LOCAL1 $this->facilities['local2'] = 144; // LOG_LOCAL2 $this->facilities['local3'] = 152; // LOG_LOCAL3 $this->facilities['local4'] = 160; // LOG_LOCAL4 $this->facilities['local5'] = 168; // LOG_LOCAL5 $this->facilities['local6'] = 176; // LOG_LOCAL6 $this->facilities['local7'] = 184; // LOG_LOCAL7 } // convert textual description of facility to syslog constant if (\array_key_exists(\strtolower($facility), $this->facilities)) { $facility = $this->facilities[\strtolower($facility)]; } elseif (!\in_array($facility, \array_values($this->facilities), \true)) { throw new \UnexpectedValueException('Unknown facility value "' . $facility . '" given'); } $this->facility = $facility; } /** * {@inheritdoc} */ protected function getDefaultFormatter() { return new LineFormatter('%channel%.%level_name%: %message% %context% %extra%'); } } gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryPeakUsageProcessor.php000064400000001445147600374260030314 0ustar00addons * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Injects memory_get_peak_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryPeakUsageProcessor extends MemoryProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { $bytes = \memory_get_peak_usage($this->realUsage); $formatted = $this->formatBytes($bytes); $record['extra']['memory_peak_usage'] = $formatted; return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryUsageProcessor.php000064400000001422147600374260027565 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Injects memory_get_usage in all records * * @see Monolog\Processor\MemoryProcessor::__construct() for options * @author Rob Jensen */ class MemoryUsageProcessor extends MemoryProcessor { /** * @param array $record * @return array */ public function __invoke(array $record) { $bytes = \memory_get_usage($this->realUsage); $formatted = $this->formatBytes($bytes); $record['extra']['memory_usage'] = $formatted; return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php000064400000006607147600374260030202 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; use VendorDuplicator\Monolog\Logger; /** * Injects line/file:class/function where the log message came from * * Warning: This only works if the handler processes the logs directly. * If you put the processor on a handler that is behind a FingersCrossedHandler * for example, the processor will only be called once the trigger level is reached, * and all the log records will have the same file/line/.. data from the call that * triggered the FingersCrossedHandler. * * @author Jordi Boggiano */ class IntrospectionProcessor implements ProcessorInterface { private $level; private $skipClassesPartials; private $skipStackFramesCount; private $skipFunctions = array('call_user_func', 'call_user_func_array'); public function __construct($level = Logger::DEBUG, array $skipClassesPartials = array(), $skipStackFramesCount = 0) { $this->level = Logger::toMonologLevel($level); $this->skipClassesPartials = \array_merge(array('VendorDuplicator\\Monolog\\'), $skipClassesPartials); $this->skipStackFramesCount = $skipStackFramesCount; } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } /* * http://php.net/manual/en/function.debug-backtrace.php * As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. * Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. */ $trace = \debug_backtrace(\PHP_VERSION_ID < 50306 ? 2 : \DEBUG_BACKTRACE_IGNORE_ARGS); // skip first since it's always the current method \array_shift($trace); // the call_user_func call is also skipped \array_shift($trace); $i = 0; while ($this->isTraceClassOrSkippedFunction($trace, $i)) { if (isset($trace[$i]['class'])) { foreach ($this->skipClassesPartials as $part) { if (\strpos($trace[$i]['class'], $part) !== \false) { $i++; continue 2; } } } elseif (\in_array($trace[$i]['function'], $this->skipFunctions)) { $i++; continue; } break; } $i += $this->skipStackFramesCount; // we should have the call source now $record['extra'] = \array_merge($record['extra'], array('file' => isset($trace[$i - 1]['file']) ? $trace[$i - 1]['file'] : null, 'line' => isset($trace[$i - 1]['line']) ? $trace[$i - 1]['line'] : null, 'class' => isset($trace[$i]['class']) ? $trace[$i]['class'] : null, 'function' => isset($trace[$i]['function']) ? $trace[$i]['function'] : null)); return $record; } private function isTraceClassOrSkippedFunction(array $trace, $index) { if (!isset($trace[$index])) { return \false; } return isset($trace[$index]['class']) || \in_array($trace[$index]['function'], $this->skipFunctions); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/TagProcessor.php000064400000001536147600374260026051 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Adds a tags array into record * * @author Martijn Riemers */ class TagProcessor implements ProcessorInterface { private $tags; public function __construct(array $tags = array()) { $this->setTags($tags); } public function addTags(array $tags = array()) { $this->tags = \array_merge($this->tags, $tags); } public function setTags(array $tags = array()) { $this->tags = $tags; } public function __invoke(array $record) { $record['extra']['tags'] = $this->tags; return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/WebProcessor.php000064400000006143147600374260026052 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Injects url/method and remote IP of the current web request in all records * * @author Jordi Boggiano */ class WebProcessor implements ProcessorInterface { /** * @var array|\ArrayAccess */ protected $serverData; /** * Default fields * * Array is structured as [key in record.extra => key in $serverData] * * @var array */ protected $extraFields = array('url' => 'REQUEST_URI', 'ip' => 'REMOTE_ADDR', 'http_method' => 'REQUEST_METHOD', 'server' => 'SERVER_NAME', 'referrer' => 'HTTP_REFERER'); /** * @param array|\ArrayAccess $serverData Array or object w/ ArrayAccess that provides access to the $_SERVER data * @param array|null $extraFields Field names and the related key inside $serverData to be added. If not provided it defaults to: url, ip, http_method, server, referrer */ public function __construct($serverData = null, array $extraFields = null) { if (null === $serverData) { $this->serverData =& $_SERVER; } elseif (\is_array($serverData) || $serverData instanceof \ArrayAccess) { $this->serverData = $serverData; } else { throw new \UnexpectedValueException('$serverData must be an array or object implementing ArrayAccess.'); } if (isset($this->serverData['UNIQUE_ID'])) { $this->extraFields['unique_id'] = 'UNIQUE_ID'; } if (null !== $extraFields) { if (isset($extraFields[0])) { foreach (\array_keys($this->extraFields) as $fieldName) { if (!\in_array($fieldName, $extraFields)) { unset($this->extraFields[$fieldName]); } } } else { $this->extraFields = $extraFields; } } } /** * @param array $record * @return array */ public function __invoke(array $record) { // skip processing if for some reason request data // is not present (CLI or wonky SAPIs) if (!isset($this->serverData['REQUEST_URI'])) { return $record; } $record['extra'] = $this->appendExtraFields($record['extra']); return $record; } /** * @param string $extraName * @param string $serverName * @return $this */ public function addExtraField($extraName, $serverName) { $this->extraFields[$extraName] = $serverName; return $this; } /** * @param array $extra * @return array */ private function appendExtraFields(array $extra) { foreach ($this->extraFields as $extraName => $serverName) { $extra[$extraName] = isset($this->serverData[$serverName]) ? $this->serverData[$serverName] : null; } return $extra; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/UidProcessor.php000064400000002355147600374260026057 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; use VendorDuplicator\Monolog\ResettableInterface; /** * Adds a unique identifier into records * * @author Simon Mönch */ class UidProcessor implements ProcessorInterface, ResettableInterface { private $uid; public function __construct($length = 7) { if (!\is_int($length) || $length > 32 || $length < 1) { throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32'); } $this->uid = $this->generateUid($length); } public function __invoke(array $record) { $record['extra']['uid'] = $this->uid; return $record; } /** * @return string */ public function getUid() { return $this->uid; } public function reset() { $this->uid = $this->generateUid(\strlen($this->uid)); } private function generateUid($length) { return \substr(\hash('md5', \uniqid('', \true)), 0, $length); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php000064400000004751147600374260030053 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; use VendorDuplicator\Monolog\Utils; /** * Processes a record's message according to PSR-3 rules * * It replaces {foo} with the value from $context['foo'] * * @author Jordi Boggiano */ class PsrLogMessageProcessor implements ProcessorInterface { const SIMPLE_DATE = "Y-m-d\\TH:i:s.uP"; /** @var string|null */ private $dateFormat; /** @var bool */ private $removeUsedContextFields; /** * @param string|null $dateFormat The format of the timestamp: one supported by DateTime::format * @param bool $removeUsedContextFields If set to true the fields interpolated into message gets unset */ public function __construct($dateFormat = null, $removeUsedContextFields = \false) { $this->dateFormat = $dateFormat; $this->removeUsedContextFields = $removeUsedContextFields; } /** * @param array $record * @return array */ public function __invoke(array $record) { if (\false === \strpos($record['message'], '{')) { return $record; } $replacements = array(); foreach ($record['context'] as $key => $val) { $placeholder = '{' . $key . '}'; if (\strpos($record['message'], $placeholder) === \false) { continue; } if (\is_null($val) || \is_scalar($val) || \is_object($val) && \method_exists($val, "__toString")) { $replacements[$placeholder] = $val; } elseif ($val instanceof \DateTime) { $replacements[$placeholder] = $val->format($this->dateFormat ?: static::SIMPLE_DATE); } elseif (\is_object($val)) { $replacements[$placeholder] = '[object ' . Utils::getClass($val) . ']'; } elseif (\is_array($val)) { $replacements[$placeholder] = 'array' . Utils::jsonEncode($val, null, \true); } else { $replacements[$placeholder] = '[' . \gettype($val) . ']'; } if ($this->removeUsedContextFields) { unset($record['context'][$key]); } } $record['message'] = \strtr($record['message'], $replacements); return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php000064400000001154147600374260027225 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Adds value of getmypid into records * * @author Andreas Hörnicke */ class ProcessIdProcessor implements ProcessorInterface { /** * @param array $record * @return array */ public function __invoke(array $record) { $record['extra']['process_id'] = \getmypid(); return $record; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/GitProcessor.php000064400000002627147600374260026063 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; use VendorDuplicator\Monolog\Logger; /** * Injects Git branch and Git commit SHA in all records * * @author Nick Otter * @author Jordi Boggiano */ class GitProcessor implements ProcessorInterface { private $level; private static $cache; public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['git'] = self::getGitInfo(); return $record; } private static function getGitInfo() { if (self::$cache) { return self::$cache; } $branches = `git branch -v --no-abbrev`; if ($branches && \preg_match('{^\\* (.+?)\\s+([a-f0-9]{40})(?:\\s|$)}m', $branches, $matches)) { return self::$cache = array('branch' => $matches[1], 'commit' => $matches[2]); } return self::$cache = array(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php000064400000003473147600374260026610 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * Some methods that are common for all memory processors * * @author Rob Jensen */ abstract class MemoryProcessor implements ProcessorInterface { /** * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported. */ protected $realUsage; /** * @var bool If true, then format memory size to human readable string (MB, KB, B depending on size) */ protected $useFormatting; /** * @param bool $realUsage Set this to true to get the real size of memory allocated from system. * @param bool $useFormatting If true, then format memory size to human readable string (MB, KB, B depending on size) */ public function __construct($realUsage = \true, $useFormatting = \true) { $this->realUsage = (bool) $realUsage; $this->useFormatting = (bool) $useFormatting; } /** * Formats bytes into a human readable string if $this->useFormatting is true, otherwise return $bytes as is * * @param int $bytes * @return string|int Formatted string if $this->useFormatting is true, otherwise return $bytes as is */ protected function formatBytes($bytes) { $bytes = (int) $bytes; if (!$this->useFormatting) { return $bytes; } if ($bytes > 1024 * 1024) { return \round($bytes / 1024 / 1024, 2) . ' MB'; } elseif ($bytes > 1024) { return \round($bytes / 1024, 2) . ' KB'; } return $bytes . ' B'; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php000064400000001031147600374260027224 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; /** * An optional interface to allow labelling Monolog processors. * * @author Nicolas Grekas */ interface ProcessorInterface { /** * @return array The processed records */ public function __invoke(array $records); } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php000064400000002560147600374260027257 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog\Processor; use VendorDuplicator\Monolog\Logger; /** * Injects Hg branch and Hg revision number in all records * * @author Jonathan A. Schweder */ class MercurialProcessor implements ProcessorInterface { private $level; private static $cache; public function __construct($level = Logger::DEBUG) { $this->level = Logger::toMonologLevel($level); } /** * @param array $record * @return array */ public function __invoke(array $record) { // return if the level is not high enough if ($record['level'] < $this->level) { return $record; } $record['extra']['hg'] = self::getMercurialInfo(); return $record; } private static function getMercurialInfo() { if (self::$cache) { return self::$cache; } $result = \explode(' ', \trim(`hg id -nb`)); if (\count($result) >= 3) { return self::$cache = array('branch' => $result[1], 'revision' => $result[2]); } return self::$cache = array(); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Registry.php000064400000007705147600374260023273 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; use InvalidArgumentException; /** * Monolog log registry * * Allows to get `Logger` instances in the global scope * via static method calls on this class. * * * $application = new Monolog\Logger('application'); * $api = new Monolog\Logger('api'); * * Monolog\Registry::addLogger($application); * Monolog\Registry::addLogger($api); * * function testLogger() * { * Monolog\Registry::api()->addError('Sent to $api Logger instance'); * Monolog\Registry::application()->addError('Sent to $application Logger instance'); * } * * * @author Tomas Tatarko */ class Registry { /** * List of all loggers in the registry (by named indexes) * * @var Logger[] */ private static $loggers = array(); /** * Adds new logging channel to the registry * * @param Logger $logger Instance of the logging channel * @param string|null $name Name of the logging channel ($logger->getName() by default) * @param bool $overwrite Overwrite instance in the registry if the given name already exists? * @throws \InvalidArgumentException If $overwrite set to false and named Logger instance already exists */ public static function addLogger(Logger $logger, $name = null, $overwrite = \false) { $name = $name ?: $logger->getName(); if (isset(self::$loggers[$name]) && !$overwrite) { throw new InvalidArgumentException('Logger with the given name already exists'); } self::$loggers[$name] = $logger; } /** * Checks if such logging channel exists by name or instance * * @param string|Logger $logger Name or logger instance */ public static function hasLogger($logger) { if ($logger instanceof Logger) { $index = \array_search($logger, self::$loggers, \true); return \false !== $index; } else { return isset(self::$loggers[$logger]); } } /** * Removes instance from registry by name or instance * * @param string|Logger $logger Name or logger instance */ public static function removeLogger($logger) { if ($logger instanceof Logger) { if (\false !== ($idx = \array_search($logger, self::$loggers, \true))) { unset(self::$loggers[$idx]); } } else { unset(self::$loggers[$logger]); } } /** * Clears the registry */ public static function clear() { self::$loggers = array(); } /** * Gets Logger instance from the registry * * @param string $name Name of the requested Logger instance * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function getInstance($name) { if (!isset(self::$loggers[$name])) { throw new InvalidArgumentException(\sprintf('Requested "%s" logger instance is not in the registry', $name)); } return self::$loggers[$name]; } /** * Gets Logger instance from the registry via static method call * * @param string $name Name of the requested Logger instance * @param array $arguments Arguments passed to static method call * @throws \InvalidArgumentException If named Logger instance is not in the registry * @return Logger Requested instance of Logger */ public static function __callStatic($name, $arguments) { return self::getInstance($name); } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Logger.php000064400000053261147600374260022700 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; use VendorDuplicator\Monolog\Handler\HandlerInterface; use VendorDuplicator\Monolog\Handler\StreamHandler; use VendorDuplicator\Psr\Log\LoggerInterface; use VendorDuplicator\Psr\Log\InvalidArgumentException; use Exception; /** * Monolog log channel * * It contains a stack of Handlers and a stack of Processors, * and uses them to store records that are added to it. * * @author Jordi Boggiano */ class Logger implements LoggerInterface, ResettableInterface { /** * Detailed debug information */ const DEBUG = 100; /** * Interesting events * * Examples: User logs in, SQL logs. */ const INFO = 200; /** * Uncommon events */ const NOTICE = 250; /** * Exceptional occurrences that are not errors * * Examples: Use of deprecated APIs, poor use of an API, * undesirable things that are not necessarily wrong. */ const WARNING = 300; /** * Runtime errors */ const ERROR = 400; /** * Critical conditions * * Example: Application component unavailable, unexpected exception. */ const CRITICAL = 500; /** * Action must be taken immediately * * Example: Entire website down, database unavailable, etc. * This should trigger the SMS alerts and wake you up. */ const ALERT = 550; /** * Urgent alert. */ const EMERGENCY = 600; /** * Monolog API version * * This is only bumped when API breaks are done and should * follow the major version of the library * * @var int */ const API = 1; /** * Logging levels from syslog protocol defined in RFC 5424 * * @var array $levels Logging levels */ protected static $levels = array(self::DEBUG => 'DEBUG', self::INFO => 'INFO', self::NOTICE => 'NOTICE', self::WARNING => 'WARNING', self::ERROR => 'ERROR', self::CRITICAL => 'CRITICAL', self::ALERT => 'ALERT', self::EMERGENCY => 'EMERGENCY'); /** * @var \DateTimeZone */ protected static $timezone; /** * @var string */ protected $name; /** * The handler stack * * @var HandlerInterface[] */ protected $handlers; /** * Processors that will process all log records * * To process records of a single handler instead, add the processor on that specific handler * * @var callable[] */ protected $processors; /** * @var bool */ protected $microsecondTimestamps = \true; /** * @var callable */ protected $exceptionHandler; /** * @param string $name The logging channel * @param HandlerInterface[] $handlers Optional stack of handlers, the first one in the array is called first, etc. * @param callable[] $processors Optional array of processors */ public function __construct($name, array $handlers = array(), array $processors = array()) { $this->name = $name; $this->setHandlers($handlers); $this->processors = $processors; } /** * @return string */ public function getName() { return $this->name; } /** * Return a new cloned instance with the name changed * * @return static */ public function withName($name) { $new = clone $this; $new->name = $name; return $new; } /** * Pushes a handler on to the stack. * * @param HandlerInterface $handler * @return $this */ public function pushHandler(HandlerInterface $handler) { \array_unshift($this->handlers, $handler); return $this; } /** * Pops a handler from the stack * * @return HandlerInterface */ public function popHandler() { if (!$this->handlers) { throw new \LogicException('You tried to pop from an empty handler stack.'); } return \array_shift($this->handlers); } /** * Set handlers, replacing all existing ones. * * If a map is passed, keys will be ignored. * * @param HandlerInterface[] $handlers * @return $this */ public function setHandlers(array $handlers) { $this->handlers = array(); foreach (\array_reverse($handlers) as $handler) { $this->pushHandler($handler); } return $this; } /** * @return HandlerInterface[] */ public function getHandlers() { return $this->handlers; } /** * Adds a processor on to the stack. * * @param callable $callback * @return $this */ public function pushProcessor($callback) { if (!\is_callable($callback)) { throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), ' . \var_export($callback, \true) . ' given'); } \array_unshift($this->processors, $callback); return $this; } /** * Removes the processor on top of the stack and returns it. * * @return callable */ public function popProcessor() { if (!$this->processors) { throw new \LogicException('You tried to pop from an empty processor stack.'); } return \array_shift($this->processors); } /** * @return callable[] */ public function getProcessors() { return $this->processors; } /** * Control the use of microsecond resolution timestamps in the 'datetime' * member of new records. * * Generating microsecond resolution timestamps by calling * microtime(true), formatting the result via sprintf() and then parsing * the resulting string via \DateTime::createFromFormat() can incur * a measurable runtime overhead vs simple usage of DateTime to capture * a second resolution timestamp in systems which generate a large number * of log events. * * @param bool $micro True to use microtime() to create timestamps */ public function useMicrosecondTimestamps($micro) { $this->microsecondTimestamps = (bool) $micro; } /** * Adds a log record. * * @param int $level The logging level * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addRecord($level, $message, array $context = array()) { if (!$this->handlers) { $this->pushHandler(new StreamHandler('php://stderr', static::DEBUG)); } $levelName = static::getLevelName($level); // check if any handler will handle this message so we can return early and save cycles $handlerKey = null; \reset($this->handlers); while ($handler = \current($this->handlers)) { if ($handler->isHandling(array('level' => $level))) { $handlerKey = \key($this->handlers); break; } \next($this->handlers); } if (null === $handlerKey) { return \false; } if (!static::$timezone) { static::$timezone = new \DateTimeZone(\date_default_timezone_get() ?: 'UTC'); } // php7.1+ always has microseconds enabled, so we do not need this hack if ($this->microsecondTimestamps && \PHP_VERSION_ID < 70100) { $ts = \DateTime::createFromFormat('U.u', \sprintf('%.6F', \microtime(\true)), static::$timezone); } else { $ts = new \DateTime('now', static::$timezone); } $ts->setTimezone(static::$timezone); $record = array('message' => (string) $message, 'context' => $context, 'level' => $level, 'level_name' => $levelName, 'channel' => $this->name, 'datetime' => $ts, 'extra' => array()); try { foreach ($this->processors as $processor) { $record = \call_user_func($processor, $record); } while ($handler = \current($this->handlers)) { if (\true === $handler->handle($record)) { break; } \next($this->handlers); } } catch (Exception $e) { $this->handleException($e, $record); } return \true; } /** * Ends a log cycle and frees all resources used by handlers. * * Closing a Handler means flushing all buffers and freeing any open resources/handles. * Handlers that have been closed should be able to accept log records again and re-open * themselves on demand, but this may not always be possible depending on implementation. * * This is useful at the end of a request and will be called automatically on every handler * when they get destructed. */ public function close() { foreach ($this->handlers as $handler) { if (\method_exists($handler, 'close')) { $handler->close(); } } } /** * Ends a log cycle and resets all handlers and processors to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. */ public function reset() { foreach ($this->handlers as $handler) { if ($handler instanceof ResettableInterface) { $handler->reset(); } } foreach ($this->processors as $processor) { if ($processor instanceof ResettableInterface) { $processor->reset(); } } } /** * Adds a log record at the DEBUG level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addDebug($message, array $context = array()) { return $this->addRecord(static::DEBUG, $message, $context); } /** * Adds a log record at the INFO level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addInfo($message, array $context = array()) { return $this->addRecord(static::INFO, $message, $context); } /** * Adds a log record at the NOTICE level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addNotice($message, array $context = array()) { return $this->addRecord(static::NOTICE, $message, $context); } /** * Adds a log record at the WARNING level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addWarning($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the ERROR level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addError($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the CRITICAL level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addCritical($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the ALERT level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addAlert($message, array $context = array()) { return $this->addRecord(static::ALERT, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function addEmergency($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Gets all supported logging levels. * * @return array Assoc array with human-readable level names => level codes. */ public static function getLevels() { return \array_flip(static::$levels); } /** * Gets the name of the logging level. * * @param int $level * @return string */ public static function getLevelName($level) { if (!isset(static::$levels[$level])) { throw new InvalidArgumentException('Level "' . $level . '" is not defined, use one of: ' . \implode(', ', \array_keys(static::$levels))); } return static::$levels[$level]; } /** * Converts PSR-3 levels to Monolog ones if necessary * * @param string|int $level Level number (monolog) or name (PSR-3) * @return int */ public static function toMonologLevel($level) { if (\is_string($level)) { // Contains chars of all log levels and avoids using strtoupper() which may have // strange results depending on locale (for example, "i" will become "Ä°") $upper = \strtr($level, 'abcdefgilmnortuwy', 'ABCDEFGILMNORTUWY'); if (\defined(__CLASS__ . '::' . $upper)) { return \constant(__CLASS__ . '::' . $upper); } } return $level; } /** * Checks whether the Logger has a handler that listens on the given level * * @param int $level * @return bool */ public function isHandling($level) { $record = array('level' => $level); foreach ($this->handlers as $handler) { if ($handler->isHandling($record)) { return \true; } } return \false; } /** * Set a custom exception handler * * @param callable $callback * @return $this */ public function setExceptionHandler($callback) { if (!\is_callable($callback)) { throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), ' . \var_export($callback, \true) . ' given'); } $this->exceptionHandler = $callback; return $this; } /** * @return callable */ public function getExceptionHandler() { return $this->exceptionHandler; } /** * Delegates exception management to the custom exception handler, * or throws the exception if no custom handler is set. */ protected function handleException(Exception $e, array $record) { if (!$this->exceptionHandler) { throw $e; } \call_user_func($this->exceptionHandler, $e, $record); } /** * Adds a log record at an arbitrary level. * * This method allows for compatibility with common interfaces. * * @param mixed $level The log level * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function log($level, $message, array $context = array()) { $level = static::toMonologLevel($level); return $this->addRecord($level, $message, $context); } /** * Adds a log record at the DEBUG level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function debug($message, array $context = array()) { return $this->addRecord(static::DEBUG, $message, $context); } /** * Adds a log record at the INFO level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function info($message, array $context = array()) { return $this->addRecord(static::INFO, $message, $context); } /** * Adds a log record at the NOTICE level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function notice($message, array $context = array()) { return $this->addRecord(static::NOTICE, $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function warn($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the WARNING level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function warning($message, array $context = array()) { return $this->addRecord(static::WARNING, $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function err($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the ERROR level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function error($message, array $context = array()) { return $this->addRecord(static::ERROR, $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function crit($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the CRITICAL level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function critical($message, array $context = array()) { return $this->addRecord(static::CRITICAL, $message, $context); } /** * Adds a log record at the ALERT level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function alert($message, array $context = array()) { return $this->addRecord(static::ALERT, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function emerg($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Adds a log record at the EMERGENCY level. * * This method allows for compatibility with common interfaces. * * @param string $message The log message * @param array $context The log context * @return bool Whether the record has been processed */ public function emergency($message, array $context = array()) { return $this->addRecord(static::EMERGENCY, $message, $context); } /** * Set the timezone to be used for the timestamp of log records. * * This is stored globally for all Logger instances * * @param \DateTimeZone $tz Timezone object */ public static function setTimezone(\DateTimeZone $tz) { self::$timezone = $tz; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/Utils.php000064400000014515147600374260022560 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; class Utils { /** * @internal */ public static function getClass($object) { $class = \get_class($object); return 'c' === $class[0] && 0 === \strpos($class, "class@anonymous\x00") ? \get_parent_class($class) . '@anonymous' : $class; } /** * Makes sure if a relative path is passed in it is turned into an absolute path * * @param string $streamUrl stream URL or path without protocol * * @return string */ public static function canonicalizePath($streamUrl) { $prefix = ''; if ('file://' === \substr($streamUrl, 0, 7)) { $streamUrl = \substr($streamUrl, 7); $prefix = 'file://'; } // other type of stream, not supported if (\false !== \strpos($streamUrl, '://')) { return $streamUrl; } // already absolute if (\substr($streamUrl, 0, 1) === '/' || \substr($streamUrl, 1, 1) === ':' || \substr($streamUrl, 0, 2) === '\\\\') { return $prefix . $streamUrl; } $streamUrl = \getcwd() . '/' . $streamUrl; return $prefix . $streamUrl; } /** * Return the JSON representation of a value * * @param mixed $data * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE * @param bool $ignoreErrors whether to ignore encoding errors or to throw on error, when ignored and the encoding fails, "null" is returned which is valid json for null * @throws \RuntimeException if encoding fails and errors are not ignored * @return string */ public static function jsonEncode($data, $encodeFlags = null, $ignoreErrors = \false) { if (null === $encodeFlags && \version_compare(\PHP_VERSION, '5.4.0', '>=')) { $encodeFlags = \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE; } if ($ignoreErrors) { $json = @\json_encode($data, $encodeFlags); if (\false === $json) { return 'null'; } return $json; } $json = \json_encode($data, $encodeFlags); if (\false === $json) { $json = self::handleJsonError(\json_last_error(), $data); } return $json; } /** * Handle a json_encode failure. * * If the failure is due to invalid string encoding, try to clean the * input and encode again. If the second encoding attempt fails, the * inital error is not encoding related or the input can't be cleaned then * raise a descriptive exception. * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @param int $encodeFlags flags to pass to json encode, defaults to JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE * @throws \RuntimeException if failure can't be corrected * @return string JSON encoded data after error correction */ public static function handleJsonError($code, $data, $encodeFlags = null) { if ($code !== \JSON_ERROR_UTF8) { self::throwEncodeError($code, $data); } if (\is_string($data)) { self::detectAndCleanUtf8($data); } elseif (\is_array($data)) { \array_walk_recursive($data, array('VendorDuplicator\\Monolog\\Utils', 'detectAndCleanUtf8')); } else { self::throwEncodeError($code, $data); } if (null === $encodeFlags && \version_compare(\PHP_VERSION, '5.4.0', '>=')) { $encodeFlags = \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE; } $json = \json_encode($data, $encodeFlags); if ($json === \false) { self::throwEncodeError(\json_last_error(), $data); } return $json; } /** * Throws an exception according to a given code with a customized message * * @param int $code return code of json_last_error function * @param mixed $data data that was meant to be encoded * @throws \RuntimeException */ private static function throwEncodeError($code, $data) { switch ($code) { case \JSON_ERROR_DEPTH: $msg = 'Maximum stack depth exceeded'; break; case \JSON_ERROR_STATE_MISMATCH: $msg = 'Underflow or the modes mismatch'; break; case \JSON_ERROR_CTRL_CHAR: $msg = 'Unexpected control character found'; break; case \JSON_ERROR_UTF8: $msg = 'Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: $msg = 'Unknown error'; } throw new \RuntimeException('JSON encoding failed: ' . $msg . '. Encoding: ' . \var_export($data, \true)); } /** * Detect invalid UTF-8 string characters and convert to valid UTF-8. * * Valid UTF-8 input will be left unmodified, but strings containing * invalid UTF-8 codepoints will be reencoded as UTF-8 with an assumed * original encoding of ISO-8859-15. This conversion may result in * incorrect output if the actual encoding was not ISO-8859-15, but it * will be clean UTF-8 output and will not rely on expensive and fragile * detection algorithms. * * Function converts the input in place in the passed variable so that it * can be used as a callback for array_walk_recursive. * * @param mixed $data Input to check and convert if needed, passed by ref * @private */ public static function detectAndCleanUtf8(&$data) { if (\is_string($data) && !\preg_match('//u', $data)) { $data = \preg_replace_callback('/[\\x80-\\xFF]+/', function ($m) { return \utf8_encode($m[0]); }, $data); $data = \str_replace(array('¤', '¦', '¨', '´', '¸', '¼', '½', '¾'), array('€', 'Å ', 'Å¡', 'Ž', 'ž', 'Å’', 'Å“', 'Ÿ'), $data); } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/ErrorHandler.php000064400000020277147600374260024051 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; use VendorDuplicator\Psr\Log\LoggerInterface; use VendorDuplicator\Psr\Log\LogLevel; use VendorDuplicator\Monolog\Handler\AbstractHandler; /** * Monolog error handler * * A facility to enable logging of runtime errors, exceptions and fatal errors. * * Quick setup: ErrorHandler::register($logger); * * @author Jordi Boggiano */ class ErrorHandler { private $logger; private $previousExceptionHandler; private $uncaughtExceptionLevel; private $previousErrorHandler; private $errorLevelMap; private $handleOnlyReportedErrors; private $hasFatalErrorHandler; private $fatalLevel; private $reservedMemory; private $lastFatalTrace; private static $fatalErrors = array(\E_ERROR, \E_PARSE, \E_CORE_ERROR, \E_COMPILE_ERROR, \E_USER_ERROR); public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * Registers a new ErrorHandler for a given Logger * * By default it will handle errors, exceptions and fatal errors * * @param LoggerInterface $logger * @param array|false $errorLevelMap an array of E_* constant to LogLevel::* constant mapping, or false to disable error handling * @param int|false $exceptionLevel a LogLevel::* constant, or false to disable exception handling * @param int|false $fatalLevel a LogLevel::* constant, or false to disable fatal error handling * @return ErrorHandler */ public static function register(LoggerInterface $logger, $errorLevelMap = array(), $exceptionLevel = null, $fatalLevel = null) { //Forces the autoloader to run for LogLevel. Fixes an autoload issue at compile-time on PHP5.3. See https://github.com/Seldaek/monolog/pull/929 \class_exists('VendorDuplicator\\Psr\\Log\\LogLevel', \true); /** @phpstan-ignore-next-line */ $handler = new static($logger); if ($errorLevelMap !== \false) { $handler->registerErrorHandler($errorLevelMap); } if ($exceptionLevel !== \false) { $handler->registerExceptionHandler($exceptionLevel); } if ($fatalLevel !== \false) { $handler->registerFatalHandler($fatalLevel); } return $handler; } public function registerExceptionHandler($level = null, $callPrevious = \true) { $prev = \set_exception_handler(array($this, 'handleException')); $this->uncaughtExceptionLevel = $level; if ($callPrevious && $prev) { $this->previousExceptionHandler = $prev; } } public function registerErrorHandler(array $levelMap = array(), $callPrevious = \true, $errorTypes = -1, $handleOnlyReportedErrors = \true) { $prev = \set_error_handler(array($this, 'handleError'), $errorTypes); $this->errorLevelMap = \array_replace($this->defaultErrorLevelMap(), $levelMap); if ($callPrevious) { $this->previousErrorHandler = $prev ?: \true; } $this->handleOnlyReportedErrors = $handleOnlyReportedErrors; } public function registerFatalHandler($level = null, $reservedMemorySize = 20) { \register_shutdown_function(array($this, 'handleFatalError')); $this->reservedMemory = \str_repeat(' ', 1024 * $reservedMemorySize); $this->fatalLevel = $level; $this->hasFatalErrorHandler = \true; } protected function defaultErrorLevelMap() { return array(\E_ERROR => LogLevel::CRITICAL, \E_WARNING => LogLevel::WARNING, \E_PARSE => LogLevel::ALERT, \E_NOTICE => LogLevel::NOTICE, \E_CORE_ERROR => LogLevel::CRITICAL, \E_CORE_WARNING => LogLevel::WARNING, \E_COMPILE_ERROR => LogLevel::ALERT, \E_COMPILE_WARNING => LogLevel::WARNING, \E_USER_ERROR => LogLevel::ERROR, \E_USER_WARNING => LogLevel::WARNING, \E_USER_NOTICE => LogLevel::NOTICE, \E_STRICT => LogLevel::NOTICE, \E_RECOVERABLE_ERROR => LogLevel::ERROR, \E_DEPRECATED => LogLevel::NOTICE, \E_USER_DEPRECATED => LogLevel::NOTICE); } /** * @private */ public function handleException($e) { $this->logger->log($this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel, \sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()), array('exception' => $e)); if ($this->previousExceptionHandler) { \call_user_func($this->previousExceptionHandler, $e); } exit(255); } /** * @private */ public function handleError($code, $message, $file = '', $line = 0, $context = array()) { if ($this->handleOnlyReportedErrors && !(\error_reporting() & $code)) { return; } // fatal error codes are ignored if a fatal error handler is present as well to avoid duplicate log entries if (!$this->hasFatalErrorHandler || !\in_array($code, self::$fatalErrors, \true)) { $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL; $this->logger->log($level, self::codeToString($code) . ': ' . $message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line)); } else { // http://php.net/manual/en/function.debug-backtrace.php // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added. // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'. $trace = \debug_backtrace(\PHP_VERSION_ID < 50306 ? 2 : \DEBUG_BACKTRACE_IGNORE_ARGS); \array_shift($trace); // Exclude handleError from trace $this->lastFatalTrace = $trace; } if ($this->previousErrorHandler === \true) { return \false; } elseif ($this->previousErrorHandler) { return \call_user_func($this->previousErrorHandler, $code, $message, $file, $line, $context); } } /** * @private */ public function handleFatalError() { $this->reservedMemory = null; $lastError = \error_get_last(); if ($lastError && \in_array($lastError['type'], self::$fatalErrors, \true)) { $this->logger->log($this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel, 'Fatal Error (' . self::codeToString($lastError['type']) . '): ' . $lastError['message'], array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace)); if ($this->logger instanceof Logger) { foreach ($this->logger->getHandlers() as $handler) { if ($handler instanceof AbstractHandler) { $handler->close(); } } } } } private static function codeToString($code) { switch ($code) { case \E_ERROR: return 'E_ERROR'; case \E_WARNING: return 'E_WARNING'; case \E_PARSE: return 'E_PARSE'; case \E_NOTICE: return 'E_NOTICE'; case \E_CORE_ERROR: return 'E_CORE_ERROR'; case \E_CORE_WARNING: return 'E_CORE_WARNING'; case \E_COMPILE_ERROR: return 'E_COMPILE_ERROR'; case \E_COMPILE_WARNING: return 'E_COMPILE_WARNING'; case \E_USER_ERROR: return 'E_USER_ERROR'; case \E_USER_WARNING: return 'E_USER_WARNING'; case \E_USER_NOTICE: return 'E_USER_NOTICE'; case \E_STRICT: return 'E_STRICT'; case \E_RECOVERABLE_ERROR: return 'E_RECOVERABLE_ERROR'; case \E_DEPRECATED: return 'E_DEPRECATED'; case \E_USER_DEPRECATED: return 'E_USER_DEPRECATED'; } return 'Unknown PHP error'; } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/SignalHandler.php000064400000010212147600374260024161 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; use VendorDuplicator\Psr\Log\LoggerInterface; use VendorDuplicator\Psr\Log\LogLevel; use ReflectionExtension; /** * Monolog POSIX signal handler * * @author Robert Gust-Bardon */ class SignalHandler { private $logger; private $previousSignalHandler = array(); private $signalLevelMap = array(); private $signalRestartSyscalls = array(); public function __construct(LoggerInterface $logger) { $this->logger = $logger; } public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = \true, $restartSyscalls = \true, $async = \true) { if (!\extension_loaded('pcntl') || !\function_exists('pcntl_signal')) { return $this; } if ($callPrevious) { if (\function_exists('pcntl_signal_get_handler')) { $handler = \pcntl_signal_get_handler($signo); if ($handler === \false) { return $this; } $this->previousSignalHandler[$signo] = $handler; } else { $this->previousSignalHandler[$signo] = \true; } } else { unset($this->previousSignalHandler[$signo]); } $this->signalLevelMap[$signo] = $level; $this->signalRestartSyscalls[$signo] = $restartSyscalls; if (\function_exists('pcntl_async_signals') && $async !== null) { \pcntl_async_signals($async); } \pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); return $this; } public function handleSignal($signo, array $siginfo = null) { static $signals = array(); if (!$signals && \extension_loaded('pcntl')) { $pcntl = new ReflectionExtension('pcntl'); $constants = $pcntl->getConstants(); if (!$constants) { // HHVM 3.24.2 returns an empty array. $constants = \get_defined_constants(\true); $constants = $constants['Core']; } foreach ($constants as $name => $value) { if (\substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && \is_int($value)) { $signals[$value] = $name; } } unset($constants); } $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL; $signal = isset($signals[$signo]) ? $signals[$signo] : $signo; $context = isset($siginfo) ? $siginfo : array(); $this->logger->log($level, \sprintf('Program received signal %s', $signal), $context); if (!isset($this->previousSignalHandler[$signo])) { return; } if ($this->previousSignalHandler[$signo] === \true || $this->previousSignalHandler[$signo] === \SIG_DFL) { if (\extension_loaded('pcntl') && \function_exists('pcntl_signal') && \function_exists('pcntl_sigprocmask') && \function_exists('pcntl_signal_dispatch') && \extension_loaded('posix') && \function_exists('posix_getpid') && \function_exists('posix_kill')) { $restartSyscalls = isset($this->signalRestartSyscalls[$signo]) ? $this->signalRestartSyscalls[$signo] : \true; \pcntl_signal($signo, \SIG_DFL, $restartSyscalls); \pcntl_sigprocmask(\SIG_UNBLOCK, array($signo), $oldset); \posix_kill(\posix_getpid(), $signo); \pcntl_signal_dispatch(); \pcntl_sigprocmask(\SIG_SETMASK, $oldset); \pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls); } } elseif (\is_callable($this->previousSignalHandler[$signo])) { if (\PHP_VERSION_ID >= 70100) { $this->previousSignalHandler[$signo]($signo, $siginfo); } else { $this->previousSignalHandler[$signo]($signo); } } } } addons/gdriveaddon/vendor-prefixed/monolog/monolog/src/Monolog/ResettableInterface.php000064400000001677147600374260025400 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Monolog; /** * Handler or Processor implementing this interface will be reset when Logger::reset() is called. * * Resetting ends a log cycle gets them back to their initial state. * * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal * state, and getting it back to a state in which it can receive log records again. * * This is useful in case you want to avoid logs leaking between two requests or jobs when you * have a long running process like a worker or an application server serving multiple requests * in one process. * * @author Grégoire Pineau */ interface ResettableInterface { public function reset(); } addons/gdriveaddon/vendor-prefixed/psr/cache/src/CacheItemPoolInterface.php000064400000010455147600374260023065 0ustar00 * [user-info@]host[:port] * * * If the port component is not set or is the standard port for the current * scheme, it SHOULD NOT be included. * * @see https://tools.ietf.org/html/rfc3986#section-3.2 * @return string The URI authority, in "[user-info@]host[:port]" format. */ public function getAuthority(); /** * Retrieve the user information component of the URI. * * If no user information is present, this method MUST return an empty * string. * * If a user is present in the URI, this will return that value; * additionally, if the password is also present, it will be appended to the * user value, with a colon (":") separating the values. * * The trailing "@" character is not part of the user information and MUST * NOT be added. * * @return string The URI user information, in "username[:password]" format. */ public function getUserInfo(); /** * Retrieve the host component of the URI. * * If no host is present, this method MUST return an empty string. * * The value returned MUST be normalized to lowercase, per RFC 3986 * Section 3.2.2. * * @see http://tools.ietf.org/html/rfc3986#section-3.2.2 * @return string The URI host. */ public function getHost(); /** * Retrieve the port component of the URI. * * If a port is present, and it is non-standard for the current scheme, * this method MUST return it as an integer. If the port is the standard port * used with the current scheme, this method SHOULD return null. * * If no port is present, and no scheme is present, this method MUST return * a null value. * * If no port is present, but a scheme is present, this method MAY return * the standard port for that scheme, but SHOULD return null. * * @return null|int The URI port. */ public function getPort(); /** * Retrieve the path component of the URI. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * Normally, the empty path "" and absolute path "/" are considered equal as * defined in RFC 7230 Section 2.7.3. But this method MUST NOT automatically * do this normalization because in contexts with a trimmed base path, e.g. * the front controller, this difference becomes significant. It's the task * of the user to handle both "" and "/". * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.3. * * As an example, if the value should include a slash ("/") not intended as * delimiter between path segments, that value MUST be passed in encoded * form (e.g., "%2F") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.3 * @return string The URI path. */ public function getPath(); /** * Retrieve the query string of the URI. * * If no query string is present, this method MUST return an empty string. * * The leading "?" character is not part of the query and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.4. * * As an example, if a value in a key/value pair of the query string should * include an ampersand ("&") not intended as a delimiter between values, * that value MUST be passed in encoded form (e.g., "%26") to the instance. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.4 * @return string The URI query string. */ public function getQuery(); /** * Retrieve the fragment component of the URI. * * If no fragment is present, this method MUST return an empty string. * * The leading "#" character is not part of the fragment and MUST NOT be * added. * * The value returned MUST be percent-encoded, but MUST NOT double-encode * any characters. To determine what characters to encode, please refer to * RFC 3986, Sections 2 and 3.5. * * @see https://tools.ietf.org/html/rfc3986#section-2 * @see https://tools.ietf.org/html/rfc3986#section-3.5 * @return string The URI fragment. */ public function getFragment(); /** * Return an instance with the specified scheme. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified scheme. * * Implementations MUST support the schemes "http" and "https" case * insensitively, and MAY accommodate other schemes if required. * * An empty scheme is equivalent to removing the scheme. * * @param string $scheme The scheme to use with the new instance. * @return static A new instance with the specified scheme. * @throws \InvalidArgumentException for invalid or unsupported schemes. */ public function withScheme($scheme); /** * Return an instance with the specified user information. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified user information. * * Password is optional, but the user information MUST include the * user; an empty string for the user is equivalent to removing user * information. * * @param string $user The user name to use for authority. * @param null|string $password The password associated with $user. * @return static A new instance with the specified user information. */ public function withUserInfo($user, $password = null); /** * Return an instance with the specified host. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified host. * * An empty host value is equivalent to removing the host. * * @param string $host The hostname to use with the new instance. * @return static A new instance with the specified host. * @throws \InvalidArgumentException for invalid hostnames. */ public function withHost($host); /** * Return an instance with the specified port. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified port. * * Implementations MUST raise an exception for ports outside the * established TCP and UDP port ranges. * * A null value provided for the port is equivalent to removing the port * information. * * @param null|int $port The port to use with the new instance; a null value * removes the port information. * @return static A new instance with the specified port. * @throws \InvalidArgumentException for invalid ports. */ public function withPort($port); /** * Return an instance with the specified path. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified path. * * The path can either be empty or absolute (starting with a slash) or * rootless (not starting with a slash). Implementations MUST support all * three syntaxes. * * If the path is intended to be domain-relative rather than path relative then * it must begin with a slash ("/"). Paths not starting with a slash ("/") * are assumed to be relative to some base path known to the application or * consumer. * * Users can provide both encoded and decoded path characters. * Implementations ensure the correct encoding as outlined in getPath(). * * @param string $path The path to use with the new instance. * @return static A new instance with the specified path. * @throws \InvalidArgumentException for invalid paths. */ public function withPath($path); /** * Return an instance with the specified query string. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified query string. * * Users can provide both encoded and decoded query characters. * Implementations ensure the correct encoding as outlined in getQuery(). * * An empty query string value is equivalent to removing the query string. * * @param string $query The query string to use with the new instance. * @return static A new instance with the specified query string. * @throws \InvalidArgumentException for invalid query strings. */ public function withQuery($query); /** * Return an instance with the specified URI fragment. * * This method MUST retain the state of the current instance, and return * an instance that contains the specified URI fragment. * * Users can provide both encoded and decoded fragment characters. * Implementations ensure the correct encoding as outlined in getFragment(). * * An empty fragment value is equivalent to removing the fragment. * * @param string $fragment The fragment to use with the new instance. * @return static A new instance with the specified fragment. */ public function withFragment($fragment); /** * Return the string representation as a URI reference. * * Depending on which components of the URI are present, the resulting * string is either a full URI or relative reference according to RFC 3986, * Section 4.1. The method concatenates the various components of the URI, * using the appropriate delimiters: * * - If a scheme is present, it MUST be suffixed by ":". * - If an authority is present, it MUST be prefixed by "//". * - The path can be concatenated without delimiters. But there are two * cases where the path has to be adjusted to make the URI reference * valid as PHP does not allow to throw an exception in __toString(): * - If the path is rootless and an authority is present, the path MUST * be prefixed by "/". * - If the path is starting with more than one "/" and no authority is * present, the starting slashes MUST be reduced to one. * - If a query is present, it MUST be prefixed by "?". * - If a fragment is present, it MUST be prefixed by "#". * * @see http://tools.ietf.org/html/rfc3986#section-4.1 * @return string */ public function __toString(); } addons/gdriveaddon/vendor-prefixed/psr/http-message/src/UploadedFileInterface.php000064400000011115147600374260024276 0ustar00getQuery()` * or from the `QUERY_STRING` server param. * * @return array */ public function getQueryParams(); /** * Return an instance with the specified query string arguments. * * These values SHOULD remain immutable over the course of the incoming * request. They MAY be injected during instantiation, such as from PHP's * $_GET superglobal, or MAY be derived from some other value such as the * URI. In cases where the arguments are parsed from the URI, the data * MUST be compatible with what PHP's parse_str() would return for * purposes of how duplicate query parameters are handled, and how nested * sets are handled. * * Setting query string arguments MUST NOT change the URI stored by the * request, nor the values in the server params. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated query string arguments. * * @param array $query Array of query string arguments, typically from * $_GET. * @return static */ public function withQueryParams(array $query); /** * Retrieve normalized file upload data. * * This method returns upload metadata in a normalized tree, with each leaf * an instance of Psr\Http\Message\UploadedFileInterface. * * These values MAY be prepared from $_FILES or the message body during * instantiation, or MAY be injected via withUploadedFiles(). * * @return array An array tree of UploadedFileInterface instances; an empty * array MUST be returned if no data is present. */ public function getUploadedFiles(); /** * Create a new instance with the specified uploaded files. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param array $uploadedFiles An array tree of UploadedFileInterface instances. * @return static * @throws \InvalidArgumentException if an invalid structure is provided. */ public function withUploadedFiles(array $uploadedFiles); /** * Retrieve any parameters provided in the request body. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, this method MUST * return the contents of $_POST. * * Otherwise, this method may return any results of deserializing * the request body content; as parsing returns structured content, the * potential types MUST be arrays or objects only. A null value indicates * the absence of body content. * * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); /** * Return an instance with the specified body parameters. * * These MAY be injected during instantiation. * * If the request Content-Type is either application/x-www-form-urlencoded * or multipart/form-data, and the request method is POST, use this method * ONLY to inject the contents of $_POST. * * The data IS NOT REQUIRED to come from $_POST, but MUST be the results of * deserializing the request body content. Deserialization/parsing returns * structured data, and, as such, this method ONLY accepts arrays or objects, * or a null value if nothing was available to parse. * * As an example, if content negotiation determines that the request data * is a JSON payload, this method could be used to create a request * instance with the deserialized parameters. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated body parameters. * * @param null|array|object $data The deserialized body data. This will * typically be in an array or object. * @return static * @throws \InvalidArgumentException if an unsupported argument type is * provided. */ public function withParsedBody($data); /** * Retrieve attributes derived from the request. * * The request "attributes" may be used to allow injection of any * parameters derived from the request: e.g., the results of path * match operations; the results of decrypting cookies; the results of * deserializing non-form-encoded message bodies; etc. Attributes * will be application and request specific, and CAN be mutable. * * @return array Attributes derived from the request. */ public function getAttributes(); /** * Retrieve a single derived request attribute. * * Retrieves a single derived request attribute as described in * getAttributes(). If the attribute has not been previously set, returns * the default value as provided. * * This method obviates the need for a hasAttribute() method, as it allows * specifying a default value to return if the attribute is not found. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $default Default value to return if the attribute does not exist. * @return mixed */ public function getAttribute($name, $default = null); /** * Return an instance with the specified derived request attribute. * * This method allows setting a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * updated attribute. * * @see getAttributes() * @param string $name The attribute name. * @param mixed $value The value of the attribute. * @return static */ public function withAttribute($name, $value); /** * Return an instance that removes the specified derived request attribute. * * This method allows removing a single derived request attribute as * described in getAttributes(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the attribute. * * @see getAttributes() * @param string $name The attribute name. * @return static */ public function withoutAttribute($name); } addons/gdriveaddon/vendor-prefixed/psr/http-message/src/MessageInterface.php000064400000015405147600374260023333 0ustar00getHeaders() as $name => $values) { * echo $name . ": " . implode(", ", $values); * } * * // Emit headers iteratively: * foreach ($message->getHeaders() as $name => $values) { * foreach ($values as $value) { * header(sprintf('%s: %s', $name, $value), false); * } * } * * While header names are not case-sensitive, getHeaders() will preserve the * exact case in which headers were originally specified. * * @return string[][] Returns an associative array of the message's headers. Each * key MUST be a header name, and each value MUST be an array of strings * for that header. */ public function getHeaders(); /** * Checks if a header exists by the given case-insensitive name. * * @param string $name Case-insensitive header field name. * @return bool Returns true if any header names match the given header * name using a case-insensitive string comparison. Returns false if * no matching header name is found in the message. */ public function hasHeader($name); /** * Retrieves a message header value by the given case-insensitive name. * * This method returns an array of all the header values of the given * case-insensitive header name. * * If the header does not appear in the message, this method MUST return an * empty array. * * @param string $name Case-insensitive header field name. * @return string[] An array of string values as provided for the given * header. If the header does not appear in the message, this method MUST * return an empty array. */ public function getHeader($name); /** * Retrieves a comma-separated string of the values for a single header. * * This method returns all of the header values of the given * case-insensitive header name as a string concatenated together using * a comma. * * NOTE: Not all header values may be appropriately represented using * comma concatenation. For such headers, use getHeader() instead * and supply your own delimiter when concatenating. * * If the header does not appear in the message, this method MUST return * an empty string. * * @param string $name Case-insensitive header field name. * @return string A string of values as provided for the given header * concatenated together using a comma. If the header does not appear in * the message, this method MUST return an empty string. */ public function getHeaderLine($name); /** * Return an instance with the provided value replacing the specified header. * * While header names are case-insensitive, the casing of the header will * be preserved by this function, and returned from getHeaders(). * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new and/or updated header and value. * * @param string $name Case-insensitive header field name. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withHeader($name, $value); /** * Return an instance with the specified header appended with the given value. * * Existing values for the specified header will be maintained. The new * value(s) will be appended to the existing list. If the header did not * exist previously, it will be added. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that has the * new header and/or value. * * @param string $name Case-insensitive header field name to add. * @param string|string[] $value Header value(s). * @return static * @throws \InvalidArgumentException for invalid header names or values. */ public function withAddedHeader($name, $value); /** * Return an instance without the specified header. * * Header resolution MUST be done without case-sensitivity. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return an instance that removes * the named header. * * @param string $name Case-insensitive header field name to remove. * @return static */ public function withoutHeader($name); /** * Gets the body of the message. * * @return StreamInterface Returns the body as a stream. */ public function getBody(); /** * Return an instance with the specified message body. * * The body MUST be a StreamInterface object. * * This method MUST be implemented in such a way as to retain the * immutability of the message, and MUST return a new instance that has the * new body stream. * * @param StreamInterface $body Body. * @return static * @throws \InvalidArgumentException When the body is not valid. */ public function withBody(StreamInterface $body); } addons/gdriveaddon/vendor-prefixed/psr/http-message/src/RequestInterface.php000064400000011333147600374260023373 0ustar00 ". * * Example ->error('Foo') would yield "error Foo". * * @return string[] */ public abstract function getLogs(); public function testImplements() { $this->assertInstanceOf('VendorDuplicator\\Psr\\Log\\LoggerInterface', $this->getLogger()); } /** * @dataProvider provideLevelsAndMessages */ public function testLogsAtAllLevels($level, $message) { $logger = $this->getLogger(); $logger->{$level}($message, array('user' => 'Bob')); $logger->log($level, $message, array('user' => 'Bob')); $expected = array($level . ' message of level ' . $level . ' with context: Bob', $level . ' message of level ' . $level . ' with context: Bob'); $this->assertEquals($expected, $this->getLogs()); } public function provideLevelsAndMessages() { return array(LogLevel::EMERGENCY => array(LogLevel::EMERGENCY, 'message of level emergency with context: {user}'), LogLevel::ALERT => array(LogLevel::ALERT, 'message of level alert with context: {user}'), LogLevel::CRITICAL => array(LogLevel::CRITICAL, 'message of level critical with context: {user}'), LogLevel::ERROR => array(LogLevel::ERROR, 'message of level error with context: {user}'), LogLevel::WARNING => array(LogLevel::WARNING, 'message of level warning with context: {user}'), LogLevel::NOTICE => array(LogLevel::NOTICE, 'message of level notice with context: {user}'), LogLevel::INFO => array(LogLevel::INFO, 'message of level info with context: {user}'), LogLevel::DEBUG => array(LogLevel::DEBUG, 'message of level debug with context: {user}')); } /** * @expectedException \Psr\Log\InvalidArgumentException */ public function testThrowsOnInvalidLevel() { $logger = $this->getLogger(); $logger->log('invalid level', 'Foo'); } public function testContextReplacement() { $logger = $this->getLogger(); $logger->info('{Message {nothing} {user} {foo.bar} a}', array('user' => 'Bob', 'foo.bar' => 'Bar')); $expected = array('info {Message {nothing} Bob Bar a}'); $this->assertEquals($expected, $this->getLogs()); } public function testObjectCastToString() { if (\method_exists($this, 'createPartialMock')) { $dummy = $this->createPartialMock('VendorDuplicator\\Psr\\Log\\Test\\DummyTest', array('__toString')); } else { $dummy = $this->getMock('VendorDuplicator\\Psr\\Log\\Test\\DummyTest', array('__toString')); } $dummy->expects($this->once())->method('__toString')->will($this->returnValue('DUMMY')); $this->getLogger()->warning($dummy); $expected = array('warning DUMMY'); $this->assertEquals($expected, $this->getLogs()); } public function testContextCanContainAnything() { $closed = \fopen('php://memory', 'r'); \fclose($closed); $context = array('bool' => \true, 'null' => null, 'string' => 'Foo', 'int' => 0, 'float' => 0.5, 'nested' => array('with object' => new DummyTest()), 'object' => new \DateTime(), 'resource' => \fopen('php://memory', 'r'), 'closed' => $closed); $this->getLogger()->warning('Crazy context data', $context); $expected = array('warning Crazy context data'); $this->assertEquals($expected, $this->getLogs()); } public function testContextExceptionKeyCanBeExceptionOrOtherValues() { $logger = $this->getLogger(); $logger->warning('Random message', array('exception' => 'oops')); $logger->critical('Uncaught Exception!', array('exception' => new \LogicException('Fail'))); $expected = array('warning Random message', 'critical Uncaught Exception!'); $this->assertEquals($expected, $this->getLogs()); } } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/Test/DummyTest.php000064400000000414147600374260021650 0ustar00 $level, 'message' => $message, 'context' => $context]; $this->recordsByLevel[$record['level']][] = $record; $this->records[] = $record; } public function hasRecords($level) { return isset($this->recordsByLevel[$level]); } public function hasRecord($record, $level) { if (\is_string($record)) { $record = ['message' => $record]; } return $this->hasRecordThatPasses(function ($rec) use($record) { if ($rec['message'] !== $record['message']) { return \false; } if (isset($record['context']) && $rec['context'] !== $record['context']) { return \false; } return \true; }, $level); } public function hasRecordThatContains($message, $level) { return $this->hasRecordThatPasses(function ($rec) use($message) { return \strpos($rec['message'], $message) !== \false; }, $level); } public function hasRecordThatMatches($regex, $level) { return $this->hasRecordThatPasses(function ($rec) use($regex) { return \preg_match($regex, $rec['message']) > 0; }, $level); } public function hasRecordThatPasses(callable $predicate, $level) { if (!isset($this->recordsByLevel[$level])) { return \false; } foreach ($this->recordsByLevel[$level] as $i => $rec) { if (\call_user_func($predicate, $rec, $i)) { return \true; } } return \false; } public function __call($method, $args) { if (\preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) { $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3]; $level = \strtolower($matches[2]); if (\method_exists($this, $genericMethod)) { $args[] = $level; return \call_user_func_array([$this, $genericMethod], $args); } } throw new \BadMethodCallException('Call to undefined method ' . \get_class($this) . '::' . $method . '()'); } public function reset() { $this->records = []; $this->recordsByLevel = []; } } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/LoggerAwareTrait.php000064400000000642147600374260022204 0ustar00logger = $logger; } } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/AbstractLogger.php000064400000006052147600374260021705 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param mixed[] $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param mixed[] $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param mixed[] $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param mixed[] $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param mixed[] $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param mixed[] $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param mixed[] $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/NullLogger.php000064400000001345147600374260021054 0ustar00logger) { }` * blocks. */ class NullLogger extends AbstractLogger { /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \VendorDuplicator\Psr\Log\InvalidArgumentException */ public function log($level, $message, array $context = array()) { // noop } } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/LoggerTrait.php000064400000006561147600374260021232 0ustar00log(LogLevel::EMERGENCY, $message, $context); } /** * Action must be taken immediately. * * Example: Entire website down, database unavailable, etc. This should * trigger the SMS alerts and wake you up. * * @param string $message * @param array $context * * @return void */ public function alert($message, array $context = array()) { $this->log(LogLevel::ALERT, $message, $context); } /** * Critical conditions. * * Example: Application component unavailable, unexpected exception. * * @param string $message * @param array $context * * @return void */ public function critical($message, array $context = array()) { $this->log(LogLevel::CRITICAL, $message, $context); } /** * Runtime errors that do not require immediate action but should typically * be logged and monitored. * * @param string $message * @param array $context * * @return void */ public function error($message, array $context = array()) { $this->log(LogLevel::ERROR, $message, $context); } /** * Exceptional occurrences that are not errors. * * Example: Use of deprecated APIs, poor use of an API, undesirable things * that are not necessarily wrong. * * @param string $message * @param array $context * * @return void */ public function warning($message, array $context = array()) { $this->log(LogLevel::WARNING, $message, $context); } /** * Normal but significant events. * * @param string $message * @param array $context * * @return void */ public function notice($message, array $context = array()) { $this->log(LogLevel::NOTICE, $message, $context); } /** * Interesting events. * * Example: User logs in, SQL logs. * * @param string $message * @param array $context * * @return void */ public function info($message, array $context = array()) { $this->log(LogLevel::INFO, $message, $context); } /** * Detailed debug information. * * @param string $message * @param array $context * * @return void */ public function debug($message, array $context = array()) { $this->log(LogLevel::DEBUG, $message, $context); } /** * Logs with an arbitrary level. * * @param mixed $level * @param string $message * @param array $context * * @return void * * @throws \VendorDuplicator\Psr\Log\InvalidArgumentException */ public abstract function log($level, $message, array $context = array()); } addons/gdriveaddon/vendor-prefixed/psr/log/Psr/Log/InvalidArgumentException.php000064400000000161147600374260023745 0ustar00 'Content-Type', 'CONTENT_LENGTH' => 'Content-Length', 'CONTENT_MD5' => 'Content-Md5'); foreach ($_SERVER as $key => $value) { if (\substr($key, 0, 5) === 'HTTP_') { $key = \substr($key, 5); if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) { $key = \str_replace(' ', '-', \ucwords(\strtolower(\str_replace('_', ' ', $key)))); $headers[$key] = $value; } } elseif (isset($copy_server[$key])) { $headers[$copy_server[$key]] = $value; } } if (!isset($headers['Authorization'])) { if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) { $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION']; } elseif (isset($_SERVER['PHP_AUTH_USER'])) { $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : ''; $headers['Authorization'] = 'Basic ' . \base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass); } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) { $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST']; } } return $headers; } } gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php000064400000001632147600374260030624 0ustar00addons \true, 1 => \true, 2 => \true, 3 => \true, 4 => \true, 5 => \true, 6 => \true, 7 => \true, 8 => \true, 9 => \true, 10 => \true, 11 => \true, 12 => \true, 13 => \true, 14 => \true, 15 => \true, 16 => \true, 17 => \true, 18 => \true, 19 => \true, 20 => \true, 21 => \true, 22 => \true, 23 => \true, 24 => \true, 25 => \true, 26 => \true, 27 => \true, 28 => \true, 29 => \true, 30 => \true, 31 => \true, 32 => \true, 33 => \true, 34 => \true, 35 => \true, 36 => \true, 37 => \true, 38 => \true, 39 => \true, 40 => \true, 41 => \true, 42 => \true, 43 => \true, 44 => \true, 47 => \true, 58 => \true, 59 => \true, 60 => \true, 61 => \true, 62 => \true, 63 => \true, 64 => \true, 91 => \true, 92 => \true, 93 => \true, 94 => \true, 95 => \true, 96 => \true, 123 => \true, 124 => \true, 125 => \true, 126 => \true, 127 => \true, 8800 => \true, 8814 => \true, 8815 => \true); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php000064400000121633147600374260026733 0ustar00 \true, 889 => \true, 896 => \true, 897 => \true, 898 => \true, 899 => \true, 907 => \true, 909 => \true, 930 => \true, 1216 => \true, 1328 => \true, 1367 => \true, 1368 => \true, 1419 => \true, 1420 => \true, 1424 => \true, 1480 => \true, 1481 => \true, 1482 => \true, 1483 => \true, 1484 => \true, 1485 => \true, 1486 => \true, 1487 => \true, 1515 => \true, 1516 => \true, 1517 => \true, 1518 => \true, 1525 => \true, 1526 => \true, 1527 => \true, 1528 => \true, 1529 => \true, 1530 => \true, 1531 => \true, 1532 => \true, 1533 => \true, 1534 => \true, 1535 => \true, 1536 => \true, 1537 => \true, 1538 => \true, 1539 => \true, 1540 => \true, 1541 => \true, 1564 => \true, 1565 => \true, 1757 => \true, 1806 => \true, 1807 => \true, 1867 => \true, 1868 => \true, 1970 => \true, 1971 => \true, 1972 => \true, 1973 => \true, 1974 => \true, 1975 => \true, 1976 => \true, 1977 => \true, 1978 => \true, 1979 => \true, 1980 => \true, 1981 => \true, 1982 => \true, 1983 => \true, 2043 => \true, 2044 => \true, 2094 => \true, 2095 => \true, 2111 => \true, 2140 => \true, 2141 => \true, 2143 => \true, 2229 => \true, 2248 => \true, 2249 => \true, 2250 => \true, 2251 => \true, 2252 => \true, 2253 => \true, 2254 => \true, 2255 => \true, 2256 => \true, 2257 => \true, 2258 => \true, 2274 => \true, 2436 => \true, 2445 => \true, 2446 => \true, 2449 => \true, 2450 => \true, 2473 => \true, 2481 => \true, 2483 => \true, 2484 => \true, 2485 => \true, 2490 => \true, 2491 => \true, 2501 => \true, 2502 => \true, 2505 => \true, 2506 => \true, 2511 => \true, 2512 => \true, 2513 => \true, 2514 => \true, 2515 => \true, 2516 => \true, 2517 => \true, 2518 => \true, 2520 => \true, 2521 => \true, 2522 => \true, 2523 => \true, 2526 => \true, 2532 => \true, 2533 => \true, 2559 => \true, 2560 => \true, 2564 => \true, 2571 => \true, 2572 => \true, 2573 => \true, 2574 => \true, 2577 => \true, 2578 => \true, 2601 => \true, 2609 => \true, 2612 => \true, 2615 => \true, 2618 => \true, 2619 => \true, 2621 => \true, 2627 => \true, 2628 => \true, 2629 => \true, 2630 => \true, 2633 => \true, 2634 => \true, 2638 => \true, 2639 => \true, 2640 => \true, 2642 => \true, 2643 => \true, 2644 => \true, 2645 => \true, 2646 => \true, 2647 => \true, 2648 => \true, 2653 => \true, 2655 => \true, 2656 => \true, 2657 => \true, 2658 => \true, 2659 => \true, 2660 => \true, 2661 => \true, 2679 => \true, 2680 => \true, 2681 => \true, 2682 => \true, 2683 => \true, 2684 => \true, 2685 => \true, 2686 => \true, 2687 => \true, 2688 => \true, 2692 => \true, 2702 => \true, 2706 => \true, 2729 => \true, 2737 => \true, 2740 => \true, 2746 => \true, 2747 => \true, 2758 => \true, 2762 => \true, 2766 => \true, 2767 => \true, 2769 => \true, 2770 => \true, 2771 => \true, 2772 => \true, 2773 => \true, 2774 => \true, 2775 => \true, 2776 => \true, 2777 => \true, 2778 => \true, 2779 => \true, 2780 => \true, 2781 => \true, 2782 => \true, 2783 => \true, 2788 => \true, 2789 => \true, 2802 => \true, 2803 => \true, 2804 => \true, 2805 => \true, 2806 => \true, 2807 => \true, 2808 => \true, 2816 => \true, 2820 => \true, 2829 => \true, 2830 => \true, 2833 => \true, 2834 => \true, 2857 => \true, 2865 => \true, 2868 => \true, 2874 => \true, 2875 => \true, 2885 => \true, 2886 => \true, 2889 => \true, 2890 => \true, 2894 => \true, 2895 => \true, 2896 => \true, 2897 => \true, 2898 => \true, 2899 => \true, 2900 => \true, 2904 => \true, 2905 => \true, 2906 => \true, 2907 => \true, 2910 => \true, 2916 => \true, 2917 => \true, 2936 => \true, 2937 => \true, 2938 => \true, 2939 => \true, 2940 => \true, 2941 => \true, 2942 => \true, 2943 => \true, 2944 => \true, 2945 => \true, 2948 => \true, 2955 => \true, 2956 => \true, 2957 => \true, 2961 => \true, 2966 => \true, 2967 => \true, 2968 => \true, 2971 => \true, 2973 => \true, 2976 => \true, 2977 => \true, 2978 => \true, 2981 => \true, 2982 => \true, 2983 => \true, 2987 => \true, 2988 => \true, 2989 => \true, 3002 => \true, 3003 => \true, 3004 => \true, 3005 => \true, 3011 => \true, 3012 => \true, 3013 => \true, 3017 => \true, 3022 => \true, 3023 => \true, 3025 => \true, 3026 => \true, 3027 => \true, 3028 => \true, 3029 => \true, 3030 => \true, 3032 => \true, 3033 => \true, 3034 => \true, 3035 => \true, 3036 => \true, 3037 => \true, 3038 => \true, 3039 => \true, 3040 => \true, 3041 => \true, 3042 => \true, 3043 => \true, 3044 => \true, 3045 => \true, 3067 => \true, 3068 => \true, 3069 => \true, 3070 => \true, 3071 => \true, 3085 => \true, 3089 => \true, 3113 => \true, 3130 => \true, 3131 => \true, 3132 => \true, 3141 => \true, 3145 => \true, 3150 => \true, 3151 => \true, 3152 => \true, 3153 => \true, 3154 => \true, 3155 => \true, 3156 => \true, 3159 => \true, 3163 => \true, 3164 => \true, 3165 => \true, 3166 => \true, 3167 => \true, 3172 => \true, 3173 => \true, 3184 => \true, 3185 => \true, 3186 => \true, 3187 => \true, 3188 => \true, 3189 => \true, 3190 => \true, 3213 => \true, 3217 => \true, 3241 => \true, 3252 => \true, 3258 => \true, 3259 => \true, 3269 => \true, 3273 => \true, 3278 => \true, 3279 => \true, 3280 => \true, 3281 => \true, 3282 => \true, 3283 => \true, 3284 => \true, 3287 => \true, 3288 => \true, 3289 => \true, 3290 => \true, 3291 => \true, 3292 => \true, 3293 => \true, 3295 => \true, 3300 => \true, 3301 => \true, 3312 => \true, 3315 => \true, 3316 => \true, 3317 => \true, 3318 => \true, 3319 => \true, 3320 => \true, 3321 => \true, 3322 => \true, 3323 => \true, 3324 => \true, 3325 => \true, 3326 => \true, 3327 => \true, 3341 => \true, 3345 => \true, 3397 => \true, 3401 => \true, 3408 => \true, 3409 => \true, 3410 => \true, 3411 => \true, 3428 => \true, 3429 => \true, 3456 => \true, 3460 => \true, 3479 => \true, 3480 => \true, 3481 => \true, 3506 => \true, 3516 => \true, 3518 => \true, 3519 => \true, 3527 => \true, 3528 => \true, 3529 => \true, 3531 => \true, 3532 => \true, 3533 => \true, 3534 => \true, 3541 => \true, 3543 => \true, 3552 => \true, 3553 => \true, 3554 => \true, 3555 => \true, 3556 => \true, 3557 => \true, 3568 => \true, 3569 => \true, 3573 => \true, 3574 => \true, 3575 => \true, 3576 => \true, 3577 => \true, 3578 => \true, 3579 => \true, 3580 => \true, 3581 => \true, 3582 => \true, 3583 => \true, 3584 => \true, 3643 => \true, 3644 => \true, 3645 => \true, 3646 => \true, 3715 => \true, 3717 => \true, 3723 => \true, 3748 => \true, 3750 => \true, 3774 => \true, 3775 => \true, 3781 => \true, 3783 => \true, 3790 => \true, 3791 => \true, 3802 => \true, 3803 => \true, 3912 => \true, 3949 => \true, 3950 => \true, 3951 => \true, 3952 => \true, 3992 => \true, 4029 => \true, 4045 => \true, 4294 => \true, 4296 => \true, 4297 => \true, 4298 => \true, 4299 => \true, 4300 => \true, 4302 => \true, 4303 => \true, 4447 => \true, 4448 => \true, 4681 => \true, 4686 => \true, 4687 => \true, 4695 => \true, 4697 => \true, 4702 => \true, 4703 => \true, 4745 => \true, 4750 => \true, 4751 => \true, 4785 => \true, 4790 => \true, 4791 => \true, 4799 => \true, 4801 => \true, 4806 => \true, 4807 => \true, 4823 => \true, 4881 => \true, 4886 => \true, 4887 => \true, 4955 => \true, 4956 => \true, 4989 => \true, 4990 => \true, 4991 => \true, 5018 => \true, 5019 => \true, 5020 => \true, 5021 => \true, 5022 => \true, 5023 => \true, 5110 => \true, 5111 => \true, 5118 => \true, 5119 => \true, 5760 => \true, 5789 => \true, 5790 => \true, 5791 => \true, 5881 => \true, 5882 => \true, 5883 => \true, 5884 => \true, 5885 => \true, 5886 => \true, 5887 => \true, 5901 => \true, 5909 => \true, 5910 => \true, 5911 => \true, 5912 => \true, 5913 => \true, 5914 => \true, 5915 => \true, 5916 => \true, 5917 => \true, 5918 => \true, 5919 => \true, 5943 => \true, 5944 => \true, 5945 => \true, 5946 => \true, 5947 => \true, 5948 => \true, 5949 => \true, 5950 => \true, 5951 => \true, 5972 => \true, 5973 => \true, 5974 => \true, 5975 => \true, 5976 => \true, 5977 => \true, 5978 => \true, 5979 => \true, 5980 => \true, 5981 => \true, 5982 => \true, 5983 => \true, 5997 => \true, 6001 => \true, 6004 => \true, 6005 => \true, 6006 => \true, 6007 => \true, 6008 => \true, 6009 => \true, 6010 => \true, 6011 => \true, 6012 => \true, 6013 => \true, 6014 => \true, 6015 => \true, 6068 => \true, 6069 => \true, 6110 => \true, 6111 => \true, 6122 => \true, 6123 => \true, 6124 => \true, 6125 => \true, 6126 => \true, 6127 => \true, 6138 => \true, 6139 => \true, 6140 => \true, 6141 => \true, 6142 => \true, 6143 => \true, 6150 => \true, 6158 => \true, 6159 => \true, 6170 => \true, 6171 => \true, 6172 => \true, 6173 => \true, 6174 => \true, 6175 => \true, 6265 => \true, 6266 => \true, 6267 => \true, 6268 => \true, 6269 => \true, 6270 => \true, 6271 => \true, 6315 => \true, 6316 => \true, 6317 => \true, 6318 => \true, 6319 => \true, 6390 => \true, 6391 => \true, 6392 => \true, 6393 => \true, 6394 => \true, 6395 => \true, 6396 => \true, 6397 => \true, 6398 => \true, 6399 => \true, 6431 => \true, 6444 => \true, 6445 => \true, 6446 => \true, 6447 => \true, 6460 => \true, 6461 => \true, 6462 => \true, 6463 => \true, 6465 => \true, 6466 => \true, 6467 => \true, 6510 => \true, 6511 => \true, 6517 => \true, 6518 => \true, 6519 => \true, 6520 => \true, 6521 => \true, 6522 => \true, 6523 => \true, 6524 => \true, 6525 => \true, 6526 => \true, 6527 => \true, 6572 => \true, 6573 => \true, 6574 => \true, 6575 => \true, 6602 => \true, 6603 => \true, 6604 => \true, 6605 => \true, 6606 => \true, 6607 => \true, 6619 => \true, 6620 => \true, 6621 => \true, 6684 => \true, 6685 => \true, 6751 => \true, 6781 => \true, 6782 => \true, 6794 => \true, 6795 => \true, 6796 => \true, 6797 => \true, 6798 => \true, 6799 => \true, 6810 => \true, 6811 => \true, 6812 => \true, 6813 => \true, 6814 => \true, 6815 => \true, 6830 => \true, 6831 => \true, 6988 => \true, 6989 => \true, 6990 => \true, 6991 => \true, 7037 => \true, 7038 => \true, 7039 => \true, 7156 => \true, 7157 => \true, 7158 => \true, 7159 => \true, 7160 => \true, 7161 => \true, 7162 => \true, 7163 => \true, 7224 => \true, 7225 => \true, 7226 => \true, 7242 => \true, 7243 => \true, 7244 => \true, 7305 => \true, 7306 => \true, 7307 => \true, 7308 => \true, 7309 => \true, 7310 => \true, 7311 => \true, 7355 => \true, 7356 => \true, 7368 => \true, 7369 => \true, 7370 => \true, 7371 => \true, 7372 => \true, 7373 => \true, 7374 => \true, 7375 => \true, 7419 => \true, 7420 => \true, 7421 => \true, 7422 => \true, 7423 => \true, 7674 => \true, 7958 => \true, 7959 => \true, 7966 => \true, 7967 => \true, 8006 => \true, 8007 => \true, 8014 => \true, 8015 => \true, 8024 => \true, 8026 => \true, 8028 => \true, 8030 => \true, 8062 => \true, 8063 => \true, 8117 => \true, 8133 => \true, 8148 => \true, 8149 => \true, 8156 => \true, 8176 => \true, 8177 => \true, 8181 => \true, 8191 => \true, 8206 => \true, 8207 => \true, 8228 => \true, 8229 => \true, 8230 => \true, 8232 => \true, 8233 => \true, 8234 => \true, 8235 => \true, 8236 => \true, 8237 => \true, 8238 => \true, 8289 => \true, 8290 => \true, 8291 => \true, 8293 => \true, 8294 => \true, 8295 => \true, 8296 => \true, 8297 => \true, 8298 => \true, 8299 => \true, 8300 => \true, 8301 => \true, 8302 => \true, 8303 => \true, 8306 => \true, 8307 => \true, 8335 => \true, 8349 => \true, 8350 => \true, 8351 => \true, 8384 => \true, 8385 => \true, 8386 => \true, 8387 => \true, 8388 => \true, 8389 => \true, 8390 => \true, 8391 => \true, 8392 => \true, 8393 => \true, 8394 => \true, 8395 => \true, 8396 => \true, 8397 => \true, 8398 => \true, 8399 => \true, 8433 => \true, 8434 => \true, 8435 => \true, 8436 => \true, 8437 => \true, 8438 => \true, 8439 => \true, 8440 => \true, 8441 => \true, 8442 => \true, 8443 => \true, 8444 => \true, 8445 => \true, 8446 => \true, 8447 => \true, 8498 => \true, 8579 => \true, 8588 => \true, 8589 => \true, 8590 => \true, 8591 => \true, 9255 => \true, 9256 => \true, 9257 => \true, 9258 => \true, 9259 => \true, 9260 => \true, 9261 => \true, 9262 => \true, 9263 => \true, 9264 => \true, 9265 => \true, 9266 => \true, 9267 => \true, 9268 => \true, 9269 => \true, 9270 => \true, 9271 => \true, 9272 => \true, 9273 => \true, 9274 => \true, 9275 => \true, 9276 => \true, 9277 => \true, 9278 => \true, 9279 => \true, 9291 => \true, 9292 => \true, 9293 => \true, 9294 => \true, 9295 => \true, 9296 => \true, 9297 => \true, 9298 => \true, 9299 => \true, 9300 => \true, 9301 => \true, 9302 => \true, 9303 => \true, 9304 => \true, 9305 => \true, 9306 => \true, 9307 => \true, 9308 => \true, 9309 => \true, 9310 => \true, 9311 => \true, 9352 => \true, 9353 => \true, 9354 => \true, 9355 => \true, 9356 => \true, 9357 => \true, 9358 => \true, 9359 => \true, 9360 => \true, 9361 => \true, 9362 => \true, 9363 => \true, 9364 => \true, 9365 => \true, 9366 => \true, 9367 => \true, 9368 => \true, 9369 => \true, 9370 => \true, 9371 => \true, 11124 => \true, 11125 => \true, 11158 => \true, 11311 => \true, 11359 => \true, 11508 => \true, 11509 => \true, 11510 => \true, 11511 => \true, 11512 => \true, 11558 => \true, 11560 => \true, 11561 => \true, 11562 => \true, 11563 => \true, 11564 => \true, 11566 => \true, 11567 => \true, 11624 => \true, 11625 => \true, 11626 => \true, 11627 => \true, 11628 => \true, 11629 => \true, 11630 => \true, 11633 => \true, 11634 => \true, 11635 => \true, 11636 => \true, 11637 => \true, 11638 => \true, 11639 => \true, 11640 => \true, 11641 => \true, 11642 => \true, 11643 => \true, 11644 => \true, 11645 => \true, 11646 => \true, 11671 => \true, 11672 => \true, 11673 => \true, 11674 => \true, 11675 => \true, 11676 => \true, 11677 => \true, 11678 => \true, 11679 => \true, 11687 => \true, 11695 => \true, 11703 => \true, 11711 => \true, 11719 => \true, 11727 => \true, 11735 => \true, 11743 => \true, 11930 => \true, 12020 => \true, 12021 => \true, 12022 => \true, 12023 => \true, 12024 => \true, 12025 => \true, 12026 => \true, 12027 => \true, 12028 => \true, 12029 => \true, 12030 => \true, 12031 => \true, 12246 => \true, 12247 => \true, 12248 => \true, 12249 => \true, 12250 => \true, 12251 => \true, 12252 => \true, 12253 => \true, 12254 => \true, 12255 => \true, 12256 => \true, 12257 => \true, 12258 => \true, 12259 => \true, 12260 => \true, 12261 => \true, 12262 => \true, 12263 => \true, 12264 => \true, 12265 => \true, 12266 => \true, 12267 => \true, 12268 => \true, 12269 => \true, 12270 => \true, 12271 => \true, 12272 => \true, 12273 => \true, 12274 => \true, 12275 => \true, 12276 => \true, 12277 => \true, 12278 => \true, 12279 => \true, 12280 => \true, 12281 => \true, 12282 => \true, 12283 => \true, 12284 => \true, 12285 => \true, 12286 => \true, 12287 => \true, 12352 => \true, 12439 => \true, 12440 => \true, 12544 => \true, 12545 => \true, 12546 => \true, 12547 => \true, 12548 => \true, 12592 => \true, 12644 => \true, 12687 => \true, 12772 => \true, 12773 => \true, 12774 => \true, 12775 => \true, 12776 => \true, 12777 => \true, 12778 => \true, 12779 => \true, 12780 => \true, 12781 => \true, 12782 => \true, 12783 => \true, 12831 => \true, 13250 => \true, 13255 => \true, 13272 => \true, 40957 => \true, 40958 => \true, 40959 => \true, 42125 => \true, 42126 => \true, 42127 => \true, 42183 => \true, 42184 => \true, 42185 => \true, 42186 => \true, 42187 => \true, 42188 => \true, 42189 => \true, 42190 => \true, 42191 => \true, 42540 => \true, 42541 => \true, 42542 => \true, 42543 => \true, 42544 => \true, 42545 => \true, 42546 => \true, 42547 => \true, 42548 => \true, 42549 => \true, 42550 => \true, 42551 => \true, 42552 => \true, 42553 => \true, 42554 => \true, 42555 => \true, 42556 => \true, 42557 => \true, 42558 => \true, 42559 => \true, 42744 => \true, 42745 => \true, 42746 => \true, 42747 => \true, 42748 => \true, 42749 => \true, 42750 => \true, 42751 => \true, 42944 => \true, 42945 => \true, 43053 => \true, 43054 => \true, 43055 => \true, 43066 => \true, 43067 => \true, 43068 => \true, 43069 => \true, 43070 => \true, 43071 => \true, 43128 => \true, 43129 => \true, 43130 => \true, 43131 => \true, 43132 => \true, 43133 => \true, 43134 => \true, 43135 => \true, 43206 => \true, 43207 => \true, 43208 => \true, 43209 => \true, 43210 => \true, 43211 => \true, 43212 => \true, 43213 => \true, 43226 => \true, 43227 => \true, 43228 => \true, 43229 => \true, 43230 => \true, 43231 => \true, 43348 => \true, 43349 => \true, 43350 => \true, 43351 => \true, 43352 => \true, 43353 => \true, 43354 => \true, 43355 => \true, 43356 => \true, 43357 => \true, 43358 => \true, 43389 => \true, 43390 => \true, 43391 => \true, 43470 => \true, 43482 => \true, 43483 => \true, 43484 => \true, 43485 => \true, 43519 => \true, 43575 => \true, 43576 => \true, 43577 => \true, 43578 => \true, 43579 => \true, 43580 => \true, 43581 => \true, 43582 => \true, 43583 => \true, 43598 => \true, 43599 => \true, 43610 => \true, 43611 => \true, 43715 => \true, 43716 => \true, 43717 => \true, 43718 => \true, 43719 => \true, 43720 => \true, 43721 => \true, 43722 => \true, 43723 => \true, 43724 => \true, 43725 => \true, 43726 => \true, 43727 => \true, 43728 => \true, 43729 => \true, 43730 => \true, 43731 => \true, 43732 => \true, 43733 => \true, 43734 => \true, 43735 => \true, 43736 => \true, 43737 => \true, 43738 => \true, 43767 => \true, 43768 => \true, 43769 => \true, 43770 => \true, 43771 => \true, 43772 => \true, 43773 => \true, 43774 => \true, 43775 => \true, 43776 => \true, 43783 => \true, 43784 => \true, 43791 => \true, 43792 => \true, 43799 => \true, 43800 => \true, 43801 => \true, 43802 => \true, 43803 => \true, 43804 => \true, 43805 => \true, 43806 => \true, 43807 => \true, 43815 => \true, 43823 => \true, 43884 => \true, 43885 => \true, 43886 => \true, 43887 => \true, 44014 => \true, 44015 => \true, 44026 => \true, 44027 => \true, 44028 => \true, 44029 => \true, 44030 => \true, 44031 => \true, 55204 => \true, 55205 => \true, 55206 => \true, 55207 => \true, 55208 => \true, 55209 => \true, 55210 => \true, 55211 => \true, 55212 => \true, 55213 => \true, 55214 => \true, 55215 => \true, 55239 => \true, 55240 => \true, 55241 => \true, 55242 => \true, 55292 => \true, 55293 => \true, 55294 => \true, 55295 => \true, 64110 => \true, 64111 => \true, 64263 => \true, 64264 => \true, 64265 => \true, 64266 => \true, 64267 => \true, 64268 => \true, 64269 => \true, 64270 => \true, 64271 => \true, 64272 => \true, 64273 => \true, 64274 => \true, 64280 => \true, 64281 => \true, 64282 => \true, 64283 => \true, 64284 => \true, 64311 => \true, 64317 => \true, 64319 => \true, 64322 => \true, 64325 => \true, 64450 => \true, 64451 => \true, 64452 => \true, 64453 => \true, 64454 => \true, 64455 => \true, 64456 => \true, 64457 => \true, 64458 => \true, 64459 => \true, 64460 => \true, 64461 => \true, 64462 => \true, 64463 => \true, 64464 => \true, 64465 => \true, 64466 => \true, 64832 => \true, 64833 => \true, 64834 => \true, 64835 => \true, 64836 => \true, 64837 => \true, 64838 => \true, 64839 => \true, 64840 => \true, 64841 => \true, 64842 => \true, 64843 => \true, 64844 => \true, 64845 => \true, 64846 => \true, 64847 => \true, 64912 => \true, 64913 => \true, 64968 => \true, 64969 => \true, 64970 => \true, 64971 => \true, 64972 => \true, 64973 => \true, 64974 => \true, 64975 => \true, 65022 => \true, 65023 => \true, 65042 => \true, 65049 => \true, 65050 => \true, 65051 => \true, 65052 => \true, 65053 => \true, 65054 => \true, 65055 => \true, 65072 => \true, 65106 => \true, 65107 => \true, 65127 => \true, 65132 => \true, 65133 => \true, 65134 => \true, 65135 => \true, 65141 => \true, 65277 => \true, 65278 => \true, 65280 => \true, 65440 => \true, 65471 => \true, 65472 => \true, 65473 => \true, 65480 => \true, 65481 => \true, 65488 => \true, 65489 => \true, 65496 => \true, 65497 => \true, 65501 => \true, 65502 => \true, 65503 => \true, 65511 => \true, 65519 => \true, 65520 => \true, 65521 => \true, 65522 => \true, 65523 => \true, 65524 => \true, 65525 => \true, 65526 => \true, 65527 => \true, 65528 => \true, 65529 => \true, 65530 => \true, 65531 => \true, 65532 => \true, 65533 => \true, 65534 => \true, 65535 => \true, 65548 => \true, 65575 => \true, 65595 => \true, 65598 => \true, 65614 => \true, 65615 => \true, 65787 => \true, 65788 => \true, 65789 => \true, 65790 => \true, 65791 => \true, 65795 => \true, 65796 => \true, 65797 => \true, 65798 => \true, 65844 => \true, 65845 => \true, 65846 => \true, 65935 => \true, 65949 => \true, 65950 => \true, 65951 => \true, 66205 => \true, 66206 => \true, 66207 => \true, 66257 => \true, 66258 => \true, 66259 => \true, 66260 => \true, 66261 => \true, 66262 => \true, 66263 => \true, 66264 => \true, 66265 => \true, 66266 => \true, 66267 => \true, 66268 => \true, 66269 => \true, 66270 => \true, 66271 => \true, 66300 => \true, 66301 => \true, 66302 => \true, 66303 => \true, 66340 => \true, 66341 => \true, 66342 => \true, 66343 => \true, 66344 => \true, 66345 => \true, 66346 => \true, 66347 => \true, 66348 => \true, 66379 => \true, 66380 => \true, 66381 => \true, 66382 => \true, 66383 => \true, 66427 => \true, 66428 => \true, 66429 => \true, 66430 => \true, 66431 => \true, 66462 => \true, 66500 => \true, 66501 => \true, 66502 => \true, 66503 => \true, 66718 => \true, 66719 => \true, 66730 => \true, 66731 => \true, 66732 => \true, 66733 => \true, 66734 => \true, 66735 => \true, 66772 => \true, 66773 => \true, 66774 => \true, 66775 => \true, 66812 => \true, 66813 => \true, 66814 => \true, 66815 => \true, 66856 => \true, 66857 => \true, 66858 => \true, 66859 => \true, 66860 => \true, 66861 => \true, 66862 => \true, 66863 => \true, 66916 => \true, 66917 => \true, 66918 => \true, 66919 => \true, 66920 => \true, 66921 => \true, 66922 => \true, 66923 => \true, 66924 => \true, 66925 => \true, 66926 => \true, 67383 => \true, 67384 => \true, 67385 => \true, 67386 => \true, 67387 => \true, 67388 => \true, 67389 => \true, 67390 => \true, 67391 => \true, 67414 => \true, 67415 => \true, 67416 => \true, 67417 => \true, 67418 => \true, 67419 => \true, 67420 => \true, 67421 => \true, 67422 => \true, 67423 => \true, 67590 => \true, 67591 => \true, 67593 => \true, 67638 => \true, 67641 => \true, 67642 => \true, 67643 => \true, 67645 => \true, 67646 => \true, 67670 => \true, 67743 => \true, 67744 => \true, 67745 => \true, 67746 => \true, 67747 => \true, 67748 => \true, 67749 => \true, 67750 => \true, 67827 => \true, 67830 => \true, 67831 => \true, 67832 => \true, 67833 => \true, 67834 => \true, 67868 => \true, 67869 => \true, 67870 => \true, 67898 => \true, 67899 => \true, 67900 => \true, 67901 => \true, 67902 => \true, 68024 => \true, 68025 => \true, 68026 => \true, 68027 => \true, 68048 => \true, 68049 => \true, 68100 => \true, 68103 => \true, 68104 => \true, 68105 => \true, 68106 => \true, 68107 => \true, 68116 => \true, 68120 => \true, 68150 => \true, 68151 => \true, 68155 => \true, 68156 => \true, 68157 => \true, 68158 => \true, 68169 => \true, 68170 => \true, 68171 => \true, 68172 => \true, 68173 => \true, 68174 => \true, 68175 => \true, 68185 => \true, 68186 => \true, 68187 => \true, 68188 => \true, 68189 => \true, 68190 => \true, 68191 => \true, 68327 => \true, 68328 => \true, 68329 => \true, 68330 => \true, 68343 => \true, 68344 => \true, 68345 => \true, 68346 => \true, 68347 => \true, 68348 => \true, 68349 => \true, 68350 => \true, 68351 => \true, 68406 => \true, 68407 => \true, 68408 => \true, 68438 => \true, 68439 => \true, 68467 => \true, 68468 => \true, 68469 => \true, 68470 => \true, 68471 => \true, 68498 => \true, 68499 => \true, 68500 => \true, 68501 => \true, 68502 => \true, 68503 => \true, 68504 => \true, 68509 => \true, 68510 => \true, 68511 => \true, 68512 => \true, 68513 => \true, 68514 => \true, 68515 => \true, 68516 => \true, 68517 => \true, 68518 => \true, 68519 => \true, 68520 => \true, 68787 => \true, 68788 => \true, 68789 => \true, 68790 => \true, 68791 => \true, 68792 => \true, 68793 => \true, 68794 => \true, 68795 => \true, 68796 => \true, 68797 => \true, 68798 => \true, 68799 => \true, 68851 => \true, 68852 => \true, 68853 => \true, 68854 => \true, 68855 => \true, 68856 => \true, 68857 => \true, 68904 => \true, 68905 => \true, 68906 => \true, 68907 => \true, 68908 => \true, 68909 => \true, 68910 => \true, 68911 => \true, 69247 => \true, 69290 => \true, 69294 => \true, 69295 => \true, 69416 => \true, 69417 => \true, 69418 => \true, 69419 => \true, 69420 => \true, 69421 => \true, 69422 => \true, 69423 => \true, 69580 => \true, 69581 => \true, 69582 => \true, 69583 => \true, 69584 => \true, 69585 => \true, 69586 => \true, 69587 => \true, 69588 => \true, 69589 => \true, 69590 => \true, 69591 => \true, 69592 => \true, 69593 => \true, 69594 => \true, 69595 => \true, 69596 => \true, 69597 => \true, 69598 => \true, 69599 => \true, 69623 => \true, 69624 => \true, 69625 => \true, 69626 => \true, 69627 => \true, 69628 => \true, 69629 => \true, 69630 => \true, 69631 => \true, 69710 => \true, 69711 => \true, 69712 => \true, 69713 => \true, 69744 => \true, 69745 => \true, 69746 => \true, 69747 => \true, 69748 => \true, 69749 => \true, 69750 => \true, 69751 => \true, 69752 => \true, 69753 => \true, 69754 => \true, 69755 => \true, 69756 => \true, 69757 => \true, 69758 => \true, 69821 => \true, 69826 => \true, 69827 => \true, 69828 => \true, 69829 => \true, 69830 => \true, 69831 => \true, 69832 => \true, 69833 => \true, 69834 => \true, 69835 => \true, 69836 => \true, 69837 => \true, 69838 => \true, 69839 => \true, 69865 => \true, 69866 => \true, 69867 => \true, 69868 => \true, 69869 => \true, 69870 => \true, 69871 => \true, 69882 => \true, 69883 => \true, 69884 => \true, 69885 => \true, 69886 => \true, 69887 => \true, 69941 => \true, 69960 => \true, 69961 => \true, 69962 => \true, 69963 => \true, 69964 => \true, 69965 => \true, 69966 => \true, 69967 => \true, 70007 => \true, 70008 => \true, 70009 => \true, 70010 => \true, 70011 => \true, 70012 => \true, 70013 => \true, 70014 => \true, 70015 => \true, 70112 => \true, 70133 => \true, 70134 => \true, 70135 => \true, 70136 => \true, 70137 => \true, 70138 => \true, 70139 => \true, 70140 => \true, 70141 => \true, 70142 => \true, 70143 => \true, 70162 => \true, 70279 => \true, 70281 => \true, 70286 => \true, 70302 => \true, 70314 => \true, 70315 => \true, 70316 => \true, 70317 => \true, 70318 => \true, 70319 => \true, 70379 => \true, 70380 => \true, 70381 => \true, 70382 => \true, 70383 => \true, 70394 => \true, 70395 => \true, 70396 => \true, 70397 => \true, 70398 => \true, 70399 => \true, 70404 => \true, 70413 => \true, 70414 => \true, 70417 => \true, 70418 => \true, 70441 => \true, 70449 => \true, 70452 => \true, 70458 => \true, 70469 => \true, 70470 => \true, 70473 => \true, 70474 => \true, 70478 => \true, 70479 => \true, 70481 => \true, 70482 => \true, 70483 => \true, 70484 => \true, 70485 => \true, 70486 => \true, 70488 => \true, 70489 => \true, 70490 => \true, 70491 => \true, 70492 => \true, 70500 => \true, 70501 => \true, 70509 => \true, 70510 => \true, 70511 => \true, 70748 => \true, 70754 => \true, 70755 => \true, 70756 => \true, 70757 => \true, 70758 => \true, 70759 => \true, 70760 => \true, 70761 => \true, 70762 => \true, 70763 => \true, 70764 => \true, 70765 => \true, 70766 => \true, 70767 => \true, 70768 => \true, 70769 => \true, 70770 => \true, 70771 => \true, 70772 => \true, 70773 => \true, 70774 => \true, 70775 => \true, 70776 => \true, 70777 => \true, 70778 => \true, 70779 => \true, 70780 => \true, 70781 => \true, 70782 => \true, 70783 => \true, 70856 => \true, 70857 => \true, 70858 => \true, 70859 => \true, 70860 => \true, 70861 => \true, 70862 => \true, 70863 => \true, 71094 => \true, 71095 => \true, 71237 => \true, 71238 => \true, 71239 => \true, 71240 => \true, 71241 => \true, 71242 => \true, 71243 => \true, 71244 => \true, 71245 => \true, 71246 => \true, 71247 => \true, 71258 => \true, 71259 => \true, 71260 => \true, 71261 => \true, 71262 => \true, 71263 => \true, 71277 => \true, 71278 => \true, 71279 => \true, 71280 => \true, 71281 => \true, 71282 => \true, 71283 => \true, 71284 => \true, 71285 => \true, 71286 => \true, 71287 => \true, 71288 => \true, 71289 => \true, 71290 => \true, 71291 => \true, 71292 => \true, 71293 => \true, 71294 => \true, 71295 => \true, 71353 => \true, 71354 => \true, 71355 => \true, 71356 => \true, 71357 => \true, 71358 => \true, 71359 => \true, 71451 => \true, 71452 => \true, 71468 => \true, 71469 => \true, 71470 => \true, 71471 => \true, 71923 => \true, 71924 => \true, 71925 => \true, 71926 => \true, 71927 => \true, 71928 => \true, 71929 => \true, 71930 => \true, 71931 => \true, 71932 => \true, 71933 => \true, 71934 => \true, 71943 => \true, 71944 => \true, 71946 => \true, 71947 => \true, 71956 => \true, 71959 => \true, 71990 => \true, 71993 => \true, 71994 => \true, 72007 => \true, 72008 => \true, 72009 => \true, 72010 => \true, 72011 => \true, 72012 => \true, 72013 => \true, 72014 => \true, 72015 => \true, 72104 => \true, 72105 => \true, 72152 => \true, 72153 => \true, 72165 => \true, 72166 => \true, 72167 => \true, 72168 => \true, 72169 => \true, 72170 => \true, 72171 => \true, 72172 => \true, 72173 => \true, 72174 => \true, 72175 => \true, 72176 => \true, 72177 => \true, 72178 => \true, 72179 => \true, 72180 => \true, 72181 => \true, 72182 => \true, 72183 => \true, 72184 => \true, 72185 => \true, 72186 => \true, 72187 => \true, 72188 => \true, 72189 => \true, 72190 => \true, 72191 => \true, 72264 => \true, 72265 => \true, 72266 => \true, 72267 => \true, 72268 => \true, 72269 => \true, 72270 => \true, 72271 => \true, 72355 => \true, 72356 => \true, 72357 => \true, 72358 => \true, 72359 => \true, 72360 => \true, 72361 => \true, 72362 => \true, 72363 => \true, 72364 => \true, 72365 => \true, 72366 => \true, 72367 => \true, 72368 => \true, 72369 => \true, 72370 => \true, 72371 => \true, 72372 => \true, 72373 => \true, 72374 => \true, 72375 => \true, 72376 => \true, 72377 => \true, 72378 => \true, 72379 => \true, 72380 => \true, 72381 => \true, 72382 => \true, 72383 => \true, 72713 => \true, 72759 => \true, 72774 => \true, 72775 => \true, 72776 => \true, 72777 => \true, 72778 => \true, 72779 => \true, 72780 => \true, 72781 => \true, 72782 => \true, 72783 => \true, 72813 => \true, 72814 => \true, 72815 => \true, 72848 => \true, 72849 => \true, 72872 => \true, 72967 => \true, 72970 => \true, 73015 => \true, 73016 => \true, 73017 => \true, 73019 => \true, 73022 => \true, 73032 => \true, 73033 => \true, 73034 => \true, 73035 => \true, 73036 => \true, 73037 => \true, 73038 => \true, 73039 => \true, 73050 => \true, 73051 => \true, 73052 => \true, 73053 => \true, 73054 => \true, 73055 => \true, 73062 => \true, 73065 => \true, 73103 => \true, 73106 => \true, 73113 => \true, 73114 => \true, 73115 => \true, 73116 => \true, 73117 => \true, 73118 => \true, 73119 => \true, 73649 => \true, 73650 => \true, 73651 => \true, 73652 => \true, 73653 => \true, 73654 => \true, 73655 => \true, 73656 => \true, 73657 => \true, 73658 => \true, 73659 => \true, 73660 => \true, 73661 => \true, 73662 => \true, 73663 => \true, 73714 => \true, 73715 => \true, 73716 => \true, 73717 => \true, 73718 => \true, 73719 => \true, 73720 => \true, 73721 => \true, 73722 => \true, 73723 => \true, 73724 => \true, 73725 => \true, 73726 => \true, 74863 => \true, 74869 => \true, 74870 => \true, 74871 => \true, 74872 => \true, 74873 => \true, 74874 => \true, 74875 => \true, 74876 => \true, 74877 => \true, 74878 => \true, 74879 => \true, 78895 => \true, 78896 => \true, 78897 => \true, 78898 => \true, 78899 => \true, 78900 => \true, 78901 => \true, 78902 => \true, 78903 => \true, 78904 => \true, 92729 => \true, 92730 => \true, 92731 => \true, 92732 => \true, 92733 => \true, 92734 => \true, 92735 => \true, 92767 => \true, 92778 => \true, 92779 => \true, 92780 => \true, 92781 => \true, 92910 => \true, 92911 => \true, 92918 => \true, 92919 => \true, 92920 => \true, 92921 => \true, 92922 => \true, 92923 => \true, 92924 => \true, 92925 => \true, 92926 => \true, 92927 => \true, 92998 => \true, 92999 => \true, 93000 => \true, 93001 => \true, 93002 => \true, 93003 => \true, 93004 => \true, 93005 => \true, 93006 => \true, 93007 => \true, 93018 => \true, 93026 => \true, 93048 => \true, 93049 => \true, 93050 => \true, 93051 => \true, 93052 => \true, 94027 => \true, 94028 => \true, 94029 => \true, 94030 => \true, 94088 => \true, 94089 => \true, 94090 => \true, 94091 => \true, 94092 => \true, 94093 => \true, 94094 => \true, 94181 => \true, 94182 => \true, 94183 => \true, 94184 => \true, 94185 => \true, 94186 => \true, 94187 => \true, 94188 => \true, 94189 => \true, 94190 => \true, 94191 => \true, 94194 => \true, 94195 => \true, 94196 => \true, 94197 => \true, 94198 => \true, 94199 => \true, 94200 => \true, 94201 => \true, 94202 => \true, 94203 => \true, 94204 => \true, 94205 => \true, 94206 => \true, 94207 => \true, 100344 => \true, 100345 => \true, 100346 => \true, 100347 => \true, 100348 => \true, 100349 => \true, 100350 => \true, 100351 => \true, 110931 => \true, 110932 => \true, 110933 => \true, 110934 => \true, 110935 => \true, 110936 => \true, 110937 => \true, 110938 => \true, 110939 => \true, 110940 => \true, 110941 => \true, 110942 => \true, 110943 => \true, 110944 => \true, 110945 => \true, 110946 => \true, 110947 => \true, 110952 => \true, 110953 => \true, 110954 => \true, 110955 => \true, 110956 => \true, 110957 => \true, 110958 => \true, 110959 => \true, 113771 => \true, 113772 => \true, 113773 => \true, 113774 => \true, 113775 => \true, 113789 => \true, 113790 => \true, 113791 => \true, 113801 => \true, 113802 => \true, 113803 => \true, 113804 => \true, 113805 => \true, 113806 => \true, 113807 => \true, 113818 => \true, 113819 => \true, 119030 => \true, 119031 => \true, 119032 => \true, 119033 => \true, 119034 => \true, 119035 => \true, 119036 => \true, 119037 => \true, 119038 => \true, 119039 => \true, 119079 => \true, 119080 => \true, 119155 => \true, 119156 => \true, 119157 => \true, 119158 => \true, 119159 => \true, 119160 => \true, 119161 => \true, 119162 => \true, 119273 => \true, 119274 => \true, 119275 => \true, 119276 => \true, 119277 => \true, 119278 => \true, 119279 => \true, 119280 => \true, 119281 => \true, 119282 => \true, 119283 => \true, 119284 => \true, 119285 => \true, 119286 => \true, 119287 => \true, 119288 => \true, 119289 => \true, 119290 => \true, 119291 => \true, 119292 => \true, 119293 => \true, 119294 => \true, 119295 => \true, 119540 => \true, 119541 => \true, 119542 => \true, 119543 => \true, 119544 => \true, 119545 => \true, 119546 => \true, 119547 => \true, 119548 => \true, 119549 => \true, 119550 => \true, 119551 => \true, 119639 => \true, 119640 => \true, 119641 => \true, 119642 => \true, 119643 => \true, 119644 => \true, 119645 => \true, 119646 => \true, 119647 => \true, 119893 => \true, 119965 => \true, 119968 => \true, 119969 => \true, 119971 => \true, 119972 => \true, 119975 => \true, 119976 => \true, 119981 => \true, 119994 => \true, 119996 => \true, 120004 => \true, 120070 => \true, 120075 => \true, 120076 => \true, 120085 => \true, 120093 => \true, 120122 => \true, 120127 => \true, 120133 => \true, 120135 => \true, 120136 => \true, 120137 => \true, 120145 => \true, 120486 => \true, 120487 => \true, 120780 => \true, 120781 => \true, 121484 => \true, 121485 => \true, 121486 => \true, 121487 => \true, 121488 => \true, 121489 => \true, 121490 => \true, 121491 => \true, 121492 => \true, 121493 => \true, 121494 => \true, 121495 => \true, 121496 => \true, 121497 => \true, 121498 => \true, 121504 => \true, 122887 => \true, 122905 => \true, 122906 => \true, 122914 => \true, 122917 => \true, 123181 => \true, 123182 => \true, 123183 => \true, 123198 => \true, 123199 => \true, 123210 => \true, 123211 => \true, 123212 => \true, 123213 => \true, 123642 => \true, 123643 => \true, 123644 => \true, 123645 => \true, 123646 => \true, 125125 => \true, 125126 => \true, 125260 => \true, 125261 => \true, 125262 => \true, 125263 => \true, 125274 => \true, 125275 => \true, 125276 => \true, 125277 => \true, 126468 => \true, 126496 => \true, 126499 => \true, 126501 => \true, 126502 => \true, 126504 => \true, 126515 => \true, 126520 => \true, 126522 => \true, 126524 => \true, 126525 => \true, 126526 => \true, 126527 => \true, 126528 => \true, 126529 => \true, 126531 => \true, 126532 => \true, 126533 => \true, 126534 => \true, 126536 => \true, 126538 => \true, 126540 => \true, 126544 => \true, 126547 => \true, 126549 => \true, 126550 => \true, 126552 => \true, 126554 => \true, 126556 => \true, 126558 => \true, 126560 => \true, 126563 => \true, 126565 => \true, 126566 => \true, 126571 => \true, 126579 => \true, 126584 => \true, 126589 => \true, 126591 => \true, 126602 => \true, 126620 => \true, 126621 => \true, 126622 => \true, 126623 => \true, 126624 => \true, 126628 => \true, 126634 => \true, 127020 => \true, 127021 => \true, 127022 => \true, 127023 => \true, 127124 => \true, 127125 => \true, 127126 => \true, 127127 => \true, 127128 => \true, 127129 => \true, 127130 => \true, 127131 => \true, 127132 => \true, 127133 => \true, 127134 => \true, 127135 => \true, 127151 => \true, 127152 => \true, 127168 => \true, 127184 => \true, 127222 => \true, 127223 => \true, 127224 => \true, 127225 => \true, 127226 => \true, 127227 => \true, 127228 => \true, 127229 => \true, 127230 => \true, 127231 => \true, 127232 => \true, 127491 => \true, 127492 => \true, 127493 => \true, 127494 => \true, 127495 => \true, 127496 => \true, 127497 => \true, 127498 => \true, 127499 => \true, 127500 => \true, 127501 => \true, 127502 => \true, 127503 => \true, 127548 => \true, 127549 => \true, 127550 => \true, 127551 => \true, 127561 => \true, 127562 => \true, 127563 => \true, 127564 => \true, 127565 => \true, 127566 => \true, 127567 => \true, 127570 => \true, 127571 => \true, 127572 => \true, 127573 => \true, 127574 => \true, 127575 => \true, 127576 => \true, 127577 => \true, 127578 => \true, 127579 => \true, 127580 => \true, 127581 => \true, 127582 => \true, 127583 => \true, 128728 => \true, 128729 => \true, 128730 => \true, 128731 => \true, 128732 => \true, 128733 => \true, 128734 => \true, 128735 => \true, 128749 => \true, 128750 => \true, 128751 => \true, 128765 => \true, 128766 => \true, 128767 => \true, 128884 => \true, 128885 => \true, 128886 => \true, 128887 => \true, 128888 => \true, 128889 => \true, 128890 => \true, 128891 => \true, 128892 => \true, 128893 => \true, 128894 => \true, 128895 => \true, 128985 => \true, 128986 => \true, 128987 => \true, 128988 => \true, 128989 => \true, 128990 => \true, 128991 => \true, 129004 => \true, 129005 => \true, 129006 => \true, 129007 => \true, 129008 => \true, 129009 => \true, 129010 => \true, 129011 => \true, 129012 => \true, 129013 => \true, 129014 => \true, 129015 => \true, 129016 => \true, 129017 => \true, 129018 => \true, 129019 => \true, 129020 => \true, 129021 => \true, 129022 => \true, 129023 => \true, 129036 => \true, 129037 => \true, 129038 => \true, 129039 => \true, 129096 => \true, 129097 => \true, 129098 => \true, 129099 => \true, 129100 => \true, 129101 => \true, 129102 => \true, 129103 => \true, 129114 => \true, 129115 => \true, 129116 => \true, 129117 => \true, 129118 => \true, 129119 => \true, 129160 => \true, 129161 => \true, 129162 => \true, 129163 => \true, 129164 => \true, 129165 => \true, 129166 => \true, 129167 => \true, 129198 => \true, 129199 => \true, 129401 => \true, 129484 => \true, 129620 => \true, 129621 => \true, 129622 => \true, 129623 => \true, 129624 => \true, 129625 => \true, 129626 => \true, 129627 => \true, 129628 => \true, 129629 => \true, 129630 => \true, 129631 => \true, 129646 => \true, 129647 => \true, 129653 => \true, 129654 => \true, 129655 => \true, 129659 => \true, 129660 => \true, 129661 => \true, 129662 => \true, 129663 => \true, 129671 => \true, 129672 => \true, 129673 => \true, 129674 => \true, 129675 => \true, 129676 => \true, 129677 => \true, 129678 => \true, 129679 => \true, 129705 => \true, 129706 => \true, 129707 => \true, 129708 => \true, 129709 => \true, 129710 => \true, 129711 => \true, 129719 => \true, 129720 => \true, 129721 => \true, 129722 => \true, 129723 => \true, 129724 => \true, 129725 => \true, 129726 => \true, 129727 => \true, 129731 => \true, 129732 => \true, 129733 => \true, 129734 => \true, 129735 => \true, 129736 => \true, 129737 => \true, 129738 => \true, 129739 => \true, 129740 => \true, 129741 => \true, 129742 => \true, 129743 => \true, 129939 => \true, 131070 => \true, 131071 => \true, 177973 => \true, 177974 => \true, 177975 => \true, 177976 => \true, 177977 => \true, 177978 => \true, 177979 => \true, 177980 => \true, 177981 => \true, 177982 => \true, 177983 => \true, 178206 => \true, 178207 => \true, 183970 => \true, 183971 => \true, 183972 => \true, 183973 => \true, 183974 => \true, 183975 => \true, 183976 => \true, 183977 => \true, 183978 => \true, 183979 => \true, 183980 => \true, 183981 => \true, 183982 => \true, 183983 => \true, 194664 => \true, 194676 => \true, 194847 => \true, 194911 => \true, 195007 => \true, 196606 => \true, 196607 => \true, 262142 => \true, 262143 => \true, 327678 => \true, 327679 => \true, 393214 => \true, 393215 => \true, 458750 => \true, 458751 => \true, 524286 => \true, 524287 => \true, 589822 => \true, 589823 => \true, 655358 => \true, 655359 => \true, 720894 => \true, 720895 => \true, 786430 => \true, 786431 => \true, 851966 => \true, 851967 => \true, 917502 => \true, 917503 => \true, 917504 => \true, 917505 => \true, 917506 => \true, 917507 => \true, 917508 => \true, 917509 => \true, 917510 => \true, 917511 => \true, 917512 => \true, 917513 => \true, 917514 => \true, 917515 => \true, 917516 => \true, 917517 => \true, 917518 => \true, 917519 => \true, 917520 => \true, 917521 => \true, 917522 => \true, 917523 => \true, 917524 => \true, 917525 => \true, 917526 => \true, 917527 => \true, 917528 => \true, 917529 => \true, 917530 => \true, 917531 => \true, 917532 => \true, 917533 => \true, 917534 => \true, 917535 => \true, 983038 => \true, 983039 => \true, 1048574 => \true, 1048575 => \true, 1114110 => \true, 1114111 => \true); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/virama.php000064400000001364147600374260026061 0ustar00 9, 2509 => 9, 2637 => 9, 2765 => 9, 2893 => 9, 3021 => 9, 3149 => 9, 3277 => 9, 3387 => 9, 3388 => 9, 3405 => 9, 3530 => 9, 3642 => 9, 3770 => 9, 3972 => 9, 4153 => 9, 4154 => 9, 5908 => 9, 5940 => 9, 6098 => 9, 6752 => 9, 6980 => 9, 7082 => 9, 7083 => 9, 7154 => 9, 7155 => 9, 11647 => 9, 43014 => 9, 43052 => 9, 43204 => 9, 43347 => 9, 43456 => 9, 43766 => 9, 44013 => 9, 68159 => 9, 69702 => 9, 69759 => 9, 69817 => 9, 69939 => 9, 69940 => 9, 70080 => 9, 70197 => 9, 70378 => 9, 70477 => 9, 70722 => 9, 70850 => 9, 71103 => 9, 71231 => 9, 71350 => 9, 71467 => 9, 71737 => 9, 71997 => 9, 71998 => 9, 72160 => 9, 72244 => 9, 72263 => 9, 72345 => 9, 72767 => 9, 73028 => 9, 73029 => 9, 73111 => 9); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/mapped.php000064400000263110147600374260026047 0ustar00 'a', 66 => 'b', 67 => 'c', 68 => 'd', 69 => 'e', 70 => 'f', 71 => 'g', 72 => 'h', 73 => 'i', 74 => 'j', 75 => 'k', 76 => 'l', 77 => 'm', 78 => 'n', 79 => 'o', 80 => 'p', 81 => 'q', 82 => 'r', 83 => 's', 84 => 't', 85 => 'u', 86 => 'v', 87 => 'w', 88 => 'x', 89 => 'y', 90 => 'z', 170 => 'a', 178 => '2', 179 => '3', 181 => 'μ', 185 => '1', 186 => 'o', 188 => '1â„4', 189 => '1â„2', 190 => '3â„4', 192 => 'à', 193 => 'á', 194 => 'â', 195 => 'ã', 196 => 'ä', 197 => 'Ã¥', 198 => 'æ', 199 => 'ç', 200 => 'è', 201 => 'é', 202 => 'ê', 203 => 'ë', 204 => 'ì', 205 => 'í', 206 => 'î', 207 => 'ï', 208 => 'ð', 209 => 'ñ', 210 => 'ò', 211 => 'ó', 212 => 'ô', 213 => 'õ', 214 => 'ö', 216 => 'ø', 217 => 'ù', 218 => 'ú', 219 => 'û', 220 => 'ü', 221 => 'ý', 222 => 'þ', 256 => 'Ä', 258 => 'ă', 260 => 'Ä…', 262 => 'ć', 264 => 'ĉ', 266 => 'Ä‹', 268 => 'Ä', 270 => 'Ä', 272 => 'Ä‘', 274 => 'Ä“', 276 => 'Ä•', 278 => 'Ä—', 280 => 'Ä™', 282 => 'Ä›', 284 => 'Ä', 286 => 'ÄŸ', 288 => 'Ä¡', 290 => 'Ä£', 292 => 'Ä¥', 294 => 'ħ', 296 => 'Ä©', 298 => 'Ä«', 300 => 'Ä­', 302 => 'į', 304 => 'i̇', 306 => 'ij', 307 => 'ij', 308 => 'ĵ', 310 => 'Ä·', 313 => 'ĺ', 315 => 'ļ', 317 => 'ľ', 319 => 'l·', 320 => 'l·', 321 => 'Å‚', 323 => 'Å„', 325 => 'ņ', 327 => 'ň', 329 => 'ʼn', 330 => 'Å‹', 332 => 'Å', 334 => 'Å', 336 => 'Å‘', 338 => 'Å“', 340 => 'Å•', 342 => 'Å—', 344 => 'Å™', 346 => 'Å›', 348 => 'Å', 350 => 'ÅŸ', 352 => 'Å¡', 354 => 'Å£', 356 => 'Å¥', 358 => 'ŧ', 360 => 'Å©', 362 => 'Å«', 364 => 'Å­', 366 => 'ů', 368 => 'ű', 370 => 'ų', 372 => 'ŵ', 374 => 'Å·', 376 => 'ÿ', 377 => 'ź', 379 => 'ż', 381 => 'ž', 383 => 's', 385 => 'É“', 386 => 'ƃ', 388 => 'Æ…', 390 => 'É”', 391 => 'ƈ', 393 => 'É–', 394 => 'É—', 395 => 'ÆŒ', 398 => 'Ç', 399 => 'É™', 400 => 'É›', 401 => 'Æ’', 403 => 'É ', 404 => 'É£', 406 => 'É©', 407 => 'ɨ', 408 => 'Æ™', 412 => 'ɯ', 413 => 'ɲ', 415 => 'ɵ', 416 => 'Æ¡', 418 => 'Æ£', 420 => 'Æ¥', 422 => 'Ê€', 423 => 'ƨ', 425 => 'ʃ', 428 => 'Æ­', 430 => 'ʈ', 431 => 'Æ°', 433 => 'ÊŠ', 434 => 'Ê‹', 435 => 'Æ´', 437 => 'ƶ', 439 => 'Ê’', 440 => 'ƹ', 444 => 'ƽ', 452 => 'dž', 453 => 'dž', 454 => 'dž', 455 => 'lj', 456 => 'lj', 457 => 'lj', 458 => 'nj', 459 => 'nj', 460 => 'nj', 461 => 'ÇŽ', 463 => 'Ç', 465 => 'Ç’', 467 => 'Ç”', 469 => 'Ç–', 471 => 'ǘ', 473 => 'Çš', 475 => 'Çœ', 478 => 'ÇŸ', 480 => 'Ç¡', 482 => 'Ç£', 484 => 'Ç¥', 486 => 'ǧ', 488 => 'Ç©', 490 => 'Ç«', 492 => 'Ç­', 494 => 'ǯ', 497 => 'dz', 498 => 'dz', 499 => 'dz', 500 => 'ǵ', 502 => 'Æ•', 503 => 'Æ¿', 504 => 'ǹ', 506 => 'Ç»', 508 => 'ǽ', 510 => 'Ç¿', 512 => 'È', 514 => 'ȃ', 516 => 'È…', 518 => 'ȇ', 520 => 'ȉ', 522 => 'È‹', 524 => 'È', 526 => 'È', 528 => 'È‘', 530 => 'È“', 532 => 'È•', 534 => 'È—', 536 => 'È™', 538 => 'È›', 540 => 'È', 542 => 'ÈŸ', 544 => 'Æž', 546 => 'È£', 548 => 'È¥', 550 => 'ȧ', 552 => 'È©', 554 => 'È«', 556 => 'È­', 558 => 'ȯ', 560 => 'ȱ', 562 => 'ȳ', 570 => 'â±¥', 571 => 'ȼ', 573 => 'Æš', 574 => 'ⱦ', 577 => 'É‚', 579 => 'Æ€', 580 => 'ʉ', 581 => 'ÊŒ', 582 => 'ɇ', 584 => 'ɉ', 586 => 'É‹', 588 => 'É', 590 => 'É', 688 => 'h', 689 => 'ɦ', 690 => 'j', 691 => 'r', 692 => 'ɹ', 693 => 'É»', 694 => 'Ê', 695 => 'w', 696 => 'y', 736 => 'É£', 737 => 'l', 738 => 's', 739 => 'x', 740 => 'Ê•', 832 => 'Ì€', 833 => 'Ì', 835 => 'Ì“', 836 => '̈Ì', 837 => 'ι', 880 => 'ͱ', 882 => 'ͳ', 884 => 'ʹ', 886 => 'Í·', 895 => 'ϳ', 902 => 'ά', 903 => '·', 904 => 'έ', 905 => 'ή', 906 => 'ί', 908 => 'ÏŒ', 910 => 'Ï', 911 => 'ÏŽ', 913 => 'α', 914 => 'β', 915 => 'γ', 916 => 'δ', 917 => 'ε', 918 => 'ζ', 919 => 'η', 920 => 'θ', 921 => 'ι', 922 => 'κ', 923 => 'λ', 924 => 'μ', 925 => 'ν', 926 => 'ξ', 927 => 'ο', 928 => 'Ï€', 929 => 'Ï', 931 => 'σ', 932 => 'Ï„', 933 => 'Ï…', 934 => 'φ', 935 => 'χ', 936 => 'ψ', 937 => 'ω', 938 => 'ÏŠ', 939 => 'Ï‹', 975 => 'Ï—', 976 => 'β', 977 => 'θ', 978 => 'Ï…', 979 => 'Ï', 980 => 'Ï‹', 981 => 'φ', 982 => 'Ï€', 984 => 'Ï™', 986 => 'Ï›', 988 => 'Ï', 990 => 'ÏŸ', 992 => 'Ï¡', 994 => 'Ï£', 996 => 'Ï¥', 998 => 'ϧ', 1000 => 'Ï©', 1002 => 'Ï«', 1004 => 'Ï­', 1006 => 'ϯ', 1008 => 'κ', 1009 => 'Ï', 1010 => 'σ', 1012 => 'θ', 1013 => 'ε', 1015 => 'ϸ', 1017 => 'σ', 1018 => 'Ï»', 1021 => 'Í»', 1022 => 'ͼ', 1023 => 'ͽ', 1024 => 'Ñ', 1025 => 'Ñ‘', 1026 => 'Ñ’', 1027 => 'Ñ“', 1028 => 'Ñ”', 1029 => 'Ñ•', 1030 => 'Ñ–', 1031 => 'Ñ—', 1032 => 'ј', 1033 => 'Ñ™', 1034 => 'Ñš', 1035 => 'Ñ›', 1036 => 'Ñœ', 1037 => 'Ñ', 1038 => 'Ñž', 1039 => 'ÑŸ', 1040 => 'а', 1041 => 'б', 1042 => 'в', 1043 => 'г', 1044 => 'д', 1045 => 'е', 1046 => 'ж', 1047 => 'з', 1048 => 'и', 1049 => 'й', 1050 => 'к', 1051 => 'л', 1052 => 'м', 1053 => 'н', 1054 => 'о', 1055 => 'п', 1056 => 'Ñ€', 1057 => 'Ñ', 1058 => 'Ñ‚', 1059 => 'у', 1060 => 'Ñ„', 1061 => 'Ñ…', 1062 => 'ц', 1063 => 'ч', 1064 => 'ш', 1065 => 'щ', 1066 => 'ÑŠ', 1067 => 'Ñ‹', 1068 => 'ÑŒ', 1069 => 'Ñ', 1070 => 'ÑŽ', 1071 => 'Ñ', 1120 => 'Ñ¡', 1122 => 'Ñ£', 1124 => 'Ñ¥', 1126 => 'ѧ', 1128 => 'Ñ©', 1130 => 'Ñ«', 1132 => 'Ñ­', 1134 => 'ѯ', 1136 => 'ѱ', 1138 => 'ѳ', 1140 => 'ѵ', 1142 => 'Ñ·', 1144 => 'ѹ', 1146 => 'Ñ»', 1148 => 'ѽ', 1150 => 'Ñ¿', 1152 => 'Ò', 1162 => 'Ò‹', 1164 => 'Ò', 1166 => 'Ò', 1168 => 'Ò‘', 1170 => 'Ò“', 1172 => 'Ò•', 1174 => 'Ò—', 1176 => 'Ò™', 1178 => 'Ò›', 1180 => 'Ò', 1182 => 'ÒŸ', 1184 => 'Ò¡', 1186 => 'Ò£', 1188 => 'Ò¥', 1190 => 'Ò§', 1192 => 'Ò©', 1194 => 'Ò«', 1196 => 'Ò­', 1198 => 'Ò¯', 1200 => 'Ò±', 1202 => 'Ò³', 1204 => 'Òµ', 1206 => 'Ò·', 1208 => 'Ò¹', 1210 => 'Ò»', 1212 => 'Ò½', 1214 => 'Ò¿', 1217 => 'Ó‚', 1219 => 'Ó„', 1221 => 'Ó†', 1223 => 'Óˆ', 1225 => 'ÓŠ', 1227 => 'ÓŒ', 1229 => 'ÓŽ', 1232 => 'Ó‘', 1234 => 'Ó“', 1236 => 'Ó•', 1238 => 'Ó—', 1240 => 'Ó™', 1242 => 'Ó›', 1244 => 'Ó', 1246 => 'ÓŸ', 1248 => 'Ó¡', 1250 => 'Ó£', 1252 => 'Ó¥', 1254 => 'Ó§', 1256 => 'Ó©', 1258 => 'Ó«', 1260 => 'Ó­', 1262 => 'Ó¯', 1264 => 'Ó±', 1266 => 'Ó³', 1268 => 'Óµ', 1270 => 'Ó·', 1272 => 'Ó¹', 1274 => 'Ó»', 1276 => 'Ó½', 1278 => 'Ó¿', 1280 => 'Ô', 1282 => 'Ôƒ', 1284 => 'Ô…', 1286 => 'Ô‡', 1288 => 'Ô‰', 1290 => 'Ô‹', 1292 => 'Ô', 1294 => 'Ô', 1296 => 'Ô‘', 1298 => 'Ô“', 1300 => 'Ô•', 1302 => 'Ô—', 1304 => 'Ô™', 1306 => 'Ô›', 1308 => 'Ô', 1310 => 'ÔŸ', 1312 => 'Ô¡', 1314 => 'Ô£', 1316 => 'Ô¥', 1318 => 'Ô§', 1320 => 'Ô©', 1322 => 'Ô«', 1324 => 'Ô­', 1326 => 'Ô¯', 1329 => 'Õ¡', 1330 => 'Õ¢', 1331 => 'Õ£', 1332 => 'Õ¤', 1333 => 'Õ¥', 1334 => 'Õ¦', 1335 => 'Õ§', 1336 => 'Õ¨', 1337 => 'Õ©', 1338 => 'Õª', 1339 => 'Õ«', 1340 => 'Õ¬', 1341 => 'Õ­', 1342 => 'Õ®', 1343 => 'Õ¯', 1344 => 'Õ°', 1345 => 'Õ±', 1346 => 'Õ²', 1347 => 'Õ³', 1348 => 'Õ´', 1349 => 'Õµ', 1350 => 'Õ¶', 1351 => 'Õ·', 1352 => 'Õ¸', 1353 => 'Õ¹', 1354 => 'Õº', 1355 => 'Õ»', 1356 => 'Õ¼', 1357 => 'Õ½', 1358 => 'Õ¾', 1359 => 'Õ¿', 1360 => 'Ö€', 1361 => 'Ö', 1362 => 'Ö‚', 1363 => 'Öƒ', 1364 => 'Ö„', 1365 => 'Ö…', 1366 => 'Ö†', 1415 => 'Õ¥Ö‚', 1653 => 'اٴ', 1654 => 'وٴ', 1655 => 'Û‡Ù´', 1656 => 'يٴ', 2392 => 'क़', 2393 => 'ख़', 2394 => 'ग़', 2395 => 'ज़', 2396 => 'ड़', 2397 => 'ढ़', 2398 => 'फ़', 2399 => 'य़', 2524 => 'ড়', 2525 => 'ঢ়', 2527 => 'য়', 2611 => 'ਲ਼', 2614 => 'ਸ਼', 2649 => 'ਖ਼', 2650 => 'ਗ਼', 2651 => 'ਜ਼', 2654 => 'ਫ਼', 2908 => 'ଡ଼', 2909 => 'ଢ଼', 3635 => 'à¹à¸²', 3763 => 'à»àº²', 3804 => 'ຫນ', 3805 => 'ຫມ', 3852 => '་', 3907 => 'གྷ', 3917 => 'ཌྷ', 3922 => 'དྷ', 3927 => 'བྷ', 3932 => 'ཛྷ', 3945 => 'ཀྵ', 3955 => 'ཱི', 3957 => 'ཱུ', 3958 => 'ྲྀ', 3959 => 'ྲཱྀ', 3960 => 'ླྀ', 3961 => 'ླཱྀ', 3969 => 'ཱྀ', 3987 => 'ྒྷ', 3997 => 'ྜྷ', 4002 => 'ྡྷ', 4007 => 'ྦྷ', 4012 => 'ྫྷ', 4025 => 'à¾à¾µ', 4295 => 'â´§', 4301 => 'â´­', 4348 => 'ნ', 5112 => 'á°', 5113 => 'á±', 5114 => 'á²', 5115 => 'á³', 5116 => 'á´', 5117 => 'áµ', 7296 => 'в', 7297 => 'д', 7298 => 'о', 7299 => 'Ñ', 7300 => 'Ñ‚', 7301 => 'Ñ‚', 7302 => 'ÑŠ', 7303 => 'Ñ£', 7304 => 'ꙋ', 7312 => 'áƒ', 7313 => 'ბ', 7314 => 'გ', 7315 => 'დ', 7316 => 'ე', 7317 => 'ვ', 7318 => 'ზ', 7319 => 'თ', 7320 => 'ი', 7321 => 'კ', 7322 => 'ლ', 7323 => 'მ', 7324 => 'ნ', 7325 => 'áƒ', 7326 => 'პ', 7327 => 'ჟ', 7328 => 'რ', 7329 => 'ს', 7330 => 'ტ', 7331 => 'უ', 7332 => 'ფ', 7333 => 'ქ', 7334 => 'ღ', 7335 => 'ყ', 7336 => 'შ', 7337 => 'ჩ', 7338 => 'ც', 7339 => 'ძ', 7340 => 'წ', 7341 => 'ჭ', 7342 => 'ხ', 7343 => 'ჯ', 7344 => 'ჰ', 7345 => 'ჱ', 7346 => 'ჲ', 7347 => 'ჳ', 7348 => 'ჴ', 7349 => 'ჵ', 7350 => 'ჶ', 7351 => 'ჷ', 7352 => 'ჸ', 7353 => 'ჹ', 7354 => 'ჺ', 7357 => 'ჽ', 7358 => 'ჾ', 7359 => 'ჿ', 7468 => 'a', 7469 => 'æ', 7470 => 'b', 7472 => 'd', 7473 => 'e', 7474 => 'Ç', 7475 => 'g', 7476 => 'h', 7477 => 'i', 7478 => 'j', 7479 => 'k', 7480 => 'l', 7481 => 'm', 7482 => 'n', 7484 => 'o', 7485 => 'È£', 7486 => 'p', 7487 => 'r', 7488 => 't', 7489 => 'u', 7490 => 'w', 7491 => 'a', 7492 => 'É', 7493 => 'É‘', 7494 => 'á´‚', 7495 => 'b', 7496 => 'd', 7497 => 'e', 7498 => 'É™', 7499 => 'É›', 7500 => 'Éœ', 7501 => 'g', 7503 => 'k', 7504 => 'm', 7505 => 'Å‹', 7506 => 'o', 7507 => 'É”', 7508 => 'á´–', 7509 => 'á´—', 7510 => 'p', 7511 => 't', 7512 => 'u', 7513 => 'á´', 7514 => 'ɯ', 7515 => 'v', 7516 => 'á´¥', 7517 => 'β', 7518 => 'γ', 7519 => 'δ', 7520 => 'φ', 7521 => 'χ', 7522 => 'i', 7523 => 'r', 7524 => 'u', 7525 => 'v', 7526 => 'β', 7527 => 'γ', 7528 => 'Ï', 7529 => 'φ', 7530 => 'χ', 7544 => 'н', 7579 => 'É’', 7580 => 'c', 7581 => 'É•', 7582 => 'ð', 7583 => 'Éœ', 7584 => 'f', 7585 => 'ÉŸ', 7586 => 'É¡', 7587 => 'É¥', 7588 => 'ɨ', 7589 => 'É©', 7590 => 'ɪ', 7591 => 'áµ»', 7592 => 'Ê', 7593 => 'É­', 7594 => 'ᶅ', 7595 => 'ÊŸ', 7596 => 'ɱ', 7597 => 'É°', 7598 => 'ɲ', 7599 => 'ɳ', 7600 => 'É´', 7601 => 'ɵ', 7602 => 'ɸ', 7603 => 'Ê‚', 7604 => 'ʃ', 7605 => 'Æ«', 7606 => 'ʉ', 7607 => 'ÊŠ', 7608 => 'á´œ', 7609 => 'Ê‹', 7610 => 'ÊŒ', 7611 => 'z', 7612 => 'Ê', 7613 => 'Ê‘', 7614 => 'Ê’', 7615 => 'θ', 7680 => 'á¸', 7682 => 'ḃ', 7684 => 'ḅ', 7686 => 'ḇ', 7688 => 'ḉ', 7690 => 'ḋ', 7692 => 'á¸', 7694 => 'á¸', 7696 => 'ḑ', 7698 => 'ḓ', 7700 => 'ḕ', 7702 => 'ḗ', 7704 => 'ḙ', 7706 => 'ḛ', 7708 => 'á¸', 7710 => 'ḟ', 7712 => 'ḡ', 7714 => 'ḣ', 7716 => 'ḥ', 7718 => 'ḧ', 7720 => 'ḩ', 7722 => 'ḫ', 7724 => 'ḭ', 7726 => 'ḯ', 7728 => 'ḱ', 7730 => 'ḳ', 7732 => 'ḵ', 7734 => 'ḷ', 7736 => 'ḹ', 7738 => 'ḻ', 7740 => 'ḽ', 7742 => 'ḿ', 7744 => 'á¹', 7746 => 'ṃ', 7748 => 'á¹…', 7750 => 'ṇ', 7752 => 'ṉ', 7754 => 'ṋ', 7756 => 'á¹', 7758 => 'á¹', 7760 => 'ṑ', 7762 => 'ṓ', 7764 => 'ṕ', 7766 => 'á¹—', 7768 => 'á¹™', 7770 => 'á¹›', 7772 => 'á¹', 7774 => 'ṟ', 7776 => 'ṡ', 7778 => 'á¹£', 7780 => 'á¹¥', 7782 => 'ṧ', 7784 => 'ṩ', 7786 => 'ṫ', 7788 => 'á¹­', 7790 => 'ṯ', 7792 => 'á¹±', 7794 => 'á¹³', 7796 => 'á¹µ', 7798 => 'á¹·', 7800 => 'á¹¹', 7802 => 'á¹»', 7804 => 'á¹½', 7806 => 'ṿ', 7808 => 'áº', 7810 => 'ẃ', 7812 => 'ẅ', 7814 => 'ẇ', 7816 => 'ẉ', 7818 => 'ẋ', 7820 => 'áº', 7822 => 'áº', 7824 => 'ẑ', 7826 => 'ẓ', 7828 => 'ẕ', 7834 => 'aʾ', 7835 => 'ṡ', 7838 => 'ss', 7840 => 'ạ', 7842 => 'ả', 7844 => 'ấ', 7846 => 'ầ', 7848 => 'ẩ', 7850 => 'ẫ', 7852 => 'ậ', 7854 => 'ắ', 7856 => 'ằ', 7858 => 'ẳ', 7860 => 'ẵ', 7862 => 'ặ', 7864 => 'ẹ', 7866 => 'ẻ', 7868 => 'ẽ', 7870 => 'ế', 7872 => 'á»', 7874 => 'ể', 7876 => 'á»…', 7878 => 'ệ', 7880 => 'ỉ', 7882 => 'ị', 7884 => 'á»', 7886 => 'á»', 7888 => 'ố', 7890 => 'ồ', 7892 => 'ổ', 7894 => 'á»—', 7896 => 'á»™', 7898 => 'á»›', 7900 => 'á»', 7902 => 'ở', 7904 => 'ỡ', 7906 => 'ợ', 7908 => 'ụ', 7910 => 'ủ', 7912 => 'ứ', 7914 => 'ừ', 7916 => 'á»­', 7918 => 'ữ', 7920 => 'á»±', 7922 => 'ỳ', 7924 => 'ỵ', 7926 => 'á»·', 7928 => 'ỹ', 7930 => 'á»»', 7932 => 'ỽ', 7934 => 'ỿ', 7944 => 'á¼€', 7945 => 'á¼', 7946 => 'ἂ', 7947 => 'ἃ', 7948 => 'ἄ', 7949 => 'á¼…', 7950 => 'ἆ', 7951 => 'ἇ', 7960 => 'á¼', 7961 => 'ἑ', 7962 => 'á¼’', 7963 => 'ἓ', 7964 => 'á¼”', 7965 => 'ἕ', 7976 => 'á¼ ', 7977 => 'ἡ', 7978 => 'á¼¢', 7979 => 'á¼£', 7980 => 'ἤ', 7981 => 'á¼¥', 7982 => 'ἦ', 7983 => 'ἧ', 7992 => 'á¼°', 7993 => 'á¼±', 7994 => 'á¼²', 7995 => 'á¼³', 7996 => 'á¼´', 7997 => 'á¼µ', 7998 => 'ἶ', 7999 => 'á¼·', 8008 => 'á½€', 8009 => 'á½', 8010 => 'ὂ', 8011 => 'ὃ', 8012 => 'ὄ', 8013 => 'á½…', 8025 => 'ὑ', 8027 => 'ὓ', 8029 => 'ὕ', 8031 => 'á½—', 8040 => 'á½ ', 8041 => 'ὡ', 8042 => 'á½¢', 8043 => 'á½£', 8044 => 'ὤ', 8045 => 'á½¥', 8046 => 'ὦ', 8047 => 'ὧ', 8049 => 'ά', 8051 => 'έ', 8053 => 'ή', 8055 => 'ί', 8057 => 'ÏŒ', 8059 => 'Ï', 8061 => 'ÏŽ', 8064 => 'ἀι', 8065 => 'á¼Î¹', 8066 => 'ἂι', 8067 => 'ἃι', 8068 => 'ἄι', 8069 => 'ἅι', 8070 => 'ἆι', 8071 => 'ἇι', 8072 => 'ἀι', 8073 => 'á¼Î¹', 8074 => 'ἂι', 8075 => 'ἃι', 8076 => 'ἄι', 8077 => 'ἅι', 8078 => 'ἆι', 8079 => 'ἇι', 8080 => 'ἠι', 8081 => 'ἡι', 8082 => 'ἢι', 8083 => 'ἣι', 8084 => 'ἤι', 8085 => 'ἥι', 8086 => 'ἦι', 8087 => 'ἧι', 8088 => 'ἠι', 8089 => 'ἡι', 8090 => 'ἢι', 8091 => 'ἣι', 8092 => 'ἤι', 8093 => 'ἥι', 8094 => 'ἦι', 8095 => 'ἧι', 8096 => 'ὠι', 8097 => 'ὡι', 8098 => 'ὢι', 8099 => 'ὣι', 8100 => 'ὤι', 8101 => 'ὥι', 8102 => 'ὦι', 8103 => 'ὧι', 8104 => 'ὠι', 8105 => 'ὡι', 8106 => 'ὢι', 8107 => 'ὣι', 8108 => 'ὤι', 8109 => 'ὥι', 8110 => 'ὦι', 8111 => 'ὧι', 8114 => 'ὰι', 8115 => 'αι', 8116 => 'άι', 8119 => 'ᾶι', 8120 => 'á¾°', 8121 => 'á¾±', 8122 => 'á½°', 8123 => 'ά', 8124 => 'αι', 8126 => 'ι', 8130 => 'ὴι', 8131 => 'ηι', 8132 => 'ήι', 8135 => 'ῆι', 8136 => 'á½²', 8137 => 'έ', 8138 => 'á½´', 8139 => 'ή', 8140 => 'ηι', 8147 => 'Î', 8152 => 'á¿', 8153 => 'á¿‘', 8154 => 'ὶ', 8155 => 'ί', 8163 => 'ΰ', 8168 => 'á¿ ', 8169 => 'á¿¡', 8170 => 'ὺ', 8171 => 'Ï', 8172 => 'á¿¥', 8178 => 'ὼι', 8179 => 'ωι', 8180 => 'ώι', 8183 => 'ῶι', 8184 => 'ὸ', 8185 => 'ÏŒ', 8186 => 'á½¼', 8187 => 'ÏŽ', 8188 => 'ωι', 8209 => 'â€', 8243 => '′′', 8244 => '′′′', 8246 => '‵‵', 8247 => '‵‵‵', 8279 => '′′′′', 8304 => '0', 8305 => 'i', 8308 => '4', 8309 => '5', 8310 => '6', 8311 => '7', 8312 => '8', 8313 => '9', 8315 => '−', 8319 => 'n', 8320 => '0', 8321 => '1', 8322 => '2', 8323 => '3', 8324 => '4', 8325 => '5', 8326 => '6', 8327 => '7', 8328 => '8', 8329 => '9', 8331 => '−', 8336 => 'a', 8337 => 'e', 8338 => 'o', 8339 => 'x', 8340 => 'É™', 8341 => 'h', 8342 => 'k', 8343 => 'l', 8344 => 'm', 8345 => 'n', 8346 => 'p', 8347 => 's', 8348 => 't', 8360 => 'rs', 8450 => 'c', 8451 => '°c', 8455 => 'É›', 8457 => '°f', 8458 => 'g', 8459 => 'h', 8460 => 'h', 8461 => 'h', 8462 => 'h', 8463 => 'ħ', 8464 => 'i', 8465 => 'i', 8466 => 'l', 8467 => 'l', 8469 => 'n', 8470 => 'no', 8473 => 'p', 8474 => 'q', 8475 => 'r', 8476 => 'r', 8477 => 'r', 8480 => 'sm', 8481 => 'tel', 8482 => 'tm', 8484 => 'z', 8486 => 'ω', 8488 => 'z', 8490 => 'k', 8491 => 'Ã¥', 8492 => 'b', 8493 => 'c', 8495 => 'e', 8496 => 'e', 8497 => 'f', 8499 => 'm', 8500 => 'o', 8501 => '×', 8502 => 'ב', 8503 => '×’', 8504 => 'ד', 8505 => 'i', 8507 => 'fax', 8508 => 'Ï€', 8509 => 'γ', 8510 => 'γ', 8511 => 'Ï€', 8512 => '∑', 8517 => 'd', 8518 => 'd', 8519 => 'e', 8520 => 'i', 8521 => 'j', 8528 => '1â„7', 8529 => '1â„9', 8530 => '1â„10', 8531 => '1â„3', 8532 => '2â„3', 8533 => '1â„5', 8534 => '2â„5', 8535 => '3â„5', 8536 => '4â„5', 8537 => '1â„6', 8538 => '5â„6', 8539 => '1â„8', 8540 => '3â„8', 8541 => '5â„8', 8542 => '7â„8', 8543 => '1â„', 8544 => 'i', 8545 => 'ii', 8546 => 'iii', 8547 => 'iv', 8548 => 'v', 8549 => 'vi', 8550 => 'vii', 8551 => 'viii', 8552 => 'ix', 8553 => 'x', 8554 => 'xi', 8555 => 'xii', 8556 => 'l', 8557 => 'c', 8558 => 'd', 8559 => 'm', 8560 => 'i', 8561 => 'ii', 8562 => 'iii', 8563 => 'iv', 8564 => 'v', 8565 => 'vi', 8566 => 'vii', 8567 => 'viii', 8568 => 'ix', 8569 => 'x', 8570 => 'xi', 8571 => 'xii', 8572 => 'l', 8573 => 'c', 8574 => 'd', 8575 => 'm', 8585 => '0â„3', 8748 => '∫∫', 8749 => '∫∫∫', 8751 => '∮∮', 8752 => '∮∮∮', 9001 => '〈', 9002 => '〉', 9312 => '1', 9313 => '2', 9314 => '3', 9315 => '4', 9316 => '5', 9317 => '6', 9318 => '7', 9319 => '8', 9320 => '9', 9321 => '10', 9322 => '11', 9323 => '12', 9324 => '13', 9325 => '14', 9326 => '15', 9327 => '16', 9328 => '17', 9329 => '18', 9330 => '19', 9331 => '20', 9398 => 'a', 9399 => 'b', 9400 => 'c', 9401 => 'd', 9402 => 'e', 9403 => 'f', 9404 => 'g', 9405 => 'h', 9406 => 'i', 9407 => 'j', 9408 => 'k', 9409 => 'l', 9410 => 'm', 9411 => 'n', 9412 => 'o', 9413 => 'p', 9414 => 'q', 9415 => 'r', 9416 => 's', 9417 => 't', 9418 => 'u', 9419 => 'v', 9420 => 'w', 9421 => 'x', 9422 => 'y', 9423 => 'z', 9424 => 'a', 9425 => 'b', 9426 => 'c', 9427 => 'd', 9428 => 'e', 9429 => 'f', 9430 => 'g', 9431 => 'h', 9432 => 'i', 9433 => 'j', 9434 => 'k', 9435 => 'l', 9436 => 'm', 9437 => 'n', 9438 => 'o', 9439 => 'p', 9440 => 'q', 9441 => 'r', 9442 => 's', 9443 => 't', 9444 => 'u', 9445 => 'v', 9446 => 'w', 9447 => 'x', 9448 => 'y', 9449 => 'z', 9450 => '0', 10764 => '∫∫∫∫', 10972 => 'â«Ì¸', 11264 => 'â°°', 11265 => 'â°±', 11266 => 'â°²', 11267 => 'â°³', 11268 => 'â°´', 11269 => 'â°µ', 11270 => 'â°¶', 11271 => 'â°·', 11272 => 'â°¸', 11273 => 'â°¹', 11274 => 'â°º', 11275 => 'â°»', 11276 => 'â°¼', 11277 => 'â°½', 11278 => 'â°¾', 11279 => 'â°¿', 11280 => 'â±€', 11281 => 'â±', 11282 => 'ⱂ', 11283 => 'ⱃ', 11284 => 'ⱄ', 11285 => 'â±…', 11286 => 'ⱆ', 11287 => 'ⱇ', 11288 => 'ⱈ', 11289 => 'ⱉ', 11290 => 'ⱊ', 11291 => 'ⱋ', 11292 => 'ⱌ', 11293 => 'â±', 11294 => 'ⱎ', 11295 => 'â±', 11296 => 'â±', 11297 => 'ⱑ', 11298 => 'â±’', 11299 => 'ⱓ', 11300 => 'â±”', 11301 => 'ⱕ', 11302 => 'â±–', 11303 => 'â±—', 11304 => 'ⱘ', 11305 => 'â±™', 11306 => 'ⱚ', 11307 => 'â±›', 11308 => 'ⱜ', 11309 => 'â±', 11310 => 'ⱞ', 11360 => 'ⱡ', 11362 => 'É«', 11363 => 'áµ½', 11364 => 'ɽ', 11367 => 'ⱨ', 11369 => 'ⱪ', 11371 => 'ⱬ', 11373 => 'É‘', 11374 => 'ɱ', 11375 => 'É', 11376 => 'É’', 11378 => 'â±³', 11381 => 'ⱶ', 11388 => 'j', 11389 => 'v', 11390 => 'È¿', 11391 => 'É€', 11392 => 'â²', 11394 => 'ⲃ', 11396 => 'â²…', 11398 => 'ⲇ', 11400 => 'ⲉ', 11402 => 'ⲋ', 11404 => 'â²', 11406 => 'â²', 11408 => 'ⲑ', 11410 => 'ⲓ', 11412 => 'ⲕ', 11414 => 'â²—', 11416 => 'â²™', 11418 => 'â²›', 11420 => 'â²', 11422 => 'ⲟ', 11424 => 'ⲡ', 11426 => 'â²£', 11428 => 'â²¥', 11430 => 'ⲧ', 11432 => 'ⲩ', 11434 => 'ⲫ', 11436 => 'â²­', 11438 => 'ⲯ', 11440 => 'â²±', 11442 => 'â²³', 11444 => 'â²µ', 11446 => 'â²·', 11448 => 'â²¹', 11450 => 'â²»', 11452 => 'â²½', 11454 => 'ⲿ', 11456 => 'â³', 11458 => 'ⳃ', 11460 => 'â³…', 11462 => 'ⳇ', 11464 => 'ⳉ', 11466 => 'ⳋ', 11468 => 'â³', 11470 => 'â³', 11472 => 'ⳑ', 11474 => 'ⳓ', 11476 => 'ⳕ', 11478 => 'â³—', 11480 => 'â³™', 11482 => 'â³›', 11484 => 'â³', 11486 => 'ⳟ', 11488 => 'ⳡ', 11490 => 'â³£', 11499 => 'ⳬ', 11501 => 'â³®', 11506 => 'â³³', 11631 => 'ⵡ', 11935 => 'æ¯', 12019 => '龟', 12032 => '一', 12033 => '丨', 12034 => '丶', 12035 => '丿', 12036 => 'ä¹™', 12037 => '亅', 12038 => '二', 12039 => '亠', 12040 => '人', 12041 => 'å„¿', 12042 => 'å…¥', 12043 => 'å…«', 12044 => '冂', 12045 => '冖', 12046 => '冫', 12047 => '几', 12048 => '凵', 12049 => '刀', 12050 => '力', 12051 => '勹', 12052 => '匕', 12053 => '匚', 12054 => '匸', 12055 => 'å', 12056 => 'åœ', 12057 => 'å©', 12058 => '厂', 12059 => '厶', 12060 => 'åˆ', 12061 => 'å£', 12062 => 'å›—', 12063 => '土', 12064 => '士', 12065 => '夂', 12066 => '夊', 12067 => '夕', 12068 => '大', 12069 => '女', 12070 => 'å­', 12071 => '宀', 12072 => '寸', 12073 => 'å°', 12074 => 'å°¢', 12075 => 'å°¸', 12076 => 'å±®', 12077 => 'å±±', 12078 => 'å·›', 12079 => 'å·¥', 12080 => 'å·±', 12081 => 'å·¾', 12082 => 'å¹²', 12083 => '幺', 12084 => '广', 12085 => 'å»´', 12086 => '廾', 12087 => '弋', 12088 => '弓', 12089 => 'å½', 12090 => '彡', 12091 => 'å½³', 12092 => '心', 12093 => '戈', 12094 => '戶', 12095 => '手', 12096 => '支', 12097 => 'æ”´', 12098 => 'æ–‡', 12099 => 'æ–—', 12100 => 'æ–¤', 12101 => 'æ–¹', 12102 => 'æ— ', 12103 => 'æ—¥', 12104 => 'æ›°', 12105 => '月', 12106 => '木', 12107 => '欠', 12108 => 'æ­¢', 12109 => 'æ­¹', 12110 => '殳', 12111 => '毋', 12112 => '比', 12113 => '毛', 12114 => 'æ°', 12115 => 'æ°”', 12116 => 'æ°´', 12117 => 'ç«', 12118 => '爪', 12119 => '父', 12120 => '爻', 12121 => '爿', 12122 => '片', 12123 => '牙', 12124 => '牛', 12125 => '犬', 12126 => '玄', 12127 => '玉', 12128 => 'ç“œ', 12129 => '瓦', 12130 => '甘', 12131 => '生', 12132 => '用', 12133 => 'ç”°', 12134 => 'ç–‹', 12135 => 'ç–’', 12136 => '癶', 12137 => '白', 12138 => 'çš®', 12139 => 'çš¿', 12140 => 'ç›®', 12141 => '矛', 12142 => '矢', 12143 => '石', 12144 => '示', 12145 => '禸', 12146 => '禾', 12147 => 'ç©´', 12148 => 'ç«‹', 12149 => '竹', 12150 => 'ç±³', 12151 => '糸', 12152 => '缶', 12153 => '网', 12154 => '羊', 12155 => 'ç¾½', 12156 => 'è€', 12157 => '而', 12158 => '耒', 12159 => '耳', 12160 => 'è¿', 12161 => '肉', 12162 => '臣', 12163 => '自', 12164 => '至', 12165 => '臼', 12166 => '舌', 12167 => '舛', 12168 => '舟', 12169 => '艮', 12170 => '色', 12171 => '艸', 12172 => 'è™', 12173 => '虫', 12174 => 'è¡€', 12175 => 'è¡Œ', 12176 => 'è¡£', 12177 => '襾', 12178 => '見', 12179 => '角', 12180 => '言', 12181 => 'è°·', 12182 => '豆', 12183 => '豕', 12184 => '豸', 12185 => 'è²', 12186 => '赤', 12187 => 'èµ°', 12188 => '足', 12189 => '身', 12190 => '車', 12191 => 'è¾›', 12192 => 'è¾°', 12193 => 'è¾µ', 12194 => 'é‚‘', 12195 => 'é…‰', 12196 => '釆', 12197 => '里', 12198 => '金', 12199 => 'é•·', 12200 => 'é–€', 12201 => '阜', 12202 => '隶', 12203 => 'éš¹', 12204 => '雨', 12205 => 'é‘', 12206 => 'éž', 12207 => 'é¢', 12208 => 'é©', 12209 => '韋', 12210 => '韭', 12211 => '音', 12212 => 'é ', 12213 => '風', 12214 => '飛', 12215 => '食', 12216 => '首', 12217 => '香', 12218 => '馬', 12219 => '骨', 12220 => '高', 12221 => 'é«Ÿ', 12222 => '鬥', 12223 => '鬯', 12224 => '鬲', 12225 => '鬼', 12226 => 'é­š', 12227 => 'é³¥', 12228 => 'é¹µ', 12229 => '鹿', 12230 => '麥', 12231 => '麻', 12232 => '黃', 12233 => 'é»', 12234 => '黑', 12235 => '黹', 12236 => '黽', 12237 => '鼎', 12238 => '鼓', 12239 => 'é¼ ', 12240 => 'é¼»', 12241 => '齊', 12242 => 'é½’', 12243 => 'é¾', 12244 => '龜', 12245 => 'é¾ ', 12290 => '.', 12342 => '〒', 12344 => 'å', 12345 => 'å„', 12346 => 'å…', 12447 => 'より', 12543 => 'コト', 12593 => 'á„€', 12594 => 'á„', 12595 => 'ᆪ', 12596 => 'á„‚', 12597 => 'ᆬ', 12598 => 'ᆭ', 12599 => 'ᄃ', 12600 => 'á„„', 12601 => 'á„…', 12602 => 'ᆰ', 12603 => 'ᆱ', 12604 => 'ᆲ', 12605 => 'ᆳ', 12606 => 'ᆴ', 12607 => 'ᆵ', 12608 => 'á„š', 12609 => 'ᄆ', 12610 => 'ᄇ', 12611 => 'ᄈ', 12612 => 'á„¡', 12613 => 'ᄉ', 12614 => 'á„Š', 12615 => 'á„‹', 12616 => 'á„Œ', 12617 => 'á„', 12618 => 'á„Ž', 12619 => 'á„', 12620 => 'á„', 12621 => 'á„‘', 12622 => 'á„’', 12623 => 'á…¡', 12624 => 'á…¢', 12625 => 'á…£', 12626 => 'á…¤', 12627 => 'á…¥', 12628 => 'á…¦', 12629 => 'á…§', 12630 => 'á…¨', 12631 => 'á…©', 12632 => 'á…ª', 12633 => 'á…«', 12634 => 'á…¬', 12635 => 'á…­', 12636 => 'á…®', 12637 => 'á…¯', 12638 => 'á…°', 12639 => 'á…±', 12640 => 'á…²', 12641 => 'á…³', 12642 => 'á…´', 12643 => 'á…µ', 12645 => 'á„”', 12646 => 'á„•', 12647 => 'ᇇ', 12648 => 'ᇈ', 12649 => 'ᇌ', 12650 => 'ᇎ', 12651 => 'ᇓ', 12652 => 'ᇗ', 12653 => 'ᇙ', 12654 => 'á„œ', 12655 => 'á‡', 12656 => 'ᇟ', 12657 => 'á„', 12658 => 'á„ž', 12659 => 'á„ ', 12660 => 'á„¢', 12661 => 'á„£', 12662 => 'ᄧ', 12663 => 'á„©', 12664 => 'á„«', 12665 => 'ᄬ', 12666 => 'á„­', 12667 => 'á„®', 12668 => 'ᄯ', 12669 => 'ᄲ', 12670 => 'ᄶ', 12671 => 'á…€', 12672 => 'á…‡', 12673 => 'á…Œ', 12674 => 'ᇱ', 12675 => 'ᇲ', 12676 => 'á…—', 12677 => 'á…˜', 12678 => 'á…™', 12679 => 'ᆄ', 12680 => 'ᆅ', 12681 => 'ᆈ', 12682 => 'ᆑ', 12683 => 'ᆒ', 12684 => 'ᆔ', 12685 => 'ᆞ', 12686 => 'ᆡ', 12690 => '一', 12691 => '二', 12692 => '三', 12693 => 'å››', 12694 => '上', 12695 => '中', 12696 => '下', 12697 => '甲', 12698 => 'ä¹™', 12699 => '丙', 12700 => 'ä¸', 12701 => '天', 12702 => '地', 12703 => '人', 12868 => 'å•', 12869 => 'å¹¼', 12870 => 'æ–‡', 12871 => 'ç®', 12880 => 'pte', 12881 => '21', 12882 => '22', 12883 => '23', 12884 => '24', 12885 => '25', 12886 => '26', 12887 => '27', 12888 => '28', 12889 => '29', 12890 => '30', 12891 => '31', 12892 => '32', 12893 => '33', 12894 => '34', 12895 => '35', 12896 => 'á„€', 12897 => 'á„‚', 12898 => 'ᄃ', 12899 => 'á„…', 12900 => 'ᄆ', 12901 => 'ᄇ', 12902 => 'ᄉ', 12903 => 'á„‹', 12904 => 'á„Œ', 12905 => 'á„Ž', 12906 => 'á„', 12907 => 'á„', 12908 => 'á„‘', 12909 => 'á„’', 12910 => 'ê°€', 12911 => '나', 12912 => '다', 12913 => 'ë¼', 12914 => '마', 12915 => 'ë°”', 12916 => '사', 12917 => 'ì•„', 12918 => 'ìž', 12919 => 'ì°¨', 12920 => 'ì¹´', 12921 => '타', 12922 => '파', 12923 => '하', 12924 => '참고', 12925 => '주ì˜', 12926 => 'ìš°', 12928 => '一', 12929 => '二', 12930 => '三', 12931 => 'å››', 12932 => '五', 12933 => 'å…­', 12934 => '七', 12935 => 'å…«', 12936 => 'ä¹', 12937 => 'å', 12938 => '月', 12939 => 'ç«', 12940 => 'æ°´', 12941 => '木', 12942 => '金', 12943 => '土', 12944 => 'æ—¥', 12945 => 'æ ª', 12946 => '有', 12947 => '社', 12948 => 'å', 12949 => '特', 12950 => '財', 12951 => 'ç¥', 12952 => '労', 12953 => '秘', 12954 => 'ç”·', 12955 => '女', 12956 => 'é©', 12957 => '優', 12958 => 'å°', 12959 => '注', 12960 => 'é …', 12961 => '休', 12962 => '写', 12963 => 'æ­£', 12964 => '上', 12965 => '中', 12966 => '下', 12967 => 'å·¦', 12968 => 'å³', 12969 => '医', 12970 => 'å®—', 12971 => 'å­¦', 12972 => '監', 12973 => 'ä¼', 12974 => '資', 12975 => 'å”', 12976 => '夜', 12977 => '36', 12978 => '37', 12979 => '38', 12980 => '39', 12981 => '40', 12982 => '41', 12983 => '42', 12984 => '43', 12985 => '44', 12986 => '45', 12987 => '46', 12988 => '47', 12989 => '48', 12990 => '49', 12991 => '50', 12992 => '1月', 12993 => '2月', 12994 => '3月', 12995 => '4月', 12996 => '5月', 12997 => '6月', 12998 => '7月', 12999 => '8月', 13000 => '9月', 13001 => '10月', 13002 => '11月', 13003 => '12月', 13004 => 'hg', 13005 => 'erg', 13006 => 'ev', 13007 => 'ltd', 13008 => 'ã‚¢', 13009 => 'イ', 13010 => 'ウ', 13011 => 'エ', 13012 => 'オ', 13013 => 'ã‚«', 13014 => 'ã‚­', 13015 => 'ク', 13016 => 'ケ', 13017 => 'コ', 13018 => 'サ', 13019 => 'ã‚·', 13020 => 'ス', 13021 => 'ã‚»', 13022 => 'ソ', 13023 => 'ã‚¿', 13024 => 'ãƒ', 13025 => 'ツ', 13026 => 'テ', 13027 => 'ト', 13028 => 'ナ', 13029 => 'ニ', 13030 => 'ヌ', 13031 => 'ãƒ', 13032 => 'ノ', 13033 => 'ãƒ', 13034 => 'ヒ', 13035 => 'フ', 13036 => 'ヘ', 13037 => 'ホ', 13038 => 'マ', 13039 => 'ミ', 13040 => 'ム', 13041 => 'メ', 13042 => 'モ', 13043 => 'ヤ', 13044 => 'ユ', 13045 => 'ヨ', 13046 => 'ラ', 13047 => 'リ', 13048 => 'ル', 13049 => 'レ', 13050 => 'ロ', 13051 => 'ワ', 13052 => 'ヰ', 13053 => 'ヱ', 13054 => 'ヲ', 13055 => '令和', 13056 => 'アパート', 13057 => 'アルファ', 13058 => 'アンペア', 13059 => 'アール', 13060 => 'イニング', 13061 => 'インãƒ', 13062 => 'ウォン', 13063 => 'エスクード', 13064 => 'エーカー', 13065 => 'オンス', 13066 => 'オーム', 13067 => 'カイリ', 13068 => 'カラット', 13069 => 'カロリー', 13070 => 'ガロン', 13071 => 'ガンマ', 13072 => 'ギガ', 13073 => 'ギニー', 13074 => 'キュリー', 13075 => 'ギルダー', 13076 => 'キロ', 13077 => 'キログラム', 13078 => 'キロメートル', 13079 => 'キロワット', 13080 => 'グラム', 13081 => 'グラムトン', 13082 => 'クルゼイロ', 13083 => 'クローãƒ', 13084 => 'ケース', 13085 => 'コルナ', 13086 => 'コーãƒ', 13087 => 'サイクル', 13088 => 'サンãƒãƒ¼ãƒ ', 13089 => 'シリング', 13090 => 'センãƒ', 13091 => 'セント', 13092 => 'ダース', 13093 => 'デシ', 13094 => 'ドル', 13095 => 'トン', 13096 => 'ナノ', 13097 => 'ノット', 13098 => 'ãƒã‚¤ãƒ„', 13099 => 'パーセント', 13100 => 'パーツ', 13101 => 'ãƒãƒ¼ãƒ¬ãƒ«', 13102 => 'ピアストル', 13103 => 'ピクル', 13104 => 'ピコ', 13105 => 'ビル', 13106 => 'ファラッド', 13107 => 'フィート', 13108 => 'ブッシェル', 13109 => 'フラン', 13110 => 'ヘクタール', 13111 => 'ペソ', 13112 => 'ペニヒ', 13113 => 'ヘルツ', 13114 => 'ペンス', 13115 => 'ページ', 13116 => 'ベータ', 13117 => 'ãƒã‚¤ãƒ³ãƒˆ', 13118 => 'ボルト', 13119 => 'ホン', 13120 => 'ãƒãƒ³ãƒ‰', 13121 => 'ホール', 13122 => 'ホーン', 13123 => 'マイクロ', 13124 => 'マイル', 13125 => 'マッãƒ', 13126 => 'マルク', 13127 => 'マンション', 13128 => 'ミクロン', 13129 => 'ミリ', 13130 => 'ミリãƒãƒ¼ãƒ«', 13131 => 'メガ', 13132 => 'メガトン', 13133 => 'メートル', 13134 => 'ヤード', 13135 => 'ヤール', 13136 => 'ユアン', 13137 => 'リットル', 13138 => 'リラ', 13139 => 'ルピー', 13140 => 'ルーブル', 13141 => 'レム', 13142 => 'レントゲン', 13143 => 'ワット', 13144 => '0点', 13145 => '1点', 13146 => '2点', 13147 => '3点', 13148 => '4点', 13149 => '5点', 13150 => '6点', 13151 => '7点', 13152 => '8点', 13153 => '9点', 13154 => '10点', 13155 => '11点', 13156 => '12点', 13157 => '13点', 13158 => '14点', 13159 => '15点', 13160 => '16点', 13161 => '17点', 13162 => '18点', 13163 => '19点', 13164 => '20点', 13165 => '21点', 13166 => '22点', 13167 => '23点', 13168 => '24点', 13169 => 'hpa', 13170 => 'da', 13171 => 'au', 13172 => 'bar', 13173 => 'ov', 13174 => 'pc', 13175 => 'dm', 13176 => 'dm2', 13177 => 'dm3', 13178 => 'iu', 13179 => 'å¹³æˆ', 13180 => '昭和', 13181 => '大正', 13182 => '明治', 13183 => 'æ ªå¼ä¼šç¤¾', 13184 => 'pa', 13185 => 'na', 13186 => 'μa', 13187 => 'ma', 13188 => 'ka', 13189 => 'kb', 13190 => 'mb', 13191 => 'gb', 13192 => 'cal', 13193 => 'kcal', 13194 => 'pf', 13195 => 'nf', 13196 => 'μf', 13197 => 'μg', 13198 => 'mg', 13199 => 'kg', 13200 => 'hz', 13201 => 'khz', 13202 => 'mhz', 13203 => 'ghz', 13204 => 'thz', 13205 => 'μl', 13206 => 'ml', 13207 => 'dl', 13208 => 'kl', 13209 => 'fm', 13210 => 'nm', 13211 => 'μm', 13212 => 'mm', 13213 => 'cm', 13214 => 'km', 13215 => 'mm2', 13216 => 'cm2', 13217 => 'm2', 13218 => 'km2', 13219 => 'mm3', 13220 => 'cm3', 13221 => 'm3', 13222 => 'km3', 13223 => 'm∕s', 13224 => 'm∕s2', 13225 => 'pa', 13226 => 'kpa', 13227 => 'mpa', 13228 => 'gpa', 13229 => 'rad', 13230 => 'rad∕s', 13231 => 'rad∕s2', 13232 => 'ps', 13233 => 'ns', 13234 => 'μs', 13235 => 'ms', 13236 => 'pv', 13237 => 'nv', 13238 => 'μv', 13239 => 'mv', 13240 => 'kv', 13241 => 'mv', 13242 => 'pw', 13243 => 'nw', 13244 => 'μw', 13245 => 'mw', 13246 => 'kw', 13247 => 'mw', 13248 => 'kω', 13249 => 'mω', 13251 => 'bq', 13252 => 'cc', 13253 => 'cd', 13254 => 'c∕kg', 13256 => 'db', 13257 => 'gy', 13258 => 'ha', 13259 => 'hp', 13260 => 'in', 13261 => 'kk', 13262 => 'km', 13263 => 'kt', 13264 => 'lm', 13265 => 'ln', 13266 => 'log', 13267 => 'lx', 13268 => 'mb', 13269 => 'mil', 13270 => 'mol', 13271 => 'ph', 13273 => 'ppm', 13274 => 'pr', 13275 => 'sr', 13276 => 'sv', 13277 => 'wb', 13278 => 'v∕m', 13279 => 'a∕m', 13280 => '1æ—¥', 13281 => '2æ—¥', 13282 => '3æ—¥', 13283 => '4æ—¥', 13284 => '5æ—¥', 13285 => '6æ—¥', 13286 => '7æ—¥', 13287 => '8æ—¥', 13288 => '9æ—¥', 13289 => '10æ—¥', 13290 => '11æ—¥', 13291 => '12æ—¥', 13292 => '13æ—¥', 13293 => '14æ—¥', 13294 => '15æ—¥', 13295 => '16æ—¥', 13296 => '17æ—¥', 13297 => '18æ—¥', 13298 => '19æ—¥', 13299 => '20æ—¥', 13300 => '21æ—¥', 13301 => '22æ—¥', 13302 => '23æ—¥', 13303 => '24æ—¥', 13304 => '25æ—¥', 13305 => '26æ—¥', 13306 => '27æ—¥', 13307 => '28æ—¥', 13308 => '29æ—¥', 13309 => '30æ—¥', 13310 => '31æ—¥', 13311 => 'gal', 42560 => 'ê™', 42562 => 'ꙃ', 42564 => 'ê™…', 42566 => 'ꙇ', 42568 => 'ꙉ', 42570 => 'ꙋ', 42572 => 'ê™', 42574 => 'ê™', 42576 => 'ꙑ', 42578 => 'ꙓ', 42580 => 'ꙕ', 42582 => 'ê™—', 42584 => 'ê™™', 42586 => 'ê™›', 42588 => 'ê™', 42590 => 'ꙟ', 42592 => 'ꙡ', 42594 => 'ꙣ', 42596 => 'ꙥ', 42598 => 'ꙧ', 42600 => 'ꙩ', 42602 => 'ꙫ', 42604 => 'ê™­', 42624 => 'êš', 42626 => 'ꚃ', 42628 => 'êš…', 42630 => 'ꚇ', 42632 => 'ꚉ', 42634 => 'êš‹', 42636 => 'êš', 42638 => 'êš', 42640 => 'êš‘', 42642 => 'êš“', 42644 => 'êš•', 42646 => 'êš—', 42648 => 'êš™', 42650 => 'êš›', 42652 => 'ÑŠ', 42653 => 'ÑŒ', 42786 => 'ꜣ', 42788 => 'ꜥ', 42790 => 'ꜧ', 42792 => 'ꜩ', 42794 => 'ꜫ', 42796 => 'ꜭ', 42798 => 'ꜯ', 42802 => 'ꜳ', 42804 => 'ꜵ', 42806 => 'ꜷ', 42808 => 'ꜹ', 42810 => 'ꜻ', 42812 => 'ꜽ', 42814 => 'ꜿ', 42816 => 'ê', 42818 => 'êƒ', 42820 => 'ê…', 42822 => 'ê‡', 42824 => 'ê‰', 42826 => 'ê‹', 42828 => 'ê', 42830 => 'ê', 42832 => 'ê‘', 42834 => 'ê“', 42836 => 'ê•', 42838 => 'ê—', 42840 => 'ê™', 42842 => 'ê›', 42844 => 'ê', 42846 => 'êŸ', 42848 => 'ê¡', 42850 => 'ê£', 42852 => 'ê¥', 42854 => 'ê§', 42856 => 'ê©', 42858 => 'ê«', 42860 => 'ê­', 42862 => 'ê¯', 42864 => 'ê¯', 42873 => 'êº', 42875 => 'ê¼', 42877 => 'áµ¹', 42878 => 'ê¿', 42880 => 'êž', 42882 => 'ꞃ', 42884 => 'êž…', 42886 => 'ꞇ', 42891 => 'ꞌ', 42893 => 'É¥', 42896 => 'êž‘', 42898 => 'êž“', 42902 => 'êž—', 42904 => 'êž™', 42906 => 'êž›', 42908 => 'êž', 42910 => 'ꞟ', 42912 => 'êž¡', 42914 => 'ꞣ', 42916 => 'ꞥ', 42918 => 'ꞧ', 42920 => 'êž©', 42922 => 'ɦ', 42923 => 'Éœ', 42924 => 'É¡', 42925 => 'ɬ', 42926 => 'ɪ', 42928 => 'Êž', 42929 => 'ʇ', 42930 => 'Ê', 42931 => 'ê­“', 42932 => 'êžµ', 42934 => 'êž·', 42936 => 'êž¹', 42938 => 'êž»', 42940 => 'êž½', 42942 => 'êž¿', 42946 => 'ꟃ', 42948 => 'êž”', 42949 => 'Ê‚', 42950 => 'ᶎ', 42951 => 'ꟈ', 42953 => 'ꟊ', 42997 => 'ꟶ', 43000 => 'ħ', 43001 => 'Å“', 43868 => 'ꜧ', 43869 => 'ꬷ', 43870 => 'É«', 43871 => 'ê­’', 43881 => 'Ê', 43888 => 'Ꭰ', 43889 => 'Ꭱ', 43890 => 'Ꭲ', 43891 => 'Ꭳ', 43892 => 'Ꭴ', 43893 => 'Ꭵ', 43894 => 'Ꭶ', 43895 => 'Ꭷ', 43896 => 'Ꭸ', 43897 => 'Ꭹ', 43898 => 'Ꭺ', 43899 => 'Ꭻ', 43900 => 'Ꭼ', 43901 => 'Ꭽ', 43902 => 'Ꭾ', 43903 => 'Ꭿ', 43904 => 'Ꮀ', 43905 => 'Ꮁ', 43906 => 'Ꮂ', 43907 => 'Ꮃ', 43908 => 'Ꮄ', 43909 => 'Ꮅ', 43910 => 'Ꮆ', 43911 => 'Ꮇ', 43912 => 'Ꮈ', 43913 => 'Ꮉ', 43914 => 'Ꮊ', 43915 => 'Ꮋ', 43916 => 'Ꮌ', 43917 => 'Ꮍ', 43918 => 'Ꮎ', 43919 => 'Ꮏ', 43920 => 'á€', 43921 => 'á', 43922 => 'á‚', 43923 => 'áƒ', 43924 => 'á„', 43925 => 'á…', 43926 => 'á†', 43927 => 'á‡', 43928 => 'áˆ', 43929 => 'á‰', 43930 => 'áŠ', 43931 => 'á‹', 43932 => 'áŒ', 43933 => 'á', 43934 => 'áŽ', 43935 => 'á', 43936 => 'á', 43937 => 'á‘', 43938 => 'á’', 43939 => 'á“', 43940 => 'á”', 43941 => 'á•', 43942 => 'á–', 43943 => 'á—', 43944 => 'á˜', 43945 => 'á™', 43946 => 'áš', 43947 => 'á›', 43948 => 'áœ', 43949 => 'á', 43950 => 'áž', 43951 => 'áŸ', 43952 => 'á ', 43953 => 'á¡', 43954 => 'á¢', 43955 => 'á£', 43956 => 'á¤', 43957 => 'á¥', 43958 => 'á¦', 43959 => 'á§', 43960 => 'á¨', 43961 => 'á©', 43962 => 'áª', 43963 => 'á«', 43964 => 'á¬', 43965 => 'á­', 43966 => 'á®', 43967 => 'á¯', 63744 => '豈', 63745 => 'æ›´', 63746 => '車', 63747 => '賈', 63748 => '滑', 63749 => '串', 63750 => 'å¥', 63751 => '龜', 63752 => '龜', 63753 => '契', 63754 => '金', 63755 => 'å–‡', 63756 => '奈', 63757 => '懶', 63758 => '癩', 63759 => 'ç¾…', 63760 => '蘿', 63761 => '螺', 63762 => '裸', 63763 => 'é‚', 63764 => '樂', 63765 => 'æ´›', 63766 => '烙', 63767 => 'çž', 63768 => 'è½', 63769 => 'é…ª', 63770 => '駱', 63771 => '亂', 63772 => 'åµ', 63773 => '欄', 63774 => '爛', 63775 => '蘭', 63776 => '鸞', 63777 => 'åµ', 63778 => 'æ¿«', 63779 => 'è—', 63780 => '襤', 63781 => '拉', 63782 => '臘', 63783 => 'è Ÿ', 63784 => '廊', 63785 => '朗', 63786 => '浪', 63787 => '狼', 63788 => '郎', 63789 => '來', 63790 => '冷', 63791 => 'å‹ž', 63792 => 'æ“„', 63793 => 'æ«“', 63794 => 'çˆ', 63795 => '盧', 63796 => 'è€', 63797 => '蘆', 63798 => '虜', 63799 => 'è·¯', 63800 => '露', 63801 => 'é­¯', 63802 => 'é·º', 63803 => '碌', 63804 => '祿', 63805 => '綠', 63806 => 'è‰', 63807 => '錄', 63808 => '鹿', 63809 => 'è«–', 63810 => '壟', 63811 => '弄', 63812 => 'ç± ', 63813 => 'è¾', 63814 => '牢', 63815 => '磊', 63816 => '賂', 63817 => 'é›·', 63818 => '壘', 63819 => 'å±¢', 63820 => '樓', 63821 => 'æ·š', 63822 => 'æ¼', 63823 => 'ç´¯', 63824 => '縷', 63825 => '陋', 63826 => 'å‹’', 63827 => 'è‚‹', 63828 => '凜', 63829 => '凌', 63830 => '稜', 63831 => '綾', 63832 => 'è±', 63833 => '陵', 63834 => '讀', 63835 => 'æ‹', 63836 => '樂', 63837 => '諾', 63838 => '丹', 63839 => '寧', 63840 => '怒', 63841 => '率', 63842 => 'ç•°', 63843 => '北', 63844 => '磻', 63845 => '便', 63846 => '復', 63847 => 'ä¸', 63848 => '泌', 63849 => '數', 63850 => 'ç´¢', 63851 => 'åƒ', 63852 => 'å¡ž', 63853 => 'çœ', 63854 => '葉', 63855 => '說', 63856 => '殺', 63857 => 'è¾°', 63858 => '沈', 63859 => '拾', 63860 => 'è‹¥', 63861 => '掠', 63862 => 'ç•¥', 63863 => '亮', 63864 => 'å…©', 63865 => '凉', 63866 => 'æ¢', 63867 => '糧', 63868 => '良', 63869 => 'è«’', 63870 => 'é‡', 63871 => '勵', 63872 => 'å‘‚', 63873 => '女', 63874 => '廬', 63875 => 'æ—…', 63876 => '濾', 63877 => '礪', 63878 => 'é–­', 63879 => '驪', 63880 => '麗', 63881 => '黎', 63882 => '力', 63883 => '曆', 63884 => 'æ­·', 63885 => 'è½¢', 63886 => 'å¹´', 63887 => 'æ†', 63888 => '戀', 63889 => 'æ’š', 63890 => 'æ¼£', 63891 => 'ç…‰', 63892 => 'ç’‰', 63893 => '秊', 63894 => 'ç·´', 63895 => 'è¯', 63896 => '輦', 63897 => 'è“®', 63898 => '連', 63899 => 'éŠ', 63900 => '列', 63901 => '劣', 63902 => 'å’½', 63903 => '烈', 63904 => '裂', 63905 => '說', 63906 => '廉', 63907 => '念', 63908 => 'æ»', 63909 => 'æ®®', 63910 => 'ç°¾', 63911 => 'çµ', 63912 => '令', 63913 => '囹', 63914 => '寧', 63915 => '嶺', 63916 => '怜', 63917 => '玲', 63918 => 'ç‘©', 63919 => '羚', 63920 => 'è†', 63921 => '鈴', 63922 => '零', 63923 => 'éˆ', 63924 => 'é ˜', 63925 => '例', 63926 => '禮', 63927 => '醴', 63928 => '隸', 63929 => '惡', 63930 => '了', 63931 => '僚', 63932 => '寮', 63933 => 'å°¿', 63934 => 'æ–™', 63935 => '樂', 63936 => '燎', 63937 => '療', 63938 => '蓼', 63939 => 'é¼', 63940 => 'é¾', 63941 => '暈', 63942 => '阮', 63943 => '劉', 63944 => 'æ»', 63945 => '柳', 63946 => 'æµ', 63947 => '溜', 63948 => 'ç‰', 63949 => 'ç•™', 63950 => 'ç¡«', 63951 => 'ç´', 63952 => 'é¡ž', 63953 => 'å…­', 63954 => '戮', 63955 => '陸', 63956 => '倫', 63957 => 'å´™', 63958 => 'æ·ª', 63959 => '輪', 63960 => '律', 63961 => 'æ…„', 63962 => 'æ —', 63963 => '率', 63964 => '隆', 63965 => '利', 63966 => 'å', 63967 => 'å±¥', 63968 => '易', 63969 => 'æŽ', 63970 => '梨', 63971 => 'æ³¥', 63972 => 'ç†', 63973 => 'ç—¢', 63974 => 'ç½¹', 63975 => 'è£', 63976 => '裡', 63977 => '里', 63978 => '離', 63979 => '匿', 63980 => '溺', 63981 => 'å', 63982 => 'ç‡', 63983 => 'ç’˜', 63984 => 'è—º', 63985 => '隣', 63986 => 'é±—', 63987 => '麟', 63988 => 'æž—', 63989 => 'æ·‹', 63990 => '臨', 63991 => 'ç«‹', 63992 => '笠', 63993 => 'ç²’', 63994 => 'ç‹€', 63995 => 'ç‚™', 63996 => 'è­˜', 63997 => '什', 63998 => '茶', 63999 => '刺', 64000 => '切', 64001 => '度', 64002 => 'æ‹“', 64003 => 'ç³–', 64004 => 'å®…', 64005 => 'æ´ž', 64006 => 'æš´', 64007 => 'è¼»', 64008 => 'è¡Œ', 64009 => 'é™', 64010 => '見', 64011 => '廓', 64012 => 'å…€', 64013 => 'å—€', 64016 => 'å¡š', 64018 => 'æ™´', 64021 => '凞', 64022 => '猪', 64023 => '益', 64024 => '礼', 64025 => '神', 64026 => '祥', 64027 => 'ç¦', 64028 => 'é–', 64029 => 'ç²¾', 64030 => 'ç¾½', 64032 => '蘒', 64034 => '諸', 64037 => '逸', 64038 => '都', 64042 => '飯', 64043 => '飼', 64044 => '館', 64045 => '鶴', 64046 => '郞', 64047 => 'éš·', 64048 => 'ä¾®', 64049 => '僧', 64050 => 'å…', 64051 => '勉', 64052 => '勤', 64053 => 'å‘', 64054 => 'å–', 64055 => '嘆', 64056 => '器', 64057 => 'å¡€', 64058 => '墨', 64059 => '層', 64060 => 'å±®', 64061 => 'æ‚”', 64062 => 'æ…¨', 64063 => '憎', 64064 => '懲', 64065 => 'æ•', 64066 => 'æ—¢', 64067 => 'æš‘', 64068 => '梅', 64069 => 'æµ·', 64070 => '渚', 64071 => 'æ¼¢', 64072 => 'ç…®', 64073 => '爫', 64074 => 'ç¢', 64075 => '碑', 64076 => '社', 64077 => '祉', 64078 => '祈', 64079 => 'ç¥', 64080 => '祖', 64081 => 'ç¥', 64082 => 'ç¦', 64083 => '禎', 64084 => 'ç©€', 64085 => 'çª', 64086 => '節', 64087 => 'ç·´', 64088 => '縉', 64089 => 'ç¹', 64090 => 'ç½²', 64091 => '者', 64092 => '臭', 64093 => '艹', 64094 => '艹', 64095 => 'è‘—', 64096 => 'è¤', 64097 => '視', 64098 => 'è¬', 64099 => '謹', 64100 => '賓', 64101 => 'è´ˆ', 64102 => '辶', 64103 => '逸', 64104 => '難', 64105 => '響', 64106 => 'é »', 64107 => 'æµ', 64108 => '𤋮', 64109 => '舘', 64112 => '並', 64113 => '况', 64114 => 'å…¨', 64115 => 'ä¾€', 64116 => 'å……', 64117 => '冀', 64118 => '勇', 64119 => '勺', 64120 => 'å–', 64121 => 'å••', 64122 => 'å–™', 64123 => 'å—¢', 64124 => 'å¡š', 64125 => '墳', 64126 => '奄', 64127 => '奔', 64128 => 'å©¢', 64129 => '嬨', 64130 => 'å»’', 64131 => 'å»™', 64132 => '彩', 64133 => 'å¾­', 64134 => '惘', 64135 => 'æ…Ž', 64136 => '愈', 64137 => '憎', 64138 => 'æ… ', 64139 => '懲', 64140 => '戴', 64141 => 'æ„', 64142 => 'æœ', 64143 => 'æ‘’', 64144 => 'æ•–', 64145 => 'æ™´', 64146 => '朗', 64147 => '望', 64148 => 'æ–', 64149 => 'æ­¹', 64150 => '殺', 64151 => 'æµ', 64152 => 'æ»›', 64153 => '滋', 64154 => 'æ¼¢', 64155 => '瀞', 64156 => 'ç…®', 64157 => '瞧', 64158 => '爵', 64159 => '犯', 64160 => '猪', 64161 => '瑱', 64162 => '甆', 64163 => 'ç”»', 64164 => 'ç˜', 64165 => '瘟', 64166 => '益', 64167 => 'ç››', 64168 => 'ç›´', 64169 => 'çŠ', 64170 => 'ç€', 64171 => '磌', 64172 => '窱', 64173 => '節', 64174 => 'ç±»', 64175 => 'çµ›', 64176 => 'ç·´', 64177 => 'ç¼¾', 64178 => '者', 64179 => 'è’', 64180 => 'è¯', 64181 => 'è¹', 64182 => 'è¥', 64183 => '覆', 64184 => '視', 64185 => '調', 64186 => '諸', 64187 => 'è«‹', 64188 => 'è¬', 64189 => '諾', 64190 => 'è«­', 64191 => '謹', 64192 => '變', 64193 => 'è´ˆ', 64194 => '輸', 64195 => 'é²', 64196 => '醙', 64197 => '鉶', 64198 => '陼', 64199 => '難', 64200 => 'é–', 64201 => '韛', 64202 => '響', 64203 => 'é ‹', 64204 => 'é »', 64205 => '鬒', 64206 => '龜', 64207 => '𢡊', 64208 => '𢡄', 64209 => 'ð£•', 64210 => 'ã®', 64211 => '䀘', 64212 => '䀹', 64213 => '𥉉', 64214 => 'ð¥³', 64215 => '𧻓', 64216 => '齃', 64217 => '龎', 64256 => 'ff', 64257 => 'fi', 64258 => 'fl', 64259 => 'ffi', 64260 => 'ffl', 64261 => 'st', 64262 => 'st', 64275 => 'Õ´Õ¶', 64276 => 'Õ´Õ¥', 64277 => 'Õ´Õ«', 64278 => 'Õ¾Õ¶', 64279 => 'Õ´Õ­', 64285 => '×™Ö´', 64287 => 'ײַ', 64288 => '×¢', 64289 => '×', 64290 => 'ד', 64291 => '×”', 64292 => '×›', 64293 => 'ל', 64294 => '×', 64295 => 'ר', 64296 => 'ת', 64298 => 'ש×', 64299 => 'שׂ', 64300 => 'שּ×', 64301 => 'שּׂ', 64302 => '×Ö·', 64303 => '×Ö¸', 64304 => '×Ö¼', 64305 => 'בּ', 64306 => '×’Ö¼', 64307 => 'דּ', 64308 => '×”Ö¼', 64309 => 'וּ', 64310 => '×–Ö¼', 64312 => 'טּ', 64313 => '×™Ö¼', 64314 => 'ךּ', 64315 => '×›Ö¼', 64316 => 'לּ', 64318 => 'מּ', 64320 => '× Ö¼', 64321 => 'סּ', 64323 => '×£Ö¼', 64324 => 'פּ', 64326 => 'צּ', 64327 => 'קּ', 64328 => 'רּ', 64329 => 'שּ', 64330 => 'תּ', 64331 => 'וֹ', 64332 => 'בֿ', 64333 => '×›Ö¿', 64334 => 'פֿ', 64335 => '×ל', 64336 => 'Ù±', 64337 => 'Ù±', 64338 => 'Ù»', 64339 => 'Ù»', 64340 => 'Ù»', 64341 => 'Ù»', 64342 => 'Ù¾', 64343 => 'Ù¾', 64344 => 'Ù¾', 64345 => 'Ù¾', 64346 => 'Ú€', 64347 => 'Ú€', 64348 => 'Ú€', 64349 => 'Ú€', 64350 => 'Ùº', 64351 => 'Ùº', 64352 => 'Ùº', 64353 => 'Ùº', 64354 => 'Ù¿', 64355 => 'Ù¿', 64356 => 'Ù¿', 64357 => 'Ù¿', 64358 => 'Ù¹', 64359 => 'Ù¹', 64360 => 'Ù¹', 64361 => 'Ù¹', 64362 => 'Ú¤', 64363 => 'Ú¤', 64364 => 'Ú¤', 64365 => 'Ú¤', 64366 => 'Ú¦', 64367 => 'Ú¦', 64368 => 'Ú¦', 64369 => 'Ú¦', 64370 => 'Ú„', 64371 => 'Ú„', 64372 => 'Ú„', 64373 => 'Ú„', 64374 => 'Úƒ', 64375 => 'Úƒ', 64376 => 'Úƒ', 64377 => 'Úƒ', 64378 => 'Ú†', 64379 => 'Ú†', 64380 => 'Ú†', 64381 => 'Ú†', 64382 => 'Ú‡', 64383 => 'Ú‡', 64384 => 'Ú‡', 64385 => 'Ú‡', 64386 => 'Ú', 64387 => 'Ú', 64388 => 'ÚŒ', 64389 => 'ÚŒ', 64390 => 'ÚŽ', 64391 => 'ÚŽ', 64392 => 'Úˆ', 64393 => 'Úˆ', 64394 => 'Ú˜', 64395 => 'Ú˜', 64396 => 'Ú‘', 64397 => 'Ú‘', 64398 => 'Ú©', 64399 => 'Ú©', 64400 => 'Ú©', 64401 => 'Ú©', 64402 => 'Ú¯', 64403 => 'Ú¯', 64404 => 'Ú¯', 64405 => 'Ú¯', 64406 => 'Ú³', 64407 => 'Ú³', 64408 => 'Ú³', 64409 => 'Ú³', 64410 => 'Ú±', 64411 => 'Ú±', 64412 => 'Ú±', 64413 => 'Ú±', 64414 => 'Úº', 64415 => 'Úº', 64416 => 'Ú»', 64417 => 'Ú»', 64418 => 'Ú»', 64419 => 'Ú»', 64420 => 'Û€', 64421 => 'Û€', 64422 => 'Û', 64423 => 'Û', 64424 => 'Û', 64425 => 'Û', 64426 => 'Ú¾', 64427 => 'Ú¾', 64428 => 'Ú¾', 64429 => 'Ú¾', 64430 => 'Û’', 64431 => 'Û’', 64432 => 'Û“', 64433 => 'Û“', 64467 => 'Ú­', 64468 => 'Ú­', 64469 => 'Ú­', 64470 => 'Ú­', 64471 => 'Û‡', 64472 => 'Û‡', 64473 => 'Û†', 64474 => 'Û†', 64475 => 'Ûˆ', 64476 => 'Ûˆ', 64477 => 'Û‡Ù´', 64478 => 'Û‹', 64479 => 'Û‹', 64480 => 'Û…', 64481 => 'Û…', 64482 => 'Û‰', 64483 => 'Û‰', 64484 => 'Û', 64485 => 'Û', 64486 => 'Û', 64487 => 'Û', 64488 => 'Ù‰', 64489 => 'Ù‰', 64490 => 'ئا', 64491 => 'ئا', 64492 => 'ئە', 64493 => 'ئە', 64494 => 'ئو', 64495 => 'ئو', 64496 => 'ئۇ', 64497 => 'ئۇ', 64498 => 'ئۆ', 64499 => 'ئۆ', 64500 => 'ئۈ', 64501 => 'ئۈ', 64502 => 'ئÛ', 64503 => 'ئÛ', 64504 => 'ئÛ', 64505 => 'ئى', 64506 => 'ئى', 64507 => 'ئى', 64508 => 'ÛŒ', 64509 => 'ÛŒ', 64510 => 'ÛŒ', 64511 => 'ÛŒ', 64512 => 'ئج', 64513 => 'ئح', 64514 => 'ئم', 64515 => 'ئى', 64516 => 'ئي', 64517 => 'بج', 64518 => 'بح', 64519 => 'بخ', 64520 => 'بم', 64521 => 'بى', 64522 => 'بي', 64523 => 'تج', 64524 => 'تح', 64525 => 'تخ', 64526 => 'تم', 64527 => 'تى', 64528 => 'تي', 64529 => 'ثج', 64530 => 'ثم', 64531 => 'ثى', 64532 => 'ثي', 64533 => 'جح', 64534 => 'جم', 64535 => 'حج', 64536 => 'حم', 64537 => 'خج', 64538 => 'خح', 64539 => 'خم', 64540 => 'سج', 64541 => 'سح', 64542 => 'سخ', 64543 => 'سم', 64544 => 'صح', 64545 => 'صم', 64546 => 'ضج', 64547 => 'ضح', 64548 => 'ضخ', 64549 => 'ضم', 64550 => 'طح', 64551 => 'طم', 64552 => 'ظم', 64553 => 'عج', 64554 => 'عم', 64555 => 'غج', 64556 => 'غم', 64557 => 'Ùج', 64558 => 'ÙØ­', 64559 => 'ÙØ®', 64560 => 'ÙÙ…', 64561 => 'ÙÙ‰', 64562 => 'ÙÙŠ', 64563 => 'قح', 64564 => 'قم', 64565 => 'قى', 64566 => 'قي', 64567 => 'كا', 64568 => 'كج', 64569 => 'كح', 64570 => 'كخ', 64571 => 'كل', 64572 => 'كم', 64573 => 'كى', 64574 => 'كي', 64575 => 'لج', 64576 => 'لح', 64577 => 'لخ', 64578 => 'لم', 64579 => 'لى', 64580 => 'لي', 64581 => 'مج', 64582 => 'مح', 64583 => 'مخ', 64584 => 'مم', 64585 => 'مى', 64586 => 'مي', 64587 => 'نج', 64588 => 'نح', 64589 => 'نخ', 64590 => 'نم', 64591 => 'نى', 64592 => 'ني', 64593 => 'هج', 64594 => 'هم', 64595 => 'هى', 64596 => 'هي', 64597 => 'يج', 64598 => 'يح', 64599 => 'يخ', 64600 => 'يم', 64601 => 'يى', 64602 => 'يي', 64603 => 'ذٰ', 64604 => 'رٰ', 64605 => 'ىٰ', 64612 => 'ئر', 64613 => 'ئز', 64614 => 'ئم', 64615 => 'ئن', 64616 => 'ئى', 64617 => 'ئي', 64618 => 'بر', 64619 => 'بز', 64620 => 'بم', 64621 => 'بن', 64622 => 'بى', 64623 => 'بي', 64624 => 'تر', 64625 => 'تز', 64626 => 'تم', 64627 => 'تن', 64628 => 'تى', 64629 => 'تي', 64630 => 'ثر', 64631 => 'ثز', 64632 => 'ثم', 64633 => 'ثن', 64634 => 'ثى', 64635 => 'ثي', 64636 => 'ÙÙ‰', 64637 => 'ÙÙŠ', 64638 => 'قى', 64639 => 'قي', 64640 => 'كا', 64641 => 'كل', 64642 => 'كم', 64643 => 'كى', 64644 => 'كي', 64645 => 'لم', 64646 => 'لى', 64647 => 'لي', 64648 => 'ما', 64649 => 'مم', 64650 => 'نر', 64651 => 'نز', 64652 => 'نم', 64653 => 'نن', 64654 => 'نى', 64655 => 'ني', 64656 => 'ىٰ', 64657 => 'ير', 64658 => 'يز', 64659 => 'يم', 64660 => 'ين', 64661 => 'يى', 64662 => 'يي', 64663 => 'ئج', 64664 => 'ئح', 64665 => 'ئخ', 64666 => 'ئم', 64667 => 'ئه', 64668 => 'بج', 64669 => 'بح', 64670 => 'بخ', 64671 => 'بم', 64672 => 'به', 64673 => 'تج', 64674 => 'تح', 64675 => 'تخ', 64676 => 'تم', 64677 => 'ته', 64678 => 'ثم', 64679 => 'جح', 64680 => 'جم', 64681 => 'حج', 64682 => 'حم', 64683 => 'خج', 64684 => 'خم', 64685 => 'سج', 64686 => 'سح', 64687 => 'سخ', 64688 => 'سم', 64689 => 'صح', 64690 => 'صخ', 64691 => 'صم', 64692 => 'ضج', 64693 => 'ضح', 64694 => 'ضخ', 64695 => 'ضم', 64696 => 'طح', 64697 => 'ظم', 64698 => 'عج', 64699 => 'عم', 64700 => 'غج', 64701 => 'غم', 64702 => 'Ùج', 64703 => 'ÙØ­', 64704 => 'ÙØ®', 64705 => 'ÙÙ…', 64706 => 'قح', 64707 => 'قم', 64708 => 'كج', 64709 => 'كح', 64710 => 'كخ', 64711 => 'كل', 64712 => 'كم', 64713 => 'لج', 64714 => 'لح', 64715 => 'لخ', 64716 => 'لم', 64717 => 'له', 64718 => 'مج', 64719 => 'مح', 64720 => 'مخ', 64721 => 'مم', 64722 => 'نج', 64723 => 'نح', 64724 => 'نخ', 64725 => 'نم', 64726 => 'نه', 64727 => 'هج', 64728 => 'هم', 64729 => 'هٰ', 64730 => 'يج', 64731 => 'يح', 64732 => 'يخ', 64733 => 'يم', 64734 => 'يه', 64735 => 'ئم', 64736 => 'ئه', 64737 => 'بم', 64738 => 'به', 64739 => 'تم', 64740 => 'ته', 64741 => 'ثم', 64742 => 'ثه', 64743 => 'سم', 64744 => 'سه', 64745 => 'شم', 64746 => 'شه', 64747 => 'كل', 64748 => 'كم', 64749 => 'لم', 64750 => 'نم', 64751 => 'نه', 64752 => 'يم', 64753 => 'يه', 64754 => 'Ù€ÙŽÙ‘', 64755 => 'Ù€ÙÙ‘', 64756 => 'Ù€ÙÙ‘', 64757 => 'طى', 64758 => 'طي', 64759 => 'عى', 64760 => 'عي', 64761 => 'غى', 64762 => 'غي', 64763 => 'سى', 64764 => 'سي', 64765 => 'شى', 64766 => 'شي', 64767 => 'حى', 64768 => 'حي', 64769 => 'جى', 64770 => 'جي', 64771 => 'خى', 64772 => 'خي', 64773 => 'صى', 64774 => 'صي', 64775 => 'ضى', 64776 => 'ضي', 64777 => 'شج', 64778 => 'شح', 64779 => 'شخ', 64780 => 'شم', 64781 => 'شر', 64782 => 'سر', 64783 => 'صر', 64784 => 'ضر', 64785 => 'طى', 64786 => 'طي', 64787 => 'عى', 64788 => 'عي', 64789 => 'غى', 64790 => 'غي', 64791 => 'سى', 64792 => 'سي', 64793 => 'شى', 64794 => 'شي', 64795 => 'حى', 64796 => 'حي', 64797 => 'جى', 64798 => 'جي', 64799 => 'خى', 64800 => 'خي', 64801 => 'صى', 64802 => 'صي', 64803 => 'ضى', 64804 => 'ضي', 64805 => 'شج', 64806 => 'شح', 64807 => 'شخ', 64808 => 'شم', 64809 => 'شر', 64810 => 'سر', 64811 => 'صر', 64812 => 'ضر', 64813 => 'شج', 64814 => 'شح', 64815 => 'شخ', 64816 => 'شم', 64817 => 'سه', 64818 => 'شه', 64819 => 'طم', 64820 => 'سج', 64821 => 'سح', 64822 => 'سخ', 64823 => 'شج', 64824 => 'شح', 64825 => 'شخ', 64826 => 'طم', 64827 => 'ظم', 64828 => 'اً', 64829 => 'اً', 64848 => 'تجم', 64849 => 'تحج', 64850 => 'تحج', 64851 => 'تحم', 64852 => 'تخم', 64853 => 'تمج', 64854 => 'تمح', 64855 => 'تمخ', 64856 => 'جمح', 64857 => 'جمح', 64858 => 'حمي', 64859 => 'حمى', 64860 => 'سحج', 64861 => 'سجح', 64862 => 'سجى', 64863 => 'سمح', 64864 => 'سمح', 64865 => 'سمج', 64866 => 'سمم', 64867 => 'سمم', 64868 => 'صحح', 64869 => 'صحح', 64870 => 'صمم', 64871 => 'شحم', 64872 => 'شحم', 64873 => 'شجي', 64874 => 'شمخ', 64875 => 'شمخ', 64876 => 'شمم', 64877 => 'شمم', 64878 => 'ضحى', 64879 => 'ضخم', 64880 => 'ضخم', 64881 => 'طمح', 64882 => 'طمح', 64883 => 'طمم', 64884 => 'طمي', 64885 => 'عجم', 64886 => 'عمم', 64887 => 'عمم', 64888 => 'عمى', 64889 => 'غمم', 64890 => 'غمي', 64891 => 'غمى', 64892 => 'Ùخم', 64893 => 'Ùخم', 64894 => 'قمح', 64895 => 'قمم', 64896 => 'لحم', 64897 => 'لحي', 64898 => 'لحى', 64899 => 'لجج', 64900 => 'لجج', 64901 => 'لخم', 64902 => 'لخم', 64903 => 'لمح', 64904 => 'لمح', 64905 => 'محج', 64906 => 'محم', 64907 => 'محي', 64908 => 'مجح', 64909 => 'مجم', 64910 => 'مخج', 64911 => 'مخم', 64914 => 'مجخ', 64915 => 'همج', 64916 => 'همم', 64917 => 'نحم', 64918 => 'نحى', 64919 => 'نجم', 64920 => 'نجم', 64921 => 'نجى', 64922 => 'نمي', 64923 => 'نمى', 64924 => 'يمم', 64925 => 'يمم', 64926 => 'بخي', 64927 => 'تجي', 64928 => 'تجى', 64929 => 'تخي', 64930 => 'تخى', 64931 => 'تمي', 64932 => 'تمى', 64933 => 'جمي', 64934 => 'جحى', 64935 => 'جمى', 64936 => 'سخى', 64937 => 'صحي', 64938 => 'شحي', 64939 => 'ضحي', 64940 => 'لجي', 64941 => 'لمي', 64942 => 'يحي', 64943 => 'يجي', 64944 => 'يمي', 64945 => 'ممي', 64946 => 'قمي', 64947 => 'نحي', 64948 => 'قمح', 64949 => 'لحم', 64950 => 'عمي', 64951 => 'كمي', 64952 => 'نجح', 64953 => 'مخي', 64954 => 'لجم', 64955 => 'كمم', 64956 => 'لجم', 64957 => 'نجح', 64958 => 'جحي', 64959 => 'حجي', 64960 => 'مجي', 64961 => 'Ùمي', 64962 => 'بحي', 64963 => 'كمم', 64964 => 'عجم', 64965 => 'صمم', 64966 => 'سخي', 64967 => 'نجي', 65008 => 'صلے', 65009 => 'قلے', 65010 => 'الله', 65011 => 'اكبر', 65012 => 'محمد', 65013 => 'صلعم', 65014 => 'رسول', 65015 => 'عليه', 65016 => 'وسلم', 65017 => 'صلى', 65020 => 'ریال', 65041 => 'ã€', 65047 => '〖', 65048 => '〗', 65073 => '—', 65074 => '–', 65081 => '〔', 65082 => '〕', 65083 => 'ã€', 65084 => '】', 65085 => '《', 65086 => '》', 65087 => '〈', 65088 => '〉', 65089 => '「', 65090 => 'ã€', 65091 => '『', 65092 => 'ã€', 65105 => 'ã€', 65112 => '—', 65117 => '〔', 65118 => '〕', 65123 => '-', 65137 => 'ـً', 65143 => 'Ù€ÙŽ', 65145 => 'Ù€Ù', 65147 => 'Ù€Ù', 65149 => 'ـّ', 65151 => 'ـْ', 65152 => 'Ø¡', 65153 => 'Ø¢', 65154 => 'Ø¢', 65155 => 'Ø£', 65156 => 'Ø£', 65157 => 'ؤ', 65158 => 'ؤ', 65159 => 'Ø¥', 65160 => 'Ø¥', 65161 => 'ئ', 65162 => 'ئ', 65163 => 'ئ', 65164 => 'ئ', 65165 => 'ا', 65166 => 'ا', 65167 => 'ب', 65168 => 'ب', 65169 => 'ب', 65170 => 'ب', 65171 => 'Ø©', 65172 => 'Ø©', 65173 => 'ت', 65174 => 'ت', 65175 => 'ت', 65176 => 'ت', 65177 => 'Ø«', 65178 => 'Ø«', 65179 => 'Ø«', 65180 => 'Ø«', 65181 => 'ج', 65182 => 'ج', 65183 => 'ج', 65184 => 'ج', 65185 => 'Ø­', 65186 => 'Ø­', 65187 => 'Ø­', 65188 => 'Ø­', 65189 => 'Ø®', 65190 => 'Ø®', 65191 => 'Ø®', 65192 => 'Ø®', 65193 => 'د', 65194 => 'د', 65195 => 'Ø°', 65196 => 'Ø°', 65197 => 'ر', 65198 => 'ر', 65199 => 'ز', 65200 => 'ز', 65201 => 'س', 65202 => 'س', 65203 => 'س', 65204 => 'س', 65205 => 'Ø´', 65206 => 'Ø´', 65207 => 'Ø´', 65208 => 'Ø´', 65209 => 'ص', 65210 => 'ص', 65211 => 'ص', 65212 => 'ص', 65213 => 'ض', 65214 => 'ض', 65215 => 'ض', 65216 => 'ض', 65217 => 'Ø·', 65218 => 'Ø·', 65219 => 'Ø·', 65220 => 'Ø·', 65221 => 'ظ', 65222 => 'ظ', 65223 => 'ظ', 65224 => 'ظ', 65225 => 'ع', 65226 => 'ع', 65227 => 'ع', 65228 => 'ع', 65229 => 'غ', 65230 => 'غ', 65231 => 'غ', 65232 => 'غ', 65233 => 'Ù', 65234 => 'Ù', 65235 => 'Ù', 65236 => 'Ù', 65237 => 'Ù‚', 65238 => 'Ù‚', 65239 => 'Ù‚', 65240 => 'Ù‚', 65241 => 'Ùƒ', 65242 => 'Ùƒ', 65243 => 'Ùƒ', 65244 => 'Ùƒ', 65245 => 'Ù„', 65246 => 'Ù„', 65247 => 'Ù„', 65248 => 'Ù„', 65249 => 'Ù…', 65250 => 'Ù…', 65251 => 'Ù…', 65252 => 'Ù…', 65253 => 'Ù†', 65254 => 'Ù†', 65255 => 'Ù†', 65256 => 'Ù†', 65257 => 'Ù‡', 65258 => 'Ù‡', 65259 => 'Ù‡', 65260 => 'Ù‡', 65261 => 'Ùˆ', 65262 => 'Ùˆ', 65263 => 'Ù‰', 65264 => 'Ù‰', 65265 => 'ÙŠ', 65266 => 'ÙŠ', 65267 => 'ÙŠ', 65268 => 'ÙŠ', 65269 => 'لآ', 65270 => 'لآ', 65271 => 'لأ', 65272 => 'لأ', 65273 => 'لإ', 65274 => 'لإ', 65275 => 'لا', 65276 => 'لا', 65293 => '-', 65294 => '.', 65296 => '0', 65297 => '1', 65298 => '2', 65299 => '3', 65300 => '4', 65301 => '5', 65302 => '6', 65303 => '7', 65304 => '8', 65305 => '9', 65313 => 'a', 65314 => 'b', 65315 => 'c', 65316 => 'd', 65317 => 'e', 65318 => 'f', 65319 => 'g', 65320 => 'h', 65321 => 'i', 65322 => 'j', 65323 => 'k', 65324 => 'l', 65325 => 'm', 65326 => 'n', 65327 => 'o', 65328 => 'p', 65329 => 'q', 65330 => 'r', 65331 => 's', 65332 => 't', 65333 => 'u', 65334 => 'v', 65335 => 'w', 65336 => 'x', 65337 => 'y', 65338 => 'z', 65345 => 'a', 65346 => 'b', 65347 => 'c', 65348 => 'd', 65349 => 'e', 65350 => 'f', 65351 => 'g', 65352 => 'h', 65353 => 'i', 65354 => 'j', 65355 => 'k', 65356 => 'l', 65357 => 'm', 65358 => 'n', 65359 => 'o', 65360 => 'p', 65361 => 'q', 65362 => 'r', 65363 => 's', 65364 => 't', 65365 => 'u', 65366 => 'v', 65367 => 'w', 65368 => 'x', 65369 => 'y', 65370 => 'z', 65375 => '⦅', 65376 => '⦆', 65377 => '.', 65378 => '「', 65379 => 'ã€', 65380 => 'ã€', 65381 => '・', 65382 => 'ヲ', 65383 => 'ã‚¡', 65384 => 'ã‚£', 65385 => 'ã‚¥', 65386 => 'ェ', 65387 => 'ã‚©', 65388 => 'ャ', 65389 => 'ュ', 65390 => 'ョ', 65391 => 'ッ', 65392 => 'ー', 65393 => 'ã‚¢', 65394 => 'イ', 65395 => 'ウ', 65396 => 'エ', 65397 => 'オ', 65398 => 'ã‚«', 65399 => 'ã‚­', 65400 => 'ク', 65401 => 'ケ', 65402 => 'コ', 65403 => 'サ', 65404 => 'ã‚·', 65405 => 'ス', 65406 => 'ã‚»', 65407 => 'ソ', 65408 => 'ã‚¿', 65409 => 'ãƒ', 65410 => 'ツ', 65411 => 'テ', 65412 => 'ト', 65413 => 'ナ', 65414 => 'ニ', 65415 => 'ヌ', 65416 => 'ãƒ', 65417 => 'ノ', 65418 => 'ãƒ', 65419 => 'ヒ', 65420 => 'フ', 65421 => 'ヘ', 65422 => 'ホ', 65423 => 'マ', 65424 => 'ミ', 65425 => 'ム', 65426 => 'メ', 65427 => 'モ', 65428 => 'ヤ', 65429 => 'ユ', 65430 => 'ヨ', 65431 => 'ラ', 65432 => 'リ', 65433 => 'ル', 65434 => 'レ', 65435 => 'ロ', 65436 => 'ワ', 65437 => 'ン', 65438 => 'ã‚™', 65439 => 'ã‚š', 65441 => 'á„€', 65442 => 'á„', 65443 => 'ᆪ', 65444 => 'á„‚', 65445 => 'ᆬ', 65446 => 'ᆭ', 65447 => 'ᄃ', 65448 => 'á„„', 65449 => 'á„…', 65450 => 'ᆰ', 65451 => 'ᆱ', 65452 => 'ᆲ', 65453 => 'ᆳ', 65454 => 'ᆴ', 65455 => 'ᆵ', 65456 => 'á„š', 65457 => 'ᄆ', 65458 => 'ᄇ', 65459 => 'ᄈ', 65460 => 'á„¡', 65461 => 'ᄉ', 65462 => 'á„Š', 65463 => 'á„‹', 65464 => 'á„Œ', 65465 => 'á„', 65466 => 'á„Ž', 65467 => 'á„', 65468 => 'á„', 65469 => 'á„‘', 65470 => 'á„’', 65474 => 'á…¡', 65475 => 'á…¢', 65476 => 'á…£', 65477 => 'á…¤', 65478 => 'á…¥', 65479 => 'á…¦', 65482 => 'á…§', 65483 => 'á…¨', 65484 => 'á…©', 65485 => 'á…ª', 65486 => 'á…«', 65487 => 'á…¬', 65490 => 'á…­', 65491 => 'á…®', 65492 => 'á…¯', 65493 => 'á…°', 65494 => 'á…±', 65495 => 'á…²', 65498 => 'á…³', 65499 => 'á…´', 65500 => 'á…µ', 65504 => '¢', 65505 => '£', 65506 => '¬', 65508 => '¦', 65509 => 'Â¥', 65510 => 'â‚©', 65512 => '│', 65513 => 'â†', 65514 => '↑', 65515 => '→', 65516 => '↓', 65517 => 'â– ', 65518 => 'â—‹', 66560 => 'ð¨', 66561 => 'ð©', 66562 => 'ðª', 66563 => 'ð«', 66564 => 'ð¬', 66565 => 'ð­', 66566 => 'ð®', 66567 => 'ð¯', 66568 => 'ð°', 66569 => 'ð±', 66570 => 'ð²', 66571 => 'ð³', 66572 => 'ð´', 66573 => 'ðµ', 66574 => 'ð¶', 66575 => 'ð·', 66576 => 'ð¸', 66577 => 'ð¹', 66578 => 'ðº', 66579 => 'ð»', 66580 => 'ð¼', 66581 => 'ð½', 66582 => 'ð¾', 66583 => 'ð¿', 66584 => 'ð‘€', 66585 => 'ð‘', 66586 => 'ð‘‚', 66587 => 'ð‘ƒ', 66588 => 'ð‘„', 66589 => 'ð‘…', 66590 => 'ð‘†', 66591 => 'ð‘‡', 66592 => 'ð‘ˆ', 66593 => 'ð‘‰', 66594 => 'ð‘Š', 66595 => 'ð‘‹', 66596 => 'ð‘Œ', 66597 => 'ð‘', 66598 => 'ð‘Ž', 66599 => 'ð‘', 66736 => 'ð“˜', 66737 => 'ð“™', 66738 => 'ð“š', 66739 => 'ð“›', 66740 => 'ð“œ', 66741 => 'ð“', 66742 => 'ð“ž', 66743 => 'ð“Ÿ', 66744 => 'ð“ ', 66745 => 'ð“¡', 66746 => 'ð“¢', 66747 => 'ð“£', 66748 => 'ð“¤', 66749 => 'ð“¥', 66750 => 'ð“¦', 66751 => 'ð“§', 66752 => 'ð“¨', 66753 => 'ð“©', 66754 => 'ð“ª', 66755 => 'ð“«', 66756 => 'ð“¬', 66757 => 'ð“­', 66758 => 'ð“®', 66759 => 'ð“¯', 66760 => 'ð“°', 66761 => 'ð“±', 66762 => 'ð“²', 66763 => 'ð“³', 66764 => 'ð“´', 66765 => 'ð“µ', 66766 => 'ð“¶', 66767 => 'ð“·', 66768 => 'ð“¸', 66769 => 'ð“¹', 66770 => 'ð“º', 66771 => 'ð“»', 68736 => 'ð³€', 68737 => 'ð³', 68738 => 'ð³‚', 68739 => 'ð³ƒ', 68740 => 'ð³„', 68741 => 'ð³…', 68742 => 'ð³†', 68743 => 'ð³‡', 68744 => 'ð³ˆ', 68745 => 'ð³‰', 68746 => 'ð³Š', 68747 => 'ð³‹', 68748 => 'ð³Œ', 68749 => 'ð³', 68750 => 'ð³Ž', 68751 => 'ð³', 68752 => 'ð³', 68753 => 'ð³‘', 68754 => 'ð³’', 68755 => 'ð³“', 68756 => 'ð³”', 68757 => 'ð³•', 68758 => 'ð³–', 68759 => 'ð³—', 68760 => 'ð³˜', 68761 => 'ð³™', 68762 => 'ð³š', 68763 => 'ð³›', 68764 => 'ð³œ', 68765 => 'ð³', 68766 => 'ð³ž', 68767 => 'ð³Ÿ', 68768 => 'ð³ ', 68769 => 'ð³¡', 68770 => 'ð³¢', 68771 => 'ð³£', 68772 => 'ð³¤', 68773 => 'ð³¥', 68774 => 'ð³¦', 68775 => 'ð³§', 68776 => 'ð³¨', 68777 => 'ð³©', 68778 => 'ð³ª', 68779 => 'ð³«', 68780 => 'ð³¬', 68781 => 'ð³­', 68782 => 'ð³®', 68783 => 'ð³¯', 68784 => 'ð³°', 68785 => 'ð³±', 68786 => 'ð³²', 71840 => 'ð‘£€', 71841 => 'ð‘£', 71842 => '𑣂', 71843 => '𑣃', 71844 => '𑣄', 71845 => 'ð‘£…', 71846 => '𑣆', 71847 => '𑣇', 71848 => '𑣈', 71849 => '𑣉', 71850 => '𑣊', 71851 => '𑣋', 71852 => '𑣌', 71853 => 'ð‘£', 71854 => '𑣎', 71855 => 'ð‘£', 71856 => 'ð‘£', 71857 => '𑣑', 71858 => 'ð‘£’', 71859 => '𑣓', 71860 => 'ð‘£”', 71861 => '𑣕', 71862 => 'ð‘£–', 71863 => 'ð‘£—', 71864 => '𑣘', 71865 => 'ð‘£™', 71866 => '𑣚', 71867 => 'ð‘£›', 71868 => '𑣜', 71869 => 'ð‘£', 71870 => '𑣞', 71871 => '𑣟', 93760 => 'ð–¹ ', 93761 => '𖹡', 93762 => 'ð–¹¢', 93763 => 'ð–¹£', 93764 => '𖹤', 93765 => 'ð–¹¥', 93766 => '𖹦', 93767 => '𖹧', 93768 => '𖹨', 93769 => '𖹩', 93770 => '𖹪', 93771 => '𖹫', 93772 => '𖹬', 93773 => 'ð–¹­', 93774 => 'ð–¹®', 93775 => '𖹯', 93776 => 'ð–¹°', 93777 => 'ð–¹±', 93778 => 'ð–¹²', 93779 => 'ð–¹³', 93780 => 'ð–¹´', 93781 => 'ð–¹µ', 93782 => '𖹶', 93783 => 'ð–¹·', 93784 => '𖹸', 93785 => 'ð–¹¹', 93786 => '𖹺', 93787 => 'ð–¹»', 93788 => 'ð–¹¼', 93789 => 'ð–¹½', 93790 => 'ð–¹¾', 93791 => '𖹿', 119134 => 'ð…—ð…¥', 119135 => 'ð…˜ð…¥', 119136 => 'ð…˜ð…¥ð…®', 119137 => 'ð…˜ð…¥ð…¯', 119138 => 'ð…˜ð…¥ð…°', 119139 => 'ð…˜ð…¥ð…±', 119140 => 'ð…˜ð…¥ð…²', 119227 => 'ð†¹ð…¥', 119228 => 'ð†ºð…¥', 119229 => 'ð†¹ð…¥ð…®', 119230 => 'ð†ºð…¥ð…®', 119231 => 'ð†¹ð…¥ð…¯', 119232 => 'ð†ºð…¥ð…¯', 119808 => 'a', 119809 => 'b', 119810 => 'c', 119811 => 'd', 119812 => 'e', 119813 => 'f', 119814 => 'g', 119815 => 'h', 119816 => 'i', 119817 => 'j', 119818 => 'k', 119819 => 'l', 119820 => 'm', 119821 => 'n', 119822 => 'o', 119823 => 'p', 119824 => 'q', 119825 => 'r', 119826 => 's', 119827 => 't', 119828 => 'u', 119829 => 'v', 119830 => 'w', 119831 => 'x', 119832 => 'y', 119833 => 'z', 119834 => 'a', 119835 => 'b', 119836 => 'c', 119837 => 'd', 119838 => 'e', 119839 => 'f', 119840 => 'g', 119841 => 'h', 119842 => 'i', 119843 => 'j', 119844 => 'k', 119845 => 'l', 119846 => 'm', 119847 => 'n', 119848 => 'o', 119849 => 'p', 119850 => 'q', 119851 => 'r', 119852 => 's', 119853 => 't', 119854 => 'u', 119855 => 'v', 119856 => 'w', 119857 => 'x', 119858 => 'y', 119859 => 'z', 119860 => 'a', 119861 => 'b', 119862 => 'c', 119863 => 'd', 119864 => 'e', 119865 => 'f', 119866 => 'g', 119867 => 'h', 119868 => 'i', 119869 => 'j', 119870 => 'k', 119871 => 'l', 119872 => 'm', 119873 => 'n', 119874 => 'o', 119875 => 'p', 119876 => 'q', 119877 => 'r', 119878 => 's', 119879 => 't', 119880 => 'u', 119881 => 'v', 119882 => 'w', 119883 => 'x', 119884 => 'y', 119885 => 'z', 119886 => 'a', 119887 => 'b', 119888 => 'c', 119889 => 'd', 119890 => 'e', 119891 => 'f', 119892 => 'g', 119894 => 'i', 119895 => 'j', 119896 => 'k', 119897 => 'l', 119898 => 'm', 119899 => 'n', 119900 => 'o', 119901 => 'p', 119902 => 'q', 119903 => 'r', 119904 => 's', 119905 => 't', 119906 => 'u', 119907 => 'v', 119908 => 'w', 119909 => 'x', 119910 => 'y', 119911 => 'z', 119912 => 'a', 119913 => 'b', 119914 => 'c', 119915 => 'd', 119916 => 'e', 119917 => 'f', 119918 => 'g', 119919 => 'h', 119920 => 'i', 119921 => 'j', 119922 => 'k', 119923 => 'l', 119924 => 'm', 119925 => 'n', 119926 => 'o', 119927 => 'p', 119928 => 'q', 119929 => 'r', 119930 => 's', 119931 => 't', 119932 => 'u', 119933 => 'v', 119934 => 'w', 119935 => 'x', 119936 => 'y', 119937 => 'z', 119938 => 'a', 119939 => 'b', 119940 => 'c', 119941 => 'd', 119942 => 'e', 119943 => 'f', 119944 => 'g', 119945 => 'h', 119946 => 'i', 119947 => 'j', 119948 => 'k', 119949 => 'l', 119950 => 'm', 119951 => 'n', 119952 => 'o', 119953 => 'p', 119954 => 'q', 119955 => 'r', 119956 => 's', 119957 => 't', 119958 => 'u', 119959 => 'v', 119960 => 'w', 119961 => 'x', 119962 => 'y', 119963 => 'z', 119964 => 'a', 119966 => 'c', 119967 => 'd', 119970 => 'g', 119973 => 'j', 119974 => 'k', 119977 => 'n', 119978 => 'o', 119979 => 'p', 119980 => 'q', 119982 => 's', 119983 => 't', 119984 => 'u', 119985 => 'v', 119986 => 'w', 119987 => 'x', 119988 => 'y', 119989 => 'z', 119990 => 'a', 119991 => 'b', 119992 => 'c', 119993 => 'd', 119995 => 'f', 119997 => 'h', 119998 => 'i', 119999 => 'j', 120000 => 'k', 120001 => 'l', 120002 => 'm', 120003 => 'n', 120005 => 'p', 120006 => 'q', 120007 => 'r', 120008 => 's', 120009 => 't', 120010 => 'u', 120011 => 'v', 120012 => 'w', 120013 => 'x', 120014 => 'y', 120015 => 'z', 120016 => 'a', 120017 => 'b', 120018 => 'c', 120019 => 'd', 120020 => 'e', 120021 => 'f', 120022 => 'g', 120023 => 'h', 120024 => 'i', 120025 => 'j', 120026 => 'k', 120027 => 'l', 120028 => 'm', 120029 => 'n', 120030 => 'o', 120031 => 'p', 120032 => 'q', 120033 => 'r', 120034 => 's', 120035 => 't', 120036 => 'u', 120037 => 'v', 120038 => 'w', 120039 => 'x', 120040 => 'y', 120041 => 'z', 120042 => 'a', 120043 => 'b', 120044 => 'c', 120045 => 'd', 120046 => 'e', 120047 => 'f', 120048 => 'g', 120049 => 'h', 120050 => 'i', 120051 => 'j', 120052 => 'k', 120053 => 'l', 120054 => 'm', 120055 => 'n', 120056 => 'o', 120057 => 'p', 120058 => 'q', 120059 => 'r', 120060 => 's', 120061 => 't', 120062 => 'u', 120063 => 'v', 120064 => 'w', 120065 => 'x', 120066 => 'y', 120067 => 'z', 120068 => 'a', 120069 => 'b', 120071 => 'd', 120072 => 'e', 120073 => 'f', 120074 => 'g', 120077 => 'j', 120078 => 'k', 120079 => 'l', 120080 => 'm', 120081 => 'n', 120082 => 'o', 120083 => 'p', 120084 => 'q', 120086 => 's', 120087 => 't', 120088 => 'u', 120089 => 'v', 120090 => 'w', 120091 => 'x', 120092 => 'y', 120094 => 'a', 120095 => 'b', 120096 => 'c', 120097 => 'd', 120098 => 'e', 120099 => 'f', 120100 => 'g', 120101 => 'h', 120102 => 'i', 120103 => 'j', 120104 => 'k', 120105 => 'l', 120106 => 'm', 120107 => 'n', 120108 => 'o', 120109 => 'p', 120110 => 'q', 120111 => 'r', 120112 => 's', 120113 => 't', 120114 => 'u', 120115 => 'v', 120116 => 'w', 120117 => 'x', 120118 => 'y', 120119 => 'z', 120120 => 'a', 120121 => 'b', 120123 => 'd', 120124 => 'e', 120125 => 'f', 120126 => 'g', 120128 => 'i', 120129 => 'j', 120130 => 'k', 120131 => 'l', 120132 => 'm', 120134 => 'o', 120138 => 's', 120139 => 't', 120140 => 'u', 120141 => 'v', 120142 => 'w', 120143 => 'x', 120144 => 'y', 120146 => 'a', 120147 => 'b', 120148 => 'c', 120149 => 'd', 120150 => 'e', 120151 => 'f', 120152 => 'g', 120153 => 'h', 120154 => 'i', 120155 => 'j', 120156 => 'k', 120157 => 'l', 120158 => 'm', 120159 => 'n', 120160 => 'o', 120161 => 'p', 120162 => 'q', 120163 => 'r', 120164 => 's', 120165 => 't', 120166 => 'u', 120167 => 'v', 120168 => 'w', 120169 => 'x', 120170 => 'y', 120171 => 'z', 120172 => 'a', 120173 => 'b', 120174 => 'c', 120175 => 'd', 120176 => 'e', 120177 => 'f', 120178 => 'g', 120179 => 'h', 120180 => 'i', 120181 => 'j', 120182 => 'k', 120183 => 'l', 120184 => 'm', 120185 => 'n', 120186 => 'o', 120187 => 'p', 120188 => 'q', 120189 => 'r', 120190 => 's', 120191 => 't', 120192 => 'u', 120193 => 'v', 120194 => 'w', 120195 => 'x', 120196 => 'y', 120197 => 'z', 120198 => 'a', 120199 => 'b', 120200 => 'c', 120201 => 'd', 120202 => 'e', 120203 => 'f', 120204 => 'g', 120205 => 'h', 120206 => 'i', 120207 => 'j', 120208 => 'k', 120209 => 'l', 120210 => 'm', 120211 => 'n', 120212 => 'o', 120213 => 'p', 120214 => 'q', 120215 => 'r', 120216 => 's', 120217 => 't', 120218 => 'u', 120219 => 'v', 120220 => 'w', 120221 => 'x', 120222 => 'y', 120223 => 'z', 120224 => 'a', 120225 => 'b', 120226 => 'c', 120227 => 'd', 120228 => 'e', 120229 => 'f', 120230 => 'g', 120231 => 'h', 120232 => 'i', 120233 => 'j', 120234 => 'k', 120235 => 'l', 120236 => 'm', 120237 => 'n', 120238 => 'o', 120239 => 'p', 120240 => 'q', 120241 => 'r', 120242 => 's', 120243 => 't', 120244 => 'u', 120245 => 'v', 120246 => 'w', 120247 => 'x', 120248 => 'y', 120249 => 'z', 120250 => 'a', 120251 => 'b', 120252 => 'c', 120253 => 'd', 120254 => 'e', 120255 => 'f', 120256 => 'g', 120257 => 'h', 120258 => 'i', 120259 => 'j', 120260 => 'k', 120261 => 'l', 120262 => 'm', 120263 => 'n', 120264 => 'o', 120265 => 'p', 120266 => 'q', 120267 => 'r', 120268 => 's', 120269 => 't', 120270 => 'u', 120271 => 'v', 120272 => 'w', 120273 => 'x', 120274 => 'y', 120275 => 'z', 120276 => 'a', 120277 => 'b', 120278 => 'c', 120279 => 'd', 120280 => 'e', 120281 => 'f', 120282 => 'g', 120283 => 'h', 120284 => 'i', 120285 => 'j', 120286 => 'k', 120287 => 'l', 120288 => 'm', 120289 => 'n', 120290 => 'o', 120291 => 'p', 120292 => 'q', 120293 => 'r', 120294 => 's', 120295 => 't', 120296 => 'u', 120297 => 'v', 120298 => 'w', 120299 => 'x', 120300 => 'y', 120301 => 'z', 120302 => 'a', 120303 => 'b', 120304 => 'c', 120305 => 'd', 120306 => 'e', 120307 => 'f', 120308 => 'g', 120309 => 'h', 120310 => 'i', 120311 => 'j', 120312 => 'k', 120313 => 'l', 120314 => 'm', 120315 => 'n', 120316 => 'o', 120317 => 'p', 120318 => 'q', 120319 => 'r', 120320 => 's', 120321 => 't', 120322 => 'u', 120323 => 'v', 120324 => 'w', 120325 => 'x', 120326 => 'y', 120327 => 'z', 120328 => 'a', 120329 => 'b', 120330 => 'c', 120331 => 'd', 120332 => 'e', 120333 => 'f', 120334 => 'g', 120335 => 'h', 120336 => 'i', 120337 => 'j', 120338 => 'k', 120339 => 'l', 120340 => 'm', 120341 => 'n', 120342 => 'o', 120343 => 'p', 120344 => 'q', 120345 => 'r', 120346 => 's', 120347 => 't', 120348 => 'u', 120349 => 'v', 120350 => 'w', 120351 => 'x', 120352 => 'y', 120353 => 'z', 120354 => 'a', 120355 => 'b', 120356 => 'c', 120357 => 'd', 120358 => 'e', 120359 => 'f', 120360 => 'g', 120361 => 'h', 120362 => 'i', 120363 => 'j', 120364 => 'k', 120365 => 'l', 120366 => 'm', 120367 => 'n', 120368 => 'o', 120369 => 'p', 120370 => 'q', 120371 => 'r', 120372 => 's', 120373 => 't', 120374 => 'u', 120375 => 'v', 120376 => 'w', 120377 => 'x', 120378 => 'y', 120379 => 'z', 120380 => 'a', 120381 => 'b', 120382 => 'c', 120383 => 'd', 120384 => 'e', 120385 => 'f', 120386 => 'g', 120387 => 'h', 120388 => 'i', 120389 => 'j', 120390 => 'k', 120391 => 'l', 120392 => 'm', 120393 => 'n', 120394 => 'o', 120395 => 'p', 120396 => 'q', 120397 => 'r', 120398 => 's', 120399 => 't', 120400 => 'u', 120401 => 'v', 120402 => 'w', 120403 => 'x', 120404 => 'y', 120405 => 'z', 120406 => 'a', 120407 => 'b', 120408 => 'c', 120409 => 'd', 120410 => 'e', 120411 => 'f', 120412 => 'g', 120413 => 'h', 120414 => 'i', 120415 => 'j', 120416 => 'k', 120417 => 'l', 120418 => 'm', 120419 => 'n', 120420 => 'o', 120421 => 'p', 120422 => 'q', 120423 => 'r', 120424 => 's', 120425 => 't', 120426 => 'u', 120427 => 'v', 120428 => 'w', 120429 => 'x', 120430 => 'y', 120431 => 'z', 120432 => 'a', 120433 => 'b', 120434 => 'c', 120435 => 'd', 120436 => 'e', 120437 => 'f', 120438 => 'g', 120439 => 'h', 120440 => 'i', 120441 => 'j', 120442 => 'k', 120443 => 'l', 120444 => 'm', 120445 => 'n', 120446 => 'o', 120447 => 'p', 120448 => 'q', 120449 => 'r', 120450 => 's', 120451 => 't', 120452 => 'u', 120453 => 'v', 120454 => 'w', 120455 => 'x', 120456 => 'y', 120457 => 'z', 120458 => 'a', 120459 => 'b', 120460 => 'c', 120461 => 'd', 120462 => 'e', 120463 => 'f', 120464 => 'g', 120465 => 'h', 120466 => 'i', 120467 => 'j', 120468 => 'k', 120469 => 'l', 120470 => 'm', 120471 => 'n', 120472 => 'o', 120473 => 'p', 120474 => 'q', 120475 => 'r', 120476 => 's', 120477 => 't', 120478 => 'u', 120479 => 'v', 120480 => 'w', 120481 => 'x', 120482 => 'y', 120483 => 'z', 120484 => 'ı', 120485 => 'È·', 120488 => 'α', 120489 => 'β', 120490 => 'γ', 120491 => 'δ', 120492 => 'ε', 120493 => 'ζ', 120494 => 'η', 120495 => 'θ', 120496 => 'ι', 120497 => 'κ', 120498 => 'λ', 120499 => 'μ', 120500 => 'ν', 120501 => 'ξ', 120502 => 'ο', 120503 => 'Ï€', 120504 => 'Ï', 120505 => 'θ', 120506 => 'σ', 120507 => 'Ï„', 120508 => 'Ï…', 120509 => 'φ', 120510 => 'χ', 120511 => 'ψ', 120512 => 'ω', 120513 => '∇', 120514 => 'α', 120515 => 'β', 120516 => 'γ', 120517 => 'δ', 120518 => 'ε', 120519 => 'ζ', 120520 => 'η', 120521 => 'θ', 120522 => 'ι', 120523 => 'κ', 120524 => 'λ', 120525 => 'μ', 120526 => 'ν', 120527 => 'ξ', 120528 => 'ο', 120529 => 'Ï€', 120530 => 'Ï', 120531 => 'σ', 120532 => 'σ', 120533 => 'Ï„', 120534 => 'Ï…', 120535 => 'φ', 120536 => 'χ', 120537 => 'ψ', 120538 => 'ω', 120539 => '∂', 120540 => 'ε', 120541 => 'θ', 120542 => 'κ', 120543 => 'φ', 120544 => 'Ï', 120545 => 'Ï€', 120546 => 'α', 120547 => 'β', 120548 => 'γ', 120549 => 'δ', 120550 => 'ε', 120551 => 'ζ', 120552 => 'η', 120553 => 'θ', 120554 => 'ι', 120555 => 'κ', 120556 => 'λ', 120557 => 'μ', 120558 => 'ν', 120559 => 'ξ', 120560 => 'ο', 120561 => 'Ï€', 120562 => 'Ï', 120563 => 'θ', 120564 => 'σ', 120565 => 'Ï„', 120566 => 'Ï…', 120567 => 'φ', 120568 => 'χ', 120569 => 'ψ', 120570 => 'ω', 120571 => '∇', 120572 => 'α', 120573 => 'β', 120574 => 'γ', 120575 => 'δ', 120576 => 'ε', 120577 => 'ζ', 120578 => 'η', 120579 => 'θ', 120580 => 'ι', 120581 => 'κ', 120582 => 'λ', 120583 => 'μ', 120584 => 'ν', 120585 => 'ξ', 120586 => 'ο', 120587 => 'Ï€', 120588 => 'Ï', 120589 => 'σ', 120590 => 'σ', 120591 => 'Ï„', 120592 => 'Ï…', 120593 => 'φ', 120594 => 'χ', 120595 => 'ψ', 120596 => 'ω', 120597 => '∂', 120598 => 'ε', 120599 => 'θ', 120600 => 'κ', 120601 => 'φ', 120602 => 'Ï', 120603 => 'Ï€', 120604 => 'α', 120605 => 'β', 120606 => 'γ', 120607 => 'δ', 120608 => 'ε', 120609 => 'ζ', 120610 => 'η', 120611 => 'θ', 120612 => 'ι', 120613 => 'κ', 120614 => 'λ', 120615 => 'μ', 120616 => 'ν', 120617 => 'ξ', 120618 => 'ο', 120619 => 'Ï€', 120620 => 'Ï', 120621 => 'θ', 120622 => 'σ', 120623 => 'Ï„', 120624 => 'Ï…', 120625 => 'φ', 120626 => 'χ', 120627 => 'ψ', 120628 => 'ω', 120629 => '∇', 120630 => 'α', 120631 => 'β', 120632 => 'γ', 120633 => 'δ', 120634 => 'ε', 120635 => 'ζ', 120636 => 'η', 120637 => 'θ', 120638 => 'ι', 120639 => 'κ', 120640 => 'λ', 120641 => 'μ', 120642 => 'ν', 120643 => 'ξ', 120644 => 'ο', 120645 => 'Ï€', 120646 => 'Ï', 120647 => 'σ', 120648 => 'σ', 120649 => 'Ï„', 120650 => 'Ï…', 120651 => 'φ', 120652 => 'χ', 120653 => 'ψ', 120654 => 'ω', 120655 => '∂', 120656 => 'ε', 120657 => 'θ', 120658 => 'κ', 120659 => 'φ', 120660 => 'Ï', 120661 => 'Ï€', 120662 => 'α', 120663 => 'β', 120664 => 'γ', 120665 => 'δ', 120666 => 'ε', 120667 => 'ζ', 120668 => 'η', 120669 => 'θ', 120670 => 'ι', 120671 => 'κ', 120672 => 'λ', 120673 => 'μ', 120674 => 'ν', 120675 => 'ξ', 120676 => 'ο', 120677 => 'Ï€', 120678 => 'Ï', 120679 => 'θ', 120680 => 'σ', 120681 => 'Ï„', 120682 => 'Ï…', 120683 => 'φ', 120684 => 'χ', 120685 => 'ψ', 120686 => 'ω', 120687 => '∇', 120688 => 'α', 120689 => 'β', 120690 => 'γ', 120691 => 'δ', 120692 => 'ε', 120693 => 'ζ', 120694 => 'η', 120695 => 'θ', 120696 => 'ι', 120697 => 'κ', 120698 => 'λ', 120699 => 'μ', 120700 => 'ν', 120701 => 'ξ', 120702 => 'ο', 120703 => 'Ï€', 120704 => 'Ï', 120705 => 'σ', 120706 => 'σ', 120707 => 'Ï„', 120708 => 'Ï…', 120709 => 'φ', 120710 => 'χ', 120711 => 'ψ', 120712 => 'ω', 120713 => '∂', 120714 => 'ε', 120715 => 'θ', 120716 => 'κ', 120717 => 'φ', 120718 => 'Ï', 120719 => 'Ï€', 120720 => 'α', 120721 => 'β', 120722 => 'γ', 120723 => 'δ', 120724 => 'ε', 120725 => 'ζ', 120726 => 'η', 120727 => 'θ', 120728 => 'ι', 120729 => 'κ', 120730 => 'λ', 120731 => 'μ', 120732 => 'ν', 120733 => 'ξ', 120734 => 'ο', 120735 => 'Ï€', 120736 => 'Ï', 120737 => 'θ', 120738 => 'σ', 120739 => 'Ï„', 120740 => 'Ï…', 120741 => 'φ', 120742 => 'χ', 120743 => 'ψ', 120744 => 'ω', 120745 => '∇', 120746 => 'α', 120747 => 'β', 120748 => 'γ', 120749 => 'δ', 120750 => 'ε', 120751 => 'ζ', 120752 => 'η', 120753 => 'θ', 120754 => 'ι', 120755 => 'κ', 120756 => 'λ', 120757 => 'μ', 120758 => 'ν', 120759 => 'ξ', 120760 => 'ο', 120761 => 'Ï€', 120762 => 'Ï', 120763 => 'σ', 120764 => 'σ', 120765 => 'Ï„', 120766 => 'Ï…', 120767 => 'φ', 120768 => 'χ', 120769 => 'ψ', 120770 => 'ω', 120771 => '∂', 120772 => 'ε', 120773 => 'θ', 120774 => 'κ', 120775 => 'φ', 120776 => 'Ï', 120777 => 'Ï€', 120778 => 'Ï', 120779 => 'Ï', 120782 => '0', 120783 => '1', 120784 => '2', 120785 => '3', 120786 => '4', 120787 => '5', 120788 => '6', 120789 => '7', 120790 => '8', 120791 => '9', 120792 => '0', 120793 => '1', 120794 => '2', 120795 => '3', 120796 => '4', 120797 => '5', 120798 => '6', 120799 => '7', 120800 => '8', 120801 => '9', 120802 => '0', 120803 => '1', 120804 => '2', 120805 => '3', 120806 => '4', 120807 => '5', 120808 => '6', 120809 => '7', 120810 => '8', 120811 => '9', 120812 => '0', 120813 => '1', 120814 => '2', 120815 => '3', 120816 => '4', 120817 => '5', 120818 => '6', 120819 => '7', 120820 => '8', 120821 => '9', 120822 => '0', 120823 => '1', 120824 => '2', 120825 => '3', 120826 => '4', 120827 => '5', 120828 => '6', 120829 => '7', 120830 => '8', 120831 => '9', 125184 => '𞤢', 125185 => '𞤣', 125186 => '𞤤', 125187 => '𞤥', 125188 => '𞤦', 125189 => '𞤧', 125190 => '𞤨', 125191 => '𞤩', 125192 => '𞤪', 125193 => '𞤫', 125194 => '𞤬', 125195 => '𞤭', 125196 => '𞤮', 125197 => '𞤯', 125198 => '𞤰', 125199 => '𞤱', 125200 => '𞤲', 125201 => '𞤳', 125202 => '𞤴', 125203 => '𞤵', 125204 => '𞤶', 125205 => '𞤷', 125206 => '𞤸', 125207 => '𞤹', 125208 => '𞤺', 125209 => '𞤻', 125210 => '𞤼', 125211 => '𞤽', 125212 => '𞤾', 125213 => '𞤿', 125214 => '𞥀', 125215 => 'ðž¥', 125216 => '𞥂', 125217 => '𞥃', 126464 => 'ا', 126465 => 'ب', 126466 => 'ج', 126467 => 'د', 126469 => 'Ùˆ', 126470 => 'ز', 126471 => 'Ø­', 126472 => 'Ø·', 126473 => 'ÙŠ', 126474 => 'Ùƒ', 126475 => 'Ù„', 126476 => 'Ù…', 126477 => 'Ù†', 126478 => 'س', 126479 => 'ع', 126480 => 'Ù', 126481 => 'ص', 126482 => 'Ù‚', 126483 => 'ر', 126484 => 'Ø´', 126485 => 'ت', 126486 => 'Ø«', 126487 => 'Ø®', 126488 => 'Ø°', 126489 => 'ض', 126490 => 'ظ', 126491 => 'غ', 126492 => 'Ù®', 126493 => 'Úº', 126494 => 'Ú¡', 126495 => 'Ù¯', 126497 => 'ب', 126498 => 'ج', 126500 => 'Ù‡', 126503 => 'Ø­', 126505 => 'ÙŠ', 126506 => 'Ùƒ', 126507 => 'Ù„', 126508 => 'Ù…', 126509 => 'Ù†', 126510 => 'س', 126511 => 'ع', 126512 => 'Ù', 126513 => 'ص', 126514 => 'Ù‚', 126516 => 'Ø´', 126517 => 'ت', 126518 => 'Ø«', 126519 => 'Ø®', 126521 => 'ض', 126523 => 'غ', 126530 => 'ج', 126535 => 'Ø­', 126537 => 'ÙŠ', 126539 => 'Ù„', 126541 => 'Ù†', 126542 => 'س', 126543 => 'ع', 126545 => 'ص', 126546 => 'Ù‚', 126548 => 'Ø´', 126551 => 'Ø®', 126553 => 'ض', 126555 => 'غ', 126557 => 'Úº', 126559 => 'Ù¯', 126561 => 'ب', 126562 => 'ج', 126564 => 'Ù‡', 126567 => 'Ø­', 126568 => 'Ø·', 126569 => 'ÙŠ', 126570 => 'Ùƒ', 126572 => 'Ù…', 126573 => 'Ù†', 126574 => 'س', 126575 => 'ع', 126576 => 'Ù', 126577 => 'ص', 126578 => 'Ù‚', 126580 => 'Ø´', 126581 => 'ت', 126582 => 'Ø«', 126583 => 'Ø®', 126585 => 'ض', 126586 => 'ظ', 126587 => 'غ', 126588 => 'Ù®', 126590 => 'Ú¡', 126592 => 'ا', 126593 => 'ب', 126594 => 'ج', 126595 => 'د', 126596 => 'Ù‡', 126597 => 'Ùˆ', 126598 => 'ز', 126599 => 'Ø­', 126600 => 'Ø·', 126601 => 'ÙŠ', 126603 => 'Ù„', 126604 => 'Ù…', 126605 => 'Ù†', 126606 => 'س', 126607 => 'ع', 126608 => 'Ù', 126609 => 'ص', 126610 => 'Ù‚', 126611 => 'ر', 126612 => 'Ø´', 126613 => 'ت', 126614 => 'Ø«', 126615 => 'Ø®', 126616 => 'Ø°', 126617 => 'ض', 126618 => 'ظ', 126619 => 'غ', 126625 => 'ب', 126626 => 'ج', 126627 => 'د', 126629 => 'Ùˆ', 126630 => 'ز', 126631 => 'Ø­', 126632 => 'Ø·', 126633 => 'ÙŠ', 126635 => 'Ù„', 126636 => 'Ù…', 126637 => 'Ù†', 126638 => 'س', 126639 => 'ع', 126640 => 'Ù', 126641 => 'ص', 126642 => 'Ù‚', 126643 => 'ر', 126644 => 'Ø´', 126645 => 'ت', 126646 => 'Ø«', 126647 => 'Ø®', 126648 => 'Ø°', 126649 => 'ض', 126650 => 'ظ', 126651 => 'غ', 127274 => '〔s〕', 127275 => 'c', 127276 => 'r', 127277 => 'cd', 127278 => 'wz', 127280 => 'a', 127281 => 'b', 127282 => 'c', 127283 => 'd', 127284 => 'e', 127285 => 'f', 127286 => 'g', 127287 => 'h', 127288 => 'i', 127289 => 'j', 127290 => 'k', 127291 => 'l', 127292 => 'm', 127293 => 'n', 127294 => 'o', 127295 => 'p', 127296 => 'q', 127297 => 'r', 127298 => 's', 127299 => 't', 127300 => 'u', 127301 => 'v', 127302 => 'w', 127303 => 'x', 127304 => 'y', 127305 => 'z', 127306 => 'hv', 127307 => 'mv', 127308 => 'sd', 127309 => 'ss', 127310 => 'ppv', 127311 => 'wc', 127338 => 'mc', 127339 => 'md', 127340 => 'mr', 127376 => 'dj', 127488 => 'ã»ã‹', 127489 => 'ココ', 127490 => 'サ', 127504 => '手', 127505 => 'å­—', 127506 => 'åŒ', 127507 => 'デ', 127508 => '二', 127509 => '多', 127510 => '解', 127511 => '天', 127512 => '交', 127513 => '映', 127514 => 'ç„¡', 127515 => 'æ–™', 127516 => 'å‰', 127517 => '後', 127518 => 'å†', 127519 => 'æ–°', 127520 => 'åˆ', 127521 => '終', 127522 => '生', 127523 => '販', 127524 => '声', 127525 => 'å¹', 127526 => 'æ¼”', 127527 => '投', 127528 => 'æ•', 127529 => '一', 127530 => '三', 127531 => 'éŠ', 127532 => 'å·¦', 127533 => '中', 127534 => 'å³', 127535 => '指', 127536 => 'èµ°', 127537 => '打', 127538 => 'ç¦', 127539 => '空', 127540 => 'åˆ', 127541 => '満', 127542 => '有', 127543 => '月', 127544 => '申', 127545 => '割', 127546 => 'å–¶', 127547 => 'é…', 127552 => '〔本〕', 127553 => '〔三〕', 127554 => '〔二〕', 127555 => '〔安〕', 127556 => '〔点〕', 127557 => '〔打〕', 127558 => '〔盗〕', 127559 => '〔å‹ã€•', 127560 => '〔敗〕', 127568 => 'å¾—', 127569 => 'å¯', 130032 => '0', 130033 => '1', 130034 => '2', 130035 => '3', 130036 => '4', 130037 => '5', 130038 => '6', 130039 => '7', 130040 => '8', 130041 => '9', 194560 => '丽', 194561 => '丸', 194562 => 'ä¹', 194563 => 'ð „¢', 194564 => 'ä½ ', 194565 => 'ä¾®', 194566 => 'ä¾»', 194567 => '倂', 194568 => 'åº', 194569 => 'å‚™', 194570 => '僧', 194571 => 'åƒ', 194572 => 'ã’ž', 194573 => '𠘺', 194574 => 'å…', 194575 => 'å…”', 194576 => 'å…¤', 194577 => 'å…·', 194578 => '𠔜', 194579 => 'ã’¹', 194580 => 'å…§', 194581 => 'å†', 194582 => 'ð •‹', 194583 => '冗', 194584 => '冤', 194585 => '仌', 194586 => '冬', 194587 => '况', 194588 => '𩇟', 194589 => '凵', 194590 => '刃', 194591 => 'ã“Ÿ', 194592 => '刻', 194593 => '剆', 194594 => '割', 194595 => '剷', 194596 => '㔕', 194597 => '勇', 194598 => '勉', 194599 => '勤', 194600 => '勺', 194601 => '包', 194602 => '匆', 194603 => '北', 194604 => 'å‰', 194605 => 'å‘', 194606 => 'åš', 194607 => 'å³', 194608 => 'å½', 194609 => 'å¿', 194610 => 'å¿', 194611 => 'å¿', 194612 => '𠨬', 194613 => 'ç°', 194614 => 'åŠ', 194615 => 'åŸ', 194616 => 'ð ­£', 194617 => 'å«', 194618 => 'å±', 194619 => 'å†', 194620 => 'å’ž', 194621 => 'å¸', 194622 => '呈', 194623 => '周', 194624 => 'å’¢', 194625 => '哶', 194626 => 'å”', 194627 => 'å•“', 194628 => 'å•£', 194629 => 'å–„', 194630 => 'å–„', 194631 => 'å–™', 194632 => 'å–«', 194633 => 'å–³', 194634 => 'å—‚', 194635 => '圖', 194636 => '嘆', 194637 => '圗', 194638 => '噑', 194639 => 'å™´', 194640 => '切', 194641 => '壮', 194642 => '城', 194643 => '埴', 194644 => 'å ', 194645 => 'åž‹', 194646 => 'å ²', 194647 => 'å ±', 194648 => '墬', 194649 => '𡓤', 194650 => '売', 194651 => '壷', 194652 => '夆', 194653 => '多', 194654 => '夢', 194655 => '奢', 194656 => '𡚨', 194657 => '𡛪', 194658 => '姬', 194659 => '娛', 194660 => '娧', 194661 => '姘', 194662 => '婦', 194663 => 'ã›®', 194665 => '嬈', 194666 => '嬾', 194667 => '嬾', 194668 => '𡧈', 194669 => '寃', 194670 => '寘', 194671 => '寧', 194672 => '寳', 194673 => '𡬘', 194674 => '寿', 194675 => 'å°†', 194677 => 'å°¢', 194678 => 'ãž', 194679 => 'å± ', 194680 => 'å±®', 194681 => 'å³€', 194682 => 'å²', 194683 => 'ð¡·¤', 194684 => '嵃', 194685 => 'ð¡·¦', 194686 => 'åµ®', 194687 => '嵫', 194688 => 'åµ¼', 194689 => 'å·¡', 194690 => 'å·¢', 194691 => 'ã ¯', 194692 => 'å·½', 194693 => '帨', 194694 => '帽', 194695 => '幩', 194696 => 'ã¡¢', 194697 => '𢆃', 194698 => '㡼', 194699 => '庰', 194700 => '庳', 194701 => '庶', 194702 => '廊', 194703 => '𪎒', 194704 => '廾', 194705 => '𢌱', 194706 => '𢌱', 194707 => 'èˆ', 194708 => 'å¼¢', 194709 => 'å¼¢', 194710 => '㣇', 194711 => '𣊸', 194712 => '𦇚', 194713 => 'å½¢', 194714 => '彫', 194715 => '㣣', 194716 => '徚', 194717 => 'å¿', 194718 => 'å¿—', 194719 => '忹', 194720 => 'æ‚', 194721 => '㤺', 194722 => '㤜', 194723 => 'æ‚”', 194724 => '𢛔', 194725 => '惇', 194726 => 'æ…ˆ', 194727 => 'æ…Œ', 194728 => 'æ…Ž', 194729 => 'æ…Œ', 194730 => 'æ…º', 194731 => '憎', 194732 => '憲', 194733 => '憤', 194734 => '憯', 194735 => '懞', 194736 => '懲', 194737 => '懶', 194738 => 'æˆ', 194739 => '戛', 194740 => 'æ‰', 194741 => '抱', 194742 => 'æ‹”', 194743 => 'æ', 194744 => '𢬌', 194745 => '挽', 194746 => '拼', 194747 => 'æ¨', 194748 => '掃', 194749 => 'æ¤', 194750 => '𢯱', 194751 => 'æ¢', 194752 => 'æ…', 194753 => '掩', 194754 => '㨮', 194755 => 'æ‘©', 194756 => '摾', 194757 => 'æ’', 194758 => 'æ‘·', 194759 => '㩬', 194760 => 'æ•', 194761 => '敬', 194762 => '𣀊', 194763 => 'æ—£', 194764 => '書', 194765 => '晉', 194766 => '㬙', 194767 => 'æš‘', 194768 => '㬈', 194769 => '㫤', 194770 => '冒', 194771 => '冕', 194772 => '最', 194773 => 'æšœ', 194774 => 'è‚­', 194775 => 'ä™', 194776 => '朗', 194777 => '望', 194778 => '朡', 194779 => 'æž', 194780 => 'æ“', 194781 => 'ð£ƒ', 194782 => 'ã­‰', 194783 => '柺', 194784 => 'æž…', 194785 => 'æ¡’', 194786 => '梅', 194787 => '𣑭', 194788 => '梎', 194789 => 'æ Ÿ', 194790 => '椔', 194791 => 'ã®', 194792 => '楂', 194793 => '榣', 194794 => '槪', 194795 => '檨', 194796 => '𣚣', 194797 => 'æ«›', 194798 => 'ã°˜', 194799 => '次', 194800 => '𣢧', 194801 => 'æ­”', 194802 => '㱎', 194803 => 'æ­²', 194804 => '殟', 194805 => '殺', 194806 => 'æ®»', 194807 => 'ð£ª', 194808 => 'ð¡´‹', 194809 => '𣫺', 194810 => '汎', 194811 => '𣲼', 194812 => '沿', 194813 => 'æ³', 194814 => '汧', 194815 => 'æ´–', 194816 => 'æ´¾', 194817 => 'æµ·', 194818 => 'æµ', 194819 => '浩', 194820 => '浸', 194821 => '涅', 194822 => '𣴞', 194823 => 'æ´´', 194824 => '港', 194825 => 'æ¹®', 194826 => 'ã´³', 194827 => '滋', 194828 => '滇', 194829 => '𣻑', 194830 => 'æ·¹', 194831 => 'æ½®', 194832 => '𣽞', 194833 => '𣾎', 194834 => '濆', 194835 => '瀹', 194836 => '瀞', 194837 => '瀛', 194838 => '㶖', 194839 => 'çŠ', 194840 => 'ç½', 194841 => 'ç·', 194842 => 'ç‚­', 194843 => '𠔥', 194844 => 'ç……', 194845 => '𤉣', 194846 => '熜', 194848 => '爨', 194849 => '爵', 194850 => 'ç‰', 194851 => '𤘈', 194852 => '犀', 194853 => '犕', 194854 => '𤜵', 194855 => '𤠔', 194856 => 'çº', 194857 => '王', 194858 => '㺬', 194859 => '玥', 194860 => '㺸', 194861 => '㺸', 194862 => '瑇', 194863 => 'ç‘œ', 194864 => '瑱', 194865 => 'ç’…', 194866 => 'ç“Š', 194867 => 'ã¼›', 194868 => '甤', 194869 => '𤰶', 194870 => '甾', 194871 => '𤲒', 194872 => 'ç•°', 194873 => '𢆟', 194874 => 'ç˜', 194875 => '𤾡', 194876 => '𤾸', 194877 => 'ð¥„', 194878 => '㿼', 194879 => '䀈', 194880 => 'ç›´', 194881 => '𥃳', 194882 => '𥃲', 194883 => '𥄙', 194884 => '𥄳', 194885 => '眞', 194886 => '真', 194887 => '真', 194888 => 'çŠ', 194889 => '䀹', 194890 => 'çž‹', 194891 => 'ä†', 194892 => 'ä‚–', 194893 => 'ð¥', 194894 => 'ç¡Ž', 194895 => '碌', 194896 => '磌', 194897 => '䃣', 194898 => '𥘦', 194899 => '祖', 194900 => '𥚚', 194901 => '𥛅', 194902 => 'ç¦', 194903 => '秫', 194904 => '䄯', 194905 => 'ç©€', 194906 => 'ç©Š', 194907 => 'ç©', 194908 => '𥥼', 194909 => '𥪧', 194910 => '𥪧', 194912 => '䈂', 194913 => '𥮫', 194914 => '篆', 194915 => '築', 194916 => '䈧', 194917 => '𥲀', 194918 => 'ç³’', 194919 => '䊠', 194920 => '糨', 194921 => 'ç³£', 194922 => 'ç´€', 194923 => '𥾆', 194924 => 'çµ£', 194925 => 'äŒ', 194926 => 'ç·‡', 194927 => '縂', 194928 => 'ç¹…', 194929 => '䌴', 194930 => '𦈨', 194931 => '𦉇', 194932 => 'ä™', 194933 => '𦋙', 194934 => '罺', 194935 => '𦌾', 194936 => '羕', 194937 => '翺', 194938 => '者', 194939 => '𦓚', 194940 => '𦔣', 194941 => 'è ', 194942 => '𦖨', 194943 => 'è°', 194944 => 'ð£Ÿ', 194945 => 'ä•', 194946 => '育', 194947 => '脃', 194948 => 'ä‹', 194949 => '脾', 194950 => '媵', 194951 => '𦞧', 194952 => '𦞵', 194953 => '𣎓', 194954 => '𣎜', 194955 => 'èˆ', 194956 => '舄', 194957 => '辞', 194958 => 'ä‘«', 194959 => '芑', 194960 => '芋', 194961 => 'èŠ', 194962 => '劳', 194963 => '花', 194964 => '芳', 194965 => '芽', 194966 => '苦', 194967 => '𦬼', 194968 => 'è‹¥', 194969 => 'èŒ', 194970 => 'è£', 194971 => '莭', 194972 => '茣', 194973 => '莽', 194974 => 'è§', 194975 => 'è‘—', 194976 => 'è“', 194977 => 'èŠ', 194978 => 'èŒ', 194979 => 'èœ', 194980 => '𦰶', 194981 => '𦵫', 194982 => '𦳕', 194983 => '䔫', 194984 => '蓱', 194985 => '蓳', 194986 => 'è”–', 194987 => 'ð§Š', 194988 => '蕤', 194989 => '𦼬', 194990 => 'ä•', 194991 => 'ä•¡', 194992 => '𦾱', 194993 => '𧃒', 194994 => 'ä•«', 194995 => 'è™', 194996 => '虜', 194997 => '虧', 194998 => '虩', 194999 => 'èš©', 195000 => '蚈', 195001 => '蜎', 195002 => '蛢', 195003 => 'è¹', 195004 => '蜨', 195005 => 'è«', 195006 => '螆', 195008 => '蟡', 195009 => 'è ', 195010 => 'ä—¹', 195011 => 'è¡ ', 195012 => 'è¡£', 195013 => '𧙧', 195014 => '裗', 195015 => '裞', 195016 => '䘵', 195017 => '裺', 195018 => 'ã’»', 195019 => '𧢮', 195020 => '𧥦', 195021 => 'äš¾', 195022 => '䛇', 195023 => '誠', 195024 => 'è«­', 195025 => '變', 195026 => '豕', 195027 => '𧲨', 195028 => '貫', 195029 => 'è³', 195030 => 'è´›', 195031 => 'èµ·', 195032 => '𧼯', 195033 => 'ð  „', 195034 => 'è·‹', 195035 => '趼', 195036 => 'è·°', 195037 => '𠣞', 195038 => 'è»”', 195039 => '輸', 195040 => '𨗒', 195041 => '𨗭', 195042 => 'é‚”', 195043 => '郱', 195044 => 'é„‘', 195045 => '𨜮', 195046 => 'é„›', 195047 => '鈸', 195048 => 'é‹—', 195049 => '鋘', 195050 => '鉼', 195051 => 'é¹', 195052 => 'é•', 195053 => '𨯺', 195054 => 'é–‹', 195055 => '䦕', 195056 => 'é–·', 195057 => '𨵷', 195058 => '䧦', 195059 => '雃', 195060 => '嶲', 195061 => '霣', 195062 => 'ð©……', 195063 => '𩈚', 195064 => 'ä©®', 195065 => '䩶', 195066 => '韠', 195067 => 'ð©Š', 195068 => '䪲', 195069 => 'ð©’–', 195070 => 'é ‹', 195071 => 'é ‹', 195072 => 'é ©', 195073 => 'ð©–¶', 195074 => '飢', 195075 => '䬳', 195076 => '餩', 195077 => '馧', 195078 => '駂', 195079 => '駾', 195080 => '䯎', 195081 => '𩬰', 195082 => '鬒', 195083 => 'é±€', 195084 => 'é³½', 195085 => '䳎', 195086 => 'ä³­', 195087 => '鵧', 195088 => '𪃎', 195089 => '䳸', 195090 => '𪄅', 195091 => '𪈎', 195092 => '𪊑', 195093 => '麻', 195094 => 'äµ–', 195095 => '黹', 195096 => '黾', 195097 => 'é¼…', 195098 => 'é¼', 195099 => 'é¼–', 195100 => 'é¼»', 195101 => '𪘀'); gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php000064400000011373147600374260030776 0ustar00addons ' ', 168 => ' ̈', 175 => ' Ì„', 180 => ' Ì', 184 => ' ̧', 728 => ' ̆', 729 => ' ̇', 730 => ' ÌŠ', 731 => ' ̨', 732 => ' ̃', 733 => ' Ì‹', 890 => ' ι', 894 => ';', 900 => ' Ì', 901 => ' ̈Ì', 8125 => ' Ì“', 8127 => ' Ì“', 8128 => ' Í‚', 8129 => ' ̈͂', 8141 => ' Ì“Ì€', 8142 => ' Ì“Ì', 8143 => ' Ì“Í‚', 8157 => ' ̔̀', 8158 => ' Ì”Ì', 8159 => ' ̔͂', 8173 => ' ̈̀', 8174 => ' ̈Ì', 8175 => '`', 8189 => ' Ì', 8190 => ' Ì”', 8192 => ' ', 8193 => ' ', 8194 => ' ', 8195 => ' ', 8196 => ' ', 8197 => ' ', 8198 => ' ', 8199 => ' ', 8200 => ' ', 8201 => ' ', 8202 => ' ', 8215 => ' ̳', 8239 => ' ', 8252 => '!!', 8254 => ' Ì…', 8263 => '??', 8264 => '?!', 8265 => '!?', 8287 => ' ', 8314 => '+', 8316 => '=', 8317 => '(', 8318 => ')', 8330 => '+', 8332 => '=', 8333 => '(', 8334 => ')', 8448 => 'a/c', 8449 => 'a/s', 8453 => 'c/o', 8454 => 'c/u', 9332 => '(1)', 9333 => '(2)', 9334 => '(3)', 9335 => '(4)', 9336 => '(5)', 9337 => '(6)', 9338 => '(7)', 9339 => '(8)', 9340 => '(9)', 9341 => '(10)', 9342 => '(11)', 9343 => '(12)', 9344 => '(13)', 9345 => '(14)', 9346 => '(15)', 9347 => '(16)', 9348 => '(17)', 9349 => '(18)', 9350 => '(19)', 9351 => '(20)', 9372 => '(a)', 9373 => '(b)', 9374 => '(c)', 9375 => '(d)', 9376 => '(e)', 9377 => '(f)', 9378 => '(g)', 9379 => '(h)', 9380 => '(i)', 9381 => '(j)', 9382 => '(k)', 9383 => '(l)', 9384 => '(m)', 9385 => '(n)', 9386 => '(o)', 9387 => '(p)', 9388 => '(q)', 9389 => '(r)', 9390 => '(s)', 9391 => '(t)', 9392 => '(u)', 9393 => '(v)', 9394 => '(w)', 9395 => '(x)', 9396 => '(y)', 9397 => '(z)', 10868 => '::=', 10869 => '==', 10870 => '===', 12288 => ' ', 12443 => ' ã‚™', 12444 => ' ã‚š', 12800 => '(á„€)', 12801 => '(á„‚)', 12802 => '(ᄃ)', 12803 => '(á„…)', 12804 => '(ᄆ)', 12805 => '(ᄇ)', 12806 => '(ᄉ)', 12807 => '(á„‹)', 12808 => '(á„Œ)', 12809 => '(á„Ž)', 12810 => '(á„)', 12811 => '(á„)', 12812 => '(á„‘)', 12813 => '(á„’)', 12814 => '(ê°€)', 12815 => '(나)', 12816 => '(다)', 12817 => '(ë¼)', 12818 => '(마)', 12819 => '(ë°”)', 12820 => '(사)', 12821 => '(ì•„)', 12822 => '(ìž)', 12823 => '(ì°¨)', 12824 => '(ì¹´)', 12825 => '(타)', 12826 => '(파)', 12827 => '(하)', 12828 => '(주)', 12829 => '(오전)', 12830 => '(오후)', 12832 => '(一)', 12833 => '(二)', 12834 => '(三)', 12835 => '(å››)', 12836 => '(五)', 12837 => '(å…­)', 12838 => '(七)', 12839 => '(å…«)', 12840 => '(ä¹)', 12841 => '(å)', 12842 => '(月)', 12843 => '(ç«)', 12844 => '(æ°´)', 12845 => '(木)', 12846 => '(金)', 12847 => '(土)', 12848 => '(æ—¥)', 12849 => '(æ ª)', 12850 => '(有)', 12851 => '(社)', 12852 => '(å)', 12853 => '(特)', 12854 => '(財)', 12855 => '(ç¥)', 12856 => '(労)', 12857 => '(代)', 12858 => '(呼)', 12859 => '(å­¦)', 12860 => '(監)', 12861 => '(ä¼)', 12862 => '(資)', 12863 => '(å”)', 12864 => '(祭)', 12865 => '(休)', 12866 => '(自)', 12867 => '(至)', 64297 => '+', 64606 => ' ٌّ', 64607 => ' ÙÙ‘', 64608 => ' ÙŽÙ‘', 64609 => ' ÙÙ‘', 64610 => ' ÙÙ‘', 64611 => ' ّٰ', 65018 => 'صلى الله عليه وسلم', 65019 => 'جل جلاله', 65040 => ',', 65043 => ':', 65044 => ';', 65045 => '!', 65046 => '?', 65075 => '_', 65076 => '_', 65077 => '(', 65078 => ')', 65079 => '{', 65080 => '}', 65095 => '[', 65096 => ']', 65097 => ' Ì…', 65098 => ' Ì…', 65099 => ' Ì…', 65100 => ' Ì…', 65101 => '_', 65102 => '_', 65103 => '_', 65104 => ',', 65108 => ';', 65109 => ':', 65110 => '?', 65111 => '!', 65113 => '(', 65114 => ')', 65115 => '{', 65116 => '}', 65119 => '#', 65120 => '&', 65121 => '*', 65122 => '+', 65124 => '<', 65125 => '>', 65126 => '=', 65128 => '\\', 65129 => '$', 65130 => '%', 65131 => '@', 65136 => ' Ù‹', 65138 => ' ÙŒ', 65140 => ' Ù', 65142 => ' ÙŽ', 65144 => ' Ù', 65146 => ' Ù', 65148 => ' Ù‘', 65150 => ' Ù’', 65281 => '!', 65282 => '"', 65283 => '#', 65284 => '$', 65285 => '%', 65286 => '&', 65287 => '\'', 65288 => '(', 65289 => ')', 65290 => '*', 65291 => '+', 65292 => ',', 65295 => '/', 65306 => ':', 65307 => ';', 65308 => '<', 65309 => '=', 65310 => '>', 65311 => '?', 65312 => '@', 65339 => '[', 65340 => '\\', 65341 => ']', 65342 => '^', 65343 => '_', 65344 => '`', 65371 => '{', 65372 => '|', 65373 => '}', 65374 => '~', 65507 => ' Ì„', 127233 => '0,', 127234 => '1,', 127235 => '2,', 127236 => '3,', 127237 => '4,', 127238 => '5,', 127239 => '6,', 127240 => '7,', 127241 => '8,', 127242 => '9,', 127248 => '(a)', 127249 => '(b)', 127250 => '(c)', 127251 => '(d)', 127252 => '(e)', 127253 => '(f)', 127254 => '(g)', 127255 => '(h)', 127256 => '(i)', 127257 => '(j)', 127258 => '(k)', 127259 => '(l)', 127260 => '(m)', 127261 => '(n)', 127262 => '(o)', 127263 => '(p)', 127264 => '(q)', 127265 => '(r)', 127266 => '(s)', 127267 => '(t)', 127268 => '(u)', 127269 => '(v)', 127270 => '(w)', 127271 => '(x)', 127272 => '(y)', 127273 => '(z)'); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/ignored.php000064400000010754147600374260026234 0ustar00 \true, 847 => \true, 6155 => \true, 6156 => \true, 6157 => \true, 8203 => \true, 8288 => \true, 8292 => \true, 65024 => \true, 65025 => \true, 65026 => \true, 65027 => \true, 65028 => \true, 65029 => \true, 65030 => \true, 65031 => \true, 65032 => \true, 65033 => \true, 65034 => \true, 65035 => \true, 65036 => \true, 65037 => \true, 65038 => \true, 65039 => \true, 65279 => \true, 113824 => \true, 113825 => \true, 113826 => \true, 113827 => \true, 917760 => \true, 917761 => \true, 917762 => \true, 917763 => \true, 917764 => \true, 917765 => \true, 917766 => \true, 917767 => \true, 917768 => \true, 917769 => \true, 917770 => \true, 917771 => \true, 917772 => \true, 917773 => \true, 917774 => \true, 917775 => \true, 917776 => \true, 917777 => \true, 917778 => \true, 917779 => \true, 917780 => \true, 917781 => \true, 917782 => \true, 917783 => \true, 917784 => \true, 917785 => \true, 917786 => \true, 917787 => \true, 917788 => \true, 917789 => \true, 917790 => \true, 917791 => \true, 917792 => \true, 917793 => \true, 917794 => \true, 917795 => \true, 917796 => \true, 917797 => \true, 917798 => \true, 917799 => \true, 917800 => \true, 917801 => \true, 917802 => \true, 917803 => \true, 917804 => \true, 917805 => \true, 917806 => \true, 917807 => \true, 917808 => \true, 917809 => \true, 917810 => \true, 917811 => \true, 917812 => \true, 917813 => \true, 917814 => \true, 917815 => \true, 917816 => \true, 917817 => \true, 917818 => \true, 917819 => \true, 917820 => \true, 917821 => \true, 917822 => \true, 917823 => \true, 917824 => \true, 917825 => \true, 917826 => \true, 917827 => \true, 917828 => \true, 917829 => \true, 917830 => \true, 917831 => \true, 917832 => \true, 917833 => \true, 917834 => \true, 917835 => \true, 917836 => \true, 917837 => \true, 917838 => \true, 917839 => \true, 917840 => \true, 917841 => \true, 917842 => \true, 917843 => \true, 917844 => \true, 917845 => \true, 917846 => \true, 917847 => \true, 917848 => \true, 917849 => \true, 917850 => \true, 917851 => \true, 917852 => \true, 917853 => \true, 917854 => \true, 917855 => \true, 917856 => \true, 917857 => \true, 917858 => \true, 917859 => \true, 917860 => \true, 917861 => \true, 917862 => \true, 917863 => \true, 917864 => \true, 917865 => \true, 917866 => \true, 917867 => \true, 917868 => \true, 917869 => \true, 917870 => \true, 917871 => \true, 917872 => \true, 917873 => \true, 917874 => \true, 917875 => \true, 917876 => \true, 917877 => \true, 917878 => \true, 917879 => \true, 917880 => \true, 917881 => \true, 917882 => \true, 917883 => \true, 917884 => \true, 917885 => \true, 917886 => \true, 917887 => \true, 917888 => \true, 917889 => \true, 917890 => \true, 917891 => \true, 917892 => \true, 917893 => \true, 917894 => \true, 917895 => \true, 917896 => \true, 917897 => \true, 917898 => \true, 917899 => \true, 917900 => \true, 917901 => \true, 917902 => \true, 917903 => \true, 917904 => \true, 917905 => \true, 917906 => \true, 917907 => \true, 917908 => \true, 917909 => \true, 917910 => \true, 917911 => \true, 917912 => \true, 917913 => \true, 917914 => \true, 917915 => \true, 917916 => \true, 917917 => \true, 917918 => \true, 917919 => \true, 917920 => \true, 917921 => \true, 917922 => \true, 917923 => \true, 917924 => \true, 917925 => \true, 917926 => \true, 917927 => \true, 917928 => \true, 917929 => \true, 917930 => \true, 917931 => \true, 917932 => \true, 917933 => \true, 917934 => \true, 917935 => \true, 917936 => \true, 917937 => \true, 917938 => \true, 917939 => \true, 917940 => \true, 917941 => \true, 917942 => \true, 917943 => \true, 917944 => \true, 917945 => \true, 917946 => \true, 917947 => \true, 917948 => \true, 917949 => \true, 917950 => \true, 917951 => \true, 917952 => \true, 917953 => \true, 917954 => \true, 917955 => \true, 917956 => \true, 917957 => \true, 917958 => \true, 917959 => \true, 917960 => \true, 917961 => \true, 917962 => \true, 917963 => \true, 917964 => \true, 917965 => \true, 917966 => \true, 917967 => \true, 917968 => \true, 917969 => \true, 917970 => \true, 917971 => \true, 917972 => \true, 917973 => \true, 917974 => \true, 917975 => \true, 917976 => \true, 917977 => \true, 917978 => \true, 917979 => \true, 917980 => \true, 917981 => \true, 917982 => \true, 917983 => \true, 917984 => \true, 917985 => \true, 917986 => \true, 917987 => \true, 917988 => \true, 917989 => \true, 917990 => \true, 917991 => \true, 917992 => \true, 917993 => \true, 917994 => \true, 917995 => \true, 917996 => \true, 917997 => \true, 917998 => \true, 917999 => \true); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php000064400000021025147600374260030025 0ustar00= 128 && $codePoint <= 159) { return \true; } if ($codePoint >= 2155 && $codePoint <= 2207) { return \true; } if ($codePoint >= 3676 && $codePoint <= 3712) { return \true; } if ($codePoint >= 3808 && $codePoint <= 3839) { return \true; } if ($codePoint >= 4059 && $codePoint <= 4095) { return \true; } if ($codePoint >= 4256 && $codePoint <= 4293) { return \true; } if ($codePoint >= 6849 && $codePoint <= 6911) { return \true; } if ($codePoint >= 11859 && $codePoint <= 11903) { return \true; } if ($codePoint >= 42955 && $codePoint <= 42996) { return \true; } if ($codePoint >= 55296 && $codePoint <= 57343) { return \true; } if ($codePoint >= 57344 && $codePoint <= 63743) { return \true; } if ($codePoint >= 64218 && $codePoint <= 64255) { return \true; } if ($codePoint >= 64976 && $codePoint <= 65007) { return \true; } if ($codePoint >= 65630 && $codePoint <= 65663) { return \true; } if ($codePoint >= 65953 && $codePoint <= 65999) { return \true; } if ($codePoint >= 66046 && $codePoint <= 66175) { return \true; } if ($codePoint >= 66518 && $codePoint <= 66559) { return \true; } if ($codePoint >= 66928 && $codePoint <= 67071) { return \true; } if ($codePoint >= 67432 && $codePoint <= 67583) { return \true; } if ($codePoint >= 67760 && $codePoint <= 67807) { return \true; } if ($codePoint >= 67904 && $codePoint <= 67967) { return \true; } if ($codePoint >= 68256 && $codePoint <= 68287) { return \true; } if ($codePoint >= 68528 && $codePoint <= 68607) { return \true; } if ($codePoint >= 68681 && $codePoint <= 68735) { return \true; } if ($codePoint >= 68922 && $codePoint <= 69215) { return \true; } if ($codePoint >= 69298 && $codePoint <= 69375) { return \true; } if ($codePoint >= 69466 && $codePoint <= 69551) { return \true; } if ($codePoint >= 70207 && $codePoint <= 70271) { return \true; } if ($codePoint >= 70517 && $codePoint <= 70655) { return \true; } if ($codePoint >= 70874 && $codePoint <= 71039) { return \true; } if ($codePoint >= 71134 && $codePoint <= 71167) { return \true; } if ($codePoint >= 71370 && $codePoint <= 71423) { return \true; } if ($codePoint >= 71488 && $codePoint <= 71679) { return \true; } if ($codePoint >= 71740 && $codePoint <= 71839) { return \true; } if ($codePoint >= 72026 && $codePoint <= 72095) { return \true; } if ($codePoint >= 72441 && $codePoint <= 72703) { return \true; } if ($codePoint >= 72887 && $codePoint <= 72959) { return \true; } if ($codePoint >= 73130 && $codePoint <= 73439) { return \true; } if ($codePoint >= 73465 && $codePoint <= 73647) { return \true; } if ($codePoint >= 74650 && $codePoint <= 74751) { return \true; } if ($codePoint >= 75076 && $codePoint <= 77823) { return \true; } if ($codePoint >= 78905 && $codePoint <= 82943) { return \true; } if ($codePoint >= 83527 && $codePoint <= 92159) { return \true; } if ($codePoint >= 92784 && $codePoint <= 92879) { return \true; } if ($codePoint >= 93072 && $codePoint <= 93759) { return \true; } if ($codePoint >= 93851 && $codePoint <= 93951) { return \true; } if ($codePoint >= 94112 && $codePoint <= 94175) { return \true; } if ($codePoint >= 101590 && $codePoint <= 101631) { return \true; } if ($codePoint >= 101641 && $codePoint <= 110591) { return \true; } if ($codePoint >= 110879 && $codePoint <= 110927) { return \true; } if ($codePoint >= 111356 && $codePoint <= 113663) { return \true; } if ($codePoint >= 113828 && $codePoint <= 118783) { return \true; } if ($codePoint >= 119366 && $codePoint <= 119519) { return \true; } if ($codePoint >= 119673 && $codePoint <= 119807) { return \true; } if ($codePoint >= 121520 && $codePoint <= 122879) { return \true; } if ($codePoint >= 122923 && $codePoint <= 123135) { return \true; } if ($codePoint >= 123216 && $codePoint <= 123583) { return \true; } if ($codePoint >= 123648 && $codePoint <= 124927) { return \true; } if ($codePoint >= 125143 && $codePoint <= 125183) { return \true; } if ($codePoint >= 125280 && $codePoint <= 126064) { return \true; } if ($codePoint >= 126133 && $codePoint <= 126208) { return \true; } if ($codePoint >= 126270 && $codePoint <= 126463) { return \true; } if ($codePoint >= 126652 && $codePoint <= 126703) { return \true; } if ($codePoint >= 126706 && $codePoint <= 126975) { return \true; } if ($codePoint >= 127406 && $codePoint <= 127461) { return \true; } if ($codePoint >= 127590 && $codePoint <= 127743) { return \true; } if ($codePoint >= 129202 && $codePoint <= 129279) { return \true; } if ($codePoint >= 129751 && $codePoint <= 129791) { return \true; } if ($codePoint >= 129995 && $codePoint <= 130031) { return \true; } if ($codePoint >= 130042 && $codePoint <= 131069) { return \true; } if ($codePoint >= 173790 && $codePoint <= 173823) { return \true; } if ($codePoint >= 191457 && $codePoint <= 194559) { return \true; } if ($codePoint >= 195102 && $codePoint <= 196605) { return \true; } if ($codePoint >= 201547 && $codePoint <= 262141) { return \true; } if ($codePoint >= 262144 && $codePoint <= 327677) { return \true; } if ($codePoint >= 327680 && $codePoint <= 393213) { return \true; } if ($codePoint >= 393216 && $codePoint <= 458749) { return \true; } if ($codePoint >= 458752 && $codePoint <= 524285) { return \true; } if ($codePoint >= 524288 && $codePoint <= 589821) { return \true; } if ($codePoint >= 589824 && $codePoint <= 655357) { return \true; } if ($codePoint >= 655360 && $codePoint <= 720893) { return \true; } if ($codePoint >= 720896 && $codePoint <= 786429) { return \true; } if ($codePoint >= 786432 && $codePoint <= 851965) { return \true; } if ($codePoint >= 851968 && $codePoint <= 917501) { return \true; } if ($codePoint >= 917536 && $codePoint <= 917631) { return \true; } if ($codePoint >= 917632 && $codePoint <= 917759) { return \true; } if ($codePoint >= 918000 && $codePoint <= 983037) { return \true; } if ($codePoint >= 983040 && $codePoint <= 1048573) { return \true; } if ($codePoint >= 1048576 && $codePoint <= 1114109) { return \true; } return \false; } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/deviation.php000064400000000144147600374260026557 0ustar00 'ss', 962 => 'σ', 8204 => '', 8205 => ''); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Resources/unidata/Regex.php000064400000332151147600374260025655 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn; /** * @internal */ class Info { public $bidiDomain = \false; public $errors = 0; public $validBidiDomain = \true; public $transitionalDifferent = \false; } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/Idn.php000064400000072057147600374260021724 0ustar00 and Trevor Rowbotham * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Idn; use Exception; use Normalizer; use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; use VendorDuplicator\Symfony\Polyfill\Intl\Idn\Resources\unidata\Regex; /** * @see https://www.unicode.org/reports/tr46/ * * @internal */ final class Idn { const ERROR_EMPTY_LABEL = 1; const ERROR_LABEL_TOO_LONG = 2; const ERROR_DOMAIN_NAME_TOO_LONG = 4; const ERROR_LEADING_HYPHEN = 8; const ERROR_TRAILING_HYPHEN = 0x10; const ERROR_HYPHEN_3_4 = 0x20; const ERROR_LEADING_COMBINING_MARK = 0x40; const ERROR_DISALLOWED = 0x80; const ERROR_PUNYCODE = 0x100; const ERROR_LABEL_HAS_DOT = 0x200; const ERROR_INVALID_ACE_LABEL = 0x400; const ERROR_BIDI = 0x800; const ERROR_CONTEXTJ = 0x1000; const ERROR_CONTEXTO_PUNCTUATION = 0x2000; const ERROR_CONTEXTO_DIGITS = 0x4000; const INTL_IDNA_VARIANT_2003 = 0; const INTL_IDNA_VARIANT_UTS46 = 1; const IDNA_DEFAULT = 0; const IDNA_ALLOW_UNASSIGNED = 1; const IDNA_USE_STD3_RULES = 2; const IDNA_CHECK_BIDI = 4; const IDNA_CHECK_CONTEXTJ = 8; const IDNA_NONTRANSITIONAL_TO_ASCII = 16; const IDNA_NONTRANSITIONAL_TO_UNICODE = 32; const MAX_DOMAIN_SIZE = 253; const MAX_LABEL_SIZE = 63; const BASE = 36; const TMIN = 1; const TMAX = 26; const SKEW = 38; const DAMP = 700; const INITIAL_BIAS = 72; const INITIAL_N = 128; const DELIMITER = '-'; const MAX_INT = 2147483647; /** * Contains the numeric value of a basic code point (for use in representing integers) in the * range 0 to BASE-1, or -1 if b is does not represent a value. * * @var array */ private static $basicToDigit = array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); /** * @var array */ private static $virama; /** * @var array */ private static $mapped; /** * @var array */ private static $ignored; /** * @var array */ private static $deviation; /** * @var array */ private static $disallowed; /** * @var array */ private static $disallowed_STD3_mapped; /** * @var array */ private static $disallowed_STD3_valid; /** * @var bool */ private static $mappingTableLoaded = \false; /** * @see https://www.unicode.org/reports/tr46/#ToASCII * * @param string $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_ascii($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_ascii(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $options = array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_ASCII), 'VerifyDnsLength' => \true); $info = new Info(); $labels = self::process((string) $domainName, $options, $info); foreach ($labels as $i => $label) { // Only convert labels to punycode that contain non-ASCII code points if (1 === \preg_match('/[^\\x00-\\x7F]/', $label)) { try { $label = 'xn--' . self::punycodeEncode($label); } catch (Exception $e) { $info->errors |= self::ERROR_PUNYCODE; } $labels[$i] = $label; } } if ($options['VerifyDnsLength']) { self::validateDomainAndLabelLength($labels, $info); } $idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors); return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @see https://www.unicode.org/reports/tr46/#ToUnicode * * @param string $domainName * @param int $options * @param int $variant * @param array $idna_info * * @return string|false */ public static function idn_to_utf8($domainName, $options = self::IDNA_DEFAULT, $variant = self::INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { if (\PHP_VERSION_ID >= 70200 && self::INTL_IDNA_VARIANT_2003 === $variant) { @\trigger_error('idn_to_utf8(): INTL_IDNA_VARIANT_2003 is deprecated', \E_USER_DEPRECATED); } $info = new Info(); $labels = self::process((string) $domainName, array('CheckHyphens' => \true, 'CheckBidi' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 !== ($options & self::IDNA_CHECK_BIDI), 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & self::IDNA_CHECK_CONTEXTJ), 'UseSTD3ASCIIRules' => 0 !== ($options & self::IDNA_USE_STD3_RULES), 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & self::IDNA_NONTRANSITIONAL_TO_UNICODE)), $info); $idna_info = array('result' => \implode('.', $labels), 'isTransitionalDifferent' => $info->transitionalDifferent, 'errors' => $info->errors); return 0 === $info->errors ? $idna_info['result'] : \false; } /** * @param string $label * * @return bool */ private static function isValidContextJ(array $codePoints, $label) { if (!isset(self::$virama)) { self::$virama = (require __DIR__ . \DIRECTORY_SEPARATOR . 'Resources' . \DIRECTORY_SEPARATOR . 'unidata' . \DIRECTORY_SEPARATOR . 'virama.php'); } $offset = 0; foreach ($codePoints as $i => $codePoint) { if (0x200c !== $codePoint && 0x200d !== $codePoint) { continue; } if (!isset($codePoints[$i - 1])) { return \false; } // If Canonical_Combining_Class(Before(cp)) .eq. Virama Then True; if (isset(self::$virama[$codePoints[$i - 1]])) { continue; } // If RegExpMatch((Joining_Type:{L,D})(Joining_Type:T)*\u200C(Joining_Type:T)*(Joining_Type:{R,D})) Then // True; // Generated RegExp = ([Joining_Type:{L,D}][Joining_Type:T]*\u200C[Joining_Type:T]*)[Joining_Type:{R,D}] if (0x200c === $codePoint && 1 === \preg_match(Regex::ZWNJ, $label, $matches, \PREG_OFFSET_CAPTURE, $offset)) { $offset += \strlen($matches[1][0]); continue; } return \false; } return \true; } /** * @see https://www.unicode.org/reports/tr46/#ProcessingStepMap * * @param string $input * @param array $options * * @return string */ private static function mapCodePoints($input, array $options, Info $info) { $str = ''; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; $transitional = $options['Transitional_Processing']; foreach (self::utf8Decode($input) as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); switch ($data['status']) { case 'disallowed': $info->errors |= self::ERROR_DISALLOWED; // no break. case 'valid': $str .= \mb_chr($codePoint, 'utf-8'); break; case 'ignored': // Do nothing. break; case 'mapped': $str .= $data['mapping']; break; case 'deviation': $info->transitionalDifferent = \true; $str .= $transitional ? $data['mapping'] : \mb_chr($codePoint, 'utf-8'); break; } } return $str; } /** * @see https://www.unicode.org/reports/tr46/#Processing * * @param string $domain * @param array $options * * @return array */ private static function process($domain, array $options, Info $info) { // If VerifyDnsLength is not set, we are doing ToUnicode otherwise we are doing ToASCII and // we need to respect the VerifyDnsLength option. $checkForEmptyLabels = !isset($options['VerifyDnsLength']) || $options['VerifyDnsLength']; if ($checkForEmptyLabels && '' === $domain) { $info->errors |= self::ERROR_EMPTY_LABEL; return array($domain); } // Step 1. Map each code point in the domain name string $domain = self::mapCodePoints($domain, $options, $info); // Step 2. Normalize the domain name string to Unicode Normalization Form C. if (!Normalizer::isNormalized($domain, Normalizer::FORM_C)) { $domain = Normalizer::normalize($domain, Normalizer::FORM_C); } // Step 3. Break the string into labels at U+002E (.) FULL STOP. $labels = \explode('.', $domain); $lastLabelIndex = \count($labels) - 1; // Step 4. Convert and validate each label in the domain name string. foreach ($labels as $i => $label) { $validationOptions = $options; if ('xn--' === \substr($label, 0, 4)) { try { $label = self::punycodeDecode(\substr($label, 4)); } catch (Exception $e) { $info->errors |= self::ERROR_PUNYCODE; continue; } $validationOptions['Transitional_Processing'] = \false; $labels[$i] = $label; } self::validateLabel($label, $info, $validationOptions, $i > 0 && $i === $lastLabelIndex); } if ($info->bidiDomain && !$info->validBidiDomain) { $info->errors |= self::ERROR_BIDI; } // Any input domain name string that does not record an error has been successfully // processed according to this specification. Conversely, if an input domain_name string // causes an error, then the processing of the input domain_name string fails. Determining // what to do with error input is up to the caller, and not in the scope of this document. return $labels; } /** * @see https://tools.ietf.org/html/rfc5893#section-2 * * @param string $label */ private static function validateBidiLabel($label, Info $info) { if (1 === \preg_match(Regex::RTL_LABEL, $label)) { $info->bidiDomain = \true; // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the R or AL property, it is an RTL label if (1 !== \preg_match(Regex::BIDI_STEP_1_RTL, $label)) { $info->validBidiDomain = \false; return; } // Step 2. In an RTL label, only characters with the Bidi properties R, AL, AN, EN, ES, // CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_2, $label)) { $info->validBidiDomain = \false; return; } // Step 3. In an RTL label, the end of the label must be a character with Bidi property // R, AL, EN, or AN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_3, $label)) { $info->validBidiDomain = \false; return; } // Step 4. In an RTL label, if an EN is present, no AN may be present, and vice versa. if (1 === \preg_match(Regex::BIDI_STEP_4_AN, $label) && 1 === \preg_match(Regex::BIDI_STEP_4_EN, $label)) { $info->validBidiDomain = \false; return; } return; } // We are a LTR label // Step 1. The first character must be a character with Bidi property L, R, or AL. // If it has the L property, it is an LTR label. if (1 !== \preg_match(Regex::BIDI_STEP_1_LTR, $label)) { $info->validBidiDomain = \false; return; } // Step 5. In an LTR label, only characters with the Bidi properties L, EN, // ES, CS, ET, ON, BN, or NSM are allowed. if (1 === \preg_match(Regex::BIDI_STEP_5, $label)) { $info->validBidiDomain = \false; return; } // Step 6.In an LTR label, the end of the label must be a character with Bidi property L or // EN, followed by zero or more characters with Bidi property NSM. if (1 !== \preg_match(Regex::BIDI_STEP_6, $label)) { $info->validBidiDomain = \false; return; } } /** * @param array $labels */ private static function validateDomainAndLabelLength(array $labels, Info $info) { $maxDomainSize = self::MAX_DOMAIN_SIZE; $length = \count($labels); // Number of "." delimiters. $domainLength = $length - 1; // If the last label is empty and it is not the first label, then it is the root label. // Increase the max size by 1, making it 254, to account for the root label's "." // delimiter. This also means we don't need to check the last label's length for being too // long. if ($length > 1 && '' === $labels[$length - 1]) { ++$maxDomainSize; --$length; } for ($i = 0; $i < $length; ++$i) { $bytes = \strlen($labels[$i]); $domainLength += $bytes; if ($bytes > self::MAX_LABEL_SIZE) { $info->errors |= self::ERROR_LABEL_TOO_LONG; } } if ($domainLength > $maxDomainSize) { $info->errors |= self::ERROR_DOMAIN_NAME_TOO_LONG; } } /** * @see https://www.unicode.org/reports/tr46/#Validity_Criteria * * @param string $label * @param array $options * @param bool $canBeEmpty */ private static function validateLabel($label, Info $info, array $options, $canBeEmpty) { if ('' === $label) { if (!$canBeEmpty && (!isset($options['VerifyDnsLength']) || $options['VerifyDnsLength'])) { $info->errors |= self::ERROR_EMPTY_LABEL; } return; } // Step 1. The label must be in Unicode Normalization Form C. if (!Normalizer::isNormalized($label, Normalizer::FORM_C)) { $info->errors |= self::ERROR_INVALID_ACE_LABEL; } $codePoints = self::utf8Decode($label); if ($options['CheckHyphens']) { // Step 2. If CheckHyphens, the label must not contain a U+002D HYPHEN-MINUS character // in both the thrid and fourth positions. if (isset($codePoints[2], $codePoints[3]) && 0x2d === $codePoints[2] && 0x2d === $codePoints[3]) { $info->errors |= self::ERROR_HYPHEN_3_4; } // Step 3. If CheckHyphens, the label must neither begin nor end with a U+002D // HYPHEN-MINUS character. if ('-' === \substr($label, 0, 1)) { $info->errors |= self::ERROR_LEADING_HYPHEN; } if ('-' === \substr($label, -1, 1)) { $info->errors |= self::ERROR_TRAILING_HYPHEN; } } // Step 4. The label must not contain a U+002E (.) FULL STOP. if (\false !== \strpos($label, '.')) { $info->errors |= self::ERROR_LABEL_HAS_DOT; } // Step 5. The label must not begin with a combining mark, that is: General_Category=Mark. if (1 === \preg_match(Regex::COMBINING_MARK, $label)) { $info->errors |= self::ERROR_LEADING_COMBINING_MARK; } // Step 6. Each code point in the label must only have certain status values according to // Section 5, IDNA Mapping Table: $transitional = $options['Transitional_Processing']; $useSTD3ASCIIRules = $options['UseSTD3ASCIIRules']; foreach ($codePoints as $codePoint) { $data = self::lookupCodePointStatus($codePoint, $useSTD3ASCIIRules); $status = $data['status']; if ('valid' === $status || !$transitional && 'deviation' === $status) { continue; } $info->errors |= self::ERROR_DISALLOWED; break; } // Step 7. If CheckJoiners, the label must satisify the ContextJ rules from Appendix A, in // The Unicode Code Points and Internationalized Domain Names for Applications (IDNA) // [IDNA2008]. if ($options['CheckJoiners'] && !self::isValidContextJ($codePoints, $label)) { $info->errors |= self::ERROR_CONTEXTJ; } // Step 8. If CheckBidi, and if the domain name is a Bidi domain name, then the label must // satisfy all six of the numbered conditions in [IDNA2008] RFC 5893, Section 2. if ($options['CheckBidi'] && (!$info->bidiDomain || $info->validBidiDomain)) { self::validateBidiLabel($label, $info); } } /** * @see https://tools.ietf.org/html/rfc3492#section-6.2 * * @param string $input * * @return string */ private static function punycodeDecode($input) { $n = self::INITIAL_N; $out = 0; $i = 0; $bias = self::INITIAL_BIAS; $lastDelimIndex = \strrpos($input, self::DELIMITER); $b = \false === $lastDelimIndex ? 0 : $lastDelimIndex; $inputLength = \strlen($input); $output = array(); $bytes = \array_map('ord', \str_split($input)); for ($j = 0; $j < $b; ++$j) { if ($bytes[$j] > 0x7f) { throw new Exception('Invalid input'); } $output[$out++] = $input[$j]; } if ($b > 0) { ++$b; } for ($in = $b; $in < $inputLength; ++$out) { $oldi = $i; $w = 1; for ($k = self::BASE;; $k += self::BASE) { if ($in >= $inputLength) { throw new Exception('Invalid input'); } $digit = self::$basicToDigit[$bytes[$in++] & 0xff]; if ($digit < 0) { throw new Exception('Invalid input'); } if ($digit > \intdiv(self::MAX_INT - $i, $w)) { throw new Exception('Integer overflow'); } $i += $digit * $w; if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($digit < $t) { break; } $baseMinusT = self::BASE - $t; if ($w > \intdiv(self::MAX_INT, $baseMinusT)) { throw new Exception('Integer overflow'); } $w *= $baseMinusT; } $outPlusOne = $out + 1; $bias = self::adaptBias($i - $oldi, $outPlusOne, 0 === $oldi); if (\intdiv($i, $outPlusOne) > self::MAX_INT - $n) { throw new Exception('Integer overflow'); } $n += \intdiv($i, $outPlusOne); $i %= $outPlusOne; \array_splice($output, $i++, 0, array(\mb_chr($n, 'utf-8'))); } return \implode('', $output); } /** * @see https://tools.ietf.org/html/rfc3492#section-6.3 * * @param string $input * * @return string */ private static function punycodeEncode($input) { $n = self::INITIAL_N; $delta = 0; $out = 0; $bias = self::INITIAL_BIAS; $inputLength = 0; $output = ''; $iter = self::utf8Decode($input); foreach ($iter as $codePoint) { ++$inputLength; if ($codePoint < 0x80) { $output .= \chr($codePoint); ++$out; } } $h = $out; $b = $out; if ($b > 0) { $output .= self::DELIMITER; ++$out; } while ($h < $inputLength) { $m = self::MAX_INT; foreach ($iter as $codePoint) { if ($codePoint >= $n && $codePoint < $m) { $m = $codePoint; } } if ($m - $n > \intdiv(self::MAX_INT - $delta, $h + 1)) { throw new Exception('Integer overflow'); } $delta += ($m - $n) * ($h + 1); $n = $m; foreach ($iter as $codePoint) { if ($codePoint < $n && 0 === ++$delta) { throw new Exception('Integer overflow'); } elseif ($codePoint === $n) { $q = $delta; for ($k = self::BASE;; $k += self::BASE) { if ($k <= $bias) { $t = self::TMIN; } elseif ($k >= $bias + self::TMAX) { $t = self::TMAX; } else { $t = $k - $bias; } if ($q < $t) { break; } $qMinusT = $q - $t; $baseMinusT = self::BASE - $t; $output .= self::encodeDigit($t + $qMinusT % $baseMinusT, \false); ++$out; $q = \intdiv($qMinusT, $baseMinusT); } $output .= self::encodeDigit($q, \false); ++$out; $bias = self::adaptBias($delta, $h + 1, $h === $b); $delta = 0; ++$h; } } ++$delta; ++$n; } return $output; } /** * @see https://tools.ietf.org/html/rfc3492#section-6.1 * * @param int $delta * @param int $numPoints * @param bool $firstTime * * @return int */ private static function adaptBias($delta, $numPoints, $firstTime) { // xxx >> 1 is a faster way of doing intdiv(xxx, 2) $delta = $firstTime ? \intdiv($delta, self::DAMP) : $delta >> 1; $delta += \intdiv($delta, $numPoints); $k = 0; while ($delta > (self::BASE - self::TMIN) * self::TMAX >> 1) { $delta = \intdiv($delta, self::BASE - self::TMIN); $k += self::BASE; } return $k + \intdiv((self::BASE - self::TMIN + 1) * $delta, $delta + self::SKEW); } /** * @param int $d * @param bool $flag * * @return string */ private static function encodeDigit($d, $flag) { return \chr($d + 22 + 75 * ($d < 26 ? 1 : 0) - (($flag ? 1 : 0) << 5)); } /** * Takes a UTF-8 encoded string and converts it into a series of integer code points. Any * invalid byte sequences will be replaced by a U+FFFD replacement code point. * * @see https://encoding.spec.whatwg.org/#utf-8-decoder * * @param string $input * * @return array */ private static function utf8Decode($input) { $bytesSeen = 0; $bytesNeeded = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = 0; $codePoints = array(); $length = \strlen($input); for ($i = 0; $i < $length; ++$i) { $byte = \ord($input[$i]); if (0 === $bytesNeeded) { if ($byte >= 0x0 && $byte <= 0x7f) { $codePoints[] = $byte; continue; } if ($byte >= 0xc2 && $byte <= 0xdf) { $bytesNeeded = 1; $codePoint = $byte & 0x1f; } elseif ($byte >= 0xe0 && $byte <= 0xef) { if (0xe0 === $byte) { $lowerBoundary = 0xa0; } elseif (0xed === $byte) { $upperBoundary = 0x9f; } $bytesNeeded = 2; $codePoint = $byte & 0xf; } elseif ($byte >= 0xf0 && $byte <= 0xf4) { if (0xf0 === $byte) { $lowerBoundary = 0x90; } elseif (0xf4 === $byte) { $upperBoundary = 0x8f; } $bytesNeeded = 3; $codePoint = $byte & 0x7; } else { $codePoints[] = 0xfffd; } continue; } if ($byte < $lowerBoundary || $byte > $upperBoundary) { $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; $lowerBoundary = 0x80; $upperBoundary = 0xbf; --$i; $codePoints[] = 0xfffd; continue; } $lowerBoundary = 0x80; $upperBoundary = 0xbf; $codePoint = $codePoint << 6 | $byte & 0x3f; if (++$bytesSeen !== $bytesNeeded) { continue; } $codePoints[] = $codePoint; $codePoint = 0; $bytesNeeded = 0; $bytesSeen = 0; } // String unexpectedly ended, so append a U+FFFD code point. if (0 !== $bytesNeeded) { $codePoints[] = 0xfffd; } return $codePoints; } /** * @param int $codePoint * @param bool $useSTD3ASCIIRules * * @return array{status: string, mapping?: string} */ private static function lookupCodePointStatus($codePoint, $useSTD3ASCIIRules) { if (!self::$mappingTableLoaded) { self::$mappingTableLoaded = \true; self::$mapped = (require __DIR__ . '/Resources/unidata/mapped.php'); self::$ignored = (require __DIR__ . '/Resources/unidata/ignored.php'); self::$deviation = (require __DIR__ . '/Resources/unidata/deviation.php'); self::$disallowed = (require __DIR__ . '/Resources/unidata/disallowed.php'); self::$disallowed_STD3_mapped = (require __DIR__ . '/Resources/unidata/disallowed_STD3_mapped.php'); self::$disallowed_STD3_valid = (require __DIR__ . '/Resources/unidata/disallowed_STD3_valid.php'); } if (isset(self::$mapped[$codePoint])) { return array('status' => 'mapped', 'mapping' => self::$mapped[$codePoint]); } if (isset(self::$ignored[$codePoint])) { return array('status' => 'ignored'); } if (isset(self::$deviation[$codePoint])) { return array('status' => 'deviation', 'mapping' => self::$deviation[$codePoint]); } if (isset(self::$disallowed[$codePoint]) || DisallowedRanges::inRange($codePoint)) { return array('status' => 'disallowed'); } $isDisallowedMapped = isset(self::$disallowed_STD3_mapped[$codePoint]); if ($isDisallowedMapped || isset(self::$disallowed_STD3_valid[$codePoint])) { $status = 'disallowed'; if (!$useSTD3ASCIIRules) { $status = $isDisallowedMapped ? 'mapped' : 'valid'; } if ($isDisallowedMapped) { return array('status' => $status, 'mapping' => self::$disallowed_STD3_mapped[$codePoint]); } return array('status' => $status); } return array('status' => 'valid'); } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-idn/bootstrap.php000064400000011362147600374260023217 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Intl\Idn as p; if (\extension_loaded('intl')) { return; } if (!\defined('U_IDNA_PROHIBITED_ERROR')) { \define('U_IDNA_PROHIBITED_ERROR', 66560); } if (!\defined('U_IDNA_ERROR_START')) { \define('U_IDNA_ERROR_START', 66560); } if (!\defined('U_IDNA_UNASSIGNED_ERROR')) { \define('U_IDNA_UNASSIGNED_ERROR', 66561); } if (!\defined('U_IDNA_CHECK_BIDI_ERROR')) { \define('U_IDNA_CHECK_BIDI_ERROR', 66562); } if (!\defined('U_IDNA_STD3_ASCII_RULES_ERROR')) { \define('U_IDNA_STD3_ASCII_RULES_ERROR', 66563); } if (!\defined('U_IDNA_ACE_PREFIX_ERROR')) { \define('U_IDNA_ACE_PREFIX_ERROR', 66564); } if (!\defined('U_IDNA_VERIFICATION_ERROR')) { \define('U_IDNA_VERIFICATION_ERROR', 66565); } if (!\defined('U_IDNA_LABEL_TOO_LONG_ERROR')) { \define('U_IDNA_LABEL_TOO_LONG_ERROR', 66566); } if (!\defined('U_IDNA_ZERO_LENGTH_LABEL_ERROR')) { \define('U_IDNA_ZERO_LENGTH_LABEL_ERROR', 66567); } if (!\defined('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR')) { \define('U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR', 66568); } if (!\defined('U_IDNA_ERROR_LIMIT')) { \define('U_IDNA_ERROR_LIMIT', 66569); } if (!\defined('U_STRINGPREP_PROHIBITED_ERROR')) { \define('U_STRINGPREP_PROHIBITED_ERROR', 66560); } if (!\defined('U_STRINGPREP_UNASSIGNED_ERROR')) { \define('U_STRINGPREP_UNASSIGNED_ERROR', 66561); } if (!\defined('U_STRINGPREP_CHECK_BIDI_ERROR')) { \define('U_STRINGPREP_CHECK_BIDI_ERROR', 66562); } if (!\defined('IDNA_DEFAULT')) { \define('IDNA_DEFAULT', 0); } if (!\defined('IDNA_ALLOW_UNASSIGNED')) { \define('IDNA_ALLOW_UNASSIGNED', 1); } if (!\defined('IDNA_USE_STD3_RULES')) { \define('IDNA_USE_STD3_RULES', 2); } if (!\defined('IDNA_CHECK_BIDI')) { \define('IDNA_CHECK_BIDI', 4); } if (!\defined('IDNA_CHECK_CONTEXTJ')) { \define('IDNA_CHECK_CONTEXTJ', 8); } if (!\defined('IDNA_NONTRANSITIONAL_TO_ASCII')) { \define('IDNA_NONTRANSITIONAL_TO_ASCII', 16); } if (!\defined('IDNA_NONTRANSITIONAL_TO_UNICODE')) { \define('IDNA_NONTRANSITIONAL_TO_UNICODE', 32); } if (!\defined('INTL_IDNA_VARIANT_2003')) { \define('INTL_IDNA_VARIANT_2003', 0); } if (!\defined('INTL_IDNA_VARIANT_UTS46')) { \define('INTL_IDNA_VARIANT_UTS46', 1); } if (!\defined('IDNA_ERROR_EMPTY_LABEL')) { \define('IDNA_ERROR_EMPTY_LABEL', 1); } if (!\defined('IDNA_ERROR_LABEL_TOO_LONG')) { \define('IDNA_ERROR_LABEL_TOO_LONG', 2); } if (!\defined('IDNA_ERROR_DOMAIN_NAME_TOO_LONG')) { \define('IDNA_ERROR_DOMAIN_NAME_TOO_LONG', 4); } if (!\defined('IDNA_ERROR_LEADING_HYPHEN')) { \define('IDNA_ERROR_LEADING_HYPHEN', 8); } if (!\defined('IDNA_ERROR_TRAILING_HYPHEN')) { \define('IDNA_ERROR_TRAILING_HYPHEN', 16); } if (!\defined('IDNA_ERROR_HYPHEN_3_4')) { \define('IDNA_ERROR_HYPHEN_3_4', 32); } if (!\defined('IDNA_ERROR_LEADING_COMBINING_MARK')) { \define('IDNA_ERROR_LEADING_COMBINING_MARK', 64); } if (!\defined('IDNA_ERROR_DISALLOWED')) { \define('IDNA_ERROR_DISALLOWED', 128); } if (!\defined('IDNA_ERROR_PUNYCODE')) { \define('IDNA_ERROR_PUNYCODE', 256); } if (!\defined('IDNA_ERROR_LABEL_HAS_DOT')) { \define('IDNA_ERROR_LABEL_HAS_DOT', 512); } if (!\defined('IDNA_ERROR_INVALID_ACE_LABEL')) { \define('IDNA_ERROR_INVALID_ACE_LABEL', 1024); } if (!\defined('IDNA_ERROR_BIDI')) { \define('IDNA_ERROR_BIDI', 2048); } if (!\defined('IDNA_ERROR_CONTEXTJ')) { \define('IDNA_ERROR_CONTEXTJ', 4096); } if (\PHP_VERSION_ID < 70400) { if (!\function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!\function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_2003, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } else { if (!\function_exists('idn_to_ascii')) { function idn_to_ascii($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_ascii($domain, $options, $variant, $idna_info); } } if (!\function_exists('idn_to_utf8')) { function idn_to_utf8($domain, $options = \IDNA_DEFAULT, $variant = \INTL_IDNA_VARIANT_UTS46, &$idna_info = array()) { return p\Idn::idn_to_utf8($domain, $options, $variant, $idna_info); } } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php000064400000000662147600374260030047 0ustar00 ' ', '¨' => ' ̈', 'ª' => 'a', '¯' => ' Ì„', '²' => '2', '³' => '3', '´' => ' Ì', 'µ' => 'μ', '¸' => ' ̧', '¹' => '1', 'º' => 'o', '¼' => '1â„4', '½' => '1â„2', '¾' => '3â„4', 'IJ' => 'IJ', 'ij' => 'ij', 'Ä¿' => 'L·', 'Å€' => 'l·', 'ʼn' => 'ʼn', 'Å¿' => 's', 'Ç„' => 'DZÌŒ', 'Ç…' => 'DzÌŒ', 'dž' => 'dzÌŒ', 'LJ' => 'LJ', 'Lj' => 'Lj', 'lj' => 'lj', 'ÇŠ' => 'NJ', 'Ç‹' => 'Nj', 'ÇŒ' => 'nj', 'DZ' => 'DZ', 'Dz' => 'Dz', 'dz' => 'dz', 'Ê°' => 'h', 'ʱ' => 'ɦ', 'ʲ' => 'j', 'ʳ' => 'r', 'Ê´' => 'ɹ', 'ʵ' => 'É»', 'ʶ' => 'Ê', 'Ê·' => 'w', 'ʸ' => 'y', '˘' => ' ̆', 'Ë™' => ' ̇', 'Ëš' => ' ÌŠ', 'Ë›' => ' ̨', 'Ëœ' => ' ̃', 'Ë' => ' Ì‹', 'Ë ' => 'É£', 'Ë¡' => 'l', 'Ë¢' => 's', 'Ë£' => 'x', 'ˤ' => 'Ê•', 'ͺ' => ' Í…', '΄' => ' Ì', 'Î…' => ' ̈Ì', 'Ï' => 'β', 'Ï‘' => 'θ', 'Ï’' => 'Î¥', 'Ï“' => 'Î¥Ì', 'Ï”' => 'Ϋ', 'Ï•' => 'φ', 'Ï–' => 'Ï€', 'Ï°' => 'κ', 'ϱ' => 'Ï', 'ϲ' => 'Ï‚', 'Ï´' => 'Θ', 'ϵ' => 'ε', 'Ϲ' => 'Σ', 'Ö‡' => 'Õ¥Ö‚', 'Ùµ' => 'اٴ', 'Ù¶' => 'وٴ', 'Ù·' => 'Û‡Ù´', 'Ù¸' => 'يٴ', 'ำ' => 'à¹à¸²', 'ຳ' => 'à»àº²', 'ໜ' => 'ຫນ', 'à»' => 'ຫມ', '༌' => '་', 'ཷ' => 'ྲཱྀ', 'ཹ' => 'ླཱྀ', 'ჼ' => 'ნ', 'á´¬' => 'A', 'á´­' => 'Æ', 'á´®' => 'B', 'á´°' => 'D', 'á´±' => 'E', 'á´²' => 'ÆŽ', 'á´³' => 'G', 'á´´' => 'H', 'á´µ' => 'I', 'á´¶' => 'J', 'á´·' => 'K', 'á´¸' => 'L', 'á´¹' => 'M', 'á´º' => 'N', 'á´¼' => 'O', 'á´½' => 'È¢', 'á´¾' => 'P', 'á´¿' => 'R', 'áµ€' => 'T', 'áµ' => 'U', 'ᵂ' => 'W', 'ᵃ' => 'a', 'ᵄ' => 'É', 'áµ…' => 'É‘', 'ᵆ' => 'á´‚', 'ᵇ' => 'b', 'ᵈ' => 'd', 'ᵉ' => 'e', 'ᵊ' => 'É™', 'ᵋ' => 'É›', 'ᵌ' => 'Éœ', 'áµ' => 'g', 'áµ' => 'k', 'áµ' => 'm', 'ᵑ' => 'Å‹', 'áµ’' => 'o', 'ᵓ' => 'É”', 'áµ”' => 'á´–', 'ᵕ' => 'á´—', 'áµ–' => 'p', 'áµ—' => 't', 'ᵘ' => 'u', 'áµ™' => 'á´', 'ᵚ' => 'ɯ', 'áµ›' => 'v', 'ᵜ' => 'á´¥', 'áµ' => 'β', 'ᵞ' => 'γ', 'ᵟ' => 'δ', 'áµ ' => 'φ', 'ᵡ' => 'χ', 'áµ¢' => 'i', 'áµ£' => 'r', 'ᵤ' => 'u', 'áµ¥' => 'v', 'ᵦ' => 'β', 'ᵧ' => 'γ', 'ᵨ' => 'Ï', 'ᵩ' => 'φ', 'ᵪ' => 'χ', 'ᵸ' => 'н', 'ᶛ' => 'É’', 'ᶜ' => 'c', 'á¶' => 'É•', 'ᶞ' => 'ð', 'ᶟ' => 'Éœ', 'ᶠ' => 'f', 'ᶡ' => 'ÉŸ', 'ᶢ' => 'É¡', 'ᶣ' => 'É¥', 'ᶤ' => 'ɨ', 'ᶥ' => 'É©', 'ᶦ' => 'ɪ', 'ᶧ' => 'áµ»', 'ᶨ' => 'Ê', 'ᶩ' => 'É­', 'ᶪ' => 'ᶅ', 'ᶫ' => 'ÊŸ', 'ᶬ' => 'ɱ', 'ᶭ' => 'É°', 'ᶮ' => 'ɲ', 'ᶯ' => 'ɳ', 'ᶰ' => 'É´', 'ᶱ' => 'ɵ', 'ᶲ' => 'ɸ', 'ᶳ' => 'Ê‚', 'ᶴ' => 'ʃ', 'ᶵ' => 'Æ«', 'ᶶ' => 'ʉ', 'ᶷ' => 'ÊŠ', 'ᶸ' => 'á´œ', 'ᶹ' => 'Ê‹', 'ᶺ' => 'ÊŒ', 'ᶻ' => 'z', 'ᶼ' => 'Ê', 'ᶽ' => 'Ê‘', 'ᶾ' => 'Ê’', 'ᶿ' => 'θ', 'ẚ' => 'aʾ', 'ẛ' => 'ṡ', 'á¾½' => ' Ì“', '᾿' => ' Ì“', 'á¿€' => ' Í‚', 'á¿' => ' ̈͂', 'á¿' => ' Ì“Ì€', 'á¿Ž' => ' Ì“Ì', 'á¿' => ' Ì“Í‚', 'á¿' => ' ̔̀', 'á¿ž' => ' Ì”Ì', 'á¿Ÿ' => ' ̔͂', 'á¿­' => ' ̈̀', 'á¿®' => ' ̈Ì', '´' => ' Ì', '῾' => ' Ì”', ' ' => ' ', 'â€' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', ' ' => ' ', '‑' => 'â€', '‗' => ' ̳', '․' => '.', '‥' => '..', '…' => '...', ' ' => ' ', '″' => '′′', '‴' => '′′′', '‶' => '‵‵', '‷' => '‵‵‵', '‼' => '!!', '‾' => ' Ì…', 'â‡' => '??', 'âˆ' => '?!', 'â‰' => '!?', 'â—' => '′′′′', 'âŸ' => ' ', 'â°' => '0', 'â±' => 'i', 'â´' => '4', 'âµ' => '5', 'â¶' => '6', 'â·' => '7', 'â¸' => '8', 'â¹' => '9', 'âº' => '+', 'â»' => '−', 'â¼' => '=', 'â½' => '(', 'â¾' => ')', 'â¿' => 'n', 'â‚€' => '0', 'â‚' => '1', 'â‚‚' => '2', '₃' => '3', 'â‚„' => '4', 'â‚…' => '5', '₆' => '6', '₇' => '7', '₈' => '8', '₉' => '9', 'â‚Š' => '+', 'â‚‹' => '−', 'â‚Œ' => '=', 'â‚' => '(', 'â‚Ž' => ')', 'â‚' => 'a', 'â‚‘' => 'e', 'â‚’' => 'o', 'â‚“' => 'x', 'â‚”' => 'É™', 'â‚•' => 'h', 'â‚–' => 'k', 'â‚—' => 'l', 'ₘ' => 'm', 'â‚™' => 'n', 'â‚š' => 'p', 'â‚›' => 's', 'â‚œ' => 't', '₨' => 'Rs', 'â„€' => 'a/c', 'â„' => 'a/s', 'â„‚' => 'C', '℃' => '°C', 'â„…' => 'c/o', '℆' => 'c/u', 'ℇ' => 'Æ', '℉' => '°F', 'â„Š' => 'g', 'â„‹' => 'H', 'â„Œ' => 'H', 'â„' => 'H', 'â„Ž' => 'h', 'â„' => 'ħ', 'â„' => 'I', 'â„‘' => 'I', 'â„’' => 'L', 'â„“' => 'l', 'â„•' => 'N', 'â„–' => 'No', 'â„™' => 'P', 'â„š' => 'Q', 'â„›' => 'R', 'â„œ' => 'R', 'â„' => 'R', 'â„ ' => 'SM', 'â„¡' => 'TEL', 'â„¢' => 'TM', 'ℤ' => 'Z', 'ℨ' => 'Z', 'ℬ' => 'B', 'â„­' => 'C', 'ℯ' => 'e', 'â„°' => 'E', 'ℱ' => 'F', 'ℳ' => 'M', 'â„´' => 'o', 'ℵ' => '×', 'ℶ' => 'ב', 'â„·' => '×’', 'ℸ' => 'ד', 'ℹ' => 'i', 'â„»' => 'FAX', 'ℼ' => 'Ï€', 'ℽ' => 'γ', 'ℾ' => 'Γ', 'â„¿' => 'Π', 'â…€' => '∑', 'â……' => 'D', 'â…†' => 'd', 'â…‡' => 'e', 'â…ˆ' => 'i', 'â…‰' => 'j', 'â…' => '1â„7', 'â…‘' => '1â„9', 'â…’' => '1â„10', 'â…“' => '1â„3', 'â…”' => '2â„3', 'â…•' => '1â„5', 'â…–' => '2â„5', 'â…—' => '3â„5', 'â…˜' => '4â„5', 'â…™' => '1â„6', 'â…š' => '5â„6', 'â…›' => '1â„8', 'â…œ' => '3â„8', 'â…' => '5â„8', 'â…ž' => '7â„8', 'â…Ÿ' => '1â„', 'â… ' => 'I', 'â…¡' => 'II', 'â…¢' => 'III', 'â…£' => 'IV', 'â…¤' => 'V', 'â…¥' => 'VI', 'â…¦' => 'VII', 'â…§' => 'VIII', 'â…¨' => 'IX', 'â…©' => 'X', 'â…ª' => 'XI', 'â…«' => 'XII', 'â…¬' => 'L', 'â…­' => 'C', 'â…®' => 'D', 'â…¯' => 'M', 'â…°' => 'i', 'â…±' => 'ii', 'â…²' => 'iii', 'â…³' => 'iv', 'â…´' => 'v', 'â…µ' => 'vi', 'â…¶' => 'vii', 'â…·' => 'viii', 'â…¸' => 'ix', 'â…¹' => 'x', 'â…º' => 'xi', 'â…»' => 'xii', 'â…¼' => 'l', 'â…½' => 'c', 'â…¾' => 'd', 'â…¿' => 'm', '↉' => '0â„3', '∬' => '∫∫', '∭' => '∫∫∫', '∯' => '∮∮', '∰' => '∮∮∮', 'â‘ ' => '1', 'â‘¡' => '2', 'â‘¢' => '3', 'â‘£' => '4', '⑤' => '5', 'â‘¥' => '6', '⑦' => '7', '⑧' => '8', '⑨' => '9', 'â‘©' => '10', '⑪' => '11', 'â‘«' => '12', '⑬' => '13', 'â‘­' => '14', 'â‘®' => '15', '⑯' => '16', 'â‘°' => '17', '⑱' => '18', '⑲' => '19', '⑳' => '20', 'â‘´' => '(1)', '⑵' => '(2)', '⑶' => '(3)', 'â‘·' => '(4)', '⑸' => '(5)', '⑹' => '(6)', '⑺' => '(7)', 'â‘»' => '(8)', '⑼' => '(9)', '⑽' => '(10)', '⑾' => '(11)', 'â‘¿' => '(12)', 'â’€' => '(13)', 'â’' => '(14)', 'â’‚' => '(15)', 'â’ƒ' => '(16)', 'â’„' => '(17)', 'â’…' => '(18)', 'â’†' => '(19)', 'â’‡' => '(20)', 'â’ˆ' => '1.', 'â’‰' => '2.', 'â’Š' => '3.', 'â’‹' => '4.', 'â’Œ' => '5.', 'â’' => '6.', 'â’Ž' => '7.', 'â’' => '8.', 'â’' => '9.', 'â’‘' => '10.', 'â’’' => '11.', 'â’“' => '12.', 'â’”' => '13.', 'â’•' => '14.', 'â’–' => '15.', 'â’—' => '16.', 'â’˜' => '17.', 'â’™' => '18.', 'â’š' => '19.', 'â’›' => '20.', 'â’œ' => '(a)', 'â’' => '(b)', 'â’ž' => '(c)', 'â’Ÿ' => '(d)', 'â’ ' => '(e)', 'â’¡' => '(f)', 'â’¢' => '(g)', 'â’£' => '(h)', 'â’¤' => '(i)', 'â’¥' => '(j)', 'â’¦' => '(k)', 'â’§' => '(l)', 'â’¨' => '(m)', 'â’©' => '(n)', 'â’ª' => '(o)', 'â’«' => '(p)', 'â’¬' => '(q)', 'â’­' => '(r)', 'â’®' => '(s)', 'â’¯' => '(t)', 'â’°' => '(u)', 'â’±' => '(v)', 'â’²' => '(w)', 'â’³' => '(x)', 'â’´' => '(y)', 'â’µ' => '(z)', 'â’¶' => 'A', 'â’·' => 'B', 'â’¸' => 'C', 'â’¹' => 'D', 'â’º' => 'E', 'â’»' => 'F', 'â’¼' => 'G', 'â’½' => 'H', 'â’¾' => 'I', 'â’¿' => 'J', 'â“€' => 'K', 'â“' => 'L', 'â“‚' => 'M', 'Ⓝ' => 'N', 'â“„' => 'O', 'â“…' => 'P', 'Ⓠ' => 'Q', 'Ⓡ' => 'R', 'Ⓢ' => 'S', 'Ⓣ' => 'T', 'â“Š' => 'U', 'â“‹' => 'V', 'â“Œ' => 'W', 'â“' => 'X', 'â“Ž' => 'Y', 'â“' => 'Z', 'â“' => 'a', 'â“‘' => 'b', 'â“’' => 'c', 'â““' => 'd', 'â“”' => 'e', 'â“•' => 'f', 'â“–' => 'g', 'â“—' => 'h', 'ⓘ' => 'i', 'â“™' => 'j', 'â“š' => 'k', 'â“›' => 'l', 'â“œ' => 'm', 'â“' => 'n', 'â“ž' => 'o', 'â“Ÿ' => 'p', 'â“ ' => 'q', 'â“¡' => 'r', 'â“¢' => 's', 'â“£' => 't', 'ⓤ' => 'u', 'â“¥' => 'v', 'ⓦ' => 'w', 'ⓧ' => 'x', 'ⓨ' => 'y', 'â“©' => 'z', '⓪' => '0', '⨌' => '∫∫∫∫', 'â©´' => '::=', '⩵' => '==', '⩶' => '===', 'â±¼' => 'j', 'â±½' => 'V', 'ⵯ' => 'ⵡ', '⺟' => 'æ¯', '⻳' => '龟', 'â¼€' => '一', 'â¼' => '丨', '⼂' => '丶', '⼃' => '丿', '⼄' => 'ä¹™', 'â¼…' => '亅', '⼆' => '二', '⼇' => '亠', '⼈' => '人', '⼉' => 'å„¿', '⼊' => 'å…¥', '⼋' => 'å…«', '⼌' => '冂', 'â¼' => '冖', '⼎' => '冫', 'â¼' => '几', 'â¼' => '凵', '⼑' => '刀', 'â¼’' => '力', '⼓' => '勹', 'â¼”' => '匕', '⼕' => '匚', 'â¼–' => '匸', 'â¼—' => 'å', '⼘' => 'åœ', 'â¼™' => 'å©', '⼚' => '厂', 'â¼›' => '厶', '⼜' => 'åˆ', 'â¼' => 'å£', '⼞' => 'å›—', '⼟' => '土', 'â¼ ' => '士', '⼡' => '夂', 'â¼¢' => '夊', 'â¼£' => '夕', '⼤' => '大', 'â¼¥' => '女', '⼦' => 'å­', '⼧' => '宀', '⼨' => '寸', '⼩' => 'å°', '⼪' => 'å°¢', '⼫' => 'å°¸', '⼬' => 'å±®', 'â¼­' => 'å±±', 'â¼®' => 'å·›', '⼯' => 'å·¥', 'â¼°' => 'å·±', 'â¼±' => 'å·¾', 'â¼²' => 'å¹²', 'â¼³' => '幺', 'â¼´' => '广', 'â¼µ' => 'å»´', '⼶' => '廾', 'â¼·' => '弋', '⼸' => '弓', 'â¼¹' => 'å½', '⼺' => '彡', 'â¼»' => 'å½³', 'â¼¼' => '心', 'â¼½' => '戈', 'â¼¾' => '戶', '⼿' => '手', 'â½€' => '支', 'â½' => 'æ”´', '⽂' => 'æ–‡', '⽃' => 'æ–—', '⽄' => 'æ–¤', 'â½…' => 'æ–¹', '⽆' => 'æ— ', '⽇' => 'æ—¥', '⽈' => 'æ›°', '⽉' => '月', '⽊' => '木', '⽋' => '欠', '⽌' => 'æ­¢', 'â½' => 'æ­¹', '⽎' => '殳', 'â½' => '毋', 'â½' => '比', '⽑' => '毛', 'â½’' => 'æ°', '⽓' => 'æ°”', 'â½”' => 'æ°´', '⽕' => 'ç«', 'â½–' => '爪', 'â½—' => '父', '⽘' => '爻', 'â½™' => '爿', '⽚' => '片', 'â½›' => '牙', '⽜' => '牛', 'â½' => '犬', '⽞' => '玄', '⽟' => '玉', 'â½ ' => 'ç“œ', '⽡' => '瓦', 'â½¢' => '甘', 'â½£' => '生', '⽤' => '用', 'â½¥' => 'ç”°', '⽦' => 'ç–‹', '⽧' => 'ç–’', '⽨' => '癶', '⽩' => '白', '⽪' => 'çš®', '⽫' => 'çš¿', '⽬' => 'ç›®', 'â½­' => '矛', 'â½®' => '矢', '⽯' => '石', 'â½°' => '示', 'â½±' => '禸', 'â½²' => '禾', 'â½³' => 'ç©´', 'â½´' => 'ç«‹', 'â½µ' => '竹', '⽶' => 'ç±³', 'â½·' => '糸', '⽸' => '缶', 'â½¹' => '网', '⽺' => '羊', 'â½»' => 'ç¾½', 'â½¼' => 'è€', 'â½½' => '而', 'â½¾' => '耒', '⽿' => '耳', 'â¾€' => 'è¿', 'â¾' => '肉', '⾂' => '臣', '⾃' => '自', '⾄' => '至', 'â¾…' => '臼', '⾆' => '舌', '⾇' => '舛', '⾈' => '舟', '⾉' => '艮', '⾊' => '色', '⾋' => '艸', '⾌' => 'è™', 'â¾' => '虫', '⾎' => 'è¡€', 'â¾' => 'è¡Œ', 'â¾' => 'è¡£', '⾑' => '襾', 'â¾’' => '見', '⾓' => '角', 'â¾”' => '言', '⾕' => 'è°·', 'â¾–' => '豆', 'â¾—' => '豕', '⾘' => '豸', 'â¾™' => 'è²', '⾚' => '赤', 'â¾›' => 'èµ°', '⾜' => '足', 'â¾' => '身', '⾞' => '車', '⾟' => 'è¾›', 'â¾ ' => 'è¾°', '⾡' => 'è¾µ', 'â¾¢' => 'é‚‘', 'â¾£' => 'é…‰', '⾤' => '釆', 'â¾¥' => '里', '⾦' => '金', '⾧' => 'é•·', '⾨' => 'é–€', '⾩' => '阜', '⾪' => '隶', '⾫' => 'éš¹', '⾬' => '雨', 'â¾­' => 'é‘', 'â¾®' => 'éž', '⾯' => 'é¢', 'â¾°' => 'é©', 'â¾±' => '韋', 'â¾²' => '韭', 'â¾³' => '音', 'â¾´' => 'é ', 'â¾µ' => '風', '⾶' => '飛', 'â¾·' => '食', '⾸' => '首', 'â¾¹' => '香', '⾺' => '馬', 'â¾»' => '骨', 'â¾¼' => '高', 'â¾½' => 'é«Ÿ', 'â¾¾' => '鬥', '⾿' => '鬯', 'â¿€' => '鬲', 'â¿' => '鬼', 'â¿‚' => 'é­š', '⿃' => 'é³¥', 'â¿„' => 'é¹µ', 'â¿…' => '鹿', '⿆' => '麥', '⿇' => '麻', '⿈' => '黃', '⿉' => 'é»', 'â¿Š' => '黑', 'â¿‹' => '黹', 'â¿Œ' => '黽', 'â¿' => '鼎', 'â¿Ž' => '鼓', 'â¿' => 'é¼ ', 'â¿' => 'é¼»', 'â¿‘' => '齊', 'â¿’' => 'é½’', 'â¿“' => 'é¾', 'â¿”' => '龜', 'â¿•' => 'é¾ ', ' ' => ' ', '〶' => '〒', '〸' => 'å', '〹' => 'å„', '〺' => 'å…', 'ã‚›' => ' ã‚™', 'ã‚œ' => ' ã‚š', 'ã‚Ÿ' => 'より', 'ヿ' => 'コト', 'ㄱ' => 'á„€', 'ㄲ' => 'á„', 'ㄳ' => 'ᆪ', 'ã„´' => 'á„‚', 'ㄵ' => 'ᆬ', 'ㄶ' => 'ᆭ', 'ã„·' => 'ᄃ', 'ㄸ' => 'á„„', 'ㄹ' => 'á„…', 'ㄺ' => 'ᆰ', 'ã„»' => 'ᆱ', 'ㄼ' => 'ᆲ', 'ㄽ' => 'ᆳ', 'ㄾ' => 'ᆴ', 'ã„¿' => 'ᆵ', 'ã…€' => 'á„š', 'ã…' => 'ᄆ', 'ã…‚' => 'ᄇ', 'ã…ƒ' => 'ᄈ', 'ã…„' => 'á„¡', 'ã……' => 'ᄉ', 'ã…†' => 'á„Š', 'ã…‡' => 'á„‹', 'ã…ˆ' => 'á„Œ', 'ã…‰' => 'á„', 'ã…Š' => 'á„Ž', 'ã…‹' => 'á„', 'ã…Œ' => 'á„', 'ã…' => 'á„‘', 'ã…Ž' => 'á„’', 'ã…' => 'á…¡', 'ã…' => 'á…¢', 'ã…‘' => 'á…£', 'ã…’' => 'á…¤', 'ã…“' => 'á…¥', 'ã…”' => 'á…¦', 'ã…•' => 'á…§', 'ã…–' => 'á…¨', 'ã…—' => 'á…©', 'ã…˜' => 'á…ª', 'ã…™' => 'á…«', 'ã…š' => 'á…¬', 'ã…›' => 'á…­', 'ã…œ' => 'á…®', 'ã…' => 'á…¯', 'ã…ž' => 'á…°', 'ã…Ÿ' => 'á…±', 'ã… ' => 'á…²', 'ã…¡' => 'á…³', 'ã…¢' => 'á…´', 'ã…£' => 'á…µ', 'ã…¤' => 'á… ', 'ã…¥' => 'á„”', 'ã…¦' => 'á„•', 'ã…§' => 'ᇇ', 'ã…¨' => 'ᇈ', 'ã…©' => 'ᇌ', 'ã…ª' => 'ᇎ', 'ã…«' => 'ᇓ', 'ã…¬' => 'ᇗ', 'ã…­' => 'ᇙ', 'ã…®' => 'á„œ', 'ã…¯' => 'á‡', 'ã…°' => 'ᇟ', 'ã…±' => 'á„', 'ã…²' => 'á„ž', 'ã…³' => 'á„ ', 'ã…´' => 'á„¢', 'ã…µ' => 'á„£', 'ã…¶' => 'ᄧ', 'ã…·' => 'á„©', 'ã…¸' => 'á„«', 'ã…¹' => 'ᄬ', 'ã…º' => 'á„­', 'ã…»' => 'á„®', 'ã…¼' => 'ᄯ', 'ã…½' => 'ᄲ', 'ã…¾' => 'ᄶ', 'ã…¿' => 'á…€', 'ㆀ' => 'á…‡', 'ã†' => 'á…Œ', 'ㆂ' => 'ᇱ', 'ㆃ' => 'ᇲ', 'ㆄ' => 'á…—', 'ㆅ' => 'á…˜', 'ㆆ' => 'á…™', 'ㆇ' => 'ᆄ', 'ㆈ' => 'ᆅ', 'ㆉ' => 'ᆈ', 'ㆊ' => 'ᆑ', 'ㆋ' => 'ᆒ', 'ㆌ' => 'ᆔ', 'ã†' => 'ᆞ', 'ㆎ' => 'ᆡ', '㆒' => '一', '㆓' => '二', '㆔' => '三', '㆕' => 'å››', '㆖' => '上', '㆗' => '中', '㆘' => '下', '㆙' => '甲', '㆚' => 'ä¹™', '㆛' => '丙', '㆜' => 'ä¸', 'ã†' => '天', '㆞' => '地', '㆟' => '人', '㈀' => '(á„€)', 'ãˆ' => '(á„‚)', '㈂' => '(ᄃ)', '㈃' => '(á„…)', '㈄' => '(ᄆ)', '㈅' => '(ᄇ)', '㈆' => '(ᄉ)', '㈇' => '(á„‹)', '㈈' => '(á„Œ)', '㈉' => '(á„Ž)', '㈊' => '(á„)', '㈋' => '(á„)', '㈌' => '(á„‘)', 'ãˆ' => '(á„’)', '㈎' => '(가)', 'ãˆ' => '(á„‚á…¡)', 'ãˆ' => '(다)', '㈑' => '(á„…á…¡)', '㈒' => '(마)', '㈓' => '(바)', '㈔' => '(사)', '㈕' => '(á„‹á…¡)', '㈖' => '(자)', '㈗' => '(á„Žá…¡)', '㈘' => '(á„á…¡)', '㈙' => '(á„á…¡)', '㈚' => '(á„‘á…¡)', '㈛' => '(á„’á…¡)', '㈜' => '(주)', 'ãˆ' => '(오전)', '㈞' => '(á„‹á…©á„’á…®)', '㈠' => '(一)', '㈡' => '(二)', '㈢' => '(三)', '㈣' => '(å››)', '㈤' => '(五)', '㈥' => '(å…­)', '㈦' => '(七)', '㈧' => '(å…«)', '㈨' => '(ä¹)', '㈩' => '(å)', '㈪' => '(月)', '㈫' => '(ç«)', '㈬' => '(æ°´)', '㈭' => '(木)', '㈮' => '(金)', '㈯' => '(土)', '㈰' => '(æ—¥)', '㈱' => '(æ ª)', '㈲' => '(有)', '㈳' => '(社)', '㈴' => '(å)', '㈵' => '(特)', '㈶' => '(財)', '㈷' => '(ç¥)', '㈸' => '(労)', '㈹' => '(代)', '㈺' => '(呼)', '㈻' => '(å­¦)', '㈼' => '(監)', '㈽' => '(ä¼)', '㈾' => '(資)', '㈿' => '(å”)', '㉀' => '(祭)', 'ã‰' => '(休)', '㉂' => '(自)', '㉃' => '(至)', '㉄' => 'å•', '㉅' => 'å¹¼', '㉆' => 'æ–‡', '㉇' => 'ç®', 'ã‰' => 'PTE', '㉑' => '21', '㉒' => '22', '㉓' => '23', '㉔' => '24', '㉕' => '25', '㉖' => '26', '㉗' => '27', '㉘' => '28', '㉙' => '29', '㉚' => '30', '㉛' => '31', '㉜' => '32', 'ã‰' => '33', '㉞' => '34', '㉟' => '35', '㉠' => 'á„€', '㉡' => 'á„‚', '㉢' => 'ᄃ', '㉣' => 'á„…', '㉤' => 'ᄆ', '㉥' => 'ᄇ', '㉦' => 'ᄉ', '㉧' => 'á„‹', '㉨' => 'á„Œ', '㉩' => 'á„Ž', '㉪' => 'á„', '㉫' => 'á„', '㉬' => 'á„‘', '㉭' => 'á„’', '㉮' => '가', '㉯' => 'á„‚á…¡', '㉰' => '다', '㉱' => 'á„…á…¡', '㉲' => '마', '㉳' => '바', '㉴' => '사', '㉵' => 'á„‹á…¡', '㉶' => '자', '㉷' => 'á„Žá…¡', '㉸' => 'á„á…¡', '㉹' => 'á„á…¡', '㉺' => 'á„‘á…¡', '㉻' => 'á„’á…¡', '㉼' => '참고', '㉽' => '주의', '㉾' => 'á„‹á…®', '㊀' => '一', 'ãŠ' => '二', '㊂' => '三', '㊃' => 'å››', '㊄' => '五', '㊅' => 'å…­', '㊆' => '七', '㊇' => 'å…«', '㊈' => 'ä¹', '㊉' => 'å', '㊊' => '月', '㊋' => 'ç«', '㊌' => 'æ°´', 'ãŠ' => '木', '㊎' => '金', 'ãŠ' => '土', 'ãŠ' => 'æ—¥', '㊑' => 'æ ª', '㊒' => '有', '㊓' => '社', '㊔' => 'å', '㊕' => '特', '㊖' => '財', '㊗' => 'ç¥', '㊘' => '労', '㊙' => '秘', '㊚' => 'ç”·', '㊛' => '女', '㊜' => 'é©', 'ãŠ' => '優', '㊞' => 'å°', '㊟' => '注', '㊠' => 'é …', '㊡' => '休', '㊢' => '写', '㊣' => 'æ­£', '㊤' => '上', '㊥' => '中', '㊦' => '下', '㊧' => 'å·¦', '㊨' => 'å³', '㊩' => '医', '㊪' => 'å®—', '㊫' => 'å­¦', '㊬' => '監', '㊭' => 'ä¼', '㊮' => '資', '㊯' => 'å”', '㊰' => '夜', '㊱' => '36', '㊲' => '37', '㊳' => '38', '㊴' => '39', '㊵' => '40', '㊶' => '41', '㊷' => '42', '㊸' => '43', '㊹' => '44', '㊺' => '45', '㊻' => '46', '㊼' => '47', '㊽' => '48', '㊾' => '49', '㊿' => '50', 'ã‹€' => '1月', 'ã‹' => '2月', 'ã‹‚' => '3月', '㋃' => '4月', 'ã‹„' => '5月', 'ã‹…' => '6月', '㋆' => '7月', '㋇' => '8月', '㋈' => '9月', '㋉' => '10月', 'ã‹Š' => '11月', 'ã‹‹' => '12月', 'ã‹Œ' => 'Hg', 'ã‹' => 'erg', 'ã‹Ž' => 'eV', 'ã‹' => 'LTD', 'ã‹' => 'ã‚¢', 'ã‹‘' => 'イ', 'ã‹’' => 'ウ', 'ã‹“' => 'エ', 'ã‹”' => 'オ', 'ã‹•' => 'ã‚«', 'ã‹–' => 'ã‚­', 'ã‹—' => 'ク', '㋘' => 'ケ', 'ã‹™' => 'コ', 'ã‹š' => 'サ', 'ã‹›' => 'ã‚·', 'ã‹œ' => 'ス', 'ã‹' => 'ã‚»', 'ã‹ž' => 'ソ', 'ã‹Ÿ' => 'ã‚¿', 'ã‹ ' => 'ãƒ', 'ã‹¡' => 'ツ', 'ã‹¢' => 'テ', 'ã‹£' => 'ト', '㋤' => 'ナ', 'ã‹¥' => 'ニ', '㋦' => 'ヌ', '㋧' => 'ãƒ', '㋨' => 'ノ', 'ã‹©' => 'ãƒ', '㋪' => 'ヒ', 'ã‹«' => 'フ', '㋬' => 'ヘ', 'ã‹­' => 'ホ', 'ã‹®' => 'マ', '㋯' => 'ミ', 'ã‹°' => 'ム', '㋱' => 'メ', '㋲' => 'モ', '㋳' => 'ヤ', 'ã‹´' => 'ユ', '㋵' => 'ヨ', '㋶' => 'ラ', 'ã‹·' => 'リ', '㋸' => 'ル', '㋹' => 'レ', '㋺' => 'ロ', 'ã‹»' => 'ワ', '㋼' => 'ヰ', '㋽' => 'ヱ', '㋾' => 'ヲ', 'ã‹¿' => '令和', '㌀' => 'ã‚¢ãƒã‚šãƒ¼ãƒˆ', 'ãŒ' => 'アルファ', '㌂' => 'アンペア', '㌃' => 'アール', '㌄' => 'イニング', '㌅' => 'インãƒ', '㌆' => 'ウォン', '㌇' => 'エスクード', '㌈' => 'エーカー', '㌉' => 'オンス', '㌊' => 'オーム', '㌋' => 'カイリ', '㌌' => 'カラット', 'ãŒ' => 'カロリー', '㌎' => 'ガロン', 'ãŒ' => 'ガンマ', 'ãŒ' => 'ギガ', '㌑' => 'ギニー', '㌒' => 'キュリー', '㌓' => 'ギルダー', '㌔' => 'キロ', '㌕' => 'キログラム', '㌖' => 'キロメートル', '㌗' => 'キロワット', '㌘' => 'グラム', '㌙' => 'グラムトン', '㌚' => 'クルゼイロ', '㌛' => 'クローãƒ', '㌜' => 'ケース', 'ãŒ' => 'コルナ', '㌞' => 'コーポ', '㌟' => 'サイクル', '㌠' => 'サンãƒãƒ¼ãƒ ', '㌡' => 'シリング', '㌢' => 'センãƒ', '㌣' => 'セント', '㌤' => 'ダース', '㌥' => 'デシ', '㌦' => 'ドル', '㌧' => 'トン', '㌨' => 'ナノ', '㌩' => 'ノット', '㌪' => 'ãƒã‚¤ãƒ„', '㌫' => 'ãƒã‚šãƒ¼ã‚»ãƒ³ãƒˆ', '㌬' => 'ãƒã‚šãƒ¼ãƒ„', '㌭' => 'ãƒã‚™ãƒ¼ãƒ¬ãƒ«', '㌮' => 'ピアストル', '㌯' => 'ピクル', '㌰' => 'ピコ', '㌱' => 'ビル', '㌲' => 'ファラッド', '㌳' => 'フィート', '㌴' => 'ブッシェル', '㌵' => 'フラン', '㌶' => 'ヘクタール', '㌷' => 'ペソ', '㌸' => 'ペニヒ', '㌹' => 'ヘルツ', '㌺' => 'ペンス', '㌻' => 'ページ', '㌼' => 'ベータ', '㌽' => 'ポイント', '㌾' => 'ボルト', '㌿' => 'ホン', 'ã€' => 'ポンド', 'ã' => 'ホール', 'ã‚' => 'ホーン', 'ãƒ' => 'マイクロ', 'ã„' => 'マイル', 'ã…' => 'マッãƒ', 'ã†' => 'マルク', 'ã‡' => 'マンション', 'ãˆ' => 'ミクロン', 'ã‰' => 'ミリ', 'ãŠ' => 'ミリãƒã‚™ãƒ¼ãƒ«', 'ã‹' => 'メガ', 'ãŒ' => 'メガトン', 'ã' => 'メートル', 'ãŽ' => 'ヤード', 'ã' => 'ヤール', 'ã' => 'ユアン', 'ã‘' => 'リットル', 'ã’' => 'リラ', 'ã“' => 'ルピー', 'ã”' => 'ルーブル', 'ã•' => 'レム', 'ã–' => 'レントゲン', 'ã—' => 'ワット', 'ã˜' => '0点', 'ã™' => '1点', 'ãš' => '2点', 'ã›' => '3点', 'ãœ' => '4点', 'ã' => '5点', 'ãž' => '6点', 'ãŸ' => '7点', 'ã ' => '8点', 'ã¡' => '9点', 'ã¢' => '10点', 'ã£' => '11点', 'ã¤' => '12点', 'ã¥' => '13点', 'ã¦' => '14点', 'ã§' => '15点', 'ã¨' => '16点', 'ã©' => '17点', 'ãª' => '18点', 'ã«' => '19点', 'ã¬' => '20点', 'ã­' => '21点', 'ã®' => '22点', 'ã¯' => '23点', 'ã°' => '24点', 'ã±' => 'hPa', 'ã²' => 'da', 'ã³' => 'AU', 'ã´' => 'bar', 'ãµ' => 'oV', 'ã¶' => 'pc', 'ã·' => 'dm', 'ã¸' => 'dm2', 'ã¹' => 'dm3', 'ãº' => 'IU', 'ã»' => 'å¹³æˆ', 'ã¼' => '昭和', 'ã½' => '大正', 'ã¾' => '明治', 'ã¿' => 'æ ªå¼ä¼šç¤¾', '㎀' => 'pA', 'ãŽ' => 'nA', '㎂' => 'μA', '㎃' => 'mA', '㎄' => 'kA', '㎅' => 'KB', '㎆' => 'MB', '㎇' => 'GB', '㎈' => 'cal', '㎉' => 'kcal', '㎊' => 'pF', '㎋' => 'nF', '㎌' => 'μF', 'ãŽ' => 'μg', '㎎' => 'mg', 'ãŽ' => 'kg', 'ãŽ' => 'Hz', '㎑' => 'kHz', '㎒' => 'MHz', '㎓' => 'GHz', '㎔' => 'THz', '㎕' => 'μl', '㎖' => 'ml', '㎗' => 'dl', '㎘' => 'kl', '㎙' => 'fm', '㎚' => 'nm', '㎛' => 'μm', '㎜' => 'mm', 'ãŽ' => 'cm', '㎞' => 'km', '㎟' => 'mm2', '㎠' => 'cm2', '㎡' => 'm2', '㎢' => 'km2', '㎣' => 'mm3', '㎤' => 'cm3', '㎥' => 'm3', '㎦' => 'km3', '㎧' => 'm∕s', '㎨' => 'm∕s2', '㎩' => 'Pa', '㎪' => 'kPa', '㎫' => 'MPa', '㎬' => 'GPa', '㎭' => 'rad', '㎮' => 'rad∕s', '㎯' => 'rad∕s2', '㎰' => 'ps', '㎱' => 'ns', '㎲' => 'μs', '㎳' => 'ms', '㎴' => 'pV', '㎵' => 'nV', '㎶' => 'μV', '㎷' => 'mV', '㎸' => 'kV', '㎹' => 'MV', '㎺' => 'pW', '㎻' => 'nW', '㎼' => 'μW', '㎽' => 'mW', '㎾' => 'kW', '㎿' => 'MW', 'ã€' => 'kΩ', 'ã' => 'MΩ', 'ã‚' => 'a.m.', 'ãƒ' => 'Bq', 'ã„' => 'cc', 'ã…' => 'cd', 'ã†' => 'C∕kg', 'ã‡' => 'Co.', 'ãˆ' => 'dB', 'ã‰' => 'Gy', 'ãŠ' => 'ha', 'ã‹' => 'HP', 'ãŒ' => 'in', 'ã' => 'KK', 'ãŽ' => 'KM', 'ã' => 'kt', 'ã' => 'lm', 'ã‘' => 'ln', 'ã’' => 'log', 'ã“' => 'lx', 'ã”' => 'mb', 'ã•' => 'mil', 'ã–' => 'mol', 'ã—' => 'PH', 'ã˜' => 'p.m.', 'ã™' => 'PPM', 'ãš' => 'PR', 'ã›' => 'sr', 'ãœ' => 'Sv', 'ã' => 'Wb', 'ãž' => 'V∕m', 'ãŸ' => 'A∕m', 'ã ' => '1æ—¥', 'ã¡' => '2æ—¥', 'ã¢' => '3æ—¥', 'ã£' => '4æ—¥', 'ã¤' => '5æ—¥', 'ã¥' => '6æ—¥', 'ã¦' => '7æ—¥', 'ã§' => '8æ—¥', 'ã¨' => '9æ—¥', 'ã©' => '10æ—¥', 'ãª' => '11æ—¥', 'ã«' => '12æ—¥', 'ã¬' => '13æ—¥', 'ã­' => '14æ—¥', 'ã®' => '15æ—¥', 'ã¯' => '16æ—¥', 'ã°' => '17æ—¥', 'ã±' => '18æ—¥', 'ã²' => '19æ—¥', 'ã³' => '20æ—¥', 'ã´' => '21æ—¥', 'ãµ' => '22æ—¥', 'ã¶' => '23æ—¥', 'ã·' => '24æ—¥', 'ã¸' => '25æ—¥', 'ã¹' => '26æ—¥', 'ãº' => '27æ—¥', 'ã»' => '28æ—¥', 'ã¼' => '29æ—¥', 'ã½' => '30æ—¥', 'ã¾' => '31æ—¥', 'ã¿' => 'gal', 'êšœ' => 'ÑŠ', 'êš' => 'ÑŒ', 'ê°' => 'ê¯', 'ꟸ' => 'Ħ', 'ꟹ' => 'Å“', 'ê­œ' => 'ꜧ', 'ê­' => 'ꬷ', 'ê­ž' => 'É«', 'ê­Ÿ' => 'ê­’', 'ê­©' => 'Ê', 'ff' => 'ff', 'ï¬' => 'fi', 'fl' => 'fl', 'ffi' => 'ffi', 'ffl' => 'ffl', 'ſt' => 'st', 'st' => 'st', 'ﬓ' => 'Õ´Õ¶', 'ﬔ' => 'Õ´Õ¥', 'ﬕ' => 'Õ´Õ«', 'ﬖ' => 'Õ¾Õ¶', 'ﬗ' => 'Õ´Õ­', 'ﬠ' => '×¢', 'ﬡ' => '×', 'ﬢ' => 'ד', 'ﬣ' => '×”', 'ﬤ' => '×›', 'ﬥ' => 'ל', 'ﬦ' => '×', 'ﬧ' => 'ר', 'ﬨ' => 'ת', '﬩' => '+', 'ï­' => '×ל', 'ï­' => 'Ù±', 'ï­‘' => 'Ù±', 'ï­’' => 'Ù»', 'ï­“' => 'Ù»', 'ï­”' => 'Ù»', 'ï­•' => 'Ù»', 'ï­–' => 'Ù¾', 'ï­—' => 'Ù¾', 'ï­˜' => 'Ù¾', 'ï­™' => 'Ù¾', 'ï­š' => 'Ú€', 'ï­›' => 'Ú€', 'ï­œ' => 'Ú€', 'ï­' => 'Ú€', 'ï­ž' => 'Ùº', 'ï­Ÿ' => 'Ùº', 'ï­ ' => 'Ùº', 'ï­¡' => 'Ùº', 'ï­¢' => 'Ù¿', 'ï­£' => 'Ù¿', 'ï­¤' => 'Ù¿', 'ï­¥' => 'Ù¿', 'ï­¦' => 'Ù¹', 'ï­§' => 'Ù¹', 'ï­¨' => 'Ù¹', 'ï­©' => 'Ù¹', 'ï­ª' => 'Ú¤', 'ï­«' => 'Ú¤', 'ï­¬' => 'Ú¤', 'ï­­' => 'Ú¤', 'ï­®' => 'Ú¦', 'ï­¯' => 'Ú¦', 'ï­°' => 'Ú¦', 'ï­±' => 'Ú¦', 'ï­²' => 'Ú„', 'ï­³' => 'Ú„', 'ï­´' => 'Ú„', 'ï­µ' => 'Ú„', 'ï­¶' => 'Úƒ', 'ï­·' => 'Úƒ', 'ï­¸' => 'Úƒ', 'ï­¹' => 'Úƒ', 'ï­º' => 'Ú†', 'ï­»' => 'Ú†', 'ï­¼' => 'Ú†', 'ï­½' => 'Ú†', 'ï­¾' => 'Ú‡', 'ï­¿' => 'Ú‡', 'ﮀ' => 'Ú‡', 'ï®' => 'Ú‡', 'ﮂ' => 'Ú', 'ﮃ' => 'Ú', 'ﮄ' => 'ÚŒ', 'ï®…' => 'ÚŒ', 'ﮆ' => 'ÚŽ', 'ﮇ' => 'ÚŽ', 'ﮈ' => 'Úˆ', 'ﮉ' => 'Úˆ', 'ﮊ' => 'Ú˜', 'ﮋ' => 'Ú˜', 'ﮌ' => 'Ú‘', 'ï®' => 'Ú‘', 'ﮎ' => 'Ú©', 'ï®' => 'Ú©', 'ï®' => 'Ú©', 'ﮑ' => 'Ú©', 'ï®’' => 'Ú¯', 'ﮓ' => 'Ú¯', 'ï®”' => 'Ú¯', 'ﮕ' => 'Ú¯', 'ï®–' => 'Ú³', 'ï®—' => 'Ú³', 'ﮘ' => 'Ú³', 'ï®™' => 'Ú³', 'ﮚ' => 'Ú±', 'ï®›' => 'Ú±', 'ﮜ' => 'Ú±', 'ï®' => 'Ú±', 'ﮞ' => 'Úº', 'ﮟ' => 'Úº', 'ï® ' => 'Ú»', 'ﮡ' => 'Ú»', 'ﮢ' => 'Ú»', 'ﮣ' => 'Ú»', 'ﮤ' => 'Û•Ù”', 'ﮥ' => 'Û•Ù”', 'ﮦ' => 'Û', 'ﮧ' => 'Û', 'ﮨ' => 'Û', 'ﮩ' => 'Û', 'ﮪ' => 'Ú¾', 'ﮫ' => 'Ú¾', 'ﮬ' => 'Ú¾', 'ï®­' => 'Ú¾', 'ï®®' => 'Û’', 'ﮯ' => 'Û’', 'ï®°' => 'Û’Ù”', 'ï®±' => 'Û’Ù”', 'ﯓ' => 'Ú­', 'ﯔ' => 'Ú­', 'ﯕ' => 'Ú­', 'ﯖ' => 'Ú­', 'ﯗ' => 'Û‡', 'ﯘ' => 'Û‡', 'ﯙ' => 'Û†', 'ﯚ' => 'Û†', 'ﯛ' => 'Ûˆ', 'ﯜ' => 'Ûˆ', 'ï¯' => 'Û‡Ù´', 'ﯞ' => 'Û‹', 'ﯟ' => 'Û‹', 'ﯠ' => 'Û…', 'ﯡ' => 'Û…', 'ﯢ' => 'Û‰', 'ﯣ' => 'Û‰', 'ﯤ' => 'Û', 'ﯥ' => 'Û', 'ﯦ' => 'Û', 'ﯧ' => 'Û', 'ﯨ' => 'Ù‰', 'ﯩ' => 'Ù‰', 'ﯪ' => 'ئا', 'ﯫ' => 'ئا', 'ﯬ' => 'ÙŠÙ”Û•', 'ﯭ' => 'ÙŠÙ”Û•', 'ﯮ' => 'ÙŠÙ”Ùˆ', 'ﯯ' => 'ÙŠÙ”Ùˆ', 'ﯰ' => 'ÙŠÙ”Û‡', 'ﯱ' => 'ÙŠÙ”Û‡', 'ﯲ' => 'ÙŠÙ”Û†', 'ﯳ' => 'ÙŠÙ”Û†', 'ﯴ' => 'ÙŠÙ”Ûˆ', 'ﯵ' => 'ÙŠÙ”Ûˆ', 'ﯶ' => 'ÙŠÙ”Û', 'ﯷ' => 'ÙŠÙ”Û', 'ﯸ' => 'ÙŠÙ”Û', 'ﯹ' => 'ÙŠÙ”Ù‰', 'ﯺ' => 'ÙŠÙ”Ù‰', 'ﯻ' => 'ÙŠÙ”Ù‰', 'ﯼ' => 'ÛŒ', 'ﯽ' => 'ÛŒ', 'ﯾ' => 'ÛŒ', 'ﯿ' => 'ÛŒ', 'ï°€' => 'ئج', 'ï°' => 'ئح', 'ï°‚' => 'ÙŠÙ”Ù…', 'ï°ƒ' => 'ÙŠÙ”Ù‰', 'ï°„' => 'ÙŠÙ”ÙŠ', 'ï°…' => 'بج', 'ï°†' => 'بح', 'ï°‡' => 'بخ', 'ï°ˆ' => 'بم', 'ï°‰' => 'بى', 'ï°Š' => 'بي', 'ï°‹' => 'تج', 'ï°Œ' => 'تح', 'ï°' => 'تخ', 'ï°Ž' => 'تم', 'ï°' => 'تى', 'ï°' => 'تي', 'ï°‘' => 'ثج', 'ï°’' => 'ثم', 'ï°“' => 'ثى', 'ï°”' => 'ثي', 'ï°•' => 'جح', 'ï°–' => 'جم', 'ï°—' => 'حج', 'ï°˜' => 'حم', 'ï°™' => 'خج', 'ï°š' => 'خح', 'ï°›' => 'خم', 'ï°œ' => 'سج', 'ï°' => 'سح', 'ï°ž' => 'سخ', 'ï°Ÿ' => 'سم', 'ï° ' => 'صح', 'ï°¡' => 'صم', 'ï°¢' => 'ضج', 'ï°£' => 'ضح', 'ï°¤' => 'ضخ', 'ï°¥' => 'ضم', 'ï°¦' => 'طح', 'ï°§' => 'طم', 'ï°¨' => 'ظم', 'ï°©' => 'عج', 'ï°ª' => 'عم', 'ï°«' => 'غج', 'ï°¬' => 'غم', 'ï°­' => 'Ùج', 'ï°®' => 'ÙØ­', 'ï°¯' => 'ÙØ®', 'ï°°' => 'ÙÙ…', 'ï°±' => 'ÙÙ‰', 'ï°²' => 'ÙÙŠ', 'ï°³' => 'قح', 'ï°´' => 'قم', 'ï°µ' => 'قى', 'ï°¶' => 'قي', 'ï°·' => 'كا', 'ï°¸' => 'كج', 'ï°¹' => 'كح', 'ï°º' => 'كخ', 'ï°»' => 'كل', 'ï°¼' => 'كم', 'ï°½' => 'كى', 'ï°¾' => 'كي', 'ï°¿' => 'لج', 'ï±€' => 'لح', 'ï±' => 'لخ', 'ﱂ' => 'لم', 'ﱃ' => 'لى', 'ﱄ' => 'لي', 'ï±…' => 'مج', 'ﱆ' => 'مح', 'ﱇ' => 'مخ', 'ﱈ' => 'مم', 'ﱉ' => 'مى', 'ﱊ' => 'مي', 'ﱋ' => 'نج', 'ﱌ' => 'نح', 'ï±' => 'نخ', 'ﱎ' => 'نم', 'ï±' => 'نى', 'ï±' => 'ني', 'ﱑ' => 'هج', 'ï±’' => 'هم', 'ﱓ' => 'هى', 'ï±”' => 'هي', 'ﱕ' => 'يج', 'ï±–' => 'يح', 'ï±—' => 'يخ', 'ﱘ' => 'يم', 'ï±™' => 'يى', 'ﱚ' => 'يي', 'ï±›' => 'ذٰ', 'ﱜ' => 'رٰ', 'ï±' => 'ىٰ', 'ﱞ' => ' ٌّ', 'ﱟ' => ' ÙÙ‘', 'ï± ' => ' ÙŽÙ‘', 'ﱡ' => ' ÙÙ‘', 'ï±¢' => ' ÙÙ‘', 'ï±£' => ' ّٰ', 'ﱤ' => 'ئر', 'ï±¥' => 'ئز', 'ﱦ' => 'ÙŠÙ”Ù…', 'ﱧ' => 'ÙŠÙ”Ù†', 'ﱨ' => 'ÙŠÙ”Ù‰', 'ﱩ' => 'ÙŠÙ”ÙŠ', 'ﱪ' => 'بر', 'ﱫ' => 'بز', 'ﱬ' => 'بم', 'ï±­' => 'بن', 'ï±®' => 'بى', 'ﱯ' => 'بي', 'ï±°' => 'تر', 'ï±±' => 'تز', 'ï±²' => 'تم', 'ï±³' => 'تن', 'ï±´' => 'تى', 'ï±µ' => 'تي', 'ﱶ' => 'ثر', 'ï±·' => 'ثز', 'ﱸ' => 'ثم', 'ï±¹' => 'ثن', 'ﱺ' => 'ثى', 'ï±»' => 'ثي', 'ï±¼' => 'ÙÙ‰', 'ï±½' => 'ÙÙŠ', 'ï±¾' => 'قى', 'ﱿ' => 'قي', 'ï²€' => 'كا', 'ï²' => 'كل', 'ﲂ' => 'كم', 'ﲃ' => 'كى', 'ﲄ' => 'كي', 'ï²…' => 'لم', 'ﲆ' => 'لى', 'ﲇ' => 'لي', 'ﲈ' => 'ما', 'ﲉ' => 'مم', 'ﲊ' => 'نر', 'ﲋ' => 'نز', 'ﲌ' => 'نم', 'ï²' => 'نن', 'ﲎ' => 'نى', 'ï²' => 'ني', 'ï²' => 'ىٰ', 'ﲑ' => 'ير', 'ï²’' => 'يز', 'ﲓ' => 'يم', 'ï²”' => 'ين', 'ﲕ' => 'يى', 'ï²–' => 'يي', 'ï²—' => 'ئج', 'ﲘ' => 'ئح', 'ï²™' => 'ئخ', 'ﲚ' => 'ÙŠÙ”Ù…', 'ï²›' => 'ÙŠÙ”Ù‡', 'ﲜ' => 'بج', 'ï²' => 'بح', 'ﲞ' => 'بخ', 'ﲟ' => 'بم', 'ï² ' => 'به', 'ﲡ' => 'تج', 'ï²¢' => 'تح', 'ï²£' => 'تخ', 'ﲤ' => 'تم', 'ï²¥' => 'ته', 'ﲦ' => 'ثم', 'ﲧ' => 'جح', 'ﲨ' => 'جم', 'ﲩ' => 'حج', 'ﲪ' => 'حم', 'ﲫ' => 'خج', 'ﲬ' => 'خم', 'ï²­' => 'سج', 'ï²®' => 'سح', 'ﲯ' => 'سخ', 'ï²°' => 'سم', 'ï²±' => 'صح', 'ï²²' => 'صخ', 'ï²³' => 'صم', 'ï²´' => 'ضج', 'ï²µ' => 'ضح', 'ﲶ' => 'ضخ', 'ï²·' => 'ضم', 'ﲸ' => 'طح', 'ï²¹' => 'ظم', 'ﲺ' => 'عج', 'ï²»' => 'عم', 'ï²¼' => 'غج', 'ï²½' => 'غم', 'ï²¾' => 'Ùج', 'ﲿ' => 'ÙØ­', 'ï³€' => 'ÙØ®', 'ï³' => 'ÙÙ…', 'ﳂ' => 'قح', 'ﳃ' => 'قم', 'ﳄ' => 'كج', 'ï³…' => 'كح', 'ﳆ' => 'كخ', 'ﳇ' => 'كل', 'ﳈ' => 'كم', 'ﳉ' => 'لج', 'ﳊ' => 'لح', 'ﳋ' => 'لخ', 'ﳌ' => 'لم', 'ï³' => 'له', 'ﳎ' => 'مج', 'ï³' => 'مح', 'ï³' => 'مخ', 'ﳑ' => 'مم', 'ï³’' => 'نج', 'ﳓ' => 'نح', 'ï³”' => 'نخ', 'ﳕ' => 'نم', 'ï³–' => 'نه', 'ï³—' => 'هج', 'ﳘ' => 'هم', 'ï³™' => 'هٰ', 'ﳚ' => 'يج', 'ï³›' => 'يح', 'ﳜ' => 'يخ', 'ï³' => 'يم', 'ﳞ' => 'يه', 'ﳟ' => 'ÙŠÙ”Ù…', 'ï³ ' => 'ÙŠÙ”Ù‡', 'ﳡ' => 'بم', 'ï³¢' => 'به', 'ï³£' => 'تم', 'ﳤ' => 'ته', 'ï³¥' => 'ثم', 'ﳦ' => 'ثه', 'ﳧ' => 'سم', 'ﳨ' => 'سه', 'ﳩ' => 'شم', 'ﳪ' => 'شه', 'ﳫ' => 'كل', 'ﳬ' => 'كم', 'ï³­' => 'لم', 'ï³®' => 'نم', 'ﳯ' => 'نه', 'ï³°' => 'يم', 'ï³±' => 'يه', 'ï³²' => 'Ù€ÙŽÙ‘', 'ï³³' => 'Ù€ÙÙ‘', 'ï³´' => 'Ù€ÙÙ‘', 'ï³µ' => 'طى', 'ﳶ' => 'طي', 'ï³·' => 'عى', 'ﳸ' => 'عي', 'ï³¹' => 'غى', 'ﳺ' => 'غي', 'ï³»' => 'سى', 'ï³¼' => 'سي', 'ï³½' => 'شى', 'ï³¾' => 'شي', 'ﳿ' => 'حى', 'ï´€' => 'حي', 'ï´' => 'جى', 'ï´‚' => 'جي', 'ï´ƒ' => 'خى', 'ï´„' => 'خي', 'ï´…' => 'صى', 'ï´†' => 'صي', 'ï´‡' => 'ضى', 'ï´ˆ' => 'ضي', 'ï´‰' => 'شج', 'ï´Š' => 'شح', 'ï´‹' => 'شخ', 'ï´Œ' => 'شم', 'ï´' => 'شر', 'ï´Ž' => 'سر', 'ï´' => 'صر', 'ï´' => 'ضر', 'ï´‘' => 'طى', 'ï´’' => 'طي', 'ï´“' => 'عى', 'ï´”' => 'عي', 'ï´•' => 'غى', 'ï´–' => 'غي', 'ï´—' => 'سى', 'ï´˜' => 'سي', 'ï´™' => 'شى', 'ï´š' => 'شي', 'ï´›' => 'حى', 'ï´œ' => 'حي', 'ï´' => 'جى', 'ï´ž' => 'جي', 'ï´Ÿ' => 'خى', 'ï´ ' => 'خي', 'ï´¡' => 'صى', 'ï´¢' => 'صي', 'ï´£' => 'ضى', 'ï´¤' => 'ضي', 'ï´¥' => 'شج', 'ï´¦' => 'شح', 'ï´§' => 'شخ', 'ï´¨' => 'شم', 'ï´©' => 'شر', 'ï´ª' => 'سر', 'ï´«' => 'صر', 'ï´¬' => 'ضر', 'ï´­' => 'شج', 'ï´®' => 'شح', 'ï´¯' => 'شخ', 'ï´°' => 'شم', 'ï´±' => 'سه', 'ï´²' => 'شه', 'ï´³' => 'طم', 'ï´´' => 'سج', 'ï´µ' => 'سح', 'ï´¶' => 'سخ', 'ï´·' => 'شج', 'ï´¸' => 'شح', 'ï´¹' => 'شخ', 'ï´º' => 'طم', 'ï´»' => 'ظم', 'ï´¼' => 'اً', 'ï´½' => 'اً', 'ïµ' => 'تجم', 'ﵑ' => 'تحج', 'ïµ’' => 'تحج', 'ﵓ' => 'تحم', 'ïµ”' => 'تخم', 'ﵕ' => 'تمج', 'ïµ–' => 'تمح', 'ïµ—' => 'تمخ', 'ﵘ' => 'جمح', 'ïµ™' => 'جمح', 'ﵚ' => 'حمي', 'ïµ›' => 'حمى', 'ﵜ' => 'سحج', 'ïµ' => 'سجح', 'ﵞ' => 'سجى', 'ﵟ' => 'سمح', 'ïµ ' => 'سمح', 'ﵡ' => 'سمج', 'ïµ¢' => 'سمم', 'ïµ£' => 'سمم', 'ﵤ' => 'صحح', 'ïµ¥' => 'صحح', 'ﵦ' => 'صمم', 'ﵧ' => 'شحم', 'ﵨ' => 'شحم', 'ﵩ' => 'شجي', 'ﵪ' => 'شمخ', 'ﵫ' => 'شمخ', 'ﵬ' => 'شمم', 'ïµ­' => 'شمم', 'ïµ®' => 'ضحى', 'ﵯ' => 'ضخم', 'ïµ°' => 'ضخم', 'ïµ±' => 'طمح', 'ïµ²' => 'طمح', 'ïµ³' => 'طمم', 'ïµ´' => 'طمي', 'ïµµ' => 'عجم', 'ﵶ' => 'عمم', 'ïµ·' => 'عمم', 'ﵸ' => 'عمى', 'ïµ¹' => 'غمم', 'ﵺ' => 'غمي', 'ïµ»' => 'غمى', 'ïµ¼' => 'Ùخم', 'ïµ½' => 'Ùخم', 'ïµ¾' => 'قمح', 'ﵿ' => 'قمم', 'ﶀ' => 'لحم', 'ï¶' => 'لحي', 'ﶂ' => 'لحى', 'ﶃ' => 'لجج', 'ﶄ' => 'لجج', 'ﶅ' => 'لخم', 'ﶆ' => 'لخم', 'ﶇ' => 'لمح', 'ﶈ' => 'لمح', 'ﶉ' => 'محج', 'ﶊ' => 'محم', 'ﶋ' => 'محي', 'ﶌ' => 'مجح', 'ï¶' => 'مجم', 'ﶎ' => 'مخج', 'ï¶' => 'مخم', 'ﶒ' => 'مجخ', 'ﶓ' => 'همج', 'ﶔ' => 'همم', 'ﶕ' => 'نحم', 'ﶖ' => 'نحى', 'ﶗ' => 'نجم', 'ﶘ' => 'نجم', 'ﶙ' => 'نجى', 'ﶚ' => 'نمي', 'ﶛ' => 'نمى', 'ﶜ' => 'يمم', 'ï¶' => 'يمم', 'ﶞ' => 'بخي', 'ﶟ' => 'تجي', 'ﶠ' => 'تجى', 'ﶡ' => 'تخي', 'ﶢ' => 'تخى', 'ﶣ' => 'تمي', 'ﶤ' => 'تمى', 'ﶥ' => 'جمي', 'ﶦ' => 'جحى', 'ﶧ' => 'جمى', 'ﶨ' => 'سخى', 'ﶩ' => 'صحي', 'ﶪ' => 'شحي', 'ﶫ' => 'ضحي', 'ﶬ' => 'لجي', 'ﶭ' => 'لمي', 'ﶮ' => 'يحي', 'ﶯ' => 'يجي', 'ﶰ' => 'يمي', 'ﶱ' => 'ممي', 'ﶲ' => 'قمي', 'ﶳ' => 'نحي', 'ﶴ' => 'قمح', 'ﶵ' => 'لحم', 'ﶶ' => 'عمي', 'ﶷ' => 'كمي', 'ﶸ' => 'نجح', 'ﶹ' => 'مخي', 'ﶺ' => 'لجم', 'ﶻ' => 'كمم', 'ﶼ' => 'لجم', 'ﶽ' => 'نجح', 'ﶾ' => 'جحي', 'ﶿ' => 'حجي', 'ï·€' => 'مجي', 'ï·' => 'Ùمي', 'ï·‚' => 'بحي', 'ï·ƒ' => 'كمم', 'ï·„' => 'عجم', 'ï·…' => 'صمم', 'ï·†' => 'سخي', 'ï·‡' => 'نجي', 'ï·°' => 'صلے', 'ï·±' => 'قلے', 'ï·²' => 'الله', 'ï·³' => 'اكبر', 'ï·´' => 'محمد', 'ï·µ' => 'صلعم', 'ï·¶' => 'رسول', 'ï··' => 'عليه', 'ï·¸' => 'وسلم', 'ï·¹' => 'صلى', 'ï·º' => 'صلى الله عليه وسلم', 'ï·»' => 'جل جلاله', 'ï·¼' => 'ریال', 'ï¸' => ',', '︑' => 'ã€', '︒' => '。', '︓' => ':', '︔' => ';', '︕' => '!', '︖' => '?', '︗' => '〖', '︘' => '〗', '︙' => '...', '︰' => '..', '︱' => '—', '︲' => '–', '︳' => '_', '︴' => '_', '︵' => '(', '︶' => ')', '︷' => '{', '︸' => '}', '︹' => '〔', '︺' => '〕', '︻' => 'ã€', '︼' => '】', '︽' => '《', '︾' => '》', '︿' => '〈', 'ï¹€' => '〉', 'ï¹' => '「', '﹂' => 'ã€', '﹃' => '『', '﹄' => 'ã€', '﹇' => '[', '﹈' => ']', '﹉' => ' Ì…', '﹊' => ' Ì…', '﹋' => ' Ì…', '﹌' => ' Ì…', 'ï¹' => '_', '﹎' => '_', 'ï¹' => '_', 'ï¹' => ',', '﹑' => 'ã€', 'ï¹’' => '.', 'ï¹”' => ';', '﹕' => ':', 'ï¹–' => '?', 'ï¹—' => '!', '﹘' => '—', 'ï¹™' => '(', '﹚' => ')', 'ï¹›' => '{', '﹜' => '}', 'ï¹' => '〔', '﹞' => '〕', '﹟' => '#', 'ï¹ ' => '&', '﹡' => '*', 'ï¹¢' => '+', 'ï¹£' => '-', '﹤' => '<', 'ï¹¥' => '>', '﹦' => '=', '﹨' => '\\', '﹩' => '$', '﹪' => '%', '﹫' => '@', 'ï¹°' => ' Ù‹', 'ï¹±' => 'ـً', 'ï¹²' => ' ÙŒ', 'ï¹´' => ' Ù', 'ﹶ' => ' ÙŽ', 'ï¹·' => 'Ù€ÙŽ', 'ﹸ' => ' Ù', 'ï¹¹' => 'Ù€Ù', 'ﹺ' => ' Ù', 'ï¹»' => 'Ù€Ù', 'ï¹¼' => ' Ù‘', 'ï¹½' => 'ـّ', 'ï¹¾' => ' Ù’', 'ﹿ' => 'ـْ', 'ﺀ' => 'Ø¡', 'ïº' => 'آ', 'ﺂ' => 'آ', 'ﺃ' => 'أ', 'ﺄ' => 'أ', 'ﺅ' => 'ÙˆÙ”', 'ﺆ' => 'ÙˆÙ”', 'ﺇ' => 'إ', 'ﺈ' => 'إ', 'ﺉ' => 'ÙŠÙ”', 'ﺊ' => 'ÙŠÙ”', 'ﺋ' => 'ÙŠÙ”', 'ﺌ' => 'ÙŠÙ”', 'ïº' => 'ا', 'ﺎ' => 'ا', 'ïº' => 'ب', 'ïº' => 'ب', 'ﺑ' => 'ب', 'ﺒ' => 'ب', 'ﺓ' => 'Ø©', 'ﺔ' => 'Ø©', 'ﺕ' => 'ت', 'ﺖ' => 'ت', 'ﺗ' => 'ت', 'ﺘ' => 'ت', 'ﺙ' => 'Ø«', 'ﺚ' => 'Ø«', 'ﺛ' => 'Ø«', 'ﺜ' => 'Ø«', 'ïº' => 'ج', 'ﺞ' => 'ج', 'ﺟ' => 'ج', 'ﺠ' => 'ج', 'ﺡ' => 'Ø­', 'ﺢ' => 'Ø­', 'ﺣ' => 'Ø­', 'ﺤ' => 'Ø­', 'ﺥ' => 'Ø®', 'ﺦ' => 'Ø®', 'ﺧ' => 'Ø®', 'ﺨ' => 'Ø®', 'ﺩ' => 'د', 'ﺪ' => 'د', 'ﺫ' => 'Ø°', 'ﺬ' => 'Ø°', 'ﺭ' => 'ر', 'ﺮ' => 'ر', 'ﺯ' => 'ز', 'ﺰ' => 'ز', 'ﺱ' => 'س', 'ﺲ' => 'س', 'ﺳ' => 'س', 'ﺴ' => 'س', 'ﺵ' => 'Ø´', 'ﺶ' => 'Ø´', 'ﺷ' => 'Ø´', 'ﺸ' => 'Ø´', 'ﺹ' => 'ص', 'ﺺ' => 'ص', 'ﺻ' => 'ص', 'ﺼ' => 'ص', 'ﺽ' => 'ض', 'ﺾ' => 'ض', 'ﺿ' => 'ض', 'ﻀ' => 'ض', 'ï»' => 'Ø·', 'ﻂ' => 'Ø·', 'ﻃ' => 'Ø·', 'ﻄ' => 'Ø·', 'ï»…' => 'ظ', 'ﻆ' => 'ظ', 'ﻇ' => 'ظ', 'ﻈ' => 'ظ', 'ﻉ' => 'ع', 'ﻊ' => 'ع', 'ﻋ' => 'ع', 'ﻌ' => 'ع', 'ï»' => 'غ', 'ﻎ' => 'غ', 'ï»' => 'غ', 'ï»' => 'غ', 'ﻑ' => 'Ù', 'ï»’' => 'Ù', 'ﻓ' => 'Ù', 'ï»”' => 'Ù', 'ﻕ' => 'Ù‚', 'ï»–' => 'Ù‚', 'ï»—' => 'Ù‚', 'ﻘ' => 'Ù‚', 'ï»™' => 'Ùƒ', 'ﻚ' => 'Ùƒ', 'ï»›' => 'Ùƒ', 'ﻜ' => 'Ùƒ', 'ï»' => 'Ù„', 'ﻞ' => 'Ù„', 'ﻟ' => 'Ù„', 'ï» ' => 'Ù„', 'ﻡ' => 'Ù…', 'ﻢ' => 'Ù…', 'ﻣ' => 'Ù…', 'ﻤ' => 'Ù…', 'ﻥ' => 'Ù†', 'ﻦ' => 'Ù†', 'ﻧ' => 'Ù†', 'ﻨ' => 'Ù†', 'ﻩ' => 'Ù‡', 'ﻪ' => 'Ù‡', 'ﻫ' => 'Ù‡', 'ﻬ' => 'Ù‡', 'ï»­' => 'Ùˆ', 'ï»®' => 'Ùˆ', 'ﻯ' => 'Ù‰', 'ï»°' => 'Ù‰', 'ï»±' => 'ÙŠ', 'ﻲ' => 'ÙŠ', 'ﻳ' => 'ÙŠ', 'ï»´' => 'ÙŠ', 'ﻵ' => 'لآ', 'ﻶ' => 'لآ', 'ï»·' => 'لأ', 'ﻸ' => 'لأ', 'ﻹ' => 'لإ', 'ﻺ' => 'لإ', 'ï»»' => 'لا', 'ﻼ' => 'لا', 'ï¼' => '!', '"' => '"', '#' => '#', '$' => '$', 'ï¼…' => '%', '&' => '&', ''' => '\'', '(' => '(', ')' => ')', '*' => '*', '+' => '+', ',' => ',', 'ï¼' => '-', '.' => '.', 'ï¼' => '/', 'ï¼' => '0', '1' => '1', 'ï¼’' => '2', '3' => '3', 'ï¼”' => '4', '5' => '5', 'ï¼–' => '6', 'ï¼—' => '7', '8' => '8', 'ï¼™' => '9', ':' => ':', 'ï¼›' => ';', '<' => '<', 'ï¼' => '=', '>' => '>', '?' => '?', 'ï¼ ' => '@', 'A' => 'A', 'ï¼¢' => 'B', 'ï¼£' => 'C', 'D' => 'D', 'ï¼¥' => 'E', 'F' => 'F', 'G' => 'G', 'H' => 'H', 'I' => 'I', 'J' => 'J', 'K' => 'K', 'L' => 'L', 'ï¼­' => 'M', 'ï¼®' => 'N', 'O' => 'O', 'ï¼°' => 'P', 'ï¼±' => 'Q', 'ï¼²' => 'R', 'ï¼³' => 'S', 'ï¼´' => 'T', 'ï¼µ' => 'U', 'V' => 'V', 'ï¼·' => 'W', 'X' => 'X', 'ï¼¹' => 'Y', 'Z' => 'Z', 'ï¼»' => '[', 'ï¼¼' => '\\', 'ï¼½' => ']', 'ï¼¾' => '^', '_' => '_', 'ï½€' => '`', 'ï½' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', 'ï½…' => 'e', 'f' => 'f', 'g' => 'g', 'h' => 'h', 'i' => 'i', 'j' => 'j', 'k' => 'k', 'l' => 'l', 'ï½' => 'm', 'n' => 'n', 'ï½' => 'o', 'ï½' => 'p', 'q' => 'q', 'ï½’' => 'r', 's' => 's', 'ï½”' => 't', 'u' => 'u', 'ï½–' => 'v', 'ï½—' => 'w', 'x' => 'x', 'ï½™' => 'y', 'z' => 'z', 'ï½›' => '{', '|' => '|', 'ï½' => '}', '~' => '~', '⦅' => '⦅', 'ï½ ' => '⦆', '。' => '。', 'ï½¢' => '「', 'ï½£' => 'ã€', '、' => 'ã€', 'ï½¥' => '・', 'ヲ' => 'ヲ', 'ァ' => 'ã‚¡', 'ィ' => 'ã‚£', 'ゥ' => 'ã‚¥', 'ェ' => 'ェ', 'ォ' => 'ã‚©', 'ャ' => 'ャ', 'ï½­' => 'ュ', 'ï½®' => 'ョ', 'ッ' => 'ッ', 'ï½°' => 'ー', 'ï½±' => 'ã‚¢', 'ï½²' => 'イ', 'ï½³' => 'ウ', 'ï½´' => 'エ', 'ï½µ' => 'オ', 'カ' => 'ã‚«', 'ï½·' => 'ã‚­', 'ク' => 'ク', 'ï½¹' => 'ケ', 'コ' => 'コ', 'ï½»' => 'サ', 'ï½¼' => 'ã‚·', 'ï½½' => 'ス', 'ï½¾' => 'ã‚»', 'ソ' => 'ソ', 'ï¾€' => 'ã‚¿', 'ï¾' => 'ãƒ', 'ツ' => 'ツ', 'テ' => 'テ', 'ト' => 'ト', 'ï¾…' => 'ナ', 'ニ' => 'ニ', 'ヌ' => 'ヌ', 'ネ' => 'ãƒ', 'ノ' => 'ノ', 'ハ' => 'ãƒ', 'ヒ' => 'ヒ', 'フ' => 'フ', 'ï¾' => 'ヘ', 'ホ' => 'ホ', 'ï¾' => 'マ', 'ï¾' => 'ミ', 'ム' => 'ム', 'ï¾’' => 'メ', 'モ' => 'モ', 'ï¾”' => 'ヤ', 'ユ' => 'ユ', 'ï¾–' => 'ヨ', 'ï¾—' => 'ラ', 'リ' => 'リ', 'ï¾™' => 'ル', 'レ' => 'レ', 'ï¾›' => 'ロ', 'ワ' => 'ワ', 'ï¾' => 'ン', '゙' => 'ã‚™', '゚' => 'ã‚š', 'ï¾ ' => 'á… ', 'ᄀ' => 'á„€', 'ï¾¢' => 'á„', 'ï¾£' => 'ᆪ', 'ᄂ' => 'á„‚', 'ï¾¥' => 'ᆬ', 'ᆭ' => 'ᆭ', 'ᄃ' => 'ᄃ', 'ᄄ' => 'á„„', 'ᄅ' => 'á„…', 'ᆰ' => 'ᆰ', 'ᆱ' => 'ᆱ', 'ᆲ' => 'ᆲ', 'ï¾­' => 'ᆳ', 'ï¾®' => 'ᆴ', 'ᆵ' => 'ᆵ', 'ï¾°' => 'á„š', 'ï¾±' => 'ᄆ', 'ï¾²' => 'ᄇ', 'ï¾³' => 'ᄈ', 'ï¾´' => 'á„¡', 'ï¾µ' => 'ᄉ', 'ᄊ' => 'á„Š', 'ï¾·' => 'á„‹', 'ᄌ' => 'á„Œ', 'ï¾¹' => 'á„', 'ᄎ' => 'á„Ž', 'ï¾»' => 'á„', 'ï¾¼' => 'á„', 'ï¾½' => 'á„‘', 'ï¾¾' => 'á„’', 'ï¿‚' => 'á…¡', 'ᅢ' => 'á…¢', 'ï¿„' => 'á…£', 'ï¿…' => 'á…¤', 'ᅥ' => 'á…¥', 'ᅦ' => 'á…¦', 'ï¿Š' => 'á…§', 'ï¿‹' => 'á…¨', 'ï¿Œ' => 'á…©', 'ï¿' => 'á…ª', 'ï¿Ž' => 'á…«', 'ï¿' => 'á…¬', 'ï¿’' => 'á…­', 'ï¿“' => 'á…®', 'ï¿”' => 'á…¯', 'ï¿•' => 'á…°', 'ï¿–' => 'á…±', 'ï¿—' => 'á…²', 'ï¿š' => 'á…³', 'ï¿›' => 'á…´', 'ï¿œ' => 'á…µ', 'ï¿ ' => '¢', 'ï¿¡' => '£', 'ï¿¢' => '¬', 'ï¿£' => ' Ì„', '¦' => '¦', 'ï¿¥' => 'Â¥', '₩' => 'â‚©', '│' => '│', 'ï¿©' => 'â†', '↑' => '↑', 'ï¿«' => '→', '↓' => '↓', 'ï¿­' => 'â– ', 'ï¿®' => 'â—‹', 'ð€' => 'A', 'ð' => 'B', 'ð‚' => 'C', 'ðƒ' => 'D', 'ð„' => 'E', 'ð…' => 'F', 'ð†' => 'G', 'ð‡' => 'H', 'ðˆ' => 'I', 'ð‰' => 'J', 'ðŠ' => 'K', 'ð‹' => 'L', 'ðŒ' => 'M', 'ð' => 'N', 'ðŽ' => 'O', 'ð' => 'P', 'ð' => 'Q', 'ð‘' => 'R', 'ð’' => 'S', 'ð“' => 'T', 'ð”' => 'U', 'ð•' => 'V', 'ð–' => 'W', 'ð—' => 'X', 'ð˜' => 'Y', 'ð™' => 'Z', 'ðš' => 'a', 'ð›' => 'b', 'ðœ' => 'c', 'ð' => 'd', 'ðž' => 'e', 'ðŸ' => 'f', 'ð ' => 'g', 'ð¡' => 'h', 'ð¢' => 'i', 'ð£' => 'j', 'ð¤' => 'k', 'ð¥' => 'l', 'ð¦' => 'm', 'ð§' => 'n', 'ð¨' => 'o', 'ð©' => 'p', 'ðª' => 'q', 'ð«' => 'r', 'ð¬' => 's', 'ð­' => 't', 'ð®' => 'u', 'ð¯' => 'v', 'ð°' => 'w', 'ð±' => 'x', 'ð²' => 'y', 'ð³' => 'z', 'ð´' => 'A', 'ðµ' => 'B', 'ð¶' => 'C', 'ð·' => 'D', 'ð¸' => 'E', 'ð¹' => 'F', 'ðº' => 'G', 'ð»' => 'H', 'ð¼' => 'I', 'ð½' => 'J', 'ð¾' => 'K', 'ð¿' => 'L', 'ð‘€' => 'M', 'ð‘' => 'N', 'ð‘‚' => 'O', 'ð‘ƒ' => 'P', 'ð‘„' => 'Q', 'ð‘…' => 'R', 'ð‘†' => 'S', 'ð‘‡' => 'T', 'ð‘ˆ' => 'U', 'ð‘‰' => 'V', 'ð‘Š' => 'W', 'ð‘‹' => 'X', 'ð‘Œ' => 'Y', 'ð‘' => 'Z', 'ð‘Ž' => 'a', 'ð‘' => 'b', 'ð‘' => 'c', 'ð‘‘' => 'd', 'ð‘’' => 'e', 'ð‘“' => 'f', 'ð‘”' => 'g', 'ð‘–' => 'i', 'ð‘—' => 'j', 'ð‘˜' => 'k', 'ð‘™' => 'l', 'ð‘š' => 'm', 'ð‘›' => 'n', 'ð‘œ' => 'o', 'ð‘' => 'p', 'ð‘ž' => 'q', 'ð‘Ÿ' => 'r', 'ð‘ ' => 's', 'ð‘¡' => 't', 'ð‘¢' => 'u', 'ð‘£' => 'v', 'ð‘¤' => 'w', 'ð‘¥' => 'x', 'ð‘¦' => 'y', 'ð‘§' => 'z', 'ð‘¨' => 'A', 'ð‘©' => 'B', 'ð‘ª' => 'C', 'ð‘«' => 'D', 'ð‘¬' => 'E', 'ð‘­' => 'F', 'ð‘®' => 'G', 'ð‘¯' => 'H', 'ð‘°' => 'I', 'ð‘±' => 'J', 'ð‘²' => 'K', 'ð‘³' => 'L', 'ð‘´' => 'M', 'ð‘µ' => 'N', 'ð‘¶' => 'O', 'ð‘·' => 'P', 'ð‘¸' => 'Q', 'ð‘¹' => 'R', 'ð‘º' => 'S', 'ð‘»' => 'T', 'ð‘¼' => 'U', 'ð‘½' => 'V', 'ð‘¾' => 'W', 'ð‘¿' => 'X', 'ð’€' => 'Y', 'ð’' => 'Z', 'ð’‚' => 'a', 'ð’ƒ' => 'b', 'ð’„' => 'c', 'ð’…' => 'd', 'ð’†' => 'e', 'ð’‡' => 'f', 'ð’ˆ' => 'g', 'ð’‰' => 'h', 'ð’Š' => 'i', 'ð’‹' => 'j', 'ð’Œ' => 'k', 'ð’' => 'l', 'ð’Ž' => 'm', 'ð’' => 'n', 'ð’' => 'o', 'ð’‘' => 'p', 'ð’’' => 'q', 'ð’“' => 'r', 'ð’”' => 's', 'ð’•' => 't', 'ð’–' => 'u', 'ð’—' => 'v', 'ð’˜' => 'w', 'ð’™' => 'x', 'ð’š' => 'y', 'ð’›' => 'z', 'ð’œ' => 'A', 'ð’ž' => 'C', 'ð’Ÿ' => 'D', 'ð’¢' => 'G', 'ð’¥' => 'J', 'ð’¦' => 'K', 'ð’©' => 'N', 'ð’ª' => 'O', 'ð’«' => 'P', 'ð’¬' => 'Q', 'ð’®' => 'S', 'ð’¯' => 'T', 'ð’°' => 'U', 'ð’±' => 'V', 'ð’²' => 'W', 'ð’³' => 'X', 'ð’´' => 'Y', 'ð’µ' => 'Z', 'ð’¶' => 'a', 'ð’·' => 'b', 'ð’¸' => 'c', 'ð’¹' => 'd', 'ð’»' => 'f', 'ð’½' => 'h', 'ð’¾' => 'i', 'ð’¿' => 'j', 'ð“€' => 'k', 'ð“' => 'l', 'ð“‚' => 'm', 'ð“ƒ' => 'n', 'ð“…' => 'p', 'ð“†' => 'q', 'ð“‡' => 'r', 'ð“ˆ' => 's', 'ð“‰' => 't', 'ð“Š' => 'u', 'ð“‹' => 'v', 'ð“Œ' => 'w', 'ð“' => 'x', 'ð“Ž' => 'y', 'ð“' => 'z', 'ð“' => 'A', 'ð“‘' => 'B', 'ð“’' => 'C', 'ð““' => 'D', 'ð“”' => 'E', 'ð“•' => 'F', 'ð“–' => 'G', 'ð“—' => 'H', 'ð“˜' => 'I', 'ð“™' => 'J', 'ð“š' => 'K', 'ð“›' => 'L', 'ð“œ' => 'M', 'ð“' => 'N', 'ð“ž' => 'O', 'ð“Ÿ' => 'P', 'ð“ ' => 'Q', 'ð“¡' => 'R', 'ð“¢' => 'S', 'ð“£' => 'T', 'ð“¤' => 'U', 'ð“¥' => 'V', 'ð“¦' => 'W', 'ð“§' => 'X', 'ð“¨' => 'Y', 'ð“©' => 'Z', 'ð“ª' => 'a', 'ð“«' => 'b', 'ð“¬' => 'c', 'ð“­' => 'd', 'ð“®' => 'e', 'ð“¯' => 'f', 'ð“°' => 'g', 'ð“±' => 'h', 'ð“²' => 'i', 'ð“³' => 'j', 'ð“´' => 'k', 'ð“µ' => 'l', 'ð“¶' => 'm', 'ð“·' => 'n', 'ð“¸' => 'o', 'ð“¹' => 'p', 'ð“º' => 'q', 'ð“»' => 'r', 'ð“¼' => 's', 'ð“½' => 't', 'ð“¾' => 'u', 'ð“¿' => 'v', 'ð”€' => 'w', 'ð”' => 'x', 'ð”‚' => 'y', 'ð”ƒ' => 'z', 'ð”„' => 'A', 'ð”…' => 'B', 'ð”‡' => 'D', 'ð”ˆ' => 'E', 'ð”‰' => 'F', 'ð”Š' => 'G', 'ð”' => 'J', 'ð”Ž' => 'K', 'ð”' => 'L', 'ð”' => 'M', 'ð”‘' => 'N', 'ð”’' => 'O', 'ð”“' => 'P', 'ð””' => 'Q', 'ð”–' => 'S', 'ð”—' => 'T', 'ð”˜' => 'U', 'ð”™' => 'V', 'ð”š' => 'W', 'ð”›' => 'X', 'ð”œ' => 'Y', 'ð”ž' => 'a', 'ð”Ÿ' => 'b', 'ð” ' => 'c', 'ð”¡' => 'd', 'ð”¢' => 'e', 'ð”£' => 'f', 'ð”¤' => 'g', 'ð”¥' => 'h', 'ð”¦' => 'i', 'ð”§' => 'j', 'ð”¨' => 'k', 'ð”©' => 'l', 'ð”ª' => 'm', 'ð”«' => 'n', 'ð”¬' => 'o', 'ð”­' => 'p', 'ð”®' => 'q', 'ð”¯' => 'r', 'ð”°' => 's', 'ð”±' => 't', 'ð”²' => 'u', 'ð”³' => 'v', 'ð”´' => 'w', 'ð”µ' => 'x', 'ð”¶' => 'y', 'ð”·' => 'z', 'ð”¸' => 'A', 'ð”¹' => 'B', 'ð”»' => 'D', 'ð”¼' => 'E', 'ð”½' => 'F', 'ð”¾' => 'G', 'ð•€' => 'I', 'ð•' => 'J', 'ð•‚' => 'K', 'ð•ƒ' => 'L', 'ð•„' => 'M', 'ð•†' => 'O', 'ð•Š' => 'S', 'ð•‹' => 'T', 'ð•Œ' => 'U', 'ð•' => 'V', 'ð•Ž' => 'W', 'ð•' => 'X', 'ð•' => 'Y', 'ð•’' => 'a', 'ð•“' => 'b', 'ð•”' => 'c', 'ð••' => 'd', 'ð•–' => 'e', 'ð•—' => 'f', 'ð•˜' => 'g', 'ð•™' => 'h', 'ð•š' => 'i', 'ð•›' => 'j', 'ð•œ' => 'k', 'ð•' => 'l', 'ð•ž' => 'm', 'ð•Ÿ' => 'n', 'ð• ' => 'o', 'ð•¡' => 'p', 'ð•¢' => 'q', 'ð•£' => 'r', 'ð•¤' => 's', 'ð•¥' => 't', 'ð•¦' => 'u', 'ð•§' => 'v', 'ð•¨' => 'w', 'ð•©' => 'x', 'ð•ª' => 'y', 'ð•«' => 'z', 'ð•¬' => 'A', 'ð•­' => 'B', 'ð•®' => 'C', 'ð•¯' => 'D', 'ð•°' => 'E', 'ð•±' => 'F', 'ð•²' => 'G', 'ð•³' => 'H', 'ð•´' => 'I', 'ð•µ' => 'J', 'ð•¶' => 'K', 'ð•·' => 'L', 'ð•¸' => 'M', 'ð•¹' => 'N', 'ð•º' => 'O', 'ð•»' => 'P', 'ð•¼' => 'Q', 'ð•½' => 'R', 'ð•¾' => 'S', 'ð•¿' => 'T', 'ð–€' => 'U', 'ð–' => 'V', 'ð–‚' => 'W', 'ð–ƒ' => 'X', 'ð–„' => 'Y', 'ð–…' => 'Z', 'ð–†' => 'a', 'ð–‡' => 'b', 'ð–ˆ' => 'c', 'ð–‰' => 'd', 'ð–Š' => 'e', 'ð–‹' => 'f', 'ð–Œ' => 'g', 'ð–' => 'h', 'ð–Ž' => 'i', 'ð–' => 'j', 'ð–' => 'k', 'ð–‘' => 'l', 'ð–’' => 'm', 'ð–“' => 'n', 'ð–”' => 'o', 'ð–•' => 'p', 'ð––' => 'q', 'ð–—' => 'r', 'ð–˜' => 's', 'ð–™' => 't', 'ð–š' => 'u', 'ð–›' => 'v', 'ð–œ' => 'w', 'ð–' => 'x', 'ð–ž' => 'y', 'ð–Ÿ' => 'z', 'ð– ' => 'A', 'ð–¡' => 'B', 'ð–¢' => 'C', 'ð–£' => 'D', 'ð–¤' => 'E', 'ð–¥' => 'F', 'ð–¦' => 'G', 'ð–§' => 'H', 'ð–¨' => 'I', 'ð–©' => 'J', 'ð–ª' => 'K', 'ð–«' => 'L', 'ð–¬' => 'M', 'ð–­' => 'N', 'ð–®' => 'O', 'ð–¯' => 'P', 'ð–°' => 'Q', 'ð–±' => 'R', 'ð–²' => 'S', 'ð–³' => 'T', 'ð–´' => 'U', 'ð–µ' => 'V', 'ð–¶' => 'W', 'ð–·' => 'X', 'ð–¸' => 'Y', 'ð–¹' => 'Z', 'ð–º' => 'a', 'ð–»' => 'b', 'ð–¼' => 'c', 'ð–½' => 'd', 'ð–¾' => 'e', 'ð–¿' => 'f', 'ð—€' => 'g', 'ð—' => 'h', 'ð—‚' => 'i', 'ð—ƒ' => 'j', 'ð—„' => 'k', 'ð—…' => 'l', 'ð—†' => 'm', 'ð—‡' => 'n', 'ð—ˆ' => 'o', 'ð—‰' => 'p', 'ð—Š' => 'q', 'ð—‹' => 'r', 'ð—Œ' => 's', 'ð—' => 't', 'ð—Ž' => 'u', 'ð—' => 'v', 'ð—' => 'w', 'ð—‘' => 'x', 'ð—’' => 'y', 'ð—“' => 'z', 'ð—”' => 'A', 'ð—•' => 'B', 'ð—–' => 'C', 'ð——' => 'D', 'ð—˜' => 'E', 'ð—™' => 'F', 'ð—š' => 'G', 'ð—›' => 'H', 'ð—œ' => 'I', 'ð—' => 'J', 'ð—ž' => 'K', 'ð—Ÿ' => 'L', 'ð— ' => 'M', 'ð—¡' => 'N', 'ð—¢' => 'O', 'ð—£' => 'P', 'ð—¤' => 'Q', 'ð—¥' => 'R', 'ð—¦' => 'S', 'ð—§' => 'T', 'ð—¨' => 'U', 'ð—©' => 'V', 'ð—ª' => 'W', 'ð—«' => 'X', 'ð—¬' => 'Y', 'ð—­' => 'Z', 'ð—®' => 'a', 'ð—¯' => 'b', 'ð—°' => 'c', 'ð—±' => 'd', 'ð—²' => 'e', 'ð—³' => 'f', 'ð—´' => 'g', 'ð—µ' => 'h', 'ð—¶' => 'i', 'ð—·' => 'j', 'ð—¸' => 'k', 'ð—¹' => 'l', 'ð—º' => 'm', 'ð—»' => 'n', 'ð—¼' => 'o', 'ð—½' => 'p', 'ð—¾' => 'q', 'ð—¿' => 'r', 'ð˜€' => 's', 'ð˜' => 't', 'ð˜‚' => 'u', 'ð˜ƒ' => 'v', 'ð˜„' => 'w', 'ð˜…' => 'x', 'ð˜†' => 'y', 'ð˜‡' => 'z', 'ð˜ˆ' => 'A', 'ð˜‰' => 'B', 'ð˜Š' => 'C', 'ð˜‹' => 'D', 'ð˜Œ' => 'E', 'ð˜' => 'F', 'ð˜Ž' => 'G', 'ð˜' => 'H', 'ð˜' => 'I', 'ð˜‘' => 'J', 'ð˜’' => 'K', 'ð˜“' => 'L', 'ð˜”' => 'M', 'ð˜•' => 'N', 'ð˜–' => 'O', 'ð˜—' => 'P', 'ð˜˜' => 'Q', 'ð˜™' => 'R', 'ð˜š' => 'S', 'ð˜›' => 'T', 'ð˜œ' => 'U', 'ð˜' => 'V', 'ð˜ž' => 'W', 'ð˜Ÿ' => 'X', 'ð˜ ' => 'Y', 'ð˜¡' => 'Z', 'ð˜¢' => 'a', 'ð˜£' => 'b', 'ð˜¤' => 'c', 'ð˜¥' => 'd', 'ð˜¦' => 'e', 'ð˜§' => 'f', 'ð˜¨' => 'g', 'ð˜©' => 'h', 'ð˜ª' => 'i', 'ð˜«' => 'j', 'ð˜¬' => 'k', 'ð˜­' => 'l', 'ð˜®' => 'm', 'ð˜¯' => 'n', 'ð˜°' => 'o', 'ð˜±' => 'p', 'ð˜²' => 'q', 'ð˜³' => 'r', 'ð˜´' => 's', 'ð˜µ' => 't', 'ð˜¶' => 'u', 'ð˜·' => 'v', 'ð˜¸' => 'w', 'ð˜¹' => 'x', 'ð˜º' => 'y', 'ð˜»' => 'z', 'ð˜¼' => 'A', 'ð˜½' => 'B', 'ð˜¾' => 'C', 'ð˜¿' => 'D', 'ð™€' => 'E', 'ð™' => 'F', 'ð™‚' => 'G', 'ð™ƒ' => 'H', 'ð™„' => 'I', 'ð™…' => 'J', 'ð™†' => 'K', 'ð™‡' => 'L', 'ð™ˆ' => 'M', 'ð™‰' => 'N', 'ð™Š' => 'O', 'ð™‹' => 'P', 'ð™Œ' => 'Q', 'ð™' => 'R', 'ð™Ž' => 'S', 'ð™' => 'T', 'ð™' => 'U', 'ð™‘' => 'V', 'ð™’' => 'W', 'ð™“' => 'X', 'ð™”' => 'Y', 'ð™•' => 'Z', 'ð™–' => 'a', 'ð™—' => 'b', 'ð™˜' => 'c', 'ð™™' => 'd', 'ð™š' => 'e', 'ð™›' => 'f', 'ð™œ' => 'g', 'ð™' => 'h', 'ð™ž' => 'i', 'ð™Ÿ' => 'j', 'ð™ ' => 'k', 'ð™¡' => 'l', 'ð™¢' => 'm', 'ð™£' => 'n', 'ð™¤' => 'o', 'ð™¥' => 'p', 'ð™¦' => 'q', 'ð™§' => 'r', 'ð™¨' => 's', 'ð™©' => 't', 'ð™ª' => 'u', 'ð™«' => 'v', 'ð™¬' => 'w', 'ð™­' => 'x', 'ð™®' => 'y', 'ð™¯' => 'z', 'ð™°' => 'A', 'ð™±' => 'B', 'ð™²' => 'C', 'ð™³' => 'D', 'ð™´' => 'E', 'ð™µ' => 'F', 'ð™¶' => 'G', 'ð™·' => 'H', 'ð™¸' => 'I', 'ð™¹' => 'J', 'ð™º' => 'K', 'ð™»' => 'L', 'ð™¼' => 'M', 'ð™½' => 'N', 'ð™¾' => 'O', 'ð™¿' => 'P', 'ðš€' => 'Q', 'ðš' => 'R', 'ðš‚' => 'S', 'ðšƒ' => 'T', 'ðš„' => 'U', 'ðš…' => 'V', 'ðš†' => 'W', 'ðš‡' => 'X', 'ðšˆ' => 'Y', 'ðš‰' => 'Z', 'ðšŠ' => 'a', 'ðš‹' => 'b', 'ðšŒ' => 'c', 'ðš' => 'd', 'ðšŽ' => 'e', 'ðš' => 'f', 'ðš' => 'g', 'ðš‘' => 'h', 'ðš’' => 'i', 'ðš“' => 'j', 'ðš”' => 'k', 'ðš•' => 'l', 'ðš–' => 'm', 'ðš—' => 'n', 'ðš˜' => 'o', 'ðš™' => 'p', 'ðšš' => 'q', 'ðš›' => 'r', 'ðšœ' => 's', 'ðš' => 't', 'ðšž' => 'u', 'ðšŸ' => 'v', 'ðš ' => 'w', 'ðš¡' => 'x', 'ðš¢' => 'y', 'ðš£' => 'z', 'ðš¤' => 'ı', 'ðš¥' => 'È·', 'ðš¨' => 'Α', 'ðš©' => 'Î’', 'ðšª' => 'Γ', 'ðš«' => 'Δ', 'ðš¬' => 'Ε', 'ðš­' => 'Ζ', 'ðš®' => 'Η', 'ðš¯' => 'Θ', 'ðš°' => 'Ι', 'ðš±' => 'Κ', 'ðš²' => 'Λ', 'ðš³' => 'Îœ', 'ðš´' => 'Î', 'ðšµ' => 'Ξ', 'ðš¶' => 'Ο', 'ðš·' => 'Π', 'ðš¸' => 'Ρ', 'ðš¹' => 'Θ', 'ðšº' => 'Σ', 'ðš»' => 'Τ', 'ðš¼' => 'Î¥', 'ðš½' => 'Φ', 'ðš¾' => 'Χ', 'ðš¿' => 'Ψ', 'ð›€' => 'Ω', 'ð›' => '∇', 'ð›‚' => 'α', 'ð›ƒ' => 'β', 'ð›„' => 'γ', 'ð›…' => 'δ', 'ð›†' => 'ε', 'ð›‡' => 'ζ', 'ð›ˆ' => 'η', 'ð›‰' => 'θ', 'ð›Š' => 'ι', 'ð›‹' => 'κ', 'ð›Œ' => 'λ', 'ð›' => 'μ', 'ð›Ž' => 'ν', 'ð›' => 'ξ', 'ð›' => 'ο', 'ð›‘' => 'Ï€', 'ð›’' => 'Ï', 'ð›“' => 'Ï‚', 'ð›”' => 'σ', 'ð›•' => 'Ï„', 'ð›–' => 'Ï…', 'ð›—' => 'φ', 'ð›˜' => 'χ', 'ð›™' => 'ψ', 'ð›š' => 'ω', 'ð››' => '∂', 'ð›œ' => 'ε', 'ð›' => 'θ', 'ð›ž' => 'κ', 'ð›Ÿ' => 'φ', 'ð› ' => 'Ï', 'ð›¡' => 'Ï€', 'ð›¢' => 'Α', 'ð›£' => 'Î’', 'ð›¤' => 'Γ', 'ð›¥' => 'Δ', 'ð›¦' => 'Ε', 'ð›§' => 'Ζ', 'ð›¨' => 'Η', 'ð›©' => 'Θ', 'ð›ª' => 'Ι', 'ð›«' => 'Κ', 'ð›¬' => 'Λ', 'ð›­' => 'Îœ', 'ð›®' => 'Î', 'ð›¯' => 'Ξ', 'ð›°' => 'Ο', 'ð›±' => 'Π', 'ð›²' => 'Ρ', 'ð›³' => 'Θ', 'ð›´' => 'Σ', 'ð›µ' => 'Τ', 'ð›¶' => 'Î¥', 'ð›·' => 'Φ', 'ð›¸' => 'Χ', 'ð›¹' => 'Ψ', 'ð›º' => 'Ω', 'ð›»' => '∇', 'ð›¼' => 'α', 'ð›½' => 'β', 'ð›¾' => 'γ', 'ð›¿' => 'δ', 'ðœ€' => 'ε', 'ðœ' => 'ζ', 'ðœ‚' => 'η', 'ðœƒ' => 'θ', 'ðœ„' => 'ι', 'ðœ…' => 'κ', 'ðœ†' => 'λ', 'ðœ‡' => 'μ', 'ðœˆ' => 'ν', 'ðœ‰' => 'ξ', 'ðœŠ' => 'ο', 'ðœ‹' => 'Ï€', 'ðœŒ' => 'Ï', 'ðœ' => 'Ï‚', 'ðœŽ' => 'σ', 'ðœ' => 'Ï„', 'ðœ' => 'Ï…', 'ðœ‘' => 'φ', 'ðœ’' => 'χ', 'ðœ“' => 'ψ', 'ðœ”' => 'ω', 'ðœ•' => '∂', 'ðœ–' => 'ε', 'ðœ—' => 'θ', 'ðœ˜' => 'κ', 'ðœ™' => 'φ', 'ðœš' => 'Ï', 'ðœ›' => 'Ï€', 'ðœœ' => 'Α', 'ðœ' => 'Î’', 'ðœž' => 'Γ', 'ðœŸ' => 'Δ', 'ðœ ' => 'Ε', 'ðœ¡' => 'Ζ', 'ðœ¢' => 'Η', 'ðœ£' => 'Θ', 'ðœ¤' => 'Ι', 'ðœ¥' => 'Κ', 'ðœ¦' => 'Λ', 'ðœ§' => 'Îœ', 'ðœ¨' => 'Î', 'ðœ©' => 'Ξ', 'ðœª' => 'Ο', 'ðœ«' => 'Π', 'ðœ¬' => 'Ρ', 'ðœ­' => 'Θ', 'ðœ®' => 'Σ', 'ðœ¯' => 'Τ', 'ðœ°' => 'Î¥', 'ðœ±' => 'Φ', 'ðœ²' => 'Χ', 'ðœ³' => 'Ψ', 'ðœ´' => 'Ω', 'ðœµ' => '∇', 'ðœ¶' => 'α', 'ðœ·' => 'β', 'ðœ¸' => 'γ', 'ðœ¹' => 'δ', 'ðœº' => 'ε', 'ðœ»' => 'ζ', 'ðœ¼' => 'η', 'ðœ½' => 'θ', 'ðœ¾' => 'ι', 'ðœ¿' => 'κ', 'ð€' => 'λ', 'ð' => 'μ', 'ð‚' => 'ν', 'ðƒ' => 'ξ', 'ð„' => 'ο', 'ð…' => 'Ï€', 'ð†' => 'Ï', 'ð‡' => 'Ï‚', 'ðˆ' => 'σ', 'ð‰' => 'Ï„', 'ðŠ' => 'Ï…', 'ð‹' => 'φ', 'ðŒ' => 'χ', 'ð' => 'ψ', 'ðŽ' => 'ω', 'ð' => '∂', 'ð' => 'ε', 'ð‘' => 'θ', 'ð’' => 'κ', 'ð“' => 'φ', 'ð”' => 'Ï', 'ð•' => 'Ï€', 'ð–' => 'Α', 'ð—' => 'Î’', 'ð˜' => 'Γ', 'ð™' => 'Δ', 'ðš' => 'Ε', 'ð›' => 'Ζ', 'ðœ' => 'Η', 'ð' => 'Θ', 'ðž' => 'Ι', 'ðŸ' => 'Κ', 'ð ' => 'Λ', 'ð¡' => 'Îœ', 'ð¢' => 'Î', 'ð£' => 'Ξ', 'ð¤' => 'Ο', 'ð¥' => 'Π', 'ð¦' => 'Ρ', 'ð§' => 'Θ', 'ð¨' => 'Σ', 'ð©' => 'Τ', 'ðª' => 'Î¥', 'ð«' => 'Φ', 'ð¬' => 'Χ', 'ð­' => 'Ψ', 'ð®' => 'Ω', 'ð¯' => '∇', 'ð°' => 'α', 'ð±' => 'β', 'ð²' => 'γ', 'ð³' => 'δ', 'ð´' => 'ε', 'ðµ' => 'ζ', 'ð¶' => 'η', 'ð·' => 'θ', 'ð¸' => 'ι', 'ð¹' => 'κ', 'ðº' => 'λ', 'ð»' => 'μ', 'ð¼' => 'ν', 'ð½' => 'ξ', 'ð¾' => 'ο', 'ð¿' => 'Ï€', 'ðž€' => 'Ï', 'ðž' => 'Ï‚', 'ðž‚' => 'σ', 'ðžƒ' => 'Ï„', 'ðž„' => 'Ï…', 'ðž…' => 'φ', 'ðž†' => 'χ', 'ðž‡' => 'ψ', 'ðžˆ' => 'ω', 'ðž‰' => '∂', 'ðžŠ' => 'ε', 'ðž‹' => 'θ', 'ðžŒ' => 'κ', 'ðž' => 'φ', 'ðžŽ' => 'Ï', 'ðž' => 'Ï€', 'ðž' => 'Α', 'ðž‘' => 'Î’', 'ðž’' => 'Γ', 'ðž“' => 'Δ', 'ðž”' => 'Ε', 'ðž•' => 'Ζ', 'ðž–' => 'Η', 'ðž—' => 'Θ', 'ðž˜' => 'Ι', 'ðž™' => 'Κ', 'ðžš' => 'Λ', 'ðž›' => 'Îœ', 'ðžœ' => 'Î', 'ðž' => 'Ξ', 'ðžž' => 'Ο', 'ðžŸ' => 'Π', 'ðž ' => 'Ρ', 'ðž¡' => 'Θ', 'ðž¢' => 'Σ', 'ðž£' => 'Τ', 'ðž¤' => 'Î¥', 'ðž¥' => 'Φ', 'ðž¦' => 'Χ', 'ðž§' => 'Ψ', 'ðž¨' => 'Ω', 'ðž©' => '∇', 'ðžª' => 'α', 'ðž«' => 'β', 'ðž¬' => 'γ', 'ðž­' => 'δ', 'ðž®' => 'ε', 'ðž¯' => 'ζ', 'ðž°' => 'η', 'ðž±' => 'θ', 'ðž²' => 'ι', 'ðž³' => 'κ', 'ðž´' => 'λ', 'ðžµ' => 'μ', 'ðž¶' => 'ν', 'ðž·' => 'ξ', 'ðž¸' => 'ο', 'ðž¹' => 'Ï€', 'ðžº' => 'Ï', 'ðž»' => 'Ï‚', 'ðž¼' => 'σ', 'ðž½' => 'Ï„', 'ðž¾' => 'Ï…', 'ðž¿' => 'φ', 'ðŸ€' => 'χ', 'ðŸ' => 'ψ', 'ðŸ‚' => 'ω', 'ðŸƒ' => '∂', 'ðŸ„' => 'ε', 'ðŸ…' => 'θ', 'ðŸ†' => 'κ', 'ðŸ‡' => 'φ', 'ðŸˆ' => 'Ï', 'ðŸ‰' => 'Ï€', 'ðŸŠ' => 'Ïœ', 'ðŸ‹' => 'Ï', 'ðŸŽ' => '0', 'ðŸ' => '1', 'ðŸ' => '2', 'ðŸ‘' => '3', 'ðŸ’' => '4', 'ðŸ“' => '5', 'ðŸ”' => '6', 'ðŸ•' => '7', 'ðŸ–' => '8', 'ðŸ—' => '9', 'ðŸ˜' => '0', 'ðŸ™' => '1', 'ðŸš' => '2', 'ðŸ›' => '3', 'ðŸœ' => '4', 'ðŸ' => '5', 'ðŸž' => '6', 'ðŸŸ' => '7', 'ðŸ ' => '8', 'ðŸ¡' => '9', 'ðŸ¢' => '0', 'ðŸ£' => '1', 'ðŸ¤' => '2', 'ðŸ¥' => '3', 'ðŸ¦' => '4', 'ðŸ§' => '5', 'ðŸ¨' => '6', 'ðŸ©' => '7', 'ðŸª' => '8', 'ðŸ«' => '9', 'ðŸ¬' => '0', 'ðŸ­' => '1', 'ðŸ®' => '2', 'ðŸ¯' => '3', 'ðŸ°' => '4', 'ðŸ±' => '5', 'ðŸ²' => '6', 'ðŸ³' => '7', 'ðŸ´' => '8', 'ðŸµ' => '9', 'ðŸ¶' => '0', 'ðŸ·' => '1', 'ðŸ¸' => '2', 'ðŸ¹' => '3', 'ðŸº' => '4', 'ðŸ»' => '5', 'ðŸ¼' => '6', 'ðŸ½' => '7', 'ðŸ¾' => '8', 'ðŸ¿' => '9', '𞸀' => 'ا', 'ðž¸' => 'ب', '𞸂' => 'ج', '𞸃' => 'د', '𞸅' => 'Ùˆ', '𞸆' => 'ز', '𞸇' => 'Ø­', '𞸈' => 'Ø·', '𞸉' => 'ÙŠ', '𞸊' => 'Ùƒ', '𞸋' => 'Ù„', '𞸌' => 'Ù…', 'ðž¸' => 'Ù†', '𞸎' => 'س', 'ðž¸' => 'ع', 'ðž¸' => 'Ù', '𞸑' => 'ص', '𞸒' => 'Ù‚', '𞸓' => 'ر', '𞸔' => 'Ø´', '𞸕' => 'ت', '𞸖' => 'Ø«', '𞸗' => 'Ø®', '𞸘' => 'Ø°', '𞸙' => 'ض', '𞸚' => 'ظ', '𞸛' => 'غ', '𞸜' => 'Ù®', 'ðž¸' => 'Úº', '𞸞' => 'Ú¡', '𞸟' => 'Ù¯', '𞸡' => 'ب', '𞸢' => 'ج', '𞸤' => 'Ù‡', '𞸧' => 'Ø­', '𞸩' => 'ÙŠ', '𞸪' => 'Ùƒ', '𞸫' => 'Ù„', '𞸬' => 'Ù…', '𞸭' => 'Ù†', '𞸮' => 'س', '𞸯' => 'ع', '𞸰' => 'Ù', '𞸱' => 'ص', '𞸲' => 'Ù‚', '𞸴' => 'Ø´', '𞸵' => 'ت', '𞸶' => 'Ø«', '𞸷' => 'Ø®', '𞸹' => 'ض', '𞸻' => 'غ', '𞹂' => 'ج', '𞹇' => 'Ø­', '𞹉' => 'ÙŠ', '𞹋' => 'Ù„', 'ðž¹' => 'Ù†', '𞹎' => 'س', 'ðž¹' => 'ع', '𞹑' => 'ص', 'ðž¹’' => 'Ù‚', 'ðž¹”' => 'Ø´', 'ðž¹—' => 'Ø®', 'ðž¹™' => 'ض', 'ðž¹›' => 'غ', 'ðž¹' => 'Úº', '𞹟' => 'Ù¯', '𞹡' => 'ب', 'ðž¹¢' => 'ج', '𞹤' => 'Ù‡', '𞹧' => 'Ø­', '𞹨' => 'Ø·', '𞹩' => 'ÙŠ', '𞹪' => 'Ùƒ', '𞹬' => 'Ù…', 'ðž¹­' => 'Ù†', 'ðž¹®' => 'س', '𞹯' => 'ع', 'ðž¹°' => 'Ù', 'ðž¹±' => 'ص', 'ðž¹²' => 'Ù‚', 'ðž¹´' => 'Ø´', 'ðž¹µ' => 'ت', '𞹶' => 'Ø«', 'ðž¹·' => 'Ø®', 'ðž¹¹' => 'ض', '𞹺' => 'ظ', 'ðž¹»' => 'غ', 'ðž¹¼' => 'Ù®', 'ðž¹¾' => 'Ú¡', '𞺀' => 'ا', 'ðžº' => 'ب', '𞺂' => 'ج', '𞺃' => 'د', '𞺄' => 'Ù‡', '𞺅' => 'Ùˆ', '𞺆' => 'ز', '𞺇' => 'Ø­', '𞺈' => 'Ø·', '𞺉' => 'ÙŠ', '𞺋' => 'Ù„', '𞺌' => 'Ù…', 'ðžº' => 'Ù†', '𞺎' => 'س', 'ðžº' => 'ع', 'ðžº' => 'Ù', '𞺑' => 'ص', '𞺒' => 'Ù‚', '𞺓' => 'ر', '𞺔' => 'Ø´', '𞺕' => 'ت', '𞺖' => 'Ø«', '𞺗' => 'Ø®', '𞺘' => 'Ø°', '𞺙' => 'ض', '𞺚' => 'ظ', '𞺛' => 'غ', '𞺡' => 'ب', '𞺢' => 'ج', '𞺣' => 'د', '𞺥' => 'Ùˆ', '𞺦' => 'ز', '𞺧' => 'Ø­', '𞺨' => 'Ø·', '𞺩' => 'ÙŠ', '𞺫' => 'Ù„', '𞺬' => 'Ù…', '𞺭' => 'Ù†', '𞺮' => 'س', '𞺯' => 'ع', '𞺰' => 'Ù', '𞺱' => 'ص', '𞺲' => 'Ù‚', '𞺳' => 'ر', '𞺴' => 'Ø´', '𞺵' => 'ت', '𞺶' => 'Ø«', '𞺷' => 'Ø®', '𞺸' => 'Ø°', '𞺹' => 'ض', '𞺺' => 'ظ', '𞺻' => 'غ', '🄀' => '0.', 'ðŸ„' => '0,', '🄂' => '1,', '🄃' => '2,', '🄄' => '3,', '🄅' => '4,', '🄆' => '5,', '🄇' => '6,', '🄈' => '7,', '🄉' => '8,', '🄊' => '9,', 'ðŸ„' => '(A)', '🄑' => '(B)', '🄒' => '(C)', '🄓' => '(D)', '🄔' => '(E)', '🄕' => '(F)', '🄖' => '(G)', '🄗' => '(H)', '🄘' => '(I)', '🄙' => '(J)', '🄚' => '(K)', '🄛' => '(L)', '🄜' => '(M)', 'ðŸ„' => '(N)', '🄞' => '(O)', '🄟' => '(P)', '🄠' => '(Q)', '🄡' => '(R)', '🄢' => '(S)', '🄣' => '(T)', '🄤' => '(U)', '🄥' => '(V)', '🄦' => '(W)', '🄧' => '(X)', '🄨' => '(Y)', '🄩' => '(Z)', '🄪' => '〔S〕', '🄫' => 'C', '🄬' => 'R', '🄭' => 'CD', '🄮' => 'WZ', '🄰' => 'A', '🄱' => 'B', '🄲' => 'C', '🄳' => 'D', '🄴' => 'E', '🄵' => 'F', '🄶' => 'G', '🄷' => 'H', '🄸' => 'I', '🄹' => 'J', '🄺' => 'K', '🄻' => 'L', '🄼' => 'M', '🄽' => 'N', '🄾' => 'O', '🄿' => 'P', '🅀' => 'Q', 'ðŸ…' => 'R', '🅂' => 'S', '🅃' => 'T', '🅄' => 'U', '🅅' => 'V', '🅆' => 'W', '🅇' => 'X', '🅈' => 'Y', '🅉' => 'Z', '🅊' => 'HV', '🅋' => 'MV', '🅌' => 'SD', 'ðŸ…' => 'SS', '🅎' => 'PPV', 'ðŸ…' => 'WC', '🅪' => 'MC', '🅫' => 'MD', '🅬' => 'MR', 'ðŸ†' => 'DJ', '🈀' => 'ã»ã‹', 'ðŸˆ' => 'ココ', '🈂' => 'サ', 'ðŸˆ' => '手', '🈑' => 'å­—', '🈒' => 'åŒ', '🈓' => 'デ', '🈔' => '二', '🈕' => '多', '🈖' => '解', '🈗' => '天', '🈘' => '交', '🈙' => '映', '🈚' => 'ç„¡', '🈛' => 'æ–™', '🈜' => 'å‰', 'ðŸˆ' => '後', '🈞' => 'å†', '🈟' => 'æ–°', '🈠' => 'åˆ', '🈡' => '終', '🈢' => '生', '🈣' => '販', '🈤' => '声', '🈥' => 'å¹', '🈦' => 'æ¼”', '🈧' => '投', '🈨' => 'æ•', '🈩' => '一', '🈪' => '三', '🈫' => 'éŠ', '🈬' => 'å·¦', '🈭' => '中', '🈮' => 'å³', '🈯' => '指', '🈰' => 'èµ°', '🈱' => '打', '🈲' => 'ç¦', '🈳' => '空', '🈴' => 'åˆ', '🈵' => '満', '🈶' => '有', '🈷' => '月', '🈸' => '申', '🈹' => '割', '🈺' => 'å–¶', '🈻' => 'é…', '🉀' => '〔本〕', 'ðŸ‰' => '〔三〕', '🉂' => '〔二〕', '🉃' => '〔安〕', '🉄' => '〔点〕', '🉅' => '〔打〕', '🉆' => '〔盗〕', '🉇' => '〔å‹ã€•', '🉈' => '〔敗〕', 'ðŸ‰' => 'å¾—', '🉑' => 'å¯', '🯰' => '0', '🯱' => '1', '🯲' => '2', '🯳' => '3', '🯴' => '4', '🯵' => '5', '🯶' => '6', '🯷' => '7', '🯸' => '8', '🯹' => '9'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php000064400000036642147600374260032315 0ustar00addons/gdriveaddon 'À', 'AÌ' => 'Ã', 'AÌ‚' => 'Â', 'Ã' => 'Ã', 'Ä' => 'Ä', 'AÌŠ' => 'Ã…', 'Ç' => 'Ç', 'EÌ€' => 'È', 'EÌ' => 'É', 'EÌ‚' => 'Ê', 'Ë' => 'Ë', 'IÌ€' => 'ÃŒ', 'IÌ' => 'Ã', 'IÌ‚' => 'ÃŽ', 'Ï' => 'Ã', 'Ñ' => 'Ñ', 'OÌ€' => 'Ã’', 'OÌ' => 'Ó', 'OÌ‚' => 'Ô', 'Õ' => 'Õ', 'Ö' => 'Ö', 'UÌ€' => 'Ù', 'UÌ' => 'Ú', 'UÌ‚' => 'Û', 'Ü' => 'Ãœ', 'YÌ' => 'Ã', 'aÌ€' => 'à', 'aÌ' => 'á', 'aÌ‚' => 'â', 'ã' => 'ã', 'ä' => 'ä', 'aÌŠ' => 'Ã¥', 'ç' => 'ç', 'eÌ€' => 'è', 'eÌ' => 'é', 'eÌ‚' => 'ê', 'ë' => 'ë', 'iÌ€' => 'ì', 'iÌ' => 'í', 'iÌ‚' => 'î', 'ï' => 'ï', 'ñ' => 'ñ', 'oÌ€' => 'ò', 'oÌ' => 'ó', 'oÌ‚' => 'ô', 'õ' => 'õ', 'ö' => 'ö', 'uÌ€' => 'ù', 'uÌ' => 'ú', 'uÌ‚' => 'û', 'ü' => 'ü', 'yÌ' => 'ý', 'ÿ' => 'ÿ', 'AÌ„' => 'Ä€', 'aÌ„' => 'Ä', 'Ă' => 'Ä‚', 'ă' => 'ă', 'Ą' => 'Ä„', 'ą' => 'Ä…', 'CÌ' => 'Ć', 'cÌ' => 'ć', 'CÌ‚' => 'Ĉ', 'cÌ‚' => 'ĉ', 'Ċ' => 'ÄŠ', 'ċ' => 'Ä‹', 'CÌŒ' => 'ÄŒ', 'cÌŒ' => 'Ä', 'DÌŒ' => 'ÄŽ', 'dÌŒ' => 'Ä', 'EÌ„' => 'Ä’', 'eÌ„' => 'Ä“', 'Ĕ' => 'Ä”', 'ĕ' => 'Ä•', 'Ė' => 'Ä–', 'ė' => 'Ä—', 'Ę' => 'Ę', 'ę' => 'Ä™', 'EÌŒ' => 'Äš', 'eÌŒ' => 'Ä›', 'GÌ‚' => 'Äœ', 'gÌ‚' => 'Ä', 'Ğ' => 'Äž', 'ğ' => 'ÄŸ', 'Ġ' => 'Ä ', 'ġ' => 'Ä¡', 'Ģ' => 'Ä¢', 'ģ' => 'Ä£', 'HÌ‚' => 'Ĥ', 'hÌ‚' => 'Ä¥', 'Ĩ' => 'Ĩ', 'ĩ' => 'Ä©', 'IÌ„' => 'Ī', 'iÌ„' => 'Ä«', 'Ĭ' => 'Ĭ', 'ĭ' => 'Ä­', 'Į' => 'Ä®', 'į' => 'į', 'İ' => 'Ä°', 'JÌ‚' => 'Ä´', 'jÌ‚' => 'ĵ', 'Ķ' => 'Ķ', 'ķ' => 'Ä·', 'LÌ' => 'Ĺ', 'lÌ' => 'ĺ', 'Ļ' => 'Ä»', 'ļ' => 'ļ', 'LÌŒ' => 'Ľ', 'lÌŒ' => 'ľ', 'NÌ' => 'Ń', 'nÌ' => 'Å„', 'Ņ' => 'Å…', 'ņ' => 'ņ', 'NÌŒ' => 'Ň', 'nÌŒ' => 'ň', 'OÌ„' => 'ÅŒ', 'oÌ„' => 'Å', 'Ŏ' => 'ÅŽ', 'ŏ' => 'Å', 'OÌ‹' => 'Å', 'oÌ‹' => 'Å‘', 'RÌ' => 'Å”', 'rÌ' => 'Å•', 'Ŗ' => 'Å–', 'ŗ' => 'Å—', 'RÌŒ' => 'Ř', 'rÌŒ' => 'Å™', 'SÌ' => 'Åš', 'sÌ' => 'Å›', 'SÌ‚' => 'Åœ', 'sÌ‚' => 'Å', 'Ş' => 'Åž', 'ş' => 'ÅŸ', 'SÌŒ' => 'Å ', 'sÌŒ' => 'Å¡', 'Ţ' => 'Å¢', 'ţ' => 'Å£', 'TÌŒ' => 'Ť', 'tÌŒ' => 'Å¥', 'Ũ' => 'Ũ', 'ũ' => 'Å©', 'UÌ„' => 'Ū', 'uÌ„' => 'Å«', 'Ŭ' => 'Ŭ', 'ŭ' => 'Å­', 'UÌŠ' => 'Å®', 'uÌŠ' => 'ů', 'UÌ‹' => 'Å°', 'uÌ‹' => 'ű', 'Ų' => 'Ų', 'ų' => 'ų', 'WÌ‚' => 'Å´', 'wÌ‚' => 'ŵ', 'YÌ‚' => 'Ŷ', 'yÌ‚' => 'Å·', 'Ÿ' => 'Ÿ', 'ZÌ' => 'Ź', 'zÌ' => 'ź', 'Ż' => 'Å»', 'ż' => 'ż', 'ZÌŒ' => 'Ž', 'zÌŒ' => 'ž', 'OÌ›' => 'Æ ', 'oÌ›' => 'Æ¡', 'UÌ›' => 'Ư', 'uÌ›' => 'Æ°', 'AÌŒ' => 'Ç', 'aÌŒ' => 'ÇŽ', 'IÌŒ' => 'Ç', 'iÌŒ' => 'Ç', 'OÌŒ' => 'Ç‘', 'oÌŒ' => 'Ç’', 'UÌŒ' => 'Ç“', 'uÌŒ' => 'Ç”', 'Ǖ' => 'Ç•', 'ǖ' => 'Ç–', 'ÃœÌ' => 'Ç—', 'üÌ' => 'ǘ', 'Ǚ' => 'Ç™', 'ǚ' => 'Çš', 'Ǜ' => 'Ç›', 'ǜ' => 'Çœ', 'Ǟ' => 'Çž', 'ǟ' => 'ÇŸ', 'Ǡ' => 'Ç ', 'ǡ' => 'Ç¡', 'Ǣ' => 'Ç¢', 'ǣ' => 'Ç£', 'GÌŒ' => 'Ǧ', 'gÌŒ' => 'ǧ', 'KÌŒ' => 'Ǩ', 'kÌŒ' => 'Ç©', 'Ǫ' => 'Ǫ', 'ǫ' => 'Ç«', 'Ǭ' => 'Ǭ', 'Ç«Ì„' => 'Ç­', 'Æ·ÌŒ' => 'Ç®', 'Ê’ÌŒ' => 'ǯ', 'jÌŒ' => 'Ç°', 'GÌ' => 'Ç´', 'gÌ' => 'ǵ', 'NÌ€' => 'Ǹ', 'nÌ€' => 'ǹ', 'Ã…Ì' => 'Ǻ', 'Ã¥Ì' => 'Ç»', 'ÆÌ' => 'Ǽ', 'æÌ' => 'ǽ', 'ØÌ' => 'Ǿ', 'øÌ' => 'Ç¿', 'AÌ' => 'È€', 'aÌ' => 'È', 'AÌ‘' => 'È‚', 'aÌ‘' => 'ȃ', 'EÌ' => 'È„', 'eÌ' => 'È…', 'EÌ‘' => 'Ȇ', 'eÌ‘' => 'ȇ', 'IÌ' => 'Ȉ', 'iÌ' => 'ȉ', 'IÌ‘' => 'ÈŠ', 'iÌ‘' => 'È‹', 'OÌ' => 'ÈŒ', 'oÌ' => 'È', 'OÌ‘' => 'ÈŽ', 'oÌ‘' => 'È', 'RÌ' => 'È', 'rÌ' => 'È‘', 'RÌ‘' => 'È’', 'rÌ‘' => 'È“', 'UÌ' => 'È”', 'uÌ' => 'È•', 'UÌ‘' => 'È–', 'uÌ‘' => 'È—', 'Ș' => 'Ș', 'ș' => 'È™', 'Ț' => 'Èš', 'ț' => 'È›', 'HÌŒ' => 'Èž', 'hÌŒ' => 'ÈŸ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'ȩ' => 'È©', 'Ȫ' => 'Ȫ', 'ȫ' => 'È«', 'Ȭ' => 'Ȭ', 'ȭ' => 'È­', 'Ȯ' => 'È®', 'ȯ' => 'ȯ', 'Ȱ' => 'È°', 'ȱ' => 'ȱ', 'YÌ„' => 'Ȳ', 'yÌ„' => 'ȳ', '¨Ì' => 'Î…', 'ΑÌ' => 'Ά', 'ΕÌ' => 'Έ', 'ΗÌ' => 'Ή', 'ΙÌ' => 'Ί', 'ΟÌ' => 'ÎŒ', 'Î¥Ì' => 'ÎŽ', 'ΩÌ' => 'Î', 'ÏŠÌ' => 'Î', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'αÌ' => 'ά', 'εÌ' => 'έ', 'ηÌ' => 'ή', 'ιÌ' => 'ί', 'Ï‹Ì' => 'ΰ', 'ϊ' => 'ÏŠ', 'ϋ' => 'Ï‹', 'οÌ' => 'ÏŒ', 'Ï…Ì' => 'Ï', 'ωÌ' => 'ÏŽ', 'Ï’Ì' => 'Ï“', 'ϔ' => 'Ï”', 'Ѐ' => 'Ѐ', 'Ё' => 'Ð', 'ГÌ' => 'Ѓ', 'Ї' => 'Ї', 'КÌ' => 'ÐŒ', 'Ѝ' => 'Ð', 'Ў' => 'ÐŽ', 'Й' => 'Й', 'й' => 'й', 'ѐ' => 'Ñ', 'ё' => 'Ñ‘', 'гÌ' => 'Ñ“', 'ї' => 'Ñ—', 'кÌ' => 'Ñœ', 'ѝ' => 'Ñ', 'ў' => 'Ñž', 'Ñ´Ì' => 'Ѷ', 'ѵÌ' => 'Ñ·', 'Ӂ' => 'Ó', 'ӂ' => 'Ó‚', 'Ð̆' => 'Ó', 'ӑ' => 'Ó‘', 'Ð̈' => 'Ó’', 'ӓ' => 'Ó“', 'Ӗ' => 'Ó–', 'ӗ' => 'Ó—', 'Ӛ' => 'Óš', 'ӛ' => 'Ó›', 'Ӝ' => 'Óœ', 'ӝ' => 'Ó', 'Ӟ' => 'Óž', 'ӟ' => 'ÓŸ', 'Ӣ' => 'Ó¢', 'ӣ' => 'Ó£', 'Ӥ' => 'Ó¤', 'ӥ' => 'Ó¥', 'Ӧ' => 'Ó¦', 'ӧ' => 'Ó§', 'Ӫ' => 'Óª', 'ӫ' => 'Ó«', 'Ӭ' => 'Ó¬', 'Ñ̈' => 'Ó­', 'Ӯ' => 'Ó®', 'ӯ' => 'Ó¯', 'Ӱ' => 'Ó°', 'ӱ' => 'Ó±', 'Ӳ' => 'Ó²', 'ӳ' => 'Ó³', 'Ӵ' => 'Ó´', 'ӵ' => 'Óµ', 'Ӹ' => 'Ó¸', 'ӹ' => 'Ó¹', 'آ' => 'Ø¢', 'أ' => 'Ø£', 'ÙˆÙ”' => 'ؤ', 'إ' => 'Ø¥', 'ÙŠÙ”' => 'ئ', 'Û•Ù”' => 'Û€', 'ÛÙ”' => 'Û‚', 'Û’Ù”' => 'Û“', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ୈ' => 'à­ˆ', 'ୋ' => 'à­‹', 'ୌ' => 'à­Œ', 'ஔ' => 'à®”', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'ೀ' => 'à³€', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'ේ' => 'à·š', 'à·™à·' => 'à·œ', 'ෝ' => 'à·', 'ෞ' => 'à·ž', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'á¬á¬µ' => 'ᬎ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'ᭀ' => 'á­€', 'ᭁ' => 'á­', 'ᭃ' => 'á­ƒ', 'AÌ¥' => 'Ḁ', 'aÌ¥' => 'á¸', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'BÌ£' => 'Ḅ', 'bÌ£' => 'ḅ', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'ÇÌ' => 'Ḉ', 'çÌ' => 'ḉ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'DÌ£' => 'Ḍ', 'dÌ£' => 'á¸', 'Ḏ' => 'Ḏ', 'ḏ' => 'á¸', 'Ḑ' => 'á¸', 'ḑ' => 'ḑ', 'DÌ­' => 'Ḓ', 'dÌ­' => 'ḓ', 'Ä’Ì€' => 'Ḕ', 'Ä“Ì€' => 'ḕ', 'Ä’Ì' => 'Ḗ', 'Ä“Ì' => 'ḗ', 'EÌ­' => 'Ḙ', 'eÌ­' => 'ḙ', 'EÌ°' => 'Ḛ', 'eÌ°' => 'ḛ', 'Ḝ' => 'Ḝ', 'ḝ' => 'á¸', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'GÌ„' => 'Ḡ', 'gÌ„' => 'ḡ', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'HÌ£' => 'Ḥ', 'hÌ£' => 'ḥ', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'HÌ®' => 'Ḫ', 'hÌ®' => 'ḫ', 'IÌ°' => 'Ḭ', 'iÌ°' => 'ḭ', 'ÃÌ' => 'Ḯ', 'ïÌ' => 'ḯ', 'KÌ' => 'Ḱ', 'kÌ' => 'ḱ', 'KÌ£' => 'Ḳ', 'kÌ£' => 'ḳ', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'LÌ£' => 'Ḷ', 'lÌ£' => 'ḷ', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'LÌ­' => 'Ḽ', 'lÌ­' => 'ḽ', 'MÌ' => 'Ḿ', 'mÌ' => 'ḿ', 'Ṁ' => 'á¹€', 'ṁ' => 'á¹', 'MÌ£' => 'Ṃ', 'mÌ£' => 'ṃ', 'Ṅ' => 'Ṅ', 'ṅ' => 'á¹…', 'NÌ£' => 'Ṇ', 'nÌ£' => 'ṇ', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'NÌ­' => 'Ṋ', 'nÌ­' => 'ṋ', 'ÕÌ' => 'Ṍ', 'õÌ' => 'á¹', 'Ṏ' => 'Ṏ', 'ṏ' => 'á¹', 'Ṑ' => 'á¹', 'ÅÌ€' => 'ṑ', 'ÅŒÌ' => 'á¹’', 'ÅÌ' => 'ṓ', 'PÌ' => 'á¹”', 'pÌ' => 'ṕ', 'Ṗ' => 'á¹–', 'ṗ' => 'á¹—', 'Ṙ' => 'Ṙ', 'ṙ' => 'á¹™', 'RÌ£' => 'Ṛ', 'rÌ£' => 'á¹›', 'Ṝ' => 'Ṝ', 'ṝ' => 'á¹', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'Ṡ' => 'á¹ ', 'ṡ' => 'ṡ', 'SÌ£' => 'á¹¢', 'sÌ£' => 'á¹£', 'Ṥ' => 'Ṥ', 'ṥ' => 'á¹¥', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'TÌ£' => 'Ṭ', 'tÌ£' => 'á¹­', 'Ṯ' => 'á¹®', 'ṯ' => 'ṯ', 'TÌ­' => 'á¹°', 'tÌ­' => 'á¹±', 'Ṳ' => 'á¹²', 'ṳ' => 'á¹³', 'UÌ°' => 'á¹´', 'uÌ°' => 'á¹µ', 'UÌ­' => 'Ṷ', 'uÌ­' => 'á¹·', 'ŨÌ' => 'Ṹ', 'Å©Ì' => 'á¹¹', 'Ṻ' => 'Ṻ', 'ṻ' => 'á¹»', 'Ṽ' => 'á¹¼', 'ṽ' => 'á¹½', 'VÌ£' => 'á¹¾', 'vÌ£' => 'ṿ', 'WÌ€' => 'Ẁ', 'wÌ€' => 'áº', 'WÌ' => 'Ẃ', 'wÌ' => 'ẃ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'WÌ£' => 'Ẉ', 'wÌ£' => 'ẉ', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'ẍ' => 'áº', 'Ẏ' => 'Ẏ', 'ẏ' => 'áº', 'ZÌ‚' => 'áº', 'zÌ‚' => 'ẑ', 'ZÌ£' => 'Ẓ', 'zÌ£' => 'ẓ', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'wÌŠ' => 'ẘ', 'yÌŠ' => 'ẙ', 'ẛ' => 'ẛ', 'AÌ£' => 'Ạ', 'aÌ£' => 'ạ', 'Ả' => 'Ả', 'ả' => 'ả', 'ÂÌ' => 'Ấ', 'âÌ' => 'ấ', 'Ầ' => 'Ầ', 'ầ' => 'ầ', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ä‚Ì' => 'Ắ', 'ăÌ' => 'ắ', 'Ä‚Ì€' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'EÌ£' => 'Ẹ', 'eÌ£' => 'ẹ', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'ÊÌ' => 'Ế', 'êÌ' => 'ế', 'Ề' => 'Ề', 'ề' => 'á»', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'ễ' => 'á»…', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'IÌ£' => 'Ị', 'iÌ£' => 'ị', 'OÌ£' => 'Ọ', 'oÌ£' => 'á»', 'Ỏ' => 'Ỏ', 'ỏ' => 'á»', 'ÔÌ' => 'á»', 'ôÌ' => 'ố', 'Ồ' => 'á»’', 'ồ' => 'ồ', 'Ổ' => 'á»”', 'ổ' => 'ổ', 'Ỗ' => 'á»–', 'ỗ' => 'á»—', 'Ộ' => 'Ộ', 'á»Ì‚' => 'á»™', 'Æ Ì' => 'Ớ', 'Æ¡Ì' => 'á»›', 'Ờ' => 'Ờ', 'Æ¡Ì€' => 'á»', 'Ở' => 'Ở', 'ở' => 'ở', 'Ỡ' => 'á» ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'Æ¡Ì£' => 'ợ', 'UÌ£' => 'Ụ', 'uÌ£' => 'ụ', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'ƯÌ' => 'Ứ', 'Æ°Ì' => 'ứ', 'Ừ' => 'Ừ', 'Æ°Ì€' => 'ừ', 'Ử' => 'Ử', 'ử' => 'á»­', 'Ữ' => 'á»®', 'ữ' => 'ữ', 'Ự' => 'á»°', 'Æ°Ì£' => 'á»±', 'YÌ€' => 'Ỳ', 'yÌ€' => 'ỳ', 'YÌ£' => 'á»´', 'yÌ£' => 'ỵ', 'Ỷ' => 'Ỷ', 'ỷ' => 'á»·', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'ἀ' => 'á¼€', 'ἁ' => 'á¼', 'ἂ' => 'ἂ', 'á¼Ì€' => 'ἃ', 'á¼€Ì' => 'ἄ', 'á¼Ì' => 'á¼…', 'ἆ' => 'ἆ', 'á¼Í‚' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'ἈÌ' => 'Ἄ', 'ἉÌ' => 'á¼', 'Ἆ' => 'Ἆ', 'Ἇ' => 'á¼', 'ἐ' => 'á¼', 'ἑ' => 'ἑ', 'á¼Ì€' => 'á¼’', 'ἓ' => 'ἓ', 'á¼Ì' => 'á¼”', 'ἑÌ' => 'ἕ', 'Ἐ' => 'Ἐ', 'Ἑ' => 'á¼™', 'Ἒ' => 'Ἒ', 'Ἓ' => 'á¼›', 'ἘÌ' => 'Ἔ', 'á¼™Ì' => 'á¼', 'ἠ' => 'á¼ ', 'ἡ' => 'ἡ', 'ἢ' => 'á¼¢', 'ἣ' => 'á¼£', 'á¼ Ì' => 'ἤ', 'ἡÌ' => 'á¼¥', 'á¼ Í‚' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'ἨÌ' => 'Ἤ', 'ἩÌ' => 'á¼­', 'Ἦ' => 'á¼®', 'Ἧ' => 'Ἧ', 'ἰ' => 'á¼°', 'ἱ' => 'á¼±', 'á¼°Ì€' => 'á¼²', 'ἳ' => 'á¼³', 'á¼°Ì' => 'á¼´', 'á¼±Ì' => 'á¼µ', 'á¼°Í‚' => 'ἶ', 'ἷ' => 'á¼·', 'Ἰ' => 'Ἰ', 'Ἱ' => 'á¼¹', 'Ἲ' => 'Ἲ', 'Ἳ' => 'á¼»', 'ἸÌ' => 'á¼¼', 'á¼¹Ì' => 'á¼½', 'Ἶ' => 'á¼¾', 'Ἷ' => 'Ἷ', 'ὀ' => 'á½€', 'ὁ' => 'á½', 'ὂ' => 'ὂ', 'á½Ì€' => 'ὃ', 'á½€Ì' => 'ὄ', 'á½Ì' => 'á½…', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'ὈÌ' => 'Ὄ', 'ὉÌ' => 'á½', 'Ï…Ì“' => 'á½', 'Ï…Ì”' => 'ὑ', 'á½Ì€' => 'á½’', 'ὓ' => 'ὓ', 'á½Ì' => 'á½”', 'ὑÌ' => 'ὕ', 'á½Í‚' => 'á½–', 'ὗ' => 'á½—', 'Ὑ' => 'á½™', 'Ὓ' => 'á½›', 'á½™Ì' => 'á½', 'Ὗ' => 'Ὗ', 'ὠ' => 'á½ ', 'ὡ' => 'ὡ', 'ὢ' => 'á½¢', 'ὣ' => 'á½£', 'á½ Ì' => 'ὤ', 'ὡÌ' => 'á½¥', 'á½ Í‚' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'ὨÌ' => 'Ὤ', 'ὩÌ' => 'á½­', 'Ὦ' => 'á½®', 'Ὧ' => 'Ὧ', 'ὰ' => 'á½°', 'ὲ' => 'á½²', 'ὴ' => 'á½´', 'ὶ' => 'ὶ', 'ὸ' => 'ὸ', 'Ï…Ì€' => 'ὺ', 'ὼ' => 'á½¼', 'ᾀ' => 'á¾€', 'á¼Í…' => 'á¾', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ᾄ', 'á¼…Í…' => 'á¾…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ᾌ', 'á¼Í…' => 'á¾', 'ᾎ' => 'ᾎ', 'á¼Í…' => 'á¾', 'á¼ Í…' => 'á¾', 'ᾑ' => 'ᾑ', 'ᾒ' => 'á¾’', 'ᾓ' => 'ᾓ', 'ᾔ' => 'á¾”', 'ᾕ' => 'ᾕ', 'ᾖ' => 'á¾–', 'ᾗ' => 'á¾—', 'ᾘ' => 'ᾘ', 'ᾙ' => 'á¾™', 'ᾚ' => 'ᾚ', 'ᾛ' => 'á¾›', 'ᾜ' => 'ᾜ', 'á¼­Í…' => 'á¾', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á½ Í…' => 'á¾ ', 'ᾡ' => 'ᾡ', 'ᾢ' => 'á¾¢', 'ᾣ' => 'á¾£', 'ᾤ' => 'ᾤ', 'ᾥ' => 'á¾¥', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ᾬ', 'á½­Í…' => 'á¾­', 'ᾮ' => 'á¾®', 'ᾯ' => 'ᾯ', 'ᾰ' => 'á¾°', 'ᾱ' => 'á¾±', 'á½°Í…' => 'á¾²', 'ᾳ' => 'á¾³', 'ᾴ' => 'á¾´', 'ᾶ' => 'ᾶ', 'ᾷ' => 'á¾·', 'Ᾰ' => 'Ᾰ', 'Ᾱ' => 'á¾¹', 'Ὰ' => 'Ὰ', 'ᾼ' => 'á¾¼', '῁' => 'á¿', 'á½´Í…' => 'á¿‚', 'ῃ' => 'ῃ', 'ῄ' => 'á¿„', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Ὴ' => 'á¿Š', 'ῌ' => 'á¿Œ', '῍' => 'á¿', '᾿Ì' => 'á¿Ž', '῏' => 'á¿', 'ῐ' => 'á¿', 'ῑ' => 'á¿‘', 'ÏŠÌ€' => 'á¿’', 'ῖ' => 'á¿–', 'ÏŠÍ‚' => 'á¿—', 'Ῐ' => 'Ῐ', 'Ῑ' => 'á¿™', 'Ὶ' => 'á¿š', '῝' => 'á¿', '῾Ì' => 'á¿ž', '῟' => 'á¿Ÿ', 'ῠ' => 'á¿ ', 'Ï…Ì„' => 'á¿¡', 'Ï‹Ì€' => 'á¿¢', 'ÏÌ“' => 'ῤ', 'ÏÌ”' => 'á¿¥', 'Ï…Í‚' => 'ῦ', 'Ï‹Í‚' => 'ῧ', 'Ῠ' => 'Ῠ', 'Ῡ' => 'á¿©', 'Ὺ' => 'Ὺ', 'Ῥ' => 'Ῥ', '῭' => 'á¿­', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'ÏŽÍ…' => 'á¿´', 'ῶ' => 'ῶ', 'ῷ' => 'á¿·', 'Ὸ' => 'Ὸ', 'Ὼ' => 'Ὼ', 'ῼ' => 'ῼ', 'â†Ì¸' => '↚', '↛' => '↛', '↮' => '↮', 'â‡Ì¸' => 'â‡', '⇎' => '⇎', '⇏' => 'â‡', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', '≁' => 'â‰', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', 'â‰Ì¸' => '≭', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', '⊁' => 'âŠ', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', '⋠' => 'â‹ ', '⋡' => 'â‹¡', '⋢' => 'â‹¢', '⋣' => 'â‹£', '⋪' => '⋪', '⋫' => 'â‹«', '⋬' => '⋬', '⋭' => 'â‹­', 'ã‹ã‚™' => 'ãŒ', 'ãã‚™' => 'ãŽ', 'ãã‚™' => 'ã', 'ã‘ã‚™' => 'ã’', 'ã“ã‚™' => 'ã”', 'ã•ã‚™' => 'ã–', 'ã—ã‚™' => 'ã˜', 'ã™ã‚™' => 'ãš', 'ã›ã‚™' => 'ãœ', 'ãã‚™' => 'ãž', 'ãŸã‚™' => 'ã ', 'ã¡ã‚™' => 'ã¢', 'ã¤ã‚™' => 'ã¥', 'ã¦ã‚™' => 'ã§', 'ã¨ã‚™' => 'ã©', 'ã¯ã‚™' => 'ã°', 'ã¯ã‚š' => 'ã±', 'ã²ã‚™' => 'ã³', 'ã²ã‚š' => 'ã´', 'ãµã‚™' => 'ã¶', 'ãµã‚š' => 'ã·', 'ã¸ã‚™' => 'ã¹', 'ã¸ã‚š' => 'ãº', 'ã»ã‚™' => 'ã¼', 'ã»ã‚š' => 'ã½', 'ã†ã‚™' => 'ã‚”', 'ã‚ã‚™' => 'ã‚ž', 'ã‚«ã‚™' => 'ガ', 'ã‚­ã‚™' => 'ã‚®', 'グ' => 'ã‚°', 'ゲ' => 'ゲ', 'ゴ' => 'ã‚´', 'ザ' => 'ザ', 'ã‚·ã‚™' => 'ジ', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ã‚¿ã‚™' => 'ダ', 'ãƒã‚™' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒã‚™' => 'ãƒ', 'ãƒã‚š' => 'パ', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ポ' => 'ãƒ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '𑂚' => 'ð‘‚š', '𑂜' => 'ð‘‚œ', '𑂫' => 'ð‘‚«', '𑄮' => 'ð‘„®', '𑄯' => '𑄯', 'ð‘‡ð‘Œ¾' => 'ð‘‹', 'ð‘‡ð‘—' => 'ð‘Œ', '𑒻' => 'ð‘’»', '𑒼' => 'ð‘’¼', '𑒾' => 'ð‘’¾', '𑖺' => 'ð‘–º', '𑖻' => 'ð‘–»', '𑤸' => '𑤸'); vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php000064400000104172147600374260032620 0ustar00addons/gdriveaddon 'AÌ€', 'Ã' => 'AÌ', 'Â' => 'AÌ‚', 'Ã' => 'Ã', 'Ä' => 'Ä', 'Ã…' => 'AÌŠ', 'Ç' => 'Ç', 'È' => 'EÌ€', 'É' => 'EÌ', 'Ê' => 'EÌ‚', 'Ë' => 'Ë', 'ÃŒ' => 'IÌ€', 'Ã' => 'IÌ', 'ÃŽ' => 'IÌ‚', 'Ã' => 'Ï', 'Ñ' => 'Ñ', 'Ã’' => 'OÌ€', 'Ó' => 'OÌ', 'Ô' => 'OÌ‚', 'Õ' => 'Õ', 'Ö' => 'Ö', 'Ù' => 'UÌ€', 'Ú' => 'UÌ', 'Û' => 'UÌ‚', 'Ãœ' => 'Ü', 'Ã' => 'YÌ', 'à' => 'aÌ€', 'á' => 'aÌ', 'â' => 'aÌ‚', 'ã' => 'ã', 'ä' => 'ä', 'Ã¥' => 'aÌŠ', 'ç' => 'ç', 'è' => 'eÌ€', 'é' => 'eÌ', 'ê' => 'eÌ‚', 'ë' => 'ë', 'ì' => 'iÌ€', 'í' => 'iÌ', 'î' => 'iÌ‚', 'ï' => 'ï', 'ñ' => 'ñ', 'ò' => 'oÌ€', 'ó' => 'oÌ', 'ô' => 'oÌ‚', 'õ' => 'õ', 'ö' => 'ö', 'ù' => 'uÌ€', 'ú' => 'uÌ', 'û' => 'uÌ‚', 'ü' => 'ü', 'ý' => 'yÌ', 'ÿ' => 'ÿ', 'Ä€' => 'AÌ„', 'Ä' => 'aÌ„', 'Ä‚' => 'Ă', 'ă' => 'ă', 'Ä„' => 'Ą', 'Ä…' => 'ą', 'Ć' => 'CÌ', 'ć' => 'cÌ', 'Ĉ' => 'CÌ‚', 'ĉ' => 'cÌ‚', 'ÄŠ' => 'Ċ', 'Ä‹' => 'ċ', 'ÄŒ' => 'CÌŒ', 'Ä' => 'cÌŒ', 'ÄŽ' => 'DÌŒ', 'Ä' => 'dÌŒ', 'Ä’' => 'EÌ„', 'Ä“' => 'eÌ„', 'Ä”' => 'Ĕ', 'Ä•' => 'ĕ', 'Ä–' => 'Ė', 'Ä—' => 'ė', 'Ę' => 'Ę', 'Ä™' => 'ę', 'Äš' => 'EÌŒ', 'Ä›' => 'eÌŒ', 'Äœ' => 'GÌ‚', 'Ä' => 'gÌ‚', 'Äž' => 'Ğ', 'ÄŸ' => 'ğ', 'Ä ' => 'Ġ', 'Ä¡' => 'ġ', 'Ä¢' => 'Ģ', 'Ä£' => 'ģ', 'Ĥ' => 'HÌ‚', 'Ä¥' => 'hÌ‚', 'Ĩ' => 'Ĩ', 'Ä©' => 'ĩ', 'Ī' => 'IÌ„', 'Ä«' => 'iÌ„', 'Ĭ' => 'Ĭ', 'Ä­' => 'ĭ', 'Ä®' => 'Į', 'į' => 'į', 'Ä°' => 'İ', 'Ä´' => 'JÌ‚', 'ĵ' => 'jÌ‚', 'Ķ' => 'Ķ', 'Ä·' => 'ķ', 'Ĺ' => 'LÌ', 'ĺ' => 'lÌ', 'Ä»' => 'Ļ', 'ļ' => 'ļ', 'Ľ' => 'LÌŒ', 'ľ' => 'lÌŒ', 'Ń' => 'NÌ', 'Å„' => 'nÌ', 'Å…' => 'Ņ', 'ņ' => 'ņ', 'Ň' => 'NÌŒ', 'ň' => 'nÌŒ', 'ÅŒ' => 'OÌ„', 'Å' => 'oÌ„', 'ÅŽ' => 'Ŏ', 'Å' => 'ŏ', 'Å' => 'OÌ‹', 'Å‘' => 'oÌ‹', 'Å”' => 'RÌ', 'Å•' => 'rÌ', 'Å–' => 'Ŗ', 'Å—' => 'ŗ', 'Ř' => 'RÌŒ', 'Å™' => 'rÌŒ', 'Åš' => 'SÌ', 'Å›' => 'sÌ', 'Åœ' => 'SÌ‚', 'Å' => 'sÌ‚', 'Åž' => 'Ş', 'ÅŸ' => 'ş', 'Å ' => 'SÌŒ', 'Å¡' => 'sÌŒ', 'Å¢' => 'Ţ', 'Å£' => 'ţ', 'Ť' => 'TÌŒ', 'Å¥' => 'tÌŒ', 'Ũ' => 'Ũ', 'Å©' => 'ũ', 'Ū' => 'UÌ„', 'Å«' => 'uÌ„', 'Ŭ' => 'Ŭ', 'Å­' => 'ŭ', 'Å®' => 'UÌŠ', 'ů' => 'uÌŠ', 'Å°' => 'UÌ‹', 'ű' => 'uÌ‹', 'Ų' => 'Ų', 'ų' => 'ų', 'Å´' => 'WÌ‚', 'ŵ' => 'wÌ‚', 'Ŷ' => 'YÌ‚', 'Å·' => 'yÌ‚', 'Ÿ' => 'Ÿ', 'Ź' => 'ZÌ', 'ź' => 'zÌ', 'Å»' => 'Ż', 'ż' => 'ż', 'Ž' => 'ZÌŒ', 'ž' => 'zÌŒ', 'Æ ' => 'OÌ›', 'Æ¡' => 'oÌ›', 'Ư' => 'UÌ›', 'Æ°' => 'uÌ›', 'Ç' => 'AÌŒ', 'ÇŽ' => 'aÌŒ', 'Ç' => 'IÌŒ', 'Ç' => 'iÌŒ', 'Ç‘' => 'OÌŒ', 'Ç’' => 'oÌŒ', 'Ç“' => 'UÌŒ', 'Ç”' => 'uÌŒ', 'Ç•' => 'Ǖ', 'Ç–' => 'ǖ', 'Ç—' => 'ÜÌ', 'ǘ' => 'üÌ', 'Ç™' => 'Ǚ', 'Çš' => 'ǚ', 'Ç›' => 'Ǜ', 'Çœ' => 'ǜ', 'Çž' => 'Ǟ', 'ÇŸ' => 'ǟ', 'Ç ' => 'Ǡ', 'Ç¡' => 'ǡ', 'Ç¢' => 'Ǣ', 'Ç£' => 'ǣ', 'Ǧ' => 'GÌŒ', 'ǧ' => 'gÌŒ', 'Ǩ' => 'KÌŒ', 'Ç©' => 'kÌŒ', 'Ǫ' => 'Ǫ', 'Ç«' => 'ǫ', 'Ǭ' => 'Ǭ', 'Ç­' => 'ǭ', 'Ç®' => 'Æ·ÌŒ', 'ǯ' => 'Ê’ÌŒ', 'Ç°' => 'jÌŒ', 'Ç´' => 'GÌ', 'ǵ' => 'gÌ', 'Ǹ' => 'NÌ€', 'ǹ' => 'nÌ€', 'Ǻ' => 'AÌŠÌ', 'Ç»' => 'aÌŠÌ', 'Ǽ' => 'ÆÌ', 'ǽ' => 'æÌ', 'Ǿ' => 'ØÌ', 'Ç¿' => 'øÌ', 'È€' => 'AÌ', 'È' => 'aÌ', 'È‚' => 'AÌ‘', 'ȃ' => 'aÌ‘', 'È„' => 'EÌ', 'È…' => 'eÌ', 'Ȇ' => 'EÌ‘', 'ȇ' => 'eÌ‘', 'Ȉ' => 'IÌ', 'ȉ' => 'iÌ', 'ÈŠ' => 'IÌ‘', 'È‹' => 'iÌ‘', 'ÈŒ' => 'OÌ', 'È' => 'oÌ', 'ÈŽ' => 'OÌ‘', 'È' => 'oÌ‘', 'È' => 'RÌ', 'È‘' => 'rÌ', 'È’' => 'RÌ‘', 'È“' => 'rÌ‘', 'È”' => 'UÌ', 'È•' => 'uÌ', 'È–' => 'UÌ‘', 'È—' => 'uÌ‘', 'Ș' => 'Ș', 'È™' => 'ș', 'Èš' => 'Ț', 'È›' => 'ț', 'Èž' => 'HÌŒ', 'ÈŸ' => 'hÌŒ', 'Ȧ' => 'Ȧ', 'ȧ' => 'ȧ', 'Ȩ' => 'Ȩ', 'È©' => 'ȩ', 'Ȫ' => 'Ȫ', 'È«' => 'ȫ', 'Ȭ' => 'Ȭ', 'È­' => 'ȭ', 'È®' => 'Ȯ', 'ȯ' => 'ȯ', 'È°' => 'Ȱ', 'ȱ' => 'ȱ', 'Ȳ' => 'YÌ„', 'ȳ' => 'yÌ„', 'Í€' => 'Ì€', 'Í' => 'Ì', '̓' => 'Ì“', 'Í„' => '̈Ì', 'Í´' => 'ʹ', ';' => ';', 'Î…' => '¨Ì', 'Ά' => 'ΑÌ', '·' => '·', 'Έ' => 'ΕÌ', 'Ή' => 'ΗÌ', 'Ί' => 'ΙÌ', 'ÎŒ' => 'ΟÌ', 'ÎŽ' => 'Î¥Ì', 'Î' => 'ΩÌ', 'Î' => 'ϊÌ', 'Ϊ' => 'Ϊ', 'Ϋ' => 'Ϋ', 'ά' => 'αÌ', 'έ' => 'εÌ', 'ή' => 'ηÌ', 'ί' => 'ιÌ', 'ΰ' => 'ϋÌ', 'ÏŠ' => 'ϊ', 'Ï‹' => 'ϋ', 'ÏŒ' => 'οÌ', 'Ï' => 'Ï…Ì', 'ÏŽ' => 'ωÌ', 'Ï“' => 'Ï’Ì', 'Ï”' => 'ϔ', 'Ѐ' => 'Ѐ', 'Ð' => 'Ё', 'Ѓ' => 'ГÌ', 'Ї' => 'Ї', 'ÐŒ' => 'КÌ', 'Ð' => 'Ѝ', 'ÐŽ' => 'Ў', 'Й' => 'Й', 'й' => 'й', 'Ñ' => 'ѐ', 'Ñ‘' => 'ё', 'Ñ“' => 'гÌ', 'Ñ—' => 'ї', 'Ñœ' => 'кÌ', 'Ñ' => 'ѝ', 'Ñž' => 'ў', 'Ѷ' => 'Ñ´Ì', 'Ñ·' => 'ѵÌ', 'Ó' => 'Ӂ', 'Ó‚' => 'ӂ', 'Ó' => 'Ð̆', 'Ó‘' => 'ӑ', 'Ó’' => 'Ð̈', 'Ó“' => 'ӓ', 'Ó–' => 'Ӗ', 'Ó—' => 'ӗ', 'Óš' => 'Ӛ', 'Ó›' => 'ӛ', 'Óœ' => 'Ӝ', 'Ó' => 'ӝ', 'Óž' => 'Ӟ', 'ÓŸ' => 'ӟ', 'Ó¢' => 'Ӣ', 'Ó£' => 'ӣ', 'Ó¤' => 'Ӥ', 'Ó¥' => 'ӥ', 'Ó¦' => 'Ӧ', 'Ó§' => 'ӧ', 'Óª' => 'Ӫ', 'Ó«' => 'ӫ', 'Ó¬' => 'Ӭ', 'Ó­' => 'Ñ̈', 'Ó®' => 'Ӯ', 'Ó¯' => 'ӯ', 'Ó°' => 'Ӱ', 'Ó±' => 'ӱ', 'Ó²' => 'Ӳ', 'Ó³' => 'ӳ', 'Ó´' => 'Ӵ', 'Óµ' => 'ӵ', 'Ó¸' => 'Ӹ', 'Ó¹' => 'ӹ', 'Ø¢' => 'آ', 'Ø£' => 'أ', 'ؤ' => 'ÙˆÙ”', 'Ø¥' => 'إ', 'ئ' => 'ÙŠÙ”', 'Û€' => 'Û•Ù”', 'Û‚' => 'ÛÙ”', 'Û“' => 'Û’Ù”', 'ऩ' => 'ऩ', 'ऱ' => 'ऱ', 'ऴ' => 'ऴ', 'क़' => 'क़', 'ख़' => 'ख़', 'ग़' => 'ग़', 'ज़' => 'ज़', 'ड़' => 'ड़', 'à¥' => 'ढ़', 'फ़' => 'फ़', 'य़' => 'य़', 'ো' => 'ো', 'ৌ' => 'ৌ', 'ড়' => 'ড়', 'à§' => 'ঢ়', 'য়' => 'য়', 'ਲ਼' => 'ਲ਼', 'ਸ਼' => 'ਸ਼', 'à©™' => 'ਖ਼', 'à©š' => 'ਗ਼', 'à©›' => 'ਜ਼', 'à©ž' => 'ਫ਼', 'à­ˆ' => 'ୈ', 'à­‹' => 'ୋ', 'à­Œ' => 'ୌ', 'à­œ' => 'ଡ଼', 'à­' => 'ଢ଼', 'à®”' => 'ஔ', 'ொ' => 'ொ', 'ோ' => 'ோ', 'ௌ' => 'ௌ', 'ై' => 'ై', 'à³€' => 'ೀ', 'ೇ' => 'ೇ', 'ೈ' => 'ೈ', 'ೊ' => 'ೊ', 'ೋ' => 'ೋ', 'ൊ' => 'ൊ', 'ോ' => 'ോ', 'ൌ' => 'ൌ', 'à·š' => 'ේ', 'à·œ' => 'à·™à·', 'à·' => 'à·™à·à·Š', 'à·ž' => 'ෞ', 'གྷ' => 'གྷ', 'à½' => 'ཌྷ', 'དྷ' => 'དྷ', 'བྷ' => 'བྷ', 'ཛྷ' => 'ཛྷ', 'ཀྵ' => 'ཀྵ', 'ཱི' => 'ཱི', 'ཱུ' => 'ཱུ', 'ྲྀ' => 'ྲྀ', 'ླྀ' => 'ླྀ', 'à¾' => 'ཱྀ', 'ྒྷ' => 'ྒྷ', 'à¾' => 'ྜྷ', 'ྡྷ' => 'ྡྷ', 'ྦྷ' => 'ྦྷ', 'ྫྷ' => 'ྫྷ', 'ྐྵ' => 'à¾à¾µ', 'ဦ' => 'ဦ', 'ᬆ' => 'ᬆ', 'ᬈ' => 'ᬈ', 'ᬊ' => 'ᬊ', 'ᬌ' => 'ᬌ', 'ᬎ' => 'á¬á¬µ', 'ᬒ' => 'ᬒ', 'ᬻ' => 'ᬻ', 'ᬽ' => 'ᬽ', 'á­€' => 'ᭀ', 'á­' => 'ᭁ', 'á­ƒ' => 'ᭃ', 'Ḁ' => 'AÌ¥', 'á¸' => 'aÌ¥', 'Ḃ' => 'Ḃ', 'ḃ' => 'ḃ', 'Ḅ' => 'BÌ£', 'ḅ' => 'bÌ£', 'Ḇ' => 'Ḇ', 'ḇ' => 'ḇ', 'Ḉ' => 'ÇÌ', 'ḉ' => 'çÌ', 'Ḋ' => 'Ḋ', 'ḋ' => 'ḋ', 'Ḍ' => 'DÌ£', 'á¸' => 'dÌ£', 'Ḏ' => 'Ḏ', 'á¸' => 'ḏ', 'á¸' => 'Ḑ', 'ḑ' => 'ḑ', 'Ḓ' => 'DÌ­', 'ḓ' => 'dÌ­', 'Ḕ' => 'EÌ„Ì€', 'ḕ' => 'eÌ„Ì€', 'Ḗ' => 'EÌ„Ì', 'ḗ' => 'eÌ„Ì', 'Ḙ' => 'EÌ­', 'ḙ' => 'eÌ­', 'Ḛ' => 'EÌ°', 'ḛ' => 'eÌ°', 'Ḝ' => 'Ḝ', 'á¸' => 'ḝ', 'Ḟ' => 'Ḟ', 'ḟ' => 'ḟ', 'Ḡ' => 'GÌ„', 'ḡ' => 'gÌ„', 'Ḣ' => 'Ḣ', 'ḣ' => 'ḣ', 'Ḥ' => 'HÌ£', 'ḥ' => 'hÌ£', 'Ḧ' => 'Ḧ', 'ḧ' => 'ḧ', 'Ḩ' => 'Ḩ', 'ḩ' => 'ḩ', 'Ḫ' => 'HÌ®', 'ḫ' => 'hÌ®', 'Ḭ' => 'IÌ°', 'ḭ' => 'iÌ°', 'Ḯ' => 'ÏÌ', 'ḯ' => 'ïÌ', 'Ḱ' => 'KÌ', 'ḱ' => 'kÌ', 'Ḳ' => 'KÌ£', 'ḳ' => 'kÌ£', 'Ḵ' => 'Ḵ', 'ḵ' => 'ḵ', 'Ḷ' => 'LÌ£', 'ḷ' => 'lÌ£', 'Ḹ' => 'Ḹ', 'ḹ' => 'ḹ', 'Ḻ' => 'Ḻ', 'ḻ' => 'ḻ', 'Ḽ' => 'LÌ­', 'ḽ' => 'lÌ­', 'Ḿ' => 'MÌ', 'ḿ' => 'mÌ', 'á¹€' => 'Ṁ', 'á¹' => 'ṁ', 'Ṃ' => 'MÌ£', 'ṃ' => 'mÌ£', 'Ṅ' => 'Ṅ', 'á¹…' => 'ṅ', 'Ṇ' => 'NÌ£', 'ṇ' => 'nÌ£', 'Ṉ' => 'Ṉ', 'ṉ' => 'ṉ', 'Ṋ' => 'NÌ­', 'ṋ' => 'nÌ­', 'Ṍ' => 'ÕÌ', 'á¹' => 'õÌ', 'Ṏ' => 'Ṏ', 'á¹' => 'ṏ', 'á¹' => 'OÌ„Ì€', 'ṑ' => 'oÌ„Ì€', 'á¹’' => 'OÌ„Ì', 'ṓ' => 'oÌ„Ì', 'á¹”' => 'PÌ', 'ṕ' => 'pÌ', 'á¹–' => 'Ṗ', 'á¹—' => 'ṗ', 'Ṙ' => 'Ṙ', 'á¹™' => 'ṙ', 'Ṛ' => 'RÌ£', 'á¹›' => 'rÌ£', 'Ṝ' => 'Ṝ', 'á¹' => 'ṝ', 'Ṟ' => 'Ṟ', 'ṟ' => 'ṟ', 'á¹ ' => 'Ṡ', 'ṡ' => 'ṡ', 'á¹¢' => 'SÌ£', 'á¹£' => 'sÌ£', 'Ṥ' => 'SÌ̇', 'á¹¥' => 'sÌ̇', 'Ṧ' => 'Ṧ', 'ṧ' => 'ṧ', 'Ṩ' => 'Ṩ', 'ṩ' => 'ṩ', 'Ṫ' => 'Ṫ', 'ṫ' => 'ṫ', 'Ṭ' => 'TÌ£', 'á¹­' => 'tÌ£', 'á¹®' => 'Ṯ', 'ṯ' => 'ṯ', 'á¹°' => 'TÌ­', 'á¹±' => 'tÌ­', 'á¹²' => 'Ṳ', 'á¹³' => 'ṳ', 'á¹´' => 'UÌ°', 'á¹µ' => 'uÌ°', 'Ṷ' => 'UÌ­', 'á¹·' => 'uÌ­', 'Ṹ' => 'ŨÌ', 'á¹¹' => 'ũÌ', 'Ṻ' => 'Ṻ', 'á¹»' => 'ṻ', 'á¹¼' => 'Ṽ', 'á¹½' => 'ṽ', 'á¹¾' => 'VÌ£', 'ṿ' => 'vÌ£', 'Ẁ' => 'WÌ€', 'áº' => 'wÌ€', 'Ẃ' => 'WÌ', 'ẃ' => 'wÌ', 'Ẅ' => 'Ẅ', 'ẅ' => 'ẅ', 'Ẇ' => 'Ẇ', 'ẇ' => 'ẇ', 'Ẉ' => 'WÌ£', 'ẉ' => 'wÌ£', 'Ẋ' => 'Ẋ', 'ẋ' => 'ẋ', 'Ẍ' => 'Ẍ', 'áº' => 'ẍ', 'Ẏ' => 'Ẏ', 'áº' => 'ẏ', 'áº' => 'ZÌ‚', 'ẑ' => 'zÌ‚', 'Ẓ' => 'ZÌ£', 'ẓ' => 'zÌ£', 'Ẕ' => 'Ẕ', 'ẕ' => 'ẕ', 'ẖ' => 'ẖ', 'ẗ' => 'ẗ', 'ẘ' => 'wÌŠ', 'ẙ' => 'yÌŠ', 'ẛ' => 'ẛ', 'Ạ' => 'AÌ£', 'ạ' => 'aÌ£', 'Ả' => 'Ả', 'ả' => 'ả', 'Ấ' => 'AÌ‚Ì', 'ấ' => 'aÌ‚Ì', 'Ầ' => 'AÌ‚Ì€', 'ầ' => 'aÌ‚Ì€', 'Ẩ' => 'Ẩ', 'ẩ' => 'ẩ', 'Ẫ' => 'Ẫ', 'ẫ' => 'ẫ', 'Ậ' => 'Ậ', 'ậ' => 'ậ', 'Ắ' => 'ĂÌ', 'ắ' => 'ăÌ', 'Ằ' => 'Ằ', 'ằ' => 'ằ', 'Ẳ' => 'Ẳ', 'ẳ' => 'ẳ', 'Ẵ' => 'Ẵ', 'ẵ' => 'ẵ', 'Ặ' => 'Ặ', 'ặ' => 'ặ', 'Ẹ' => 'EÌ£', 'ẹ' => 'eÌ£', 'Ẻ' => 'Ẻ', 'ẻ' => 'ẻ', 'Ẽ' => 'Ẽ', 'ẽ' => 'ẽ', 'Ế' => 'EÌ‚Ì', 'ế' => 'eÌ‚Ì', 'Ề' => 'EÌ‚Ì€', 'á»' => 'eÌ‚Ì€', 'Ể' => 'Ể', 'ể' => 'ể', 'Ễ' => 'Ễ', 'á»…' => 'ễ', 'Ệ' => 'Ệ', 'ệ' => 'ệ', 'Ỉ' => 'Ỉ', 'ỉ' => 'ỉ', 'Ị' => 'IÌ£', 'ị' => 'iÌ£', 'Ọ' => 'OÌ£', 'á»' => 'oÌ£', 'Ỏ' => 'Ỏ', 'á»' => 'ỏ', 'á»' => 'OÌ‚Ì', 'ố' => 'oÌ‚Ì', 'á»’' => 'OÌ‚Ì€', 'ồ' => 'oÌ‚Ì€', 'á»”' => 'Ổ', 'ổ' => 'ổ', 'á»–' => 'Ỗ', 'á»—' => 'ỗ', 'Ộ' => 'Ộ', 'á»™' => 'ộ', 'Ớ' => 'OÌ›Ì', 'á»›' => 'oÌ›Ì', 'Ờ' => 'Ờ', 'á»' => 'ờ', 'Ở' => 'Ở', 'ở' => 'ở', 'á» ' => 'Ỡ', 'ỡ' => 'ỡ', 'Ợ' => 'Ợ', 'ợ' => 'ợ', 'Ụ' => 'UÌ£', 'ụ' => 'uÌ£', 'Ủ' => 'Ủ', 'ủ' => 'ủ', 'Ứ' => 'UÌ›Ì', 'ứ' => 'uÌ›Ì', 'Ừ' => 'Ừ', 'ừ' => 'ừ', 'Ử' => 'Ử', 'á»­' => 'ử', 'á»®' => 'Ữ', 'ữ' => 'ữ', 'á»°' => 'Ự', 'á»±' => 'ự', 'Ỳ' => 'YÌ€', 'ỳ' => 'yÌ€', 'á»´' => 'YÌ£', 'ỵ' => 'yÌ£', 'Ỷ' => 'Ỷ', 'á»·' => 'ỷ', 'Ỹ' => 'Ỹ', 'ỹ' => 'ỹ', 'á¼€' => 'ἀ', 'á¼' => 'ἁ', 'ἂ' => 'ἂ', 'ἃ' => 'ἃ', 'ἄ' => 'ἀÌ', 'á¼…' => 'ἁÌ', 'ἆ' => 'ἆ', 'ἇ' => 'ἇ', 'Ἀ' => 'Ἀ', 'Ἁ' => 'Ἁ', 'Ἂ' => 'Ἂ', 'Ἃ' => 'Ἃ', 'Ἄ' => 'ἈÌ', 'á¼' => 'ἉÌ', 'Ἆ' => 'Ἆ', 'á¼' => 'Ἇ', 'á¼' => 'ἐ', 'ἑ' => 'ἑ', 'á¼’' => 'ἒ', 'ἓ' => 'ἓ', 'á¼”' => 'ἐÌ', 'ἕ' => 'ἑÌ', 'Ἐ' => 'Ἐ', 'á¼™' => 'Ἑ', 'Ἒ' => 'Ἒ', 'á¼›' => 'Ἓ', 'Ἔ' => 'ἘÌ', 'á¼' => 'ἙÌ', 'á¼ ' => 'ἠ', 'ἡ' => 'ἡ', 'á¼¢' => 'ἢ', 'á¼£' => 'ἣ', 'ἤ' => 'ἠÌ', 'á¼¥' => 'ἡÌ', 'ἦ' => 'ἦ', 'ἧ' => 'ἧ', 'Ἠ' => 'Ἠ', 'Ἡ' => 'Ἡ', 'Ἢ' => 'Ἢ', 'Ἣ' => 'Ἣ', 'Ἤ' => 'ἨÌ', 'á¼­' => 'ἩÌ', 'á¼®' => 'Ἦ', 'Ἧ' => 'Ἧ', 'á¼°' => 'ἰ', 'á¼±' => 'ἱ', 'á¼²' => 'ἲ', 'á¼³' => 'ἳ', 'á¼´' => 'ἰÌ', 'á¼µ' => 'ἱÌ', 'ἶ' => 'ἶ', 'á¼·' => 'ἷ', 'Ἰ' => 'Ἰ', 'á¼¹' => 'Ἱ', 'Ἲ' => 'Ἲ', 'á¼»' => 'Ἳ', 'á¼¼' => 'ἸÌ', 'á¼½' => 'ἹÌ', 'á¼¾' => 'Ἶ', 'Ἷ' => 'Ἷ', 'á½€' => 'ὀ', 'á½' => 'ὁ', 'ὂ' => 'ὂ', 'ὃ' => 'ὃ', 'ὄ' => 'ὀÌ', 'á½…' => 'ὁÌ', 'Ὀ' => 'Ὀ', 'Ὁ' => 'Ὁ', 'Ὂ' => 'Ὂ', 'Ὃ' => 'Ὃ', 'Ὄ' => 'ὈÌ', 'á½' => 'ὉÌ', 'á½' => 'Ï…Ì“', 'ὑ' => 'Ï…Ì”', 'á½’' => 'Ï…Ì“Ì€', 'ὓ' => 'ὓ', 'á½”' => 'Ï…Ì“Ì', 'ὕ' => 'Ï…Ì”Ì', 'á½–' => 'Ï…Ì“Í‚', 'á½—' => 'ὗ', 'á½™' => 'Ὑ', 'á½›' => 'Ὓ', 'á½' => 'ὙÌ', 'Ὗ' => 'Ὗ', 'á½ ' => 'ὠ', 'ὡ' => 'ὡ', 'á½¢' => 'ὢ', 'á½£' => 'ὣ', 'ὤ' => 'ὠÌ', 'á½¥' => 'ὡÌ', 'ὦ' => 'ὦ', 'ὧ' => 'ὧ', 'Ὠ' => 'Ὠ', 'Ὡ' => 'Ὡ', 'Ὢ' => 'Ὢ', 'Ὣ' => 'Ὣ', 'Ὤ' => 'ὨÌ', 'á½­' => 'ὩÌ', 'á½®' => 'Ὦ', 'Ὧ' => 'Ὧ', 'á½°' => 'ὰ', 'á½±' => 'αÌ', 'á½²' => 'ὲ', 'á½³' => 'εÌ', 'á½´' => 'ὴ', 'á½µ' => 'ηÌ', 'ὶ' => 'ὶ', 'á½·' => 'ιÌ', 'ὸ' => 'ὸ', 'á½¹' => 'οÌ', 'ὺ' => 'Ï…Ì€', 'á½»' => 'Ï…Ì', 'á½¼' => 'ὼ', 'á½½' => 'ωÌ', 'á¾€' => 'ᾀ', 'á¾' => 'ᾁ', 'ᾂ' => 'ᾂ', 'ᾃ' => 'ᾃ', 'ᾄ' => 'ἀÌÍ…', 'á¾…' => 'ἁÌÍ…', 'ᾆ' => 'ᾆ', 'ᾇ' => 'ᾇ', 'ᾈ' => 'ᾈ', 'ᾉ' => 'ᾉ', 'ᾊ' => 'ᾊ', 'ᾋ' => 'ᾋ', 'ᾌ' => 'ἈÌÍ…', 'á¾' => 'ἉÌÍ…', 'ᾎ' => 'ᾎ', 'á¾' => 'ᾏ', 'á¾' => 'ᾐ', 'ᾑ' => 'ᾑ', 'á¾’' => 'ᾒ', 'ᾓ' => 'ᾓ', 'á¾”' => 'ἠÌÍ…', 'ᾕ' => 'ἡÌÍ…', 'á¾–' => 'ᾖ', 'á¾—' => 'ᾗ', 'ᾘ' => 'ᾘ', 'á¾™' => 'ᾙ', 'ᾚ' => 'ᾚ', 'á¾›' => 'ᾛ', 'ᾜ' => 'ἨÌÍ…', 'á¾' => 'ἩÌÍ…', 'ᾞ' => 'ᾞ', 'ᾟ' => 'ᾟ', 'á¾ ' => 'ᾠ', 'ᾡ' => 'ᾡ', 'á¾¢' => 'ᾢ', 'á¾£' => 'ᾣ', 'ᾤ' => 'ὠÌÍ…', 'á¾¥' => 'ὡÌÍ…', 'ᾦ' => 'ᾦ', 'ᾧ' => 'ᾧ', 'ᾨ' => 'ᾨ', 'ᾩ' => 'ᾩ', 'ᾪ' => 'ᾪ', 'ᾫ' => 'ᾫ', 'ᾬ' => 'ὨÌÍ…', 'á¾­' => 'ὩÌÍ…', 'á¾®' => 'ᾮ', 'ᾯ' => 'ᾯ', 'á¾°' => 'ᾰ', 'á¾±' => 'ᾱ', 'á¾²' => 'ᾲ', 'á¾³' => 'ᾳ', 'á¾´' => 'αÌÍ…', 'ᾶ' => 'ᾶ', 'á¾·' => 'ᾷ', 'Ᾰ' => 'Ᾰ', 'á¾¹' => 'Ᾱ', 'Ὰ' => 'Ὰ', 'á¾»' => 'ΑÌ', 'á¾¼' => 'ᾼ', 'á¾¾' => 'ι', 'á¿' => '῁', 'á¿‚' => 'ῂ', 'ῃ' => 'ῃ', 'á¿„' => 'ηÌÍ…', 'ῆ' => 'ῆ', 'ῇ' => 'ῇ', 'Ὲ' => 'Ὲ', 'Έ' => 'ΕÌ', 'á¿Š' => 'Ὴ', 'á¿‹' => 'ΗÌ', 'á¿Œ' => 'ῌ', 'á¿' => '῍', 'á¿Ž' => '᾿Ì', 'á¿' => '῏', 'á¿' => 'ῐ', 'á¿‘' => 'ῑ', 'á¿’' => 'ῒ', 'á¿“' => 'ϊÌ', 'á¿–' => 'ῖ', 'á¿—' => 'ῗ', 'Ῐ' => 'Ῐ', 'á¿™' => 'Ῑ', 'á¿š' => 'Ὶ', 'á¿›' => 'ΙÌ', 'á¿' => '῝', 'á¿ž' => '῾Ì', 'á¿Ÿ' => '῟', 'á¿ ' => 'ῠ', 'á¿¡' => 'Ï…Ì„', 'á¿¢' => 'ῢ', 'á¿£' => 'ϋÌ', 'ῤ' => 'ÏÌ“', 'á¿¥' => 'ÏÌ”', 'ῦ' => 'Ï…Í‚', 'ῧ' => 'ῧ', 'Ῠ' => 'Ῠ', 'á¿©' => 'Ῡ', 'Ὺ' => 'Ὺ', 'á¿«' => 'Î¥Ì', 'Ῥ' => 'Ῥ', 'á¿­' => '῭', 'á¿®' => '¨Ì', '`' => '`', 'ῲ' => 'ῲ', 'ῳ' => 'ῳ', 'á¿´' => 'ωÌÍ…', 'ῶ' => 'ῶ', 'á¿·' => 'ῷ', 'Ὸ' => 'Ὸ', 'Ό' => 'ΟÌ', 'Ὼ' => 'Ὼ', 'á¿»' => 'ΩÌ', 'ῼ' => 'ῼ', '´' => '´', ' ' => ' ', 'â€' => ' ', 'Ω' => 'Ω', 'K' => 'K', 'â„«' => 'AÌŠ', '↚' => 'â†Ì¸', '↛' => '↛', '↮' => '↮', 'â‡' => 'â‡Ì¸', '⇎' => '⇎', 'â‡' => '⇏', '∄' => '∄', '∉' => '∉', '∌' => '∌', '∤' => '∤', '∦' => '∦', 'â‰' => '≁', '≄' => '≄', '≇' => '≇', '≉' => '≉', '≠' => '≠', '≢' => '≢', '≭' => 'â‰Ì¸', '≮' => '≮', '≯' => '≯', '≰' => '≰', '≱' => '≱', '≴' => '≴', '≵' => '≵', '≸' => '≸', '≹' => '≹', '⊀' => '⊀', 'âŠ' => '⊁', '⊄' => '⊄', '⊅' => '⊅', '⊈' => '⊈', '⊉' => '⊉', '⊬' => '⊬', '⊭' => '⊭', '⊮' => '⊮', '⊯' => '⊯', 'â‹ ' => '⋠', 'â‹¡' => '⋡', 'â‹¢' => '⋢', 'â‹£' => '⋣', '⋪' => '⋪', 'â‹«' => '⋫', '⋬' => '⋬', 'â‹­' => '⋭', '〈' => '〈', '〉' => '〉', 'â«œ' => 'â«Ì¸', 'ãŒ' => 'ã‹ã‚™', 'ãŽ' => 'ãã‚™', 'ã' => 'ãã‚™', 'ã’' => 'ã‘ã‚™', 'ã”' => 'ã“ã‚™', 'ã–' => 'ã•ã‚™', 'ã˜' => 'ã—ã‚™', 'ãš' => 'ã™ã‚™', 'ãœ' => 'ã›ã‚™', 'ãž' => 'ãã‚™', 'ã ' => 'ãŸã‚™', 'ã¢' => 'ã¡ã‚™', 'ã¥' => 'ã¤ã‚™', 'ã§' => 'ã¦ã‚™', 'ã©' => 'ã¨ã‚™', 'ã°' => 'ã¯ã‚™', 'ã±' => 'ã¯ã‚š', 'ã³' => 'ã²ã‚™', 'ã´' => 'ã²ã‚š', 'ã¶' => 'ãµã‚™', 'ã·' => 'ãµã‚š', 'ã¹' => 'ã¸ã‚™', 'ãº' => 'ã¸ã‚š', 'ã¼' => 'ã»ã‚™', 'ã½' => 'ã»ã‚š', 'ã‚”' => 'ã†ã‚™', 'ã‚ž' => 'ã‚ã‚™', 'ガ' => 'ã‚«ã‚™', 'ã‚®' => 'ã‚­ã‚™', 'ã‚°' => 'グ', 'ゲ' => 'ゲ', 'ã‚´' => 'ゴ', 'ザ' => 'ザ', 'ジ' => 'ã‚·ã‚™', 'ズ' => 'ズ', 'ゼ' => 'ゼ', 'ゾ' => 'ゾ', 'ダ' => 'ã‚¿ã‚™', 'ヂ' => 'ãƒã‚™', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド', 'ãƒ' => 'ãƒã‚™', 'パ' => 'ãƒã‚š', 'ビ' => 'ビ', 'ピ' => 'ピ', 'ブ' => 'ブ', 'プ' => 'プ', 'ベ' => 'ベ', 'ペ' => 'ペ', 'ボ' => 'ボ', 'ãƒ' => 'ポ', 'ヴ' => 'ヴ', 'ヷ' => 'ヷ', 'ヸ' => 'ヸ', 'ヹ' => 'ヹ', 'ヺ' => 'ヺ', 'ヾ' => 'ヾ', '豈' => '豈', 'ï¤' => 'æ›´', '車' => '車', '賈' => '賈', '滑' => '滑', '串' => '串', '句' => 'å¥', '龜' => '龜', '龜' => '龜', '契' => '契', '金' => '金', '喇' => 'å–‡', '奈' => '奈', 'ï¤' => '懶', '癩' => '癩', 'ï¤' => 'ç¾…', 'ï¤' => '蘿', '螺' => '螺', '裸' => '裸', '邏' => 'é‚', '樂' => '樂', '洛' => 'æ´›', '烙' => '烙', '珞' => 'çž', '落' => 'è½', '酪' => 'é…ª', '駱' => '駱', '亂' => '亂', '卵' => 'åµ', 'ï¤' => '欄', '爛' => '爛', '蘭' => '蘭', '鸞' => '鸞', '嵐' => 'åµ', '濫' => 'æ¿«', '藍' => 'è—', '襤' => '襤', '拉' => '拉', '臘' => '臘', '蠟' => 'è Ÿ', '廊' => '廊', '朗' => '朗', '浪' => '浪', '狼' => '狼', '郎' => '郎', '來' => '來', '冷' => '冷', '勞' => 'å‹ž', '擄' => 'æ“„', '櫓' => 'æ«“', '爐' => 'çˆ', '盧' => '盧', '老' => 'è€', '蘆' => '蘆', '虜' => '虜', '路' => 'è·¯', '露' => '露', '魯' => 'é­¯', '鷺' => 'é·º', '碌' => '碌', '祿' => '祿', '綠' => '綠', '菉' => 'è‰', '錄' => '錄', '鹿' => '鹿', 'ï¥' => 'è«–', '壟' => '壟', '弄' => '弄', '籠' => 'ç± ', '聾' => 'è¾', '牢' => '牢', '磊' => '磊', '賂' => '賂', '雷' => 'é›·', '壘' => '壘', '屢' => 'å±¢', '樓' => '樓', 'ï¥' => 'æ·š', '漏' => 'æ¼', 'ï¥' => 'ç´¯', 'ï¥' => '縷', '陋' => '陋', '勒' => 'å‹’', '肋' => 'è‚‹', '凜' => '凜', '凌' => '凌', '稜' => '稜', '綾' => '綾', '菱' => 'è±', '陵' => '陵', '讀' => '讀', '拏' => 'æ‹', '樂' => '樂', 'ï¥' => '諾', '丹' => '丹', '寧' => '寧', '怒' => '怒', '率' => '率', '異' => 'ç•°', '北' => '北', '磻' => '磻', '便' => '便', '復' => '復', '不' => 'ä¸', '泌' => '泌', '數' => '數', '索' => 'ç´¢', '參' => 'åƒ', '塞' => 'å¡ž', '省' => 'çœ', '葉' => '葉', '說' => '說', '殺' => '殺', '辰' => 'è¾°', '沈' => '沈', '拾' => '拾', '若' => 'è‹¥', '掠' => '掠', '略' => 'ç•¥', '亮' => '亮', '兩' => 'å…©', '凉' => '凉', '梁' => 'æ¢', '糧' => '糧', '良' => '良', '諒' => 'è«’', '量' => 'é‡', '勵' => '勵', '呂' => 'å‘‚', 'ï¦' => '女', '廬' => '廬', '旅' => 'æ—…', '濾' => '濾', '礪' => '礪', '閭' => 'é–­', '驪' => '驪', '麗' => '麗', '黎' => '黎', '力' => '力', '曆' => '曆', '歷' => 'æ­·', 'ï¦' => 'è½¢', '年' => 'å¹´', 'ï¦' => 'æ†', 'ï¦' => '戀', '撚' => 'æ’š', '漣' => 'æ¼£', '煉' => 'ç…‰', '璉' => 'ç’‰', '秊' => '秊', '練' => 'ç·´', '聯' => 'è¯', '輦' => '輦', '蓮' => 'è“®', '連' => '連', '鍊' => 'éŠ', '列' => '列', 'ï¦' => '劣', '咽' => 'å’½', '烈' => '烈', '裂' => '裂', '說' => '說', '廉' => '廉', '念' => '念', '捻' => 'æ»', '殮' => 'æ®®', '簾' => 'ç°¾', '獵' => 'çµ', '令' => '令', '囹' => '囹', '寧' => '寧', '嶺' => '嶺', '怜' => '怜', '玲' => '玲', '瑩' => 'ç‘©', '羚' => '羚', '聆' => 'è†', '鈴' => '鈴', '零' => '零', '靈' => 'éˆ', '領' => 'é ˜', '例' => '例', '禮' => '禮', '醴' => '醴', '隸' => '隸', '惡' => '惡', '了' => '了', '僚' => '僚', '寮' => '寮', '尿' => 'å°¿', '料' => 'æ–™', '樂' => '樂', '燎' => '燎', 'ï§' => '療', '蓼' => '蓼', '遼' => 'é¼', '龍' => 'é¾', '暈' => '暈', '阮' => '阮', '劉' => '劉', '杻' => 'æ»', '柳' => '柳', '流' => 'æµ', '溜' => '溜', '琉' => 'ç‰', 'ï§' => 'ç•™', '硫' => 'ç¡«', 'ï§' => 'ç´', 'ï§' => 'é¡ž', '六' => 'å…­', '戮' => '戮', '陸' => '陸', '倫' => '倫', '崙' => 'å´™', '淪' => 'æ·ª', '輪' => '輪', '律' => '律', '慄' => 'æ…„', '栗' => 'æ —', '率' => '率', '隆' => '隆', 'ï§' => '利', '吏' => 'å', '履' => 'å±¥', '易' => '易', '李' => 'æŽ', '梨' => '梨', '泥' => 'æ³¥', '理' => 'ç†', '痢' => 'ç—¢', '罹' => 'ç½¹', '裏' => 'è£', '裡' => '裡', '里' => '里', '離' => '離', '匿' => '匿', '溺' => '溺', '吝' => 'å', '燐' => 'ç‡', '璘' => 'ç’˜', '藺' => 'è—º', '隣' => '隣', '鱗' => 'é±—', '麟' => '麟', '林' => 'æž—', '淋' => 'æ·‹', '臨' => '臨', '立' => 'ç«‹', '笠' => '笠', '粒' => 'ç²’', '狀' => 'ç‹€', '炙' => 'ç‚™', '識' => 'è­˜', '什' => '什', '茶' => '茶', '刺' => '刺', '切' => '切', 'ï¨' => '度', '拓' => 'æ‹“', '糖' => 'ç³–', '宅' => 'å®…', '洞' => 'æ´ž', '暴' => 'æš´', '輻' => 'è¼»', '行' => 'è¡Œ', '降' => 'é™', '見' => '見', '廓' => '廓', '兀' => 'å…€', 'ï¨' => 'å—€', 'ï¨' => 'å¡š', '晴' => 'æ™´', '凞' => '凞', '猪' => '猪', '益' => '益', '礼' => '礼', '神' => '神', '祥' => '祥', '福' => 'ç¦', '靖' => 'é–', 'ï¨' => 'ç²¾', '羽' => 'ç¾½', '蘒' => '蘒', '諸' => '諸', '逸' => '逸', '都' => '都', '飯' => '飯', '飼' => '飼', '館' => '館', '鶴' => '鶴', '郞' => '郞', '隷' => 'éš·', '侮' => 'ä¾®', '僧' => '僧', '免' => 'å…', '勉' => '勉', '勤' => '勤', '卑' => 'å‘', '喝' => 'å–', '嘆' => '嘆', '器' => '器', '塀' => 'å¡€', '墨' => '墨', '層' => '層', '屮' => 'å±®', '悔' => 'æ‚”', '慨' => 'æ…¨', '憎' => '憎', 'ï©€' => '懲', 'ï©' => 'æ•', 'ï©‚' => 'æ—¢', '暑' => 'æš‘', 'ï©„' => '梅', 'ï©…' => 'æµ·', '渚' => '渚', '漢' => 'æ¼¢', '煮' => 'ç…®', '爫' => '爫', 'ï©Š' => 'ç¢', 'ï©‹' => '碑', 'ï©Œ' => '社', 'ï©' => '祉', 'ï©Ž' => '祈', 'ï©' => 'ç¥', 'ï©' => '祖', 'ï©‘' => 'ç¥', 'ï©’' => 'ç¦', 'ï©“' => '禎', 'ï©”' => 'ç©€', 'ï©•' => 'çª', 'ï©–' => '節', 'ï©—' => 'ç·´', '縉' => '縉', 'ï©™' => 'ç¹', 'ï©š' => 'ç½²', 'ï©›' => '者', 'ï©œ' => '臭', 'ï©' => '艹', 'ï©ž' => '艹', 'ï©Ÿ' => 'è‘—', 'ï© ' => 'è¤', 'ï©¡' => '視', 'ï©¢' => 'è¬', 'ï©£' => '謹', '賓' => '賓', 'ï©¥' => 'è´ˆ', '辶' => '辶', '逸' => '逸', '難' => '難', 'ï©©' => '響', '頻' => 'é »', 'ï©«' => 'æµ', '𤋮' => '𤋮', 'ï©­' => '舘', 'ï©°' => '並', '况' => '况', '全' => 'å…¨', '侀' => 'ä¾€', 'ï©´' => 'å……', '冀' => '冀', '勇' => '勇', 'ï©·' => '勺', '喝' => 'å–', '啕' => 'å••', '喙' => 'å–™', 'ï©»' => 'å—¢', '塚' => 'å¡š', '墳' => '墳', '奄' => '奄', 'ï©¿' => '奔', '婢' => 'å©¢', 'ïª' => '嬨', '廒' => 'å»’', '廙' => 'å»™', '彩' => '彩', '徭' => 'å¾­', '惘' => '惘', '慎' => 'æ…Ž', '愈' => '愈', '憎' => '憎', '慠' => 'æ… ', '懲' => '懲', '戴' => '戴', 'ïª' => 'æ„', '搜' => 'æœ', 'ïª' => 'æ‘’', 'ïª' => 'æ•–', '晴' => 'æ™´', '朗' => '朗', '望' => '望', '杖' => 'æ–', '歹' => 'æ­¹', '殺' => '殺', '流' => 'æµ', '滛' => 'æ»›', '滋' => '滋', '漢' => 'æ¼¢', '瀞' => '瀞', '煮' => 'ç…®', 'ïª' => '瞧', '爵' => '爵', '犯' => '犯', '猪' => '猪', '瑱' => '瑱', '甆' => '甆', '画' => 'ç”»', '瘝' => 'ç˜', '瘟' => '瘟', '益' => '益', '盛' => 'ç››', '直' => 'ç›´', '睊' => 'çŠ', '着' => 'ç€', '磌' => '磌', '窱' => '窱', '節' => '節', '类' => 'ç±»', '絛' => 'çµ›', '練' => 'ç·´', '缾' => 'ç¼¾', '者' => '者', '荒' => 'è’', '華' => 'è¯', '蝹' => 'è¹', '襁' => 'è¥', '覆' => '覆', '視' => '視', '調' => '調', '諸' => '諸', '請' => 'è«‹', '謁' => 'è¬', '諾' => '諾', '諭' => 'è«­', '謹' => '謹', 'ï«€' => '變', 'ï«' => 'è´ˆ', 'ï«‚' => '輸', '遲' => 'é²', 'ï«„' => '醙', 'ï«…' => '鉶', '陼' => '陼', '難' => '難', '靖' => 'é–', '韛' => '韛', 'ï«Š' => '響', 'ï«‹' => 'é ‹', 'ï«Œ' => 'é »', 'ï«' => '鬒', 'ï«Ž' => '龜', 'ï«' => '𢡊', 'ï«' => '𢡄', 'ï«‘' => 'ð£•', 'ï«’' => 'ã®', 'ï«“' => '䀘', 'ï«”' => '䀹', 'ï«•' => '𥉉', 'ï«–' => 'ð¥³', 'ï«—' => '𧻓', '齃' => '齃', 'ï«™' => '龎', 'ï¬' => '×™Ö´', 'ײַ' => 'ײַ', 'שׁ' => 'ש×', 'שׂ' => 'שׂ', 'שּׁ' => 'שּ×', 'שּׂ' => 'שּׂ', 'אַ' => '×Ö·', 'אָ' => '×Ö¸', 'אּ' => '×Ö¼', 'בּ' => 'בּ', 'גּ' => '×’Ö¼', 'דּ' => 'דּ', 'הּ' => '×”Ö¼', 'וּ' => 'וּ', 'זּ' => '×–Ö¼', 'טּ' => 'טּ', 'יּ' => '×™Ö¼', 'ךּ' => 'ךּ', 'כּ' => '×›Ö¼', 'לּ' => 'לּ', 'מּ' => 'מּ', 'ï­€' => '× Ö¼', 'ï­' => 'סּ', 'ï­ƒ' => '×£Ö¼', 'ï­„' => 'פּ', 'ï­†' => 'צּ', 'ï­‡' => 'קּ', 'ï­ˆ' => 'רּ', 'ï­‰' => 'שּ', 'ï­Š' => 'תּ', 'ï­‹' => 'וֹ', 'ï­Œ' => 'בֿ', 'ï­' => '×›Ö¿', 'ï­Ž' => 'פֿ', 'ð‘‚š' => '𑂚', 'ð‘‚œ' => '𑂜', 'ð‘‚«' => '𑂫', 'ð‘„®' => '𑄮', '𑄯' => '𑄯', 'ð‘‹' => 'ð‘‡ð‘Œ¾', 'ð‘Œ' => 'ð‘‡ð‘—', 'ð‘’»' => '𑒻', 'ð‘’¼' => '𑒼', 'ð‘’¾' => '𑒾', 'ð‘–º' => '𑖺', 'ð‘–»' => '𑖻', '𑤸' => '𑤸', 'ð…ž' => 'ð…—ð…¥', 'ð…Ÿ' => 'ð…˜ð…¥', 'ð… ' => 'ð…˜ð…¥ð…®', 'ð…¡' => 'ð…˜ð…¥ð…¯', 'ð…¢' => 'ð…˜ð…¥ð…°', 'ð…£' => 'ð…˜ð…¥ð…±', 'ð…¤' => 'ð…˜ð…¥ð…²', 'ð†»' => 'ð†¹ð…¥', 'ð†¼' => 'ð†ºð…¥', 'ð†½' => 'ð†¹ð…¥ð…®', 'ð†¾' => 'ð†ºð…¥ð…®', 'ð†¿' => 'ð†¹ð…¥ð…¯', 'ð‡€' => 'ð†ºð…¥ð…¯', '丽' => '丽', 'ð¯ ' => '丸', '乁' => 'ä¹', '𠄢' => 'ð „¢', '你' => 'ä½ ', '侮' => 'ä¾®', '侻' => 'ä¾»', '倂' => '倂', '偺' => 'åº', '備' => 'å‚™', '僧' => '僧', '像' => 'åƒ', '㒞' => 'ã’ž', 'ð¯ ' => '𠘺', '免' => 'å…', 'ð¯ ' => 'å…”', 'ð¯ ' => 'å…¤', '具' => 'å…·', '𠔜' => '𠔜', '㒹' => 'ã’¹', '內' => 'å…§', '再' => 'å†', '𠕋' => 'ð •‹', '冗' => '冗', '冤' => '冤', '仌' => '仌', '冬' => '冬', '况' => '况', '𩇟' => '𩇟', 'ð¯ ' => '凵', '刃' => '刃', '㓟' => 'ã“Ÿ', '刻' => '刻', '剆' => '剆', '割' => '割', '剷' => '剷', '㔕' => '㔕', '勇' => '勇', '勉' => '勉', '勤' => '勤', '勺' => '勺', '包' => '包', '匆' => '匆', '北' => '北', '卉' => 'å‰', '卑' => 'å‘', '博' => 'åš', '即' => 'å³', '卽' => 'å½', '卿' => 'å¿', '卿' => 'å¿', '卿' => 'å¿', '𠨬' => '𠨬', '灰' => 'ç°', '及' => 'åŠ', '叟' => 'åŸ', '𠭣' => 'ð ­£', '叫' => 'å«', '叱' => 'å±', '吆' => 'å†', '咞' => 'å’ž', '吸' => 'å¸', '呈' => '呈', '周' => '周', '咢' => 'å’¢', 'ð¯¡' => '哶', '唐' => 'å”', '啓' => 'å•“', '啣' => 'å•£', '善' => 'å–„', '善' => 'å–„', '喙' => 'å–™', '喫' => 'å–«', '喳' => 'å–³', '嗂' => 'å—‚', '圖' => '圖', '嘆' => '嘆', 'ð¯¡' => '圗', '噑' => '噑', 'ð¯¡' => 'å™´', 'ð¯¡' => '切', '壮' => '壮', '城' => '城', '埴' => '埴', '堍' => 'å ', '型' => 'åž‹', '堲' => 'å ²', '報' => 'å ±', '墬' => '墬', '𡓤' => '𡓤', '売' => '売', '壷' => '壷', '夆' => '夆', 'ð¯¡' => '多', '夢' => '夢', '奢' => '奢', '𡚨' => '𡚨', '𡛪' => '𡛪', '姬' => '姬', '娛' => '娛', '娧' => '娧', '姘' => '姘', '婦' => '婦', '㛮' => 'ã›®', '㛼' => '㛼', '嬈' => '嬈', '嬾' => '嬾', '嬾' => '嬾', '𡧈' => '𡧈', '寃' => '寃', '寘' => '寘', '寧' => '寧', '寳' => '寳', '𡬘' => '𡬘', '寿' => '寿', '将' => 'å°†', '当' => '当', '尢' => 'å°¢', '㞁' => 'ãž', '屠' => 'å± ', '屮' => 'å±®', '峀' => 'å³€', '岍' => 'å²', '𡷤' => 'ð¡·¤', '嵃' => '嵃', '𡷦' => 'ð¡·¦', '嵮' => 'åµ®', '嵫' => '嵫', '嵼' => 'åµ¼', 'ð¯¢' => 'å·¡', '巢' => 'å·¢', '㠯' => 'ã ¯', '巽' => 'å·½', '帨' => '帨', '帽' => '帽', '幩' => '幩', '㡢' => 'ã¡¢', '𢆃' => '𢆃', '㡼' => '㡼', '庰' => '庰', '庳' => '庳', 'ð¯¢' => '庶', '廊' => '廊', 'ð¯¢' => '𪎒', 'ð¯¢' => '廾', '𢌱' => '𢌱', '𢌱' => '𢌱', '舁' => 'èˆ', '弢' => 'å¼¢', '弢' => 'å¼¢', '㣇' => '㣇', '𣊸' => '𣊸', '𦇚' => '𦇚', '形' => 'å½¢', '彫' => '彫', '㣣' => '㣣', '徚' => '徚', 'ð¯¢' => 'å¿', '志' => 'å¿—', '忹' => '忹', '悁' => 'æ‚', '㤺' => '㤺', '㤜' => '㤜', '悔' => 'æ‚”', '𢛔' => '𢛔', '惇' => '惇', '慈' => 'æ…ˆ', '慌' => 'æ…Œ', '慎' => 'æ…Ž', '慌' => 'æ…Œ', '慺' => 'æ…º', '憎' => '憎', '憲' => '憲', '憤' => '憤', '憯' => '憯', '懞' => '懞', '懲' => '懲', '懶' => '懶', '成' => 'æˆ', '戛' => '戛', '扝' => 'æ‰', '抱' => '抱', '拔' => 'æ‹”', '捐' => 'æ', '𢬌' => '𢬌', '挽' => '挽', '拼' => '拼', '捨' => 'æ¨', '掃' => '掃', '揤' => 'æ¤', '𢯱' => '𢯱', '搢' => 'æ¢', '揅' => 'æ…', 'ð¯£' => '掩', '㨮' => '㨮', '摩' => 'æ‘©', '摾' => '摾', '撝' => 'æ’', '摷' => 'æ‘·', '㩬' => '㩬', '敏' => 'æ•', '敬' => '敬', '𣀊' => '𣀊', '旣' => 'æ—£', '書' => '書', 'ð¯£' => '晉', '㬙' => '㬙', 'ð¯£' => 'æš‘', 'ð¯£' => '㬈', '㫤' => '㫤', '冒' => '冒', '冕' => '冕', '最' => '最', '暜' => 'æšœ', '肭' => 'è‚­', '䏙' => 'ä™', '朗' => '朗', '望' => '望', '朡' => '朡', '杞' => 'æž', '杓' => 'æ“', 'ð¯£' => 'ð£ƒ', '㭉' => 'ã­‰', '柺' => '柺', '枅' => 'æž…', '桒' => 'æ¡’', '梅' => '梅', '𣑭' => '𣑭', '梎' => '梎', '栟' => 'æ Ÿ', '椔' => '椔', '㮝' => 'ã®', '楂' => '楂', '榣' => '榣', '槪' => '槪', '檨' => '檨', '𣚣' => '𣚣', '櫛' => 'æ«›', '㰘' => 'ã°˜', '次' => '次', '𣢧' => '𣢧', '歔' => 'æ­”', '㱎' => '㱎', '歲' => 'æ­²', '殟' => '殟', '殺' => '殺', '殻' => 'æ®»', '𣪍' => 'ð£ª', '𡴋' => 'ð¡´‹', '𣫺' => '𣫺', '汎' => '汎', '𣲼' => '𣲼', '沿' => '沿', '泍' => 'æ³', '汧' => '汧', '洖' => 'æ´–', '派' => 'æ´¾', 'ð¯¤' => 'æµ·', '流' => 'æµ', '浩' => '浩', '浸' => '浸', '涅' => '涅', '𣴞' => '𣴞', '洴' => 'æ´´', '港' => '港', '湮' => 'æ¹®', '㴳' => 'ã´³', '滋' => '滋', '滇' => '滇', 'ð¯¤' => '𣻑', '淹' => 'æ·¹', 'ð¯¤' => 'æ½®', 'ð¯¤' => '𣽞', '𣾎' => '𣾎', '濆' => '濆', '瀹' => '瀹', '瀞' => '瀞', '瀛' => '瀛', '㶖' => '㶖', '灊' => 'çŠ', '災' => 'ç½', '灷' => 'ç·', '炭' => 'ç‚­', '𠔥' => '𠔥', '煅' => 'ç……', 'ð¯¤' => '𤉣', '熜' => '熜', '𤎫' => '𤎫', '爨' => '爨', '爵' => '爵', '牐' => 'ç‰', '𤘈' => '𤘈', '犀' => '犀', '犕' => '犕', '𤜵' => '𤜵', '𤠔' => '𤠔', '獺' => 'çº', '王' => '王', '㺬' => '㺬', '玥' => '玥', '㺸' => '㺸', '㺸' => '㺸', '瑇' => '瑇', '瑜' => 'ç‘œ', '瑱' => '瑱', '璅' => 'ç’…', '瓊' => 'ç“Š', '㼛' => 'ã¼›', '甤' => '甤', '𤰶' => '𤰶', '甾' => '甾', '𤲒' => '𤲒', '異' => 'ç•°', '𢆟' => '𢆟', '瘐' => 'ç˜', '𤾡' => '𤾡', '𤾸' => '𤾸', '𥁄' => 'ð¥„', '㿼' => '㿼', '䀈' => '䀈', '直' => 'ç›´', 'ð¯¥' => '𥃳', '𥃲' => '𥃲', '𥄙' => '𥄙', '𥄳' => '𥄳', '眞' => '眞', '真' => '真', '真' => '真', '睊' => 'çŠ', '䀹' => '䀹', '瞋' => 'çž‹', '䁆' => 'ä†', '䂖' => 'ä‚–', 'ð¯¥' => 'ð¥', '硎' => 'ç¡Ž', 'ð¯¥' => '碌', 'ð¯¥' => '磌', '䃣' => '䃣', '𥘦' => '𥘦', '祖' => '祖', '𥚚' => '𥚚', '𥛅' => '𥛅', '福' => 'ç¦', '秫' => '秫', '䄯' => '䄯', '穀' => 'ç©€', '穊' => 'ç©Š', '穏' => 'ç©', '𥥼' => '𥥼', 'ð¯¥' => '𥪧', '𥪧' => '𥪧', '竮' => 'ç«®', '䈂' => '䈂', '𥮫' => '𥮫', '篆' => '篆', '築' => '築', '䈧' => '䈧', '𥲀' => '𥲀', '糒' => 'ç³’', '䊠' => '䊠', '糨' => '糨', '糣' => 'ç³£', '紀' => 'ç´€', '𥾆' => '𥾆', '絣' => 'çµ£', '䌁' => 'äŒ', '緇' => 'ç·‡', '縂' => '縂', '繅' => 'ç¹…', '䌴' => '䌴', '𦈨' => '𦈨', '𦉇' => '𦉇', '䍙' => 'ä™', '𦋙' => '𦋙', '罺' => '罺', '𦌾' => '𦌾', '羕' => '羕', '翺' => '翺', '者' => '者', '𦓚' => '𦓚', '𦔣' => '𦔣', '聠' => 'è ', '𦖨' => '𦖨', '聰' => 'è°', '𣍟' => 'ð£Ÿ', 'ð¯¦' => 'ä•', '育' => '育', '脃' => '脃', '䐋' => 'ä‹', '脾' => '脾', '媵' => '媵', '𦞧' => '𦞧', '𦞵' => '𦞵', '𣎓' => '𣎓', '𣎜' => '𣎜', '舁' => 'èˆ', '舄' => '舄', 'ð¯¦' => '辞', '䑫' => 'ä‘«', 'ð¯¦' => '芑', 'ð¯¦' => '芋', '芝' => 'èŠ', '劳' => '劳', '花' => '花', '芳' => '芳', '芽' => '芽', '苦' => '苦', '𦬼' => '𦬼', '若' => 'è‹¥', '茝' => 'èŒ', '荣' => 'è£', '莭' => '莭', '茣' => '茣', 'ð¯¦' => '莽', '菧' => 'è§', '著' => 'è‘—', '荓' => 'è“', '菊' => 'èŠ', '菌' => 'èŒ', '菜' => 'èœ', '𦰶' => '𦰶', '𦵫' => '𦵫', '𦳕' => '𦳕', '䔫' => '䔫', '蓱' => '蓱', '蓳' => '蓳', '蔖' => 'è”–', '𧏊' => 'ð§Š', '蕤' => '蕤', '𦼬' => '𦼬', '䕝' => 'ä•', '䕡' => 'ä•¡', '𦾱' => '𦾱', '𧃒' => '𧃒', '䕫' => 'ä•«', '虐' => 'è™', '虜' => '虜', '虧' => '虧', '虩' => '虩', '蚩' => 'èš©', '蚈' => '蚈', '蜎' => '蜎', '蛢' => '蛢', '蝹' => 'è¹', '蜨' => '蜨', '蝫' => 'è«', '螆' => '螆', '䗗' => 'ä——', '蟡' => '蟡', 'ð¯§' => 'è ', '䗹' => 'ä—¹', '衠' => 'è¡ ', '衣' => 'è¡£', '𧙧' => '𧙧', '裗' => '裗', '裞' => '裞', '䘵' => '䘵', '裺' => '裺', '㒻' => 'ã’»', '𧢮' => '𧢮', '𧥦' => '𧥦', 'ð¯§' => 'äš¾', '䛇' => '䛇', 'ð¯§' => '誠', 'ð¯§' => 'è«­', '變' => '變', '豕' => '豕', '𧲨' => '𧲨', '貫' => '貫', '賁' => 'è³', '贛' => 'è´›', '起' => 'èµ·', '𧼯' => '𧼯', '𠠄' => 'ð  „', '跋' => 'è·‹', '趼' => '趼', '跰' => 'è·°', 'ð¯§' => '𠣞', '軔' => 'è»”', '輸' => '輸', '𨗒' => '𨗒', '𨗭' => '𨗭', '邔' => 'é‚”', '郱' => '郱', '鄑' => 'é„‘', '𨜮' => '𨜮', '鄛' => 'é„›', '鈸' => '鈸', '鋗' => 'é‹—', '鋘' => '鋘', '鉼' => '鉼', '鏹' => 'é¹', '鐕' => 'é•', '𨯺' => '𨯺', '開' => 'é–‹', '䦕' => '䦕', '閷' => 'é–·', '𨵷' => '𨵷', '䧦' => '䧦', '雃' => '雃', '嶲' => '嶲', '霣' => '霣', '𩅅' => 'ð©……', '𩈚' => '𩈚', '䩮' => 'ä©®', '䩶' => '䩶', '韠' => '韠', '𩐊' => 'ð©Š', '䪲' => '䪲', '𩒖' => 'ð©’–', '頋' => 'é ‹', '頋' => 'é ‹', '頩' => 'é ©', 'ð¯¨' => 'ð©–¶', '飢' => '飢', '䬳' => '䬳', '餩' => '餩', '馧' => '馧', '駂' => '駂', '駾' => '駾', '䯎' => '䯎', '𩬰' => '𩬰', '鬒' => '鬒', '鱀' => 'é±€', '鳽' => 'é³½', 'ð¯¨' => '䳎', '䳭' => 'ä³­', 'ð¯¨' => '鵧', 'ð¯¨' => '𪃎', '䳸' => '䳸', '𪄅' => '𪄅', '𪈎' => '𪈎', '𪊑' => '𪊑', '麻' => '麻', '䵖' => 'äµ–', '黹' => '黹', '黾' => '黾', '鼅' => 'é¼…', '鼏' => 'é¼', '鼖' => 'é¼–', '鼻' => 'é¼»', 'ð¯¨' => '𪘀'); gdriveaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php000064400000027215147600374260031071 0ustar00addons 230, 'Ì' => 230, 'Ì‚' => 230, '̃' => 230, 'Ì„' => 230, 'Ì…' => 230, '̆' => 230, '̇' => 230, '̈' => 230, '̉' => 230, 'ÌŠ' => 230, 'Ì‹' => 230, 'ÌŒ' => 230, 'Ì' => 230, 'ÌŽ' => 230, 'Ì' => 230, 'Ì' => 230, 'Ì‘' => 230, 'Ì’' => 230, 'Ì“' => 230, 'Ì”' => 230, 'Ì•' => 232, 'Ì–' => 220, 'Ì—' => 220, '̘' => 220, 'Ì™' => 220, 'Ìš' => 232, 'Ì›' => 216, 'Ìœ' => 220, 'Ì' => 220, 'Ìž' => 220, 'ÌŸ' => 220, 'Ì ' => 220, 'Ì¡' => 202, 'Ì¢' => 202, 'Ì£' => 220, '̤' => 220, 'Ì¥' => 220, '̦' => 220, '̧' => 202, '̨' => 202, 'Ì©' => 220, '̪' => 220, 'Ì«' => 220, '̬' => 220, 'Ì­' => 220, 'Ì®' => 220, '̯' => 220, 'Ì°' => 220, '̱' => 220, '̲' => 220, '̳' => 220, 'Ì´' => 1, '̵' => 1, '̶' => 1, 'Ì·' => 1, '̸' => 1, '̹' => 220, '̺' => 220, 'Ì»' => 220, '̼' => 220, '̽' => 230, '̾' => 230, 'Ì¿' => 230, 'Í€' => 230, 'Í' => 230, 'Í‚' => 230, '̓' => 230, 'Í„' => 230, 'Í…' => 240, '͆' => 230, '͇' => 220, '͈' => 220, '͉' => 220, 'ÍŠ' => 230, 'Í‹' => 230, 'ÍŒ' => 230, 'Í' => 220, 'ÍŽ' => 220, 'Í' => 230, 'Í‘' => 230, 'Í’' => 230, 'Í“' => 220, 'Í”' => 220, 'Í•' => 220, 'Í–' => 220, 'Í—' => 230, '͘' => 232, 'Í™' => 220, 'Íš' => 220, 'Í›' => 230, 'Íœ' => 233, 'Í' => 234, 'Íž' => 234, 'ÍŸ' => 233, 'Í ' => 234, 'Í¡' => 234, 'Í¢' => 233, 'Í£' => 230, 'ͤ' => 230, 'Í¥' => 230, 'ͦ' => 230, 'ͧ' => 230, 'ͨ' => 230, 'Í©' => 230, 'ͪ' => 230, 'Í«' => 230, 'ͬ' => 230, 'Í­' => 230, 'Í®' => 230, 'ͯ' => 230, 'Òƒ' => 230, 'Ò„' => 230, 'Ò…' => 230, 'Ò†' => 230, 'Ò‡' => 230, 'Ö‘' => 220, 'Ö’' => 230, 'Ö“' => 230, 'Ö”' => 230, 'Ö•' => 230, 'Ö–' => 220, 'Ö—' => 230, 'Ö˜' => 230, 'Ö™' => 230, 'Öš' => 222, 'Ö›' => 220, 'Öœ' => 230, 'Ö' => 230, 'Öž' => 230, 'ÖŸ' => 230, 'Ö ' => 230, 'Ö¡' => 230, 'Ö¢' => 220, 'Ö£' => 220, 'Ö¤' => 220, 'Ö¥' => 220, 'Ö¦' => 220, 'Ö§' => 220, 'Ö¨' => 230, 'Ö©' => 230, 'Öª' => 220, 'Ö«' => 230, 'Ö¬' => 230, 'Ö­' => 222, 'Ö®' => 228, 'Ö¯' => 230, 'Ö°' => 10, 'Ö±' => 11, 'Ö²' => 12, 'Ö³' => 13, 'Ö´' => 14, 'Öµ' => 15, 'Ö¶' => 16, 'Ö·' => 17, 'Ö¸' => 18, 'Ö¹' => 19, 'Öº' => 19, 'Ö»' => 20, 'Ö¼' => 21, 'Ö½' => 22, 'Ö¿' => 23, '×' => 24, 'ׂ' => 25, 'ׄ' => 230, '×…' => 220, 'ׇ' => 18, 'Ø' => 230, 'Ø‘' => 230, 'Ø’' => 230, 'Ø“' => 230, 'Ø”' => 230, 'Ø•' => 230, 'Ø–' => 230, 'Ø—' => 230, 'ؘ' => 30, 'Ø™' => 31, 'Øš' => 32, 'Ù‹' => 27, 'ÙŒ' => 28, 'Ù' => 29, 'ÙŽ' => 30, 'Ù' => 31, 'Ù' => 32, 'Ù‘' => 33, 'Ù’' => 34, 'Ù“' => 230, 'Ù”' => 230, 'Ù•' => 220, 'Ù–' => 220, 'Ù—' => 230, 'Ù˜' => 230, 'Ù™' => 230, 'Ùš' => 230, 'Ù›' => 230, 'Ùœ' => 220, 'Ù' => 230, 'Ùž' => 230, 'ÙŸ' => 220, 'Ù°' => 35, 'Û–' => 230, 'Û—' => 230, 'Û˜' => 230, 'Û™' => 230, 'Ûš' => 230, 'Û›' => 230, 'Ûœ' => 230, 'ÛŸ' => 230, 'Û ' => 230, 'Û¡' => 230, 'Û¢' => 230, 'Û£' => 220, 'Û¤' => 230, 'Û§' => 230, 'Û¨' => 230, 'Ûª' => 220, 'Û«' => 230, 'Û¬' => 230, 'Û­' => 220, 'Ü‘' => 36, 'Ü°' => 230, 'ܱ' => 220, 'ܲ' => 230, 'ܳ' => 230, 'Ü´' => 220, 'ܵ' => 230, 'ܶ' => 230, 'Ü·' => 220, 'ܸ' => 220, 'ܹ' => 220, 'ܺ' => 230, 'Ü»' => 220, 'ܼ' => 220, 'ܽ' => 230, 'ܾ' => 220, 'Ü¿' => 230, 'Ý€' => 230, 'Ý' => 230, 'Ý‚' => 220, '݃' => 230, 'Ý„' => 220, 'Ý…' => 230, '݆' => 220, '݇' => 230, '݈' => 220, '݉' => 230, 'ÝŠ' => 230, 'ß«' => 230, '߬' => 230, 'ß­' => 230, 'ß®' => 230, '߯' => 230, 'ß°' => 230, 'ß±' => 230, 'ß²' => 220, 'ß³' => 230, 'ß½' => 220, 'à –' => 230, 'à —' => 230, 'à ˜' => 230, 'à ™' => 230, 'à ›' => 230, 'à œ' => 230, 'à ' => 230, 'à ž' => 230, 'à Ÿ' => 230, 'à  ' => 230, 'à ¡' => 230, 'à ¢' => 230, 'à £' => 230, 'à ¥' => 230, 'à ¦' => 230, 'à §' => 230, 'à ©' => 230, 'à ª' => 230, 'à «' => 230, 'à ¬' => 230, 'à ­' => 230, 'à¡™' => 220, 'à¡š' => 220, 'à¡›' => 220, '࣓' => 220, 'ࣔ' => 230, 'ࣕ' => 230, 'ࣖ' => 230, 'ࣗ' => 230, 'ࣘ' => 230, 'ࣙ' => 230, 'ࣚ' => 230, 'ࣛ' => 230, 'ࣜ' => 230, 'à£' => 230, 'ࣞ' => 230, 'ࣟ' => 230, '࣠' => 230, '࣡' => 230, 'ࣣ' => 220, 'ࣤ' => 230, 'ࣥ' => 230, 'ࣦ' => 220, 'ࣧ' => 230, 'ࣨ' => 230, 'ࣩ' => 220, '࣪' => 230, '࣫' => 230, '࣬' => 230, '࣭' => 220, '࣮' => 220, '࣯' => 220, 'ࣰ' => 27, 'ࣱ' => 28, 'ࣲ' => 29, 'ࣳ' => 230, 'ࣴ' => 230, 'ࣵ' => 230, 'ࣶ' => 220, 'ࣷ' => 230, 'ࣸ' => 230, 'ࣹ' => 220, 'ࣺ' => 220, 'ࣻ' => 230, 'ࣼ' => 230, 'ࣽ' => 230, 'ࣾ' => 230, 'ࣿ' => 230, '़' => 7, 'à¥' => 9, '॑' => 230, '॒' => 220, '॓' => 230, '॔' => 230, '়' => 7, 'à§' => 9, '৾' => 230, '਼' => 7, 'à©' => 9, '઼' => 7, 'à«' => 9, '଼' => 7, 'à­' => 9, 'à¯' => 9, 'à±' => 9, 'ౕ' => 84, 'à±–' => 91, '಼' => 7, 'à³' => 9, 'à´»' => 9, 'à´¼' => 9, 'àµ' => 9, 'à·Š' => 9, 'ุ' => 103, 'ู' => 103, 'ฺ' => 9, '่' => 107, '้' => 107, '๊' => 107, '๋' => 107, 'ຸ' => 118, 'ູ' => 118, '຺' => 9, '່' => 122, '້' => 122, '໊' => 122, '໋' => 122, '༘' => 220, '༙' => 220, '༵' => 220, '༷' => 220, '༹' => 216, 'ཱ' => 129, 'ི' => 130, 'ུ' => 132, 'ེ' => 130, 'ཻ' => 130, 'ོ' => 130, 'ཽ' => 130, 'ྀ' => 130, 'ྂ' => 230, 'ྃ' => 230, '྄' => 9, '྆' => 230, '྇' => 230, '࿆' => 220, '့' => 7, '္' => 9, '်' => 9, 'á‚' => 220, 'á' => 230, 'áž' => 230, 'áŸ' => 230, '᜔' => 9, '᜴' => 9, '្' => 9, 'áŸ' => 230, 'ᢩ' => 228, '᤹' => 222, '᤺' => 230, '᤻' => 220, 'ᨗ' => 230, 'ᨘ' => 220, 'á© ' => 9, '᩵' => 230, '᩶' => 230, 'á©·' => 230, '᩸' => 230, '᩹' => 230, '᩺' => 230, 'á©»' => 230, '᩼' => 230, 'á©¿' => 220, '᪰' => 230, '᪱' => 230, '᪲' => 230, '᪳' => 230, '᪴' => 230, '᪵' => 220, '᪶' => 220, '᪷' => 220, '᪸' => 220, '᪹' => 220, '᪺' => 220, '᪻' => 230, '᪼' => 230, '᪽' => 220, 'ᪿ' => 220, 'á«€' => 220, '᬴' => 7, 'á­„' => 9, 'á­«' => 230, 'á­¬' => 220, 'á­­' => 230, 'á­®' => 230, 'á­¯' => 230, 'á­°' => 230, 'á­±' => 230, 'á­²' => 230, 'á­³' => 230, '᮪' => 9, '᮫' => 9, '᯦' => 7, '᯲' => 9, '᯳' => 9, 'á°·' => 7, 'á³' => 230, '᳑' => 230, 'á³’' => 230, 'á³”' => 1, '᳕' => 220, 'á³–' => 220, 'á³—' => 220, '᳘' => 220, 'á³™' => 220, '᳚' => 230, 'á³›' => 230, '᳜' => 220, 'á³' => 220, '᳞' => 220, '᳟' => 220, 'á³ ' => 230, 'á³¢' => 1, 'á³£' => 1, '᳤' => 1, 'á³¥' => 1, '᳦' => 1, '᳧' => 1, '᳨' => 1, 'á³­' => 220, 'á³´' => 230, '᳸' => 230, 'á³¹' => 230, 'á·€' => 230, 'á·' => 230, 'á·‚' => 220, 'á·ƒ' => 230, 'á·„' => 230, 'á·…' => 230, 'á·†' => 230, 'á·‡' => 230, 'á·ˆ' => 230, 'á·‰' => 230, 'á·Š' => 220, 'á·‹' => 230, 'á·Œ' => 230, 'á·' => 234, 'á·Ž' => 214, 'á·' => 220, 'á·' => 202, 'á·‘' => 230, 'á·’' => 230, 'á·“' => 230, 'á·”' => 230, 'á·•' => 230, 'á·–' => 230, 'á·—' => 230, 'á·˜' => 230, 'á·™' => 230, 'á·š' => 230, 'á·›' => 230, 'á·œ' => 230, 'á·' => 230, 'á·ž' => 230, 'á·Ÿ' => 230, 'á· ' => 230, 'á·¡' => 230, 'á·¢' => 230, 'á·£' => 230, 'á·¤' => 230, 'á·¥' => 230, 'á·¦' => 230, 'á·§' => 230, 'á·¨' => 230, 'á·©' => 230, 'á·ª' => 230, 'á·«' => 230, 'á·¬' => 230, 'á·­' => 230, 'á·®' => 230, 'á·¯' => 230, 'á·°' => 230, 'á·±' => 230, 'á·²' => 230, 'á·³' => 230, 'á·´' => 230, 'á·µ' => 230, 'á·¶' => 232, 'á··' => 228, 'á·¸' => 228, 'á·¹' => 220, 'á·»' => 230, 'á·¼' => 233, 'á·½' => 220, 'á·¾' => 230, 'á·¿' => 220, 'âƒ' => 230, '⃑' => 230, '⃒' => 1, '⃓' => 1, '⃔' => 230, '⃕' => 230, '⃖' => 230, '⃗' => 230, '⃘' => 1, '⃙' => 1, '⃚' => 1, '⃛' => 230, '⃜' => 230, '⃡' => 230, '⃥' => 1, '⃦' => 1, '⃧' => 230, '⃨' => 220, '⃩' => 230, '⃪' => 1, '⃫' => 1, '⃬' => 220, '⃭' => 220, '⃮' => 220, '⃯' => 220, '⃰' => 230, '⳯' => 230, 'â³°' => 230, 'â³±' => 230, '⵿' => 9, 'â· ' => 230, 'â·¡' => 230, 'â·¢' => 230, 'â·£' => 230, 'â·¤' => 230, 'â·¥' => 230, 'â·¦' => 230, 'â·§' => 230, 'â·¨' => 230, 'â·©' => 230, 'â·ª' => 230, 'â·«' => 230, 'â·¬' => 230, 'â·­' => 230, 'â·®' => 230, 'â·¯' => 230, 'â·°' => 230, 'â·±' => 230, 'â·²' => 230, 'â·³' => 230, 'â·´' => 230, 'â·µ' => 230, 'â·¶' => 230, 'â··' => 230, 'â·¸' => 230, 'â·¹' => 230, 'â·º' => 230, 'â·»' => 230, 'â·¼' => 230, 'â·½' => 230, 'â·¾' => 230, 'â·¿' => 230, '〪' => 218, '〫' => 228, '〬' => 232, '〭' => 222, '〮' => 224, '〯' => 224, 'ã‚™' => 8, 'ã‚š' => 8, '꙯' => 230, 'ê™´' => 230, 'ꙵ' => 230, 'ꙶ' => 230, 'ê™·' => 230, 'ꙸ' => 230, 'ꙹ' => 230, 'ꙺ' => 230, 'ê™»' => 230, '꙼' => 230, '꙽' => 230, 'êšž' => 230, 'ꚟ' => 230, 'ê›°' => 230, 'ê›±' => 230, 'ê †' => 9, 'ê ¬' => 9, '꣄' => 9, '꣠' => 230, '꣡' => 230, '꣢' => 230, '꣣' => 230, '꣤' => 230, '꣥' => 230, '꣦' => 230, '꣧' => 230, '꣨' => 230, '꣩' => 230, '꣪' => 230, '꣫' => 230, '꣬' => 230, '꣭' => 230, '꣮' => 230, '꣯' => 230, '꣰' => 230, '꣱' => 230, '꤫' => 220, '꤬' => 220, '꤭' => 220, '꥓' => 9, '꦳' => 7, '꧀' => 9, 'ꪰ' => 230, 'ꪲ' => 230, 'ꪳ' => 230, 'ꪴ' => 220, 'ꪷ' => 230, 'ꪸ' => 230, 'ꪾ' => 230, '꪿' => 230, 'ê«' => 230, '꫶' => 9, '꯭' => 9, 'ﬞ' => 26, '︠' => 230, '︡' => 230, '︢' => 230, '︣' => 230, '︤' => 230, '︥' => 230, '︦' => 230, '︧' => 220, '︨' => 220, '︩' => 220, '︪' => 220, '︫' => 220, '︬' => 220, '︭' => 220, '︮' => 230, '︯' => 230, 'ð‡½' => 220, 'ð‹ ' => 220, 'ð¶' => 230, 'ð·' => 230, 'ð¸' => 230, 'ð¹' => 230, 'ðº' => 230, 'ð¨' => 220, 'ð¨' => 230, 'ð¨¸' => 230, 'ð¨¹' => 1, 'ð¨º' => 220, 'ð¨¿' => 9, 'ð«¥' => 230, 'ð«¦' => 220, 'ð´¤' => 230, 'ð´¥' => 230, 'ð´¦' => 230, 'ð´§' => 230, 'ðº«' => 230, 'ðº¬' => 230, 'ð½†' => 220, 'ð½‡' => 220, 'ð½ˆ' => 230, 'ð½‰' => 230, 'ð½Š' => 230, 'ð½‹' => 220, 'ð½Œ' => 230, 'ð½' => 220, 'ð½Ž' => 220, 'ð½' => 220, 'ð½' => 220, 'ð‘†' => 9, 'ð‘¿' => 9, 'ð‘‚¹' => 9, '𑂺' => 7, 'ð‘„€' => 230, 'ð‘„' => 230, 'ð‘„‚' => 230, 'ð‘„³' => 9, 'ð‘„´' => 9, 'ð‘…³' => 7, '𑇀' => 9, '𑇊' => 7, '𑈵' => 9, '𑈶' => 7, 'ð‘‹©' => 7, '𑋪' => 9, '𑌻' => 7, '𑌼' => 7, 'ð‘' => 9, 'ð‘¦' => 230, 'ð‘§' => 230, 'ð‘¨' => 230, 'ð‘©' => 230, 'ð‘ª' => 230, 'ð‘«' => 230, 'ð‘¬' => 230, 'ð‘°' => 230, 'ð‘±' => 230, 'ð‘²' => 230, 'ð‘³' => 230, 'ð‘´' => 230, 'ð‘‘‚' => 9, '𑑆' => 7, 'ð‘‘ž' => 230, 'ð‘“‚' => 9, '𑓃' => 7, 'ð‘–¿' => 9, 'ð‘—€' => 7, '𑘿' => 9, '𑚶' => 9, 'ð‘š·' => 7, '𑜫' => 9, 'ð‘ ¹' => 9, 'ð‘ º' => 7, '𑤽' => 9, '𑤾' => 9, '𑥃' => 7, '𑧠' => 9, '𑨴' => 9, '𑩇' => 9, '𑪙' => 9, 'ð‘°¿' => 9, '𑵂' => 7, '𑵄' => 9, '𑵅' => 9, '𑶗' => 9, 'ð–«°' => 1, 'ð–«±' => 1, 'ð–«²' => 1, 'ð–«³' => 1, 'ð–«´' => 1, 'ð–¬°' => 230, '𖬱' => 230, '𖬲' => 230, '𖬳' => 230, 'ð–¬´' => 230, '𖬵' => 230, '𖬶' => 230, 'ð–¿°' => 6, 'ð–¿±' => 6, '𛲞' => 1, 'ð…¥' => 216, 'ð…¦' => 216, 'ð…§' => 1, 'ð…¨' => 1, 'ð…©' => 1, 'ð…­' => 226, 'ð…®' => 216, 'ð…¯' => 216, 'ð…°' => 216, 'ð…±' => 216, 'ð…²' => 216, 'ð…»' => 220, 'ð…¼' => 220, 'ð…½' => 220, 'ð…¾' => 220, 'ð…¿' => 220, 'ð†€' => 220, 'ð†' => 220, 'ð†‚' => 220, 'ð†…' => 230, 'ð††' => 230, 'ð†‡' => 230, 'ð†ˆ' => 230, 'ð†‰' => 230, 'ð†Š' => 220, 'ð†‹' => 220, 'ð†ª' => 230, 'ð†«' => 230, 'ð†¬' => 230, 'ð†­' => 230, 'ð‰‚' => 230, 'ð‰ƒ' => 230, 'ð‰„' => 230, '𞀀' => 230, 'ðž€' => 230, '𞀂' => 230, '𞀃' => 230, '𞀄' => 230, '𞀅' => 230, '𞀆' => 230, '𞀈' => 230, '𞀉' => 230, '𞀊' => 230, '𞀋' => 230, '𞀌' => 230, 'ðž€' => 230, '𞀎' => 230, 'ðž€' => 230, 'ðž€' => 230, '𞀑' => 230, '𞀒' => 230, '𞀓' => 230, '𞀔' => 230, '𞀕' => 230, '𞀖' => 230, '𞀗' => 230, '𞀘' => 230, '𞀛' => 230, '𞀜' => 230, 'ðž€' => 230, '𞀞' => 230, '𞀟' => 230, '𞀠' => 230, '𞀡' => 230, '𞀣' => 230, '𞀤' => 230, '𞀦' => 230, '𞀧' => 230, '𞀨' => 230, '𞀩' => 230, '𞀪' => 230, 'ðž„°' => 230, '𞄱' => 230, '𞄲' => 230, '𞄳' => 230, 'ðž„´' => 230, '𞄵' => 230, '𞄶' => 230, '𞋬' => 230, 'ðž‹­' => 230, 'ðž‹®' => 230, '𞋯' => 230, 'ðž£' => 220, '𞣑' => 220, '𞣒' => 220, '𞣓' => 220, '𞣔' => 220, '𞣕' => 220, '𞣖' => 220, '𞥄' => 230, '𞥅' => 230, '𞥆' => 230, '𞥇' => 230, '𞥈' => 230, '𞥉' => 230, '𞥊' => 7); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/Normalizer.php000064400000021722147600374260024735 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Intl\Normalizer; /** * Normalizer is a PHP fallback implementation of the Normalizer class provided by the intl extension. * * It has been validated with Unicode 6.3 Normalization Conformance Test. * See http://www.unicode.org/reports/tr15/ for detailed info about Unicode normalizations. * * @author Nicolas Grekas * * @internal */ class Normalizer { const FORM_D = \Normalizer::FORM_D; const FORM_KD = \Normalizer::FORM_KD; const FORM_C = \Normalizer::FORM_C; const FORM_KC = \Normalizer::FORM_KC; const NFD = \Normalizer::NFD; const NFKD = \Normalizer::NFKD; const NFC = \Normalizer::NFC; const NFKC = \Normalizer::NFKC; private static $C; private static $D; private static $KD; private static $cC; private static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); private static $ASCII = " eiasntrolud][cmp'\ng|hv.fb,:=-q10C2*yx)(L9AS/P\"EjMIk3>5T $T && ($T += 0x40); $ulen += 3; } $L = 0xac00 + ($L * 21 + $V) * 28 + $T; $lastUchr = \chr(0xe0 | $L >> 12) . \chr(0x80 | $L >> 6 & 0x3f) . \chr(0x80 | $L & 0x3f); } $i += $ulen; } return $result . $lastUchr . $tail; } private static function decompose($s, $c) { $result = ''; $ASCII = self::$ASCII; $decompMap = self::$D; $combClass = self::$cC; $ulenMask = self::$ulenMask; if ($c) { $compatMap = self::$KD; } $c = array(); $i = 0; $len = \strlen($s); while ($i < $len) { if ($s[$i] < "\x80") { // ASCII chars if ($c) { \ksort($c); $result .= \implode('', $c); $c = array(); } $j = 1 + \strspn($s, $ASCII, $i + 1); $result .= \substr($s, $i, $j); $i += $j; continue; } $ulen = $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if ($uchr < "ê°€" || "힣" < $uchr) { // Table lookup if ($uchr !== ($j = isset($compatMap[$uchr]) ? $compatMap[$uchr] : (isset($decompMap[$uchr]) ? $decompMap[$uchr] : $uchr))) { $uchr = $j; $j = \strlen($uchr); $ulen = $uchr[0] < "\x80" ? 1 : $ulenMask[$uchr[0] & "\xf0"]; if ($ulen != $j) { // Put trailing chars in $s $j -= $ulen; $i -= $j; if (0 > $i) { $s = \str_repeat(' ', -$i) . $s; $len -= $i; $i = 0; } while ($j--) { $s[$i + $j] = $uchr[$ulen + $j]; } $uchr = \substr($uchr, 0, $ulen); } } if (isset($combClass[$uchr])) { // Combining chars, for sorting if (!isset($c[$combClass[$uchr]])) { $c[$combClass[$uchr]] = ''; } $c[$combClass[$uchr]] .= $uchr; continue; } } else { // Hangul chars $uchr = \unpack('C*', $uchr); $j = ($uchr[1] - 224 << 12) + ($uchr[2] - 128 << 6) + $uchr[3] - 0xac80; $uchr = "\xe1\x84" . \chr(0x80 + (int) ($j / 588)) . "\xe1\x85" . \chr(0xa1 + (int) ($j % 588 / 28)); if ($j %= 28) { $uchr .= $j < 25 ? "\xe1\x86" . \chr(0xa7 + $j) : "\xe1\x87" . \chr(0x67 + $j); } } if ($c) { \ksort($c); $result .= \implode('', $c); $c = array(); } $result .= $uchr; } if ($c) { \ksort($c); $result .= \implode('', $c); } return $result; } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-intl-normalizer/bootstrap.php000064400000001307147600374260024625 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Intl\Normalizer as p; if (!\function_exists('normalizer_is_normalized')) { function normalizer_is_normalized($input, $form = p\Normalizer::NFC) { return p\Normalizer::isNormalized($input, $form); } } if (!\function_exists('normalizer_normalize')) { function normalizer_normalize($input, $form = p\Normalizer::NFC) { return p\Normalizer::normalize($input, $form); } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php000064400000015424147600374260030003 0ustar00 'A', 'b' => 'B', 'c' => 'C', 'd' => 'D', 'e' => 'E', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'm' => 'M', 'n' => 'N', 'o' => 'O', 'p' => 'P', 'q' => 'Q', 'r' => 'R', 's' => 'S', 't' => 'T', 'u' => 'U', 'v' => 'V', 'w' => 'W', 'x' => 'X', 'y' => 'Y', 'z' => 'Z', 'µ' => 'Îœ', 'à' => 'À', 'á' => 'Ã', 'â' => 'Â', 'ã' => 'Ã', 'ä' => 'Ä', 'Ã¥' => 'Ã…', 'æ' => 'Æ', 'ç' => 'Ç', 'è' => 'È', 'é' => 'É', 'ê' => 'Ê', 'ë' => 'Ë', 'ì' => 'ÃŒ', 'í' => 'Ã', 'î' => 'ÃŽ', 'ï' => 'Ã', 'ð' => 'Ã', 'ñ' => 'Ñ', 'ò' => 'Ã’', 'ó' => 'Ó', 'ô' => 'Ô', 'õ' => 'Õ', 'ö' => 'Ö', 'ø' => 'Ø', 'ù' => 'Ù', 'ú' => 'Ú', 'û' => 'Û', 'ü' => 'Ãœ', 'ý' => 'Ã', 'þ' => 'Þ', 'ÿ' => 'Ÿ', 'Ä' => 'Ä€', 'ă' => 'Ä‚', 'Ä…' => 'Ä„', 'ć' => 'Ć', 'ĉ' => 'Ĉ', 'Ä‹' => 'ÄŠ', 'Ä' => 'ÄŒ', 'Ä' => 'ÄŽ', 'Ä‘' => 'Ä', 'Ä“' => 'Ä’', 'Ä•' => 'Ä”', 'Ä—' => 'Ä–', 'Ä™' => 'Ę', 'Ä›' => 'Äš', 'Ä' => 'Äœ', 'ÄŸ' => 'Äž', 'Ä¡' => 'Ä ', 'Ä£' => 'Ä¢', 'Ä¥' => 'Ĥ', 'ħ' => 'Ħ', 'Ä©' => 'Ĩ', 'Ä«' => 'Ī', 'Ä­' => 'Ĭ', 'į' => 'Ä®', 'ı' => 'I', 'ij' => 'IJ', 'ĵ' => 'Ä´', 'Ä·' => 'Ķ', 'ĺ' => 'Ĺ', 'ļ' => 'Ä»', 'ľ' => 'Ľ', 'Å€' => 'Ä¿', 'Å‚' => 'Å', 'Å„' => 'Ń', 'ņ' => 'Å…', 'ň' => 'Ň', 'Å‹' => 'ÅŠ', 'Å' => 'ÅŒ', 'Å' => 'ÅŽ', 'Å‘' => 'Å', 'Å“' => 'Å’', 'Å•' => 'Å”', 'Å—' => 'Å–', 'Å™' => 'Ř', 'Å›' => 'Åš', 'Å' => 'Åœ', 'ÅŸ' => 'Åž', 'Å¡' => 'Å ', 'Å£' => 'Å¢', 'Å¥' => 'Ť', 'ŧ' => 'Ŧ', 'Å©' => 'Ũ', 'Å«' => 'Ū', 'Å­' => 'Ŭ', 'ů' => 'Å®', 'ű' => 'Å°', 'ų' => 'Ų', 'ŵ' => 'Å´', 'Å·' => 'Ŷ', 'ź' => 'Ź', 'ż' => 'Å»', 'ž' => 'Ž', 'Å¿' => 'S', 'Æ€' => 'Ƀ', 'ƃ' => 'Æ‚', 'Æ…' => 'Æ„', 'ƈ' => 'Ƈ', 'ÆŒ' => 'Æ‹', 'Æ’' => 'Æ‘', 'Æ•' => 'Ƕ', 'Æ™' => 'Ƙ', 'Æš' => 'Ƚ', 'Æž' => 'È ', 'Æ¡' => 'Æ ', 'Æ£' => 'Æ¢', 'Æ¥' => 'Ƥ', 'ƨ' => 'Ƨ', 'Æ­' => 'Ƭ', 'Æ°' => 'Ư', 'Æ´' => 'Ƴ', 'ƶ' => 'Ƶ', 'ƹ' => 'Ƹ', 'ƽ' => 'Ƽ', 'Æ¿' => 'Ç·', 'Ç…' => 'Ç„', 'dž' => 'Ç„', 'Lj' => 'LJ', 'lj' => 'LJ', 'Ç‹' => 'ÇŠ', 'ÇŒ' => 'ÇŠ', 'ÇŽ' => 'Ç', 'Ç' => 'Ç', 'Ç’' => 'Ç‘', 'Ç”' => 'Ç“', 'Ç–' => 'Ç•', 'ǘ' => 'Ç—', 'Çš' => 'Ç™', 'Çœ' => 'Ç›', 'Ç' => 'ÆŽ', 'ÇŸ' => 'Çž', 'Ç¡' => 'Ç ', 'Ç£' => 'Ç¢', 'Ç¥' => 'Ǥ', 'ǧ' => 'Ǧ', 'Ç©' => 'Ǩ', 'Ç«' => 'Ǫ', 'Ç­' => 'Ǭ', 'ǯ' => 'Ç®', 'Dz' => 'DZ', 'dz' => 'DZ', 'ǵ' => 'Ç´', 'ǹ' => 'Ǹ', 'Ç»' => 'Ǻ', 'ǽ' => 'Ǽ', 'Ç¿' => 'Ǿ', 'È' => 'È€', 'ȃ' => 'È‚', 'È…' => 'È„', 'ȇ' => 'Ȇ', 'ȉ' => 'Ȉ', 'È‹' => 'ÈŠ', 'È' => 'ÈŒ', 'È' => 'ÈŽ', 'È‘' => 'È', 'È“' => 'È’', 'È•' => 'È”', 'È—' => 'È–', 'È™' => 'Ș', 'È›' => 'Èš', 'È' => 'Èœ', 'ÈŸ' => 'Èž', 'È£' => 'È¢', 'È¥' => 'Ȥ', 'ȧ' => 'Ȧ', 'È©' => 'Ȩ', 'È«' => 'Ȫ', 'È­' => 'Ȭ', 'ȯ' => 'È®', 'ȱ' => 'È°', 'ȳ' => 'Ȳ', 'ȼ' => 'È»', 'È¿' => 'â±¾', 'É€' => 'Ɀ', 'É‚' => 'É', 'ɇ' => 'Ɇ', 'ɉ' => 'Ɉ', 'É‹' => 'ÉŠ', 'É' => 'ÉŒ', 'É' => 'ÉŽ', 'É' => 'Ɐ', 'É‘' => 'â±­', 'É’' => 'â±°', 'É“' => 'Æ', 'É”' => 'Ɔ', 'É–' => 'Ɖ', 'É—' => 'ÆŠ', 'É™' => 'Æ', 'É›' => 'Æ', 'Éœ' => 'êž«', 'É ' => 'Æ“', 'É¡' => 'Ɡ', 'É£' => 'Æ”', 'É¥' => 'êž', 'ɦ' => 'Ɦ', 'ɨ' => 'Æ—', 'É©' => 'Æ–', 'ɪ' => 'êž®', 'É«' => 'â±¢', 'ɬ' => 'êž­', 'ɯ' => 'Æœ', 'ɱ' => 'â±®', 'ɲ' => 'Æ', 'ɵ' => 'ÆŸ', 'ɽ' => 'Ɽ', 'Ê€' => 'Ʀ', 'Ê‚' => 'Ʂ', 'ʃ' => 'Æ©', 'ʇ' => 'êž±', 'ʈ' => 'Æ®', 'ʉ' => 'É„', 'ÊŠ' => 'Ʊ', 'Ê‹' => 'Ʋ', 'ÊŒ' => 'É…', 'Ê’' => 'Æ·', 'Ê' => 'êž²', 'Êž' => 'êž°', 'Í…' => 'Ι', 'ͱ' => 'Í°', 'ͳ' => 'Ͳ', 'Í·' => 'Ͷ', 'Í»' => 'Ͻ', 'ͼ' => 'Ͼ', 'ͽ' => 'Ï¿', 'ά' => 'Ά', 'έ' => 'Έ', 'ή' => 'Ή', 'ί' => 'Ί', 'α' => 'Α', 'β' => 'Î’', 'γ' => 'Γ', 'δ' => 'Δ', 'ε' => 'Ε', 'ζ' => 'Ζ', 'η' => 'Η', 'θ' => 'Θ', 'ι' => 'Ι', 'κ' => 'Κ', 'λ' => 'Λ', 'μ' => 'Îœ', 'ν' => 'Î', 'ξ' => 'Ξ', 'ο' => 'Ο', 'Ï€' => 'Π', 'Ï' => 'Ρ', 'Ï‚' => 'Σ', 'σ' => 'Σ', 'Ï„' => 'Τ', 'Ï…' => 'Î¥', 'φ' => 'Φ', 'χ' => 'Χ', 'ψ' => 'Ψ', 'ω' => 'Ω', 'ÏŠ' => 'Ϊ', 'Ï‹' => 'Ϋ', 'ÏŒ' => 'ÎŒ', 'Ï' => 'ÎŽ', 'ÏŽ' => 'Î', 'Ï' => 'Î’', 'Ï‘' => 'Θ', 'Ï•' => 'Φ', 'Ï–' => 'Π', 'Ï—' => 'Ï', 'Ï™' => 'Ϙ', 'Ï›' => 'Ïš', 'Ï' => 'Ïœ', 'ÏŸ' => 'Ïž', 'Ï¡' => 'Ï ', 'Ï£' => 'Ï¢', 'Ï¥' => 'Ϥ', 'ϧ' => 'Ϧ', 'Ï©' => 'Ϩ', 'Ï«' => 'Ϫ', 'Ï­' => 'Ϭ', 'ϯ' => 'Ï®', 'Ï°' => 'Κ', 'ϱ' => 'Ρ', 'ϲ' => 'Ϲ', 'ϳ' => 'Í¿', 'ϵ' => 'Ε', 'ϸ' => 'Ï·', 'Ï»' => 'Ϻ', 'а' => 'Ð', 'б' => 'Б', 'в' => 'Ð’', 'г' => 'Г', 'д' => 'Д', 'е' => 'Е', 'ж' => 'Ж', 'з' => 'З', 'и' => 'И', 'й' => 'Й', 'к' => 'К', 'л' => 'Л', 'м' => 'Ðœ', 'н' => 'Ð', 'о' => 'О', 'п' => 'П', 'Ñ€' => 'Р', 'Ñ' => 'С', 'Ñ‚' => 'Т', 'у' => 'У', 'Ñ„' => 'Ф', 'Ñ…' => 'Ð¥', 'ц' => 'Ц', 'ч' => 'Ч', 'ш' => 'Ш', 'щ' => 'Щ', 'ÑŠ' => 'Ъ', 'Ñ‹' => 'Ы', 'ÑŒ' => 'Ь', 'Ñ' => 'Э', 'ÑŽ' => 'Ю', 'Ñ' => 'Я', 'Ñ' => 'Ѐ', 'Ñ‘' => 'Ð', 'Ñ’' => 'Ђ', 'Ñ“' => 'Ѓ', 'Ñ”' => 'Є', 'Ñ•' => 'Ð…', 'Ñ–' => 'І', 'Ñ—' => 'Ї', 'ј' => 'Ј', 'Ñ™' => 'Љ', 'Ñš' => 'Њ', 'Ñ›' => 'Ћ', 'Ñœ' => 'ÐŒ', 'Ñ' => 'Ð', 'Ñž' => 'ÐŽ', 'ÑŸ' => 'Ð', 'Ñ¡' => 'Ñ ', 'Ñ£' => 'Ñ¢', 'Ñ¥' => 'Ѥ', 'ѧ' => 'Ѧ', 'Ñ©' => 'Ѩ', 'Ñ«' => 'Ѫ', 'Ñ­' => 'Ѭ', 'ѯ' => 'Ñ®', 'ѱ' => 'Ñ°', 'ѳ' => 'Ѳ', 'ѵ' => 'Ñ´', 'Ñ·' => 'Ѷ', 'ѹ' => 'Ѹ', 'Ñ»' => 'Ѻ', 'ѽ' => 'Ѽ', 'Ñ¿' => 'Ѿ', 'Ò' => 'Ò€', 'Ò‹' => 'ÒŠ', 'Ò' => 'ÒŒ', 'Ò' => 'ÒŽ', 'Ò‘' => 'Ò', 'Ò“' => 'Ò’', 'Ò•' => 'Ò”', 'Ò—' => 'Ò–', 'Ò™' => 'Ò˜', 'Ò›' => 'Òš', 'Ò' => 'Òœ', 'ÒŸ' => 'Òž', 'Ò¡' => 'Ò ', 'Ò£' => 'Ò¢', 'Ò¥' => 'Ò¤', 'Ò§' => 'Ò¦', 'Ò©' => 'Ò¨', 'Ò«' => 'Òª', 'Ò­' => 'Ò¬', 'Ò¯' => 'Ò®', 'Ò±' => 'Ò°', 'Ò³' => 'Ò²', 'Òµ' => 'Ò´', 'Ò·' => 'Ò¶', 'Ò¹' => 'Ò¸', 'Ò»' => 'Òº', 'Ò½' => 'Ò¼', 'Ò¿' => 'Ò¾', 'Ó‚' => 'Ó', 'Ó„' => 'Óƒ', 'Ó†' => 'Ó…', 'Óˆ' => 'Ó‡', 'ÓŠ' => 'Ó‰', 'ÓŒ' => 'Ó‹', 'ÓŽ' => 'Ó', 'Ó' => 'Ó€', 'Ó‘' => 'Ó', 'Ó“' => 'Ó’', 'Ó•' => 'Ó”', 'Ó—' => 'Ó–', 'Ó™' => 'Ó˜', 'Ó›' => 'Óš', 'Ó' => 'Óœ', 'ÓŸ' => 'Óž', 'Ó¡' => 'Ó ', 'Ó£' => 'Ó¢', 'Ó¥' => 'Ó¤', 'Ó§' => 'Ó¦', 'Ó©' => 'Ó¨', 'Ó«' => 'Óª', 'Ó­' => 'Ó¬', 'Ó¯' => 'Ó®', 'Ó±' => 'Ó°', 'Ó³' => 'Ó²', 'Óµ' => 'Ó´', 'Ó·' => 'Ó¶', 'Ó¹' => 'Ó¸', 'Ó»' => 'Óº', 'Ó½' => 'Ó¼', 'Ó¿' => 'Ó¾', 'Ô' => 'Ô€', 'Ôƒ' => 'Ô‚', 'Ô…' => 'Ô„', 'Ô‡' => 'Ô†', 'Ô‰' => 'Ôˆ', 'Ô‹' => 'ÔŠ', 'Ô' => 'ÔŒ', 'Ô' => 'ÔŽ', 'Ô‘' => 'Ô', 'Ô“' => 'Ô’', 'Ô•' => 'Ô”', 'Ô—' => 'Ô–', 'Ô™' => 'Ô˜', 'Ô›' => 'Ôš', 'Ô' => 'Ôœ', 'ÔŸ' => 'Ôž', 'Ô¡' => 'Ô ', 'Ô£' => 'Ô¢', 'Ô¥' => 'Ô¤', 'Ô§' => 'Ô¦', 'Ô©' => 'Ô¨', 'Ô«' => 'Ôª', 'Ô­' => 'Ô¬', 'Ô¯' => 'Ô®', 'Õ¡' => 'Ô±', 'Õ¢' => 'Ô²', 'Õ£' => 'Ô³', 'Õ¤' => 'Ô´', 'Õ¥' => 'Ôµ', 'Õ¦' => 'Ô¶', 'Õ§' => 'Ô·', 'Õ¨' => 'Ô¸', 'Õ©' => 'Ô¹', 'Õª' => 'Ôº', 'Õ«' => 'Ô»', 'Õ¬' => 'Ô¼', 'Õ­' => 'Ô½', 'Õ®' => 'Ô¾', 'Õ¯' => 'Ô¿', 'Õ°' => 'Õ€', 'Õ±' => 'Õ', 'Õ²' => 'Õ‚', 'Õ³' => 'Õƒ', 'Õ´' => 'Õ„', 'Õµ' => 'Õ…', 'Õ¶' => 'Õ†', 'Õ·' => 'Õ‡', 'Õ¸' => 'Õˆ', 'Õ¹' => 'Õ‰', 'Õº' => 'ÕŠ', 'Õ»' => 'Õ‹', 'Õ¼' => 'ÕŒ', 'Õ½' => 'Õ', 'Õ¾' => 'ÕŽ', 'Õ¿' => 'Õ', 'Ö€' => 'Õ', 'Ö' => 'Õ‘', 'Ö‚' => 'Õ’', 'Öƒ' => 'Õ“', 'Ö„' => 'Õ”', 'Ö…' => 'Õ•', 'Ö†' => 'Õ–', 'áƒ' => 'á²', 'ბ' => 'Ბ', 'გ' => 'á²’', 'დ' => 'Დ', 'ე' => 'á²”', 'ვ' => 'Ვ', 'ზ' => 'á²–', 'თ' => 'á²—', 'ი' => 'Ი', 'კ' => 'á²™', 'ლ' => 'Ლ', 'მ' => 'á²›', 'ნ' => 'Ნ', 'áƒ' => 'á²', 'პ' => 'Პ', 'ჟ' => 'Ჟ', 'რ' => 'á² ', 'ს' => 'Ს', 'ტ' => 'á²¢', 'უ' => 'á²£', 'ფ' => 'Ფ', 'ქ' => 'á²¥', 'ღ' => 'Ღ', 'ყ' => 'Ყ', 'შ' => 'Შ', 'ჩ' => 'Ჩ', 'ც' => 'Ც', 'ძ' => 'Ძ', 'წ' => 'Წ', 'ჭ' => 'á²­', 'ხ' => 'á²®', 'ჯ' => 'Ჯ', 'ჰ' => 'á²°', 'ჱ' => 'á²±', 'ჲ' => 'á²²', 'ჳ' => 'á²³', 'ჴ' => 'á²´', 'ჵ' => 'á²µ', 'ჶ' => 'Ჶ', 'ჷ' => 'á²·', 'ჸ' => 'Ჸ', 'ჹ' => 'á²¹', 'ჺ' => 'Ჺ', 'ჽ' => 'á²½', 'ჾ' => 'á²¾', 'ჿ' => 'Ჿ', 'á¸' => 'á°', 'á¹' => 'á±', 'áº' => 'á²', 'á»' => 'á³', 'á¼' => 'á´', 'á½' => 'áµ', 'á²€' => 'Ð’', 'á²' => 'Д', 'ᲂ' => 'О', 'ᲃ' => 'С', 'ᲄ' => 'Т', 'á²…' => 'Т', 'ᲆ' => 'Ъ', 'ᲇ' => 'Ñ¢', 'ᲈ' => 'Ꙋ', 'áµ¹' => 'ê½', 'áµ½' => 'â±£', 'ᶎ' => 'Ᶎ', 'á¸' => 'Ḁ', 'ḃ' => 'Ḃ', 'ḅ' => 'Ḅ', 'ḇ' => 'Ḇ', 'ḉ' => 'Ḉ', 'ḋ' => 'Ḋ', 'á¸' => 'Ḍ', 'á¸' => 'Ḏ', 'ḑ' => 'á¸', 'ḓ' => 'Ḓ', 'ḕ' => 'Ḕ', 'ḗ' => 'Ḗ', 'ḙ' => 'Ḙ', 'ḛ' => 'Ḛ', 'á¸' => 'Ḝ', 'ḟ' => 'Ḟ', 'ḡ' => 'Ḡ', 'ḣ' => 'Ḣ', 'ḥ' => 'Ḥ', 'ḧ' => 'Ḧ', 'ḩ' => 'Ḩ', 'ḫ' => 'Ḫ', 'ḭ' => 'Ḭ', 'ḯ' => 'Ḯ', 'ḱ' => 'Ḱ', 'ḳ' => 'Ḳ', 'ḵ' => 'Ḵ', 'ḷ' => 'Ḷ', 'ḹ' => 'Ḹ', 'ḻ' => 'Ḻ', 'ḽ' => 'Ḽ', 'ḿ' => 'Ḿ', 'á¹' => 'á¹€', 'ṃ' => 'Ṃ', 'á¹…' => 'Ṅ', 'ṇ' => 'Ṇ', 'ṉ' => 'Ṉ', 'ṋ' => 'Ṋ', 'á¹' => 'Ṍ', 'á¹' => 'Ṏ', 'ṑ' => 'á¹', 'ṓ' => 'á¹’', 'ṕ' => 'á¹”', 'á¹—' => 'á¹–', 'á¹™' => 'Ṙ', 'á¹›' => 'Ṛ', 'á¹' => 'Ṝ', 'ṟ' => 'Ṟ', 'ṡ' => 'á¹ ', 'á¹£' => 'á¹¢', 'á¹¥' => 'Ṥ', 'ṧ' => 'Ṧ', 'ṩ' => 'Ṩ', 'ṫ' => 'Ṫ', 'á¹­' => 'Ṭ', 'ṯ' => 'á¹®', 'á¹±' => 'á¹°', 'á¹³' => 'á¹²', 'á¹µ' => 'á¹´', 'á¹·' => 'Ṷ', 'á¹¹' => 'Ṹ', 'á¹»' => 'Ṻ', 'á¹½' => 'á¹¼', 'ṿ' => 'á¹¾', 'áº' => 'Ẁ', 'ẃ' => 'Ẃ', 'ẅ' => 'Ẅ', 'ẇ' => 'Ẇ', 'ẉ' => 'Ẉ', 'ẋ' => 'Ẋ', 'áº' => 'Ẍ', 'áº' => 'Ẏ', 'ẑ' => 'áº', 'ẓ' => 'Ẓ', 'ẕ' => 'Ẕ', 'ẛ' => 'á¹ ', 'ạ' => 'Ạ', 'ả' => 'Ả', 'ấ' => 'Ấ', 'ầ' => 'Ầ', 'ẩ' => 'Ẩ', 'ẫ' => 'Ẫ', 'ậ' => 'Ậ', 'ắ' => 'Ắ', 'ằ' => 'Ằ', 'ẳ' => 'Ẳ', 'ẵ' => 'Ẵ', 'ặ' => 'Ặ', 'ẹ' => 'Ẹ', 'ẻ' => 'Ẻ', 'ẽ' => 'Ẽ', 'ế' => 'Ế', 'á»' => 'Ề', 'ể' => 'Ể', 'á»…' => 'Ễ', 'ệ' => 'Ệ', 'ỉ' => 'Ỉ', 'ị' => 'Ị', 'á»' => 'Ọ', 'á»' => 'Ỏ', 'ố' => 'á»', 'ồ' => 'á»’', 'ổ' => 'á»”', 'á»—' => 'á»–', 'á»™' => 'Ộ', 'á»›' => 'Ớ', 'á»' => 'Ờ', 'ở' => 'Ở', 'ỡ' => 'á» ', 'ợ' => 'Ợ', 'ụ' => 'Ụ', 'ủ' => 'Ủ', 'ứ' => 'Ứ', 'ừ' => 'Ừ', 'á»­' => 'Ử', 'ữ' => 'á»®', 'á»±' => 'á»°', 'ỳ' => 'Ỳ', 'ỵ' => 'á»´', 'á»·' => 'Ỷ', 'ỹ' => 'Ỹ', 'á»»' => 'Ỻ', 'ỽ' => 'Ỽ', 'ỿ' => 'Ỿ', 'á¼€' => 'Ἀ', 'á¼' => 'Ἁ', 'ἂ' => 'Ἂ', 'ἃ' => 'Ἃ', 'ἄ' => 'Ἄ', 'á¼…' => 'á¼', 'ἆ' => 'Ἆ', 'ἇ' => 'á¼', 'á¼' => 'Ἐ', 'ἑ' => 'á¼™', 'á¼’' => 'Ἒ', 'ἓ' => 'á¼›', 'á¼”' => 'Ἔ', 'ἕ' => 'á¼', 'á¼ ' => 'Ἠ', 'ἡ' => 'Ἡ', 'á¼¢' => 'Ἢ', 'á¼£' => 'Ἣ', 'ἤ' => 'Ἤ', 'á¼¥' => 'á¼­', 'ἦ' => 'á¼®', 'ἧ' => 'Ἧ', 'á¼°' => 'Ἰ', 'á¼±' => 'á¼¹', 'á¼²' => 'Ἲ', 'á¼³' => 'á¼»', 'á¼´' => 'á¼¼', 'á¼µ' => 'á¼½', 'ἶ' => 'á¼¾', 'á¼·' => 'Ἷ', 'á½€' => 'Ὀ', 'á½' => 'Ὁ', 'ὂ' => 'Ὂ', 'ὃ' => 'Ὃ', 'ὄ' => 'Ὄ', 'á½…' => 'á½', 'ὑ' => 'á½™', 'ὓ' => 'á½›', 'ὕ' => 'á½', 'á½—' => 'Ὗ', 'á½ ' => 'Ὠ', 'ὡ' => 'Ὡ', 'á½¢' => 'Ὢ', 'á½£' => 'Ὣ', 'ὤ' => 'Ὤ', 'á½¥' => 'á½­', 'ὦ' => 'á½®', 'ὧ' => 'Ὧ', 'á½°' => 'Ὰ', 'á½±' => 'á¾»', 'á½²' => 'Ὲ', 'á½³' => 'Έ', 'á½´' => 'á¿Š', 'á½µ' => 'á¿‹', 'ὶ' => 'á¿š', 'á½·' => 'á¿›', 'ὸ' => 'Ὸ', 'á½¹' => 'Ό', 'ὺ' => 'Ὺ', 'á½»' => 'á¿«', 'á½¼' => 'Ὼ', 'á½½' => 'á¿»', 'á¾€' => 'ᾈ', 'á¾' => 'ᾉ', 'ᾂ' => 'ᾊ', 'ᾃ' => 'ᾋ', 'ᾄ' => 'ᾌ', 'á¾…' => 'á¾', 'ᾆ' => 'ᾎ', 'ᾇ' => 'á¾', 'á¾' => 'ᾘ', 'ᾑ' => 'á¾™', 'á¾’' => 'ᾚ', 'ᾓ' => 'á¾›', 'á¾”' => 'ᾜ', 'ᾕ' => 'á¾', 'á¾–' => 'ᾞ', 'á¾—' => 'ᾟ', 'á¾ ' => 'ᾨ', 'ᾡ' => 'ᾩ', 'á¾¢' => 'ᾪ', 'á¾£' => 'ᾫ', 'ᾤ' => 'ᾬ', 'á¾¥' => 'á¾­', 'ᾦ' => 'á¾®', 'ᾧ' => 'ᾯ', 'á¾°' => 'Ᾰ', 'á¾±' => 'á¾¹', 'á¾³' => 'á¾¼', 'á¾¾' => 'Ι', 'ῃ' => 'á¿Œ', 'á¿' => 'Ῐ', 'á¿‘' => 'á¿™', 'á¿ ' => 'Ῠ', 'á¿¡' => 'á¿©', 'á¿¥' => 'Ῥ', 'ῳ' => 'ῼ', 'â…Ž' => 'Ⅎ', 'â…°' => 'â… ', 'â…±' => 'â…¡', 'â…²' => 'â…¢', 'â…³' => 'â…£', 'â…´' => 'â…¤', 'â…µ' => 'â…¥', 'â…¶' => 'â…¦', 'â…·' => 'â…§', 'â…¸' => 'â…¨', 'â…¹' => 'â…©', 'â…º' => 'â…ª', 'â…»' => 'â…«', 'â…¼' => 'â…¬', 'â…½' => 'â…­', 'â…¾' => 'â…®', 'â…¿' => 'â…¯', 'ↄ' => 'Ↄ', 'â“' => 'â’¶', 'â“‘' => 'â’·', 'â“’' => 'â’¸', 'â““' => 'â’¹', 'â“”' => 'â’º', 'â“•' => 'â’»', 'â“–' => 'â’¼', 'â“—' => 'â’½', 'ⓘ' => 'â’¾', 'â“™' => 'â’¿', 'â“š' => 'â“€', 'â“›' => 'â“', 'â“œ' => 'â“‚', 'â“' => 'Ⓝ', 'â“ž' => 'â“„', 'â“Ÿ' => 'â“…', 'â“ ' => 'Ⓠ', 'â“¡' => 'Ⓡ', 'â“¢' => 'Ⓢ', 'â“£' => 'Ⓣ', 'ⓤ' => 'â“Š', 'â“¥' => 'â“‹', 'ⓦ' => 'â“Œ', 'ⓧ' => 'â“', 'ⓨ' => 'â“Ž', 'â“©' => 'â“', 'â°°' => 'â°€', 'â°±' => 'â°', 'â°²' => 'â°‚', 'â°³' => 'â°ƒ', 'â°´' => 'â°„', 'â°µ' => 'â°…', 'â°¶' => 'â°†', 'â°·' => 'â°‡', 'â°¸' => 'â°ˆ', 'â°¹' => 'â°‰', 'â°º' => 'â°Š', 'â°»' => 'â°‹', 'â°¼' => 'â°Œ', 'â°½' => 'â°', 'â°¾' => 'â°Ž', 'â°¿' => 'â°', 'â±€' => 'â°', 'â±' => 'â°‘', 'ⱂ' => 'â°’', 'ⱃ' => 'â°“', 'ⱄ' => 'â°”', 'â±…' => 'â°•', 'ⱆ' => 'â°–', 'ⱇ' => 'â°—', 'ⱈ' => 'â°˜', 'ⱉ' => 'â°™', 'ⱊ' => 'â°š', 'ⱋ' => 'â°›', 'ⱌ' => 'â°œ', 'â±' => 'â°', 'ⱎ' => 'â°ž', 'â±' => 'â°Ÿ', 'â±' => 'â° ', 'ⱑ' => 'â°¡', 'â±’' => 'â°¢', 'ⱓ' => 'â°£', 'â±”' => 'â°¤', 'ⱕ' => 'â°¥', 'â±–' => 'â°¦', 'â±—' => 'â°§', 'ⱘ' => 'â°¨', 'â±™' => 'â°©', 'ⱚ' => 'â°ª', 'â±›' => 'â°«', 'ⱜ' => 'â°¬', 'â±' => 'â°­', 'ⱞ' => 'â°®', 'ⱡ' => 'â± ', 'â±¥' => 'Ⱥ', 'ⱦ' => 'Ⱦ', 'ⱨ' => 'Ⱨ', 'ⱪ' => 'Ⱪ', 'ⱬ' => 'Ⱬ', 'â±³' => 'â±²', 'ⱶ' => 'â±µ', 'â²' => 'â²€', 'ⲃ' => 'Ⲃ', 'â²…' => 'Ⲅ', 'ⲇ' => 'Ⲇ', 'ⲉ' => 'Ⲉ', 'ⲋ' => 'Ⲋ', 'â²' => 'Ⲍ', 'â²' => 'Ⲏ', 'ⲑ' => 'â²', 'ⲓ' => 'â²’', 'ⲕ' => 'â²”', 'â²—' => 'â²–', 'â²™' => 'Ⲙ', 'â²›' => 'Ⲛ', 'â²' => 'Ⲝ', 'ⲟ' => 'Ⲟ', 'ⲡ' => 'â² ', 'â²£' => 'â²¢', 'â²¥' => 'Ⲥ', 'ⲧ' => 'Ⲧ', 'ⲩ' => 'Ⲩ', 'ⲫ' => 'Ⲫ', 'â²­' => 'Ⲭ', 'ⲯ' => 'â²®', 'â²±' => 'â²°', 'â²³' => 'â²²', 'â²µ' => 'â²´', 'â²·' => 'Ⲷ', 'â²¹' => 'Ⲹ', 'â²»' => 'Ⲻ', 'â²½' => 'â²¼', 'ⲿ' => 'â²¾', 'â³' => 'â³€', 'ⳃ' => 'Ⳃ', 'â³…' => 'Ⳅ', 'ⳇ' => 'Ⳇ', 'ⳉ' => 'Ⳉ', 'ⳋ' => 'Ⳋ', 'â³' => 'Ⳍ', 'â³' => 'Ⳏ', 'ⳑ' => 'â³', 'ⳓ' => 'â³’', 'ⳕ' => 'â³”', 'â³—' => 'â³–', 'â³™' => 'Ⳙ', 'â³›' => 'Ⳛ', 'â³' => 'Ⳝ', 'ⳟ' => 'Ⳟ', 'ⳡ' => 'â³ ', 'â³£' => 'â³¢', 'ⳬ' => 'Ⳬ', 'â³®' => 'â³­', 'â³³' => 'â³²', 'â´€' => 'á‚ ', 'â´' => 'á‚¡', 'â´‚' => 'á‚¢', 'â´ƒ' => 'á‚£', 'â´„' => 'Ⴄ', 'â´…' => 'á‚¥', 'â´†' => 'Ⴆ', 'â´‡' => 'Ⴇ', 'â´ˆ' => 'Ⴈ', 'â´‰' => 'á‚©', 'â´Š' => 'Ⴊ', 'â´‹' => 'á‚«', 'â´Œ' => 'Ⴌ', 'â´' => 'á‚­', 'â´Ž' => 'á‚®', 'â´' => 'Ⴏ', 'â´' => 'á‚°', 'â´‘' => 'Ⴑ', 'â´’' => 'Ⴒ', 'â´“' => 'Ⴓ', 'â´”' => 'á‚´', 'â´•' => 'Ⴕ', 'â´–' => 'Ⴖ', 'â´—' => 'á‚·', 'â´˜' => 'Ⴘ', 'â´™' => 'Ⴙ', 'â´š' => 'Ⴚ', 'â´›' => 'á‚»', 'â´œ' => 'Ⴜ', 'â´' => 'Ⴝ', 'â´ž' => 'Ⴞ', 'â´Ÿ' => 'á‚¿', 'â´ ' => 'Ⴠ', 'â´¡' => 'áƒ', 'â´¢' => 'Ⴢ', 'â´£' => 'Ⴣ', 'â´¤' => 'Ⴤ', 'â´¥' => 'Ⴥ', 'â´§' => 'Ⴧ', 'â´­' => 'áƒ', 'ê™' => 'Ꙁ', 'ꙃ' => 'Ꙃ', 'ê™…' => 'Ꙅ', 'ꙇ' => 'Ꙇ', 'ꙉ' => 'Ꙉ', 'ꙋ' => 'Ꙋ', 'ê™' => 'Ꙍ', 'ê™' => 'Ꙏ', 'ꙑ' => 'ê™', 'ꙓ' => 'ê™’', 'ꙕ' => 'ê™”', 'ê™—' => 'ê™–', 'ê™™' => 'Ꙙ', 'ê™›' => 'Ꙛ', 'ê™' => 'Ꙝ', 'ꙟ' => 'Ꙟ', 'ꙡ' => 'ê™ ', 'ꙣ' => 'Ꙣ', 'ꙥ' => 'Ꙥ', 'ꙧ' => 'Ꙧ', 'ꙩ' => 'Ꙩ', 'ꙫ' => 'Ꙫ', 'ê™­' => 'Ꙭ', 'êš' => 'Ꚁ', 'ꚃ' => 'êš‚', 'êš…' => 'êš„', 'ꚇ' => 'Ꚇ', 'ꚉ' => 'Ꚉ', 'êš‹' => 'Ꚋ', 'êš' => 'Ꚍ', 'êš' => 'Ꚏ', 'êš‘' => 'êš', 'êš“' => 'êš’', 'êš•' => 'êš”', 'êš—' => 'êš–', 'êš™' => 'Ꚙ', 'êš›' => 'êšš', 'ꜣ' => 'Ꜣ', 'ꜥ' => 'Ꜥ', 'ꜧ' => 'Ꜧ', 'ꜩ' => 'Ꜩ', 'ꜫ' => 'Ꜫ', 'ꜭ' => 'Ꜭ', 'ꜯ' => 'Ꜯ', 'ꜳ' => 'Ꜳ', 'ꜵ' => 'Ꜵ', 'ꜷ' => 'Ꜷ', 'ꜹ' => 'Ꜹ', 'ꜻ' => 'Ꜻ', 'ꜽ' => 'Ꜽ', 'ꜿ' => 'Ꜿ', 'ê' => 'ê€', 'êƒ' => 'ê‚', 'ê…' => 'ê„', 'ê‡' => 'ê†', 'ê‰' => 'êˆ', 'ê‹' => 'êŠ', 'ê' => 'êŒ', 'ê' => 'êŽ', 'ê‘' => 'ê', 'ê“' => 'ê’', 'ê•' => 'ê”', 'ê—' => 'ê–', 'ê™' => 'ê˜', 'ê›' => 'êš', 'ê' => 'êœ', 'êŸ' => 'êž', 'ê¡' => 'ê ', 'ê£' => 'ê¢', 'ê¥' => 'ê¤', 'ê§' => 'ê¦', 'ê©' => 'ê¨', 'ê«' => 'êª', 'ê­' => 'ê¬', 'ê¯' => 'ê®', 'êº' => 'ê¹', 'ê¼' => 'ê»', 'ê¿' => 'ê¾', 'êž' => 'Ꞁ', 'ꞃ' => 'êž‚', 'êž…' => 'êž„', 'ꞇ' => 'Ꞇ', 'ꞌ' => 'êž‹', 'êž‘' => 'êž', 'êž“' => 'êž’', 'êž”' => 'Ꞔ', 'êž—' => 'êž–', 'êž™' => 'Ꞙ', 'êž›' => 'êžš', 'êž' => 'êžœ', 'ꞟ' => 'êžž', 'êž¡' => 'êž ', 'ꞣ' => 'Ꞣ', 'ꞥ' => 'Ꞥ', 'ꞧ' => 'Ꞧ', 'êž©' => 'Ꞩ', 'êžµ' => 'êž´', 'êž·' => 'Ꞷ', 'êž¹' => 'Ꞹ', 'êž»' => 'Ꞻ', 'êž½' => 'êž¼', 'êž¿' => 'êž¾', 'ꟃ' => 'Ꟃ', 'ꟈ' => 'Ꟈ', 'ꟊ' => 'Ꟊ', 'ꟶ' => 'Ꟶ', 'ê­“' => 'êž³', 'ê­°' => 'Ꭰ', 'ê­±' => 'Ꭱ', 'ê­²' => 'Ꭲ', 'ê­³' => 'Ꭳ', 'ê­´' => 'Ꭴ', 'ê­µ' => 'Ꭵ', 'ê­¶' => 'Ꭶ', 'ê­·' => 'Ꭷ', 'ê­¸' => 'Ꭸ', 'ê­¹' => 'Ꭹ', 'ê­º' => 'Ꭺ', 'ê­»' => 'Ꭻ', 'ê­¼' => 'Ꭼ', 'ê­½' => 'Ꭽ', 'ê­¾' => 'Ꭾ', 'ê­¿' => 'Ꭿ', 'ꮀ' => 'Ꮀ', 'ê®' => 'Ꮁ', 'ꮂ' => 'Ꮂ', 'ꮃ' => 'Ꮃ', 'ꮄ' => 'Ꮄ', 'ê®…' => 'Ꮅ', 'ꮆ' => 'Ꮆ', 'ꮇ' => 'Ꮇ', 'ꮈ' => 'Ꮈ', 'ꮉ' => 'Ꮉ', 'ꮊ' => 'Ꮊ', 'ꮋ' => 'Ꮋ', 'ꮌ' => 'Ꮌ', 'ê®' => 'Ꮍ', 'ꮎ' => 'Ꮎ', 'ê®' => 'Ꮏ', 'ê®' => 'á€', 'ꮑ' => 'á', 'ê®’' => 'á‚', 'ꮓ' => 'áƒ', 'ê®”' => 'á„', 'ꮕ' => 'á…', 'ê®–' => 'á†', 'ê®—' => 'á‡', 'ꮘ' => 'áˆ', 'ê®™' => 'á‰', 'ꮚ' => 'áŠ', 'ê®›' => 'á‹', 'ꮜ' => 'áŒ', 'ê®' => 'á', 'ꮞ' => 'áŽ', 'ꮟ' => 'á', 'ê® ' => 'á', 'ꮡ' => 'á‘', 'ꮢ' => 'á’', 'ꮣ' => 'á“', 'ꮤ' => 'á”', 'ꮥ' => 'á•', 'ꮦ' => 'á–', 'ꮧ' => 'á—', 'ꮨ' => 'á˜', 'ꮩ' => 'á™', 'ꮪ' => 'áš', 'ꮫ' => 'á›', 'ꮬ' => 'áœ', 'ê®­' => 'á', 'ê®®' => 'áž', 'ꮯ' => 'áŸ', 'ê®°' => 'á ', 'ê®±' => 'á¡', 'ꮲ' => 'á¢', 'ꮳ' => 'á£', 'ê®´' => 'á¤', 'ꮵ' => 'á¥', 'ꮶ' => 'á¦', 'ê®·' => 'á§', 'ꮸ' => 'á¨', 'ꮹ' => 'á©', 'ꮺ' => 'áª', 'ê®»' => 'á«', 'ꮼ' => 'á¬', 'ꮽ' => 'á­', 'ꮾ' => 'á®', 'ꮿ' => 'á¯', 'ï½' => 'A', 'b' => 'ï¼¢', 'c' => 'ï¼£', 'd' => 'D', 'ï½…' => 'ï¼¥', 'f' => 'F', 'g' => 'G', 'h' => 'H', 'i' => 'I', 'j' => 'J', 'k' => 'K', 'l' => 'L', 'ï½' => 'ï¼­', 'n' => 'ï¼®', 'ï½' => 'O', 'ï½' => 'ï¼°', 'q' => 'ï¼±', 'ï½’' => 'ï¼²', 's' => 'ï¼³', 'ï½”' => 'ï¼´', 'u' => 'ï¼µ', 'ï½–' => 'V', 'ï½—' => 'ï¼·', 'x' => 'X', 'ï½™' => 'ï¼¹', 'z' => 'Z', 'ð¨' => 'ð€', 'ð©' => 'ð', 'ðª' => 'ð‚', 'ð«' => 'ðƒ', 'ð¬' => 'ð„', 'ð­' => 'ð…', 'ð®' => 'ð†', 'ð¯' => 'ð‡', 'ð°' => 'ðˆ', 'ð±' => 'ð‰', 'ð²' => 'ðŠ', 'ð³' => 'ð‹', 'ð´' => 'ðŒ', 'ðµ' => 'ð', 'ð¶' => 'ðŽ', 'ð·' => 'ð', 'ð¸' => 'ð', 'ð¹' => 'ð‘', 'ðº' => 'ð’', 'ð»' => 'ð“', 'ð¼' => 'ð”', 'ð½' => 'ð•', 'ð¾' => 'ð–', 'ð¿' => 'ð—', 'ð‘€' => 'ð˜', 'ð‘' => 'ð™', 'ð‘‚' => 'ðš', 'ð‘ƒ' => 'ð›', 'ð‘„' => 'ðœ', 'ð‘…' => 'ð', 'ð‘†' => 'ðž', 'ð‘‡' => 'ðŸ', 'ð‘ˆ' => 'ð ', 'ð‘‰' => 'ð¡', 'ð‘Š' => 'ð¢', 'ð‘‹' => 'ð£', 'ð‘Œ' => 'ð¤', 'ð‘' => 'ð¥', 'ð‘Ž' => 'ð¦', 'ð‘' => 'ð§', 'ð“˜' => 'ð’°', 'ð“™' => 'ð’±', 'ð“š' => 'ð’²', 'ð“›' => 'ð’³', 'ð“œ' => 'ð’´', 'ð“' => 'ð’µ', 'ð“ž' => 'ð’¶', 'ð“Ÿ' => 'ð’·', 'ð“ ' => 'ð’¸', 'ð“¡' => 'ð’¹', 'ð“¢' => 'ð’º', 'ð“£' => 'ð’»', 'ð“¤' => 'ð’¼', 'ð“¥' => 'ð’½', 'ð“¦' => 'ð’¾', 'ð“§' => 'ð’¿', 'ð“¨' => 'ð“€', 'ð“©' => 'ð“', 'ð“ª' => 'ð“‚', 'ð“«' => 'ð“ƒ', 'ð“¬' => 'ð“„', 'ð“­' => 'ð“…', 'ð“®' => 'ð“†', 'ð“¯' => 'ð“‡', 'ð“°' => 'ð“ˆ', 'ð“±' => 'ð“‰', 'ð“²' => 'ð“Š', 'ð“³' => 'ð“‹', 'ð“´' => 'ð“Œ', 'ð“µ' => 'ð“', 'ð“¶' => 'ð“Ž', 'ð“·' => 'ð“', 'ð“¸' => 'ð“', 'ð“¹' => 'ð“‘', 'ð“º' => 'ð“’', 'ð“»' => 'ð““', 'ð³€' => 'ð²€', 'ð³' => 'ð²', 'ð³‚' => 'ð²‚', 'ð³ƒ' => 'ð²ƒ', 'ð³„' => 'ð²„', 'ð³…' => 'ð²…', 'ð³†' => 'ð²†', 'ð³‡' => 'ð²‡', 'ð³ˆ' => 'ð²ˆ', 'ð³‰' => 'ð²‰', 'ð³Š' => 'ð²Š', 'ð³‹' => 'ð²‹', 'ð³Œ' => 'ð²Œ', 'ð³' => 'ð²', 'ð³Ž' => 'ð²Ž', 'ð³' => 'ð²', 'ð³' => 'ð²', 'ð³‘' => 'ð²‘', 'ð³’' => 'ð²’', 'ð³“' => 'ð²“', 'ð³”' => 'ð²”', 'ð³•' => 'ð²•', 'ð³–' => 'ð²–', 'ð³—' => 'ð²—', 'ð³˜' => 'ð²˜', 'ð³™' => 'ð²™', 'ð³š' => 'ð²š', 'ð³›' => 'ð²›', 'ð³œ' => 'ð²œ', 'ð³' => 'ð²', 'ð³ž' => 'ð²ž', 'ð³Ÿ' => 'ð²Ÿ', 'ð³ ' => 'ð² ', 'ð³¡' => 'ð²¡', 'ð³¢' => 'ð²¢', 'ð³£' => 'ð²£', 'ð³¤' => 'ð²¤', 'ð³¥' => 'ð²¥', 'ð³¦' => 'ð²¦', 'ð³§' => 'ð²§', 'ð³¨' => 'ð²¨', 'ð³©' => 'ð²©', 'ð³ª' => 'ð²ª', 'ð³«' => 'ð²«', 'ð³¬' => 'ð²¬', 'ð³­' => 'ð²­', 'ð³®' => 'ð²®', 'ð³¯' => 'ð²¯', 'ð³°' => 'ð²°', 'ð³±' => 'ð²±', 'ð³²' => 'ð²²', 'ð‘£€' => 'ð‘¢ ', 'ð‘£' => '𑢡', '𑣂' => 'ð‘¢¢', '𑣃' => 'ð‘¢£', '𑣄' => '𑢤', 'ð‘£…' => 'ð‘¢¥', '𑣆' => '𑢦', '𑣇' => '𑢧', '𑣈' => '𑢨', '𑣉' => '𑢩', '𑣊' => '𑢪', '𑣋' => '𑢫', '𑣌' => '𑢬', 'ð‘£' => 'ð‘¢­', '𑣎' => 'ð‘¢®', 'ð‘£' => '𑢯', 'ð‘£' => 'ð‘¢°', '𑣑' => 'ð‘¢±', 'ð‘£’' => 'ð‘¢²', '𑣓' => 'ð‘¢³', 'ð‘£”' => 'ð‘¢´', '𑣕' => 'ð‘¢µ', 'ð‘£–' => '𑢶', 'ð‘£—' => 'ð‘¢·', '𑣘' => '𑢸', 'ð‘£™' => 'ð‘¢¹', '𑣚' => '𑢺', 'ð‘£›' => 'ð‘¢»', '𑣜' => 'ð‘¢¼', 'ð‘£' => 'ð‘¢½', '𑣞' => 'ð‘¢¾', '𑣟' => '𑢿', 'ð–¹ ' => 'ð–¹€', '𖹡' => 'ð–¹', 'ð–¹¢' => '𖹂', 'ð–¹£' => '𖹃', '𖹤' => '𖹄', 'ð–¹¥' => 'ð–¹…', '𖹦' => '𖹆', '𖹧' => '𖹇', '𖹨' => '𖹈', '𖹩' => '𖹉', '𖹪' => '𖹊', '𖹫' => '𖹋', '𖹬' => '𖹌', 'ð–¹­' => 'ð–¹', 'ð–¹®' => '𖹎', '𖹯' => 'ð–¹', 'ð–¹°' => 'ð–¹', 'ð–¹±' => '𖹑', 'ð–¹²' => 'ð–¹’', 'ð–¹³' => '𖹓', 'ð–¹´' => 'ð–¹”', 'ð–¹µ' => '𖹕', '𖹶' => 'ð–¹–', 'ð–¹·' => 'ð–¹—', '𖹸' => '𖹘', 'ð–¹¹' => 'ð–¹™', '𖹺' => '𖹚', 'ð–¹»' => 'ð–¹›', 'ð–¹¼' => '𖹜', 'ð–¹½' => 'ð–¹', 'ð–¹¾' => '𖹞', '𖹿' => '𖹟', '𞤢' => '𞤀', '𞤣' => 'ðž¤', '𞤤' => '𞤂', '𞤥' => '𞤃', '𞤦' => '𞤄', '𞤧' => '𞤅', '𞤨' => '𞤆', '𞤩' => '𞤇', '𞤪' => '𞤈', '𞤫' => '𞤉', '𞤬' => '𞤊', '𞤭' => '𞤋', '𞤮' => '𞤌', '𞤯' => 'ðž¤', '𞤰' => '𞤎', '𞤱' => 'ðž¤', '𞤲' => 'ðž¤', '𞤳' => '𞤑', '𞤴' => '𞤒', '𞤵' => '𞤓', '𞤶' => '𞤔', '𞤷' => '𞤕', '𞤸' => '𞤖', '𞤹' => '𞤗', '𞤺' => '𞤘', '𞤻' => '𞤙', '𞤼' => '𞤚', '𞤽' => '𞤛', '𞤾' => '𞤜', '𞤿' => 'ðž¤', '𞥀' => '𞤞', 'ðž¥' => '𞤟', '𞥂' => '𞤠', '𞥃' => '𞤡'); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php000064400000052420147600374260026634 0ustar00 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r', 'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x', 'Y' => 'y', 'Z' => 'z', 'À' => 'à', 'Ã' => 'á', 'Â' => 'â', 'Ã' => 'ã', 'Ä' => 'ä', 'Ã…' => 'Ã¥', 'Æ' => 'æ', 'Ç' => 'ç', 'È' => 'è', 'É' => 'é', 'Ê' => 'ê', 'Ë' => 'ë', 'ÃŒ' => 'ì', 'Ã' => 'í', 'ÃŽ' => 'î', 'Ã' => 'ï', 'Ã' => 'ð', 'Ñ' => 'ñ', 'Ã’' => 'ò', 'Ó' => 'ó', 'Ô' => 'ô', 'Õ' => 'õ', 'Ö' => 'ö', 'Ø' => 'ø', 'Ù' => 'ù', 'Ú' => 'ú', 'Û' => 'û', 'Ãœ' => 'ü', 'Ã' => 'ý', 'Þ' => 'þ', 'Ä€' => 'Ä', 'Ä‚' => 'ă', 'Ä„' => 'Ä…', 'Ć' => 'ć', 'Ĉ' => 'ĉ', 'ÄŠ' => 'Ä‹', 'ÄŒ' => 'Ä', 'ÄŽ' => 'Ä', 'Ä' => 'Ä‘', 'Ä’' => 'Ä“', 'Ä”' => 'Ä•', 'Ä–' => 'Ä—', 'Ę' => 'Ä™', 'Äš' => 'Ä›', 'Äœ' => 'Ä', 'Äž' => 'ÄŸ', 'Ä ' => 'Ä¡', 'Ä¢' => 'Ä£', 'Ĥ' => 'Ä¥', 'Ħ' => 'ħ', 'Ĩ' => 'Ä©', 'Ī' => 'Ä«', 'Ĭ' => 'Ä­', 'Ä®' => 'į', 'Ä°' => 'i', 'IJ' => 'ij', 'Ä´' => 'ĵ', 'Ķ' => 'Ä·', 'Ĺ' => 'ĺ', 'Ä»' => 'ļ', 'Ľ' => 'ľ', 'Ä¿' => 'Å€', 'Å' => 'Å‚', 'Ń' => 'Å„', 'Å…' => 'ņ', 'Ň' => 'ň', 'ÅŠ' => 'Å‹', 'ÅŒ' => 'Å', 'ÅŽ' => 'Å', 'Å' => 'Å‘', 'Å’' => 'Å“', 'Å”' => 'Å•', 'Å–' => 'Å—', 'Ř' => 'Å™', 'Åš' => 'Å›', 'Åœ' => 'Å', 'Åž' => 'ÅŸ', 'Å ' => 'Å¡', 'Å¢' => 'Å£', 'Ť' => 'Å¥', 'Ŧ' => 'ŧ', 'Ũ' => 'Å©', 'Ū' => 'Å«', 'Ŭ' => 'Å­', 'Å®' => 'ů', 'Å°' => 'ű', 'Ų' => 'ų', 'Å´' => 'ŵ', 'Ŷ' => 'Å·', 'Ÿ' => 'ÿ', 'Ź' => 'ź', 'Å»' => 'ż', 'Ž' => 'ž', 'Æ' => 'É“', 'Æ‚' => 'ƃ', 'Æ„' => 'Æ…', 'Ɔ' => 'É”', 'Ƈ' => 'ƈ', 'Ɖ' => 'É–', 'ÆŠ' => 'É—', 'Æ‹' => 'ÆŒ', 'ÆŽ' => 'Ç', 'Æ' => 'É™', 'Æ' => 'É›', 'Æ‘' => 'Æ’', 'Æ“' => 'É ', 'Æ”' => 'É£', 'Æ–' => 'É©', 'Æ—' => 'ɨ', 'Ƙ' => 'Æ™', 'Æœ' => 'ɯ', 'Æ' => 'ɲ', 'ÆŸ' => 'ɵ', 'Æ ' => 'Æ¡', 'Æ¢' => 'Æ£', 'Ƥ' => 'Æ¥', 'Ʀ' => 'Ê€', 'Ƨ' => 'ƨ', 'Æ©' => 'ʃ', 'Ƭ' => 'Æ­', 'Æ®' => 'ʈ', 'Ư' => 'Æ°', 'Ʊ' => 'ÊŠ', 'Ʋ' => 'Ê‹', 'Ƴ' => 'Æ´', 'Ƶ' => 'ƶ', 'Æ·' => 'Ê’', 'Ƹ' => 'ƹ', 'Ƽ' => 'ƽ', 'Ç„' => 'dž', 'Ç…' => 'dž', 'LJ' => 'lj', 'Lj' => 'lj', 'ÇŠ' => 'ÇŒ', 'Ç‹' => 'ÇŒ', 'Ç' => 'ÇŽ', 'Ç' => 'Ç', 'Ç‘' => 'Ç’', 'Ç“' => 'Ç”', 'Ç•' => 'Ç–', 'Ç—' => 'ǘ', 'Ç™' => 'Çš', 'Ç›' => 'Çœ', 'Çž' => 'ÇŸ', 'Ç ' => 'Ç¡', 'Ç¢' => 'Ç£', 'Ǥ' => 'Ç¥', 'Ǧ' => 'ǧ', 'Ǩ' => 'Ç©', 'Ǫ' => 'Ç«', 'Ǭ' => 'Ç­', 'Ç®' => 'ǯ', 'DZ' => 'dz', 'Dz' => 'dz', 'Ç´' => 'ǵ', 'Ƕ' => 'Æ•', 'Ç·' => 'Æ¿', 'Ǹ' => 'ǹ', 'Ǻ' => 'Ç»', 'Ǽ' => 'ǽ', 'Ǿ' => 'Ç¿', 'È€' => 'È', 'È‚' => 'ȃ', 'È„' => 'È…', 'Ȇ' => 'ȇ', 'Ȉ' => 'ȉ', 'ÈŠ' => 'È‹', 'ÈŒ' => 'È', 'ÈŽ' => 'È', 'È' => 'È‘', 'È’' => 'È“', 'È”' => 'È•', 'È–' => 'È—', 'Ș' => 'È™', 'Èš' => 'È›', 'Èœ' => 'È', 'Èž' => 'ÈŸ', 'È ' => 'Æž', 'È¢' => 'È£', 'Ȥ' => 'È¥', 'Ȧ' => 'ȧ', 'Ȩ' => 'È©', 'Ȫ' => 'È«', 'Ȭ' => 'È­', 'È®' => 'ȯ', 'È°' => 'ȱ', 'Ȳ' => 'ȳ', 'Ⱥ' => 'â±¥', 'È»' => 'ȼ', 'Ƚ' => 'Æš', 'Ⱦ' => 'ⱦ', 'É' => 'É‚', 'Ƀ' => 'Æ€', 'É„' => 'ʉ', 'É…' => 'ÊŒ', 'Ɇ' => 'ɇ', 'Ɉ' => 'ɉ', 'ÉŠ' => 'É‹', 'ÉŒ' => 'É', 'ÉŽ' => 'É', 'Í°' => 'ͱ', 'Ͳ' => 'ͳ', 'Ͷ' => 'Í·', 'Í¿' => 'ϳ', 'Ά' => 'ά', 'Έ' => 'έ', 'Ή' => 'ή', 'Ί' => 'ί', 'ÎŒ' => 'ÏŒ', 'ÎŽ' => 'Ï', 'Î' => 'ÏŽ', 'Α' => 'α', 'Î’' => 'β', 'Γ' => 'γ', 'Δ' => 'δ', 'Ε' => 'ε', 'Ζ' => 'ζ', 'Η' => 'η', 'Θ' => 'θ', 'Ι' => 'ι', 'Κ' => 'κ', 'Λ' => 'λ', 'Îœ' => 'μ', 'Î' => 'ν', 'Ξ' => 'ξ', 'Ο' => 'ο', 'Π' => 'Ï€', 'Ρ' => 'Ï', 'Σ' => 'σ', 'Τ' => 'Ï„', 'Î¥' => 'Ï…', 'Φ' => 'φ', 'Χ' => 'χ', 'Ψ' => 'ψ', 'Ω' => 'ω', 'Ϊ' => 'ÏŠ', 'Ϋ' => 'Ï‹', 'Ï' => 'Ï—', 'Ϙ' => 'Ï™', 'Ïš' => 'Ï›', 'Ïœ' => 'Ï', 'Ïž' => 'ÏŸ', 'Ï ' => 'Ï¡', 'Ï¢' => 'Ï£', 'Ϥ' => 'Ï¥', 'Ϧ' => 'ϧ', 'Ϩ' => 'Ï©', 'Ϫ' => 'Ï«', 'Ϭ' => 'Ï­', 'Ï®' => 'ϯ', 'Ï´' => 'θ', 'Ï·' => 'ϸ', 'Ϲ' => 'ϲ', 'Ϻ' => 'Ï»', 'Ͻ' => 'Í»', 'Ͼ' => 'ͼ', 'Ï¿' => 'ͽ', 'Ѐ' => 'Ñ', 'Ð' => 'Ñ‘', 'Ђ' => 'Ñ’', 'Ѓ' => 'Ñ“', 'Є' => 'Ñ”', 'Ð…' => 'Ñ•', 'І' => 'Ñ–', 'Ї' => 'Ñ—', 'Ј' => 'ј', 'Љ' => 'Ñ™', 'Њ' => 'Ñš', 'Ћ' => 'Ñ›', 'ÐŒ' => 'Ñœ', 'Ð' => 'Ñ', 'ÐŽ' => 'Ñž', 'Ð' => 'ÑŸ', 'Ð' => 'а', 'Б' => 'б', 'Ð’' => 'в', 'Г' => 'г', 'Д' => 'д', 'Е' => 'е', 'Ж' => 'ж', 'З' => 'з', 'И' => 'и', 'Й' => 'й', 'К' => 'к', 'Л' => 'л', 'Ðœ' => 'м', 'Ð' => 'н', 'О' => 'о', 'П' => 'п', 'Р' => 'Ñ€', 'С' => 'Ñ', 'Т' => 'Ñ‚', 'У' => 'у', 'Ф' => 'Ñ„', 'Ð¥' => 'Ñ…', 'Ц' => 'ц', 'Ч' => 'ч', 'Ш' => 'ш', 'Щ' => 'щ', 'Ъ' => 'ÑŠ', 'Ы' => 'Ñ‹', 'Ь' => 'ÑŒ', 'Э' => 'Ñ', 'Ю' => 'ÑŽ', 'Я' => 'Ñ', 'Ñ ' => 'Ñ¡', 'Ñ¢' => 'Ñ£', 'Ѥ' => 'Ñ¥', 'Ѧ' => 'ѧ', 'Ѩ' => 'Ñ©', 'Ѫ' => 'Ñ«', 'Ѭ' => 'Ñ­', 'Ñ®' => 'ѯ', 'Ñ°' => 'ѱ', 'Ѳ' => 'ѳ', 'Ñ´' => 'ѵ', 'Ѷ' => 'Ñ·', 'Ѹ' => 'ѹ', 'Ѻ' => 'Ñ»', 'Ѽ' => 'ѽ', 'Ѿ' => 'Ñ¿', 'Ò€' => 'Ò', 'ÒŠ' => 'Ò‹', 'ÒŒ' => 'Ò', 'ÒŽ' => 'Ò', 'Ò' => 'Ò‘', 'Ò’' => 'Ò“', 'Ò”' => 'Ò•', 'Ò–' => 'Ò—', 'Ò˜' => 'Ò™', 'Òš' => 'Ò›', 'Òœ' => 'Ò', 'Òž' => 'ÒŸ', 'Ò ' => 'Ò¡', 'Ò¢' => 'Ò£', 'Ò¤' => 'Ò¥', 'Ò¦' => 'Ò§', 'Ò¨' => 'Ò©', 'Òª' => 'Ò«', 'Ò¬' => 'Ò­', 'Ò®' => 'Ò¯', 'Ò°' => 'Ò±', 'Ò²' => 'Ò³', 'Ò´' => 'Òµ', 'Ò¶' => 'Ò·', 'Ò¸' => 'Ò¹', 'Òº' => 'Ò»', 'Ò¼' => 'Ò½', 'Ò¾' => 'Ò¿', 'Ó€' => 'Ó', 'Ó' => 'Ó‚', 'Óƒ' => 'Ó„', 'Ó…' => 'Ó†', 'Ó‡' => 'Óˆ', 'Ó‰' => 'ÓŠ', 'Ó‹' => 'ÓŒ', 'Ó' => 'ÓŽ', 'Ó' => 'Ó‘', 'Ó’' => 'Ó“', 'Ó”' => 'Ó•', 'Ó–' => 'Ó—', 'Ó˜' => 'Ó™', 'Óš' => 'Ó›', 'Óœ' => 'Ó', 'Óž' => 'ÓŸ', 'Ó ' => 'Ó¡', 'Ó¢' => 'Ó£', 'Ó¤' => 'Ó¥', 'Ó¦' => 'Ó§', 'Ó¨' => 'Ó©', 'Óª' => 'Ó«', 'Ó¬' => 'Ó­', 'Ó®' => 'Ó¯', 'Ó°' => 'Ó±', 'Ó²' => 'Ó³', 'Ó´' => 'Óµ', 'Ó¶' => 'Ó·', 'Ó¸' => 'Ó¹', 'Óº' => 'Ó»', 'Ó¼' => 'Ó½', 'Ó¾' => 'Ó¿', 'Ô€' => 'Ô', 'Ô‚' => 'Ôƒ', 'Ô„' => 'Ô…', 'Ô†' => 'Ô‡', 'Ôˆ' => 'Ô‰', 'ÔŠ' => 'Ô‹', 'ÔŒ' => 'Ô', 'ÔŽ' => 'Ô', 'Ô' => 'Ô‘', 'Ô’' => 'Ô“', 'Ô”' => 'Ô•', 'Ô–' => 'Ô—', 'Ô˜' => 'Ô™', 'Ôš' => 'Ô›', 'Ôœ' => 'Ô', 'Ôž' => 'ÔŸ', 'Ô ' => 'Ô¡', 'Ô¢' => 'Ô£', 'Ô¤' => 'Ô¥', 'Ô¦' => 'Ô§', 'Ô¨' => 'Ô©', 'Ôª' => 'Ô«', 'Ô¬' => 'Ô­', 'Ô®' => 'Ô¯', 'Ô±' => 'Õ¡', 'Ô²' => 'Õ¢', 'Ô³' => 'Õ£', 'Ô´' => 'Õ¤', 'Ôµ' => 'Õ¥', 'Ô¶' => 'Õ¦', 'Ô·' => 'Õ§', 'Ô¸' => 'Õ¨', 'Ô¹' => 'Õ©', 'Ôº' => 'Õª', 'Ô»' => 'Õ«', 'Ô¼' => 'Õ¬', 'Ô½' => 'Õ­', 'Ô¾' => 'Õ®', 'Ô¿' => 'Õ¯', 'Õ€' => 'Õ°', 'Õ' => 'Õ±', 'Õ‚' => 'Õ²', 'Õƒ' => 'Õ³', 'Õ„' => 'Õ´', 'Õ…' => 'Õµ', 'Õ†' => 'Õ¶', 'Õ‡' => 'Õ·', 'Õˆ' => 'Õ¸', 'Õ‰' => 'Õ¹', 'ÕŠ' => 'Õº', 'Õ‹' => 'Õ»', 'ÕŒ' => 'Õ¼', 'Õ' => 'Õ½', 'ÕŽ' => 'Õ¾', 'Õ' => 'Õ¿', 'Õ' => 'Ö€', 'Õ‘' => 'Ö', 'Õ’' => 'Ö‚', 'Õ“' => 'Öƒ', 'Õ”' => 'Ö„', 'Õ•' => 'Ö…', 'Õ–' => 'Ö†', 'á‚ ' => 'â´€', 'á‚¡' => 'â´', 'á‚¢' => 'â´‚', 'á‚£' => 'â´ƒ', 'Ⴄ' => 'â´„', 'á‚¥' => 'â´…', 'Ⴆ' => 'â´†', 'Ⴇ' => 'â´‡', 'Ⴈ' => 'â´ˆ', 'á‚©' => 'â´‰', 'Ⴊ' => 'â´Š', 'á‚«' => 'â´‹', 'Ⴌ' => 'â´Œ', 'á‚­' => 'â´', 'á‚®' => 'â´Ž', 'Ⴏ' => 'â´', 'á‚°' => 'â´', 'Ⴑ' => 'â´‘', 'Ⴒ' => 'â´’', 'Ⴓ' => 'â´“', 'á‚´' => 'â´”', 'Ⴕ' => 'â´•', 'Ⴖ' => 'â´–', 'á‚·' => 'â´—', 'Ⴘ' => 'â´˜', 'Ⴙ' => 'â´™', 'Ⴚ' => 'â´š', 'á‚»' => 'â´›', 'Ⴜ' => 'â´œ', 'Ⴝ' => 'â´', 'Ⴞ' => 'â´ž', 'á‚¿' => 'â´Ÿ', 'Ⴠ' => 'â´ ', 'áƒ' => 'â´¡', 'Ⴢ' => 'â´¢', 'Ⴣ' => 'â´£', 'Ⴤ' => 'â´¤', 'Ⴥ' => 'â´¥', 'Ⴧ' => 'â´§', 'áƒ' => 'â´­', 'Ꭰ' => 'ê­°', 'Ꭱ' => 'ê­±', 'Ꭲ' => 'ê­²', 'Ꭳ' => 'ê­³', 'Ꭴ' => 'ê­´', 'Ꭵ' => 'ê­µ', 'Ꭶ' => 'ê­¶', 'Ꭷ' => 'ê­·', 'Ꭸ' => 'ê­¸', 'Ꭹ' => 'ê­¹', 'Ꭺ' => 'ê­º', 'Ꭻ' => 'ê­»', 'Ꭼ' => 'ê­¼', 'Ꭽ' => 'ê­½', 'Ꭾ' => 'ê­¾', 'Ꭿ' => 'ê­¿', 'Ꮀ' => 'ꮀ', 'Ꮁ' => 'ê®', 'Ꮂ' => 'ꮂ', 'Ꮃ' => 'ꮃ', 'Ꮄ' => 'ꮄ', 'Ꮅ' => 'ê®…', 'Ꮆ' => 'ꮆ', 'Ꮇ' => 'ꮇ', 'Ꮈ' => 'ꮈ', 'Ꮉ' => 'ꮉ', 'Ꮊ' => 'ꮊ', 'Ꮋ' => 'ꮋ', 'Ꮌ' => 'ꮌ', 'Ꮍ' => 'ê®', 'Ꮎ' => 'ꮎ', 'Ꮏ' => 'ê®', 'á€' => 'ê®', 'á' => 'ꮑ', 'á‚' => 'ê®’', 'áƒ' => 'ꮓ', 'á„' => 'ê®”', 'á…' => 'ꮕ', 'á†' => 'ê®–', 'á‡' => 'ê®—', 'áˆ' => 'ꮘ', 'á‰' => 'ê®™', 'áŠ' => 'ꮚ', 'á‹' => 'ê®›', 'áŒ' => 'ꮜ', 'á' => 'ê®', 'áŽ' => 'ꮞ', 'á' => 'ꮟ', 'á' => 'ê® ', 'á‘' => 'ꮡ', 'á’' => 'ꮢ', 'á“' => 'ꮣ', 'á”' => 'ꮤ', 'á•' => 'ꮥ', 'á–' => 'ꮦ', 'á—' => 'ꮧ', 'á˜' => 'ꮨ', 'á™' => 'ꮩ', 'áš' => 'ꮪ', 'á›' => 'ꮫ', 'áœ' => 'ꮬ', 'á' => 'ê®­', 'áž' => 'ê®®', 'áŸ' => 'ꮯ', 'á ' => 'ê®°', 'á¡' => 'ê®±', 'á¢' => 'ꮲ', 'á£' => 'ꮳ', 'á¤' => 'ê®´', 'á¥' => 'ꮵ', 'á¦' => 'ꮶ', 'á§' => 'ê®·', 'á¨' => 'ꮸ', 'á©' => 'ꮹ', 'áª' => 'ꮺ', 'á«' => 'ê®»', 'á¬' => 'ꮼ', 'á­' => 'ꮽ', 'á®' => 'ꮾ', 'á¯' => 'ꮿ', 'á°' => 'á¸', 'á±' => 'á¹', 'á²' => 'áº', 'á³' => 'á»', 'á´' => 'á¼', 'áµ' => 'á½', 'á²' => 'áƒ', 'Ბ' => 'ბ', 'á²’' => 'გ', 'Დ' => 'დ', 'á²”' => 'ე', 'Ვ' => 'ვ', 'á²–' => 'ზ', 'á²—' => 'თ', 'Ი' => 'ი', 'á²™' => 'კ', 'Ლ' => 'ლ', 'á²›' => 'მ', 'Ნ' => 'ნ', 'á²' => 'áƒ', 'Პ' => 'პ', 'Ჟ' => 'ჟ', 'á² ' => 'რ', 'Ს' => 'ს', 'á²¢' => 'ტ', 'á²£' => 'უ', 'Ფ' => 'ფ', 'á²¥' => 'ქ', 'Ღ' => 'ღ', 'Ყ' => 'ყ', 'Შ' => 'შ', 'Ჩ' => 'ჩ', 'Ც' => 'ც', 'Ძ' => 'ძ', 'Წ' => 'წ', 'á²­' => 'ჭ', 'á²®' => 'ხ', 'Ჯ' => 'ჯ', 'á²°' => 'ჰ', 'á²±' => 'ჱ', 'á²²' => 'ჲ', 'á²³' => 'ჳ', 'á²´' => 'ჴ', 'á²µ' => 'ჵ', 'Ჶ' => 'ჶ', 'á²·' => 'ჷ', 'Ჸ' => 'ჸ', 'á²¹' => 'ჹ', 'Ჺ' => 'ჺ', 'á²½' => 'ჽ', 'á²¾' => 'ჾ', 'Ჿ' => 'ჿ', 'Ḁ' => 'á¸', 'Ḃ' => 'ḃ', 'Ḅ' => 'ḅ', 'Ḇ' => 'ḇ', 'Ḉ' => 'ḉ', 'Ḋ' => 'ḋ', 'Ḍ' => 'á¸', 'Ḏ' => 'á¸', 'á¸' => 'ḑ', 'Ḓ' => 'ḓ', 'Ḕ' => 'ḕ', 'Ḗ' => 'ḗ', 'Ḙ' => 'ḙ', 'Ḛ' => 'ḛ', 'Ḝ' => 'á¸', 'Ḟ' => 'ḟ', 'Ḡ' => 'ḡ', 'Ḣ' => 'ḣ', 'Ḥ' => 'ḥ', 'Ḧ' => 'ḧ', 'Ḩ' => 'ḩ', 'Ḫ' => 'ḫ', 'Ḭ' => 'ḭ', 'Ḯ' => 'ḯ', 'Ḱ' => 'ḱ', 'Ḳ' => 'ḳ', 'Ḵ' => 'ḵ', 'Ḷ' => 'ḷ', 'Ḹ' => 'ḹ', 'Ḻ' => 'ḻ', 'Ḽ' => 'ḽ', 'Ḿ' => 'ḿ', 'á¹€' => 'á¹', 'Ṃ' => 'ṃ', 'Ṅ' => 'á¹…', 'Ṇ' => 'ṇ', 'Ṉ' => 'ṉ', 'Ṋ' => 'ṋ', 'Ṍ' => 'á¹', 'Ṏ' => 'á¹', 'á¹' => 'ṑ', 'á¹’' => 'ṓ', 'á¹”' => 'ṕ', 'á¹–' => 'á¹—', 'Ṙ' => 'á¹™', 'Ṛ' => 'á¹›', 'Ṝ' => 'á¹', 'Ṟ' => 'ṟ', 'á¹ ' => 'ṡ', 'á¹¢' => 'á¹£', 'Ṥ' => 'á¹¥', 'Ṧ' => 'ṧ', 'Ṩ' => 'ṩ', 'Ṫ' => 'ṫ', 'Ṭ' => 'á¹­', 'á¹®' => 'ṯ', 'á¹°' => 'á¹±', 'á¹²' => 'á¹³', 'á¹´' => 'á¹µ', 'Ṷ' => 'á¹·', 'Ṹ' => 'á¹¹', 'Ṻ' => 'á¹»', 'á¹¼' => 'á¹½', 'á¹¾' => 'ṿ', 'Ẁ' => 'áº', 'Ẃ' => 'ẃ', 'Ẅ' => 'ẅ', 'Ẇ' => 'ẇ', 'Ẉ' => 'ẉ', 'Ẋ' => 'ẋ', 'Ẍ' => 'áº', 'Ẏ' => 'áº', 'áº' => 'ẑ', 'Ẓ' => 'ẓ', 'Ẕ' => 'ẕ', 'ẞ' => 'ß', 'Ạ' => 'ạ', 'Ả' => 'ả', 'Ấ' => 'ấ', 'Ầ' => 'ầ', 'Ẩ' => 'ẩ', 'Ẫ' => 'ẫ', 'Ậ' => 'ậ', 'Ắ' => 'ắ', 'Ằ' => 'ằ', 'Ẳ' => 'ẳ', 'Ẵ' => 'ẵ', 'Ặ' => 'ặ', 'Ẹ' => 'ẹ', 'Ẻ' => 'ẻ', 'Ẽ' => 'ẽ', 'Ế' => 'ế', 'Ề' => 'á»', 'Ể' => 'ể', 'Ễ' => 'á»…', 'Ệ' => 'ệ', 'Ỉ' => 'ỉ', 'Ị' => 'ị', 'Ọ' => 'á»', 'Ỏ' => 'á»', 'á»' => 'ố', 'á»’' => 'ồ', 'á»”' => 'ổ', 'á»–' => 'á»—', 'Ộ' => 'á»™', 'Ớ' => 'á»›', 'Ờ' => 'á»', 'Ở' => 'ở', 'á» ' => 'ỡ', 'Ợ' => 'ợ', 'Ụ' => 'ụ', 'Ủ' => 'ủ', 'Ứ' => 'ứ', 'Ừ' => 'ừ', 'Ử' => 'á»­', 'á»®' => 'ữ', 'á»°' => 'á»±', 'Ỳ' => 'ỳ', 'á»´' => 'ỵ', 'Ỷ' => 'á»·', 'Ỹ' => 'ỹ', 'Ỻ' => 'á»»', 'Ỽ' => 'ỽ', 'Ỿ' => 'ỿ', 'Ἀ' => 'á¼€', 'Ἁ' => 'á¼', 'Ἂ' => 'ἂ', 'Ἃ' => 'ἃ', 'Ἄ' => 'ἄ', 'á¼' => 'á¼…', 'Ἆ' => 'ἆ', 'á¼' => 'ἇ', 'Ἐ' => 'á¼', 'á¼™' => 'ἑ', 'Ἒ' => 'á¼’', 'á¼›' => 'ἓ', 'Ἔ' => 'á¼”', 'á¼' => 'ἕ', 'Ἠ' => 'á¼ ', 'Ἡ' => 'ἡ', 'Ἢ' => 'á¼¢', 'Ἣ' => 'á¼£', 'Ἤ' => 'ἤ', 'á¼­' => 'á¼¥', 'á¼®' => 'ἦ', 'Ἧ' => 'ἧ', 'Ἰ' => 'á¼°', 'á¼¹' => 'á¼±', 'Ἲ' => 'á¼²', 'á¼»' => 'á¼³', 'á¼¼' => 'á¼´', 'á¼½' => 'á¼µ', 'á¼¾' => 'ἶ', 'Ἷ' => 'á¼·', 'Ὀ' => 'á½€', 'Ὁ' => 'á½', 'Ὂ' => 'ὂ', 'Ὃ' => 'ὃ', 'Ὄ' => 'ὄ', 'á½' => 'á½…', 'á½™' => 'ὑ', 'á½›' => 'ὓ', 'á½' => 'ὕ', 'Ὗ' => 'á½—', 'Ὠ' => 'á½ ', 'Ὡ' => 'ὡ', 'Ὢ' => 'á½¢', 'Ὣ' => 'á½£', 'Ὤ' => 'ὤ', 'á½­' => 'á½¥', 'á½®' => 'ὦ', 'Ὧ' => 'ὧ', 'ᾈ' => 'á¾€', 'ᾉ' => 'á¾', 'ᾊ' => 'ᾂ', 'ᾋ' => 'ᾃ', 'ᾌ' => 'ᾄ', 'á¾' => 'á¾…', 'ᾎ' => 'ᾆ', 'á¾' => 'ᾇ', 'ᾘ' => 'á¾', 'á¾™' => 'ᾑ', 'ᾚ' => 'á¾’', 'á¾›' => 'ᾓ', 'ᾜ' => 'á¾”', 'á¾' => 'ᾕ', 'ᾞ' => 'á¾–', 'ᾟ' => 'á¾—', 'ᾨ' => 'á¾ ', 'ᾩ' => 'ᾡ', 'ᾪ' => 'á¾¢', 'ᾫ' => 'á¾£', 'ᾬ' => 'ᾤ', 'á¾­' => 'á¾¥', 'á¾®' => 'ᾦ', 'ᾯ' => 'ᾧ', 'Ᾰ' => 'á¾°', 'á¾¹' => 'á¾±', 'Ὰ' => 'á½°', 'á¾»' => 'á½±', 'á¾¼' => 'á¾³', 'Ὲ' => 'á½²', 'Έ' => 'á½³', 'á¿Š' => 'á½´', 'á¿‹' => 'á½µ', 'á¿Œ' => 'ῃ', 'Ῐ' => 'á¿', 'á¿™' => 'á¿‘', 'á¿š' => 'ὶ', 'á¿›' => 'á½·', 'Ῠ' => 'á¿ ', 'á¿©' => 'á¿¡', 'Ὺ' => 'ὺ', 'á¿«' => 'á½»', 'Ῥ' => 'á¿¥', 'Ὸ' => 'ὸ', 'Ό' => 'á½¹', 'Ὼ' => 'á½¼', 'á¿»' => 'á½½', 'ῼ' => 'ῳ', 'Ω' => 'ω', 'K' => 'k', 'â„«' => 'Ã¥', 'Ⅎ' => 'â…Ž', 'â… ' => 'â…°', 'â…¡' => 'â…±', 'â…¢' => 'â…²', 'â…£' => 'â…³', 'â…¤' => 'â…´', 'â…¥' => 'â…µ', 'â…¦' => 'â…¶', 'â…§' => 'â…·', 'â…¨' => 'â…¸', 'â…©' => 'â…¹', 'â…ª' => 'â…º', 'â…«' => 'â…»', 'â…¬' => 'â…¼', 'â…­' => 'â…½', 'â…®' => 'â…¾', 'â…¯' => 'â…¿', 'Ↄ' => 'ↄ', 'â’¶' => 'â“', 'â’·' => 'â“‘', 'â’¸' => 'â“’', 'â’¹' => 'â““', 'â’º' => 'â“”', 'â’»' => 'â“•', 'â’¼' => 'â“–', 'â’½' => 'â“—', 'â’¾' => 'ⓘ', 'â’¿' => 'â“™', 'â“€' => 'â“š', 'â“' => 'â“›', 'â“‚' => 'â“œ', 'Ⓝ' => 'â“', 'â“„' => 'â“ž', 'â“…' => 'â“Ÿ', 'Ⓠ' => 'â“ ', 'Ⓡ' => 'â“¡', 'Ⓢ' => 'â“¢', 'Ⓣ' => 'â“£', 'â“Š' => 'ⓤ', 'â“‹' => 'â“¥', 'â“Œ' => 'ⓦ', 'â“' => 'ⓧ', 'â“Ž' => 'ⓨ', 'â“' => 'â“©', 'â°€' => 'â°°', 'â°' => 'â°±', 'â°‚' => 'â°²', 'â°ƒ' => 'â°³', 'â°„' => 'â°´', 'â°…' => 'â°µ', 'â°†' => 'â°¶', 'â°‡' => 'â°·', 'â°ˆ' => 'â°¸', 'â°‰' => 'â°¹', 'â°Š' => 'â°º', 'â°‹' => 'â°»', 'â°Œ' => 'â°¼', 'â°' => 'â°½', 'â°Ž' => 'â°¾', 'â°' => 'â°¿', 'â°' => 'â±€', 'â°‘' => 'â±', 'â°’' => 'ⱂ', 'â°“' => 'ⱃ', 'â°”' => 'ⱄ', 'â°•' => 'â±…', 'â°–' => 'ⱆ', 'â°—' => 'ⱇ', 'â°˜' => 'ⱈ', 'â°™' => 'ⱉ', 'â°š' => 'ⱊ', 'â°›' => 'ⱋ', 'â°œ' => 'ⱌ', 'â°' => 'â±', 'â°ž' => 'ⱎ', 'â°Ÿ' => 'â±', 'â° ' => 'â±', 'â°¡' => 'ⱑ', 'â°¢' => 'â±’', 'â°£' => 'ⱓ', 'â°¤' => 'â±”', 'â°¥' => 'ⱕ', 'â°¦' => 'â±–', 'â°§' => 'â±—', 'â°¨' => 'ⱘ', 'â°©' => 'â±™', 'â°ª' => 'ⱚ', 'â°«' => 'â±›', 'â°¬' => 'ⱜ', 'â°­' => 'â±', 'â°®' => 'ⱞ', 'â± ' => 'ⱡ', 'â±¢' => 'É«', 'â±£' => 'áµ½', 'Ɽ' => 'ɽ', 'Ⱨ' => 'ⱨ', 'Ⱪ' => 'ⱪ', 'Ⱬ' => 'ⱬ', 'â±­' => 'É‘', 'â±®' => 'ɱ', 'Ɐ' => 'É', 'â±°' => 'É’', 'â±²' => 'â±³', 'â±µ' => 'ⱶ', 'â±¾' => 'È¿', 'Ɀ' => 'É€', 'â²€' => 'â²', 'Ⲃ' => 'ⲃ', 'Ⲅ' => 'â²…', 'Ⲇ' => 'ⲇ', 'Ⲉ' => 'ⲉ', 'Ⲋ' => 'ⲋ', 'Ⲍ' => 'â²', 'Ⲏ' => 'â²', 'â²' => 'ⲑ', 'â²’' => 'ⲓ', 'â²”' => 'ⲕ', 'â²–' => 'â²—', 'Ⲙ' => 'â²™', 'Ⲛ' => 'â²›', 'Ⲝ' => 'â²', 'Ⲟ' => 'ⲟ', 'â² ' => 'ⲡ', 'â²¢' => 'â²£', 'Ⲥ' => 'â²¥', 'Ⲧ' => 'ⲧ', 'Ⲩ' => 'ⲩ', 'Ⲫ' => 'ⲫ', 'Ⲭ' => 'â²­', 'â²®' => 'ⲯ', 'â²°' => 'â²±', 'â²²' => 'â²³', 'â²´' => 'â²µ', 'Ⲷ' => 'â²·', 'Ⲹ' => 'â²¹', 'Ⲻ' => 'â²»', 'â²¼' => 'â²½', 'â²¾' => 'ⲿ', 'â³€' => 'â³', 'Ⳃ' => 'ⳃ', 'Ⳅ' => 'â³…', 'Ⳇ' => 'ⳇ', 'Ⳉ' => 'ⳉ', 'Ⳋ' => 'ⳋ', 'Ⳍ' => 'â³', 'Ⳏ' => 'â³', 'â³' => 'ⳑ', 'â³’' => 'ⳓ', 'â³”' => 'ⳕ', 'â³–' => 'â³—', 'Ⳙ' => 'â³™', 'Ⳛ' => 'â³›', 'Ⳝ' => 'â³', 'Ⳟ' => 'ⳟ', 'â³ ' => 'ⳡ', 'â³¢' => 'â³£', 'Ⳬ' => 'ⳬ', 'â³­' => 'â³®', 'â³²' => 'â³³', 'Ꙁ' => 'ê™', 'Ꙃ' => 'ꙃ', 'Ꙅ' => 'ê™…', 'Ꙇ' => 'ꙇ', 'Ꙉ' => 'ꙉ', 'Ꙋ' => 'ꙋ', 'Ꙍ' => 'ê™', 'Ꙏ' => 'ê™', 'ê™' => 'ꙑ', 'ê™’' => 'ꙓ', 'ê™”' => 'ꙕ', 'ê™–' => 'ê™—', 'Ꙙ' => 'ê™™', 'Ꙛ' => 'ê™›', 'Ꙝ' => 'ê™', 'Ꙟ' => 'ꙟ', 'ê™ ' => 'ꙡ', 'Ꙣ' => 'ꙣ', 'Ꙥ' => 'ꙥ', 'Ꙧ' => 'ꙧ', 'Ꙩ' => 'ꙩ', 'Ꙫ' => 'ꙫ', 'Ꙭ' => 'ê™­', 'Ꚁ' => 'êš', 'êš‚' => 'ꚃ', 'êš„' => 'êš…', 'Ꚇ' => 'ꚇ', 'Ꚉ' => 'ꚉ', 'Ꚋ' => 'êš‹', 'Ꚍ' => 'êš', 'Ꚏ' => 'êš', 'êš' => 'êš‘', 'êš’' => 'êš“', 'êš”' => 'êš•', 'êš–' => 'êš—', 'Ꚙ' => 'êš™', 'êšš' => 'êš›', 'Ꜣ' => 'ꜣ', 'Ꜥ' => 'ꜥ', 'Ꜧ' => 'ꜧ', 'Ꜩ' => 'ꜩ', 'Ꜫ' => 'ꜫ', 'Ꜭ' => 'ꜭ', 'Ꜯ' => 'ꜯ', 'Ꜳ' => 'ꜳ', 'Ꜵ' => 'ꜵ', 'Ꜷ' => 'ꜷ', 'Ꜹ' => 'ꜹ', 'Ꜻ' => 'ꜻ', 'Ꜽ' => 'ꜽ', 'Ꜿ' => 'ꜿ', 'ê€' => 'ê', 'ê‚' => 'êƒ', 'ê„' => 'ê…', 'ê†' => 'ê‡', 'êˆ' => 'ê‰', 'êŠ' => 'ê‹', 'êŒ' => 'ê', 'êŽ' => 'ê', 'ê' => 'ê‘', 'ê’' => 'ê“', 'ê”' => 'ê•', 'ê–' => 'ê—', 'ê˜' => 'ê™', 'êš' => 'ê›', 'êœ' => 'ê', 'êž' => 'êŸ', 'ê ' => 'ê¡', 'ê¢' => 'ê£', 'ê¤' => 'ê¥', 'ê¦' => 'ê§', 'ê¨' => 'ê©', 'êª' => 'ê«', 'ê¬' => 'ê­', 'ê®' => 'ê¯', 'ê¹' => 'êº', 'ê»' => 'ê¼', 'ê½' => 'áµ¹', 'ê¾' => 'ê¿', 'Ꞁ' => 'êž', 'êž‚' => 'ꞃ', 'êž„' => 'êž…', 'Ꞇ' => 'ꞇ', 'êž‹' => 'ꞌ', 'êž' => 'É¥', 'êž' => 'êž‘', 'êž’' => 'êž“', 'êž–' => 'êž—', 'Ꞙ' => 'êž™', 'êžš' => 'êž›', 'êžœ' => 'êž', 'êžž' => 'ꞟ', 'êž ' => 'êž¡', 'Ꞣ' => 'ꞣ', 'Ꞥ' => 'ꞥ', 'Ꞧ' => 'ꞧ', 'Ꞩ' => 'êž©', 'Ɦ' => 'ɦ', 'êž«' => 'Éœ', 'Ɡ' => 'É¡', 'êž­' => 'ɬ', 'êž®' => 'ɪ', 'êž°' => 'Êž', 'êž±' => 'ʇ', 'êž²' => 'Ê', 'êž³' => 'ê­“', 'êž´' => 'êžµ', 'Ꞷ' => 'êž·', 'Ꞹ' => 'êž¹', 'Ꞻ' => 'êž»', 'êž¼' => 'êž½', 'êž¾' => 'êž¿', 'Ꟃ' => 'ꟃ', 'Ꞔ' => 'êž”', 'Ʂ' => 'Ê‚', 'Ᶎ' => 'ᶎ', 'Ꟈ' => 'ꟈ', 'Ꟊ' => 'ꟊ', 'Ꟶ' => 'ꟶ', 'A' => 'ï½', 'ï¼¢' => 'b', 'ï¼£' => 'c', 'D' => 'd', 'ï¼¥' => 'ï½…', 'F' => 'f', 'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l', 'ï¼­' => 'ï½', 'ï¼®' => 'n', 'O' => 'ï½', 'ï¼°' => 'ï½', 'ï¼±' => 'q', 'ï¼²' => 'ï½’', 'ï¼³' => 's', 'ï¼´' => 'ï½”', 'ï¼µ' => 'u', 'V' => 'ï½–', 'ï¼·' => 'ï½—', 'X' => 'x', 'ï¼¹' => 'ï½™', 'Z' => 'z', 'ð€' => 'ð¨', 'ð' => 'ð©', 'ð‚' => 'ðª', 'ðƒ' => 'ð«', 'ð„' => 'ð¬', 'ð…' => 'ð­', 'ð†' => 'ð®', 'ð‡' => 'ð¯', 'ðˆ' => 'ð°', 'ð‰' => 'ð±', 'ðŠ' => 'ð²', 'ð‹' => 'ð³', 'ðŒ' => 'ð´', 'ð' => 'ðµ', 'ðŽ' => 'ð¶', 'ð' => 'ð·', 'ð' => 'ð¸', 'ð‘' => 'ð¹', 'ð’' => 'ðº', 'ð“' => 'ð»', 'ð”' => 'ð¼', 'ð•' => 'ð½', 'ð–' => 'ð¾', 'ð—' => 'ð¿', 'ð˜' => 'ð‘€', 'ð™' => 'ð‘', 'ðš' => 'ð‘‚', 'ð›' => 'ð‘ƒ', 'ðœ' => 'ð‘„', 'ð' => 'ð‘…', 'ðž' => 'ð‘†', 'ðŸ' => 'ð‘‡', 'ð ' => 'ð‘ˆ', 'ð¡' => 'ð‘‰', 'ð¢' => 'ð‘Š', 'ð£' => 'ð‘‹', 'ð¤' => 'ð‘Œ', 'ð¥' => 'ð‘', 'ð¦' => 'ð‘Ž', 'ð§' => 'ð‘', 'ð’°' => 'ð“˜', 'ð’±' => 'ð“™', 'ð’²' => 'ð“š', 'ð’³' => 'ð“›', 'ð’´' => 'ð“œ', 'ð’µ' => 'ð“', 'ð’¶' => 'ð“ž', 'ð’·' => 'ð“Ÿ', 'ð’¸' => 'ð“ ', 'ð’¹' => 'ð“¡', 'ð’º' => 'ð“¢', 'ð’»' => 'ð“£', 'ð’¼' => 'ð“¤', 'ð’½' => 'ð“¥', 'ð’¾' => 'ð“¦', 'ð’¿' => 'ð“§', 'ð“€' => 'ð“¨', 'ð“' => 'ð“©', 'ð“‚' => 'ð“ª', 'ð“ƒ' => 'ð“«', 'ð“„' => 'ð“¬', 'ð“…' => 'ð“­', 'ð“†' => 'ð“®', 'ð“‡' => 'ð“¯', 'ð“ˆ' => 'ð“°', 'ð“‰' => 'ð“±', 'ð“Š' => 'ð“²', 'ð“‹' => 'ð“³', 'ð“Œ' => 'ð“´', 'ð“' => 'ð“µ', 'ð“Ž' => 'ð“¶', 'ð“' => 'ð“·', 'ð“' => 'ð“¸', 'ð“‘' => 'ð“¹', 'ð“’' => 'ð“º', 'ð““' => 'ð“»', 'ð²€' => 'ð³€', 'ð²' => 'ð³', 'ð²‚' => 'ð³‚', 'ð²ƒ' => 'ð³ƒ', 'ð²„' => 'ð³„', 'ð²…' => 'ð³…', 'ð²†' => 'ð³†', 'ð²‡' => 'ð³‡', 'ð²ˆ' => 'ð³ˆ', 'ð²‰' => 'ð³‰', 'ð²Š' => 'ð³Š', 'ð²‹' => 'ð³‹', 'ð²Œ' => 'ð³Œ', 'ð²' => 'ð³', 'ð²Ž' => 'ð³Ž', 'ð²' => 'ð³', 'ð²' => 'ð³', 'ð²‘' => 'ð³‘', 'ð²’' => 'ð³’', 'ð²“' => 'ð³“', 'ð²”' => 'ð³”', 'ð²•' => 'ð³•', 'ð²–' => 'ð³–', 'ð²—' => 'ð³—', 'ð²˜' => 'ð³˜', 'ð²™' => 'ð³™', 'ð²š' => 'ð³š', 'ð²›' => 'ð³›', 'ð²œ' => 'ð³œ', 'ð²' => 'ð³', 'ð²ž' => 'ð³ž', 'ð²Ÿ' => 'ð³Ÿ', 'ð² ' => 'ð³ ', 'ð²¡' => 'ð³¡', 'ð²¢' => 'ð³¢', 'ð²£' => 'ð³£', 'ð²¤' => 'ð³¤', 'ð²¥' => 'ð³¥', 'ð²¦' => 'ð³¦', 'ð²§' => 'ð³§', 'ð²¨' => 'ð³¨', 'ð²©' => 'ð³©', 'ð²ª' => 'ð³ª', 'ð²«' => 'ð³«', 'ð²¬' => 'ð³¬', 'ð²­' => 'ð³­', 'ð²®' => 'ð³®', 'ð²¯' => 'ð³¯', 'ð²°' => 'ð³°', 'ð²±' => 'ð³±', 'ð²²' => 'ð³²', 'ð‘¢ ' => 'ð‘£€', '𑢡' => 'ð‘£', 'ð‘¢¢' => '𑣂', 'ð‘¢£' => '𑣃', '𑢤' => '𑣄', 'ð‘¢¥' => 'ð‘£…', '𑢦' => '𑣆', '𑢧' => '𑣇', '𑢨' => '𑣈', '𑢩' => '𑣉', '𑢪' => '𑣊', '𑢫' => '𑣋', '𑢬' => '𑣌', 'ð‘¢­' => 'ð‘£', 'ð‘¢®' => '𑣎', '𑢯' => 'ð‘£', 'ð‘¢°' => 'ð‘£', 'ð‘¢±' => '𑣑', 'ð‘¢²' => 'ð‘£’', 'ð‘¢³' => '𑣓', 'ð‘¢´' => 'ð‘£”', 'ð‘¢µ' => '𑣕', '𑢶' => 'ð‘£–', 'ð‘¢·' => 'ð‘£—', '𑢸' => '𑣘', 'ð‘¢¹' => 'ð‘£™', '𑢺' => '𑣚', 'ð‘¢»' => 'ð‘£›', 'ð‘¢¼' => '𑣜', 'ð‘¢½' => 'ð‘£', 'ð‘¢¾' => '𑣞', '𑢿' => '𑣟', 'ð–¹€' => 'ð–¹ ', 'ð–¹' => '𖹡', '𖹂' => 'ð–¹¢', '𖹃' => 'ð–¹£', '𖹄' => '𖹤', 'ð–¹…' => 'ð–¹¥', '𖹆' => '𖹦', '𖹇' => '𖹧', '𖹈' => '𖹨', '𖹉' => '𖹩', '𖹊' => '𖹪', '𖹋' => '𖹫', '𖹌' => '𖹬', 'ð–¹' => 'ð–¹­', '𖹎' => 'ð–¹®', 'ð–¹' => '𖹯', 'ð–¹' => 'ð–¹°', '𖹑' => 'ð–¹±', 'ð–¹’' => 'ð–¹²', '𖹓' => 'ð–¹³', 'ð–¹”' => 'ð–¹´', '𖹕' => 'ð–¹µ', 'ð–¹–' => '𖹶', 'ð–¹—' => 'ð–¹·', '𖹘' => '𖹸', 'ð–¹™' => 'ð–¹¹', '𖹚' => '𖹺', 'ð–¹›' => 'ð–¹»', '𖹜' => 'ð–¹¼', 'ð–¹' => 'ð–¹½', '𖹞' => 'ð–¹¾', '𖹟' => '𖹿', '𞤀' => '𞤢', 'ðž¤' => '𞤣', '𞤂' => '𞤤', '𞤃' => '𞤥', '𞤄' => '𞤦', '𞤅' => '𞤧', '𞤆' => '𞤨', '𞤇' => '𞤩', '𞤈' => '𞤪', '𞤉' => '𞤫', '𞤊' => '𞤬', '𞤋' => '𞤭', '𞤌' => '𞤮', 'ðž¤' => '𞤯', '𞤎' => '𞤰', 'ðž¤' => '𞤱', 'ðž¤' => '𞤲', '𞤑' => '𞤳', '𞤒' => '𞤴', '𞤓' => '𞤵', '𞤔' => '𞤶', '𞤕' => '𞤷', '𞤖' => '𞤸', '𞤗' => '𞤹', '𞤘' => '𞤺', '𞤙' => '𞤻', '𞤚' => '𞤼', '𞤛' => '𞤽', '𞤜' => '𞤾', 'ðž¤' => '𞤿', '𞤞' => '𞥀', '𞤟' => 'ðž¥', '𞤠' => '𞥂', '𞤡' => '𞥃'); addons/gdriveaddon/vendor-prefixed/symfony/polyfill-mbstring/Resources/mb_convert_variables.php8000064400000001477147600374260027547 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use Symfony\Polyfill\Mbstring as p; if (!function_exists('mb_convert_variables')) { /** * Convert character code in variable(s) */ function mb_convert_variables($to_encoding, $from_encoding, &$var, &...$vars) { $vars = [&$var, ...$vars]; $ok = true; array_walk_recursive($vars, function (&$v) use (&$ok, $to_encoding, $from_encoding) { if (false === $v = p\Mbstring::mb_convert_encoding($v, $to_encoding, $from_encoding)) { $ok = false; } }); return $ok ? $from_encoding : false; } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-mbstring/bootstrap.php000064400000017526147600374260023336 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Mbstring as p; if (!\function_exists('mb_convert_encoding')) { function mb_convert_encoding($string, $to_encoding, $from_encoding = null) { return p\Mbstring::mb_convert_encoding($string, $to_encoding, $from_encoding); } } if (!\function_exists('mb_decode_mimeheader')) { function mb_decode_mimeheader($string) { return p\Mbstring::mb_decode_mimeheader($string); } } if (!\function_exists('mb_encode_mimeheader')) { function mb_encode_mimeheader($string, $charset = null, $transfer_encoding = null, $newline = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($string, $charset, $transfer_encoding, $newline, $indent); } } if (!\function_exists('mb_decode_numericentity')) { function mb_decode_numericentity($string, $map, $encoding = null) { return p\Mbstring::mb_decode_numericentity($string, $map, $encoding); } } if (!\function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($string, $map, $encoding = null, $hex = \false) { return p\Mbstring::mb_encode_numericentity($string, $map, $encoding, $hex); } } if (!\function_exists('mb_convert_case')) { function mb_convert_case($string, $mode, $encoding = null) { return p\Mbstring::mb_convert_case($string, $mode, $encoding); } } if (!\function_exists('mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { return p\Mbstring::mb_internal_encoding($encoding); } } if (!\function_exists('mb_language')) { function mb_language($language = null) { return p\Mbstring::mb_language($language); } } if (!\function_exists('mb_list_encodings')) { function mb_list_encodings() { return p\Mbstring::mb_list_encodings(); } } if (!\function_exists('mb_encoding_aliases')) { function mb_encoding_aliases($encoding) { return p\Mbstring::mb_encoding_aliases($encoding); } } if (!\function_exists('mb_check_encoding')) { function mb_check_encoding($value = null, $encoding = null) { return p\Mbstring::mb_check_encoding($value, $encoding); } } if (!\function_exists('mb_detect_encoding')) { function mb_detect_encoding($string, $encodings = null, $strict = \false) { return p\Mbstring::mb_detect_encoding($string, $encodings, $strict); } } if (!\function_exists('mb_detect_order')) { function mb_detect_order($encoding = null) { return p\Mbstring::mb_detect_order($encoding); } } if (!\function_exists('mb_parse_str')) { function mb_parse_str($string, &$result = array()) { \parse_str($string, $result); } } if (!\function_exists('mb_strlen')) { function mb_strlen($string, $encoding = null) { return p\Mbstring::mb_strlen($string, $encoding); } } if (!\function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strtolower')) { function mb_strtolower($string, $encoding = null) { return p\Mbstring::mb_strtolower($string, $encoding); } } if (!\function_exists('mb_strtoupper')) { function mb_strtoupper($string, $encoding = null) { return p\Mbstring::mb_strtoupper($string, $encoding); } } if (!\function_exists('mb_substitute_character')) { function mb_substitute_character($substitute_character = null) { return p\Mbstring::mb_substitute_character($substitute_character); } } if (!\function_exists('mb_substr')) { function mb_substr($string, $start, $length = 2147483647, $encoding = null) { return p\Mbstring::mb_substr($string, $start, $length, $encoding); } } if (!\function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_stripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_stristr')) { function mb_stristr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_stristr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strrchr')) { function mb_strrchr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrchr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strrichr')) { function mb_strrichr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strrichr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_strripos')) { function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strripos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { return p\Mbstring::mb_strrpos($haystack, $needle, $offset, $encoding); } } if (!\function_exists('mb_strstr')) { function mb_strstr($haystack, $needle, $before_needle = \false, $encoding = null) { return p\Mbstring::mb_strstr($haystack, $needle, $before_needle, $encoding); } } if (!\function_exists('mb_get_info')) { function mb_get_info($type = 'all') { return p\Mbstring::mb_get_info($type); } } if (!\function_exists('mb_http_output')) { function mb_http_output($encoding = null) { return p\Mbstring::mb_http_output($encoding); } } if (!\function_exists('mb_strwidth')) { function mb_strwidth($string, $encoding = null) { return p\Mbstring::mb_strwidth($string, $encoding); } } if (!\function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = null) { return p\Mbstring::mb_substr_count($haystack, $needle, $encoding); } } if (!\function_exists('mb_output_handler')) { function mb_output_handler($string, $status) { return p\Mbstring::mb_output_handler($string, $status); } } if (!\function_exists('mb_http_input')) { function mb_http_input($type = '') { return p\Mbstring::mb_http_input($type); } } if (\PHP_VERSION_ID >= 80000) { require_once __DIR__ . '/Resources/mb_convert_variables.php8'; } elseif (!\function_exists('mb_convert_variables')) { function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { return p\Mbstring::mb_convert_variables($toEncoding, $fromEncoding, $a, $b, $c, $d, $e, $f); } } if (!\function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Mbstring::mb_ord($string, $encoding); } } if (!\function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Mbstring::mb_chr($codepoint, $encoding); } } if (!\function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } if (!\function_exists('mb_str_split')) { function mb_str_split($string, $length = 1, $encoding = null) { return p\Mbstring::mb_str_split($string, $length, $encoding); } } if (\extension_loaded('mbstring')) { return; } if (!\defined('MB_CASE_UPPER')) { \define('MB_CASE_UPPER', 0); } if (!\defined('MB_CASE_LOWER')) { \define('MB_CASE_LOWER', 1); } if (!\defined('MB_CASE_TITLE')) { \define('MB_CASE_TITLE', 2); } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-mbstring/Mbstring.php000064400000066436147600374260023112 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Mbstring; /** * Partial mbstring implementation in PHP, iconv based, UTF-8 centric. * * Implemented: * - mb_chr - Returns a specific character from its Unicode code point * - mb_convert_encoding - Convert character encoding * - mb_convert_variables - Convert character code in variable(s) * - mb_decode_mimeheader - Decode string in MIME header field * - mb_encode_mimeheader - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED * - mb_decode_numericentity - Decode HTML numeric string reference to character * - mb_encode_numericentity - Encode character to HTML numeric string reference * - mb_convert_case - Perform case folding on a string * - mb_detect_encoding - Detect character encoding * - mb_get_info - Get internal settings of mbstring * - mb_http_input - Detect HTTP input character encoding * - mb_http_output - Set/Get HTTP output character encoding * - mb_internal_encoding - Set/Get internal character encoding * - mb_list_encodings - Returns an array of all supported encodings * - mb_ord - Returns the Unicode code point of a character * - mb_output_handler - Callback function converts character encoding in output buffer * - mb_scrub - Replaces ill-formed byte sequences with substitute characters * - mb_strlen - Get string length * - mb_strpos - Find position of first occurrence of string in a string * - mb_strrpos - Find position of last occurrence of a string in a string * - mb_str_split - Convert a string to an array * - mb_strtolower - Make a string lowercase * - mb_strtoupper - Make a string uppercase * - mb_substitute_character - Set/Get substitution character * - mb_substr - Get part of string * - mb_stripos - Finds position of first occurrence of a string within another, case insensitive * - mb_stristr - Finds first occurrence of a string within another, case insensitive * - mb_strrchr - Finds the last occurrence of a character in a string within another * - mb_strrichr - Finds the last occurrence of a character in a string within another, case insensitive * - mb_strripos - Finds position of last occurrence of a string within another, case insensitive * - mb_strstr - Finds first occurrence of a string within another * - mb_strwidth - Return width of string * - mb_substr_count - Count the number of substring occurrences * * Not implemented: * - mb_convert_kana - Convert "kana" one from another ("zen-kaku", "han-kaku" and more) * - mb_ereg_* - Regular expression with multibyte support * - mb_parse_str - Parse GET/POST/COOKIE data and set global variable * - mb_preferred_mime_name - Get MIME charset string * - mb_regex_encoding - Returns current encoding for multibyte regex as string * - mb_regex_set_options - Set/Get the default options for mbregex functions * - mb_send_mail - Send encoded mail * - mb_split - Split multibyte string using regular expression * - mb_strcut - Get part of string * - mb_strimwidth - Get truncated string with specified width * * @author Nicolas Grekas * * @internal */ final class Mbstring { const MB_CASE_FOLD = \PHP_INT_MAX; private static $encodingList = array('ASCII', 'UTF-8'); private static $language = 'neutral'; private static $internalEncoding = 'UTF-8'; private static $caseFold = array(array('µ', 'Å¿', "Í…", 'Ï‚', "Ï", "Ï‘", "Ï•", "Ï–", "Ï°", "ϱ", "ϵ", "ẛ", "á¾¾"), array('μ', 's', 'ι', 'σ', 'β', 'θ', 'φ', 'Ï€', 'κ', 'Ï', 'ε', "ṡ", 'ι')); public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null) { if (\is_array($fromEncoding) || \false !== \strpos($fromEncoding, ',')) { $fromEncoding = self::mb_detect_encoding($s, $fromEncoding); } else { $fromEncoding = self::getEncoding($fromEncoding); } $toEncoding = self::getEncoding($toEncoding); if ('BASE64' === $fromEncoding) { $s = \base64_decode($s); $fromEncoding = $toEncoding; } if ('BASE64' === $toEncoding) { return \base64_encode($s); } if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) { if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) { $fromEncoding = 'Windows-1252'; } if ('UTF-8' !== $fromEncoding) { $s = \iconv($fromEncoding, 'UTF-8//IGNORE', $s); } return \preg_replace_callback('/[\\x80-\\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s); } if ('HTML-ENTITIES' === $fromEncoding) { $s = \html_entity_decode($s, \ENT_COMPAT, 'UTF-8'); $fromEncoding = 'UTF-8'; } return \iconv($fromEncoding, $toEncoding . '//IGNORE', $s); } public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null) { $vars = array(&$a, &$b, &$c, &$d, &$e, &$f); $ok = \true; \array_walk_recursive($vars, function (&$v) use(&$ok, $toEncoding, $fromEncoding) { if (\false === ($v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding))) { $ok = \false; } }); return $ok ? $fromEncoding : \false; } public static function mb_decode_mimeheader($s) { return \iconv_mime_decode($s, 2, self::$internalEncoding); } public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null) { \trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', \E_USER_WARNING); } public static function mb_decode_numericentity($s, $convmap, $encoding = null) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_decode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_decode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return ''; // Instead of null (cf. mb_encode_numericentity). } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $cnt = \floor(\count($convmap) / 4) * 4; for ($i = 0; $i < $cnt; $i += 4) { // collector_decode_htmlnumericentity ignores $convmap[$i + 3] $convmap[$i] += $convmap[$i + 2]; $convmap[$i + 1] += $convmap[$i + 2]; } $s = \preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use($cnt, $convmap) { $c = isset($m[2]) ? (int) \hexdec($m[2]) : $m[1]; for ($i = 0; $i < $cnt; $i += 4) { if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) { return Mbstring::mb_chr($c - $convmap[$i + 2]); } } return $m[0]; }, $s); if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = \false) { if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) { \trigger_error('mb_encode_numericentity() expects parameter 1 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } if (!\is_array($convmap) || !$convmap) { return \false; } if (null !== $encoding && !\is_scalar($encoding)) { \trigger_error('mb_encode_numericentity() expects parameter 3 to be string, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; // Instead of '' (cf. mb_decode_numericentity). } if (null !== $is_hex && !\is_scalar($is_hex)) { \trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, ' . \gettype($s) . ' given', \E_USER_WARNING); return null; } $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); $cnt = \floor(\count($convmap) / 4) * 4; $i = 0; $len = \strlen($s); $result = ''; while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; $c = self::mb_ord($uchr); for ($j = 0; $j < $cnt; $j += 4) { if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) { $cOffset = $c + $convmap[$j + 2] & $convmap[$j + 3]; $result .= $is_hex ? \sprintf('&#x%X;', $cOffset) : '&#' . $cOffset . ';'; continue 2; } } $result .= $uchr; } if (null === $encoding) { return $result; } return \iconv('UTF-8', $encoding . '//IGNORE', $result); } public static function mb_convert_case($s, $mode, $encoding = null) { $s = (string) $s; if ('' === $s) { return ''; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding) { $encoding = null; if (!\preg_match('//u', $s)) { $s = @\iconv('UTF-8', 'UTF-8//IGNORE', $s); } } else { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } if (\MB_CASE_TITLE == $mode) { static $titleRegexp = null; if (null === $titleRegexp) { $titleRegexp = self::getData('titleCaseRegexp'); } $s = \preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s); } else { if (\MB_CASE_UPPER == $mode) { static $upper = null; if (null === $upper) { $upper = self::getData('upperCase'); } $map = $upper; } else { if (self::MB_CASE_FOLD === $mode) { $s = \str_replace(self::$caseFold[0], self::$caseFold[1], $s); } static $lower = null; if (null === $lower) { $lower = self::getData('lowerCase'); } $map = $lower; } static $ulenMask = array("\xc0" => 2, "\xd0" => 2, "\xe0" => 3, "\xf0" => 4); $i = 0; $len = \strlen($s); while ($i < $len) { $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xf0"]; $uchr = \substr($s, $i, $ulen); $i += $ulen; if (isset($map[$uchr])) { $uchr = $map[$uchr]; $nlen = \strlen($uchr); if ($nlen == $ulen) { $nlen = $i; do { $s[--$nlen] = $uchr[--$ulen]; } while ($ulen); } else { $s = \substr_replace($s, $uchr, $i - $ulen, $ulen); $len += $nlen - $ulen; $i += $nlen - $ulen; } } } } if (null === $encoding) { return $s; } return \iconv('UTF-8', $encoding . '//IGNORE', $s); } public static function mb_internal_encoding($encoding = null) { if (null === $encoding) { return self::$internalEncoding; } $encoding = self::getEncoding($encoding); if ('UTF-8' === $encoding || \false !== @\iconv($encoding, $encoding, ' ')) { self::$internalEncoding = $encoding; return \true; } return \false; } public static function mb_language($lang = null) { if (null === $lang) { return self::$language; } switch ($lang = \strtolower($lang)) { case 'uni': case 'neutral': self::$language = $lang; return \true; } return \false; } public static function mb_list_encodings() { return array('UTF-8'); } public static function mb_encoding_aliases($encoding) { switch (\strtoupper($encoding)) { case 'UTF8': case 'UTF-8': return array('utf8'); } return \false; } public static function mb_check_encoding($var = null, $encoding = null) { if (null === $encoding) { if (null === $var) { return \false; } $encoding = self::$internalEncoding; } return self::mb_detect_encoding($var, array($encoding)) || \false !== @\iconv($encoding, $encoding, $var); } public static function mb_detect_encoding($str, $encodingList = null, $strict = \false) { if (null === $encodingList) { $encodingList = self::$encodingList; } else { if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); } foreach ($encodingList as $enc) { switch ($enc) { case 'ASCII': if (!\preg_match('/[\\x80-\\xFF]/', $str)) { return $enc; } break; case 'UTF8': case 'UTF-8': if (\preg_match('//u', $str)) { return 'UTF-8'; } break; default: if (0 === \strncmp($enc, 'ISO-8859-', 9)) { return $enc; } } } return \false; } public static function mb_detect_order($encodingList = null) { if (null === $encodingList) { return self::$encodingList; } if (!\is_array($encodingList)) { $encodingList = \array_map('trim', \explode(',', $encodingList)); } $encodingList = \array_map('strtoupper', $encodingList); foreach ($encodingList as $enc) { switch ($enc) { default: if (\strncmp($enc, 'ISO-8859-', 9)) { return \false; } // no break case 'ASCII': case 'UTF8': case 'UTF-8': } } self::$encodingList = $encodingList; return \true; } public static function mb_strlen($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strlen($s); } return @\iconv_strlen($s, $encoding); } public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strpos($haystack, $needle, $offset); } $needle = (string) $needle; if ('' === $needle) { \trigger_error(__METHOD__ . ': Empty delimiter', \E_USER_WARNING); return \false; } return \iconv_strpos($haystack, $needle, $offset, $encoding); } public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return \strrpos($haystack, $needle, $offset); } if ($offset != (int) $offset) { $offset = 0; } elseif ($offset = (int) $offset) { if ($offset < 0) { if (0 > ($offset += self::mb_strlen($needle))) { $haystack = self::mb_substr($haystack, 0, $offset, $encoding); } $offset = 0; } else { $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding); } } $pos = \iconv_strrpos($haystack, $needle, $encoding); return \false !== $pos ? $offset + $pos : \false; } public static function mb_str_split($string, $split_length = 1, $encoding = null) { if (null !== $string && !\is_scalar($string) && !(\is_object($string) && \method_exists($string, '__toString'))) { \trigger_error('mb_str_split() expects parameter 1 to be string, ' . \gettype($string) . ' given', \E_USER_WARNING); return null; } if (1 > ($split_length = (int) $split_length)) { \trigger_error('The length of each segment must be greater than zero', \E_USER_WARNING); return \false; } if (null === $encoding) { $encoding = \mb_internal_encoding(); } if ('UTF-8' === ($encoding = self::getEncoding($encoding))) { $rx = '/('; while (65535 < $split_length) { $rx .= '.{65535}'; $split_length -= 65535; } $rx .= '.{' . $split_length . '})/us'; return \preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY); } $result = array(); $length = \mb_strlen($string, $encoding); for ($i = 0; $i < $length; $i += $split_length) { $result[] = \mb_substr($string, $i, $split_length, $encoding); } return $result; } public static function mb_strtolower($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_LOWER, $encoding); } public static function mb_strtoupper($s, $encoding = null) { return self::mb_convert_case($s, \MB_CASE_UPPER, $encoding); } public static function mb_substitute_character($c = null) { if (0 === \strcasecmp($c, 'none')) { return \true; } return null !== $c ? \false : 'none'; } public static function mb_substr($s, $start, $length = null, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { return (string) \substr($s, $start, null === $length ? 2147483647 : $length); } if ($start < 0) { $start = \iconv_strlen($s, $encoding) + $start; if ($start < 0) { $start = 0; } } if (null === $length) { $length = 2147483647; } elseif ($length < 0) { $length = \iconv_strlen($s, $encoding) + $length - $start; if ($length < 0) { return ''; } } return (string) \iconv_substr($s, $start, $length, $encoding); } public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strpos($haystack, $needle, $offset, $encoding); } public static function mb_stristr($haystack, $needle, $part = \false, $encoding = null) { $pos = self::mb_stripos($haystack, $needle, 0, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrchr($haystack, $needle, $part = \false, $encoding = null) { $encoding = self::getEncoding($encoding); if ('CP850' === $encoding || 'ASCII' === $encoding) { $pos = \strrpos($haystack, $needle); } else { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = \iconv_strrpos($haystack, $needle, $encoding); } return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strrichr($haystack, $needle, $part = \false, $encoding = null) { $needle = self::mb_substr($needle, 0, 1, $encoding); $pos = self::mb_strripos($haystack, $needle, $encoding); return self::getSubpart($pos, $part, $haystack, $encoding); } public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null) { $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding); $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding); return self::mb_strrpos($haystack, $needle, $offset, $encoding); } public static function mb_strstr($haystack, $needle, $part = \false, $encoding = null) { $pos = \strpos($haystack, $needle); if (\false === $pos) { return \false; } if ($part) { return \substr($haystack, 0, $pos); } return \substr($haystack, $pos); } public static function mb_get_info($type = 'all') { $info = array('internal_encoding' => self::$internalEncoding, 'http_output' => 'pass', 'http_output_conv_mimetypes' => '^(text/|application/xhtml\\+xml)', 'func_overload' => 0, 'func_overload_list' => 'no overload', 'mail_charset' => 'UTF-8', 'mail_header_encoding' => 'BASE64', 'mail_body_encoding' => 'BASE64', 'illegal_chars' => 0, 'encoding_translation' => 'Off', 'language' => self::$language, 'detect_order' => self::$encodingList, 'substitute_character' => 'none', 'strict_detection' => 'Off'); if ('all' === $type) { return $info; } if (isset($info[$type])) { return $info[$type]; } return \false; } public static function mb_http_input($type = '') { return \false; } public static function mb_http_output($encoding = null) { return null !== $encoding ? 'pass' === $encoding : 'pass'; } public static function mb_strwidth($s, $encoding = null) { $encoding = self::getEncoding($encoding); if ('UTF-8' !== $encoding) { $s = \iconv($encoding, 'UTF-8//IGNORE', $s); } $s = \preg_replace('/[\\x{1100}-\\x{115F}\\x{2329}\\x{232A}\\x{2E80}-\\x{303E}\\x{3040}-\\x{A4CF}\\x{AC00}-\\x{D7A3}\\x{F900}-\\x{FAFF}\\x{FE10}-\\x{FE19}\\x{FE30}-\\x{FE6F}\\x{FF00}-\\x{FF60}\\x{FFE0}-\\x{FFE6}\\x{20000}-\\x{2FFFD}\\x{30000}-\\x{3FFFD}]/u', '', $s, -1, $wide); return ($wide << 1) + \iconv_strlen($s, 'UTF-8'); } public static function mb_substr_count($haystack, $needle, $encoding = null) { return \substr_count($haystack, $needle); } public static function mb_output_handler($contents, $status) { return $contents; } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if ('UTF-8' !== ($encoding = self::getEncoding($encoding))) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } private static function getSubpart($pos, $part, $haystack, $encoding) { if (\false === $pos) { return \false; } if ($part) { return self::mb_substr($haystack, 0, $pos, $encoding); } return self::mb_substr($haystack, $pos, null, $encoding); } private static function html_encoding_callback(array $m) { $i = 1; $entities = ''; $m = \unpack('C*', \htmlentities($m[0], \ENT_COMPAT, 'UTF-8')); while (isset($m[$i])) { if (0x80 > $m[$i]) { $entities .= \chr($m[$i++]); continue; } if (0xf0 <= $m[$i]) { $c = ($m[$i++] - 0xf0 << 18) + ($m[$i++] - 0x80 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } elseif (0xe0 <= $m[$i]) { $c = ($m[$i++] - 0xe0 << 12) + ($m[$i++] - 0x80 << 6) + $m[$i++] - 0x80; } else { $c = ($m[$i++] - 0xc0 << 6) + $m[$i++] - 0x80; } $entities .= '&#' . $c . ';'; } return $entities; } private static function title_case(array $s) { return self::mb_convert_case($s[1], \MB_CASE_UPPER, 'UTF-8') . self::mb_convert_case($s[2], \MB_CASE_LOWER, 'UTF-8'); } private static function getData($file) { if (\file_exists($file = __DIR__ . '/Resources/unidata/' . $file . '.php')) { return require $file; } return \false; } private static function getEncoding($encoding) { if (null === $encoding) { return self::$internalEncoding; } if ('UTF-8' === $encoding) { return 'UTF-8'; } $encoding = \strtoupper($encoding); if ('8BIT' === $encoding || 'BINARY' === $encoding) { return 'CP850'; } if ('UTF8' === $encoding) { return 'UTF-8'; } return $encoding; } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-php70/Resources/stubs/Error.php000064400000000201147600374260024613 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Php70; /** * @author Nicolas Grekas * * @internal */ final class Php70 { public static function intdiv($dividend, $divisor) { $dividend = self::intArg($dividend, __FUNCTION__, 1); $divisor = self::intArg($divisor, __FUNCTION__, 2); if (0 === $divisor) { throw new \DivisionByZeroError('Division by zero'); } if (-1 === $divisor && ~\PHP_INT_MAX === $dividend) { throw new \ArithmeticError('Division of PHP_INT_MIN by -1 is not an integer'); } return ($dividend - $dividend % $divisor) / $divisor; } public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { $count = 0; $result = (string) $subject; if (0 === ($limit = self::intArg($limit, __FUNCTION__, 3))) { return $result; } foreach ($patterns as $pattern => $callback) { $result = \preg_replace_callback($pattern, $callback, $result, $limit, $c); $count += $c; } return $result; } public static function error_clear_last() { static $handler; if (!$handler) { $handler = function () { return \false; }; } \set_error_handler($handler); @\trigger_error(''); \restore_error_handler(); } private static function intArg($value, $caller, $pos) { if (\is_int($value)) { return $value; } if (!\is_numeric($value) || \PHP_INT_MAX <= ($value += 0) || ~\PHP_INT_MAX >= $value) { throw new \TypeError(\sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value))); } return (int) $value; } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-php70/bootstrap.php000064400000001712147600374260022435 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Php70 as p; if (\PHP_VERSION_ID >= 70000) { return; } if (!\defined('PHP_INT_MIN')) { \define('PHP_INT_MIN', ~\PHP_INT_MAX); } if (!\function_exists('intdiv')) { function intdiv($num1, $num2) { return p\Php70::intdiv($num1, $num2); } } if (!\function_exists('preg_replace_callback_array')) { function preg_replace_callback_array(array $pattern, $subject, $limit = -1, &$count = 0, $flags = null) { return p\Php70::preg_replace_callback_array($pattern, $subject, $limit, $count); } } if (!\function_exists('error_clear_last')) { function error_clear_last() { return p\Php70::error_clear_last(); } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-php72/bootstrap.php000064400000004123147600374260022436 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ use VendorDuplicator\Symfony\Polyfill\Php72 as p; if (\PHP_VERSION_ID >= 70200) { return; } if (!\defined('PHP_FLOAT_DIG')) { \define('PHP_FLOAT_DIG', 15); } if (!\defined('PHP_FLOAT_EPSILON')) { \define('PHP_FLOAT_EPSILON', 2.2204460492503E-16); } if (!\defined('PHP_FLOAT_MIN')) { \define('PHP_FLOAT_MIN', 2.2250738585072E-308); } if (!\defined('PHP_FLOAT_MAX')) { \define('PHP_FLOAT_MAX', 1.7976931348623157E+308); } if (!\defined('PHP_OS_FAMILY')) { \define('PHP_OS_FAMILY', p\Php72::php_os_family()); } if ('\\' === \DIRECTORY_SEPARATOR && !\function_exists('sapi_windows_vt100_support')) { function sapi_windows_vt100_support($stream, $enable = null) { return p\Php72::sapi_windows_vt100_support($stream, $enable); } } if (!\function_exists('stream_isatty')) { function stream_isatty($stream) { return p\Php72::stream_isatty($stream); } } if (!\function_exists('utf8_encode')) { function utf8_encode($string) { return p\Php72::utf8_encode($string); } } if (!\function_exists('utf8_decode')) { function utf8_decode($string) { return p\Php72::utf8_decode($string); } } if (!\function_exists('spl_object_id')) { function spl_object_id($object) { return p\Php72::spl_object_id($object); } } if (!\function_exists('mb_ord')) { function mb_ord($string, $encoding = null) { return p\Php72::mb_ord($string, $encoding); } } if (!\function_exists('mb_chr')) { function mb_chr($codepoint, $encoding = null) { return p\Php72::mb_chr($codepoint, $encoding); } } if (!\function_exists('mb_scrub')) { function mb_scrub($string, $encoding = null) { $encoding = null === $encoding ? \mb_internal_encoding() : $encoding; return \mb_convert_encoding($string, $encoding, $encoding); } } addons/gdriveaddon/vendor-prefixed/symfony/polyfill-php72/Php72.php000064400000015076147600374260021332 0ustar00 * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace VendorDuplicator\Symfony\Polyfill\Php72; /** * @author Nicolas Grekas * @author Dariusz RumiÅ„ski * * @internal */ final class Php72 { private static $hashMask; public static function utf8_encode($s) { $s .= $s; $len = \strlen($s); for ($i = $len >> 1, $j = 0; $i < $len; ++$i, ++$j) { switch (\true) { case $s[$i] < "\x80": $s[$j] = $s[$i]; break; case $s[$i] < "\xc0": $s[$j] = "\xc2"; $s[++$j] = $s[$i]; break; default: $s[$j] = "\xc3"; $s[++$j] = \chr(\ord($s[$i]) - 64); break; } } return \substr($s, 0, $j); } public static function utf8_decode($s) { $s = (string) $s; $len = \strlen($s); for ($i = 0, $j = 0; $i < $len; ++$i, ++$j) { switch ($s[$i] & "\xf0") { case "\xc0": case "\xd0": $c = \ord($s[$i] & "\x1f") << 6 | \ord($s[++$i] & "?"); $s[$j] = $c < 256 ? \chr($c) : '?'; break; case "\xf0": ++$i; // no break case "\xe0": $s[$j] = '?'; $i += 2; break; default: $s[$j] = $s[$i]; } } return \substr($s, 0, $j); } public static function php_os_family() { if ('\\' === \DIRECTORY_SEPARATOR) { return 'Windows'; } $map = array('Darwin' => 'Darwin', 'DragonFly' => 'BSD', 'FreeBSD' => 'BSD', 'NetBSD' => 'BSD', 'OpenBSD' => 'BSD', 'Linux' => 'Linux', 'SunOS' => 'Solaris'); return isset($map[\PHP_OS]) ? $map[\PHP_OS] : 'Unknown'; } public static function spl_object_id($object) { if (null === self::$hashMask) { self::initHashMask(); } if (null === ($hash = \spl_object_hash($object))) { return; } // On 32-bit systems, PHP_INT_SIZE is 4, return self::$hashMask ^ \hexdec(\substr($hash, 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function sapi_windows_vt100_support($stream, $enable = null) { if (!\is_resource($stream)) { \trigger_error('sapi_windows_vt100_support() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } $meta = \stream_get_meta_data($stream); if ('STDIO' !== $meta['stream_type']) { \trigger_error('sapi_windows_vt100_support() was not able to analyze the specified stream', \E_USER_WARNING); return \false; } // We cannot actually disable vt100 support if it is set if (\false === $enable || !self::stream_isatty($stream)) { return \false; } // The native function does not apply to stdin $meta = \array_map('strtolower', $meta); $stdin = 'php://stdin' === $meta['uri'] || 'php://fd/0' === $meta['uri']; return !$stdin && (\false !== \getenv('ANSICON') || 'ON' === \getenv('ConEmuANSI') || 'xterm' === \getenv('TERM') || 'Hyper' === \getenv('TERM_PROGRAM')); } public static function stream_isatty($stream) { if (!\is_resource($stream)) { \trigger_error('stream_isatty() expects parameter 1 to be resource, ' . \gettype($stream) . ' given', \E_USER_WARNING); return \false; } if ('\\' === \DIRECTORY_SEPARATOR) { $stat = @\fstat($stream); // Check if formatted mode is S_IFCHR return $stat ? 020000 === ($stat['mode'] & 0170000) : \false; } return \function_exists('posix_isatty') && @\posix_isatty($stream); } private static function initHashMask() { $obj = (object) array(); self::$hashMask = -1; // check if we are nested in an output buffering handler to prevent a fatal error with ob_start() below $obFuncs = array('ob_clean', 'ob_end_clean', 'ob_flush', 'ob_end_flush', 'ob_get_contents', 'ob_get_flush'); foreach (\debug_backtrace(\PHP_VERSION_ID >= 50400 ? \DEBUG_BACKTRACE_IGNORE_ARGS : \false) as $frame) { if (isset($frame['function'][0]) && !isset($frame['class']) && 'o' === $frame['function'][0] && \in_array($frame['function'], $obFuncs)) { $frame['line'] = 0; break; } } if (!empty($frame['line'])) { \ob_start(); \debug_zval_dump($obj); self::$hashMask = (int) \substr(\ob_get_clean(), 17); } self::$hashMask ^= \hexdec(\substr(\spl_object_hash($obj), 16 - (\PHP_INT_SIZE * 2 - 1), \PHP_INT_SIZE * 2 - 1)); } public static function mb_chr($code, $encoding = null) { if (0x80 > ($code %= 0x200000)) { $s = \chr($code); } elseif (0x800 > $code) { $s = \chr(0xc0 | $code >> 6) . \chr(0x80 | $code & 0x3f); } elseif (0x10000 > $code) { $s = \chr(0xe0 | $code >> 12) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } else { $s = \chr(0xf0 | $code >> 18) . \chr(0x80 | $code >> 12 & 0x3f) . \chr(0x80 | $code >> 6 & 0x3f) . \chr(0x80 | $code & 0x3f); } if ('UTF-8' !== $encoding) { $s = \mb_convert_encoding($s, $encoding, 'UTF-8'); } return $s; } public static function mb_ord($s, $encoding = null) { if (null === $encoding) { $s = \mb_convert_encoding($s, 'UTF-8'); } elseif ('UTF-8' !== $encoding) { $s = \mb_convert_encoding($s, 'UTF-8', $encoding); } if (1 === \strlen($s)) { return \ord($s); } $code = ($s = \unpack('C*', \substr($s, 0, 4))) ? $s[1] : 0; if (0xf0 <= $code) { return ($code - 0xf0 << 18) + ($s[2] - 0x80 << 12) + ($s[3] - 0x80 << 6) + $s[4] - 0x80; } if (0xe0 <= $code) { return ($code - 0xe0 << 12) + ($s[2] - 0x80 << 6) + $s[3] - 0x80; } if (0xc0 <= $code) { return ($code - 0xc0 << 6) + $s[2] - 0x80; } return $code; } } addons/gdriveaddon/GDriveAddon.php000064400000004775147600374260013167 0ustar00 $storageNums Storages num * * @return array */ public static function getStorageUsageStats($storageNums) { if (($storages = AbstractStorageEntity::getAll()) === false) { $storages = []; } $storageNums['storages_gdrive_count'] = 0; foreach ($storages as $index => $storage) { if ($storage->getSType() === GDriveStorage::getSType()) { $storageNums['storages_gdrive_count']++; } } return $storageNums; } /** * * @return string */ public static function getAddonPath() { return __DIR__; } /** * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/onedriveaddon/src/Models/OneDriveStorage.php000064400000044425147600374260016442 0ustar00 */ protected static function getDefaultConfig() { $config = parent::getDefaultConfig(); $config = array_merge( $config, [ 'endpoint_url' => '', 'resource_id' => '', 'access_token' => '', 'refresh_token' => '', 'token_obtained' => 0, 'storage_folder_id' => '', 'storage_folder_web_url' => '', 'all_folders_perm' => false, 'authorized' => false, ] ); return $config; } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { parent::__wakeup(); if ($this->legacyEntity) { // Old storage entity $this->legacyEntity = false; // Make sure the storage type is right from the old entity $this->storage_type = $this->getSType(); $this->config = [ 'endpoint_url' => $this->onedrive_endpoint_url, 'resource_id' => $this->onedrive_resource_id, 'access_token' => $this->onedrive_access_token, 'refresh_token' => $this->onedrive_refresh_token, 'token_obtained' => $this->onedrive_token_obtained, 'storage_folder' => ltrim($this->onedrive_storage_folder, '/\\'), 'max_packages' => $this->onedrive_max_files, 'storage_folder_id' => $this->onedrive_storage_folder_id, 'storage_folder_web_url' => $this->onedrive_storage_folder_web_url, 'authorized' => ($this->onedrive_authorization_state == 1), ]; // reset old values $this->onedrive_endpoint_url = ''; $this->onedrive_resource_id = ''; $this->onedrive_access_token = ''; $this->onedrive_refresh_token = ''; $this->onedrive_token_obtained = 0; $this->onedrive_storage_folder = ''; $this->onedrive_max_files = 10; $this->onedrive_storage_folder_id = ''; $this->onedrive_authorization_state = 0; $this->onedrive_storage_folder_web_url = ''; } } /** * Will be called, automatically, when Serialize * * @return array */ public function __serialize() // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound { $data = parent::__serialize(); unset($data['client']); return $data; } /** * Return the storage type * * @return int */ public static function getSType() { return 7; } /** * Returns the storage type icon. * * @return string Returns the storage icon */ public static function getStypeIcon() { $imgUrl = DUPLICATOR_PRO_IMG_URL . '/onedrive.svg'; return '' . esc_attr(static::getStypeName()) . ''; } /** * Returns the storage type name. * * @return string */ public static function getStypeName() { return __('OneDrive', 'duplicator-pro'); } /** * Get storage location string * * @return string */ public function getLocationString() { if (!$this->isAuthorized()) { return __("Not Authenticated", "duplicator-pro"); } else { return $this->config['storage_folder_web_url']; } } /** * Returns an html anchor tag of location * * @return string Returns an html anchor tag with the storage location as a hyperlink. * * @example * OneDrive Example return * https://1drv.ms/f/sAFrQtasdrewasyghg */ public function getHtmlLocationLink() { if ($this->isAuthorized()) { return '' . esc_html($this->getStorageFolder()) . ''; } else { return $this->getLocationString(); } } /** * Check if storage is supported * * @return bool */ public static function isSupported() { return SnapUtil::isCurlEnabled(); } /** * Get supported notice, displayed if storage isn't supported * * @return string html string or empty if storage is supported */ public static function getNotSupportedNotice() { if (static::isSupported()) { return ''; } return esc_html__('OneDrive requires the PHP CURL extension enabled.', 'duplicator-pro'); } /** * Check if storage is valid * * @return bool Return true if storage is valid and ready to use, false otherwise */ public function isValid() { return $this->isAuthorized(); } /** * Is autorized * * @return bool */ public function isAuthorized() { return $this->config['authorized']; } /** * Get the chunk size bytes * * @return int */ public function getUploadChunkSize() { return DynamicGlobalEntity::getInstance()->getVal('onedrive_upload_chunksize_in_kb') * KB_IN_BYTES; } /** * Get the chunk size bytes * * @return int */ public function getDownloadChunkSize() { return DynamicGlobalEntity::getInstance()->getVal('onedrive_download_chunksize_in_kb') * KB_IN_BYTES; } /** * Get upload chunk timeout in seconds * * @return int timeout in microseconds, 0 unlimited */ public function getUploadChunkTimeout() { $global = DUP_PRO_Global_Entity::getInstance(); return (int) ($global->php_max_worker_time_in_sec <= 0 ? 0 : $global->php_max_worker_time_in_sec * SECONDS_IN_MICROSECONDS); } /** * Authorized from HTTP request * * @param string $message Message * * @return bool True if authorized, false if failed */ public function authorizeFromRequest(&$message = '') { try { if (($refreshToken = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'auth_code')) === '') { throw new Exception(__('Authorization code is empty', 'duplicator-pro')); } $this->name = SnapUtil::sanitizeTextInput(SnapUtil::INPUT_REQUEST, 'name', ''); $this->notes = SnapUtil::sanitizeDefaultInput(SnapUtil::INPUT_REQUEST, 'notes', ''); $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'max_packages', 10); $this->config['storage_folder'] = self::getSanitizedInputFolder('storage_folder', 'remove'); $this->revokeAuthorization(); $token = (new TokenEntity(self::getSType(), ['refresh_token' => $refreshToken])); if (! $token->refresh(true)) { throw new Exception(__('Failed to fetch information from OneDrive. Make sure the token is valid.', 'duplicator-pro')); } $this->config['access_token'] = $token->getAccessToken(); $this->config['refresh_token'] = $token->getRefreshToken(); $this->config['token_obtained'] = $token->getCreated(); $this->config['endpoint_url'] = $this->config['resource_id'] = ''; $this->config['authorized'] = true; DUP_PRO_Log::traceObject("OneDrive App folder: ", $storageFolder = $this->getOneDriveStorageFolder()); if (! $storageFolder) { throw new Exception("Failed to fetch information from OneDrive. Make sure the token is valid."); } // Get the storage folder id $this->config['storage_folder_id'] = $storageFolder->id; $this->config['storage_folder_web_url'] = $storageFolder->webUrl; } catch (Exception $e) { DUP_PRO_Log::trace("Problem authorizing OneDrive access token msg: " . $e->getMessage()); $message = $e->getMessage(); return false; } $message = __('OneDrive is connected successfully and Storage Provider Updated.', 'duplicator-pro'); return true; } /** * Revokes authorization * * @param string $message Message * * @return bool True if authorized, false if failed */ public function revokeAuthorization(&$message = '') { if (!$this->isAuthorized()) { $message = __('Onedrive isn\'t authorized.', 'duplicator-pro'); return true; } $this->config['endpoint_url'] = ''; $this->config['resource_id'] = ''; $this->config['access_token'] = ''; $this->config['refresh_token'] = ''; $this->config['token_obtained'] = 0; $this->config['storage_folder_id'] = ''; $this->config['storage_folder_web_url'] = ''; $this->config['authorized'] = false; $message = __('Onedrive is disconnected successfully.', 'duplicator-pro'); return true; } /** * Get external revoke url * * @return string */ public function getExternalRevokeUrl() { $base_url = "https://login.microsoftonline.com/common/oauth2/v2.0/logout"; $fields_arr = [ "client_id" => self::CLIENT_ID, "post_logout_redirect_uri" => self::LOGOUT_REDIRECT_URI, ]; $query = http_build_query($fields_arr); return $base_url . "?$query"; } /** * Get authorization URL * * @return string */ public function getAuthorizationUrl() { return (new TokenService(static::getSType()))->getRedirectUri(); } /** * Render form config fields * * @param bool $echo Echo or return * * @return string */ public function renderConfigFields($echo = true) { $hasError = $this->isAuthorized() && !$this->getAdapter()->isValid(); return TplMng::getInstance()->render( 'onedriveaddon/configs/onedrive', [ 'storage' => $this, 'storageFolder' => $this->config['storage_folder'], 'maxPackages' => $this->config['max_packages'], 'allFolderPers' => $this->config['all_folders_perm'], 'accountInfo' => $this->getAccountInfo(), 'hasError' => $hasError, 'externalRevokeUrl' => $this->getExternalRevokeUrl(), ], $echo ); } /** * Update data from http request, this method don't save data, just update object properties * * @param string $message Message * * @return bool True if success and all data is valid, false otherwise */ public function updateFromHttpRequest(&$message = '') { if ((parent::updateFromHttpRequest($message) === false)) { return false; } $this->config['max_packages'] = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, 'onedrive_msgraph_max_files', 10); $oldFolder = $this->config['storage_folder']; $this->config['storage_folder'] = self::getSanitizedInputFolder('_onedrive_msgraph_storage_folder', 'remove'); $this->config['all_folders_perm'] = SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, 'onedrive_msgraph_all_folders_read_write_perm', false); if ($this->isAuthorized() && $oldFolder != $this->config['storage_folder']) { $this->config['storage_folder_id'] = ''; // Create new folder $folder = $this->getOneDriveStorageFolder(); $this->config['storage_folder_id'] = $folder->id; $this->config['storage_folder_web_url'] = $folder->webUrl; $this->save(); } $message = sprintf( __('OneDrive Storage Updated.', 'duplicator-pro'), $this->getStorageFolder() ); return true; } /** * Get account info * * @return false|object */ protected function getAccountInfo() { if (! $this->isAuthorized()) { return false; } $storageFolder = $this->getOneDriveStorageFolder(); if (!$storageFolder || empty($storageFolder->user)) { return false; } return (object) $storageFolder->user; } /** * Get onedrive storage folder * * @return OneDriveStoragePathInfo|false */ protected function getOneDriveStorageFolder() { $adapter = $this->getAdapter(); if (! $adapter->isValid()) { DUP_PRO_Log::trace("OneDrive adapter is not valid, can't get storage folder."); return false; } if (!$this->config['storage_folder_id']) { if (! $adapter->initialize($error)) { DUP_PRO_Log::trace("Failed to initialize OneDrive adapter: $error"); return false; } $folder = $adapter->getPathInfo('/'); $this->config['storage_folder_id'] = $folder->id; $this->save(); } else { $folder = $adapter->getPathInfo('/'); } return $folder; } /** * Get stoage adapter * * @return OnedriveAdapter */ protected function getAdapter() { if (!$this->adapter) { $global = DUP_PRO_Global_Entity::getInstance(); $token = $this->getTokenFromConfig(); $this->adapter = new OneDriveAdapter( $token, $this->config['storage_folder'], $this->config['storage_folder_id'], !$global->ssl_disableverify, ($global->ssl_useservercerts ? '' : DUPLICATOR_PRO_CERT_PATH), DynamicGlobalEntity::getInstance()->getVal('onedrive_http_version', OnedriveAdapter::HTTP_VERSION_AUTO) ); if (! $this->adapter->initialize($error)) { DUP_PRO_Log::trace("Failed to initialize OneDrive adapter: $error"); } } return $this->adapter; } /** * Get the token entity using config values * * @return TokenEntity|false */ public function getTokenFromConfig() { $token = new TokenEntity(self::getSType(), [ 'created' => $this->config['token_obtained'], 'expires_in' => 3600, 'scope' => self::GRAPH_SCOPES, 'access_token' => $this->config['access_token'], 'refresh_token' => $this->config['refresh_token'], ]); if ($token->isAboutToExpire()) { $token->refresh(true); if (!$token->isValid()) { return false; } $this->config['token_obtained'] = $token->getCreated(); $this->config['refresh_token'] = $token->getRefreshToken(); $this->config['access_token'] = $token->getAccessToken(); $this->save(); } return $token; } /** * @return void * @throws Exception */ public static function registerType() { parent::registerType(); add_action('duplicator_update_global_storage_settings', function () { $dGlobal = DynamicGlobalEntity::getInstance(); foreach (static::getDefaultSettings() as $key => $default) { $value = SnapUtil::sanitizeIntInput(SnapUtil::INPUT_REQUEST, $key, $default); $dGlobal->setVal($key, $value); } }); } /** * Get default settings * * @return array */ protected static function getDefaultSettings() { return [ 'onedrive_http_version' => OnedriveAdapter::HTTP_VERSION_AUTO, 'onedrive_upload_chunksize_in_kb' => DUPLICATOR_PRO_ONEDRIVE_UPLOAD_CHUNK_DEFAULT_SIZE_IN_KB, 'onedrive_download_chunksize_in_kb' => self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_KB, ]; } /** * @return void */ public static function renderGlobalOptions() { $dGlobal = DynamicGlobalEntity::getInstance(); TplMng::getInstance()->render( 'onedriveaddon/configs/global_options', [ 'uploadChunkSize' => $dGlobal->getVal('onedrive_upload_chunksize_in_kb', DUPLICATOR_PRO_ONEDRIVE_UPLOAD_CHUNK_DEFAULT_SIZE_IN_KB), 'downloadChunkSize' => $dGlobal->getVal('onedrive_download_chunksize_in_kb', self::DEFAULT_DOWNLOAD_CHUNK_SIZE_IN_KB), 'httpVersion' => $dGlobal->getVal('onedrive_http_version', OnedriveAdapter::HTTP_VERSION_AUTO), ] ); } } addons/onedriveaddon/src/OneDriveStoragePathInfo.php000064400000001046147600374260016640 0ustar00 Default headers */ protected $headers = []; /** @var int CUrl HTTP Version or 0 auto */ protected $httpVersion = 0; /** * Class constructor * * @param string $baseUrl Base URL * @param string $accesToken Access token * @param bool $sslVerify If true, use SSL * @param string $sslCert If empty use server cert * @param int $timeout Timeout in seconds * @param int $httpVersion CUrl HTTP Version */ public function __construct($baseUrl, $accesToken, $sslVerify = true, $sslCert = '', $timeout = 1000, $httpVersion = 0) { $this->baseUrl = $baseUrl; $this->accessToken = $accesToken; $this->timeout = $timeout; $this->sslCert = $sslCert; $this->sslVerify = $sslVerify; if (defined('CURL_HTTP_VERSION_2_0') && $httpVersion === CURL_HTTP_VERSION_2_0) { $this->httpVersion = CURL_HTTP_VERSION_2_0; } elseif (defined('CURL_HTTP_VERSION_1_1') && $httpVersion === CURL_HTTP_VERSION_1_1) { $this->httpVersion = $httpVersion; } else { $this->httpVersion = 0; // auto } $this->headers['Authorization'] = 'Bearer ' . $this->accessToken; } /** * @param string $url The URL to request * @param array $data The data to send * @param array $headers The headers to send * * @return array{headers: array, body: string, code: int} * @throws \Exception */ public function get($url, $data = [], $headers = []) { return $this->request('GET', $url, $data, $headers); } /** * @param string $url The URL to request * @param array|string $data The data to send * @param array $headers The headers to send * * @return array{headers: array, body: string, code: int} */ public function post($url, $data = [], $headers = []) { return $this->request('POST', $url, $data, $headers); } /** * @param string $url The URL to request * @param array|string $data The data to send * @param array $headers The headers to send * * @return array{headers: array, body: string, code: int} */ public function put($url, $data = [], $headers = []) { return $this->request('PUT', $url, $data, $headers); } /** * @param string $url The URL to request * @param array $headers The headers to send * * @return array{headers: array, body: string, code: int} */ public function delete($url, $headers = []) { return $this->request('DELETE', $url, [], $headers); } /** * Send a HTTP request * * @param string $method The request verb * @param string $url The URL to request * @param array|string $data The data to send, arrays will be json encoded, strings will be sent as is * @param array $headers The headers to send * @param array $overrideOptions Override the curl options * * @return array{headers: array, body: string, code: int} */ public function request($method, $url, $data = [], $headers = [], $overrideOptions = []) { $headers = array_merge($this->headers, $headers); if (!empty($this->baseUrl) && strpos($url, 'http') !== 0) { $url = rtrim($this->baseUrl, '/') . '/' . ltrim($url, '/'); } $curl = curl_init(); if (!$curl) { throw new \Exception('Could not initialize remote request using curl.'); } if ($method === 'GET' && !empty($data)) { $url .= '?' . http_build_query($data); $data = []; } $options = [ CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_AUTOREFERER => true, CURLOPT_URL => $url, CURLOPT_TIMEOUT => $this->timeout, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_HEADER => true, CURLOPT_SSL_VERIFYHOST => ($this->sslVerify ? 2 : false), CURLOPT_SSL_VERIFYPEER => $this->sslVerify, ]; if ($this->httpVersion > 0) { $options[CURLOPT_HTTP_VERSION] = $this->httpVersion; } if (!empty($this->sslCert)) { $options[CURLOPT_CAINFO] = $this->sslCert; } // We are sending a json payload if (!empty($data) && is_array($data)) { $options[CURLOPT_POSTFIELDS] = json_encode($data); $headers['Content-Type'] = 'application/json'; } elseif (!empty($data) && is_string($data)) { // We are sending a string payload $options[CURLOPT_POST] = true; $options[CURLOPT_POSTFIELDS] = $data; } // Format the headers for curl and set the option $options[CURLOPT_HTTPHEADER] = $this->formatRequestHeaders($headers); // Override the options if needed if (!empty($overrideOptions)) { $options = array_merge($options, $overrideOptions); } // Set the options if (!curl_setopt_array($curl, $options)) { // curl will return immediately if it fails to set one of the options throw new \Exception('Could not set curl options.'); } $response = curl_exec($curl); // check for any error $error = curl_error($curl); if ($error || $response === false) { throw new \Exception("Curl error: {$error}"); } // Get the header size and the http code $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // Get the header and the body $header = substr($response, 0, $headerSize); $body = substr($response, $headerSize); curl_close($curl); return [ 'headers' => $this->formatResponseHeaders($header), 'body' => $body, 'code' => (int) $httpCode, ]; } /** * Format the headers for curl * * @param array $headers The headers to format * * @return string[] */ protected function formatRequestHeaders($headers) { return array_map(function ($key, $value) { return $key . ': ' . $value; }, array_keys($headers), $headers); } /** * Format the response headers * * @param string $headers The headers to format * * @return false|string[] */ protected function formatResponseHeaders($headers) { $headers = explode("\r\n", $headers); foreach ($headers as $index => $item) { $item = explode(': ', $item); if (count($item) === 2) { $headers[trim($item[0])] = trim($item[1]); } unset($headers[$index]); } return $headers; } } addons/onedriveaddon/src/OnedriveAdapter.php000064400000070166147600374260015234 0ustar00token = $token; $this->storageFolderName = trim($storageFolder, '/'); $this->storageFolderId = $storageFolderId; $this->sslVerify = $sslVerify; $this->sslCert = $sslCert; switch ($httpVersion) { case self::HTTP_VERSION_11: $httpVersion = (defined('CURL_HTTP_VERSION_1_1') ? CURL_HTTP_VERSION_1_1 : 0); break; case self::HTTP_VERSION_20: $httpVersion = (defined('CURL_HTTP_VERSION_2_0') ? CURL_HTTP_VERSION_2_0 : 0); break; default: $httpVersion = 0; break; } $this->http = new HttpClient($this->baseUrl, $token->getAccessToken(), $this->sslVerify, $this->sslCert, 1000, $httpVersion); } /** * Initialize the storage adapter * * @param string $errorMsg The error message to modify if initialization fails * * @return bool */ public function initialize(&$errorMsg = '') { if (! $this->token->isValid()) { $errorMsg = __('Invalid token supplied for OneDrive', 'duplicator-pro'); return false; } if (! $this->exists('/') && ! $this->createDir('/')) { $errorMsg = __('Unable to create root directory for OneDrive', 'duplicator-pro'); return false; } if (empty($this->storageFolderId)) { $root = $this->getPathInfo('/'); if (! $root || ! $root->exists) { $errorMsg = 'OneDrive root folder does not exist.'; return false; } $this->storageFolderId = $root->id; } return true; } /** * Destroy the storage adapter * * @return bool */ public function destroy() { $storageFolder = $this->getPathInfo('/'); if (! $storageFolder || ! $storageFolder->exists) { return true; // nothing to delete } return $this->delete('/', true); } /** * Check if the storage adapter is valid * * @param string $errorMsg The error message to modify if validation fails * * @return bool */ public function isValid(&$errorMsg = '') { if (!$this->token->isValid() && !$this->token->refresh()) { $errorMsg = 'Invalid token supplied or token refresh failed.'; return false; } $root = $this->getPathInfo('/'); if (! $root || ! $root->exists) { $errorMsg = 'OneDrive root folder does not exist.'; return false; } return true; } /** * Create a directory in the storage * If the given path is a nested path, it will create all the parent directories * * @param string $path The path to create * * @return bool */ protected function realCreateDir($path) { if (empty($this->storageFolderId)) { $parentFolder = $this->getAppFolder()->id; $path = trim($this->storageFolderName . '/' . trim($path, '/'), '/'); } else { $parentFolder = $this->storageFolderId; $path = trim($path, '/'); } $folders = explode('/', $path); foreach ($folders as $folder) { $item = $this->getItemDetailsByPath($folder, $parentFolder); if (!isset($item['id'])) { try { $item = $this->createDriveDirectory($parentFolder, $folder); if (!isset($item['id'])) { return false; } } catch (Exception $e) { return false; } } $parentFolder = $item['id']; } return true; } /** * Create a file which is less that 4MB in the storage * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_put_content.md * * @param string $path The path in which the file will be created * @param string $content The content of the file * * @return false|int */ protected function realCreateFile($path, $content) { // maximum content length is 4MB if (strlen($content) > 4 * 1024 * 1024) { return false; } $file = ltrim($path, '/'); try { $response = $this->http->put("/me/drive/items/{$this->storageFolderId}:/{$file}:/content", $content, ['Content-Type' => 'text/plain']); } catch (Exception $e) { // Request failed from curl DUP_PRO_Log::infoTrace("Failed to create file in OneDrive: {$e->getMessage()}"); return false; } $response = json_decode($response['body'], true); if (!isset($response['id'])) { return false; } return (int) $response['size']; } /** * Delete relative path from storage root. * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_delete.md * * @param string $path The path or drive item id to delete * @param bool $recursive Whether to delete recursively * * @return bool */ protected function realDelete($path, $recursive = false) { if (! $this->exists($path)) { return true; } $info = $this->getItemDetailsByPath($path); if (! $recursive && isset($info['folder']) && $info['folder']['childCount'] > 0) { return false; } try { $response = $this->http->delete("/me/drive/items/{$info['id']}"); } catch (Exception $e) { // Request failed from curl DUP_PRO_Log::infoTrace("Failed to delete file in OneDrive: {$e->getMessage()}"); return false; } return $response['code'] === 204; } /** * Get the contents of a file * * @param string $path The path to the file * * @return false|string */ public function getFileContent($path) { $item = $this->getItemDetailsByPath($path); if (!isset($item['@microsoft.graph.downloadUrl'])) { return false; } return file_get_contents($item['@microsoft.graph.downloadUrl']); } /** * Get path info and cache it, is path not exists return path info with exists property set to false. * * @param string $path Relative storage path, if empty, return root path info. * * @return OneDriveStoragePathInfo|false The path info or false on error. */ protected function getRealPathInfo($path) { $path = '/' . ltrim($path, '/'); $item = $this->getItemDetailsByPath($path); return $this->buildStoragePathInfo($item); } /** * Move a file or directory. The destination path must not exist. * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_move.md * * @param string $oldPath The path to the file or directory to move * @param string $newPath The destination path * * @return bool */ protected function realMove($oldPath, $newPath) { $oldItem = $this->getPathInfo($oldPath); $newDirectoryItem = $this->getPathInfo(dirname($newPath)); if (!$oldItem || !$newDirectoryItem) { return false; } try { $response = $this->http->request('PATCH', "/me/drive/items/{$oldItem->id}", [ 'parentReference' => [ 'id' => $newDirectoryItem->id, ], 'name' => basename($newPath), ]); } catch (Exception $e) { // Request failed error from curl DUP_PRO_Log::infoTrace("Failed to move file in OneDrive: {$e->getMessage()}"); return false; } $response = json_decode($response['body'], true); return isset($response['id']); } /** * @param string $path The path to the directory to scan * @param bool $files Whether to include files * @param bool $folders Whether to include folders * * @return string[] */ public function scanDir($path, $files = true, $folders = true) { $path = '/' . ltrim($path, '/'); if ($path !== '/') { // Paths under the storage folder must be prefixed with a colon, no need to do this for the storage folder itself $path = ":{$path}:"; } try { $response = $this->http->get("/me/drive/items/{$this->storageFolderId}{$path}/children"); } catch (Exception $e) { DUP_PRO_Log::infoTrace("Failed to scan dir in OneDrive: {$e->getMessage()}"); return []; } $items = json_decode($response['body'], true); if (!isset($items['value'])) { return []; } else { $items = $items['value']; } foreach ($items as $index => $item) { $item = $this->buildStoragePathInfo($item); $items[$index] = $item->name; if (!$folders && $item->isDir) { unset($items[$index]); } if (!$files && !$item->isDir) { unset($items[$index]); } } return $items; } /** * Check if a directory is empty * * @param string $path The path to the directory * @param string[] $filters An array of filters to apply * * @return bool */ public function isDirEmpty($path, $filters = []) { $item = $this->getItemDetailsByPath($path); if (!isset($item['folder'])) { return false; } if ($item['folder']['childCount'] === 0) { return true; } elseif (empty($filters)) { // we have no filters, and the folder is not empty, so it must contain something return false; } $regexFilters = $normalFilters = []; foreach ($filters as $filter) { if ($filter[0] === '/' && substr($filter, -1) === '/') { $regexFilters[] = $filter; // It's a regex filter as it starts and ends with a slash } else { $normalFilters[] = $filter; } } $contents = $this->scanDir($path); foreach ($contents as $item) { if (in_array($item, $normalFilters)) { continue; } foreach ($regexFilters as $regexFilter) { if (preg_match($regexFilter, $item) === 1) { continue 2; } } return false; } return true; } /** * Start tracking the time for the current operation * * @return void */ protected function startTrackingTime() { $this->startTime = (int) (microtime(true) * SECONDS_IN_MICROSECONDS); } /** * Get the elapsed time since the start of the current operation * * @return float */ protected function getElapsedTime() { return (int) (microtime(true) * SECONDS_IN_MICROSECONDS) - $this->startTime; } /** * Check if the operation has reached the timeout * * @param int $timeout The timeout in microseconds * * @return bool */ protected function hasReachedTimeout($timeout) { return $timeout > 0 && $this->getElapsedTime() > $timeout; } /** * Copy local file to storage, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $sourceFile The source file full path * @param string $storageFile Storage destination path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ protected function realCopyToStorage($sourceFile, $storageFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $this->startTrackingTime(); $sessionKey = md5($sourceFile . $storageFile); if (! isset($extraData[$sessionKey]) || ! isset($extraData[$sessionKey]['uploadUrl'])) { $extraData[$sessionKey] = $this->createUploadSession($storageFile); DUP_PRO_Log::infoTrace("Created upload session for {$storageFile}, current session is: " . print_r($extraData, true)); } $uploadSession = $extraData[$sessionKey]; if (! $uploadSession || ! isset($uploadSession['uploadUrl'])) { DUP_PRO_Log::infoTrace("Failed to create upload session for {$storageFile}, try uploading again."); return false; } $expiration = strtotime($uploadSession['expirationDateTime']); $fileSize = filesize($sourceFile); $defaultChunkSize = MB_IN_BYTES; // 1MB $chunkSize = $length > 0 ? $length : $defaultChunkSize; $stream = fopen($sourceFile, 'rb'); $bytesRemaining = $fileSize - $offset; $bytesUploaded = $offset; fseek($stream, $bytesUploaded); // We stop uploading if we have reached the timeout or if we have uploaded the entire file. while ($bytesRemaining > 0 && ! $this->hasReachedTimeout($timeout)) { if (time() > $expiration) { DUP_PRO_Log::infoTrace("OneDrive Upload session expired for {$storageFile}, try uploading again."); unset($extraData[$sessionKey]); return false; } $chunkSize = min($chunkSize, $bytesRemaining); $chunk = fread($stream, $chunkSize); try { //$this->http->setTimeout($timeout / SECONDS_IN_MICROSECONDS); $response = $this->http->put($uploadSession['uploadUrl'], $chunk, [ 'Content-Length' => $chunkSize, 'Content-Range' => sprintf('bytes %d-%d/%d', $bytesUploaded, $bytesUploaded + $chunkSize - 1, $fileSize), ]); } catch (Exception $e) { DUP_PRO_Log::infoTrace("Failed to copy file to OneDrive: {$e->getMessage()}"); return false; } if ($response['code'] > 499 && $response['code'] < 600) { // 5XX means we can resume uploading later, so we don't consider this as an error. DUP_PRO_Log::infoTrace("OneDrive 5XX error for {$storageFile}, will try later."); break; } $bytesUploaded += $chunkSize; $bytesRemaining -= $chunkSize; if (in_array($response['code'], [200, 201])) { // We have finished uploading the file unset($extraData[$sessionKey]); return $length > 0 ? $length : $fileSize; // We return the original requested chunksize for historical reasons. } // At this point only 202 is expected, which means we have to continue uploading if ($response['code'] !== 202) { // 4XX means we cannot resume uploading. DUP_PRO_Log::infoTrace("OneDrive Upload error for {$storageFile}, try uploading again."); DUP_PRO_Log::infoTrace("OneDrive responded with code {$response['code']} & sent us: " . $response['body']); return false; } $responseData = json_decode($response['body'], true); if (isset($responseData['expirationDateTime'])) { $extraData[$sessionKey]['expirationDateTime'] = $responseData['expirationDateTime']; } if (isset($responseData['nextExpectedRanges'])) { $extraData[$sessionKey]['nextExpectedRanges'] = $responseData['nextExpectedRanges']; $nextRange = explode('-', $responseData['nextExpectedRanges'][0]); $bytesUploaded = (int) $nextRange[0]; } // A specific length was requested, we have uploaded the requested length. if ($length > 0) { break; } } // We return the amount of bytes uploaded. return $bytesUploaded - $offset; } /** * Get the app folder object * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/drive_get_specialfolder.md * * @return OneDriveStoragePathInfo|false */ protected function getAppFolder() { if ($this->appFolder !== null) { return $this->appFolder; } try { $response = $this->http->get('/me/drive/special/approot'); } catch (Exception $e) { DUP_PRO_Log::infoTrace("Failed to get app folder in OneDrive: {$e->getMessage()}"); return false; } $item = json_decode($response['body'], true); return $this->appFolder = $this->buildStoragePathInfo($item); } /** * Get the details of an item by path * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_get.md#http-request * * @param string $path The path to the item * @param null|string $parent The ID of the parent directory * * @return array|false */ protected function getItemDetailsByPath($path, $parent = null) { $path = '/' . ltrim($path, '/'); if ($parent === null && empty($this->storageFolderId)) { $parent = $this->getAppFolder()->id; $path = '/' . trim($this->storageFolderName . $path, '/'); } elseif ($parent === null) { $parent = $this->storageFolderId; } try { $path = implode('/', array_map('rawurlencode', explode('/', $path))); $response = $this->http->get("me/drive/items/{$parent}:{$path}"); } catch (Exception $e) { DUP_PRO_Log::infoTrace("Failed to get item details in OneDrive: {$e->getMessage()}"); return false; } return json_decode($response['body'], true); } /** * Create a directory in the storage * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_post_children.md * * @param string $parent The ID of the parent directory * @param string $directory The name of the directory to create * * @return array */ protected function createDriveDirectory($parent, $directory) { try { $response = $this->http->post('me/drive/items/' . $parent . '/children', [ 'name' => $directory, 'folder' => new \stdClass(), '@microsoft.graph.conflictBehavior' => 'fail', ]); } catch (Exception $e) { DUP_PRO_Log::infoTrace("Failed to create directory in OneDrive: {$e->getMessage()}"); return []; } return json_decode($response['body'], true); } /** * Create a new upload session * * @see https://github.com/OneDrive/onedrive-api-docs/blob/live/docs/rest-api/api/driveitem_createuploadsession.md * * @param string $targetFile The path to the destination file * * @return array{uploadUrl: string, expirationDateTime: string}|false */ protected function createUploadSession($targetFile) { $parent = $this->storageFolderId; $file = basename($targetFile); if ($file !== $targetFile) { $directory = dirname($targetFile); $this->createDir($directory); $targetDir = $this->getPathInfo($directory); $parent = $targetDir->id; } try { $response = $this->http->post("me/drive/items/{$parent}:/{$file}:/createUploadSession", [ 'item' => ["name" => $file], ]); } catch (Exception $e) { // Request failed from curl DUP_PRO_Log::infoTrace("Failed to create upload session: {$e->getMessage()}, token " . print_r($this->token, true)); return false; } if ($response['code'] !== 200) { // Failed to create the upload session, error exists in the response body DUP_PRO_Log::infoTrace("Failed to create upload session, response: {$response['body']}, token " . print_r($this->token, true)); return false; } return json_decode($response['body'], true); } /** * Build a StoragePathInfo object from the given array * * @param array $item The array to build the object from * * @return OneDriveStoragePathInfo */ protected function buildStoragePathInfo($item) { $info = new OneDriveStoragePathInfo(); if (!isset($item['id'])) { return $info; } $info->exists = true; $info->id = $item['id']; $info->name = $item['name']; $info->isDir = isset($item['folder']); $info->created = isset($item['createdDateTime']) ? strtotime($item['createdDateTime']) : 0; $info->modified = isset($item['lastModifiedDateTime']) ? strtotime($item['lastModifiedDateTime']) : 0; $info->size = isset($item['size']) ? $item['size'] : 0; $info->webUrl = isset($item['webUrl']) ? $item['webUrl'] : ''; if (isset($item['file'])) { $info->file = $item['file']; } if (isset($item['createdBy']['user'])) { $info->user = $item['createdBy']['user']; } if (isset($item['parentReference']['path'])) { // path can be different from the name, e.g. when the file is in a subdirectory $fullPath = $item['parentReference']['path'] . '/' . $info->name; $storagePosition = strpos($fullPath, $this->storageFolderName); // calculate the position of the storage folder name $filePathStartPosition = $storagePosition + strlen($this->storageFolderName) + 1; // file path starts after the storage folder name & the slash $info->path = substr($fullPath, $filePathStartPosition); } return $info; } /** * Generate info on create dir * * @param string $path Dir path * * @return StoragePathInfo */ protected function generateCreateDirInfo($path) { return $this->getRealPathInfo($path); } /** * Generate info on delete item * * @param string $path Item path * * @return StoragePathInfo */ protected function generateDeleteInfo($path) { $info = new OneDriveStoragePathInfo(); $info->path = $path; $info->exists = false; $info->isDir = false; $info->size = 0; $info->created = 0; $info->modified = 0; return $info; } /** * Copy storage file to local file, partial copy is supported. * If destination file exists, it will be overwritten. * If offset is less than the destination file size, the file will be truncated. * * @param string $storageFile The storage file path * @param string $destFile The destination local file full path * @param int<0,max> $offset The offset where the data starts. * @param int $length The maximum number of bytes read. Default to -1 (read all the remaining buffer). * @param int $timeout The timeout for the copy operation in microseconds. Default to 0 (no timeout). * @param array $extraData Extra data to pass to copy function and updated during copy. * Used for storages that need to maintain persistent data during copy intra-session. * * @return false|int The number of bytes that were written to the file, or false on failure. */ public function copyFromStorage($storageFile, $destFile, $offset = 0, $length = -1, $timeout = 0, &$extraData = []) { $this->startTrackingTime(); if ($length < 0) { // We can use the download URL to download the file in one go $content = $this->getFileContent($storageFile); if ($content === false) { return false; } $content = substr($content, $offset); if (file_put_contents($destFile, $content) === false) { return false; } return strlen($content); } if (! isset($extraData['downloadUrl'])) { $item = $this->getItemDetailsByPath($storageFile); if (!isset($item['@microsoft.graph.downloadUrl'])) { return false; } $extraData['downloadUrl'] = $item['@microsoft.graph.downloadUrl']; if (file_put_contents($destFile, '') === false) { DUP_PRO_Log::infoTrace("[OnedriveAddon] Failed to open file for writing: {$destFile}"); return false; } } $downloadUrl = $extraData['downloadUrl']; $range = "bytes={$offset}-" . ($offset + $length - 1); try { $response = $this->http->get($downloadUrl, [], ['Range' => $range]); } catch (Exception $e) { DUP_PRO_Log::infoTrace("[OnedriveAddon] Failed to download file: {$storageFile}. Error: {$e->getMessage()}"); return false; } if ($response['code'] !== 206 && $response['code'] !== 200) { DUP_PRO_Log::infoTrace("[OnedriveAddon] Failed to download file: {$storageFile}. Response " . $response['body']); return false; } file_put_contents($destFile, $response['body'], FILE_APPEND); return $length; } } addons/onedriveaddon/template/onedriveaddon/configs/onedrive.php000064400000031073147600374260021262 0ustar00 $tplData * @var OneDriveStorage $storage */ $storage = $tplData["storage"]; /** @var string */ $storageFolder = $tplData["storageFolder"]; /** @var int */ $maxPackages = $tplData["maxPackages"]; /** @var bool */ $allFolderPers = $tplData["allFolderPers"]; /** @var false|object */ $accountInfo = $tplData["accountInfo"]; /** @var false|object */ $hasError = $tplData["hasError"]; /** @var string */ $externalRevokeUrl = $tplData["externalRevokeUrl"]; $tplMng->render('admin_pages/storages/parts/provider_head'); ?> isAuthorized()) : ?>
isAuthorized()) : ?>


displayName); ?>
'; esc_html_e('Please click on the "Cancel Authorization" button and reauthorize the OneDrive storage', 'duplicator-pro'); echo ''; ?>


//OneDrive/Apps/Duplicator Pro/ ? / \ | or shouldn\'t end with a dot(".").', 'duplicator-pro' ); ?>" >

render('admin_pages/storages/parts/provider_foot'); // Alerts for OneDrive $alertConnStatus = new DUP_PRO_UI_Dialog(); $alertConnStatus->title = __('OneDrive Connection Status', 'duplicator-pro'); $alertConnStatus->message = ''; // javascript inserted message $alertConnStatus->initAlert(); ?> addons/onedriveaddon/template/onedriveaddon/configs/global_options.php000064400000011664147600374260022466 0ustar00 $tplData */ ?>


 KB

 KB

>   >   >  
addons/onedriveaddon/OneDriveAddon.php000064400000004142147600374260014041 0ustar00 $storageNums Storages num * * @return array */ public static function getStorageUsageStats($storageNums) { if (($storages = AbstractStorageEntity::getAll()) === false) { $storages = []; } $storageNums['storages_onedrive_count'] = 0; foreach ($storages as $storage) { if ($storage->getSType() === OneDriveStorage::getSType()) { $storageNums['storages_onedrive_count']++; } } return $storageNums; } /** * @return string */ public static function getAddonPath() { return static::ADDON_PATH; } /** * @return string */ public static function getAddonFile() { return __FILE__; } } addons/probase/installer/probase/src/AbstractLicense.php000064400000017752147600374260017472 0ustar00 */ public static function getLimit() { // This is to avoid warnings in PHP 5.6 because isn't possibile declare an abstract static method. throw new Exception('This method must be extended'); } /** * Return upsell URL * * @return string */ public static function getUpsellURL() { // This is to avoid warnings in PHP 5.6 because isn't possibile declare an abstract static method. throw new Exception('This method must be extended'); } /** * Return true if license is unlimited * * @return bool */ public static function isUnlimited() { return in_array( static::getType(), [ self::TYPE_BUSINESS, self::TYPE_BUSINESS_AUTO, self::TYPE_GOLD, ] ); } /** * Return true if license have the capability * * @param int $capability capability key * @param ?int $license ENUM license type, if null Get currnt licnse type * * @return bool */ public static function can($capability, $license = null) { if (is_null($license)) { $license = static::getType(); } switch ($capability) { case self::CAPABILITY_PRO_BASE: return true; case self::CAPABILITY_IMPORT: return $license > 0; case self::CAPABILITY_MULTISITE: return $license > 0; case self::CAPABILITY_SCHEDULE: return $license > 0; case self::CAPABILITY_STORAGE: return $license > 0; case self::CAPABILITY_TEMPLATE: return $license > 0; case self::CAPABILITY_BRAND: case self::CAPABILITY_IMPORT_SETTINGS: case self::CAPABILITY_SHEDULE_HOURLY: case self::CAPABILITY_POWER_TOOLS: case self::CAPABILITY_UPDATE_AUTH: case self::CAPABILITY_CHANGE_TABLE_PREFIX: return in_array( $license, [ self::TYPE_FREELANCER, self::TYPE_FREELANCER_AUTO, self::TYPE_BUSINESS, self::TYPE_BUSINESS_AUTO, self::TYPE_GOLD, self::TYPE_PLUS, self::TYPE_PRO, self::TYPE_ELITE, ] ); case self::CAPABILITY_MULTISITE_PLUS: case self::CAPABILITY_CAPABILITIES_MNG: case self::CAPABILITY_CAPABILITIES_MNG_PLUS: case self::CAPABILITY_PACKAGE_COMPONENTS_PLUS: return in_array( $license, [ self::TYPE_BUSINESS, self::TYPE_BUSINESS_AUTO, self::TYPE_GOLD, self::TYPE_PRO, self::TYPE_ELITE, ] ); default: return false; } } /** * Return true if license can be upgraded * * @param ?int $license ENUM license type, if null Get currnt licnse type * * @return bool */ public static function canBeUpgraded($license = null) { if (is_null($license)) { $license = static::getType(); } return !in_array($license, [ self::TYPE_BUSINESS, self::TYPE_BUSINESS_AUTO, self::TYPE_GOLD, self::TYPE_ELITE, ]); } /** * Return license description * * @param ?int $license ENUM license type, if null Get currnt licnse type * @param bool $article if true add article before description * * @return string */ public static function getLicenseToString($license = null, $article = false) { if (is_null($license)) { $license = static::getType(); } switch ($license) { case self::TYPE_UNLICENSED: return ($article ? 'an ' : '') . 'unlicensed'; case self::TYPE_PERSONAL: case self::TYPE_PERSONAL_AUTO: return ($article ? 'a ' : '') . 'Personal'; case self::TYPE_FREELANCER: case self::TYPE_FREELANCER_AUTO: return ($article ? 'a ' : '') . 'Freelancer'; case self::TYPE_BUSINESS: case self::TYPE_BUSINESS_AUTO: return ($article ? 'a ' : '') . 'Business'; case self::TYPE_GOLD: return ($article ? 'a ' : '') . 'Gold'; case self::TYPE_BASIC: return ($article ? 'a ' : '') . 'Basic'; case self::TYPE_PLUS: return ($article ? 'a ' : '') . 'Plus'; case self::TYPE_PRO: return ($article ? 'a ' : '') . 'Pro'; case self::TYPE_ELITE: return ($article ? 'a ' : '') . 'Elite'; default: return ($article ? 'an ' : '') . 'unknown license type'; } } /** * Get best license from two given * * @param int $l1 ENUM license * @param int $l2 ENUM license * * @return int ENUM license */ protected static function getBestLicense($l1, $l2) { $l1Weight = 0; $l2Weight = 0; $wheigts = [ self::TYPE_UNLICENSED => -1, self::TYPE_BASIC => 0, self::TYPE_PERSONAL => 1, self::TYPE_PERSONAL_AUTO => 1, self::TYPE_PLUS => 2, self::TYPE_FREELANCER => 3, self::TYPE_FREELANCER_AUTO => 3, self::TYPE_PRO => 4, self::TYPE_ELITE => 5, self::TYPE_BUSINESS => 6, self::TYPE_BUSINESS_AUTO => 6, self::TYPE_GOLD => 7, ]; $l1Weight = (isset($wheigts[$l1]) ? $wheigts[$l1] : -1 ); $l2Weight = (isset($wheigts[$l2]) ? $wheigts[$l2] : -1 ); return ($l1Weight >= $l2Weight ? $l1 : $l2); } } addons/probase/installer/probase/src/AdvancedParams.php000064400000003165147600374260017266 0ustar00 * @copyright 2011-2021 Snapcreek LLC * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3 */ namespace Duplicator\Installer\Addons\ProBase; use Duplicator\Installer\Core\Params\Descriptors\DescriptorInterface; use Duplicator\Installer\Core\Params\Items\ParamForm; use Duplicator\Installer\Core\Params\PrmMng; use DUPX_U; class AdvancedParams implements DescriptorInterface { /** * Init advanced params * * @param \Duplicator\Installer\Core\Params\Items\ParamItem[] $params params list * * @return void */ public static function init(&$params) { $params[PrmMng::PARAM_GEN_WP_AUTH_KEY] = new ParamForm( PrmMng::PARAM_GEN_WP_AUTH_KEY, ParamForm::TYPE_BOOL, ParamForm::FORM_TYPE_CHECKBOX, array('default' => false), array( 'label' => 'Auth Keys:', 'checkboxLabel' => 'Generate New Unique Authentication Keys and Salts', 'status' => (License::can(License::CAPABILITY_UPDATE_AUTH) ? ParamForm::STATUS_ENABLED : ParamForm::STATUS_DISABLED), 'subNote' => (License::can(License::CAPABILITY_UPDATE_AUTH) ? '' : License::getLicenseUpdateText()), ) ); } /** * Update params after overwrite * * @param \Duplicator\Installer\Core\Params\Items\ParamItem[] $params params list * * @return void */ public static function updateParamsAfterOverwrite($params) { } } addons/probase/installer/probase/src/License.php000064400000003621147600374260015774 0ustar00 */ public static function getLimit() { return (int) max(0, (int) \DUPX_ArchiveConfig::getInstance()->license_limit); } /** * Return upsell URL * * @return string */ public static function getUpsellURL() { return ''; } /** * Get license on installer from package data * * @return int Returns an enum type of License */ protected static function getInstallerLicense() { return \DUPX_ArchiveConfig::getInstance()->license_type; } /** * Get importer license from params data * * @return int Returns an enum type of License */ protected static function getImporterLicense() { $overwriteData = PrmMng::getInstance()->getValue(PrmMng::PARAM_OVERWRITE_SITE_DATA); return isset($overwriteData['dupLicense']) ? $overwriteData['dupLicense'] : self::TYPE_UNLICENSED; } /** * Return license required note * * @return string */ public static function getLicenseUpdateText() { return 'This option isn\'t available at the ' . static::getLicenseToString() . ' license level.' . 'To enable this option ' . '' . 'upgrade' . '' . ' the License.'; } } addons/probase/installer/probase/ProBase.php000064400000004135147600374260015157 0ustar00 * @copyright 2011-2021 Snapcreek LLC * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3 * @version GIT: $Id$ * @link http://snapcreek.com */ namespace Duplicator\Installer\Addons\ProBase; use Duplicator\Installer\Core\Hooks\HooksMng; use Duplicator\Installer\Core\Params\Items\ParamItem; /** * Version Pro Base Installer addon class * * @category Duplicator * @package Installer * @author Snapcreek * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3 * @link http://snapcreek.com */ class ProBase extends \Duplicator\Installer\Core\Addons\InstAbstractAddonCore { /** * Main init addon * * @return void */ public function init() { HooksMng::getInstance()->addFilter( 'dupx_main_header', function ($value) { return 'Duplicator PRO'; } ); HooksMng::getInstance()->addFilter('installer_get_init_params', array(__CLASS__, 'getInitParams')); HooksMng::getInstance()->addAction( 'after_params_overwrite', array( '\\Duplicator\\Installer\\Addons\\ProBase\\AdvancedParams', 'updateParamsAfterOverwrite', ) ); } /** * getInitParams * * @param ParamItem[] $params params list * * @return ParamItem[] */ public static function getInitParams($params) { $advParams = array(); AdvancedParams::init($advParams); return array_merge($params, $advParams); } /** * Get addon main folder * * @return string */ public static function getAddonPath() { return __DIR__; } /** * Get addon main file * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/probase/src/License/LicenseNotices.php000064400000021335147600374260015255 0ustar00 $plugin An array of plugin data * * @return void */ public static function noLicenseDisplay($file, $plugin) { $latest_version = License::getLatestVersion(); // Only display this message when there is no update message if (($latest_version === false) || version_compare(DUPLICATOR_PRO_VERSION, $latest_version, '>=')) { $error_string = null; $licenseSettingsUrl = SettingsPageController::getInstance()->getMenuLink( LicensingController::L2_SLUG_LICENSING ); $licenseStatus = LicenseData::getInstance()->getStatus(); if ($licenseStatus === LicenseData::STATUS_INVALID || $licenseStatus === LicenseData::STATUS_SITE_INACTIVE) { $error_string = sprintf( esc_html_x( 'Your Duplicator Pro license key is invalid so you aren\'t getting important updates! %1$sActivate your license%2$s or %3$spurchase a license%4$s.', '1,3: tag, 2,4: tag', 'duplicator-pro' ), '', '', '', '' ); } elseif ($licenseStatus === LicenseData::STATUS_EXPIRED) { $license_key = License::getLicenseKey(); if ($license_key !== false) { $renewal_url = DUPLICATOR_PRO_BLOG_URL . 'checkout?edd_license_key=' . $license_key; $error_string = sprintf( __( 'Your Duplicator Pro license key has expired so you aren\'t getting important updates! %1$sRenew your license now%2$s', 'duplicator-pro' ), '', '' ); } } if ($error_string != null) { ob_start(); ?>

[ 'href' => [], 'target' => [], ], ] ); ?>

getStatus()) { case LicenseData::STATUS_VALID: break; case LicenseData::STATUS_EXPIRED: self::showExpired(); break; case LicenseData::STATUS_UNKNOWN: case LicenseData::STATUS_INVALID: case LicenseData::STATUS_INACTIVE: case LicenseData::STATUS_DISABLED: case LicenseData::STATUS_SITE_INACTIVE: default: if ($licenseData->haveNoActivationsLeft()) { self::showNoActivationsLeft(); } else { self::showInvalidStandardNag(); } break; } } /** * Shows the smaller standard nag screen * * @return void */ private static function showInvalidStandardNag() { $problem_text = 'missing'; $htmlMsg = TplMng::getInstance()->render( 'licensing/notices/inactive_message', ['problem' => $problem_text], false ); AdminNotices::displayGeneralAdminNotice( $htmlMsg, AdminNotices::GEN_ERROR_NOTICE, false, ['dup-license-message'], [], true ); } /** * Shows the license count used up alert * * @return void */ private static function showNoActivationsLeft() { $htmlMsg = TplMng::getInstance()->render( 'licensing/notices/no_activation_left', [], false ); AdminNotices::displayGeneralAdminNotice( $htmlMsg, AdminNotices::GEN_ERROR_NOTICE, false, ['dup-license-message'], [], true ); } /** * Shows the expired message alert * * @return void */ private static function showExpired() { $renewal_url = DUPLICATOR_PRO_BLOG_URL . 'checkout?edd_license_key=' . License::getLicenseKey(); $htmlMsg = TplMng::getInstance()->render( 'licensing/notices/expired', [ 'renewal_url' => $renewal_url, 'schedule_disalbe_days_left' => DrmHandler::getDaysTillDRM(), 'active_schedule_present' => count(\DUP_PRO_Schedule_Entity::get_active()) > 0, ], false ); AdminNotices::displayGeneralAdminNotice( $htmlMsg, AdminNotices::GEN_ERROR_NOTICE, false, ['dup-license-message'], [], true ); } /** * Gets the upgrade link * * @param string $label The label of the link * @param bool $echo Whether to echo the link or return it * * @return string */ public static function getUpsellLinkHTML($label = 'Upgrade', $echo = true) { ob_start(); ?> getStatus(), [ LicenseData::STATUS_INVALID, LicenseData::STATUS_UNKNOWN, ] ) ) { return; } self::initEddUpdater(); } /** * Return true if license have the capability * * @param int $capability capability key * @param ?int $license ENUM license type, if null Get currnt licnse type * * @return bool */ public static function can($capability, $license = null) { if (is_null($license)) { $license = static::getType(); } switch ($capability) { case self::CAPABILITY_SCHEDULE: if ($license > 0) { return true; } if (count(DUP_PRO_Schedule_Entity::get_active()) > 0 && DrmHandler::getDaysTillDRM() > 0) { return true; } return false; default: return parent::can($capability, $license); } } /** * Force upgrade check * * @return void */ public static function forceUpgradeCheck() { if ( in_array( LicenseData::getInstance()->getStatus(), [ LicenseData::STATUS_INVALID, LicenseData::STATUS_UNKNOWN, ] ) ) { return; } self::clearVersionCache(); } /** * Return latest version of the plugin * * @return string|false */ public static function getLatestVersion() { $version_info = null; $edd_updater = self::getEddUpdater(); /** @var false|object */ $version_info = $edd_updater->get_cached_version_info(); if (is_object($version_info) && isset($version_info->new_version)) { return $version_info->new_version; } else { return false; } } /** * Clear version cache * * @return void */ public static function clearVersionCache() { LicenseData::getInstance()->clearCache(); self::getEddUpdater()->set_version_info_cache(false); } /** * Return license key * * @return string */ public static function getLicenseKey() { return LicenseData::getInstance()->getKey(); } /** * Get license status * * @return int */ public static function getLicenseStatus() { return LicenseData::getInstance()->getStatus(); } /** * Return license type * * @return int ENUM AbstractLicense::TYPE_* */ public static function getType() { return ( LicenseData::getInstance()->getStatus() == LicenseData::STATUS_VALID ? LicenseData::getInstance()->getLicenseType() : self::TYPE_UNLICENSED ); } /** * Initialize the EDD Updater * * @return void */ private static function initEddUpdater() { if (self::$edd_updater !== null) { return; } $dpro_edd_opts = array( 'version' => DUPLICATOR_PRO_VERSION, 'license' => self::getLicenseKey(), 'item_name' => self::EDD_DUPPRO_ITEM_NAME, 'author' => 'Snap Creek Software', 'wp_override' => true, ); self::$edd_updater = new EDD_SL_Plugin_Updater( self::EDD_DUPPRO_STORE_URL, DUPLICATOR____FILE, $dpro_edd_opts ); } /** * Accessor that returns the EDD Updater singleton * * @return EDD_SL_Plugin_Updater */ private static function getEddUpdater() { if (self::$edd_updater === null) { self::initEddUpdater(); } return self::$edd_updater; } /** * Return upsell URL * * @return string */ public static function getUpsellURL() { return DUPLICATOR_PRO_BLOG_URL . 'my-account/'; } /** * Return no activation left message * * @return string */ public static function getNoActivationLeftMessage() { if (self::isUnlimited()) { $result = sprintf(__('%1$s site licenses are granted in batches of 500.', 'duplicator-pro'), License::getLicenseToString()); $result .= ' '; $result .= sprintf( _x( 'Please submit a %1$sticket request%2$s and we will grant you another batch.', '%1$s and %2$s represents the opening and closing HTML tags for an anchor or link', 'duplicator-pro' ), '', '' ); $result .= '
'; $result .= __('This process helps to ensure that licenses are not stolen or abused for users.', 'duplicator-pro'); return $result; } else { return __( 'Use the link above to login to your duplicator.com dashboard to manage your licenses or upgrade to a higher license.', 'duplicator-pro' ); } } } addons/probase/src/License/LicenseUtils.php000064400000000230147600374260014740 0ustar00 false, 'license' => 'invalid', 'item_id' => false, 'item_name' => '', 'checksum' => '', 'expires' => '', 'payment_id' => -1, 'customer_name' => '', 'customer_email' => '', 'license_limit' => -1, 'site_count' => -1, 'activations_left' => -1, 'price_id' => AbstractLicense::TYPE_UNLICENSED, 'activeSubscription' => false, ]; /** @var string */ protected $licenseKey = ''; /** @var int */ protected $status = self::STATUS_INVALID; /** @var int */ protected $type = AbstractLicense::TYPE_UNKNOWN; /** @var array License remote data */ protected $data = self::DEFAULT_LICENSE_DATA; /** @var string timestamp YYYY-MM-DD HH:MM:SS UTC */ protected $lastRemoteUpdate = ''; /** @var string timestamp YYYY-MM-DD HH:MM:SS UTC */ protected $lastFailureTime = ''; /** * Last error request * * @var array{code:int, message: string, details: string, requestDetails: string} */ protected $lastRequestError = [ 'code' => 0, 'message' => '', 'details' => '', 'requestDetails' => '', ]; /** * Class constructor */ protected function __construct() { } /** * Return entity type identifier * * @return string */ public static function getType() { return 'LicenseDataEntity'; } /** * Will be called, automatically, when Serialize * * @return array */ public function __serialize() // phpcs:ignore PHPCompatibility.FunctionNameRestrictions.NewMagicMethods.__serializeFound { $data = JsonSerialize::serializeToData($this, JsonSerialize::JSON_SKIP_MAGIC_METHODS | JsonSerialize::JSON_SKIP_CLASS_NAME); if (DUP_PRO_Global_Entity::getInstance()->isEncryptionEnabled()) { $data['licenseKey'] = CryptBlowfish::encryptIfAvaiable($data['licenseKey'], null, true); $data['status'] = CryptBlowfish::encryptIfAvaiable($data['status'], null, true); $data['type'] = CryptBlowfish::encryptIfAvaiable($data['type'], null, true); $data['data'] = CryptBlowfish::encryptIfAvaiable(JsonSerialize::serialize($this->data), null, true); } unset($data['lastRequestError']); return $data; } /** * Serialize * * Wakeup method. * * @return void */ public function __wakeup() { if (DUP_PRO_Global_Entity::getInstance()->isEncryptionEnabled()) { $this->licenseKey = CryptBlowfish::decryptIfAvaiable((string) $this->licenseKey, null, true); $this->status = (int) CryptBlowfish::decryptIfAvaiable((string) $this->status, null, true); $this->type = (int) CryptBlowfish::decryptIfAvaiable((string) $this->type, null, true); /** @var string PHP stan fix*/ $dataString = $this->data; $this->data = JsonSerialize::unserialize(CryptBlowfish::decryptIfAvaiable($dataString, null, true)); } if (!is_array($this->data)) { $this->data = self::DEFAULT_LICENSE_DATA; } } /** * Set license key * * @param string $licenseKey License key, if empty the license key will be removed * * @return bool return true if license key is valid and set */ public function setKey($licenseKey) { if ($this->licenseKey === $licenseKey) { return true; } if ($this->getStatus() === self::STATUS_VALID) { // Deactivate old license $this->deactivate(); } if (preg_match('/^[a-f0-9]{32}$/i', $licenseKey) === 1) { $this->licenseKey = $licenseKey; } else { $this->licenseKey = ''; } return $this->clearCache(); } /** * Get license key * * @return string */ public function getKey() { return $this->licenseKey; } /** * Reset license data cache * * @param bool $save if true save the entity * * @return bool return true if license data cache is reset */ public function clearCache($save = true) { $this->data = self::DEFAULT_LICENSE_DATA; $this->status = self::STATUS_INVALID; $this->type = AbstractLicense::TYPE_UNKNOWN; $this->lastRemoteUpdate = ''; $this->lastFailureTime = ''; return ($save ? $this->save() : true); } /** * Get license data. * This function manage the license data cache. * * @return array License data */ public function getLicenseData() { $this->data = [ 'success' => true, 'license' => 'valid', 'item_id' => 31, 'item_name' => '', 'checksum' => '', 'expires' => 'lifetime', 'payment_id' => -1, 'customer_name' => '', 'customer_email' => '', 'license_limit' => 100, 'site_count' => 1, 'activations_left' => 99, 'price_id' => AbstractLicense::TYPE_ELITE, 'activeSubscription' => false, ]; $this->status = self::STATUS_VALID; $this->type = AbstractLicense::TYPE_ELITE; $this->save(); return $this->data; if ($this->licenseKey === '') { return $this->data; } $currentTime = (int) strtotime(gmdate("Y-m-d H:i:s")); $lastFailureTime = (int) ($this->lastFailureTime === '' ? 0 : strtotime($this->lastFailureTime)); if (($currentTime - $lastFailureTime) < self::LICENSE_FAILURE_DELAY_TIME) { return $this->data; } $updatedTime = (int) ($this->lastRemoteUpdate === '' ? 0 : strtotime($this->lastRemoteUpdate)); if ($this->data['license'] == 'valid') { if ($this->data['expires'] === 'lifetime') { $expireTime = PHP_INT_MAX; } elseif (empty($this->data['expires'])) { $expireTime = 0; } else { $expireTime = (int) strtotime($this->data['expires']); } // Recheck expired if the license is expired with more than 1 day to avoid unnecessary requests $recheckExpired = ($expireTime < ($currentTime - DAY_IN_SECONDS)); } else { $recheckExpired = false; } if ( ($currentTime - $updatedTime) > self::LICENSE_CACHE_TIME || $recheckExpired ) { try { $api_params = array( 'edd_action' => 'check_license', 'license' => $this->licenseKey, 'item_name' => urlencode(License::EDD_DUPPRO_ITEM_NAME), 'url' => (is_multisite() ? network_home_url() : home_url()), ); if (($remoteData = $this->request($api_params)) === false) { DUP_PRO_Log::trace("Error getting license check response for " . substr($this->licenseKey, 0, 5) . "*** so leaving status alone"); $this->lastFailureTime = gmdate("Y-m-d H:i:s"); } else { $this->clearCache(false); foreach (self::DEFAULT_LICENSE_DATA as $key => $value) { if (isset($remoteData->{$key})) { $this->data[$key] = $remoteData->{$key}; } } $this->status = self::getStatusFromEDDStatus($remoteData->license); $this->type = (int) (property_exists($remoteData, 'price_id') ? $remoteData->price_id : AbstractLicense::TYPE_UNLICENSED); $this->lastRemoteUpdate = gmdate("Y-m-d H:i:s"); } } finally { $this->save(); } } return $this->data; } /** * Activate license key * * @return int license status */ public function activate() { if (strlen($this->licenseKey) == 0) { return self::ACTIVATION_REQUEST_ERROR; } $api_params = array( 'edd_action' => 'activate_license', 'license' => $this->licenseKey, 'item_name' => urlencode(License::EDD_DUPPRO_ITEM_NAME), // the name of our product in EDD, 'url' => (is_multisite() ? network_home_url() : home_url()), ); $this->clearCache(); if (($responseData = $this->request($api_params)) === false) { return self::ACTIVATION_REQUEST_ERROR; } if ($responseData->license == 'valid') { DUP_PRO_Log::trace("License Activated " . substr($this->licenseKey, 0, 5) . "***"); return self::ACTIVATION_RESPONSE_OK; } else { DUP_PRO_Log::traceObject("Problem activating license " . substr($this->licenseKey, 0, 5) . "***", $responseData); return self::ACTIVATION_RESPONSE_INVALID; } } /** * Get license status * * @return int ENUM self::STATUS_* */ public function getStatus() { $this->getLicenseData(); return $this->status; } /** * Get license type * * @return int ENUM AbstractLicense::TYPE_* */ public function getLicenseType() { $this->getLicenseData(); return $this->type; } /** * Get license websites limit * * @return int<0, max> */ public function getLicenseLimit() { $this->getLicenseData(); return (int) max(0, (int) $this->data['license_limit']); } /** * Get site count * * @return int<-1, max> */ public function getSiteCount() { $this->getLicenseData(); return (int) max(-1, (int) $this->data['site_count']); } /** * Deactivate license key * * @return int license status */ public function deactivate() { if (strlen($this->licenseKey) == 0) { return self::ACTIVATION_RESPONSE_OK; } $api_params = array( 'edd_action' => 'deactivate_license', 'license' => $this->licenseKey, 'item_name' => urlencode(License::EDD_DUPPRO_ITEM_NAME), // the name of our product in EDD, 'url' => (is_multisite() ? network_home_url() : home_url()), ); $this->clearCache(); if (($responseData = $this->request($api_params)) === false) { return self::ACTIVATION_REQUEST_ERROR; } if ($responseData->license == 'deactivated') { DUP_PRO_Log::trace("Deactivated license " . $this->licenseKey); return self::ACTIVATION_RESPONSE_OK; } else { DUP_PRO_Log::traceObject("Problems deactivating license " . $this->licenseKey, $responseData); return self::ACTIVATION_RESPONSE_INVALID; } } /** * Get expiration date format * * @param string $format date format * * @return string return expirtation date formatted, Unknown if license data is not available or Lifetime if license is lifetime */ public function getExpirationDate($format = 'Y-m-d') { $this->getLicenseData(); if ($this->data['expires'] === 'lifetime') { return 'Lifetime'; } if (empty($this->data['expires'])) { return 'Unknown'; } $expirationDate = new DateTime($this->data['expires']); return $expirationDate->format($format); } /** * Return expiration license days, if is expired a negative number is returned * * @return false|int reutrn false on fail or number of days to expire, PHP_INT_MAX is filetime */ public function getExpirationDays() { $this->getLicenseData(); if ($this->data['expires'] === 'lifetime') { return PHP_INT_MAX; } if (empty($this->data['expires'])) { return false; } $expirationDate = new DateTime($this->data['expires']); return (-1 * intval($expirationDate->diff(new DateTime())->format('%r%a'))); } /** * check is have no activations left * * @return bool */ public function haveNoActivationsLeft() { return ($this->getStatus() === self::STATUS_SITE_INACTIVE && $this->data['activations_left'] === 0); } /** * Return true if have active subscription * * @return bool */ public function haveActiveSubscription() { $this->getLicenseData(); return $this->data['activeSubscription']; } /** * Reset last request failure delay time. * Important: Do not use this function indiscriminately if you are not sure what you are doing. * Using this function incorrectly overrides the logic that prevents too many requests to the server. * * @return void */ public static function resetLastRequestFailure() { // Reset request failure ExpireOptions::delete(self::LICENSE_FAILURE_OPT_KEY); } /** * Get a license rquest * * @param mixed[] $params request params * * @return false|object */ public function request($params) { global $wp_version; DUP_PRO_Log::trace('LICENSE REMOTE REQUEST CMD: ' . $params['edd_action']); $postParams = array( 'timeout' => 60, 'sslverify' => false, 'user-agent' => "WordPress/" . $wp_version, 'body' => $params, ); $requestDetails = JsonSerialize::serialize([ 'url' => License::EDD_DUPPRO_STORE_URL, 'curlEnabled' => SnapUtil::isCurlEnabled(true), 'params' => $postParams, ], JSON_PRETTY_PRINT); $this->lastRequestError['code'] = 0; $this->lastRequestError['message'] = ''; $this->lastRequestError['details'] = ''; $this->lastRequestError['requestDetails'] = ''; try { if (ExpireOptions::get(self::LICENSE_FAILURE_OPT_KEY, false)) { $endTime = human_time_diff(time(), ExpireOptions::getExpireTime(self::LICENSE_FAILURE_OPT_KEY)); // Wait before try again $this->lastRequestError['code'] = 1; $this->lastRequestError['message'] = sprintf(__('License request failed recently. Wait %s and try again.', 'duplicator-pro'), $endTime); $this->lastRequestError['details'] = ''; $this->lastRequestError['requestDetails'] = ''; throw new Exception($this->lastRequestError['message'], self::FAILURE_SKIP_EXCEPTION_CODE); } else { $response = wp_remote_get(License::EDD_DUPPRO_STORE_URL, $postParams); } if (is_wp_error($response)) { /** @var WP_Error $response */ $this->lastRequestError['code'] = $response->get_error_code(); $this->lastRequestError['message'] = $response->get_error_message(); $this->lastRequestError['details'] = JsonSerialize::serialize($response->get_error_data(), JSON_PRETTY_PRINT); $this->lastRequestError['requestDetails'] = $requestDetails; throw new Exception($this->lastRequestError['message']); } elseif ($response['response']['code'] < 200 || $response['response']['code'] >= 300) { $this->lastRequestError['code'] = $response['response']['code']; $this->lastRequestError['message'] = $response['response']['message']; $this->lastRequestError['details'] = JsonSerialize::serialize($response, JSON_PRETTY_PRINT); $this->lastRequestError['requestDetails'] = $requestDetails; throw new Exception($this->lastRequestError['message']); } $data = json_decode(wp_remote_retrieve_body($response)); if (!is_object($data) || !property_exists($data, 'license')) { $this->lastRequestError['code'] = -1; $this->lastRequestError['message'] = __('Invalid license data.', 'duplicator-pro'); $this->lastRequestError['details'] = 'Response: ' . wp_remote_retrieve_body($response); $this->lastRequestError['requestDetails'] = $requestDetails; throw new Exception($this->lastRequestError['message']); } } catch (Exception $e) { if ($e->getCode() !== self::FAILURE_SKIP_EXCEPTION_CODE) { ExpireOptions::set(self::LICENSE_FAILURE_OPT_KEY, true, self::LICENSE_FAILURE_DELAY_TIME); } DUP_PRO_Log::trace('License request failed: ' . $e->getMessage()); return false; } catch (Error $e) { ExpireOptions::set(self::LICENSE_FAILURE_OPT_KEY, true, self::LICENSE_FAILURE_DELAY_TIME); DUP_PRO_Log::trace('License request failed: ' . $e->getMessage()); return false; } return $data; } /** * Get last error request * * @return array{code:int, message: string, details: string} */ public function getLastRequestError() { return $this->lastRequestError; } /** * Get license status from status by string * * @param string $eddStatus license status string * * @return int */ private static function getStatusFromEDDStatus($eddStatus) { switch ($eddStatus) { case 'valid': return self::STATUS_VALID; case 'invalid': return self::STATUS_INVALID; case 'expired': return self::STATUS_EXPIRED; case 'disabled': return self::STATUS_DISABLED; case 'site_inactive': return self::STATUS_SITE_INACTIVE; case 'inactive': return self::STATUS_INACTIVE; default: return self::STATUS_UNKNOWN; } } /** * Return license statu string by status * * @return string */ public function getLicenseStatusString() { switch ($this->getStatus()) { case self::STATUS_VALID: return __('Valid', 'duplicator-pro'); case self::STATUS_INVALID: return __('Invalid', 'duplicator-pro'); case self::STATUS_EXPIRED: return __('Expired', 'duplicator-pro'); case self::STATUS_DISABLED: return __('Disabled', 'duplicator-pro'); case self::STATUS_SITE_INACTIVE: return __('Site Inactive', 'duplicator-pro'); case self::STATUS_EXPIRED: return __('Expired', 'duplicator-pro'); default: return __('Unknown', 'duplicator-pro'); } } } addons/probase/src/LicensingController.php000064400000044461147600374260014750 0ustar00can(CapMng::CAP_LICENSE)) { return; } if (($action = SettingsPageController::getInstance()->getActionByKey(self::ACTION_ACTIVATE_LICENSE)) == false) { return; } delete_option(self::LICENSE_KEY_OPTION_AUTO_ACTIVE); $redirect = $action->getUrl(['_license_key' => $lKey]); if (wp_redirect($redirect)) { exit; } else { throw new Exception(__('Error redirecting to license activation page', 'duplicator-pro')); } } /** * Return force upgrade check URL * * @return string */ public static function getForceUpgradeCheckURL() { return SnapWP::adminUrl('update-core.php', ['force-check' => 1]); } /** * Force upgrade check action * * @return void */ public static function forceUpgradeCheckAction() { global $pagenow; if ($pagenow !== 'update-core.php') { return; } if (!SnapUtil::sanitizeBoolInput(SnapUtil::INPUT_REQUEST, 'force-check')) { return; } License::forceUpgradeCheck(); } /** * Add license sub menu page * * @param SubMenuItem[] $subMenus sub menus * * @return SubMenuItem[] */ public static function licenseSubMenu($subMenus) { $subMenus[] = new SubMenuItem(self::L2_SLUG_LICENSING, __('Licensing', 'duplicator-pro'), '', CapMng::CAP_LICENSE, 100); return $subMenus; } /** * Define actions related to the license * * @param PageAction[] $actions Page actions array from filter * * @return PageAction[] Updated page actions array */ public static function pageActions($actions) { $actions[] = new PageAction( self::ACTION_ACTIVATE_LICENSE, array( __CLASS__, 'activateLicense', ), array( ControllersManager::SETTINGS_SUBMENU_SLUG, self::L2_SLUG_LICENSING, ) ); $actions[] = new PageAction( self::ACTION_DEACTIVATE_LICENSE, array( __CLASS__, 'deactivateLicense', ), array( ControllersManager::SETTINGS_SUBMENU_SLUG, self::L2_SLUG_LICENSING, ) ); $actions[] = new PageAction( self::ACTION_CLEAR_KEY, array( __CLASS__, 'clearLicenseKeyAction', ), array( ControllersManager::SETTINGS_SUBMENU_SLUG, self::L2_SLUG_LICENSING, ) ); $actions[] = new PageAction( self::ACTION_CHANGE_VISIBILITY, array( __CLASS__, 'changeLicenseVisibility', ), array( ControllersManager::SETTINGS_SUBMENU_SLUG, self::L2_SLUG_LICENSING, ) ); return $actions; } /** * Action that changes the license visibility * * @return array */ public static function changeLicenseVisibility() { $result = array( 'license_success' => false, 'license_message' => '', ); $global = \DUP_PRO_Global_Entity::getInstance(); $sglobal = \DUP_PRO_Secure_Global_Entity::getInstance(); $oldVisibility = $global->license_key_visible; $newVisibility = filter_input(INPUT_POST, 'license_key_visible', FILTER_VALIDATE_INT); $newPassword = SnapUtil::sanitizeInput(INPUT_POST, '_key_password', ''); if ($oldVisibility === $newVisibility) { return $result; } switch ($newVisibility) { case License::VISIBILITY_ALL: if ($sglobal->lkp !== $newPassword) { $result['license_message'] = __("Wrong password entered. Please enter the correct password.", 'duplicator-pro'); return $result; } $newPassword = ''; // reset password break; case License::VISIBILITY_NONE: case License::VISIBILITY_INFO: if ($oldVisibility == License::VISIBILITY_ALL) { $password_confirmation = SnapUtil::sanitizeInput(INPUT_POST, '_key_password_confirmation', ''); if (strlen($newPassword) === 0) { $result['license_message'] = __('Password cannot be empty.', 'duplicator-pro'); return $result; } if ($newPassword !== $password_confirmation) { $result['license_message'] = __("Passwords don't match.", 'duplicator-pro'); return $result; } } else { if ($sglobal->lkp !== $newPassword) { $result['license_message'] = __("Wrong password entered. Please enter the correct password.", 'duplicator-pro'); return $result; } } break; default: throw new Exception(__('Invalid license visibility value.', 'duplicator-pro')); } $global->license_key_visible = $newVisibility; $sglobal->lkp = $newPassword; if ($global->save() && $sglobal->save()) { return array( 'license_success' => true, 'license_message' => __("License visibility changed", 'duplicator-pro'), ); } else { return array( 'license_success' => false, 'license_message' => __("Couldn't change licnse vilisiblity.", 'duplicator-pro'), ); } } /** * Action that clears the license key * * @return array */ public static function clearLicenseKeyAction() { LicenseData::resetLastRequestFailure(); $result = self::clearLicenseKey(); LicenseData::resetLastRequestFailure(); return $result; } /** * Action that clears the license key * * @return array */ protected static function clearLicenseKey() { $global = \DUP_PRO_Global_Entity::getInstance(); $sglobal = \DUP_PRO_Secure_Global_Entity::getInstance(); LicenseData::getInstance()->setKey(''); License::clearVersionCache(); $global->license_key_visible = License::VISIBILITY_ALL; $sglobal->lkp = ''; if ($global->save() && $sglobal->save()) { return array( 'license_success' => true, 'license_message' => __("License key cleared", 'duplicator-pro'), ); } else { return array( 'license_success' => false, 'license_message' => __("Couldn't save changes", 'duplicator-pro'), ); } } /** * Action that deactivates the license * * @return array */ public static function deactivateLicense() { $result = array( 'license_success' => true, 'license_message' => __("License Deactivated", 'duplicator-pro'), ); try { $lData = LicenseData::getInstance(); if ($lData->getStatus() !== LicenseData::STATUS_VALID) { $result = array( 'license_success' => true, 'license_message' => __('License already deactivated.', 'duplicator-pro'), ); return $result; } switch ($lData->deactivate()) { case LicenseData::ACTIVATION_RESPONSE_OK: break; case LicenseData::ACTIVATION_RESPONSE_INVALID: throw new Exception(__('Invalid license key.', 'duplicator-pro')); case LicenseData::ACTIVATION_REQUEST_ERROR: $result['license_request_error'] = $lData->getLastRequestError(); throw new Exception(self::getRequestErrorMessage()); default: throw new Exception(__('Error activating license.', 'duplicator-pro')); } } catch (Exception $e) { $result['license_success'] = false; $result['license_message'] = $e->getMessage(); } return $result; } /** * Return template file path * * @param string $path path to the template file * @param string $slugTpl slug of the template * * @return string */ public static function getTemplateFile($path, $slugTpl) { if (strpos($slugTpl, 'licensing/') === 0) { return ProBase::getAddonPath() . '/template/' . $slugTpl . '.php'; } return $path; } /** * Action that activates the license * * @return array */ public static function activateLicense() { $result = array( 'license_success' => true, 'license_message' => __("License Activated", 'duplicator-pro'), ); try { if (($licenseKey = SnapUtil::sanitizeDefaultInput(SnapUtil::INPUT_REQUEST, '_license_key')) === false) { throw new Exception(__('Please enter a valid key. Key should be 32 characters long.', 'duplicator-pro')); } if (!preg_match('/^[a-f0-9]{32}$/i', $licenseKey)) { throw new Exception(__('Please enter a valid key. Key should be 32 characters long.', 'duplicator-pro')); } $lData = LicenseData::getInstance(); // make sure reset old license key if exists self::clearLicenseKey(); $lData->setKey($licenseKey); switch ($lData->activate()) { case LicenseData::ACTIVATION_RESPONSE_OK: break; case LicenseData::ACTIVATION_RESPONSE_INVALID: throw new Exception(__('Invalid license key.', 'duplicator-pro')); case LicenseData::ACTIVATION_REQUEST_ERROR: $result['license_request_error'] = $lData->getLastRequestError(); DUP_PRO_Log::traceObject('License request error', $result['license_request_error']); throw new Exception(self::getRequestErrorMessage()); default: throw new Exception(__('Error activating license.', 'duplicator-pro')); } } catch (Exception $e) { $result['license_success'] = false; $result['license_message'] = $e->getMessage(); } return $result; } /** * Render page content * * @param string[] $currentLevelSlugs current menu slugs * @param string $innerPage current inner page, empty if not set * * @return void */ public static function renderLicenseContent($currentLevelSlugs, $innerPage) { switch ($currentLevelSlugs[1]) { case self::L2_SLUG_LICENSING: self::renderLicenseMessage(); TplMng::getInstance()->render('licensing/main'); break; } } /** * Render activation/deactivation license message * * @return void */ protected static function renderLicenseMessage() { $tplData = TplMng::getInstance()->getGlobalData(); if (empty($tplData['license_message'])) { return; } $success = (isset($tplData['license_success']) && $tplData['license_success'] === true); AdminNotices::displayGeneralAdminNotice( TplMng::getInstance()->render('licensing/notices/activation_message', [], false), ($success ? AdminNotices::GEN_SUCCESS_NOTICE : AdminNotices::GEN_ERROR_NOTICE), false, [], [], true ); } /** * License type viewer * * @return void */ public static function displayLicenseInfo() { $license_type = License::getType(); if ($license_type === License::TYPE_UNLICENSED) { echo sprintf('%s', esc_html__("Unlicensed", 'duplicator-pro')); } else { echo '' . esc_html(License::getLicenseToString()) . ' '; if (License::canBeUpgraded()) { LicenseNotices::getUpsellLinkHTML('[' . __('upgrade', 'duplicator-pro') . ']'); } $pt_class = License::can(License::CAPABILITY_POWER_TOOLS) ? 'far fa-check-circle' : 'far fa-circle'; $mup_class = License::can(License::CAPABILITY_MULTISITE_PLUS) ? 'far fa-check-circle' : 'far fa-circle'; $txt_lic_hdr = __('Site Licenses', 'duplicator-pro'); $txt_lic_msg = __( 'Indicates the number of sites the plugin can be active on at any one time. At any point you may deactivate/uninstall the plugin to free up the license and use the plugin elsewhere if needed.', 'duplicator-pro' ); $txt_pt_hdr = __('Powertools', 'duplicator-pro'); $txt_pt_msg = __( 'Enhanced features that greatly improve the productivity of serious users. Include hourly schedules, installer branding, salt & key replacement, priority support and more.', 'duplicator-pro' ); $txt_mup_hdr = __('Multisite Plus+', 'duplicator-pro'); $txt_mup_msg = __( 'Adds the ability to install a subsite as a standalone site, insert a standalone site into a multisite, or insert a subsite from the same/different multisite into a multisite.', 'duplicator-pro' ); $lic_limit = (License::isUnlimited() ? __('unlimited', 'duplicator-pro') : LicenseData::getInstance()->getLicenseLimit()); $site_count = (LicenseData::getInstance()->getSiteCount() < 0 ? '?' : LicenseData::getInstance()->getSiteCount()); ob_start(); ?>



' . __('License data request failed.', 'duplicator-pro') . ''; $result .= '
'; $result .= sprintf( _x( 'Please see %1$sthis FAQ entry%2$s for possible causes and resolutions.', '%1$s and %2$s represents the opening and closing HTML tags for an anchor or link', 'duplicator-pro' ), '', '' ); return $result; } } addons/probase/src/DrmHandler.php000064400000001502147600374260012776 0ustar00getStatus(); if ($status !== LicenseData::STATUS_VALID && $status !== LicenseData::STATUS_EXPIRED) { return -1; } if (($expiresDays = LicenseData::getInstance()->getExpirationDays()) === false) { return -1; } return (self::SCHEDULE_DRM_DELAY_DAYS + $expiresDays); } } addons/probase/template/licensing/notices/curl_message.php000064400000002340147600374260020073 0ustar00 $tplData */ ?>

CURL isn\'t enabled. This module is far more reliable for remote communication.', 'duplicator-pro' ), ViewHelper::GEN_KSES_TAGS ); ?>

Solution 3, Issue A in %1$sthis FAQ Entry%2$s.', '%1$s and %2$s represents the opening and closing HTML tags for an anchor or link', 'duplicator-pro' ), ViewHelper::GEN_KSES_TAGS ), '', '' ); ?>

addons/probase/template/licensing/notices/no_activation_left.php000064400000004325147600374260021276 0ustar00 $tplData */ $licensing_tab_url = ControllersManager::getMenuLink(ControllersManager::SETTINGS_SUBMENU_SLUG, LicensingController::L2_SLUG_LICENSING); $dashboard_url = DUPLICATOR_PRO_BLOG_URL . 'my-account'; $img_url = plugins_url('duplicator-pro/assets/img/warning.png'); ?>

After making necessary changes %3$srefresh the license status%4$s.', '1 and 2 are opening and 3 and 4 are closing anchor tags ( and )', 'duplicator-pro' ), [ 'br' => [], ] ), '', '', '', '' ); ?>
addons/probase/template/licensing/notices/activation_message.php000064400000005114147600374260021271 0ustar00 $tplData */ if (empty($tplData['license_message'])) { return; } $details = ""; if (isset($tplData['license_request_error'])) { $details = 'Message: ' . $tplData['license_request_error']['message'] . "\n" . 'Error code: ' . $tplData['license_request_error']['code']; if (strlen($tplData['license_request_error']['requestDetails'])) { $details .= "\n\n" . 'Request Details' . "\n" . $tplData['license_request_error']['requestDetails']; } if (strlen($tplData['license_request_error']['details'])) { $details .= "\n" . 'Response Details' . "\n" . $tplData['license_request_error']['details']; } } ?>

  [ 'href' => [], 'target' => [], ], 'span' => [], 'br' => [], 'b' => [], ] ); ?>

Details: render('licensing/notices/curl_message'); } ?>

here and attach the errors details.", 'duplicator-pro'), array( 'a' => array( 'href' => array(), ), ) ), esc_url(DUPLICATOR_PRO_BLOG_URL . 'my-account/support/') ); ?>

addons/probase/template/licensing/notices/inactive_message.php000064400000004400147600374260020727 0ustar00 $tplData */ $img_url = plugins_url('duplicator-pro/assets/img/warning.png'); $problem_text = $tplData['problem']; $licensing_tab_url = ControllersManager::getMenuLink(ControllersManager::SETTINGS_SUBMENU_SLUG, LicensingController::L2_SLUG_LICENSING); ?>

Please %1$sActivate Your License%2$s. If you do not have a license key go to %3$sduplicator.com%4$s to get it.', '1 and 2 are opening and 3 and 4 are closing anchor tags ( and )', 'duplicator-pro' ), ViewHelper::GEN_KSES_TAGS ), '', '', '', '' ); ?>
addons/probase/template/licensing/notices/drm_schedules_msg.php000064400000003015147600374260021111 0ustar00 $tplData */ $daysLeft = $tplData['schedule_disalbe_days_left']; $activeSchedule = $tplData['active_schedule_present']; if ($daysLeft === false) { return; } if ($activeSchedule) { ?> in %d day.', 'Scheduled Backups are going to be disabled in %d days.', $daysLeft, 'duplicator-pro' ), $daysLeft ); $message .= __(' Please renew your license to assure your backups are not interrupted.', 'duplicator-pro'); echo wp_kses( $message, array( 'b' => array(), 'em' => array(), ) ); } else { esc_html_e( 'All automatic backups have been disabeld. Please renew your license to re-enable them.', 'duplicator-pro' ); } ?> $tplData */ $renewal_url = $tplData['renewal_url']; ?>

  • render('licensing/notices/drm_schedules_msg'); ?>
addons/probase/template/licensing/main.php000064400000005613147600374260014710 0ustar00 $tplData */ $tplMng->render('licensing/activation'); $tplMng->render('licensing/visibility'); ?> addons/probase/template/licensing/visibility.php000064400000010653147600374260016153 0ustar00 $tplData */ $global = DUP_PRO_Global_Entity::getInstance(); ?>

'; esc_html_e("Note: the password can be anything, it does not have to be the same as the WordPress user password.", 'duplicator-pro'); ?>
getActionNonceFileds(); ?> license_key_visible == License::VISIBILITY_ALL) { ?>
addons/probase/template/licensing/activation.php000064400000022107147600374260016122 0ustar00 $tplData */ $global = DUP_PRO_Global_Entity::getInstance(); $license_status = LicenseData::getInstance()->getStatus(); $license_type = License::getType(); $license_text_disabled = false; $activate_button_text = __('Activate', 'duplicator-pro'); $license_status_text_alt = false; switch ($license_status) { case LicenseData::STATUS_VALID: $license_status_style = 'color:#509B18'; $activate_button_text = __('Deactivate', 'duplicator-pro'); $license_text_disabled = true; $license_key = License::getLicenseKey(); $license_status_text = '' . __('Status: ', 'duplicator-pro') . '' . __('Active', 'duplicator-pro'); $license_status_text .= '
'; $license_status_text .= '' . __('Expiration: ', 'duplicator-pro') . ''; $license_status_text .= LicenseData::getInstance()->getExpirationDate(get_option('date_format')); $expDays = LicenseData::getInstance()->getExpirationDays(); if ($expDays === false) { $expDays = __('no data', 'duplicator-pro'); } elseif ($expDays <= 0) { $expDays = __('expired', 'duplicator-pro'); } elseif ($expDays == PHP_INT_MAX) { $expDays = __('no expiration', 'duplicator-pro'); } else { $expDays = sprintf(__('%d days left', 'duplicator-pro'), $expDays); } $license_status_text .= ' (' . $expDays . ')'; break; case LicenseData::STATUS_INACTIVE: $license_status_style = 'color:#dd3d36;'; $license_status_text = __('Status: Inactive', 'duplicator-pro'); break; case LicenseData::STATUS_SITE_INACTIVE: $license_status_style = 'color:#dd3d36;'; $global = DUP_PRO_Global_Entity::getInstance(); if (LicenseData::getInstance()->haveNoActivationsLeft()) { $license_status_text = __('Status: Inactive (out of site licenses).', 'duplicator-pro') . '
' . License::getNoActivationLeftMessage(); } else { $license_status_text = __('Status: Inactive', 'duplicator-pro'); } break; case LicenseData::STATUS_EXPIRED: $renewal_url = DUPLICATOR_PRO_BLOG_URL . 'checkout?edd_license_key=' . License::getLicenseKey(); $license_status_style = 'color:#dd3d36;'; $license_status_text = sprintf( _x( 'Your Duplicator Pro license key has expired so you aren\'t getting important updates! %1$sRenew your license now%2$s', '1: tag, 2: tag', 'duplicator-pro' ), '', '' ); break; default: // https://duplicator.com/knowledge-base/how-to-resolve-license-activation-issues/ $license_status_style = 'color:#dd3d36;'; $license_status_text = '' . __('Status: ', 'duplicator-pro') . '' . LicenseData::getInstance()->getLicenseStatusString() . '
'; $license_status_text_alt = true; break; } ?>


license_key_visible !== License::VISIBILITY_NONE) : ?> license_key_visible === License::VISIBILITY_ALL) : ?>

[ 'href' => [], 'target' => [], ], 'b' => [], 'br' => [], ] ); ?>

and )', 'duplicator-pro' ), '', '' ); ?>
and )', 'duplicator-pro' ), '', '' ); ?>

license_key_visible === License::VISIBILITY_ALL) : ?>
addons/probase/vendor/edd/index.php000064400000000020147600374260013321 0ustar00 wp_remote_get */ use Duplicator\Libs\Snap\SnapLog; use stdClass; // Exit if accessed directly if ( ! defined( 'ABSPATH' ) ) { exit; } /** * Allows plugins to use their own update API. * * @author Easy Digital Downloads * @version 1.9.1 */ class EDD_SL_Plugin_Updater { private $api_url = ''; private $api_data = array(); private $plugin_file = ''; private $name = ''; private $slug = ''; private $version = ''; private $wp_override = false; private $beta = false; private $failed_request_cache_key; /** * Class constructor. * * @uses plugin_basename() * @uses hook() * * @param string $_api_url The URL pointing to the custom API endpoint. * @param string $_plugin_file Path to the plugin file. * @param array $_api_data Optional data to send with API calls. */ public function __construct( $_api_url, $_plugin_file, $_api_data = null ) { global $edd_plugin_data; $this->api_url = trailingslashit( $_api_url ); $this->api_data = $_api_data; $this->plugin_file = $_plugin_file; $this->name = plugin_basename( $_plugin_file ); $this->slug = basename( $_plugin_file, '.php' ); $this->version = $_api_data['version']; $this->wp_override = isset( $_api_data['wp_override'] ) ? (bool) $_api_data['wp_override'] : false; $this->beta = ! empty( $this->api_data['beta'] ) ? true : false; $this->failed_request_cache_key = 'edd_sl_failed_http_' . md5( $this->api_url ); $edd_plugin_data[ $this->slug ] = $this->api_data; /** * Fires after the $edd_plugin_data is setup. * * @since x.x.x * * @param array $edd_plugin_data Array of EDD SL plugin data. */ do_action( 'post_edd_sl_plugin_updater_setup', $edd_plugin_data ); // Set up hooks. $this->init(); } /** * Set up WordPress filters to hook into WP's update process. * * @uses add_filter() * * @return void */ public function init() { add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'check_update' ) ); add_filter( 'plugins_api', array( $this, 'plugins_api_filter' ), 10, 3 ); add_action( 'after_plugin_row', array( $this, 'show_update_notification' ), 10, 2 ); add_action( 'admin_init', array( $this, 'show_changelog' ) ); } /** * Check for Updates at the defined API endpoint and modify the update array. * * This function dives into the update API just when WordPress creates its update array, * then adds a custom API call and injects the custom plugin data retrieved from the API. * It is reassembled from parts of the native WordPress plugin update code. * See wp-includes/update.php line 121 for the original wp_update_plugins() function. * * @uses api_request() * * @param array $_transient_data Update array build by WordPress. * @return array Modified update array with custom plugin data. */ public function check_update( $_transient_data ) { global $pagenow; if ( ! is_object( $_transient_data ) ) { $_transient_data = new stdClass(); } if ( ! empty( $_transient_data->response ) && ! empty( $_transient_data->response[ $this->name ] ) && false === $this->wp_override ) { return $_transient_data; } $current = $this->get_repo_api_data(); if ( false !== $current && is_object( $current ) && isset( $current->new_version ) ) { if ( version_compare( $this->version, $current->new_version, '<' ) ) { $_transient_data->response[ $this->name ] = $current; } else { // Populating the no_update information is required to support auto-updates in WordPress 5.5. $_transient_data->no_update[ $this->name ] = $current; } } $_transient_data->last_checked = time(); $_transient_data->checked[ $this->name ] = $this->version; return $_transient_data; } /** * Get repo API data from store. * Save to cache. * * @return \stdClass */ public function get_repo_api_data() { $version_info = $this->get_cached_version_info(); if ( false === $version_info ) { $version_info = $this->api_request( 'plugin_latest_version', array( 'slug' => $this->slug, 'beta' => $this->beta, ) ); if ( ! $version_info ) { return false; } // This is required for your plugin to support auto-updates in WordPress 5.5. $version_info->plugin = $this->name; $version_info->id = $this->name; $this->set_version_info_cache( $version_info ); } return $version_info; } /** * Show the update notification on multisite subsites. * * @param string $file * @param array $plugin */ public function show_update_notification( $file, $plugin ) { // Return early if in the network admin, or if this is not a multisite install. if ( is_network_admin() || ! is_multisite() ) { return; } // Allow single site admins to see that an update is available. if ( ! current_user_can( 'activate_plugins' ) ) { return; } if ( $this->name !== $file ) { return; } // Do not print any message if update does not exist. $update_cache = get_site_transient( 'update_plugins' ); if ( ! isset( $update_cache->response[ $this->name ] ) ) { if ( ! is_object( $update_cache ) ) { $update_cache = new stdClass(); } $update_cache->response[ $this->name ] = $this->get_repo_api_data(); } // Return early if this plugin isn't in the transient->response or if the site is running the current or newer version of the plugin. if ( empty( $update_cache->response[ $this->name ] ) || version_compare( $this->version, $update_cache->response[ $this->name ]->new_version, '>=' ) ) { return; } printf( '', $this->slug, $file, in_array( $this->name, $this->get_active_plugins(), true ) ? 'active' : 'inactive' ); echo ''; echo '

'; $changelog_link = ''; if ( ! empty( $update_cache->response[ $this->name ]->sections->changelog ) ) { $changelog_link = add_query_arg( array( 'edd_sl_action' => 'view_plugin_changelog', 'plugin' => urlencode( $this->name ), 'slug' => urlencode( $this->slug ), 'TB_iframe' => 'true', 'width' => 77, 'height' => 911, ), self_admin_url( 'index.php' ) ); } $update_link = add_query_arg( array( 'action' => 'upgrade-plugin', 'plugin' => urlencode( $this->name ), ), self_admin_url( 'update.php' ) ); printf( /* translators: the plugin name. */ esc_html__( 'There is a new version of %1$s available.', 'easy-digital-downloads', 'duplicator-pro' ), esc_html( $plugin['Name'] ) ); if ( ! current_user_can( 'update_plugins' ) ) { echo ' '; esc_html_e( 'Contact your network administrator to install the update.', 'easy-digital-downloads', 'duplicator-pro' ); } elseif ( empty( $update_cache->response[ $this->name ]->package ) && ! empty( $changelog_link ) ) { echo ' '; printf( /* translators: 1. opening anchor tag, do not translate 2. the new plugin version 3. closing anchor tag, do not translate. */ __( '%1$sView version %2$s details%3$s.', 'easy-digital-downloads', 'duplicator-pro' ), '', esc_html( $update_cache->response[ $this->name ]->new_version ), '' ); } elseif ( ! empty( $changelog_link ) ) { echo ' '; printf( __( '%1$sView version %2$s details%3$s or %4$supdate now%5$s.', 'easy-digital-downloads', 'duplicator-pro' ), '', esc_html( $update_cache->response[ $this->name ]->new_version ), '', '', '' ); } else { printf( ' %1$s%2$s%3$s', '', esc_html__( 'Update now.', 'easy-digital-downloads', 'duplicator-pro' ), '' ); } do_action( "in_plugin_update_message-{$file}", $plugin, $plugin ); echo '

'; } /** * Gets the plugins active in a multisite network. * * @return array */ private function get_active_plugins() { $active_plugins = (array) get_option( 'active_plugins' ); $active_network_plugins = (array) get_site_option( 'active_sitewide_plugins' ); return array_merge( $active_plugins, array_keys( $active_network_plugins ) ); } /** * Updates information on the "View version x.x details" page with custom data. * * @uses api_request() * * @param mixed $_data * @param string $_action * @param object $_args * @return object $_data */ public function plugins_api_filter( $_data, $_action = '', $_args = null ) { if ( 'plugin_information' !== $_action ) { return $_data; } if ( ! isset( $_args->slug ) || ( $_args->slug !== $this->slug ) ) { return $_data; } $to_send = array( 'slug' => $this->slug, 'is_ssl' => is_ssl(), 'fields' => array( 'banners' => array(), 'reviews' => false, 'icons' => array(), ), ); // Get the transient where we store the api request for this plugin for 24 hours $edd_api_request_transient = $this->get_cached_version_info(); //If we have no transient-saved value, run the API, set a fresh transient with the API value, and return that value too right now. if ( empty( $edd_api_request_transient ) ) { $api_response = $this->api_request( 'plugin_information', $to_send ); // Expires in 3 hours $this->set_version_info_cache( $api_response ); if ( false !== $api_response ) { $_data = $api_response; } } else { $_data = $edd_api_request_transient; } // Convert sections into an associative array, since we're getting an object, but Core expects an array. if ( isset( $_data->sections ) && ! is_array( $_data->sections ) ) { $_data->sections = $this->convert_object_to_array( $_data->sections ); } // Convert banners into an associative array, since we're getting an object, but Core expects an array. if ( isset( $_data->banners ) && ! is_array( $_data->banners ) ) { $_data->banners = $this->convert_object_to_array( $_data->banners ); } // Convert icons into an associative array, since we're getting an object, but Core expects an array. if ( isset( $_data->icons ) && ! is_array( $_data->icons ) ) { $_data->icons = $this->convert_object_to_array( $_data->icons ); } // Convert contributors into an associative array, since we're getting an object, but Core expects an array. if ( isset( $_data->contributors ) && ! is_array( $_data->contributors ) ) { $_data->contributors = $this->convert_object_to_array( $_data->contributors ); } if ( ! isset( $_data->plugin ) ) { $_data->plugin = $this->name; } return $_data; } /** * Convert some objects to arrays when injecting data into the update API * * Some data like sections, banners, and icons are expected to be an associative array, however due to the JSON * decoding, they are objects. This method allows us to pass in the object and return an associative array. * * @since 3.6.5 * * @param stdClass $data * * @return array */ private function convert_object_to_array( $data ) { if ( ! is_array( $data ) && ! is_object( $data ) ) { return array(); } $new_data = array(); foreach ( $data as $key => $value ) { $new_data[ $key ] = is_object( $value ) ? $this->convert_object_to_array( $value ) : $value; } return $new_data; } /** * Disable SSL verification in order to prevent download update failures * * @param array $args * @param string $url * @return object $array */ public function http_request_args( $args, $url ) { if ( strpos( $url, 'https://' ) !== false && strpos( $url, 'edd_action=package_download' ) ) { $args['sslverify'] = $this->verify_ssl(); } return $args; } /** * Calls the API and, if successfull, returns the object delivered by the API. * * @uses get_bloginfo() * @uses wp_remote_get() * @uses is_wp_error() * * @param string $_action The requested action. * @param array $_data Parameters for the API action. * @return false|object|void */ private function api_request( $_action, $_data ) { $data = array_merge( $this->api_data, $_data ); if ( $data['slug'] !== $this->slug ) { return; } // Don't allow a plugin to ping itself if ( trailingslashit( home_url() ) === $this->api_url ) { return false; } if ( $this->request_recently_failed() ) { return false; } return $this->get_version_from_remote(); } /** * Determines if a request has recently failed. * * @since 1.9.1 * * @return bool */ private function request_recently_failed() { $failed_request_details = get_option( $this->failed_request_cache_key ); // Request has never failed. if ( empty( $failed_request_details ) || ! is_numeric( $failed_request_details ) ) { return false; } /* * Request previously failed, but the timeout has expired. * This means we're allowed to try again. */ if ( time() > $failed_request_details ) { delete_option( $this->failed_request_cache_key ); return false; } return true; } /** * Logs a failed HTTP request for this API URL. * We set a timestamp for 1 hour from now. This prevents future API requests from being * made to this domain for 1 hour. Once the timestamp is in the past, API requests * will be allowed again. This way if the site is down for some reason we don't bombard * it with failed API requests. * * @see EDD_SL_Plugin_Updater::request_recently_failed * * @since 1.9.1 */ private function log_failed_request() { update_option( $this->failed_request_cache_key, strtotime( '+1 hour' ) ); } /** * If available, show the changelog for sites in a multisite install. */ public function show_changelog() { if ( empty( $_REQUEST['edd_sl_action'] ) || 'view_plugin_changelog' !== $_REQUEST['edd_sl_action'] ) { return; } if ( empty( $_REQUEST['plugin'] ) ) { return; } if ( empty( $_REQUEST['slug'] ) || $this->slug !== $_REQUEST['slug'] ) { return; } if ( ! current_user_can( 'update_plugins' ) ) { wp_die( esc_html__( 'You do not have permission to install plugin updates', 'easy-digital-downloads', 'duplicator-pro' ), esc_html__( 'Error', 'easy-digital-downloads', 'duplicator-pro' ), array( 'response' => 403 ) ); } $version_info = $this->get_repo_api_data(); if ( isset( $version_info->sections ) ) { $sections = $this->convert_object_to_array( $version_info->sections ); if ( ! empty( $sections['changelog'] ) ) { echo '
' . wp_kses_post( $sections['changelog'] ) . '
'; } } exit; } /** * Gets the current version information from the remote site. * * @return array|false */ private function get_version_from_remote() { $api_params = array( 'edd_action' => 'get_version', 'license' => ! empty( $this->api_data['license'] ) ? $this->api_data['license'] : '', 'item_name' => isset( $this->api_data['item_name'] ) ? $this->api_data['item_name'] : false, 'item_id' => isset( $this->api_data['item_id'] ) ? $this->api_data['item_id'] : false, 'version' => isset( $this->api_data['version'] ) ? $this->api_data['version'] : false, 'slug' => $this->slug, 'author' => $this->api_data['author'], 'url' => home_url(), 'beta' => $this->beta, 'php_version' => phpversion(), 'wp_version' => get_bloginfo( 'version' ), ); /** * Filters the parameters sent in the API request. * * @param array $api_params The array of data sent in the request. * @param array $this->api_data The array of data set up in the class constructor. * @param string $this->plugin_file The full path and filename of the file. */ $api_params = apply_filters( 'edd_sl_plugin_updater_api_params', $api_params, $this->api_data, $this->plugin_file ); $request = wp_remote_get( $this->api_url, array( 'timeout' => 15, 'sslverify' => $this->verify_ssl(), 'body' => $api_params, ) ); if ( is_wp_error( $request ) || ( 200 !== wp_remote_retrieve_response_code( $request ) ) ) { $this->log_failed_request(); return false; } $request = json_decode( wp_remote_retrieve_body( $request ) ); if ( $request && isset( $request->sections ) ) { $request->sections = maybe_unserialize( $request->sections ); } else { $request = false; } if ( $request && isset( $request->banners ) ) { $request->banners = maybe_unserialize( $request->banners ); } if ( $request && isset( $request->icons ) ) { $request->icons = maybe_unserialize( $request->icons ); } if ( ! empty( $request->sections ) ) { foreach ( $request->sections as $key => $section ) { $request->$key = (array) $section; } } return $request; } /** * Get the version info from the cache, if it exists. * * @param string $cache_key * @return object */ public function get_cached_version_info( $cache_key = '' ) { if ( empty( $cache_key ) ) { $cache_key = $this->get_cache_key(); } $cache = get_option( $cache_key ); // Cache is expired if ( empty( $cache['timeout'] ) || time() > $cache['timeout'] ) { return false; } // We need to turn the icons into an array, thanks to WP Core forcing these into an object at some point. $cache['value'] = json_decode( $cache['value'] ); if ( ! empty( $cache['value']->icons ) ) { $cache['value']->icons = (array) $cache['value']->icons; } return $cache['value']; } /** * Adds the plugin version information to the database. * * @param false|string $value * @param string $cache_key */ public function set_version_info_cache( $value = '', $cache_key = '' ) { if ( empty( $cache_key ) ) { $cache_key = $this->get_cache_key(); } if (function_exists('wp_json_encode')) { $value = wp_json_encode( $value ); } else { $value = json_encode( $value ); } $data = array( 'timeout' => strtotime( '+3 hours', time() ), 'value' => $value ); update_option( $cache_key, $data, 'no' ); // Delete the duplicate option delete_option( 'edd_api_request_' . md5( serialize( $this->slug . $this->api_data['license'] . $this->beta ) ) ); } /** * Returns if the SSL of the store should be verified. * * @since 1.6.13 * @return bool */ private function verify_ssl() { return (bool) apply_filters( 'edd_sl_api_request_verify_ssl', true, $this ); } /** * Gets the unique key (option name) for a plugin. * * @since 1.9.0 * @return string */ private function get_cache_key() { $string = $this->slug . $this->api_data['license'] . $this->beta; return 'edd_sl_' . md5( serialize( $string ) ); } } addons/probase/ProBase.php000064400000011367147600374260011534 0ustar00 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3 * @link http://snapcreek.com */ class ProBase extends \Duplicator\Core\Addons\AbstractAddonCore { /** * @return void */ public function init() { add_action('init', array($this, 'hookInit')); add_action('duplicator_unistall', array($this, 'unistall')); add_filter('duplicator_main_menu_label', function () { return 'Duplicator Pro'; }); add_filter('duplicator_menu_pages', array($this, 'addScheduleMenuField')); add_action(MigrationMng::HOOK_FIRST_LOGIN_AFTER_INSTALL, function (MigrateData $migrationData) { License::clearVersionCache(); }); add_action('duplicator_pro_on_upgrade_version', [$this, 'onUpgradePlugin'], 10, 2); add_action('duplicator_before_update_crypt_setting', [__CLASS__, 'beforeCryptUpdateSettings']); add_action('duplicator_after_update_crypt_setting', [__CLASS__, 'afterCryptUpdateSettings']); LicenseNotices::init(); LicensingController::init(); } /** * Unistall * * @return void */ public function unistall() { if (strlen(LicenseData::getInstance()->getKey()) > 0) { switch (LicenseData::getInstance()->deactivate()) { case LicenseData::ACTIVATION_RESPONSE_OK: break; case LicenseData::ACTIVATION_REQUEST_ERROR: SnapLog::phpErr("Error deactivate license: ACTIVATION_RESPONSE_POST_ERROR"); break; case LicenseData::ACTIVATION_RESPONSE_INVALID: default: SnapLog::phpErr("Error deactivate license: ACTIVATION_RESPONSE_INVALID"); break; } } } /** * Add schedule menu page * * @param array $basicMenuPages menu pages * * @return array */ public function addScheduleMenuField($basicMenuPages) { $page = SchedulePageController::getInstance(); $basicMenuPages[$page->getSlug()] = $page; return $basicMenuPages; } /** * Function calle on duplicator_addons_loaded hook * * @return void */ public function hookInit() { License::check(); } /** * Function called on plugin upgrade * * @param false|string $currentVersion current version * @param string $newVersion new version * * @return void */ public function onUpgradePlugin($currentVersion, $newVersion) { if ($currentVersion !== false && version_compare($currentVersion, '4.5.16-beta1', '<')) { $legacyKey = get_option(LicenseData::LICENSE_OLD_KEY_OPTION_NAME, ''); if (!empty($legacyKey)) { LicenseData::getInstance()->setKey($legacyKey); } delete_option(LicenseData::LICENSE_OLD_KEY_OPTION_NAME); } License::clearVersionCache(); } /** * Before crypt update settings * * @return void */ public static function beforeCryptUpdateSettings() { // make sure the license date si reade before the settings are updated LicenseData::getInstance(); } /** * After crypt update settings * * @return void */ public static function afterCryptUpdateSettings() { LicenseData::getInstance()->save(); } /** * * @return string */ public static function getAddonPath() { return __DIR__; } /** * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/test/Test.php000064400000002256147600374260010441 0ustar00'; var_dump($this->addonData); echo ''; die; } /** * Return addon file path * * @return string */ public static function getAddonFile() { return __FILE__; } } addons/index.php000064400000000021147600374260007636 0ustar00 Order Deny,Allow Deny from all Order Allow,Deny Allow from all assets/css/font-awesome/css/index.php000064400000000020147600374260013653 0ustar00li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} .fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-arrow-turn-right:before,.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} .fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"}:host,:root{--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}assets/css/font-awesome/webfonts/fa-solid-900.woff2000064400000445004147600374260016062 0ustar00wOF2J ¸0I·8$ `«<‘Ê”þDË«@‡p ¥Ü’’Dp¶zçaDŠfO=i½xTUUUÕ”„€ÇlÛ ª‚ýäg¿øÕo~÷‡?ýåoÿø—ûÿúŸÿûOÁ¸û´lÇåöx}~Ã÷ßÚç­šù¸Ô!î°°@/*¬ˆUì —ó>²ñ­ä ¤ñû{;mBòÓwî@^Q^‰Z™»æf ¨ƒ‰ŠËÜ“tÿï³7íâ`üLr¿ÆËŸ©P’B÷Jx±Ò«¹Jø0)K‘T;SŸõ…’¿£ODgý몮>@If3Ù{ö7ÈÃ#Þ?ž—t n'M˜@Fô€ª¨ýDêSGz}¹0$ X΀DÌp5³vw¨¿§ª“y ‘ÂÁþóO8Íþ½ŒF,iÇqìX±”Ý$+¶¥&Ù4^*îµ×PŽx¯÷¡=ôѶŸ·Gèb Î1¥Íóódåü¿çVÕ½u+Ü ©;WwMwõLÏLwOMuMØ٩ͳ»Ziw•[y€! I5Y€! l ý°6^"ªqÄ`ð:c^ð8<Ç¿6ß^ ÷çyKç¿sK}ï¾Òfú›y;ófû”™]­V;r‘d[¶×M–la/¦X6M€qÃN]´¾Ô”fH%X …t'ù?õ%¿‘îßHÃ?<¯:Ï}(±Ë#ö÷ØÊÜJpŠ †2\*@€Ø*0)*dꂵdj¶CM«B†!K¥pÁa*"Ó@†(É6 ÀøÀÜ|þŸêµ½¶çØ°¯öµ 1ìS£;â±ÃÜ'2öˆ2VjC{RFXʈ;8aGÖ¼ZGÜÑÂÃÃ_¿î©û'ëãÏ:¸<_6õ¬\dhû ·7ºµšžZâ2MAT4IÑ$ÓÂóß²oÇÏ~ãñŸ"ÞsV‡‹ÇÇh·ª^‹©î&4)äªþ³œêÂß!Ġл½!)š<ä¯nNa%R£‘‡–h„pÀóÿKMî³hÓ[–z_CX zoFàÏH`Æ2(U‘SºvûØ;m´UvjA¥³ÊTÒ´Þ”Ÿ.悦°^  §ëÿ¿_¥õé ÖÀâŸG–ùÿÜÝ29L=Ïò¨ísîî{÷ ðÌÌóA0wÁÌ=s÷¸÷¾çæï=3w˜¹@w ÊY’rE€löZeî‚GÖúX«×êAÌ,!§î9Dq`V6@²ê$×úù§žç`‘õ•l-Kë¯ekÕZé= ’Ô’Ðb‹âWûµ,Íæß)ŠÈ-ºýzmÿŽýÊ%ÂQ5d‹:U`Ke4™òbchØ9?fJ"ÂqЪÈV÷jøÀ­’¦˜ŒeíÞû´ŠVd2ÚÕšþÚI>Ʋb˜ Wôwo¾u !:,2­ÚÌìíõ/¡ ¸ÈR÷Ol¾µíïÊÝj± 0úÄfV×õnŸ „ز,m]?bÛ‹µíVN|cÁÿàykï?®ý¬rhN5`ŠWÉ?ØjCçðsøéœK~Ÿ0ZåÓÑjWÙÄûå–{wÝsF Kzœí¯ëÛxfÖ1«Â¿áÌ+—Iöƒªz :ªw@%ÃO5P°¬ÄßH¢X¢ûiÌ (k MVþ[Bœëºsxã•×¹¸ÑÊ%¬5.噎N}ÑÓL¦Ìljè ,6Ù¶»ïScŸa…ßóÕ(´†wNÛ“6žQ|*²IgÆE„R¾Ç¿¤ßOÿdÕöÔºÊxJqÌ‹Vܯiø¡ò•£Ø!úEšŸ®æIëšltX6…°&e=”ó‰WOš1H‰Ç+ŸÊ½_T­É…j…67+–èäû¹"]]†¿äV}äXW±!¯|6gÎÄç°ÝƒÚ1ûœå-{´Ì†ÄwV7ÃË‹eÖñË$#ˆ³Ñ;Þ3Þ5çSœ·/ú]ΗåXÏH:ÜÅ–o>×TÃ=ÒØ·¾œ88 ·bÛÀ^ÕÌÍ"G­ß²˜©ø{°Öò<ùuû<ß–úy…`•õYå}‰’"3Jº¡Ú·Ol³öÄŸ–Ü9gÙ±>Xׯt~m´{UrÀÃûýX¶N¿Aõá= Emø½·#ø„üüœŽä› 4‘êwôõE‡ ¶&x×ÎÇ€¾bÿ÷;îW¿y`ôé]eO>i°ÕVY/2bS‚/…åçà =&k×Çñ5zßyo(†‰N™yÈ&÷‡ßcÍYÒbSºgϤÖû䢺+uÅžÁ\âwãÿ¸êwÃj5|ZÏ'µJd ä¿Øù™Äùì`CˆžüvpØ«Û}Z‰Ï\#ÃØ7jÊhu5¹5;’¹ºÈw¿8韆“ƒË¡­ÔZ+^Aù–©VJú±‘ý(<+ûú‹Œa§d}måeßtf“Á Ÿº¤µ÷V[|ï’»Ek3âŸÙ’OýÌþC~’ÆýzÎ?§…ÖÈòõ åùýTûi˜}^űƶ&wÛÏ*´v¦õþ¿Òر‹ÑÍø9¯ãºìG±Ç¼¿&R¨-ÐòOò¢WÖï.ÉzkW ¯ùÔÅØಚ'Á7\ÛÕÛ,¿$?óÈÙJ™ãåùbÔŠöpÙ[;Å'{Úä‡ø*×wÇw¾ŠíŽóœ›Mo_g3–øʾ‹[Œ»#X@㟹uOrÍø._Æsu M:§“³ðPc½ùç¬I'ëÞˆ‚u¹Wƒ¹R:þíÚ‰ôótÈs.^ŠQ)ôîg)c+«SÖóŠ‡Rùá™G ΂ÞǦ>xñ˜fÁŠäEMàç¨å„ø2Ò=`ÄŠò6-°þÖÞX9{¿ˆ›·™Ïý:ëtäü(5[ïG¬ ¡øcHÐÅ’g}”û;\W¿<ÇåõõNŽðMd[|ò÷©ÖɺGOÿ.)|RpÉwÂ!Ža¾™‡ðòõÉ”£Ç8x‹ %5ÏëWc|ÖÇ=/˜›õ;™íûûÊ;cQ_øˆ|ñ£9ÏGíQ-HÎßÿõý±&ç¯V26~å çcÛ"|“8{Ÿ¬8ñ¥¾œõË(5ÿ–Æ ŒW&?åAïÝslMIèJå÷ÈØ|kX—ÏÎœjÄÆÔÒ`}š0ЭLïZÓÉž+áSGj¡µ± ¿sIîß„ÔúSû3¨ía×@;ØÝ:Ø3%w3vùâ;pà¹`ëcºëÞè˜ãþßk¦ßzF/{<©ã6À"BQTF{tCwô@OôBoôA_ôC À@ Â` ÁP ÃpŒÀHŒÂhŒÁXŒÃxlÆVìÄnìÃ1œÆ#ü0YM>“ßT6U̳Ãì4»ÌsÄœ0gmÌ.° í"»Ø.±Kír{Êž¶çcYb\‚KæòºB®°+⊺•î–{å^»wî½û侸Ÿî—ûãþ'ž6DÇ¢[ÑíèOô—`˜Œ™™ùi£cÄ",Æ,ÉJ¬Ìš¬Å:lÏìÈNìÌ.ìÅÞÎñœÀÉœÊiœÎœÉY\Ìe\ÉÕÜÀÜÄÍÜ­ÜÆíÜÁÜÅÝ<ij<Çó¼À‹Lâ+¾æþæ?ÄK2I.©%¤•t’Q2KÉ*Ù$»äüb¥´Ô“ÒPK i)­¤ô”¥²L–.W¸|ÑôEóÍW4±hSŸÂ§÷Y|m?ÚÏö+ü*¿ÓïñGüqÚßò}’ª¥µšÖÒæÚCûé  ³t¾®Öz@Ïèy½¬÷ô>ÒwúE¿ëÿ:ÄBñP=Ì kÂñp:\WÃÍð<¼yRàÉþ'‡ž|{Zí)ªº®솻Ñn[ⶺ½î€;ìî¸wî‹ûÁýä~ö‘}VŸß×÷-|?ÄO÷óý*¿Öoô»ü~‘Q ñIÉ©iéPPUQ õÐmÐíÐ ÝÑ=Ñã0Ó030³0ó°K± ˱ë°›°‡pñð_ð3~Åoøÿ1:c06ã02“0)Ó0-Ó133;s0's1‹²˱«³›°)[²»r'sçqs)—q9Wr-÷ñò0Oó&ïñ_ò_ó¿ðGþÆßù'ÿ⊨芭tÊ«b*©šª¥zj ¶ê£á¡Q­Éš­9š«yZ¨EZªUZ£uÚ¢:¦ã:©S:­3:«sº Kº¬{z¬'z#¯¯ú^?IúMê?‹jq,¥³VÈJXkkk¬³M´I6ÝØV;oíªÝ´ûöÐÞÚóö“ýmÿÚÿ!ZH2…,!k(Š…R¡L(*†Ê¡j¨j‡z¡AhøpŒ…ñ0 ¦Á\XK`%¬…õ° ¶ÃnØGà8œƒ‹pÃ+xîà Þ )07ÖÆ:ØbSl†°#ijx ¯ãC|‚/ð-zac8Æ`<&b ¦¡?âWüÿÈ…²Q!*J¥É¢ŠT•jQjNm¨#u¡îÔ‹úÓ@J#hM¢i4›æÒ|ZBËh%­¡õ´…vÒ1:Mé:ݤ»ôœ^Ó;r%Oò¥ £Š¢Š£dÊ ô‰¾“¢ßô— ÎǸ8—d“+qM®Íõ¹-wàÎÜûò`Æ£y<Ïä9¼€óZÞÈ[xïá#|ŒÏð¾Ä×ø6ßãgüŠß²+»³ûs0‡r8ÇóþÆ?9“‘™ÿè,:§Î£óê|:¿.¤‹èº”.¯kéúºî¥ûèz°§'ë¹z¥^«7éíú >®Ýt ŽÑqÚÖ?µÓé4 £¢QÙ¨e40ÚIUº“ýðµO™º5õø¾3Ò¦µ< [Òö§ê]q:hòa§ûâeŽU«¾á¸ïxìxêv¤:>µ¯àøiç´«Ûìö({¡½ÌÞi´ÏØì›mM†È*²‰"§(ÔºKÎTDÇÅÝÅ€É ‡  ´ü¶c`ëå±0‰Ò|#±3rr^.ÀÅ–­Áµ¹·þ*yâq<“gó|^Äkxoæm¼‡·ž/ñ¾Éwù)¿ä·üžÝÙ“ý8°-ŒaGGm÷[gÑÙg ê"ºønWŸY­7ê-=\ÿ®Æ™êLq&8cœQƯ?1jW¨Z¡¢…V²j¹Zï­‡Ö}ë†uͺlÖvk£µÎjdÕ¶jX%­œVÓi*ó‹™fƘ¦§ùÒ|dÞ7¯šWÌËæ>s§¹ÝÜ`.3Ç›CÍnåÿ”ÿ\>¤|  ]*t®Ð™B{ í,4>=OÏÒ–Ô'uIS…T*•HÅRö”%þãŸø¿ãWüŒñˆoñ9>Ňxïâm¼‰×ñ*^Æóxw↗^x±^xx๞ xæçŒéžÖßôO< ðDOðx¥XÝhÀ£<Ò#<üÓn¨y àîïîîÎîäŽ<ä×…nç¶9··rKÀ-7w³ÜüÑÝp}×\pÀµ]Ë5]ÝÕWuÀ•]É]ȹk]¿å¬Î8³39ƒþÓ¿€þÑ/}Óg½ôÐ =×Ýt ÐMÝÐ5]ÑE×)Ôa@íÓm´´Ð*@+@ ÍÓ\ÍÖ@ã4&öö h¨†ê«Þê¥ê¦Îê¨öj­jªjªª2€ ðþÇøx›—yœÛ¹›¹k¹†+¹œ‹9‡ŽåpöcgvØ”M؈ YŸõX—uX›5XUY™åY†¥YŠÅYŒEX˜ `~æc^æÂC`H`p`P ¿ÿð;?ó#?ð=ßñŸððžO0S„"LašS™Âd&1ñŒc,cÍ(Fò ÷s÷rwq·r3—q1r§pP÷Û}wïÜc÷ÈÝw÷ÜUwÁpÛÜ·ZÄMsÃÅCDDDDD#4B#4B#4B#ôÿOmU¬šu±0›c-,HÙ½c!bffå,Ÿ²–Å>øˆe³nš¢iš¤)6É&Ù,=§úy„Eè½cô‘.Óe¶CGé¦ctŠ3y¨SHÙ›b=ì³0ÅöØ0»ÃúØÛd¯Øªp6²›áÍ Û¾°#L óÂŒ0#Ì l‡=gOØ¡B¨ª„TÈ&vÓNÚq;ê… ¡J¨R¡tHÙ»Ãÿ*YÊY¦eZ¦í²C¶ÃØkgmlͲ÷Bƒ*XÁPÔ¾•Baûɼ‰a5LBN[d‹ì¨}fùãþ¨?ê3íûÆw°¶Ìï°¾ƒoçkù~‰¯çï°›¶ÎVÙ,Ûc»üg~úcÚ¼í}ø¬ —]›: ¾øãþ4øâ1n¸ |aŸ}gܦ·Ù¯nZk­»ðÙ}vÐ êMq‰»£wÝÀïÐ5º!ݵô%}g W4=ëºc# @k|}Ô(·@Ya%¹mÅè_ú›=ïá}úJ”›£ @Ûy}x²†?:æÄ¢o Ë@ŸÏ@çÎi!­@îIXè˜m\­Ž&³@éá.ÂÌ•aî—{HÁölÉo0RÚñtä0ÛñOL7 ÜpcÀ ‚£t&8@æÚÉ_×Añ|ä§)DaŠP”b§%)EiÊ IŠˆ ÒÄ”¥å©@E*Q™*Te+™n½Ûà6ºmn»Ûåö¸½î;êλ Ç=èr»GÜ£î1÷¸{Ò=åžvϹçÝ î÷ª{ͽîÞv¹ÏÜ7î[÷‹ûU,RHŠH ‰¤²T‘jR[êH]i(¥¥´’ÖÒNÚKé(]¥›ô^ÒW¦Êl™+ d±¬•²JVËY+ëd½l“í²OöË9-än¹O–§äyCÞ–å#ùX>‘Oå3ù\¾/å+ùZ¾‘åU5Í®94§æÒBZD‹jZËj9-¯´’ÖÓÚPim¦m´›v×ÚS{ioí«ƒtˆÕñ:Ugê\¯ t¡.ÒźR×ë=§oéú¡~¤ë'ú©~¦_ë÷¾€æ‡û¥~—ßã3ýIÊ_õ·û‡üÃþ1ÿ¤Æ¿àßôù¯üoþ_Ëi[e«aµ¬.9ªyÐÿ$i@€ @EÀ€j@} Ðä†ÿªÂÀU©Š£T1`´*ŒQ%€±ª$0N•Æ«ÒÀU˜¨À$•&«0EEÀT•LSi`ºŠª,0S•f©òÀlU˜£*sU%`žª ÌWU€ÛTN@V§ «sg€ VÀehNà6È}ÀÝÖÀëpÛß¡ŸA¢ÜÛ( é ‰Rn¨i‰ö8 9‰³U8Y ‰ó7 q²7á?‚Ä°Z¸²’)hHnƒ{’Ûá^ƒä¸W!¹îuHî‚vƒänhwHî…ö…ä]*¼î$Ô†T~¸·!Uú=D 鑇t„¨T *é Qy¸§ ª÷4Dá @´îDÏÃ= Ñ—pAôÜC} ÷8DßÁ=ÑÐfý Uˆþ€{¢?á…èo¸]ýÙ÷B÷@ú(¤¤oƒ{ÒÏCz@ú¸{ ý·Nãþ¡Í©!dÄH!ˆVbÿ/Äù .Ë€¸$ Ä ø¯ NÁbˆ#XNˆÓð™W€âJðW!æÙÑÜCÌ‚æ9b^4Wó!­I,‚4D,ŠTˆÅ‘zb}äýˆ $6D>ˆØybcäý‰M ¶Âà8bk¤ˆÝ‘n ö×nw:Ì ò÷Ä¡È=qò§ÄáÈ•8¹G"wÄQÈCÄH»g#ýOœ‡ÁÙÄh!.Å '.Cš•¸é3⠤ω+‘¾ ®BªÄÕH_× }J\‹ôqÒ×ÄõH«7hãnéâ!¤'ˆ‡‘÷ žÔõÒ=šW‰§ÑüF|‚4ñ%š§‰¯ß'~Ç03¡y‘ø·È_-7l‘Æs#Ü“ÚävѸa@ÚŸv¤™hGDóíHÈÃÐŽŒ<"íhÈKÓŽf3Ú1ÑlJ;§ÒŽ­qã€Ái´ãjÜ$ ¹’v 4OÐÎÃÐ.‰‚&Ö¸©AZVm18žnºa1+Ý(‚ÙéÆü…ÌA·Ýb˜“n=º½1ÝQtGc-ºsèÎÅ:tç Ö£»Ö§»6 »6¤»6¢{6¦{ÃÌC÷.lB÷IƒMé†èê|­(³Ñ` Ê|”çiEYØ–²:lGÙ¶§l;Pv‚)4؉r$å¨ùWQN¡Á®”ó)̹Šr-°åVØ“ò ìEyö¦< ûPÞ€})oÁ~”w`Ê·påg8òDù¦¡…C觠Ÿ‡ÒÏ$8œ~!8‚þ88’þB8Šþ8šþ8†þ)8–þùŽ£‰þeOÿ™àDú¯á$†&…“º¥…Sº¡Ûq*C¿ N§.gP—jáLê2ÔequGÁ9Ô=Æt.uoê>8º?õ\@=UpõL¸˜zÕ˜.¡^K½ —Ro¡ÞŠ«©w¨ÁµÔ»¨/Îs穾LýQ;êgxúõk¼Gýøˆú¾ì?9ßóiFòÃÈ 3âG†™榌Ç0ÃÚ”ÉÖeØ„²(Ãf {S–eØ—áÊÆ 1œLÙœáT†³){2œËpå†+®¤Åp õ”cne¸rÃÝ wSN`x€áʉ¢RN"Ѩs##RN%F"FÒïŒ#cQN'Æ!ƧœOL° -ELˆr11Q‹z 111)åb2¡­GLŽ¶!1ÊåÄ”¨Sµ(WÓKQ®$–Q‹¶±,±åqbE¡I¬Ô²F¬L¬EyšX‡Ø|.[Ä ¼El‰ò6±UCyŸØ†Øéx ˆ‘ˆ]P>'vÓˆÄnÄ^”/ˆ}ˆ£(ßǨE âxâ$J' õâÔs‰SQ~&NÓeãNgË/Ä™ÄY”_‰sˆs)¿çRþM\$Ôɉ‹Qn#.iYþG\A\Eù?q q튋¸Ž­ .N\OÜE¸‡¸:ñ ñu|ââ]êtÄGÄWÔˆoÔPç$¾#¾?*â0ÂEĠʈ†òñGâs¸ÍD?Q!~m âÔS‰_[Ö›ˆßˆÿQ—$‘#Ç9 -Úä¨äèÔ5È1ÔP×#Ç$Ç:FÝLŽCŽK]—´]É PþFNØ¢üœ„œ‚º>9¥P®!§jQ7!§!§£nJN¯ågrrfêä,‚ ÈYQ·!g[þØ󘳓sQ·%ç!¤îH.L.FÝ\’\j½™\†\‰º/¹ò2f=˜\…\‹z¹¹õhrCµÔÈÈM©'›“[µóyÌmÈ©g’‡PÏ##§^DžHžrN~ªÝî3PŸ ?×uh~¾ ¿¢>I~Cþú ùòoÔ—É_@}üU›æßÈß©¯“ÿb+1!ùoòÔ7éè…ú.}úÈÔ÷é£ÑG§~LŸ˜>õSú´ô9ç©ÏO_ˆúú"ôE©¾ }UêOôÕhQÿK_“¾õôuÔÐ}]ú–7".ú´hcÒ÷¥L‹~ˆÖÐ&¤J?ÌííVúñ¨è§£ML?CãÎmúYšæsèçÒ&¥ŸTú…0ý2´ÉéWüBåú•ô«hSЯ¡ß@›Š~3ýÚôôèÑf¤?,´™é¢ÍBLãmVú÷$h³ÑŸÒ¸ghQN§?KŽ6;ýyÙæ ¿L‹6'ýúû´é¨EÛ›þ9ý Ú¢ôAh‹Óÿˆ¶Ò}Xˆî§1caºßè:bºF׋Ñý)ÄtÿKR¨ƒ‰¥¨ÃQG$–£N(ÄJÔ‰+S§E¬B½aÐÔy¨ó^wv£º.uƒùAQ7ZkS7mëP7§nA¬K=L˜›zx‹y¨GS!Ö§ž*Ćԫb#êÃÔGŽÇŠúˆM©Oy(b3ês±9õ%ê+ÄÔ×$bkêG"¶¡~*b[êW"¶£þäÛSÿ¢þMì@ýW¢œIý_ÄNä;“£ŠØ…œ\Ä®ä”"v#§êS‘³“sžKsn:Ä^ä|äüçàÒ\û’‹ˆØ\LÄþä" —q ¹ŒˆƒÈDL®,ârU‡’kˆ8Œ\·CNnHntÜ›æ&xÄQäfäæÄÑäÖ0Ž%·%w"Ž#w%w'N!÷”GœNîCîGœA¤ ‘“‡\·8@FNœKICœOžÀÆÅäIäÉÄ%ä©ä™ÄeäÙä9ÄÕäÅq-y™n_t"®#ïðŒëÉ{Éû‰ȇȇÏ÷ÉGÉlj[É'qù´GÜI¾D¾LÜE¾¡ Œ{ȷɈ{ÉÉOˆ‡ÉÏÉ/ˆGɯ¥õÃÿ/ÚpÄã´±h3¯ÓfÄÃè´™h³ßÑf“‡1h³Óæ"~¢Í-£Ñæ¡-JüF[L§*…¶8í4âoÚ´‹(+Ð.¡]NY›v%íÊú´ëi·Q6¦ÝA»“²5ínÚ½”mi÷Ó¢ì@{„öeÚ3´({Ó^¢½L9€ö*íuÊA´wH”Ciï‹ríCr8ícÚ'”#hŸI”£h_Šr4íQŽ¡ý ʱ´Ÿ=Êq´hÿRŽ§$QN¤/¢œD?ª('Ó!Ê)ôã‰r*ý$¢œF?Ù–Ó駤ŸŠrýtôÓS΢Ÿ™~VÊ9ôóÈ£œå|äüÄyä"q¹¸ˆ É¥D\D.+âbr%—«xÄ¥äjäÄeäÚòˆ+É È ‰«ÈM5`\CnNnI\KnCnGÜ@î 7“;‰¸…Ü]Ä­äžÆmäÞä>Äíä~äþÄäA0î&!'î!"! ÏÔ€ñ0y6yñy1y ñy•DF>N¼D>-¯/‰x•|åìxñ:ù†ˆ7È·D¼I¾3`¼E~@~H¼M~J~F¼K~)ï“_ß“?’?“¿“IÄgä? ñ9ùÿ)<ñ55<ñ5"âjtjŒó"i…ˆï© Eü@Mê?RSSÓ?QÓiÀø…š‘š‰ø•šZ€øZX"ŠZLD§–ñ'µ‚GüE­B­FüM­©wÿQëRëÿSRyÀ©´¶á$¶AÔvÔö´ v¢v¦ ¦v¥v£ ¥ö§  KLrîg€:Œ:œ6"u$u4mdêx<ÚhÔiÔé´Ñ©3%Ú˜Ôùm,ê"êbÚØÔ¥ú´q©Ë©+iãQ×P×Ñ&¤n n¤MBÝAÝI›Œº‡º—6õ€<ÚTÔCÔô©©GåÙ¦¥§ž MG=C={.¡O=O½H›‰zÑf¥^íÐf£Þ¢Þ=·Ú§>§¾¤ÍM}hóQ?y´ù©_©ßh PH´…¨òh SQÓ¡”G[ŒÞèCh‹Ó‡•p}8á$úð€G[Š>}dÚÒôQåÑ–¥A“¶}l‰¶}¶"}*ú´´•è3I´Õè Š¶:}YÑÖ //Úšô•E[‹¾šhkÓ7múf¢­KßA´õèûl`[Ÿ¾ýòÅb(¥# X¥£ t,+ tºD±Jçzk¡ô”‡b”^’(6@é]Ql„Òû¢Ø¥¯…¯ ¥_E±Jÿ£Ø‚~?”ø¿P(§8˜„Š¢, •‰õF¡ ±>(T%Ö…jÄUF¡>qç£Ðœø®(´!VB¡-±ŒB{R(t E:“b ݉…ÄÝ‚BRLBa"Ñ?(L!v SÍíÖAŠñ(l Ö…]ÄBa/ñ£°±^(Nô1 G÷* gw% ç ç¿…KˆNBáRâö p-Ñå(\GüŸ(ÜLì|î þSî&:…Lj߅ÂãÄÍCá RtGáIbß¡ð4±ù(±ËQøØí(|Ft. _w _7…ïˆMBáGb…Ht ûˆ®Eш½Žb9b/£XžØÛ(V!öŠµ‰½…bSbÝQNôŠ“‰; Å)ÄŽâtâ?Aq6±J(®":ÅÕÄ?‡âÄ>@ñ0bŠÇŠ§¿ųHÑÅó‰ŽGñÃ]ˆá.ÂÂÜå× Å+‰{Åk‰FñzâG¡xñ×£x)¦ xÁ£x§Þ/?‰BÜ$"®:Š×ÅG‰ÿÅÇÌí‡è'Ÿ úŧˆ;ŧ‰[‡â3†{⧢øÑ>_&¾&Š¯WÅW‰ÿÅ·ˆ®GñâßFñ#bߣø1ñ“Qü„è_?%ÅD?#îj?'E{¿ Σø ñÇ¡øqÏ¢ø;ñ«PÌDg£¸èwÿ¥ØxUr;%@_£$ˆŸ’?¥rDW¢Tè*”*QªDÜ3(U&:¥êD TƒèR”jýR-â¢T›¸PªCtJu‰«…R=â.F©5ѧ(µ%® Jíˆ}ˆR'b§ Ô‹¸(õ6ãÆBì*”Æ»¥ ÄߌÒDb·¢4‰Ø](M&öJSˆ}„ÒL¢óPڨ嗤-hýHÒvˆý€Ònâ>Fi/±ŸP:è_”&Å"”Ž ®3JÇi}MÒ ?¥‰-Cé$â^AélRŒFéâË¡t•¶ó$] ñ‹PºŽèF”®'îy”nÐ6™¤Û!Å”î"Ρt¥w÷¢õ;I÷¡m8I÷CÜñ(=HÜ](=ªí9I£$éE”$½‚¥woC|”Þ!¾7Jï]ŒÒûD§£ô=Ñ7(ý@Qúk_ûZ;eÀú£,ˆÍ@ÙŽ²'6e#6å‚Ø ”Ë‚ryâB¹± (W&6åjÄÍF¹.±)(×#6 åúĦ¢ÜØ”…rcb#QnF¬*Ê-ˆ­E¹ ±ž(w$¶åNÄú¡Ü™Ø”»ÛrOb=PîClÊ#ˆ›‰ò(b Q>œø_P>†¸?P>èh”O&î”O#¶åÓ‰‚ò9ÄÝŒò¹ÄŽAù<ânBî!_K )àáë æ÷ßL°*À÷Èÿ¾ƒ`¾ðð=〇ï%à?¾`¼ ððýÓ<ü ÀÃÈ¿~Œ`Ýxø ‚)?O°†€‡_$›€‡H0ú€‡C ?<ü;‚Ù<ü‚ùYÀÃ"àw¿D <ü _xø‚ùÀÃïÌGþ`­þ‚`¾ð®í+“»¾„¹Ý—±0÷̸¯bÆ} ‚ñ"À»¾nÆ}3qßÂŒû6Ï}u'Gí›’#‰§!¿<š'àQ“`| ð(%˜{€G'æðè Áì%Xs€GçVðè<ÁØ<ºÁx&àÑk ðè&‚=˜`<úM‚ñ7€GWðJÀ£×Ìÿæ–iÙÜAûE£Nˆa¸õÂÐss‘‚ZaXÆ$N“Ëèž+¥Ä¡‚ûʲ©âh9—óv3 ]ÇX’Œ1&SƒRfs.¸iYÔ¶ Ûój¾eSå¡íP!çí…0t#•ŒÁ‰÷+Ç8®³}×°ƒGwa«ÝnáK3ød¯w…p›M¿³8bËa­.¿¬8†Ån/»èøÇ8Ýòµ²©S[aI¶là“ÕîZUî¡}¶*[XTÞSÉØ%OpJ ƒßòLÏ0l‡ ïR¹TŸÎC/t 7 JÁ còŽsÔ0¸'¸sþå‚{†aŸ»½ ß~ö{;½ÐèqàçîÈÛ5üãâ‡ð œÀž ibpu”èÌàÑr»†Ì ÏVqˆPS¢+r+>·—‚‚dAŸàFýÏlöxï^':‰mjÓ,ÏòaeÓ¦±NtR{gy–Y_?~}Ø/>9Ñh 6'ªQ*ãÏÝö±Ñ81Ž­T ÜºN` ÌòLaœÜà *d¯ûôß#uç§F{™îïÛ}F8sGŽàÜ#mÍþ'“ì«÷/·Ý'p ì(lÖµá`³ `÷†IºÔûu(«,Ïò?èÌ-ÖÊN­ÕÓW¯œ xâ·>º ý!fT~1AL’îϵªz—Å“HN¬\}zõ¾aú_˜ët’·¥Ã@8¨Šrûbý:Ú4íäÙv"ÙD·P'ý²ÚžBÚ¯30&3ª^¬·³1϶ïÛžo(b™&çœS"š÷mEbµžyö’±1ã“`«[1϶·³¿irΩešÜ¬'Ѥ{†±º•1ÙƲo‚ €°Ì‹Ö}û »ŠZçàe71­>o™&œÛcÊÜà d¢vFíròøÀ“ñÁ¹m™&ŸýÐWêb”ƒ\¬Ùùr9º²ö.¾nnujKv}z)ooù¹È­¹º°v˜^ýƯV.#KxyŽT«ò¥Ÿ¾šgg9ñÃ=®>ÔÎî¾;_=Ú4Š£¸WôŠÖ!˳¼J"ZØ­¨*û›‰NtüM†èz‚³;»Íïg‘“«£½9!tR¯'Z×ÚødOpÆÝ÷­n!"i–™³këÖ=¿3¯S´èùe™ö×ëå®ý%hjÌFª°Þ¡æ:ÎÃ9ç†aÿÉ_T¬¤|6æ†aSÁ9^dL‚‘oÖ‚Óð@Ìò"ËS{xµ©ÝÏh!=ç Ïò²*J—y6–U¿Wô ˼ao {EÚg5B˜dë°‡Ëݲ]v—Ó9)q¹[ŽÊî2J9—âØoÔjˆµZcä˜ðÛí×®cÑr·.×æ>½ÚùÚòpŒµZãã µŽ~óeß¡C€0J =©³ÞÌÇ,µã$/Ò²ê~’(®Á¤ë£Â{à™Õ“Ýïoh,ßɸð\Dg„P°×L¬õµ³åÓ¬N¾ÏEdŒ ïž}ð{Àçã󡀚68ZþŸÌ»Y^VÝ2Ñ >×2M>û9ÚÜ4-Ê9ŸMÄGœsŠOãœÓ½ˆrιiZ7 ݉ešø0ÂáBÈÂ-ì8Jti³*‡ƒ¿¦¤Tkço¾ù¼ë2!\,66ŠÑ¨ØØà?ûÌ™õ­­­­µ³g].\ÆtãæbÎ×,9Ÿç‚~dwën»·Ùo.".6û›{Ò˜˜ìïÇÁÅ£¯mw¯Õ8šM1í2¹ð`«ú)ÁÑCOKj‰œ/>_åɵ%Š°Ö<>\’‡ ÝñK~vG¶oʘÚ9ôd¼s¾ˆ¨BH’ãùñ&^>.õò|¯ÚY]åÏ]û‹]‰¤DvõÕÖÇÜu™Ë…»¶‡û¢†ËéUÒx>)“nm}cR1!\‘­ Ï›;ж‚6ËKÀ³TE¹—]\Ê+ŽáÊ£ L§êŠÇÕ”xVUižÚDñd&+ìð”R›\Å@71¹!EYáÚøxŒJiž¥±pÎ{Ø7“BÇC‹øÐŒs²*«`P•}lKÆäô´¨VŽIZC§³\ÖJ<¿E ç2]¡ ’ߤŠ¹.îëN­éMμÄáÂóˆáüîoá“\¼æN6>Ýflv÷­'íŸ|nêÄq¸ðþú÷ðIÜžG\¯×´ÄA™j¶“gÃ5×G’1-Z¯*Ø‘Ùä‹–ÇByÆS¾™–­AD²ÔN;x­KY%Z¾ýíRkgÝå%n¸/QS/o²jwß]³œÄX þ )ÿbö푇G‡]Ç8E€°L0Pœª²9ñê8VHàš(V³£ó ¾Ñög‚++ê1kÇV¸;û¶j§¾7^‡>Ö2mš²`ñy–&6å–ãíí×JV»]ǺÛ]=ûæØ\ wv†ƒÅ&~ÎìǺ›<™Ýüø:“Ý~¿µ¸Øê÷wßh­³dS÷œ‡ 7)ÌÓIë.!jQÐÃ틤:Ú·×h?œ‡¡$ô«êÁÔäã)ÖQÙœ §*:)«œZš}2›ÚÔ r‰M#ÝÚÀY_?¿–^ç z®ìÚÖøÅúðüÞï ~U‡½öÉ©i´ëÝì ÁD煉ÕâV~¾s§¥®ÚÍ»[nó•îU2¼Ïeèe†œ–ˆn:i’Hñx‡ô6ˆsÿ•ú’•»—.]ºÔI4¢N:9£<‡å—ºåßpk°œžÚ=±B&¨“N'Ñ1ùÊ=œÀ£ò•íÇ&½B÷‹§cùJw"K3éG‰á•uÑt4ï-R¤IÞ®¨Í:eyE3úèEÓ°LѼŠ`½1ŸÌIaËíêB8W,“ ( |'ž  1 #±Õ¾ç¿s»-·« ^¬¹ ¶azžp£Èµ¬­6>@4"沚DÊ\å7—Gsš¥Ñ➶emjG~9вFIÂÑ2{î*¨m†IZ-GÉÊ9p+„9$Ðâ!†‰#„æé#“Iº("k”ï¿Ò­k‡Y!—'–fŽ«Û’1ÉÖS`kÍKåPb—ÌrÓèßij†Êá*î}PæYndUYEœsû…/É›6aqìL,ÓøË´ÄìÏqKX¦eqÎgã1Ä1çܲ­!ÒÔΑ2i–{hÓÎxícáqëi79IâÜô4…ýëZ–y…é„Þï~ŽÖìŠiYßhZ–˜ý.kD=ûÌ„e™÷Äl““Ù·bãXxÜÌQÀ N”׿îf·,„&Ý°ÞælÖìöÛ™®‡èüÁ½®Ä½þ€OŽ =ßòÑaBxï}Ÿû½õ­îû»»ï{ï|Œ©ÄÅ,òÙ¸Zæsì°íÎ]ƒ8¯µß×:Äp9ÎåËø2× Ž#8ÿ÷W¦‘oï•ÿιpb¸ŸûŒ•«-S-TÈ,Ž"æðÙw~ÙãâÙ4bÇø—E¡«ƒÐŸ}F!£H $"(ÃAz½V›8gèMDl·zÍ›Q)\$[øþÅmˆ+·cFåÈÂIljñâŽýÌÛçýx&ýJ-ÄþüÛ/a»Õ{"éöwO¬²rb·ß%øö^«³}2Zâ}…¨ú|)’GÈ·ö™`ú#ÆF~âétûxJÚ2ôÐ6KYj²™>þXÞ÷¹žðª”Å"]Öw÷üóûÿyAtzF÷êm/ÚûlÁY¸7< ¿YA)º°¶]':ÙQ„¼¼¥úæå†e•tè°¬tgiræ•ÊòaY½Ý¤|.C é© s3ƒªì÷–¾[@[««­Eú—Î~ìK6B!£Ù¨­0P¨ö•BǹˆJ¡ .)D¥Õ¥ÃÎþa}Në¹õYéÝW…2:†H <9ß@lÌŸŒ»ÞmîFÕ‹µÂ1>C!ªg`ø"…¨^ÍÙËPMhÿdT³+˜¯¬äø…·»)ß 8þCò|ü"Œávx ¼S<‰§0SM<<£v Å«/A¯°c›F±]DqT4q ;ýͤȣ˜Ú‰ÞC¼mÙìoV‰æ2ηòê·u^•y¦0Ë«27òb³¯û•"P¼ž²i–‡ƒ<´ªìümìå°¬ò Å.náfÚÉ‹d0ôs–)ì¤EØÉân¥*²4KÑbŠ¿f6cáÛžk9¾²¬zl¹J8vä»ÒcÜ3ˆk;¾cJ D´Ì¸©”aû¾›†òm É\X"{¯QI¨ïXÊqˆí+ƒØvMP!\—y¨|ƒú>LCýaÏñ„ï›’Y›zQ·Ë>£‹8ŠPŸÚŠ±7E Å}‡ÿÊñ„ßOæWB2†_4”BÃ0„²ßs¹#W± æ0.=fZošÒwLDéþñÏ Ë´l_fìù¾m(å2ׂ†ó†­|Çðk–2lß!h¹Ôó¸`ñ¼yÓ)³!^œ‰î9b8{g—rR?«ëý›Ë¬)ã_nÝ°þµ×gâê.Dü%µ pü‡xìÃðZ6Ò ßóíTûFEq¯ˆ‹¸èôuRäö@»Ãã–ÕÐELßÇ"ÉÉ<ÕÙßþ{IYá;ÍH;¦RµÀvãˆZK *ÃÀu‘¬ùÜW†!™»vÈÑ"ˆÄ¦ 9ªÈt´Ú¦ÇŽÙmºA ¥' $"viäÉ”8:2M—GÊ )½ð¾f "Lææ< Çýú ߬3Rhš–ˆ¨sYsW†\×=î×|n™sÚ´Ãص†œšH"1¨c::2Ív :y¾¡'e¸º„¢EÃس’ĉL'V†az-š—M'ŽïÜiö1ËZm(ÎUãÈ»cRšð‚E ¸ .„/!5SŠ,m )¸MR›ê¤¿Ô/«,O·Ã¥á¶÷ºæyØ3›R8ŽÍ›8uÈòü1øè8BúN÷Œ;õlß>2jÝ—ó£‰ÏyŠR†¡”èPnY>oÂqâ2Øá—.ERà4Ñ=®Ó:Â),À=—Ât†ê ×Õpß¿ŽeUT~)L³¼¬vø^}Õè¨çžˆè½Ùds»ý¢SôŠƒ«4!ú*¢{šœ^/ ƒ¸®ïËß¼M!*ÿ¡ Y#ÿ>ëé:œ¥'o^[~þìND|W'èú2³+®ïKa÷¨TU¤´°Ìñâù‡;~Hÿ·$³/Âá…𺊼jrQÔW*¶"8”ÓL©_Àf ÃÁ0¸KEöKÙqÔ"º¿¹GÊá`Ã0‰!vÚÙ Ùp°GØ^øŠ=!–`œ½µ¡ÍZMBš£ðaçžÁ=îûâtÃ[¤„RBë”ÖßÞÊ?ö§'‰ãùf}ÍžãôfkF¨=ý†BO„߀O ËUœ8a6]Qú°Á°W U¹‡¥»+´Ia§É3…[ˆN¨®-¾wUæM¨Mw°è› ^Ák` G¾+h\GYVKñ¦øèN&„Üþì08›(¾ç‹óó§N yŠ1¿u™u5«Eâüê³ð[×æbA°Éj‘Øh i‰vÂj‘Ø£‚óÓ¹Ö¤Hòþ‡4!ú¡¢÷Mˆ~Ž‡è½^¢_ß~Á;vÊ3 ŠS¸Ý00û¡ |)°w}žvê†áT§N-vrßH°Úí̲Ý'ÇœÕ~ýžÅñ’]{’F„lFÜ­6˜³ VK<àÝúJ~Ê‚Æq“±¦W»¾ç½žnRÁ9ưߧ° ÷3j'8­í”m Í«2Ñ }8¥Uâ!EyõÒc÷¡Õ~õþúóPqŸ\ ÷o'âödþÞÜs¼øÃ'õâjÞËD󺹅¥Æƒæo¨…͹ôyø›³ß©y…ŒžòP†’ C‰?ËýPÍzÜÕ“ñìZ|šºÂõߊBFãH $*¾>>Ký¹GÏ]"D8Ž¤À%¢bž’ˆ êr¿_m9lÁõp<žÔÿµ†é­°÷¶ÒÍSV ôtmé\Ÿí®˜Èò4±¸Óˆ§ÛïÈd//£>û£ª®“rmK¬„?Dq&P]lOF©ä¶iüy"¯5¾ô:1E?_Ó63ŒÉ½|bó§0÷ø?(ü‡3T€oIÏPó®ûÂåÙôLx@• ) ¥&ÛŠ˜ÚT·pnnIc›¦Lg3A 7…_VËŠ¶þ± $bê¤M³\úÞ“s×W•4øIWð0zj Iød2ºHôÊD2†þ)D•¡/™!Þ«_Öˆžk½wåWnààêþæâ"âúú…ÈrrÑ–F-"4±ávM“××£Ý{«=9¨<ͽ·Þû®{çô­­gÛwŒSX…ëà~ð`x4@WÊßI-Ü,6 ¤šÚ9fUÙÂ{Pï–•uº/Ú’bq.àw§kÂZ ¬±f™®«Â_}Èç*ìoÝ[Ö¯g6ÂyÜ1jH«WyGàeò„>éQç¤Dßâgu ¯CT ©|Žÿ BŸ¯¬ ö5ÚÛ.îF£³Ó"Ÿ¥õ¨{G”³ð£á>¤pîP ª„=.ºŽˆš!­ùIjÓ¤_ô©u)^¾ò6µWqXV½¢ìWÓãt›ý¯=î윻¿²0,Ï?‚ïÃXJ®ú37z½BT/sK!ªç#õƒøNT"ì=†s–Zo–Á¤{3×¾c;M%Ñpjæ‘b¤_Ј¸˜h!Ü3¶ÅàÆOñ©ððüñÄÑeç$UårŒçµy-x†Æ©è,DÅÇ]•¹ü.ʳôc$Êñ›8$A2gLNŸ($qzœ±€±ºBTõÅyÜ ã˜ ÚæçÅ=9^ôŠæJ›z‹ÇGOõ©{<<]Šq©zÿ!Î^TŽ†½¯Öær¥Ârƒô®âǦ–?¨ÂH~¹ Kìâ _¨X¯g”µµµ,o- ˆaÔœc… £³CzöÛ¹¡òIÝy¯N¹oû ÄÇSò$œ‡u؆ÃmÌj`’ªbŽ­ÐŽ# cI:ùîp®È4P4"¶R•ÃÁÒ¸?L÷RÚ£«çÃ4Î ;s¶‡e¢Òñ2C'íµÕÄ4G¾ßC!£lÏ3Eœß‘±öl¾iÎ\k'Ú0 çÑæoaÏ?œ˜f>çZÎy®q 0Îk»âóuÏ Bnû¾Ý;=ªÏô*jÛþÊó)pWzFB ®W_ñm›¾jë·ètÏö};ï„¡Iˆš[V®HÄl)QƒSDú¡©ŠR„€…I3˜XCâv–øuHZßY /¢ íxuâv:Ì0®Öë‚P¯WOÃÔ̦›ð{Á^sدšuàÈQæ¬ÙÂà¡®$/èõ:n×ÜŠmÁ‡ Ç"ºŸ{·%€qiû§¯0@°~yƒ€ŽñK_Š±’vØ, æÕ)L0¦¿z “4òMÜ™™´»0Íò(¡é¢À¨ÔÊSÌ^Ó!Ç?ZÆãCTl¦w7 CØÏ ©EÛÆvìêWª¶ƒlÛÅßúûás,—Z`2 ¥&•9jSÏ·ÕL³tPu\ש”LžØqöï§`Ç'ñ…\LëëXçô»Z¾™`ÛÑ$Y–4Ç~{ðo•¹aðr©Zå„ðjµ„Dd\ý-¸Ò¯ÆèAô²h¹j¢!ž§ûÉÇ\0ŒWãvh«sfX:³t¡êÿEé„RòuKQÁ¶{Ë·”J·,÷lTÅúº®Ñ ¦»Ôô¤¯ Â.5 79qâÈÑ®¦u9q"q ƒî¾D¡®SÈ]÷ug€íá¦sè6„€­Ã¬|@沊Éæ¯ùgÙ[ÑPBñ>œ´a¸ @ˆôBñî9f¡ïcì÷)¤ëùŒ±Ê.PÌv^Á4 ŸÎr~1˜Æ¶_*¸ÇSÓBÁ4ðœZÀ•¢EyŽ0ÌBa:›†leÁÉPhîøûQÝ‚¥®ÃÓHŸ²üzû¦à¸1GÀUr€(ËI’‘Õí]¸\F¹r{ :?Z½Z¶ìŽŠ^ ¶ ¹ÊW%EO¹)'„á|¹É¬œeÆø¤[V …ú›§1_.C©w[8J_áõšW§p ¦¨Ž£ëЫYŠÚó”È#¢‡æ´QÓ€vœ„ ‚I$ðèé–Ê÷ç´cBã&xJfÝ”k¡9lÇÙ·ã[ÐŽäKš× on^¸°¹‰!,¨ ª×]ÇŒ÷íùà†ÿú+¨ª¨*¼Š @mK½åxÌð¢±ÛØ‹EЀjßÖäkk»67OUÉ59æGJS¨sþ¸áN…¦Õ‘  ¾øªh ,‘Ú¸‰vÍE•cÛÆØ6Ã`Q’°ÈWjÃ5P7/Ý@⧑§‘7f°…qƒÓ$vºÇ¥(àG<ˆý±®Ýh–ó.œ4•\ÃK³W•¸á›0ˆª˜PžFj¼≉/~™Ýo?{ÿ*nªŠ©²W¸®Vùêu>SMEN&tMG’¹ëÿ·í¢.mÁ„zq"Xœù˼½í¨Ñ4 ¦–¨xÎKIÔŒí¸;'7V²8úò’Ÿ'Df¶õyU.væ ÅyBLÃÛÍÙÏ™r°vš‹?"ZV£o9²LH¶Î ®ñ¡ïõí&·Þ Òý?CY R[­Öíº>·ø 7ÖK%éçß*À›™ÐƒÊã÷GEl.«Âõ'ˆàòñ0mgìAh -â¹Ôg!ÂW<܆¤]b«Ái±nÖäKۅ˜|/B°)€Î›³¿k—Öagö§¥ŒêLVì³ CÖø¯éZž¹ENÓsétïÜÙt¹½¸²šÄ¸¿4{Ë¿zÁ5iÖ*¦icvéÈ7Çxl»<Î líÔCè4º¥×ˆDìÑŽ£&õ=Bc ~ ‘;ÑîAÔ8Öfq¬B¨ZóQÝ÷¿î`¨Õ– †rÑÕyõ~eÞõ·ß®n_®Õ;^g§­µÛ€‹pÆ¢/äÿw©@|±„ñŸÂÎr­Šª.7Ýb4_.ž ý°ø€›õ¯B­¶ìàJw}íöZß”ÚbŒÍ #˜¢—£7 ·×\ g€ /r! †Ü;¸ ^À= ü ÉŸB'#zC6Ìô#¼©:áuähøüƒϵ !¬×äL™YL.êz›sze­­ëE™1E×V ëÂÿÈ°*+º¦(ʇbõ§©ñåZ=öF†!&Ç Ž¿ —ã~›æâsÓYR¯2öü·ÍÑôÄÒ$Èà¤uÇê4†xðgË¥qкsV8çóàcØ4Êj/›ý¢óæžÖ‰wÌ®þ2÷=¸áê‘'ƒÀ¥ÜñßX8ûktîR’ýÃwôå ÆÿùÒÄÒÛwÑ­èQô+èŪ?Ê«®è<$LÃ`’+_žä3“k-¦íL¥¤;¤ê„*•â dqÇöÕŸ4É6ýÖ~à·yêcø?d_ÅVXE÷1öõ Sl…„QñüàѶ¶ü#eþ³ñ²Œ1yý[A7ä( r:¢æØ»MO¾<ñ®y“¹ñ×Ã.T³åÛäöŽ(uäs€)LÑyt/z BYìÃ, øiµí-ÁÿŒûƒ>M#Cœ5/n ûƒ"3UìLV2ŽºxêƲa …c/Jâvö‡k¥^¯tR¾Ùr_»T jÅ¢aP£ Òê¡cCSEõgúŠ¢ª/~òì}UU”=þäÓ&ÆæŸPù98åÀß4´Í°Î—ë ˜”B©yÚvrÆæÚŽf|óô§³ýçt­ùÄ3ý‰y•e5ÿ~ôzô„œ بDX·eaXÀ"ê'?8Ô0/ëVýA?­»VÅ.‘Ÿá­pu›èoóã´“hZÄ4hÛ4¨‚læ´©Èî>·YSEU3$YQÊ>5ŸI8YêõJYi±›ʲaÈ²Ì Sf”š&¥L6 &_#”}Œ}ùR|êÓMMηe9¿йûœLÿÄÄØœ½¡fY—o–.§RCoW@y:·‚BœÃõjy/OËù‚æjÁü>7YÙ† ‚+9®ZŸWt]yønš4ô}àF§ŽçÌŸpãg{äg§+ÆùÀµlƒfµà?nkZùpëýZ±hTZýz…œF£Q"—7ˆ9¦9‡):nÎèÕ†*$:å‚PLxÃ(-6šq{Kj#iÏœyAäµäû"_ù>€[0x—µ{[ÓTÕTÌ=õ´mooo_<êtØõ=± T«q«b‹µÏÖ6{jšý¸¿ð”©ªáTý£üåÛQ-Ê™&BÛÖ&ë1j!ëKüº9U©ô¼*Ëxù]¦¢’o2SИ ½}ÎØôïJX–UIz­›˳ಬ‰Â×ãzat mÔ­!‹ÃD¥ºJy9éWP‹ª^¢‚Ñü¤‘6š”x(ýz±,³áÉ2ô˜‡pv€¢à ~äl}QEÒíQT^,ISåŒf L¶î‡€ò«8‡ ª uof*¥r–»Çò"X“p¤Òê6Ä,€¦æl˜ø'±Dj®€2fUÔ¸™HÿL9ë%—a¼ôO Ï*Zó©¦öÏ`œS@(xµšçZçn´2˜+’WÑúÓÁÓu°í2š§×ûAU¯c\ÑP$¡ày.ç–å6š”sùJä~¿’áÕ)Œ`Š†(÷VA`°ýP2¨Ç)¡©òC¶–R/ëCÑÀÙ'—–ÕÀ‹ïÍ©(ÓtÕ-]U׬Îõò…r  T^ðw‰ôdõôéÕDÚ¾2r™éšªb,ô'Ĥ€UU×XYŽîÿ‰Úl,/7š*ÊŸ‹0ªysxE· ‡ë:l÷ƒÆJr©ŠzÃVNÈêÈ{MŸ‰•À÷6% ™Uë³½fP×çzeÓ{Ë×¢jGyvÉØGÚ¼¿[‡JÇ9cù-ô†ÁßœqÆFø-ø„ÑX2ZÉÍŸ$Û@r\ü”@.šÞOhN#¢Ñ5²t„abvN»LƒÍ8³Ë®Ø˜¸ã™˜–G^=ÑKE$ÛÐŒ‚t5¦IÜäE9o''ÛI‰ýS˜ÞOßO BÎ/>þƒ;nýï˶ ž> ÓÝûMàixzœÖÅ1< Ost&àéÉê¼ÌLa‚Þ˜=c±‰º”D$‡l c†"Írh%ð=ßˉW¶Büßw[͆ɰþ& ã•ŒjxñÇéfÜNÛ8x£7 øýÏž_)Y0Æ€…ºiK%Ë$ l°¬’d›!Æ0`[Ë*•l œâ¾ ƒgPö‡°.¬ž–U*:oׇÉÅ&K¼ ¨.\®ãÐi; l’8]óRt/z! Ù}\ ü`.ÓvÔ™X!Ù/{NÄÏk¡pˆ. ®/92.J¸cQ*¤â†„&5´k»²¼«qêÖ|]OƒB(O›tšÒóŸ'ÑèáLxMc–a’ŠÕÑ4j®4*9$­qe‚rÌà95)©Ã[s*HÊX‘š«ê ¿H:\›fãQHí¢¡ËO8âŒMsaÒÓÆTUOò-„¯æTa (4W”×zb6›B_B 9­Ðl˯nô Šr† ÊwŒ4ˆÓ?!´Ý°vÚ[·3i¥ò/Åɇl™Ìê¬Ë­Ó¢û.Õ"\*ªŠñèVƒ-à\ÿ’¡À/džë8n£÷ÝÞ¦¢¨j«¥ªŠ27÷Âó-ßÛâ¼YïõŽÌÏaè+æuNðûŽÓl¶Ûͦã|vyt´l“[Ê_?wl£›åݾ’ ·Íl¶olÖ –=z¼Žï.1/4³§Ö¸i˜˜f™k¯ô˜£i$ ÜhÐ%Z4TCHŠ‡¥ØXß •U¾ø Œp:S V¼\Kh‡Ž£˜t0À™ÿу/¯–ÆŠEÜè\&q6oØ沸21Þ¥¹±{Ú;±Ë;òhCÙ¹`ég0ŒºÌéO¸¾„ÆChnÁ&êºÃ§(A[è¸í0…¥€ÖJû6`Ã~(0ÛÏ8HB Z â“‹KÊsØ,x-ç* ‡ã¡© )¿ƒŠMÀ²ûç¹êÉêiÎجÀE×”y5⌽ÅR0ç'w4‹æƒ"P#Aè_ø ¡^£Ì~ÝñÀß„Col’•>Xý÷éBJ£,¡$Š~%]fØã¹Þ½zÅdL茙£-]t8'庮øǪÕaæÞa>ìaé?`Ì®žñy¼<Œñ=Ψš91t ‚‹Šbec|—3&ÿ$ß”.ùëØþ¡~[Ö¼%yh]D¯DE@3HÞ0Mý«†%”(ð ßkª¾1 th r, ,ø¾ÜZ»^ĦûBªê¬cöƒ–õ:™1}þ…{^k0ÎßϹe¥ªÊØœ[ÖªÊØ«9·¬W?Zó-×åxÖ&Y¥!ÓFáRN*ÔDû:£êÝ‚篣¢¨ ô_‰u[sA•Òø~ËâºßæX!„Ø·oÂ^ÔÉ,[AÜŽ›³$¯€°£ä<ÆÒÙéÚíW•Á²(M×T©Éhد˜u$Ö8cNI}íd }ÙåŒÍ¢g çŒA¥ÚuàCº¦æÝšº›È ˜Àß×—Á åî¦Üó ŒñÝ9wo3Kõš4Ô͈£ì5»¨‚æP­ mtBŽEê0Wìã?ˆÒ/ýÝi"yQ'~ <èõd#^NÔŽ›9 ¼ vC5ãI†<«òT%•FÝqs¼_êJ‚©Ó×É”'ï»ï¤É(;!«ª\:Ou˜èº;û9W×11 Œ ƒ`]wáþ¡†œq½Œqõ‹:×° cëçk<­–Ú„x ¥˜zÂG°0‘K(±óC54×¾ST½Ù¥¹‰f>gl´ÙíjÂÐ Z·»9þ¯_……‚úÕ¯ª…B8joýÑô|üdFù .»ÍÁ8Ë®äۂܯ‡6ìì£3èta­Wè­þcÓÕxc^M|Ï¥Q¥ÉY›õ÷Ù]ŸD´b“æóó«{ßøÄn¯þ‰^üD½·û i‚½ò|âø9ƒÄx¥Œ!œ [*Á(„z.˲Žê¶ÙdS׃Ì8P?Y• {Ð7›ÐfÓfìGœRâ«Ø†txš_ç”ÈŸÜS²ñY™PþëpoÐáNG_ìuYñúnxá[† /ÈRww‹’¼n±×õ1wzí :/Yk@ÅÁ.Ûƒ–ØLô™€Æ˜ÁÓ`§ ›ÄßåÉÜ=âUQ’4]SÉ+c9ï{#ê}@»ÔšÕ°ÞG Œ2ƹ2Ã~”v ¸3¿µ5í±®©D”$íg*¬Úä`jù'£å”ë¡Iñ°ñ„36› ]ÚÏ"ÄL¯qB—Wí;°üˆ#Þüëlj Ùѽk(öÉðËx —ŒnFw¡‡É’U!3\ëwƒh5•°iïV S]k˜Í[k¤-Š-ü {/}.lˆ] +†Ø‚ÜC31›ÂŽëC?ç9 €Å¤ð‰—•ÂêdãÊÙé%xö}ãXžš¢õ¹>òN«#÷ãÆ-hô7µc+  ´ÌÚ€ª‹%,…0 ¤Ðúuîp_6äŒÕáM6„6-|£@•ÚBÑ ÓÀ2ì¹ÞÆgóˆ€ ÝR?˜‡pgg'¤£µ¦a¦NöÁë‚,ŸgÖë%±b~PÅPêD+Ág6í}V³a2⌽F×TQ DÇãõå«ss"(ŒëL&Ãáµ#ÎX0EfþNê ·ÒÑuMãêÇõ~ šÍTÖ™ LáòµI‚ãÏÑÉûÔÚjhSnTÑ:^Ovúz$Ù_Ãkbgë-54{y-±0žÎH|w„™›fnš²âÆ|²$À%æéÄúË,ÀäŒ!ûi†4:ó³È›®Wò…Ì~÷+ ã• ¿àü@*äÙn,£]ãÍ. Ìx ýÆâ °¼Qqtß ¨IÐ8 ¤yÖÅ0âVþ¹-ImŽ% ó¾]¾ÎyÄ]Ç€×?^íìÍ𥇠f‘,¯y‚, Þ:¥ëwÇ^ƒÑ˜Â-ú{µ-IíÙÄp#â^o8.8Ÿ½Ö.<\hÞž¦,¯yWÑÿ[SУœ p& §Åsë@Û÷×¥m‹yJ=hÇÙ= æ#mJÿÙÞøßœ[Ö…Žçõ{šªV«J]ª«šªV*JM UUS+åÀ÷…œÐªq»¦2¦6ëzµW5Æ´æb¨ÕúoH–—9·¬Í°®Èœ[Ö²DUøˆeq~áþÛ3¦UãvU­-4TÆÔZ;¾óŽã¤÷?¡U*ª¦ª 1Ô*UÕ>ÿHµú§–ɲeq~ˆ²Fcã6±,-)„¯ÅÇÇÐö*“{‚â`¨&‰†õx"¸{Tž”‰P&D£RÏba…'—æzà¦rÖ¾‰W2ypw¹ùöâm¾$ší{® ÕìÙBᤞgæ ÅKKÇ-#[XJõÁ¾³Š\V/ÏiAªË«ª¦Ëõ²ÝUßé‚eïæ” ‚¢êOÕš)hKò1‡îìË'óÈ£®ÓÙÔ ò¨C4¹(iá0F¬Ô̆`®ÒTÙ{ÍqEÁ ˺\ʘÕ¡\žOÖ7åò¼Ž³–X×f‚– ¢ÓVEÁ •ëM ²ŸŠ‡ÃB0ºH§ÈÞÓ=êíR‰Bò#)¶ÿ:vÑíèAôrô:ôvôþ8+j4)ñ2Œ3qÁÞüø îäiyNá3¦å] Hº:Åð"ÒQ-Ê ‘ã“#E=T3vv*ÚYC\ÀåCügP¢ÒI•UcÌ$QSõ{‚}[µfcqöíÅFSá’* l6•eä× Ú²,(Âì»– XÆB±P,.#tuŠ®Â½½1hY03rwª&Ïb7é„ö.ÏÁ ðq…ƒv%ÃÞŸJ°’$u+’…‹VQgœí¼Ü4€¹tüíeÀÁö:²Á©>õÿˆ)¦%{*šæ4eQÓËõlaÞ‘AÀØñæn¢ˆ±®j¢(]sÛæ.öTIQ¬"•ŵ<ÏÆó.80ï1,¶ýŽÅ¨ŒŒ# F–¬D ÕuUAf{C¨ :€»P-š*S TH"7“°(I@”ˆ®«š$B0³ÕjÑ×½vµTäº,M§DÒÿTH¢Æ“Q"„, „BWðîí ´ŒR”£³:<ûœ‰=éIê1ô“þŒãIÊíß ³˜PÀ±;õ=—Bä%+Aæ ƒ‡ÔñæƒØëX+üjñ<aÉðÕÙ›`'÷Ém<Îæo‘¤'Û ¾ðíï0mC{«Ûí®q´RöØeÛ†ãKK8I)ò’|µ.øx'\OÑ ¤f$Àɼ—Ûöy‰P2õ)»³_«ªˆù?‚)º½½™A‚5;²±×^û쪢 QñÁEz? YAZq­¦dÜCHHͱ”àW¡˜& «M×ðý¨š«Nášö,×ãp¸Út]ð½¹8ŠÎ˜ÿš§Œq[”ÿãÕj¢(I2F¯V[b\­jÞ>›vˆnÈ×±0ÛTsOœrºS­é>"hé–BÒs(¶a+u³–ãÚFÞYÀ?9fÍ´5é¡a6Ì&dx’/iðZ°÷:©sÂëFf“áåÑ´WÞN.Á•Yba¾ÆÛè”»¼yzƒ!¼^f&²óyB%Ãlo`ИJ%\•ÈK4b/Á‡=ësË–DÔ“–uR%’µüܹ…’Eù  ˜žÌBÈ.wŠbA‡? Ù¾oKÀ£îœk'9?©q~½ò\}ùU”–eŒØ¹lÛ`X–‘Ó$ûñ2·&¢":ŽP+mx o3‚ƦyB™È±á&.Wá8i:Ãxå(8œùRè¸À¾¹ß |hÉÐc7Ìó|Å‹`Ð ~Ð4 `»i@¾M­‹JÒjÈWÍn‚%.qNùÅ|à6éâY`¤]çܦg8Ë÷ÍÉÁ®± sü ¹oî¯>œ™EáÖ:úyžƒ±+°6ž¹VßLSTD§Ñmè´‡^‹4´Ê›î¼À6Ã(AÙ¼¬2äpíG³”¢¦d4bž‘@Pi<X¯×àS@'76æšÍ¹“}¿z±¢˜\שH%ÉŒAÒG•I§ª@¨ ˆÔfLÓ=]-ŠÂŸŠ‚Zc´«VcÏ(aÂbÀ—d‘s" :'n¨ªŠÒq{94š‡¶ŽÛ:Ôl@ÿ¯îÏê¢(JDÒ‰i²…Ê8‘+†HK* Tƒk†EMŒÿ"Á!ª"Rјý|à-xkA/p"òÝPQT5äbßIcA#«¡Áo”z‘‰ö›ŒÞuˆG«èÅP1¶XøHF=}—z”Lfc~ÆM²ÅÊUú˜ +¶ä˜äö¯çžƒ_ÚӴ߇â|¹ ²¬=£É2”Ëó1uUC¦¿íVú _Z‹ïæ~ª<Á–¤îÙ)Ö®Ÿ±@>!A¹E)Jë€cˆÄ‰íZ¨Y{™ c|¼6ë6%‰Þî1ÇãqͼÁC’Jê§ácÎXl./^jµ çÜÓ„q>àÌ…»KQ†vd#ªÀZ=u!§Á^F¶cð¯ÑNÞBŠ¼ïÒ3Ul”zM$* *“«q;"[ܱ¯÷zuƒ)än¶ó^CTÅ„Ûs^6?Ø™¯p„ƒDE<Ï.€êu¬(Q›zI[8yjß Ç&c¼ßà7|t“cΘÄaÉ]ñè­ %ÂÚ4îùA¦Y‡”p*9 &#BV–ÓlCL¨g…:”¤í˜Ö;•:dqQœoŽ— ³˜VE‚H2ûº $q?Í°Y7{Q!‰Òkœ[–Z¨¦¡gH“T ªeq¾–÷i²0·l¦ñì謹¾ùUŠ§G ÏÍÖá•ü…D½Ü·lµúâJ³M¿1†):ruBfÖ—%\ŠžWëƒúñ¥v|æÑ©X"Ôj¯bhÎR1V?H†{YÊöó í8J‡YîŽGð“–´‘¿ŒÆÝ/Å°Dqnª—þ¹Ý#øºZTÖŸ…ÆÙ?bl¶"ÿÝóÿ¶ÐÍèeè A*>ÎËJxyÓæ@R09»X uœiV²vY´#iUo¶,þ Icñë ê ƒëQ¨yó˜"°„牼T"éӂǾ+ÅKKÇww5­é8ÄÇT¡ÒñÏ)ÊŽªvNªn©*8âç0Æw+«Œ Ñj¥q™}ÊåyBUìµ÷@­ØÚF%F üÄ®ªî(Jg¢rHQ°Rfy«'t½;ï«7ÇË¢Ó ™4yçQì]¶0è -c_VYþ‡ug—v°4‰Çû`À*}×tœÿ.{¦äý¬Y 0™Ž÷ßÃ>-þ®›±KÿÛªªŠ²º~!ê Ò¨Ußü9îGoê¡·Í[@<Š:5.YÆR˜e¹ÿy_¼,Sk3¥[ ¸\WV'Û¨œ¿Ì-žG÷!øÉ`(Ò2~N~#F å7x]\Âf¢Bbs¨ Räa|ŠË©µõ|Ãæºr£kNóÏìÆÏ/?ÛlŒ±…W^"Ñ+4æ=ŽÖ–!Ë=λݽõèzt'z=ƒPeÇg4]Í¢œ8ÉOV2ç{6±³~˜¢lH|$ÓjH=›#V~•Ç¹äd¥`» R>~Üû•Aseç§j–üoë1öu¥»U}l 78î£-‹Bu?†¬9{ƃiZ€(0З¬ ¦À-2™OÐlm¹L ˜PÐòɦ BйÎѧ‚ÂÔš?Š ùñÐóñ¡ùùØ\ZÓ2ûô.c»õ9*½2Ó¢W–J7„,µ=ìH:DsN‡»ßÆî^3{k>º©þâ%½Ýä Ñ+^Q¶,{ûº€Ao@¨µ’ @í\U½î~bM¼É°Tuøäûm\gŸ‚⨠9~’J ’ÑȨY µãƒtþÍ°£îBä9~E§TTUo{‹+ƒ:£”Õ+Kn[WuÃCõŠïxÑÂBäØ×æì²âZ–ç9ÕZÔŸËîתŽçY–ÇäcüOŠÁ, }þ„3v²¸ 6hh|-¨ ELQES€¢¡”꺪 ÔæZCQÓþtî~YÂ’n€æĺý¿Wຄ¥/#ÝhíFôLluÏË >7øÊ”RÆ“•lÈòƒ}3Ò¶C$C«È £¥„)e£—ñòlQ£d¹®U­}Ž ‘bÕ&–²÷‘ÿ–ST Ô^»#MÁ9¸8šæºº„±¢]{]>PZê~$ŸÑÙmšVdÛBê5`´Eû¿½½ =‹~!§IÄëÞ èu ¦-6wAr´}!)›¡þË×Üå’½µ’Z;ùA+¯å1D”|».{¿ßV#Ȉ#¶©µ ×7uê­Ÿôèf—?ç.K À¥ÝØ/àƒÒËûýž¼ïÛIÇÛµ·²±ì]ÚI­ç½íþHy´öv¬×}÷B Ñmµ¹¡2ê>&7»£¯lC‹ÂDº4³‡éjŒÃ™=´í¢½ ùñæsÉ꿽a¿Äµó’¶dpS½jöÞ=,¯St]ñ¹k7¯NñË`Š\­jc}=Ï÷À÷¦98HoQ:ûdWõûJQ êzÃK…#›2lk9‡ÝÁì1?þë‰Îmúà€ø ßš`ßÇeqž[VιeØÿ>]ÇÜ%Æüë˘}¿¬¹›Ã¸ÌïsÆÊÏ1ÇÕ– ×\‡µ5×+¸E·ùø',7Zëü. ¦¹Ç±8 ¶Óp âã®ÆœAûŠWíToá)OÓõmOÓuÍÛÖuÍ;õu¯/Ž‰ø'¾«S,&‰“pj"t¼¹¾7p HF†6…‘4 “ʆà]#híF€Êû$ÁØÂß.‹àuÎþŒdÐ^€–[4]$.ÏÏoÊû…Wà&(@=t Ý· õ×Kàz‡ÐŽ›Ô&´YÓ¶æð:êI;fRà>w ¸Ä±~ÉÅò¿ ¦$´¹RARö PÚܺÅ4 ëu ª0cO‘ÚL1>"@· ZÛõìc%þWpDØ|’Í…†õ»ëô[ù÷B‰M„eYêyËA&šäUUì× Ôœ§•¬)ýq¡AûIå~y ¶]–?ž8ªÎÃüª¾Ù¿22úa®5,Û6T­_X@rÞ‘”¢;ÑÛÐçãRæS¼‡ÁqæpŒš É!ZíN¦Š³PCÆ“ò«ž¶žKa]NÓN×!u²Ï°×ú;Ñìï¯oŠ ï=|î³± JD¢S”':0ÆÓ·çÚôˆ3Qð7ñî5¶x––ÙÉ·zÉ#쥰#üê‡/mñ(T"Òîó?Æf •Eì@ .|ÛåB+ýšWѱS‰H ËìÄÿàð!º½=•“5õÐûâ7˜pCf» )àÒ¤ãP†|Èrá¡Dj§ E‰ üºbL–®ú.ö+Ó!cüü"ƒÓ ¼#$cÂstkÀü2JçN@Çr­¶?Öì5ù—nÏÒg,[èú=gmïp„’¯~ ?/ —¥ßÔÍèô4ë/RT uV·ý΄·¢0Œd¿YJb H­%Ôa¤óšÊ ½ Ê1ߟsž¡$nÄÓÏdÇXvc†em«4`Ðü¦´·9V,µZƒA«U*ê’¤/9A#ä+Uò0,‹óíö.žÐÇÛ?.}TËÂùë<†eÁ¯¥}#þg©^ó}߯ÕKš¶$w ¸É£Â€ó£_gV;çÑŒp.;"N‚ZbÌ#¢éÚݲá†9¨žÝ…-hÖ)ášQ³©-ø“O}²0É‚TÒ(—ç?°€UïnîEõ¬ [sõZWQ§À†Ô‚N›ž¯úâ5¿ðZB·¡‡Ð«" s«êû†èt>4½+UdÐÃáY€ÞÎjï½–1&™Øyÿ»½,}À)Â’Ns\Dud §Ì=Y5ò3"…|zgªè¾Á9朼Š¤oW¶qòÜC qnúª rOcúK=k{¡—Ëy`Oš2N—f†xnŠ;+œ‰=dœ‘â]õ¢GË$÷>_*À'ïMlºã¬$¢q€ ß&r¹Íž¥\ÃÌp Û"ó<·°+ÚE<1û±Ý2€ú[60ÎØØbo”1õЛB¶1¦¹ ㇫œ£´_ËË Rî‘…ñ¡˜Y‡ÈiÒå¤É·:¡$j‚š)€Y4 @7˜Ï5E€(‰öäx±¦©ÿÑ1ªiäÖ#èGµËåFÈÅyÓF¹l«Î‘¸“W1{“®;ºëpM㎫;º>§sh“ÑÚA7"'ûxQ:Ìèp†›°Rçoàü[DëÑú@ƒxf/ìÿÄ®ÇØ¿~ÑtnsÌ¢ÝY@G•þ—&“}ž÷‹Ãº12à§o~Q`Œ`ŠýNÇÇÏ5U–U­èk¼Pâ¼ôC”_¶´|¦À5ÿ‚ –Þtm;ax«Ä9t¥q?éÛÍ”Wfy—‹¸|ÑüÀ¥vêyK‘ïÀÄój­8N8Žb5Ï#íùñÌlæØDXûß¹ÛÕÑ4MsT°ì ØvÙæܾÝÉÔŸ,® :ŒÎ¢[æó ,ÁÐÐ,å)(J‰.jYš*‹K˜JVË0¥¯A­,úY²¶€ÎÝ?Ø3µïÁ¦¢äªšë2‡‚a@KUú;`@ÑÕgš §ÐŸ_.T9ýN^²ü#­atïÎþl§*×O^äIÀxrNQ>;_w!èsy¹"f@#G'Ðïkzo‚ æHÄä¬kñHá¶5$/J“è7ú¥ÎŽo^AØƈEåNÜ€çvwÇÿù€y:£Äˆ6ÆZVç©éŸž ¶Ža‚R´¶ÑqtzÉùù+ÓÏ©OjUÀô£—üì¿`Æ‚ùùôHï´»>«„vZy¤Ë›g€Ë%€x'KÖ]Ѧ;-:ºÑ|SY'-ÿïΙpt>ûºÊ6dOdškt4ÿVid™ÑÕ½»û5¹˜Îƒç,–;+Sš^,žöö+‹Ä|­]ö¢eÒ.i§ˆ³,¹’HPŒ±vœ&Òò%%/I#šF^{IIBd@ì$PBbŠ…÷rºÕl˜¤!›ÿFuä~=ƒU盲=á‰ÝÝþîîåÝ]xB™-ì&hB©Í éWg,‡°Þ/Êfؾ•ÂüŸ`_u-TÕN‹P£¿nä0F =™_4ýƒLšjRB”Aµ¯ mÛVHZ`*Ô7Êɘ=[à‘ðýRaÙa6 P>í%ËZÕqÀµªµÿªU-§ªÉ2$Ñ‚–ô§¹K?Û¢7ÑlÇ´í–æ4YÇ©¾^u!¬öïÈcW}}Õq@–µ¹ÙÔ¢¦ìУ% JÁJK a\•OÓY8¯³é@£>î.éYèâ>Tk‹ýÅZU.˜97,ù‚®;ÿäèºàKœ1èÈò‘….ÆÝ…#²¼XcÞ9²¸S=¼?â¨?›¦òÝõwð!xF¯GȱeÇ1?Ò‰Ô‚ÄSPÌ`?fÀ±=HnCcQ;–Âl5‰0'$u Óø]³Éa2Çÿ{ã_lPÇSK%ÕshÓ¤–H}OE'l‚ ¾/Ûn·mG’|dÁh‡Ž$cÏ'’EM¸æ¨©rg•x¾(;†A%×gºdV´–©DšéE;lÖ¹AOñ%µ¢•-½¬¶É A†›O{*u66ªz§UÛóâwlÑ\ó%ð:RãºØñAò×LQ ÀîøDð<[ýžáXjkÛý]¬Ê®Ï$7¶UÓUEmÉ6U³.Íy–­·=…8©¡–]SÖ붩¦ìX!†Æ’˜[|=€^~ý¼•½ôÒ)y¾q.]=d‚—·lB>¶ ·x­maèX„ç}ãý±ŒÔÁôW–b›ŽN¯YNx¼ *ì¾]cìhZlÆš~Ù´ùHnéßœw+JåVÀ¸µ¢(ªº¦(kªjSržŠQ4ÍŠE#ñ5˜\z‘¿Þ3•-‰iab¦_÷* ;¦ªU0 ¨ªêá¨5»Ö”å«Ö‚zt ´£¼A¿ â5 ˜ ¢ùT€?0KÄÞâµövs꾄`hkÀlY5q=E¦™†:ë^ טé×…½Üiƒœ™J)fi^ÜZ¹f>ŠŠ/¸\‡+¯eÙ#™VJÝ÷טåÛaíÑ!¥<ÿâûš|í )ó^¬]òÒ=p¾ó?tj´ò:ý É/–l:SéÇâMiCýcZÎ)%ƒ“• #Y~qO¡›Ð=è¥èM%-`ÓîœRö·§`K‰Õ?ÖjÜŽŠQdÞ²ÿi\âŒåžüj_Ÿ–\FZŸ¿]ævuçc|BÆØ€Ÿ³=sô‡ÿÊ=>5Å]˜¶ rÎK( ¿DÜÊp êŸW0õëKîÿrÀíqË.öêï[ñ¾3ñËÁuô—¢»ÐÃèõèƒoðË7®•t˜sq͘òµÔL”ã`“éA¯—<”K—ZvôB.¦‹°úŒg¦´u?B±xþV4!:ªhäçò^j¢ò¢ã1uà–L,ÁÀJˆçW»óöÛUQ`O™ZœÃÔæMíÄN®¾ ½ ïEJ1íBÈýÐëO.ù„æèÒÅNH#Á¶ƒñbàÈ~ú ö†Ù0(þL^h‡€çgL*2£§)$‰·çÓŒ=Á4µZ26¬UU €?qñîßÃÆèoä'-0‚ Kkk‹bÑ¥!FÆáS«05/ð¢Ø'fc~¾ÝD1h·çç&éßÒþZya¾Ã·ÊumÝ-¯¹®R\!ìà)VÓÕô'r˜ù—NçjP¯R3 Ø'V.ë%ÒÃó5>ÃBÈÁȉ0”!“9íŸ{{ŽÃÒÅËø°ÝAƒ‚Ì’ºâV|:#Jê|þ’p›b[Uø4}Þ®¿mÅø¡(P*ÇÆåR!ýeÀtæ*Ust €õ_Z‚Žmþ®¡(Šb¼þa¥rŒ)C‹kƒÆm¯ÿµèè#èЯ¡o ßGŠþª-#íÛݛΔD’÷B°¢PÞµÊ ªðÙ÷&jˆOy6}>à¥k©¿£:#¤¶ ~¯1çZ®ÎeþÁq%Õ5F/Iù.D=©ÑÐÏ--mcšÕtŠ6³{T÷göžfò“ÉNKžb|ûqÇ.ú8giÅýpAÙ‰zýØQ’¥· b´f}Y›_…ŠIÿL‹klï>À|(¥ªn<Ð –EºJÓ‡Ló‘’¨¨üT“X ?_c·>¦´öðhžâª"–©Þ·‡8l†p€í;í Ãè)ÇAC“_§‰_'ˆéÅü:¤)ÓPÇmKuÄŠ"tÉ[O@µMÓ“q›BP×½ïúUt.;¢z¶bV=Ù‡ÅuK?Sr=Ùª(ú‡›7Ï^ä¼oY~2ì÷9·,[¦Âv¿Jš* ^g´:¹!0Ú3ï´Œë Ü0xáÍ;–tKpz—#}þJœÇó]ÜCkè:ƒnDˆ7±y„p@#X‰É{.㢵©¶c‡_B=‰i’óøÞ¬èÞ5hÛå® epÃ~•mpâ•Aíáf4®ô¨:Uÿü—ù'8–^%áà$ô·N+‚é lÀåÌØk˜¹­¨ªbçfcÏ`&)t›oð 1£Ó1Ø?-,ò¦lAü]5åkhS#fY.nÒÄÚ >?€wö"­EâQq Ý8VqïÄPTæ¤í8J³¶7öh 2ž»d¸åË ¯^§º¦©‚@W««Úju• ‚ªiš¬«Uc(˜"ŽohÂÚL0Y8X¶ŒRkèŒ&`Àm€”gÏ̓|ÞUÊš¦Ý°°xƒ¦éJ$ß½1¤Yö¿Ÿ9!c|Ÿ362Ûw€íW¶Dí&ÀX“^â°WÅê#{=õ2<èø$ºqn,è0Î 3ÁÆ6»}WTÝDƒá‰~@2O”Ðsƒ)ìÊHeýÍ%ŸÍå&ù;oÇ–%×+Ä Ú@Þhml´66wÐt¹ZÇ¢$Ûjk/Á3Vz\>´b)?M0¾k›…»”Èw¶ A‡êšzí2Àòµª¦ƒWÏ´î” bìæ¾UjþØÒ{I?ü‘­ÚÀZ­x×òX 2`H³¢( n‡¬Äöͤašù%4†ÿR¶,·Ý¹ÀÇ/øMxÂ6ß/:¬_ n´fÿG|A"-FßMêyUI¹â5Îøü.j>ÈcU wï—Ï(êIúC,Žm;qask¨nDŒ÷»Fl%5ÎMR³"`Ák¼7ž†Gâv–Fî™3 ¥?m°ñ–Z(˜TR†½…pîl”m  NTîâÚ¢ |ƒ`ÅsÉ0)Á³½ÔÈlºsÛTåòäïÔ/ZŠ¶Užslc_ç´$2v óðWApPl߆)j E”qóößä¹C„~)y GÃì__ˆI´-ði+‚¥|²Á§ÙšU§Úé=ªA Íšçœ‰æù_G¹<c_wm¥¯;6ƒS6[’ù‹U™‡>­ö@‰=gjÅ2_¼A†”Ë0ûo»6ã΃ZCwto¬YíOé¸ËÅ%{3EÔG'ÑõèôR„Àk¤V¿™2€7FèÞ|7XYTç-œô`W×%ð>8i<›Bžû•W+gk¦ˆ¸á¬òê2 ÀHÕ S :í‹áŒòf¶b®‚¬¤'Ë¥œ·ûp“P>[³á¢”sÛþF„£¨ü*s?óÇn„² V®mºkºÒ]ww⢣±ÓK4A !Õt-{v’®iÙwÓ<c<ϹmŒS¬ãMŠÞ»¼f±›‚É^ Â-Sí¼:ˆ«ØÐ<:ƆÕÍó± ü[Õðøòz€)Ÿv¼šÑ–¢tûŽ³aÇí„×…æÑÿ²<ÏúA#ût;1@nÓV8Õp'Zà¿ iÝåjMR9÷nö¯ºþ©ËeÛ†Þ™¹B¬‹IÀS2âÙÆ}t ítÖ0ð©àƒ³éH»äEŠ$º«‘æ: “•$™r`Ðô~Ã9hÃ&8Bé¯üÿšcÓwÂ=¶®êçO©…B Êî5Uœ{$i[æ†ù `]t]QÿÕÙ50µÛnÁåð`,ú^ƒ/˜²êÎþP3™[ÆùªeÛVuUsL±&‘‹–®ià½.Æî{ 8;{9…0åc RÖÂobŸm˜"BGÐã9gCP¦ªáÚ ’‰¶d¢èëFÆ~a°õyx´ôsÆΚ„(Þì’§bžõQ¿1gLK¡P6ËËu­ l• ‚hŒx>ãùlúùn·ð´@× ]×áæ€ø:×Úl ‚¥i¦(Xv,÷u÷Âòpþ¾ñ—>…¤:níû kORÒ©˜ÊÝ‚24Ðì,¤¾2}‘›ªˆÙÇÀ¾üxO]@ iJI›MãѳM¶oT:5zú“­DW”\ŽwÃCo:žW&ò<>a)Α׈Ðê(ȧW©[mbhH@üU^@×ÝŽ­iY²„"ß÷=Ä0ÐeÑ’X×}[’ÆË®¦¨š]¢,ú¨]ëîÞΰ¥h;Dùÿ{º³Áu3Ýê=ÖWÈ?GöZFkic£'ŸìŠïÕ5`NuXeèQôzô^ôóN%$ö´jX¸áJp²ÐÖ ÍÃWÏëóRdÀÉÈk¤ZWaþÊ^ xO·Ò,¸ÜPhWKš¡(­@%ˆ†_µK‹êõD$’tM I:`Œç€sÃ|M…ÀÊþìs̹·= ÂØ¥ŸN×Úc>{ &î‚]¾V M.ËsK¾çǃ }Ù ++Ë¢8û‘U*—AÀ¶G,;ŽÕr=ÃØK&—‡ Fƒ–£){aûìA§´Çm› t!°Ñ4n0'}Åh…qX§báŸp,ÇY5ì;=ÛP–—Óòî´ƒ Ê˱®šåšë©²¬zn­ÜŒæ¯}É1þç g >¦©š7à–ídŠa{»»žm(™c[|àiª¶)† Ži:…Bà†°ùƒóí,ÉÄ^äUɈÇêW[@¨k§§‚—¤Q«ö1Yt9V·¡.‚0¦J¦CfÿªaXóå²é´ÎÄf®Ës@c‡ÂK<®€ãVgß®º(§†Rÿ³)ß,V±“ÌAfý¯]89ɺSyÑr«7Î9Uu­?’ìÈ|Âä뮓ÙÄò¿rïÛóP“’À‘‚ÚaÜŽAœ¯ÿ5’„œ)P|¿ñK ߪ 0>›ÎÓÿG õz£Q¯`ª(|öX蹮¹¢|üÎ;5ÎM“óXeâu{Yýz_§”µƒkó¬ÉãfÃìhšëÿYzøÏÅô_Á–mhša[þ‰Ø4ûóú'b|øJ’JÅÖ4»RqŠ–`YE„bW¿ ÿ ¾ˆæÑèõèÓè·Ñ_ë«™y‘/‰Ü`ª’˜ÿ©•šYM‡Ûk wÆÇqHDÚ8nÇ WçDMÚŽ7ªøóBù´(µªK:M3jÇÒ0[¼æ@$~{þ—©x˜µVÙ¾Ó| .SˆØ-æÑ£¸M^`i@¾/%Áïë„’ªêŠÆ )ÙL$ADö!š ”m¬«ZÊ]|l»,*‰‹Ì¦ºÙ̵j8»*Þw’¹bJcë~åEþ¸¦ŠTGòW„Õÿ²}ö†! ¢–Ô XfÅÕd»ïl`à!ØÅ‚¤VL«ìi²O|Y{Kå¥4‰cû§Ùkµ]~póŽ¹Ë¯šÛ=ÁÓ–æº+rÆvãØ7ìÄñÊ ¥}%Ž,˜>¾y¸ÄÐ3£¸™Éœ»yšâf|fõ\ø¨ÝƒÕíÞ€2NWIr] ÂMÑe{<nIã¿RÇ—'ºm*Ž¶yýt(q¶X”W/4»¢û,;ÐÇüQ“ó±J·$Þ¶}ö U7•ŠL袥WÌ‹=Æþb‘\Q ®žÈ7“Ûëôè¢|æ|ߺO˜{Ÿåûs°yM¾Üƒ;4ªš‘ªé2PV«íÃax¸]]U˜¬kjdªT»cÏò0 Ã=¸jW´±€îB¤yupi³Qî˜ñ÷ȯZ–¡à’;ˆ=|•M¬ÔñÀhŽ"ƒP r¯± š#€5Òá6 À€¡p7 *’À{Éåh^/é’êù’(‹’ïƒê8†n–kív­bè†íξj©š“pK`FWPbhÓr c%çþ2hª…û–ªAù~§tlFm,,!òÃë M@±xâhª7!ù.ú…[}É‹"$ÿVK7m3(Ó6uë~Mµ:»²“hŒª*Û᥊åë\®ƒs%~0_ 1ø¬kùƒqå~tî^·Ü(š‡ú¬LU)Ó§ÜÙíXª†æÕÔ8VKõz#ö B]ñÝ,Ä-DÕªmYvµ=û=4ûažß‚eÕjÍf­fYïwežÃbÎrá‡Påè»ßóŒñò¥Û*+Ìžýì²…… EeOu͵eÕÑLSÓ´ë ‹%×aª*_¤æ}Î@ÈìÛpóæÆe²ùa›)åÙoמø<€æuÚ'ÈF¢;g umH%nE‚ø óŽH+LÚ<º[ Þ»þ¿²Ä†L,KRY\)üòa‚ßåþ?³o]U¹éñm„ ý{Z?eö[¢ø_ž •á¦'É<=û/#LcãçÐÈ÷#±ľÏW÷ª^åp„'uýO'èÇØn)\‚çntbiã¯zCïjÖ× "\·<Ò· {¾ô´¿‰–v:BŠ®¿ÚWpv²–ôÞuÒ覲¥ã(wσÔH×ú.IÒéÖvž6©_ƒ>óWÐuè„Zë覛Q3j¿ñV-Çʘ©kÏËB‡§ ümCS­Bɘ(ɾÔßé橨¿4÷×/† 0¶ø܀ߡÐ'A ‹•rù+óy4ó~ìo"Û[£ Ú¼ÂâÉ@HsÉyQl‘ƒÊÕ4^¹=Æxþ.Ï;0©ìË35ãG †“ “ÙT§vÑ'_cšSî¹3›™Ñbî9·jpå<ú™XûèumòßÕXöö@p¡QjS#ù|ð-Aâ8—,"û¦€]n|s­W0˜¾L¬K-—ŸUÇ~ÅBä‰cWøŠ¦¹ïÁiÀî7¾Àið|>ž]–ù¡?¢ï„¢Wi£[Ýíxö2ÚEoE_Á•Ÿ¢ ’ѧëÁ¥¸ú»ujá\†£üø¬à{‹”U÷¸.„C"ý;-–í–3|ÞqBÛð¸‰B!ø,;ήãxVé𣺃Љ:fRF­5ÍlÙ¥õX·5WT-u.à›ŠÊ癦m´º¿ä‹… Ìêï¹o1ëì¿ú0:Kn 쯱¸èR«oŒ.>S„z™Ñ²G18)ªî/ú›® 5¼o®ìX¡Íá]8êê?ƒ?©U+­¢Ý_1Tæhç›ï@¨å™N³HÆ‚J—•)¡Øæõ–Èm™a,ج:;È]7šýg´¨ÏìÏt}>ŠŠf‘|IÔÿDU·Ì©Ž©™³Ø]jµ ÷ï ¿Š-«ð"±ËPï*Ê!CHªÓ¡LÕì0UVq[n¯ƒ¤Yñ¥Î`g~tÝ't ¡>Gy¹«¤ŽTÿ ¡‚[¿Ü$:Š`Ž1ó ÎѪ—ýNb¶õ1vQ,u¤Wfk[¬ÈšÂ ¬d æE!Mÿ0 1ŽpÆz?ßž9cü;ï‚Ù‹œ±Ð—©yàyé §Urýž6Æ̦O8c×Ì>ÉŸ‚ëñ©i>÷0Ýç)б,ÎaŠîF¯C¿fù ³Ò‚éHØ%ö“•¿{´Žõ6%4xãˆp<ßtFª°")'Ý™Ei<Î^u§ãÔ|½Ýlt‹¸¼} Ñù ›‡0´ZÇ\âfZRÛø"³lYP,¶isßPi¾¨(iú¹›ŒÖ*Œ]ožÜH$jÀmäRÒˆJ!,„qeæÜtN×âa@_°b£N& ü 8ŽOæz¬ÓŸñâúÔ žä‡ÞÈ/=Â_PùòæZñ#"–ÅvD¹Ÿ.¿°ðÃl˜k Ë»9…H'Ç?¨ÂqÚäFÎ~Ñ3è²É£ŠFÈþ°|¢Tó;%jÇQ, Q$ÑaÎ0£iâ]¸“=ØÄ7:´°ÈÔu&§®Wä`fÕ¸½^ð¢Õv¬îpÿ"³zê¢Ïw~F/––J€ 'ùW !Ôö ÇÑ+»&šßÚ“»ašÏ^ò1öŽý’`Í¡pP¯CÅ›êõ>7Roö'Ux8À‰‘ƒ=À$zß” Øh×PP+‡»E˜ê!£saÐÑuvE3ãºnG³¾z¶¦˜.ïïƺk³¢Öô€Fcmí„™X½ÚÜoX_)˜&X׶á#†Fm“ì×ÂÒòŽtŽAÍVt Êì²chæVæpÍ:¹àªuò¸Ítwü Ù9±¶ÖhÀsNÏÇL³P0ï™­âb£ÞP%tY%Bë‹-š=hžÈ<6is¥æ {ˆŸvÌS{Cz2H¬.lnâ_µ,Îë.)ï©ÏÛá|çÊÉô BTµ§c¸÷[…77/ÜʹeÕ±ïãºeq¾cY;óÅ羄Z¨6_£–´é6š­Þ'Hùzƒ™¡‘âÝ•t/[ɈÛH"øÄÂH>ò6†$ÌK5á¿ÁÿO¨—?¡!ô ¾ÈîÀ]oà-œÓuðÖ±·B§å?(ëØ[þù7IòÖå&‘ ³(Y¦ë$]Óu=]WÒu–®ËoŠî«“t]º)᛿iáaYa«k]ã% ±*ŠøŸ‘AúÓÚ…oÞàþà£Üà¯Vt†~Bo”Ç#BžšE&;ƒl¥1üÄ$DýîV&&âv{3*Ó°PÀv [¾¥›í6@¡kœö÷.vsn‰ª*V¯Q)‘:GÔk%P˜¼¹IØ<¸NãP5¼äºû-A駶µØUà/DÕ·”lS-嶄çú–*ÝÅ­~«+1÷|<îF~ù/U”3 3vb‰* ÖvUI¤Ã!Áɉå¸]¶ÏðêÚ'HGGÑ.º£Õqd¿å,’ ë ù•KM¹ù ~TÇ:RIV’4}L‰ad„zÀ®à}²¤^4  •Þý÷ºNE›uÐuß+—=_ס¾1w ð5¾±ÜŒâN3*Aç! †Q Ô¾iØc.˜Ç× ¾ŒäWâýb÷Üs¥ùb½dµez½¸P<çö,°ˆ9] þ#û…õãûÉ´ qã"Ž5TŒ‰Ç0Ž²!±œHNV×Ôèë÷¡Œ„œ“-fæúa<ô dz-d¥<ëŠq¾ìEƒp9- B'еè<Å—È?H´é ¢Ÿ’!>ÄmØ:š Ä)TÄp(È›i•M†Z°Òµ­™gÂùÏÀ\®m㑹‡âéÓ­tmë\lu-½Ô}´„nAw¢ÐÓ¹?"†™x¾Ë‡±ͽÃÏ!ÌøIX<"4KcAoxmøCOæˆÂXE’d”ßñ%)tð°'ëQºøs>Æþç‚Ù kÖ=öaÿA€þ«‰kzž©z”°•Pe×ÍêBB.yrN…ºÖŽf—–ûßXWußàPö Ãùó²mö?âþ¬Bÿ~Ý<¬¢$. …dÚwÐuètzcúÉ~à{ëŽy)¢Sa&Íüýl¬÷g/¶ð0ð$ù 2Ò{ñ÷|„ þÂ_)·ßŽÏû¤=Ï»õf·¾}³y;ºX©T}³¼^ß0Gvo«=P„/¹å‘A¾öZHßÓ#Ó¼æ¦ÑZyö—ÿƒü¯Âɞѵ÷ÌjïééCÿî\·~tm言"/óê´­Ña¯@Ï ÷¢£O _òÃŒÀE×ÍäI˜ì ² >³¤é1ùìñ‚{Blk+QChêb÷ƒ*'uiPáKú ÃmØ÷|ŒýïÙ ‡¾roižQlôwC¦Å’“FÅÞOÖUt¶3Ó'®`VDX¤U€¹ç^ÂýÌÜþËΙt?SFc¥Å…}·aŠ."$…Á[éÁ`fBe 7@½ª¤6óh w$Π¡£&æ0*Û0€^-ðx 2F’ £‚ d~epÙФco­ÍEå€ï7?ÚÑä ­š¶Ñg²¿‚} |¼âˬo8†Ú.ÈÚüG›¾P*Gsµ·% ·Í>)0 ¿fÒ7í ÓdŒœª ¸XZh•J$˜çæBâš™ëF¼Ò.Ðu @×i¡½z(ó.˜¼S ¥Rk¡TÄP}ê´Õ/ž©*Ž£|Caª ¯uT¦|ÃDt|Çk„ûzªÙ@*F^Šö±Ã˜æ‡3£UÓñu~ê¾|þ©EÀœý®e[–mÁ†cÒ‹TÛŽ¦oõ°±iìBø`ÆNO0ñ¸÷— ¿C3Nœ}mɲ€½…jí¿Au]õû ³¡9l5‹h¨Ù2¾¯ª×ýþKj|š›³ÏJ¼å8‡¯ÇYFÙò ~ þ*ÌyILïKÓ€]VJ[J} xAYDØd•JÃÐ)ŠQÙ÷eþìû8Bgžã%{DZÃ壥³é<\_4U7¦)/̾®î©oƒ7‡¦)‹¢ªê·ÇŽÆ‘úRiö“~ ¦t®öæµgg?yá.ATÊ•ÆÏÎ^†>ŽÈ®ßA4d£%´ƒnF·£‹è¥èUèýW‹U1Ä?TfîÕ˜`ÃÄw—é)í $îšOŸìŒ7LWãÀ®• X¢²$ÛÖÕûovü`Ê•J–”, .cìÑË9cUˆ°Þ[å+uÀËåV´jUÛªJWæägØâ ÓL ²*±mß4ó‰'Ej+Z/†¦išáÒnŸ°ŠE릕…£«1 ÇF™—ÊÍX´9ÿÍ‹W.8!²M5Ë%^>­ì<ž–Îô‰›¬bÑúóÞjÛìJѺÉ*.ìmYh–K¼[ ‚îó×ÂzŸ·KçN=s¨”LÓº¼uÉ$"“kÝéÎ42ä¾ Äß+ê,vÂO§p6È]dž€$’{…HîòÕr·]Æ'bÛSšœ5Þ‡¬.S¯í!ñJß°^ AÚ±`ÝçYWýA6܆~²’QRÇQm‹A=þ…%Já›qs» '=2p]¥Vð$nŽÛ1®ß„BP5X!'[à™5É‹ƒ®¿ @×%QÂ+É`Éþ)_kü!@„@W\FͲ¦i”ˆ¢î¼\nFu¹í¾ÙñRèÉ•Wñ¤Ïf‹Š¼# ñëÂàæœ1gLÝÏäVùµo—M9(à!!‚(Kšy£tíнìr‡Æ†GSæRR£^¥U·.ZÍCAáT®ÞäÈ7¦lnIí¿5ä«SÜ‹¡->†v1Àñ *׶C ƒP"Lų ©54^ÃD_»1<åfÔ ¶Íí¾Mh@ZÚq?”--î*3QU¸N¨Àœ|uq@0µM‡…´4À.8?‹¨4##\àHbªºb.¿d­]è6à­uÇ°zDÍV…GÇë³ï5JþÔ ¬ÔG. D-’Zä…µÔ-FðâTÿÖ5^÷Æ9@>Õ}Ðô‡ÉaL-nIÖxUËt¯ÑhØòRS•›¶–@À†ýlù¯÷릒û1EííPú8P »ª¢@¨¦k³+³+º¦%„æh¦ xæ~—`­VYõÿYõR® w†¯M¨¦éª(|$`Ž3ht"Ë?WåFrWüV%µäŠ,]u(yÚÍS¤! ŒÔÎ*ý…4Á –Á­P&­ìŒÆ„g·Úa˜ØL°·%|Ì4ó /Ð{Âyò,Æøì¹jZ½†Ò Ý÷‹µ’çëÌŸ¦®Ñ*\ùD…ÔQmžMF*¡•{Z.¿vÑîñtMÓ½{´üÜ{Æ?BJA3~QéG¿K͸Âu»U­°cðe¦Y·¿"£¶X®÷.§h%¨(ä¡Ô´ýÜêt+bkíÅWYhФB1Q×3ðÝèA3îçýj´­Ö$7ôH?Fvœr£‡]ÿl›;Ž©‹…CZŸ_ÁmB˜bÛö°,Q,)ø˜[箉ju/°Ê«Áó}–ì`‚÷œ½ñ:cM3LCÉ5ÆKÙHÛvlBØ.HDVÃ5Ë2ÍÊ)IRKOŠº¦éÅwÍ«ª§û[m£‡FGéü7$¾«ŸæôAZtDŒZÞŒ›á |ÉÑžÌÐõr<³'üÞ(™) ­³X"T½¦zÙIÀm=þÕçýU‘9 øÞÜÛ¥¨(©×ÉóíŒÉBpF¾Îcƒ÷´¸8òÐw¶èÖCôÙÑfƒ«Ã“ïhäY@~Ì*˽$î<æ™êÒ¥8¸§€Æ0î›QŽÛ§ÒW×S¿³@¹µ šîß“z´’Ú§ˆ*×òŸï¦”U‹Ù¿Ø0 a°²}&ª‹ºÝZosIH­¸ÏÇ/JQ˜¼ wº"æªx¨ -¯åse§XG%èÑuÏ-K©ŠˆˆêìÄ|öŸ ®f™H?]&E¨_þ÷n¢›ÑýrÌ›w&C4q¼!ªd]˜/¡ˆI–¬M’Û+™Î…DhÑeÅ;½TÐ|ðëšÏ¨;¸tJëòìòõó¡¾úW«÷øsü3åH¯‡>65LŠ$zé»Zúeùµz-ëÐ'Û§ …Xád~­ÒXû$¡¬Ý•£7?òþý‘ ³rf ¾Cʘ8îëð®|iÉòö+HDU4IÙÜ%iñêfÚ¹[úe¬p÷é•W7éú¼»ßø¶T«ßwØu›ÚøBj©D¶T3á?.e˜}ˉ~šŒçù!uÊøðîrœ2zðÎ6Ú…`Ý Æ ù~ƒN¥5°…$Ú"×i¬Ÿ/ðÅ y/ÑÁTÀšªkòDºÚoJååŠi2ÆÑÂ~ÄÊ|ù° öFÐ —HÞ«êšL¬ý„gˆõJt:ŽZj —QèQV¿‰_wœù§" FEeÇW–]e_ç7 q2ç€T(B7d âáèEû¬Ô~‹ð¤iV–c1»œ4‘5]Õ°@ï€Ý6 ³ó‚‹¼pj½á: ‰`oÈ9ë:EùÈeè¸Z§Ø0'i”Y¬Ô‚‚êtâ’ímðŸhX ²¦«ïM"^¸ð† »AÍ+ ½ï]Š­š (déä7KBtx‚5Å9Z“Î_¬¡NŒ6Ÿ#“ÎXá vKÑo Z—×ÁÜäu=™–<_ß$ƒôñ—š…bßÙ¨çÐX¥i¬;9R]`ü™"çpU^z½…n“ù£¶rî:ƒE÷TŒº¥{VËÛEɪÝóVLÂÊhVýdö$ÈæeÁGNåR4˜Í²¹bú­ãZL9j€_$Ì\s^3M¹?Ý°¨’9åŠcþ~ Œ5ב¯Œ ËDïsJô>»#ø#jrÖÓósGJÙ¢‹› *ŒQ:­eØNåÁñ~:½í[Y!:§¢ërA÷«=„‘ŠJ¨«³GèºHq»j€ïün<[£LjÑÔÞ½¬ÝÅM8¸–·±‹G?ö0>b6ž¥+?‡Ÿ3Ïs­Ï~Êõ~nûìóCf˜ÜEùœUþMaÖËMá×E/À`Ô Ðïmj³¼@Y–å=Mµ,U»õ¿Pï³Ë·¢È˜aò7V­ïˆíªðØTÝdó‹HEEtDR7DN pä¸{ H"ü Ø –OLµ³a mð ¨Å ¡cl;á(¬>Ë{ÏŒØþ9|Ô/Ûß ?W¬¬ü»5"sÎ5²†UQ s¾†‰¢a»eÌ#ÅéØ5Üÿ‚D|×Ö?ê‰ú¯“p°.ËßÞ=³ÞöRŒÿ·*ÿÓ5"Ë2Õt5¥7rÓ`LUÆøK)u¨`Î~Šew…ýöÁ”Vª…U¥zz—„m "¯™ÁꉞHbB­”ž5i]ÉšÌfò,0^<9{ŽŽÃªþ66˜,ÆcÔí¸’wŠ˜/3›/{Ík¿Cñ'ãcï»ð j§äDzÇé2øár6ܶËù3²œk\‡ X Ît®å;[¯$Ãç17 nêG“Þ™±_9c/³«]‰È“<ò®nœŠâòfTUéšB¨‘¸&ƒeÍÞüÓ‰Y¢ª 4å"#ÞFg8«øèø!©AÈF:™÷m©·*‰‚q'P_®ƒL¾Š‹ÿïl.šÍ·¬]Î~2\¶,Îw˳þÚ„eÁå{•e –ÆÕÝ0†[ŸU~Ù­Y÷ Þ®oè Ç.jÜžh%°¢”~¹˜ÌªÅ½õ=÷UÊ‹‹¤¯ÂÀÇ"Ž,â n<ß0Û`q8½pÏàÔê­•‡ýê×!4Àñ”i(Ö-æ,Ø:d¤°ˆ8 ç1M@îìO?w©n-;&¾¶]0^Åœ—HmHãfU´ÊO<ëƒ1òR\v¿d} ”«éê¢km€ehÀ‹A6k§V;ã`Ž‰:°Fl!jS¼Ú ˜¦yÄ·?…;»ŒƒùO%ËÝš3œÆŒ&ôkûš,°èôÒK_:ûºœ’ÛÊø¦/ãÙ/\«™ÏÍQ ñ Hç ù´{;è6´ÿÙ «É`EPÂì?l=Ü! À¤t¢<*D¾Œ(Büh‚“&ãëóÝ$/ñaͯ%Ž#å V’k¢þí3fÚñJÅ×–LßGÖÁjè˜ZùÜ= 7Êçä%jA*«Û>‘\Ò„·ÿô^£KØC1u|6’Äsu—¾á u ·qŠ2ô„þþLW{gæ¿Ï8!ï꜇/±IkÝXþß¿ï@DŸDŸ¡sö³Fä=?n§J’á(ƒÕ..lý±:#Å HÅ‘2ôs+žŸ+#ÒÍ€ “?×ÒõVôÊYâ;äœÃÔ zAö {×Æ`”¯²_ôóÿû;¬³p¨é͉ h™¦é4Ç°H´óò–&ZV'‚ ½LÓ4RQP_&Š×èö†7, ãØÈœL´ ËMÁJ’+s d, Á±?<1X†–â/ÈB~kš«–åyÑ9_àÉŒV'â¿g™ õzõ¦‡%vÔ§â_üÖÊÅf4¿ÜnoªÖëÂlŸÿžÞÖp¼€ŽG¯Ú1 t2ƒ¥‘¡ç+³b®©#ï]ßz‰v†½KîËO‰”†—i1;-]:`c8^F›6Ƀ!6>Äý c/ð«˜ÐÈ.áeÇ`õÉ0OzTÄœ4í:_¶ù…à©Óbè“b>ÛM–S´šÎ©®$lýãŸá§‚}”Ißô~ì|©Ÿ?… 2¬6ÄÛè:üã¯CC€P"ÕR'Zš xTQöÂØ*Z è=Ê´=Y·ÒOë?ŸÚq;Vô»ÒÿÔjð-R Åb+íV±(AÂ=óÞ¦á5˜ É¼pG<¬À|°?QÚ‹Æ7€DqÜÃû¹Øh&Ú¥2u‚öh´\jϱV‹èˆ73«¤æ’b«%œ˜ø™1] ³à£X¢/-$Ç®Œü‘íjCFfîVÆ”:Ï1ˆ¢5HàgržÆ«& r£9(†:9nv»ZÛÃŽ‰²im-/Y¢WÄÄ 3ÙËQ"Ê錤NÒo]6³tëzù´8Íù“2§îŸµ[^Š­4¿$[Š"'.V£1¾ÊZ ×ë]üà»éziùË™é…éŽ(cRà&ùZ¼‹_UºÒ¹mZþ"–ìÁéÎ(gi<:ý˜Ñ1U·pùoiAÝÝ ´LÛa4ÆZEg,”aøYÆDZƒ¢Rt™•PòS €Ì‘bÏZ’w×—¤I‰÷JÄÂ*ÅXj3$ÚëQIbmIÀtõ^*Š¾]ÁÁ&€ÍŒïö¶Á;û„ôe Tj¥T…bAEºÚ’ùÛÌ– × æã]†U²H¯/öQ5îkÿH;™ñ´¢,*X”úŒy4نȀøs ÉÆè4õ‰ª@Ýìæ›ãðê3ä¶3䶅3ÒígÈm“ cg ¼ù£ËOÝŒžW˜Ò»¥/~&äŒåêÔ/LD7škóð3ȶ˳¹¨ŽPŠnG#„ ‘,’ ›¿{À÷É{¦¤†y>Mµžl‘+žjNä%)Œ  ˆÖ]†ï›ÀÌ9³P§3!¸ôÜ.ji??Æé)gì[–Î&s¿`ö¬–Ã…µ³ôñZžÀ·Þ3"4¸4fønã-t¾m²e™®ý =tJljçÎÌxêò³2̆‰#sìÿvŽ[9ë™&íZÖR«2§XiœÏßÐß/SÓrßu;åeŠ?jªû„àºQ÷àÕHÃÚüÆç`ÆàWÕfæßݲÆy‘Ndeiù~­žô¡£äZÊG&JŸìøt”`]§g!­†£\Ý¥{Kgåþ [º?wýR¼Ï¡r§ú:Ÿõ—"¥Œm ˜9†ÁL ²@YCÃZR&0œÄ¬–71„°ÐÍz\Ã(6²kˆkP©.Ö©iz%Ó€1λÔÓLÚù&šêÎ~ƒ±BþöÎÇ-»¸T¯‹·¸ªVWéi¥EO¾ä8Ñ|l«-¾Íe¶2ÌPù]KÏÔ§„vI*4ìïžM’ƒ¢Òû¾7½Ia²{uuâªT"¶8Û³š *|×Ò~Ó2MøçÙÇŒûâ¯Y@½ú&T¥hîÜYì-gÝ°–D¬»X·á]Ø’6Á a¡*Óô /=Ý 0™°¹›îDOÒ ãÂ…ÝÝ ™ñ@öç‚pÉ { ³1Œ »ÅƒÍ¹ßXC=Yä’Ø­uº©Ó„ì| ßVKÃt|ó ˜Ž{’(*¿­ˆ¢Ô ­-̇!ÎBÖ[…Ãp~¡†Q¬õ8·¬^ϲ8ï­_ŒN1™P™ EÑnFÙÚ ó”߈Ö²¨iðåGÓ»m/Žt²ã»Ñ“1kõ· #Qc€¿nl 3ÂCäÒDµ÷º!Š©y•ÃÌÛnCïƒUŽ¶»X…$³~Ü`ÛÏ<®{‚i†í@@æœB«X([­bŒÅMß&§Ó¹ûø3ÿF‘ ÁÁ¦'5Á€¼.ÛtŸªò÷ðUE¹ÝL™wž[¶mؘWÿÛë€b±UñBpÝèµ.×áö¯úßœ4` «þô´ÏÐh…OaÛÁ1ÎËïó7¡wéäÂwz–îÈæN»uŸMø¤@žxÝü®}ÿê)«h~LNSÊ~ÆÅùJéwÇ‘µðzjdÞ€¿oôJ^4PfI/ì\*÷·ÈÅûI÷“r !„^zj×Ýú (œ¾SfÕ$|ð6ÕesƵï*:'}°wõÍöO¦Ä:ÙÈr4]zOq3ØØ°.vJ3&åµY“!Ê€ ß *8«Ž 毂¡w!Ãz’”1¡QÊ3c/˜Gô,ªšt¢dË ¹LÊH0¹À7Ýäׯ½”¬X.þ™\Ã9ʳ+ª¬æÕ oë••R¡PZYʘ9Ëp ÓLz‰ªIí UŠvËVGCç.äe<óªfÆ«­;xaqq/EO˜U^Ó GÓcèÓdn€šh r단U¢M°í‹ÚÉwìvl |¬nt">“áº$üìÈO*œ¥6&ªª( ñ«Çã{@Ô0Ü6†WEU?ü¤p¢(ªÏþyŒÑÎÈAaBô‘ט4ïá0‹‡ü-ç“|¦ÉLg±ÎÜÒ wå—IèHr_–:‚¤€$•^Fz£–e iƒÛó# Ä!!CØãݬêãoƒGksHJóøÆñþ»r]ƒnözä÷Ž6Œ<±0É»9Þå–‡>FÒL-ºŒæw»õAð}*6 •äÓc ‡Íþ§Xp,Æ,í^‰° i¢X{TH¿¯=É„Èâ+\=ßjZ?K kô¢÷útùD”fµçœÛ7ªêÖIT?HvO…R;Ñ>M7(Ê NQW]Äã;½ˆŽ¡kÇ]¬®™=ÉTCWÚËô•¡ôJÜ „&²V¸¸ŒXl `]xJ®Ñ£Tíá‰ÌPñÊ5r±ŒvA»½øA›ƃ/U°8 FeF°‹Þ"¬n`Á1«fÄybµÝp‡Ö`èÍO\M´›ì¿£uHsiå×fèÒ»‚‹Àv*e'«ºÝ2 ¦©Í‡¸ìt{0¿'–!ä/=Xqlp²µp‘/82¬.l¢súÔnAÑËsÈ—â2œ—b§¸7“‹cŸ‰Áq,ËâÜ©šÃ*œ[–å8 òËØ^Ç“;äµüu¢±ïX•¾P;MQr…‡w`%€°„¯à¿ ¶™ðƺ#ákcüz%:~Ò.Ý6èç4»†2±Žë nJ6y~ÄÝÐC¸q¹hÇéê Ÿ*}˜ãÜGüå¿:ÒÊU!œ‰NEì´{Iƒéü®Ø0b“Õñ8íâ=}?Ã’*º™×RE–oÃtx’ÉðI²bùC·-n¤üþœøþ.¬èÕÅf ÿ‘s¥½Û€ýšn‘+H*€.3&ëê‰;Ñê—ië£-tz¡Þ.È„ éïX¡%DJ4ÎhÉOÉLÕS&`ò`TpÉݧ"oA p7B¥ÔÛÑ…-5ö'4¡àC¢©vx¨U?x›Rp[°¬¾Õº‘ÙäÕ›3†`YEÇc­(¬(ªÍWª¤äZ穳ñx ø[±ë{~Ä÷€ÿÏŸØk4ãvæ ·tÇ9PqLáãñUÄ!Và+š6‘ÙWÔƒU1 äò„ÿP¹e×öQ2f?ƒg7ÏÚA²á68Iìý‡nìšæ®¡›6eqaÇ6_ë8Ï©µ0á3ÛË2.`õ9çÜ9صÍMÛ1mCŸ{ÊÇØjN7ÎÇTL¦Oç“&:Ï~o<ŽGHåöéõºk~CÏ9”¼MdÃø–[OW{€¥XÎk›‚ôåô~h›ºÑœ½¤a覽+Ë»¶© xÿ<ï Yx>XaÆt42ƒVŸƒ¯è†mÖj¦mè(&9¿½ŸÏÇmª:™¨ª1ÑäqÚUˆx¸3Ѹ"Qï‚q’£È‚”<‘à±—×]×Ü̹h6“Ù{_Mvч¿ëàºuäEŸ^'i6¡öúD7 ˆ^â59(51‘J÷ vm,HSè™?¾8Ä岌æ÷pµäs»WJâÕ#®¨®Ù¿6Æð"²•†?—#uHáñ´ ¸V¿ûç¹þœ+Ò÷§ç8çcWÇ‚/?%°±Yš?ôqèúä¼­,§­êXð{zäx‘gUµQŸ´Ò¨AŠœô\Ad.I`5:»òðžx4¼-/Ìö»¶Á^a¿Mnô³iQ™ a„œw*â§Kè&ö,¢¾ßJ{ÜW'[Û 861ÆÃÂå´Ã›žVEV2Y½épü¡p”1“Ò¹âƒ]'ÎáEÌÂ÷¸݆îB/Cc„1DàÕèIG1¢GÒ§)k O’¥$ªn”ÝÀla~[éîŽQ–qeñ0n¿UxïªåŽ í;}³¶uM“ ¬+Ѷõ\ŸC¨%FS‰T°Ð§Iv£èª¤èØ~SÀ…ûŽj¢d^E×É®dÙú‘ûTõn¿\ñ\w¤†úÏ÷Ñm‹ìJ:·Y’¨½O5 uäº^¥ìß­Æp¬¿êñÕ8°¥_;ÆÊó…„]¿ÌÖ’’™¸Uº5<ªœóïÆ­´p¡¸_Ó…½Õ0Ì©`MM£'à &ÏgÁoKó §¬Rsá«ÌÞñ±Û÷—ÄþŽÍ)Ž£Œ(û¿>ìxÚý‘y#§Ç0E«¶1òS«LwŸ_ŧHPLƒh‚Ü)=5IãÈ‹·ÓŽ •4x*®4ú½x¹@ÃOJÎ9ÛQ:IÕcÙTBËæ “ñ¹ä*Ò¦‘ÍŒW˜ý»eqÿ’±ÿK±Ä¹½îì¾sÎ)9a‹Fti‹®mJΉ—s#9{G¸¨»áܲbìû8–œ?Ö.Båx÷]ü€ª`uÝMA1ªiE·Íõ,M³<Ð;¦/¿¶Sñ _×ýFï8Ød ÛþÑx?˜^&¾^&ßíMK[†‚·0Hoºs—JIy´@É-äWUË^·S˶ ÅgÓÈÎ!ŒnévJ‘:#›p Ͻ"¯ë!,1Ú©@ îxÃñ¨äD’ÊIGv2¾=e§”wµ`lò8[¶¿³C¸q¨?²µÓ~úùlâHJ‚( +Тù1NÚñ^*3*Ð¥+¶àõ@jϯڭ»Ý[fW.I¡v5þÖÛ)¢ùÊâí™=^€×ÌáF÷‡zî*ÿ¾ƒTƳ¡±€N£äB„­p>i,{‰LUÀ+[l 6›¡è‚êÂ? TC˜ø™³™:DYàø½ˆâ†¾U0LxF&T~í !T¾ý6\À0 pMYMD’ Öo–{]ŸåÄ<0¿Å )}½¿É0ÅÕjéÑë%–Ë’ˆ[7tD9”%I¨Õ¨Ü°šâ ï{JÕ*¾tÐк­]´yG»ZC¥ï¢ë8 î!0K•9&þÂJé9ˆWÑÉ·ÕkúLü°WkÒaá†Ü»õVêW÷‹ˆQäq9ÞÍ~ì`€îÆLjØ×|¾çºaaCpÂO/ùx:w£:•K¸‡W\G¾…3ß“=·Êí‘É†Æ %¶díö8c’Ý×ô‘ª,îfï—/<¯°´\ð¼Â2FØŸõùQ`G¹ 8δÀ¯1ÆÃZ¨JsfsÆó¾€Ò™,£Çü&Ji.Wi.êÆP\C=?èãzÕ¨(˜ú¹(Ò =ô/b’P) {B5Ý’`Õâ±ã¯(ÙÈg»²^i†xŠaT ÷'ŲÓçã·P×­p§{ªô½thdóªëÉ)êH×ú¶Ä?°;y‚d'¿\²÷û÷hö?ŠÆàO€yñ„3Vó=6`pã|jÔc÷Jv°Ï¹ßÈáÕÙh2®ëá!ê¢5tº=†^W5‘p,úÙXܦð¹a ËQi²mþ`-¼ DV› T4ëi pÎ'±òIË'ëûófËgq¾ƒ—wì[ÖO/M¶Ã9ÞµÖ‹fÿx-Ò>&:ÄðŸO"€Ù&d—€Ÿ+s]ç岡ëF¹ìàⱬ¢ÊOÂ^ƒaø'¹Z´,²–>nGàËIÙÙ9lyÆÿ!…B”ÎÜÿ>ãÑ® ­åmªG2°–¶î·<Ãð‹¸ä8 ÙÅEß0€(ŽSRéG¾‘*ïœÅ§Ð-¨RÍ›Q_|‡¦ Ð‹T;hw‘q*èû|ñ_òĦ¼yäx”a:µq–‡ÂTÔFñŸÙ7 €—¬uë‰+ͧr“1ÿ3;pþ©¦Ç”G'4[ýÑœˆAȃœößZð'ƒaøåŸé°öyÛÞf//o—Û½•í{©ÙDU´„ý²ÃÃè)ô.ôs9¨ÿP/z§n†µ£ö9Èe÷R6®/–¶AÕ„”€êcñäCï¼jèH£8´¡„Q_aÙ—ÖEÎö}<¾7¶¸Õ˜?=½Í•“z¢Ç6fŒcÄ70[›³é|+ÞxiåvLÜ©î”6;cŽ›Ëzä÷3<8Ͳ-ÛßÍ¢Úæ@óZ´TÔƒHUJ8•üÙ ¼$dg„˜pyºF%q&ùØ£»¸ÞnÄØ—äÇŽF3n[[(&òÙÜG)z z‡e>)!§Éœa¶š­z§£~Z;ѩ݆&!H/\VxÑÇýi`€ÎYº¨-Üšá¦<öýFbbî÷¢~¨\ž_¬t^™¦(ÞÔàìoÊŸðeÊ»ô=»Ëÿ¯Á¶ý!NS­#ø ‚‹e:Áï\>åHHBÎ@Ý· —{X~` Â+6|ÔÉhôÂnS6U²‚ i匩"°lYýå@A¡7¢w¢¡,4­VS'Ÿ)u³Û uÝõ¿¡ê<Cߢ¹e(J¡ÆÔîIJþYù7ø£Ä€5ô­kRXéèB¨1šªDúéᙕ¦CËæm´ƒÎÀH·H¥XžÙFeöNfl`R¬Áôä+gÚíRF~…X2d#Ó^‚ vƒý ›ÞÔsŠ¥ö-æ Ãôâíú7'¡)-znáa/@¹}Ž»öœyÀÎ:ñŸÖˆ„’ôÕ®­Mtí¢;eb¡ò($tðlš"«‘XDÎq¼¶KäD>±›|èh¤÷k= º0V'¬fи*å é¯'‡ðà¸p NÍCÓqO/w?ó¤Îü´¬,6@º¹ÀMg:Ÿ<#8S}ÂùvÈgSñvk4Ë{38P(2Á½r+œù ý3¨Ž–ÿSúú7èßì›:+ËIÉwg¬$º…PúÌpK€°¢õ½¸Œm«Nd™Ô-/C³™$Í&ëI³¹œ·¢§tv*‹—ÖÍ¡_¯U%©Z«ûCSOÆüålŸC³™¬!ª˜Qø­G}é[!¯Ñþ[Ñ¡Ö»ºÜ…@6€F©Ša6ä@ïÑ &ùïÑ´å50° }»¹û@`{ójSä¹âÜÜÂ| N9ŸÎ¦H÷"úŒñWK‚ª\í5Ûþ-Ê’¹~šÇ q¡6¡Ðý±i,½#ÛàP›–ÝÅ !z‘Ã×€"­´ 5ŽãHÒÈ1±•Þ›ø¼£é¦mjzyì…²®™Ž¡éÎËu!GG%ËeãŒé ÒÑHÚ³ÔyyTîþø£ @0ú—P:€ij¦m†¡éši}übâ^娷ða–yß­ôh´¿ÇÂ5( =Dµeð)tËR(àLCu d5AÜ ¿ûAµzaÞšü/8eÞ,?ø´?SpóÏ?ÄóþÏMÇ?ùÀî£E _«H~ o‘JÞÌp †@güHï&x˸Šæí >ä†_QÌÙOø9/Ø |Þîò×™>¾È#‘•Áñ—Ъ/@)IéP²zªt %»ß'°¿: #øªù|ÌÝ …mÿ†ÉYáõ£ç±ñ¹øàóªúüâÿ‹ÛT¸:Å}׈uË­4†*¡¿ z¶˜ë(ù¾C¿XĆißh™¦P¸¨KÔÙÏás€õ_°þÐûMeÇ3UsÞÿwlÁK}OMýµ||KerŽ¤þ^Ö¯A0ízàº÷wðòÙd3Y‡·è2Ã+ÉÙ;¼ïžêã•ä,—v|6Y½÷Y“l„ßÃf¹zz¯™$ɼÃAbIü­vki²^O&ÔœNÅ°kø`Æí÷0Îö—½ñT2FIÌM!22»²»4ì&K[âŠCç'tŽ"bˆ{ž§¨¶ßò*DiGiâÑÄ‹R‹|«0L&“ƒÉd2aLSCfcÇÓñ8ÿ²S …õP"í*¡:šCóؘ=¥5´…ŽÒ¡/xQº‰½(M¼(M¤d ³óty׊ ȼŊѺÝãû¥슮t~XÕ” _rÞ›5±ø^*=Xsã¶ñÞ&Kôu!U¡ ì¤gl<Äa´iAÎ'çŠN*DxÌ¿Ô¿c!Ýt'BàˆP6Y€OR8à™å¢Êz5]ÍÜ%‚†¿ÝÖlU4€8ƒ~`{ã] WDeãEE¤LR4…¯¹M4\ß÷¸¨Ü5®èLbtÍŸ›é§UDF¯,ù¡E®t4]×: ·-Ù4TÑ6ÙDQàÌ´EÕ0eË2”Xÿú²þáueÀ~¾«šÛ—§ÉaŠÎ Ü, c5ÃÜи–°4'egɧ@K¸ýËŒd€4˜‚VEÓä%x»ñ¯þÜSEÿR²¾î+Tñ™2’Qy¸Öv,@'ršWPGWí›ù\R¡Ú4ì‰gtš«¶Ã×_‡ŸÛÍã\FGÞ)zŒ¬Pøk@ª¤¤Â²$ëŠ2U·‰*OÁ´îcêR‘ÿÖSÑxoQ€š¢R´©¯œjÉô 7=ÈãF¦wúe•¿E3§ý”¾jíñÀ²[,9KÂñ[˜ïÓ?‹Y¾nã3?š¹G%µ`âÔ%ÇYZ{Þ‹zÕœÍÜŠÄS<¨á5‚°“‚óEÙ“i‘uœÌàub™Áì?€÷—qæ>ñi¯¤®û+ËwdkŸ;dùo}çS°*üáOÇ´H]ÁX ‹°-upQêôæÉRéuA=v-+u€7­ñ´mµ××××Û‰¦éï±Až~ÍZÞ,r%{ ±6¢iÅêbŒž<ë½Iéo¤h!ÂbÿJ ³Çßô×sCîLL¨KÝ—-ÔÔáÍ 7Ù5ãð‰Í͈Dk¥,¤Êw¹eÂ:yNŽÊ„`XÁµ§0ð6K½žu©&L¹µ åï°€×2wfòT©¼܈Ñ::ëËyO}%zP‹ïB×3ªIݽIª<pªóȳd¶mÍÙ ýì½|HQ˶…1ìƒÙn¾ëŸÔÊŠGB^ 1ØÿÕ*êêD¢˜]ATÚ¸¡Ño$Ù£¢RŽ=ïìb¦õ ý~_͉îû Ú¥ï,½#‘ž|×ÞnÆê ³¡¼£ŸY¾ £&ê+öúºò|óÄé¦ Àu‹ÍµÛQ¶yâ W g—k{sǦQi–tæýÄ–•l»Ä-“<¡ËÌ…ñó1÷Å>ŠãjQV-.ØÄ#³{ÄxØȆ,yÂâ:ØwÈ^ã†ch†`šáÀÇ™;;þ¥?Pîõ*ši›<¸i›š\}ã¿â1ü¢w{ˆx„¬l2¯…!¦²ýA}ÄLW!Mh÷8C?\ì*€Jeàš1_( ó†f8[ Çqœ†mjf‚qbj¦}(S]÷²þC>ÙYß8~|c}^3m³Ñﯯ÷û Ó6µ³åv¼´·Ëšá 'O.Ž¡-îï/(¦g±. Uâq‰Ï ëp€ ÞØ{%/Y:i`âé‘..t–°xÕ$¥[Á|Vƒ°©€jiÇiÐŽhB'£’_çy¾¤àÊ\êNй27ŠDê\6R¸Fe/0TaG~l3ϯ,é£/EH^È?û&—–Òÿ¥<áaëñ°«Ót"e•WÃjÇQÒ)Å$]’e<#|Õ·™$´à­’È`dvæ¯;òmZyjëìÏ9– é‰dâWò=h§¯ô·Žãxϲ8ß+Çœ[ÖìÓ s÷Ã%ç¹”lzÎÙOÅá£o\^ιe½¼Eå7Zç/~8|ÿ¹üðœSº%kvÿ•ÆãiÓuÂz­S¥ã‡u¡a5¼n7ÉBTƒ5JÄTÃÙÜ@2-PŽGõùF…9WÑ8DžW±Æ–’3¹Ý¨<¯]Òh} $Fâ'Ç}ä{¾ç%3B¼p\Ötz¾$«ªœË5FáeN }âOÙHSÐkßÄGUõéc»š®ƒ®«—TçøªoƺÝWB1µs‹Áì­ïƒ±“är×k?G5r{|Nc-ÛÜ\Bª7\MAs±SAiwcÈ°M¤5>j¦ûîm†8¡š®ò¤c<ÞÐÉGÇæ|mè"4 ‹Â'ydÈO‘”e»ß7qì1Ì‹ãFcŒ I±s-¬÷ñ|>pŽ‡ÃzÛÛYVÔ´b–mo÷nñ¥6mT[·iÛEàÿÂW‘ŽÊèܸ’ʵJ$=tdš}-óeRSâžô¬W·h,}Yð}Û÷íÚ½5˲gÊÄš¨¨üV=wïs×´á“FmÀhC=¯|Ʋj÷Ölß·íÿÆô \UĚȞ»÷¹_¼±¯ühÛ Ô?1d;3ªüo¹ žÃÚgŽé1qo$¡ûÀêò7 q²‚º,1ÔTØ+ΚzÎX>ó¯aÊ+ù§%¯ûÉ‚/í ùËC7\#‡1 £å"¢†5æ~²ñð:êšáX–cLµ'a«6¥šÌÜ!yûë'ÊûèóØû” :ÆÝ­±€P‹(ïÈ?dtÊøÁ£çI`ÛÞžE(ü›cü2XŽñËmü²áXðaW°Y{ïã.“µ÷Þ*´Ÿ¶<þ^Mfî§ñÙÔev‡žÁé9¾T!ˆ·p[7ãD–Â|U~ù—ÿ ã§Õ¦†cÁóÞ»°ðÞ[Gã0ó·hÊD“™›£ö°oàœ±FrØéB¡P( º«9€rWf“ ×ù%^.—ŠLœŸb`¹ÎFd•îÉéÅš†e—él§¿þPNXøZQãô¤ÑžüúJñÂ*D磔» Mu¨Íú•,dí£Ô<ß<ÌÏ~ö;`9æTU§ætûøúó3„ÿLÿâ [‡è;†NË6jù혟=®u½7>k:|èØåç¸×Œ—qÊð$8¢&·À€ï©z«}œªIh1P„ƒ·2Þö'mÃ0Ξ¬|xü’«êõÙ¤ÆU÷÷dE¦`bNƒ~¡ÉÂÔ˜u5ˆÏ’ä¡qÜô3º‚x"OÚ1ÆØô}æ3¢púŸè¹=ÿü ÓS(ïÏkjù‹1;B° @Ýg¤í”i&ôþ?}­ $ y±If™¬óæ[³Â Fm)Oלó0Um¡ð¹•%?HßÇ<—¨á)ø‰Fvö# HWcY 4Ü¥—M X÷r…˜‚³©ûõF½Ž³ÇyÚº_oÇkËže¥õcîô;Ô†^|p2×!G«[VïeŽ’§KW©7&-ì½ ´~$”Ù§p]ûë*g ¤àë¾)‹xÕn‡SÀÎë¿Ò=tDǶñ¬0S($ùªG$¢ÉÙ+w -ò@Ææ1×IPº\©K7T û˜;llí|ZG¯Doõ´+ïsFTQÁ—mkr#ÅCÐX ÿ ‚´ÂR8„¿Üi|#¡dHk»ee13¶3hJ‚§m°r*ùŽ%; vãRÂúbæÆë¡¢ ½ïÛûÐô Öh—pó°qvð·±Äæ6É£ò^Àƒ–jÁS–Vºl|@¸6±©µûËfÿoØî/7'h³û.€FZ»ÉWj.?f4ûÏ—]e\ß}’)ŒQôŽ2ÈQü™ÞV(îJ³ïrȇ“¿øD3Œ3fדz‡8Þ ­a:h)4[þ|ÒÊ6À—ø¡Ùw? ÉÇü¼Qß켇á±Ñ:I›ü£†$Åu<'ŠÂhtŸgµžÒ¦¾ç ˆMY0Œ¦ž?QӘ‘3¨ŽŽ‹«†Ä†½³ƒ ž[((¢hc`”ÒÖâ<°c¢ªî›åxepv­Õr c[•)׃Áĸm—Éú¾Â¹²¯Ë4]UŒ,xÈûÙ¹â'WQ¦A¤!hÉ}1YpƒKnìÜŽŠÉüÙ-ܸɌø¸±œË9ÓyiÁx;1ŠùÑÊ¢Én¼<ŠóÅšæzAå’.'½ ¹ï J¬7¡”‹'é,ÿ”…i^!¡8»À¶k_E(ÚD3–¯)Nm„Ûþ‹L4Kè9µz& /‰ÓsÿU¿øWz G,ßTåjÐzÕû±Ï™²Êà}÷ؼçã°æ¥®Ùy¦ˆ£54rb£È ˆ×3›àÔJ´Ð²}dE« ~Õèî)ál„=‰k¯’F’n-‘÷bvØó[pAZYH‹]Rû,(P,¶pR.Ê 6‘¹Ï®¦Z;il©Ú,œ¡úþÙñ)¼vS›Ê©®ãÛLñ0Ûo‹€æ»ãŽ8ÄRµM4ÕúVg§:h$m¾t€žSÁ$9_Bÿªòz\¥ŠRnÃCÏiÛÒ0--ÙÉòaóÍb7KE£E7¶j./†cÃa=I0J¥ð"Œ ÙÈJÜ*­ók˽u¿~®ålcn Ž¹þH&IeÓ¬ã3/¨Á¤ÂÉž¨àx#ÞM¢¯FÎ {4µÁ™K¡‰ý:û$çó-Óã¼äù†ÉTkÉÊöv²R«îvOk…u™ÚŠ^Ô5ݶ¹¦•4Âp_UµöràjZ±^ ëÕj§©|Ñ NÓüÐÎéc³¼ ÝšãZUÕÌ °45 µRå_sÜBÛcàN¢ áY§LE•’}¼q;ÖÀ}Tšq[WÜR‘ÞßkØê÷ç¢ P%I ‚h®ßßšû·i’¤%‹0¿„û`Ûe•)XÐNì8ŒŠu†˜@4QTÑ´J5šaŽ¸¾“ÍÿúÌ5v¦5ºã`¬0µ-Bcj¥Vqè³P<µŠÿÓ¡[ã¶À¥ñ¹4$o±šÅIšÃJ4÷áªëª¢˜—Mº ½:ë[ólź|ª zÛ‡‹¿ôÆw5y ž.ê÷·v†§!´D'ßPëÅ´h2­ò…÷µÂ:Ó®×jÍs| ¦vòŠ‚;ó[Šrfy.ñj¸¶!ã ´ž±J~1&Á8èۘɜaæ=yë´c @ö}=Ñ¿àÝ@S”¿ÔüÜqLÀ™íëvœ°çäŠkV¹^ÿ&vîú d"l)¢U†¿Ñ#gW=½,ü]zhâ,"Û=sŶà’Êü°Ö:0.ñ.»Ó_ÂKË…PÖðÚ'´!Ðê‹Í%³¶”Þ¤¥¶Ì‚Ì8ú°€TªF,~²‡‰Š&"2ãIùõi‚ήÀ"S|lÂC€ö&íü§CBê(˜»[™oLRî¾oºÃº+EÔõ…zӀؾá0 ֞Ѿ[Ùi=ÕFû“ )„ ™ÚĪ¹bh* z­‚s¥S¯õJ°†©,€³Òd¯öQÅÒ{ÌÐ!ZÎ |±fw}-]hAè±ÿ.´˜«ÄúÚ×pjÐú®ïT6¶¾«£äØutÝ£áC¶Š žÍÛÙºöý>./붤Fˆü×°Öw¢ö¢" °@eKêaø“Z®þòF¯W)ƒÍ- + À"å¥Öê‰e-P®ôzyàž~)®¹9¯L P‹]B%J“ú%Ír9ƒ É\EŒ@>UÆúÖˆ «$îIÿH¡Ðz˘®/Ûó}aׄY®ç¡¥TïhQÂZ]í0£õ•¼ßnó?ÜW]m¡³~íäÄá\è¡'KÙлm~8uz@CÜhs¨ãù ¯^·=ož(—ç÷Âupûá%³ØÜ©Œ´”ë5_AÂ~‚MŸe²G½eØ,â¨Ìi#´ÑŒÛ±à´ûÞÞóFØ_nšð³®¦ŠóÔqŠ³Ir äwz»eÇ•V,ûØ)˜W[‚±ö°†óÑ7ª¶¹H·a™E0(ög;}çý^qãyÛTB­V5ÕÌ–·¦>‡MLÅqBî&Þï6½X„C \…(£¬I41ð´H<ŠOôð[oÛ.?^rJNùÕ¢ëö¿4ç”ömE–÷{¶7Q?x Î9ˆJΡxuþKÌÈ4iã)„vx&À0 pBÞïˆ5aþ—Ú÷PÝבÒÑ‚OÂØÂìÞ•,CÛ;~\¿ß åAŽVjuìÊ2AEâ©ëWÂu>|dô‘ÇéÑYnø[Ü-å˜ÍŒxÍÅì4Ñ«qá ú!® £Ìˆ¶²-`Š/Å­ÆhKÛÍo§ÅÜ9T¶ú:‹Ê‚`ô¯½’a™×š˜ÞÉ’ Œ'ú•ùï+¿öÊÆâbã•cƒÿw¬–ƯzRÛœR¶mxNRù­Â©â(rJMJND‹·3äÜ[Õ­¾ŠZ„úÖ# ¨yÉ ,F$f*uñq>ÑJ¾ » šÏV°üó,~áŽ; m”*zøëѪóñÊàl¥ôóT _ûÚ©ÄH°›K W?/ ëÑ]èWÑ×8ÍBiGðƒÛq[ ?2üÞ#¬—e7ðÂzÅ߆¯(YáVÀ:ý¡íqbºgÑÆÊ PAS¥B±‰­øìÁ¨ùȦ#Ïe}`}ô©ÉJÄéõõIUIIRxÕt‰ÈUQ ‘¸fÅP$IEIó1ö5I‘(FÅt‰è5¤„5s¿ùþˆ…w(†L ¥šÄt¹j‚Q•u&i”*Š«¨ªâ*†L%ùõÓd)?_ô¸¾{kÔßÖAØßk̾š(©N××ÖìÔ—ÑG¾+C±=B„ÄÔD(D뺶E–*f\=›¯ã~ÚÀÎÔŽÛ±ï]f)öŸŸF‰² ªÍ W{W„­Ã·9ÃáéžÊ+MU€@(#1àáðFx"¾>›‹†Â$€ª €JH—nY[cëÑ@@ˆ  ¨@˜Ê7O T–Ñ…«Sø5~ïâ"üÁÎÎrV’B¶`gõ LyÕà…YºQÞø8µz>YÎS5ëb’ž&HÀÉ‚yʶM€ó'Ž-œ –å&õüš´AÊØ:=ÀUt^‰{¡OÃTÿW–kØCB_Ú¢ÝCü4©—,†'ù@Uu݉)ælj*L]«ñVáC1°-÷ù`= ®ëÜòú!ª\¦ôP±Šð®šª‘¸ô} J8iQ±j&y/FÊ ü¢èÆo'2ëZ3ÉŸÄs°y|ƒPŠª™,Káàó"pðêûoTóHgü 9›²ò[A ¦Îy^š÷’jë— ü“8À¬ r}d¥ô–+}¢œ·MìN[FxðNì¾£û’òeÀ¼ã¦Ñ‡òï²Û-òÜ0„Êÿ-ðÎÔ~ˆ× AVãv•1a,ó0PI†N«, !ìc8]þƒçGV«n©ªªš$]\Å9@ÉTUUµê­V³é{€ýG£®þço¢œ[í¨`["|2j[œÓ›DË*6ôm ËØ?±2h„¶-Kšn˜*ÏTÓÐ5I¶í°1X9ácY&ýö8ÖëÕÌFEƒ÷4ÌZ¯wlEA€ßä“b .%$dÆ#sÝ,Z¾›(̲k}}m±ë:\",ºì?/„u]â\0Z­. œ|7ˆ ŠÜq»‹këë–c[Ly]¾®×Ã]øJ«eœK}”©•¡ÄÀ†Aþv•K¨¿Æ²a~‘èܸPÆpèм¾ªBŒQÙé¤ óÅÇ:ðiƒ¡ T_ÿÀ‡._0¸N:ÌçÒŽS!„ºz€ÿµ†‡â¡c´UÕbÊà&… Mÿ™mt=K¥ƒk¸Ý¤®¤KCñ>4Ñ€_Tfáò÷¼ÏwX**’KÍEíš!jiºKH×&^Óî^“ÈYZ˜îÇUèu9ŽB4]ÓD‰ØÍæâ³ ãðã+ПC¨y:“6išÞòýÈ3'ñÛú}šàâëÖRr:F^C:· ¦ŒD’LnÒ RÏÇRîÿŒ~:Å–g}yÅðk¥ÔÒ)©B–B™é‘I­5´IœA°.U•âÆ¥.Á»2-õ} †`ÕÂIqÈ®ƒuA£¾ˆ1þª»îÊÖÊ® ôz×íÞËñ2'Ü=r$n—n€Qv Š‰XËîºëUùgãÞÝëz=-õlOBÍíøÈvòt/Ñ9ý›L…Úq¶0M•ÇW;Jƒ®<-=Þo2r<¥ölÜ.Ù)h”bîLIJ†Ã_‚¦œ(䄽ÑoÏýºFݤ¶ŠŽr'é'4V'AP´ Å»|?È(мÔ?Šì‘çgÉàÇ춖{ É,cÑEIo¹Õ5Çk1YʲCŒʲ%˜xŒòÅ9×Í)ÈìD3þ†\gn‘Sæ}š¦ç™&ýà¹7¿¹ãù#ßëÀ{)´ÞNüD ÎîôÎÒˆŸ^¹Ì³]ïRðõ.þEç‚y˜+L°·uQ`½D}ۘ›ו¥%E碱Þϱ¼üp—·-âËu Ô·Í1b´mú5¼ Q¹Ý&t†„åwËÈ×'ÄsƒJÝÉåm(®eùÎ:ìVýœ‰Sº|o@TÑüÜ ¶¨`´Fû`ª£iŒ;¼¾¬µR¢mîöŽ Ä©2Dû¤ûå6 ÜFÜvMb™žÍñÒÒñÃG{j+Çò.°Íƒ¶1Oa­îºŽ&Ü8“RšÕ¹LìÍ4jèÞÀ®j_#‹|Ï¥Š—Îô’ P£†/Åò¹ŒÉø¿IjûáXÀßWV: tÑ Uˆ\u•©Ð-朙¸n¦~â´š8YɲUôA1?+ %dN_ÕažÝu®‚Õw…Ò¤£ ¨lqŸlˆ¼l†lüAï“«”´îtì “ÃPª3¿¯¹Îˆ±¿7ý —ÿ&O‘OØåW­ˆ–iæ >m¤‘¤6á™êF„!~NÚÛ€`{§ÎþÁ²8?õEcÿ‹§8·¬=Î÷¦ø›ÃÞȹe¾Oq®ÙÚ²öŽt›ÇÓ׎³_"¶€úíÊoºCû%„¢ó·”øôÊI'Ò—”•V:Š:`n%}Ú*æ'áN3Æ¢áãéfÇ™´a]Õ:sl)˜¦¸èd+Òl?y¨Šº(A‡Ñ5è&ÏvìäÒ¨®f‰ïeÑgˆ9ŒÚ‘«öºˆ.^ “ŽæÄÄ€b›ª€çÔ8¡$–­ÛhÇí8QëáŸÍt˜%0¾"_ª¯•å× ÂÞ«ÌΡ¥ÅàC—˜mZ–ªZ–i³?zU°¸t¨c>ýZAx­,Õf«x‡¶ÚñUð`°¸´›¯š6,5ò·;6êá½C+î¬e¨÷k¨“­ubkxo¸Ö†«l ïîMh5Gý±¶„†ý Þj5 >@S€{^ô0 BÏ‚ÁõGÇ—–0dJÎItÝéœXö‚ãKKXù¢g<çVÜ/«³+È07>ÆKKÇOÆ@®‘ÀX§Ò9Be॥ãÕÒÜŠ‡=G¾À°ïI6¸º£j6Q¥è´eÒ.ŽågªŒBof·¬·ª«g¯|»GàRÏúUTÚáܲüL_k^Ï;¬! sþ¶nFo |Ì´weÚ±,Îý-CŸÌòÜ–öÐÛd†«{×Ä¥ Û"©“šˆ$!q&È"45ôK`Yf®ÉPà°ÂÙÎÁÓŽ"«Á–¢~ouÿœNF:„§h¹]mâÒŠÞAlUS7nAÔÌm{aŸÂèH šŽ> 0̾ =?5t©UõÜÚéP;jMÑ9=þ×è˜#xÉÀiÛnðŸ ]f"{ž¦5äÁ¦Á>AnÄ‘¦pÄY&q ÐÛšó–°…s¤?ÙWA·ë¢iõ]åYz(><öü Š…q;–†¼ƒ$Ä?º(Æjô„½}ß)v¼¿ÄËÛ“Oy†B$¹;žÿsÇæ1ö ‘‘ìúæY-#h·×—ä£Ì¾XÄ–‰YïJ³?‹–ä›-ìx­MUU"$ÙudÆsóìÿ®µÛ“¼,."Œì«†_ ŸEzY_ çv„ì ÅÎL·”çcGÿP…¤² -—ü‚›¡„2–¡Æð@„Ö&ް°øøÂB¼š,bã à_.Vª~¼¼†Ec hˆK†B]ÛKëK{?ýÉv%P1]½~~…½¡‹/ÿ¥õ¥–$Ö!¢M Æ^1l^~µRÄjtÔÿLÅ*^\Mâ……½Âf?S×]&ôYÐmÙt£ŠDxØå&%æòÝ°M7#ܙ߂=óþ÷¯T ”ËóµÀŸ›[:¾´ät"µ‡åÙ>×öš³l¥â9ß³³ú0Q4çæúeà}‡uP‚tS¨ä ™ZÍëdË/¦i¢|ÿL6L!dÕÎ^¢€ãVaèc)ÿ1"¦Eá(w¢Ï6¾•Þj—|)U½dØ1ÝZü;o}ë\}m­>Ç—ÐÿIœ9ÕѾ"éªÕŽ­dõ”§WWc°™ ‡ÂH;—P¶|Ð-=Žb ‘ÒÙÂzßwâØñç¼uýzJªêW«þ»ƒÇýjÕWÕŸËÿ¢p°ÕnXÐ.6ÇùC.mCY×=ïÝyÜótýçòèi¦w¶& æµQrR«#¦§@:-M¼ÈJ|#@‹»ü:—çÆàÃÂáµvs Ì.S~œ»ÿÍ%-ß6ί"ëÊøµ$^ýmø|)æZyŠÿÃ$ &åoê¹Ìºì¥Œá1§Xt^ÃF·Ûx–©*“åg“#G’~ÿ…V¯×Š¢KAµxÞþò—~_Q4í’ãÀcØ/4ºÝF>+ËLUÙ³ý~räHòBµz½Ö%Ï ªÕ`ÿÇ+°¯iŠrÉ)}Ó”ï7<ÕúºP­ÉVÝ;kß?O ø3:çœÒ;`Õ‰¢•œsNƒÙå  _ =¿<VX-YC7àÚ1½›°í?‰ËZ7o~7‰FÆÍÊg…ŒÕýF)ë^½"¾UTRP9ó0dMU‰¼¬òtg– ý\þPŠS°j›é9WÙ?·+‘y˜c¼·É_¶7Ðí²‚¶Ç§¸½±‡V½®^‘wúáPÔŽ¶,“†O]WU£h.pîƒ4èfI³UÁ‰Š3J“}¼­«ªáXªæT«¾ fÔãŽÒm-ÓwàŸ-i^þ™àßp„ýÙߪši©†c'(ØmQÊ_4ÝP¯UTðRÔžAe¥¡˜ó>ÓÚX4 Ù]!n9"RѺ‡ "Äa„–nÐX ü`Ý“Ñ:ô  üàç¥jcMq]%†t—%T×|O=‘mp‘SåÎÔà^îëþcÈêº$Á×$A¬5Ö¸ë: `"ùÇà° ŠN±àœÈ6¸$_£ˆÐ/é\Æ¢0Ìð)·'J AU¹’.×fØŠ";ßd^Yç2¦„`°ÌáJ` T4¿×Ë2> åKà—WäpÕ^¯¶TÛÙZÁ@ñ~²fÜN…(c2Ò&z·‹§¥KŽoÚoäÈxø¡ÝÀóø®uåAGaæ]ôpHº'L™nhÏ4¼Ä‹Rñúg•EiâµÊ êµÍä"ÝÌþ*S*Ù·h:å£Ñh4šŒFÐ-kÔ‡E|R;¬f¸õÈbð8!`@töæg×>\x¸`ðð-æ<çáÂÃzPjóÝ}lž56RBvl¨J´…ãè‹&éSnHIàéÿ"yÛÈ+éÔãeÊ9甕fÏ{ɹñL—‡ª…Ls‚ÚŒ¸²â Ó%lÎC§äœsXê÷䜣” ô¢‘<ßâ Š`Yùsia^ÙŠ¥¬F¢"ž‘9Ðìø/f“lÔä…Žf¹•ðd»;§Ïs»xNÀ6__2ƒgÓžk5Ý7‘—÷t¦2žp¤O9 dÒ"°N0^=zMcN™wu Zì=>ÍØØtÇ1ÛþçAcÈ!GfÄ8ùþgÄnìãý°d¿)—LñFÇ`xŸœ$4äØÁó;ä¢c˜ÎQÐ>+±íÔ6fݾ üd’5˜¦>õ*¬ÄŠ‘•XòÏÁdãÉ„W^%¿Šøx‹6É·P¦ØØSáüa@—gÈÕ‘ÝW!;NQ8>÷‘óì›Ý0eãq¡ M‰P@<h|Šû?ÁAó’¯ñ}Äà¥ìѳ€ZµðÅ ¤,XY 1¿š¶à8?p°aߨ¡ `ùXÐpš ÷ þ,ï]NöÆåOéú§Žß7}ïçš±e<8™É¯Lï„÷*ä~ ‡Úz…ß5o›dæ÷–Ð)¨šäeWTè^8ÆÁ¹®PØüì®-‹i ÛŠ®+O0f*º®ˆˆSŽ¹ ŸUt]Ùc¬ÿOo.m2¸¸ç‰Y&câ#â¿Îï]fŒí)º®ôÿiÀæÒ&¶½œã° ýëq›J B¨Ï¦ZÀwKw2Çs®"“2oïs<Ieÿe×ÀS7 ×…ÏO Ø#ÉJÒ/Á8É$â?XÐO·D ˆJ¢Ù’b©E.$éÅëy!JÍ•Ÿ-˜ÈlµŒeÇúì¯õŸ¥ëW ³ð{~o Õvno€OyŒBgÉ1;@ׯLã÷v„0ÂW§ø°þnù u<·² .Ÿ —YÓŒÜñ@ 4‰¬•´RMœ8z¤(Ö6~:¨ ÞªNœäLaªm;5Ï#"ç"ñ¼ÚôÛV™ÂøÉ0ÆD±ªŠ‰=-XRMÐ]xm¶–ç#M”dM¦`ÙÀ¨èã(¦_ •5Y”´Qžk6glvY{e3@Óê¾Ñüô1m^ž¯;¼ ê•Úê:À …gï¦ÜuðobFYjÏ+\AD¼YéX¦Êr òÛ &Ë¡5٠΃4wù—Î]ŽAU»ë(ü­ë]U¸çeT²³¤Ë./SÖ¨¢<Ï…_ŸÌqÇ°ÅÊhçy6r@›`LråDb¥Ù¯/6Ø׈W…±‘kõMG½›þ[_6Y„¨œ‡þa›æÐ:ŸXòÃ{‘ʼn62¦ýÎxL{°R©‹—–Ž/ÍÍùAm¾\²X­øae|¶Ý®!d†i*D‘lÌÍ™¢8H*bÏŸ«lïe[,jö†­9ø´ÕdÍñÛ|Œý·é¶&ê'=ö€˜fd©_Žãþ4w-k÷Uø—¯‰]Îwq¬‹è!)ƒ“Îy¾ªŠ)j#‡B •'…S¨ØÉÞÿøh=Š ¢hÝÓ¹9hžÑ8íÙÞpÝcìÆlUÕYfBUm³7Y*üß›ÙËK‡w8¼´l'Ä´‚ŽÔÖÙÓ+ îÝ ,“¬!Üptm˜ãœl¾#ç X¡Žã>¼èPòPžöнÔU»@»‘“ËÑÊ”‰üN €¾8ì,—"yÎy(½¤[©¤Àˆ7ªäjDs™T¯/öëa˜<ßZ¼28{j0 ëÑhš[ÒUMWi-‚Ïèª&²'ùÑ“Ì~ûI¢L-Ó{r³» wË ê⿉|ë9,-ŸÔºÝÍ'=Ó¢²(ýÛŸ@t3×µyŠdTDm43¨£?ð„_¤ VÃJ£ÄŠ ï“Y‰¾ÆÓ—&@÷½§ÙÉ«(¥’öÃxúˆg: @;=±섳 ŒÂ™Ö©V»ÐÑ£æ"óGjC1;Gjò¬ý€¢ãÎ0í*xá'®=Y”Þl—É:íƒa!ó–œs¨„ÚhêH'¹J&ªvç tv¯ãI`G5ÒJåÝ\ñ\kHoN:EãÔg9†'ŠXDÈ™ %n•‘ƒ ½„ÜeÂEN* ]'…“®%õÂ×½Yôr;”lFe‰|W&$¥³õƒ¨`V¬¤….o¸#ÉOùsJÛq4õ.„ÞU'ÞÝß« ’ýôqGï.ù‰{{³PP…,GN1øèŸõ]s;v¹?Õ[|Ã[4’qПM›¯= wŒÉÒ…Hèx¾üGÊäcé}wˆ2ƒÞDëé5ÀpóÒ]!ö²ëÊ"ƒ4òÜ.nòæz ÷’[5Ø,0–±„~€¤Àc „‘@“‘m!Ÿî>=ÔL}„2)#Ó2AVkŒgY׺¦‘´^?Ã}¤ŽÂáðàAzr•>°§LoîŒ&iÔ#'ú&ÔÖ¡»#C…Þú¾hû™_¥©rþ ª½êbÑ‹…‡ÉaÆtÇ·gh™Œ³,”cZO*ú -ëη/¶©aжèÿŸlÆ–›SÙ>ö¿_2“í`U …ð'Õ°’> 3䌾>ðçIàµSK–4r”×OEš„uO&uØudÒð=ÐtïÕêÁhM-98¦â|BÀÏ÷ ÁóŽ­´šYëÅ`ô“¢(?¨Á³Ï­ü&ƒèÔW%ÃRC©¯ä| (‰äŸ*§âÙÌKÔã: &R(å>qQM0µKOŸ¹<™GÇö1-÷äðNþk½gò¿R( ~ÌÙ·òPnû!ßQðqvr95@RA äX:Bç¹rêw†ykMXr|ÿö«0WäIB1 @y!÷ÒU¢Ç¶ ÁÏ¡:®´wVÒ ”|³ö^Aî3-o÷U þÖˆ×Ò¿ È»þþA­Ù‡¹÷›ò;ùÕíáŸF;YY0|™J¬†•äžÀ.ÙkT_½FAcŠÂhü× íßð=ÀÖOI™xÑK€BÑ›øcè,Àó®Ë“ÌÚù•[3·äŒÊÆjåx¸º:%Gf{+ >¦ä<³r‘ðºw78˜Xݽ¬gI¦Í«"ŸÔàÚO} 7ÖœFÐl&cc›\0üœRo)ëLþ0i6¹Œšy!Ú%ÜYy˜}~uP®½0ÓòL€&eÔVÞXó!ÀôVrõJŸ (­‚¯µ“Ï"GçÐmÈÏ9 Á¦·VE_IÌ.‰Qè@fÍ𜠠T80i¬iWÕþþ—¯á½•K%ס´\r]JËå×+÷7n©L©ã–J2uÌô¶ãk§ïÏûÂhgó í–Ë2qçG³|*ºç"ÕI ¶ÀéX0¼ê—öÈù/‚_vG¹éÌ&HŠ—p¡¨îÃýŽÉé¾Z,àKE"0ªßmÌjto‹¼„Úé'0‰ý͈ãlH£Ìê?ƒwܘÓ,…dž?úüŸ”ö|¿A3„âƒÑÃËYËò?éïæ*¡–ó?‘YË6‚ƒòií¢[ñì‰ùdžZ4B’»uÄH{Ø$¥ÕÌŸîrƒ 1Gô§z»= uXx9¹"ìy¬¹Öp‘9Çp*¹Ô?Úê³½`m—i/`‰ý¡–°4÷{sÅžs3%¨Ž©Æ¼‘âut$"¸ÆX 5îDJ8/ææ_oÓ8²,S>ƒ¸•£[µóDJ8‹¿ÿQ¼çvÒ·£Ð–åp>M?ð­ Xtkò+ŸûŠ°Tk·Û³ÿ±þc`k…ÛÿQ¾ì6j·Œ£â|w± Bã•WEÁi,Ü6{ÿá~•1õïÖˆä¢Ã6pýêMcp¼ÆÙ½ž¥t66öµ| Sܦ£ðû¹ñ}/ Øàƒk3K\ïà wÑ”Å:°Ó¼.Àa˜¡5~¤¦½‰ãÆm·KÏ•©Ür‹b†¿Zab3FMk¬³*úc>HÁŸzŠÏ¥ë^9jÝ«&ËtbKH±t'‘jÙQÁ4¡§¦%œÝQ]E‰³/Â(¾z€Cø(ª¡Båè¡:ø›ÂÅ2`ÙWát!Î Ñ?Ùö®S~˜ýŵ¹ú×½Ù¶ß锊.aï¾îÇáíÿ䔊î®s\¯óÍN©è¾Ó¶gÝ}ý;µï՞ƆìiB x4üÏËQE‘£†íx¹…ÅeÆìOÐ2„X¿Ò  ;jfƒ)hujª[×5À~Ú6ìq&´árÆ=ÝGŽ±îá­>æ'ÿÀ<éa8¿C÷!ðAÛ0Iåøã휇–RŠi÷˜èwñíçËÄUY3öÕRŸRÜ]8ªf€ÚQTf¬t¡ë0F ¦õ¤Ÿêû\›·ï÷•ðÃÕ•~ÿ¸¶¥Îp\ÌøçŽ|›_tDâ `¿Kòl‰a˜ÅäZ«˜ï´óÌÌ’ üdྰ2·{ŸßÀ/à^êÚî°5=85+«¯¼®38Ú‰°Ì¿Ûý† ß7;/ò&¹ÖµáûØO"è›í÷=lêJÜÎŽ+d#Õã#¦Cà!'ÀÀU³‘™ S¿¾(­A‰ÉžÔèÎóF”á³$¿ŸPî± F3JÕqÖ1bæ;™‰1fk€É×ó „‚›?¡•yþX@˜[r4zw•@Òµ4Ê^üÿš¦ñ‰+©ZömU×JšëÈv#\ДsÑÉpíO\ù`Oá™—¾¬#CaB(:/•›ûûÍr‰WíÔ¦šÛ.•”ÊÉ] àˆ¡Àfõð[ðJ÷ÊUxQó(4çg¾´U蟀'Œ8OXE,5Ó¡ùö{êãu]’è#œ’zó7ˆÂÂÊÊ`в%*ˆ¥Ò!‰@óVMÓ<ÃÖÿ¨òžÚ®s›»š¦ÝÚ"*•DJvk0XYYÄ潔ʥ’¤ÿ%,…ëÌW¨ç¿£l,7=§#Xñ >žs˺ÈùE^B÷<Ùvþ¼eq~Ñ«Š®c!»­¯%<̃)Xݘš³Ñ2Šó·”ðßlfž_:NF®s]<ÝÒ$%ÿ¢÷Ñ¥p.r¥yJ®Ek£rq\D±–C‡k)p¼ÌàËåARB#¸÷(Ç—–ð2„dzªe ×Þ–KKÇ¿kóår\帄™¾f&‘Ä5$A ¡‚öGŽ@‘žsšW@}ÉÔbwæ·›MÛŒ5ÅqüS/øžQÄ ¹ÀgzÊ÷[º6˜¶ð4]MÆM£üáU– ݆C¨eÙ3õ&‚ˆ«eùlÇhi)ciKìŽL ù­¥0-—–’di©XšJ©•ÄF@Kú&ªlCùoeºº¸X*•J‹‹«S‰Ïrn—óK÷Yx2éH^ä’Ñ3ðú ê×Ë!›âdFæÃÙmKå&Ηêÿ~è ©þiè)k:·¶:–ÐÕ¢'àY*mèªäÒ þ¥Hî—}Ķç§lù©±‡:zÚ¥Áqb™ dXý¯ö4këvìÝ,É}øõû'<Ù‡Zf¼¾vóp» ºU²Ã Z[ôñe#éw]lzâúEƒ—ýfûû7¯­‡cê è.ñ1ökUÀþ7€Užéù¾ønÃgÃË40ÉÞh¹úþš¦éÚ¾ªîkzav©—P~‰SB/P]—/³Ýb*¶Úªý³„NNz öÒk ¼K¢RÍž³1’ãz[¸\­˜×0®qÍ §s§fy†!£Ùg…ªÃË„»GpIm6U‰_BÇÜ‘½‰!Bì ú6‡ðÒ>¦Ð éuA~eéjg.¨ÂP½à[P+ÒOÏÉ;Ìd ܼU¾ý‹dp¢ÓùÏCÄ0ÝB&Ð%á/!ÙŽãÈ8c_Ö¶Tžü"=Ö|‚«3tëòÝñÀ—8Ó\¤“@ò5X¬WŠ ±Þ¯õ8‰Ç×Dý£ ä1§Î!š”è∾{®iÞ)O7Lý{Ÿz˜°CŒl`rƒì÷×LS÷Nyšö¡‡O=¼6¶s¦“^iJÙõ&6ɇ¬\ØØŽ#næ‡BÄÖ»Þιe½”ÚóG†¨2ïí–ÅùÛô=L(iBÜ·—tòV„ZüžH<#þ—j&vWóìQ­Î5b¦î8‡è`0ZŽ‚SlbQPƒ‚ç €¢ýwÅЕwjÚ»˜&rÆfª§ò>2AX%¬›Ð?€ ˆB™ê€hšµZok¾ƒ· Ea¯SMS}½áÔz,|Dl*@Ò–€‡Œ ¯¨[\ÚZ>ÛÕ ø3ÄC%ÉUM¬ù/NÞg(Š¸&éïsNQ“[cñW×DE1Þ§K_Á‰íHµ…‹«[8TrC7Á ×9‚Âin©7v¢ÈBË%ÊEY h<ö ‘÷TCÐ uO>†4e8“é3[œ4Øu®CHñ-åo²{¯¨1j4CÊZ•0ö\êݧPÛÇyœLC }oõV„2×ôžVo‡Ð"0_•s¶¯nÁj'?Œ?6@rW~¿¼›©†Ã*µ©Å(rßp7øûõÍ™7¸Q´¸ÎøÎpXYÌ6/‹¢)Šw\)î<càùsSæ*Þ\`}gqÆ  Ã7ÏU“Là·‚G#ƒO1ŸvÃ…éž è+*×ëª& ѯw½á\K^æ\“W™¬Ø<Œôïù¹ÌÛ ìjY(û·bV™Bkn(²ÿ¤¥R°bêÆ^j/¬xt1Îú¡9ÔGïâ°#ê?ŒI´Ø ‰.'ÑDãá•TŠ#(‰ëôÑ ¿ƒrHÀ›\#ðw\ö¢Ä aöo• 膡²,ÊsÍØ0d €cM’DIÓtAJu(A) ¥Š!Ë‚E1Q5ªù‡½EbLòU%¿–ÑØ«3`Af"¥Šæ¹…®mPQ <<ìnX X@ ‚Â,Ê ¨£ºnÐ5- v¯×®:‘0T¢ÏPe>9Ö=ر«–‚«)bTnÜZÆCD)Ñ zSGüèîÕs‘öPÂì.)¯Þ=¼&xÞ¯¾÷ž‹ 8¿Ófù|Aé=ÚØ(?ûl~¤Æ²ðƒ“ú1têläg ¦ì¨/Z¼§`»åÉž³Eö÷‡S•1ÎhرÐ o±5ßWL†’¿ç0:ŠN&^™jà'–Þ¬ @q¼(|#WŠâ ¡ñ6QÐø0Ai´âÿ¥æ×å   Ë 4äõùewå ¿îõ| t!_¿¶¬š/¡”ʦ ï¤xõ>|%vøŒýçžó±ÿ™+£?ÌÁ+üÌsáÎÞá3ÿ´¼œW*ùò2ü ñè¨,cÅKî6“gMEŠR¥¯¤i’‚þ*YOA¿4S•ÞÑ|<ö ‚üŒ¸<ˆõQ’@pr”xI¬ËLwoÒ(05úì“&Óñx¿-”8åF÷B#3ËW¤º8Ÿ &ö‹¯`&¨‰Ž¢»Ð½4\‡ÀÀ}’êIk‹û˨Y†j f20ÁCgó6ǯãLVd€×¹‡Mbú‚¹r0UÓ•öz]S»ð c|ì1ÊÏ„QΘ9Jnz§­F/ÐQ£uµf®8nÇu}E©š®06Ë÷ÝØìçØ=SG惌ÇÔ…˜œ!Xãply•9Tï¹Çìw:iå9=ÁS×pŒ(*=p"ؾëÁA¦7éïÄZPŸ[ÜŽiDi5'9Ã)ó¸åÈé¿NqÝ|ø·Íþøð¼‡2šý3gì´éŒ 1¹¤Ô"^Š*¿§>÷CtÝ…^ñ{>ÆDŠð`¥óWðì}æ=—%å÷÷Ýòƒ¥Ýe6SÀUÏ}£‘ví Û½zµÔ»Ì¸µ¸ý¤$éì%¥[‡SŒæ,õŽëílú¤M9z.•Ì;Ä;e©KP†ŒÚ„鋱êj ¬Ô!ÔÉRáÅK¾ªŸ´0‹¸æ¶)f̳3i‡Ç\?€ßâFŸ#ƒOÀT~_™ÉÇmê³ÿž¬  —ï(÷!]cÏòõE¦U†1ÉdÐ0€W“æ©ŽLevòÞœ£kêHù•^ñ?áåLÕ5V;Z³}[ÍXÙ`¤¯÷Ê^[ÙÎ7”ò4ƒ~¾}´V®d(¼.K`˜€ÊïHW8ÎYö†`Ȫð[Âo驪 ·ÎO­oðÖ5QxB$ž?ïÙßæV±Þ€ –¬3c™ÂÇÓ%ûÁªC]¯)1’_"y£Ùç?§,‘ÏÓ™Ÿ~@±Øš«UÈCÀàgà—ªV0V•?>Ø4‰cäÂÈ÷þßp€=» æ,²a %+v0ÂÙõóÖ]U±ìñh/Z ªÅuÞG×qO­Ð^ˆè¼ŠEÓtgÿ ‡Oé‡Î'EÓtµN:w«œ¶® *oj’ärÌR5i÷‹ËUÒHTWUÅO “pŸhf¢ôt@ávrb$ŸäTh[¦ Ü=)’ùiA³|絊õŸx7ËéW#ÙºÒýÇëšr_³•c;Zž½[j±óóÜ:˜™?Þ †R|ž5@J³w_äÌ+?ÆqÈ#…`¤RÊH{0EèóœR “õBêùÇ'ÐóóH}¯jÛÖسñ w:xJè hæYéâJS°å* M¦íî)Û¥]ðu½\¢q8…ª`ì啕En¼x›Ç¢*믔›ƒ¦ &Áׄì©ýän#ß'ÙL;RúˆÍéúªU1]G–àd9ÛÞGgÐýï R± ^ì =ËàBò|€·­!ÝÑfCƒRF-á{¡Ø}LéðaIåÇ\Leù¶Ûd*/û#2]Wþ¶L®ì¥úáÅ}®Xþ¬®W™Ô&rÅb\ÈøžæÆýÌlî¶õ(¶›^@ÍŽ¶W’ZuPŽ½Uw–%Iã晕.; 4¦ÀDõ·o1E¯ ήt:Ñ ¼^•ëeúu‘cUé€×àû*Ø…Ô Yná0:4²ã¦lÁ¤"ž3éõv›¬d{½Ñ§ª\é”èOÉx¥ D80|ô½æ€--¡ŸúZv*7¼-ôÈŒõ€P»,¢vüA]µíY;‡y\)‘”o3ÂÌ` qÞÀ+í•üÈ1kfñ`>=ól0 H[Û«ÖÁ(¶BÌÔû TI+ÜÌêá]† Qéøì}›7»#Í ÿ?ÀøÿHc{Ý¿ã°%£ÚÌp+ C7%¤˜ ~ÆX˜E2±M 9”Ü¡¯8„ò;®%ÆOXJÚÚÞ,ŽÐ)P­Ÿ«”x"]G"dÿPWíUŽ–‡»âSòé€baQ»ÁºÏàó&¿­ Úýþ&žgf[.E³Ôl¶ƒ ÛN9’âõ*ÿÝ]nµ<渚Q*6x@~yŽÛxu͸.’mÀ]Š4'©ªÞYà×-ž`⊠®q›WûG˜ï»ÓY•$ùUòƒØÕ˜S6Mëý¹JE?¥XŠ ¦¼Êç”{4"‰ir¼Àù8/@¨Oä¡ŸG}°—åBriŸH6\JÿãlÁÖ‘P±Å—<+ØëQ­*LÞ¯0Xm®„z€AÆP… Ý.®¶`e"/qÜQI)9JƸø‰÷ÿK“aÖXÉ®½†m8Í”DÍ-XÍ¢öyÓáôÑü?MルÈjXO–~‰ÅòR™ò|aº¼ÜT”æòr:;æe˜(Š)Š†ª„a>‚QŽ”!}MµÌ}ÓR5õ(¯zuÇYä|Ñqê𪢡(âQQÌüžùû¨‡¾={*á…;Þ Æþ©f‹ jr?ß•>ö1© ¨,}L¡úMIÀˆ$EŸß®Wî/a\º”oíïÚþ†[ Á!Ž´ qÇCÉÈ*ÄšïtD‰(Ëí¦æ ¹‘óéÿ”ÒkùÑ/’¢îë‹ŠDôtý•¾iþc0%—5s/ ½k¯ÔBah´< êˆÿî¥f5ýŸdYj<.ÔŽ_ä•ä¹\Öß„´ áò\¥¹ w>£@êtN´#Áw4Š­¯C(äš6û¡`lAp]9§DŠ&1(;µs*êwôOjš¦q¶›œýPÓô|ýºï±lÛ|¯ñjšÔ‹•Å–cSYLDztÁw‹ËsvXÔ9Ý’ù†¸vÓâ왊Õ£•÷%„$ïCò/:†1*£­ !òûnÿ&–¾£ºã¶h®Õ°Vƒš÷&=¨<ŸQÖòo“Å(ù%´š‰±9È35o˜¹+Äš[69í›P§»ŠÌþýö_sr@WÑ{$]—rbZŒaÌ2In;mB/š6Æ6Æz °mȪéPbڢň)2¦i熣F;6Æö*¶!ÿqó ûÿzÐWÔ}‹ÓuM¬ýõn÷¶ElÛXš«¨ªiȪ(i2ÓbX$çšÆÁ-bÛÆ¢yƒÄ6ŠÇÂ×ôè¥h¸Œ%K·ÔÞN*°Úù@’-1~að@«;Îtw‰Ç8Q¿ã6øjnŸö–ü´=¶Íµí…ºjHÇ©Õææj5§Óê®jš\+. íùó§€ýò´Ã*o;Pz;(RnLI‡gu•_•Š<îå?Æá— ˜,ý  ‹¼MÄò ~½N<\ÍÄHónÐ_³s÷ˆÿVaJ¡X(hï‡>ͱà8¾opÿ¸‰õò\Ôlø~£Í•%®»–u!.X–«s îqÌ ßw,ü¸‘½‚ÂTµP(¦h…Bîk”+ŒšVãÇž–Ùx¤X4EaÅ/Û·OÆmÃ0v|Ò0ÁÕ¹èâ‹\wÁ4ׂB±ÈåÇ?úNV)7¦Ek–IëÒÓ¿‰|Ã")aé:Z‘ì úï5oC@ƒ,v²”zÿìùSGÕ4Õ™úS/ÒzŸûÜç>N&ðY>.›¦÷žiÊÇeù8µþÜëÐáÇÏÞ»þµõ¯ÙšÞÈaŠÈ(idè:¦=Š FäTH=¤ç…8‰df"ÈõqÔ¼b¡M3nÔT‡4óè˜ üúÄY@ÓÌs)D×^ýµ‚ð³š#?xù+ü`nŽ0Æ͑뎚Ð 7üëÚ¿nnø± \{ýõ×>xî Þ[ Ã*ÀâÌí×Dæ‚¢ Š²`̽¦mÌÁ^Û˜“å9£ýxýÖð¶N­^¯üÁýáhîjõzí3ÍûÃÛ%ŒP»E}«~Tm¢3¼cûü:MR`;£€ÅƒvºT(3ËÞå–ŸÂ…¤ Ýç¢WÔß³+ý¾Ï7^݆_­®®Vã2×U!ýó†zµ­X–bÉÃV¯ÚWUM§E{Gí™ô¶Ž8cR ‚6û@UÁ8ïË i¼œHËK0_.ƒ±XXØÃZ\ &Þ®Úr„˜÷ ­ o~[Sí[XE·ÔÁÔ˜P{ Ð::ƒnôs•…­Ãê±0›ëQŒZ?èƒiù«=Ÿñ8¤š——.EÌôRmn ÿ |Tºÿ*_92{&þŒ ™ ˜#µ¡JV“iî‚Ñ_‘êJØJbAMF¼Á—>0¶õªzׂ÷õw%Ñ”±ScüÅj:Ö©”ç°*{Ôm —«RÀ;²R½üAc]Ädlã½°÷•ëÔ´H½,û®Ø'¦E jZ¤/º¾ Òuÿó7Ï®ÞzÛ·×m·º¢ìOL0ï¾Û0'¾,ºÇýq¬ŠÐÈ;ý¬“ê˜oïþ¹9Ã1•^Oµc:ÕñÞÞÿY]µTÃ9zÔ1TëEy <Öõ°º’ïGC§¼£ñ’£®N|³ˆÐ/Ðf¿°Áz©.¥îwn箵 ²|@“²|áÊžß0NÑN­$mº`°0‘LEjÁ•¬%Bwl:ª§Ã,1¼Ð££¸½n*dÄ¡¸bY–UÑQ}¿×þ“ 0ýEQè\Ã0sTI4Õ0TMa²Ì”{:ú«Ëë,¢éL÷üRÉ÷t¦k¤>ØXT”¯¾"¦ØÅ¢­0U“ui¶»Êû>3àoÑ£õšX®*Šz,N³!k½£mÆ·¼‰ öjú×¥%ATTQxZ…@c±å+ùÒZ^à^Tû¿* h= º…Ì>Í‚PݤÎ7=T¯GïNïMТt‡^ý«z=Øwsúœ[Vó›¾¥_‰È–€©.¢#Þ¥mjÚŽ3? £°2ŒÛ¢Ž( Ínø!´P¾¥Qº:¿”0Æb`:’2Àw'Äs-ÃWÄð²þöv£P­6n_ÅxU7]ÿèí·õ]S_Åx•[óvXÞà|#h.oôZûÛÛý?Úˆ¢ ÎW »û‹5šº¾±;±{ó¯¨1ýÑÆåÒþ“wú¢Oò Z`öA«lø{ÁDæ*ØD,þ+ýP» ,0' ÝÚ òÒ ×¯¬`1ëxeåzÉ>‹'ºª‰Î`åè@ ;º2pznNOÄâÑ#·îØ’už[-Š„èÇL6*ü!’’ãBË(/ô߬f0 à?Lœ :çO7]Äçd¦hß¹` SÛ„¯¨îldÈ” Δy7ñKªÊä/,2ÇQ1µP­Z|¼;ÒœÔò% G ‰'~WM¶yÑÙ¦ËÜ[^jID­s mÁÃá ‡ûú!œ ¨Û7&@[Ú[Ž¾àcjÔü›pûðê¦J$ë¥>ε:ËÑ4d,(¿_ÒÒ³Ýu£ûj³ýØ‘»||í©EßNo¢1¾\xž×2—¤À¨3Üî_Ü5|'‡á ð ø‡É+e '#¿Ç=|pÿÒÛ¦Ò¥ýöž§š÷”8VÙOGF.’¡‚¸¯KÓ3Tô£ñ[ÁQA´¹ %‘Å” › Ê{r#¸„Z(C§ÑËÐѧRfGoêehv! \Ж'ì.Ù\¯É+\@9RìVǨÊr`l|\šíÂ5ó\§Xt\öãsÕ?žW˜a·ÚU¬žÂÍÄnƒÉ¶ŒñÓk½ÿ¼>¿óâŠþ";,Ö8b‘cŠE¾³wÛ}wýI_×ûÛ<.ÎX¾cëùè–jI]ÿ”Ir\±DnY%4./P:ïGî*»†fs§|—kÌ;á®rç€MÕ!Bz%ØÃD©GÈ&r&Vt=Ôz4§Ð/rÎzµÓ¸‹Æui5 u᳚²Ê…œBRÛv¹`Ý|³UXgnÙ¶áz§2«Vq®_’†Fž“]î«nÛeQXrö8Î’ .¥và…q¥8oMÙàZµ{@Õ^ÔV ƒÐI9¡‡µ¨{¿cðS¤T°–)]¶* æ2 ËoQt]Á͖ݼMšÀØîÓA·…CoÂö†S²"ÃÏ,Qºd 2¬% @—öv+eLÐÌ [ Áa‹Sç¡Z[Üvƒ»µqžóÐqtB­X¹K¦Û-(sñP(\ÃõnC&çPý€Æ†$…0àGêÏŸ’)ÁvP*6&T>U·(„rØψ,“¬–Ó-±üóX+ÿ%缯‹1™ÄõþIå“„œ”EIšOÛ¢L壱³,IËN|T¦²¯Î?‹ÖòBN2©æš `®™j„bˆ]=€ÿû1<¨C»¾}(½q©bf ”/¥mÞT6ê£ò†Wè³ÙbßOú¾lÜ©oºé¦C[u‡¼p½çÎw}“vWŠ°KLf×åÙeKo›Ø)saãF8”;)Ë~V.g¾\&Þݼ̨½—ÝÛ±±$E_ÙGß L2¢‡…:šÃTmòvX_`‘I¤—éDlµY¶§V7eÈÌ\•èŒâDh]Ø3Vö$Y*Ýÿw%B%¯¼ tÿý´c£0ϱï0&6Dçê%7Ó¥¨s¨„qéP'ZJ7  Êýž†ùdlj5TŒ,5A‡;èa=ÃÓÕ¨12¯ÓŸšÙ)ui•þ˜«®EsÎáøÔgSðSݸÖínÖ8l{íT „ø$ºÞ:Ÿ®C«>$Åc{%“!9Þdh@ñô¹Œ÷åšV"ï˜íëH¹Á€\Ëtÿ2ìÐ~S¿ 8ˆŠÜDeN;iÕk~ÐT:˜*Œö »Ã6AËÀ…G€Í‘ ^ÕðX,ô4âW#jU†^˜¬ÀýÌÑKë–jì*óc“!¤}¸züøµ×?¾:à­†([×]wûí×]·¥šr~ËuùíJÜdÙ ß5“§êšºu~@B6ÿçJ¥Z­¬Œï»v¶ÙÂÆæˆeœf)²AõCNÞ™qpˆµñƒÇtÿ*Ϧ¼W×µè^ô*ô6ô,ú úZyß5 ·(†›Áš´Y9 (ÈA{;X;ÍÖLØÛ’ÿIøD°ŽpR\& Ù==6žDAHÓU8^.çõ–ÿcã]¸a ÿˆž~kW4í:°ýI½M–~l¹½G‚=ƒ‡h¡e9ªæ¿¤IØcúi¯¼íH¶kÌõƒFì]Þ³)÷Ð| ŠësÑcœ3vtîOBj€hü¯‰¯9‡;ôâXèÖ!\Š¤½^3cÜ1²WýÛRˆk]ÿ¦÷Ý’ã8N ŸBMíAšŒrZ¦Ò$ä4âq©áøpµÌy;Ý€hë…#j=ës€âlìa;ÿËá:öàs<½ÞJη¬—Î~ÅÑu]wàƶúñѦì’,Ö˜·iDIzçÊàùÁ¶^ âer'I§Õê$I̹eðÒlÂß B”OÛ¼"í¶erÅ0,ÂæVÑ! ‡‘$p„‚ç÷ÉÊ6Äô¥m«ÛS¸åATk)Ðì…+V«õN§6ûë ¬™ŽßYhžXzR¤sÒKO§4.ˆÅ´=Oö`­Ó©W«³ ß1µrðäÒÒŸ\zâXý§¢2,Æ 9Sè0 ¹­rÑBŒ6)ɾ«)ÜØ-þ¼‚[¦ñ¯-x¥óªåz dY—žƒ½ß¯‡p=û?†ei€úkÕÞÅÒÃB=\&DWÕ²hNXïcŒaËjêÖæytýúÿÆ‚Ši‰÷`vMt ~– ¬’$ËP&Øða¶šôÓ~²Žûƒ~«¼ºŽû1 k…+ëúJõ2XÖ².ônuYß÷ †|x7P/zŽ+Q*1]ŸÖû‘füî’êy4ÛðÁGò¬‡×%`FOãôÎgŽ}lÈ;ñ6”Ú5|$;(¶Ì9ðín/Ñ’@ª™$ꌊÒÅ&ß*Ø x0€UbR¾ÖÉ?F ç>ÎâËsciR°$,1L£óÑKuCyÐÄ´%¾2ŽÄD÷éAæÆÇóønñ1>©Øeí¢‡ÐchÅ£$ "u™·ôƒD/ˆu5fÒ'ÉÒøjû0“b–F¶’ô•ú!Ût!Kh 1°h*5?T–µÉ™E¿l˜©|;+QDº|³·„?×¹—9ÑBÍuX(ý'Åp]dϾr„8NiÁ%\ T6šÉixíí …­$ÎÛJxGFRqß‹êa_{o§uøƒ^Ó°5ä &Ì®l:LsýZìºõŠ› sî^®iÐàñ7Æ8<aªáVëwñê3c²¨½7ÜB·¦¯«Ù0¤ƒÔnRú }Je+ÑÏ»`Ź#BÛ%ÝÓ>xh«Lÿ燖Þùá¾,V"€HÁÀ½k˜¡Úíåãý¾R 7Ⱦ³°ïã’Òï_n· ª¡êûËZúM!$¢­ÃŒÿ>Àÿ À•|Ðݸþ*ôݽþúýÝ…õˆþLñe%<$ç2!´'ã à†gåð¸Xh·ãöCïãÍv›SGÛV×UòÒ©Úº@9#ðkПä¸ØêÇågIKØOEé.Æ"¨¹åÇoÌÜ­ 2¬*‡úVÔ ú="X‚DCd;”-Ý×e¾¶îçŒ @ÒƀǛ³ Ѽ§H­»âœ†Sc~8œ?Q§‚¤ŒF*E\?Q»6ÆIÏ&b)ÕŒ-#·>^*Ö]¹:MSE¡uw„’Ì¥F  vb›K¨¢@ë'æ‡[‹]ÅƱ¢âaø6ÏVº‹[ÃycSíÖÑ\EÉHz†i\>õüŒGLÈtÔ"Œæ^¶ ›ÞÓpŽEàúÈY—v‰»ê:Í´z¼T¤YßLÁçÕX%×sW¹¿´y¶<|¬N81²Ü÷ A«¨œyOPóA#ØÏøÕBJÐ9°Ûux*CÕKä©9"ªDh‡FÀ_°Ž¥:Ä$c“ËJ¼upë@=BûQ?Oÿ"6cBýÖ Nd =\(=ׂþºÃL‚i£ƒsJY}eÙ©Öš0)ÎQÚwï—éE—Öܸ()´1ïÍ™&©ûÅò²9D&Þƒ½1j³´§ÅÊÉ…êDìX].âÓõrÂÎ|Né÷_X)mvÇ8×v9ßÕ8wt÷fF]ÔËùFº G{yÔZŽ5ײv‰˜kóíöÕ'2• ëä#q·¤è1îDËÉ{s¦ï½¹ïnÌD&¤¿ŸŒZ×SAýt½YÞ¨I.o¡ßé …B§ÓŸ:ôT½¥ÙA!˜_X^^˜ ¯<òC³‡j(F[#’ñÎ>è½/•:¬ëÀYT«!­k ‚IiÑl ‚ czûiøxöÂÊrùæ¹Ä0ª™mFr“¥¯h—%¤qHº;ÉÔí[Zi¥[É¢¡†Q]G¬9ÕÈE8ÞYŸá|³×é2ƒŸäJGuÍõÑ;Íìg“ìJœ¢Ïl)uZÎó*Ã2ÛåOÚŽ|Í_XöævàÜŽn4>×Ð߈4|ßr>)=ÝtÑ*[Ð QAäÞftCíö󅜱Æø¼oäP•Í¡¹9 œZÂŽƒ{—„pi`'äFâ8ßF5³Q™-Y‡ ¨bj˜¬pó7-²’´†nõsSûð‰öä‚~-K–}=T_Ž¿ßoË«(Ô¿ØÉ??ÓUÔ*•È²K‡¦–I©Ô2ÈÄÀ<‘1>b,ðŒó^1êعº©_»fœÄˆÃ‹[|;:”.BôÎvÎØåéÍŒñøáˆþDz·ä${€± ‡Õ4ÍȨÒg0ŸOÇ|žæù$Ô ïk¬Ùhe·¢ß2ÞÓ5¼F —ÑJVÏÆÚOôÁØ{¬gw¾1ìÍ&0‚P~Ëœü 9ÙJÄ9îõþ‹k4ãÿ®˜W ð,G‡^ØåéôŸŸßÞèâæñ‹ýFð¾†×ðÏÇ@Ãw{,ÙqH–,y»GDG×ÃnráB›³»y88PЬª¿öI¶äß –Až5qÜj÷²O» ½acx_Y{ÜÅtöo”yÞ1{·‹éݯ˜Óü ì*ôGDí|ÆÔLùÃ)°Ý'z°‚ÙŒý%¸½Xl`9ázˆ)ëµ½õ°“u¹dš( Þ‚i–d]f€™ÂåÕFcUæ ÃëªO½Ƕ] Ñ>*Ú¶€™Â n]j·¥Àô>WÖTxu™ý-û\á÷›x F‚A9IÝ {ÖVëG7š@±Õj,R ÒÃ$@K+LeBTÃ4á öò(ãÚÜÏ>·µ¶3p™¶z’f‘ÎÈ´)üãó‘3›Îˆ!ÿñ=ý¯ŸÿÚz™Ù ÑåÓ¦ø3›C~…l¼)ÏÆ«–æçgoX…ÍßsêûQUUF‰O²ã ¤6`,ŒÂ6®„Ã^[0N¾ÙÆKÇ ó† óB Ù…gS0Ž-…yë]è£.B­(M˜KŒÍ±4òâ ¿²j˜lƒð ?| æóNÛ.£ø°£Õ0˜¾ båªÕñ`Ê;Ö?ãW!&:J¨5ÃpGeÀv‹8IL±N!{FHA8 Ú¢ILgÃÃø"ŠÕW°Ê“°Àc“{Åòwá8˜ŸÖöwvvúQ“ ÊݲiÊw+kFýÙӧ߷ó†ùs£f¿5ûXÇšýeE„ª#Uˆ-© ïp >;xÝëFàûMËøýS†Õô}øo¯{Ý»gN€ï7ï¢gR™^™&½F[€áˆDÓç$ˆ’—áä¸VhDàEi×/çÓ°|üørAwÌВݯ¢ÐÊÇ—¤žz´wüxï¨ígöü[œUÕNåøñjLGg(÷½órœÁAšx.Ú©Ó}½zщ|sʧæÄ4%zü8•&'óÿœUÕj¡P}G¦ÇSùzŒiâÙ‡ÜÉSéèåàŸ#•Ï{qü¢çGËíÏÓц÷ƒÉš—2½G ¹£ÀChJ#+IÛ„âvšòà]§äî*=½» Ö¥\?¼·jêl<%ä÷l¸S™Œa«)†l+ªÃEÑ+4©ð†`ÐìlñŽ*-4 `>ÀÒŠ˜³xÎ÷°FÏàèXçÎ7«Nr™jbeÙ©µ7ã…æIóÃFXŸß5]A9¡9šþÿF)>€©7å, ƒ6m“g¹.Zà\™±‡«ó`âÆxi|#馩©ÚËÝ霬àU@'ÊŸ}—qÆ:|v ª¦›¦öèv_GY:»·"ÔõR—ùà°-Tù¡¬|<ÌæmŒç’„ Þ§%ðëuL>R¿‘JpÞ)/{Õݹ•å¦vV$ãؘÜ$*›ü÷WˆxÚtÇá:Ö.zßKs­áË·#Àõáºàå’LMÓàÒQtœ$TmJ¤ê« b/æP>6̆Ù1“MËx»{»½õèånËsôÚæ.'çLŸÑ2)§MŒ—gz¿P4¤”ù »gë½î_Ä"!ƒœÜß™pý”¨Y÷ƒM°ž¥ÜGœ-ÙÌG£Ì¢íüXü¡<ŠÐ–bS»’êûîÃ…m,IRv,På¥FS¿Ap÷µ¶ÆaN TçŠ*´%Ï!ëðœÙÁ³×ÄÀÞ«*:ì‰ ˆé-3G(—»à8›»uÌ°þ®@?žé×]ûÏ\"Ñ•Òç¥;Eévl˜øât$ 4Ù¯Ò…AÓ®Å_2ãHwª³™\Û?z|»Âþ/›´5›ÔñÔÖáQqåSrÌÙï¢Áš‹ÁYO¥Î âUG{.ó¦HD%Ù$ž¦Õ°ÑPÑ’$qà9F3¤A`€ñ×ÕlÎÀEãâùvÏ+ÈÊÄ­í<ÕoÚwœU,ìˆ$D=Pé+ÃlœÐ/MD"ÿÀÁšCÿ™5ìËMT´öbø0‡ÎèYˆ4¢CÚmû‹Ð‚¤›¯]¯}Õ´ ûK]šÀc,‘ƒòp>¶ŽÙú…Ž"çqâO-:·;r]ÝŸÎ{½sêúòŽ–,«×냈#ÔçÌ·lçø™ð·aüÙ4æܲî>3•+"Ö±óyßÝ*×”Œé»•pÈk¤\¡Çæa@˜÷pdá©®0' ‰¨ªöñ øjø¤ cüJ1¨mü,'”Ü´=å}¤!0QúD3]ßÊ^¤Mhâ#BŠZðØ͸:å’ƒ.Xhí a†Ò‰î`o?â‘—Ëó¥wH×:ö)AøTºÒ†D®Náˉ¯ÒšiDGTÈôŒ#]HMÔªùiÂ4 c˜V‡ÐÍGiåDú sØåI*õëKô£Ç¨P(0ꮚOrƦ¨¼oZê«jëñÌê…Kgãù•ä-͇sø9$zWb1’b+°2+eq2‹šgã²0žNçu¦ð÷Í^ö¾Ù¯@%ƒ7f³§Þ¼"QªÏ~Í ðºÙë‘R®3(íKõÍ<¬ ÒZ¥<Ûšfj²©hΈ1ùµïj8*ÍÆ|Ñtø®"ŠÒ@GÇÎ#ÿ•_DÛy¯Œ„€&HXœ‚“ÃÑ嶳•”9¤ŸgPÉ“þ…+(êG×]àí›|°®7Ny„£Ãrà)-"õaîLH¨6D)mÛ3LéÍ‹=ÁàˆÆ}=¤B´P­A€íIƒ>+ßõúž)Ô—iù!ðJýIè¹>Ø6Ø™…D\áÕÉò¥´µ(ˆØE~ 7#/3Ö´þ”9®vç-Ÿìn«Ä2¨¦E¤ŒØã–;5×a×ÿðú­J¤³dXß{úã®Æ3ù;ìéœëž°P‹?ï0ÍýøÇg?ª @{Y50ÖäÑýÿ¸£ë‘DA”Œž‚P,Ò(*' y^5[  ¡œÒIôžù/žJ]­XÁUÉóXA ˜ïJU\)iU<­Óív´»Å;MVðFo¡®§Hª”r‹Ï$ï4!§=‰ù·²BT)‚Ų$E<1òm@…ßo¢Sµbëà}jh2ê¿ ·!h]eÙój<î“X¹‡±d4bûiŽ\ ­'iB)râí¶ÂWNò _ô\­WèÔcañõú)cºJ‰,?~N™ 9/Þ)[ÂôÉnÉ9§ñœ[]¾r×]®0šy¨ÿõõa­ø:/¤ŸP)Ó?KD‚?‹üQÚðPŒº×ÂêÈ4XæÆ.Ÿ=ÌVSÞ™ 9U ›)™´Ï%Zó‹šåÞ¡¶§*70ͳåÊ ž·p;ö×Hmn[óqŸB Á}Þœwï{µÇ‘5o_ýÑ……‘/Èר¿_ˆš~ž‰ÇëLeèV™yrÁŸÖfÜÉ$À3oXê{et:BûEB=¦=5 · Gné ‡à²3˜—ÕFÌ-û~ .¯õN®}î§Úé6*` 1Áœõ£„Ù&åºxÇÇ·7|ü÷Z¯TÞuªÄ;‚\~J“`Vu#î¢ùZt;ºˆ^…JoÈÑϣϠ/¡)ú.úsô·ˆï–TnÈ¥P-šJ‘™‹¶ïš¬±í2›ß6ÒìÊ‚¤9„‚7ëÐö1ÒÑV¤»ÆœÞOƒmkv¿²ÆaŽX ïÎöuTŠtÍࣛ«4ÚÜa"Ùî—v™|î‰oc›GÓÖ‹,—ošøòN½û*íonБ¯¾ˆÒÈJ¨| }]6"$è 27 Õr³HšÛQ°:h*ÏaCJh&•^¨d¢ àõn‘0©œW¬ X´I6`sÉ¿­5)íè¼/øÜÄ0ƒ÷ˆr€@4ÓÐhm5[–ç[²èm³± ðÙ$-B¨ýcIç"²4õë!XK äÓ'}Ü“’8%1|ì¢ã}zKSÏžB°zýu¹Iæ©e‹Íýµ ææ_•„àK›r«Ý­h{qú¥:wÜ"±ðTkXïÃík}1Õ]<®+Ñ$72û»ƒ+âdý@THð­®0öä)Løû (T”ã¾g5ŽSÏÁ Ø='£¥T7aþYtAi?{÷bš¾DEÍœ hð2qʆ. n´*£v Ûû' Þ2TŠ9§?~ÕÍqnÞ¼#ge* K#-ÐN5 4@™A¤nûz'÷M©ú7(vHŸQ àäŽ~Á·èÿŠv9Ñï¿Õ®ç³å:¶æ€.išN‰ hN{©vb}¤©;~§Z9άø'íæåÙ;‚w§6Þ¼ŒòífµÐíèÕòRG¼Þf¿Þ.&LJÑÁQþ'±²D„I/dF'CéÊ÷[Wãv?î§âÉÒl*E “°ÿúb½.aEáº,ëNàBL/YÖ©š¡}¤¢(:öFÒcÔ‡wteñdi6FeRØ÷ÇP©tuY¬(úñÅ.FÈ¢S}× ýz˜ÌÓ¹KŠ®ÃÑQºí>TQ±*­¾šó«Q(iµJI€ìøÏ"•qd õz­1îbÓ¸AqÔ`ÂÞ XDœÚ6{FÇ1–ÇëðÀìÇaèÿ\¶û·Ïþ´èÿœË¥ÏPwáÈ¥°7¾ Âh6–Bߥc㊿ü*JÑ!ër!ן¡¡·¬ZBŸQH-œÐ´HȾ&[—ãíÁ »¬iÅ_÷ú«Ù‡L n¬füvQš}_¤ÎMþ÷߇¦(T««+{Íþjž7û±¬ÿÆK¶ýPQ‹ÊI„ ¶)((2!¼ÊJ–’&K‚ù½êUBe!¾+3˜ZÝqý¥Zm©æyµ¥Zm©R.W–jµ¥À¶LÇgùÇŸß1-;XªÕ–|× Uög—$I%æÍ)`Î1»Ì0çX’ˆ,Ùë…[_º$é%§‘ˆ*I(^Û èÚE·"»á›i;¡±Fi”Áë Qâ-ò‚™…¼ªõ e{^´ëùQj”2T¯ ÇF:¦˜¿OWdÕ Òã׬ªÇÿ&Û©v*ÿ» ËÖ8€ñ¶Ùxç)ï†e°\YlÇëñ%½N1 ]Ç‚r­¬jª¨Ç¯íõ[ …rÙ9&›ýƒy<#_†2cn8í `tí—¦%OJÞ©àrÐðbó"´ §{Âhš5UBf´–K÷ åÓé' Çៜ:üw¬1Á*Ý]Oñ· çÊ{ÞÓµª¾ºY}¿^©JÎ\ ÷«´Úˆ†š“²‰Ú’kÁ¾SÛEŠF‘p¥ƒZI¦Õ¼.%ýÃR'5«£Ií‰G‚·ŸàÍ°”@°6/¬¤ „\š8w^ã±KûÁ_°lî¡…Ìþi{:jXÆë$Wª»7›Ü8ÐóîW0“<‘Bº¿£»Š®‰¼±‹ó³MسõÏ‹eˆ8¤©£izk5•Ù:Ò|w‚÷ZÕê\>W­Zå¹V·Ûš+Ï^Þ&6мçºÞü”—³Z%䣮㦯V¢¹¹¾$¬Cv|?wú^îš}R&íï^GßÌÖÅ47éÇ6 &AÙÜ0VP cd´,ꎞFÕ¨Ž™çå7¤ï’¨-õ&ñFï‘0ðÓHÅ|ÇÙþÓi†á?î‡`Àæo+¼=\ºå„|âóao²úç=^Ð0|@ù³ëGw"+4cÏäQ¿Å7Cí&DÔ!äv•uW›ôö+èÔ/-&ÑÈzÿÊÜæ»béâW Æ‡P•¶Ðß #n=á)šv¨amðâ„Ûns/þÅpá¦ø×v|ûŸ›ÎûžÏÿs¨ÏÿrÏ+ÿ9Ô+ðf·ä³Î_ÓSæÖoŒ©0—lmßk3Ãzmɬ'ØûÐ: àaE#4`îëöΓÃýÛ$Õ›É^òÉ‹è0Úåˆ!àï¢:´Šè@á6ÈÝNÍi¦Dbn’tnëÓüØ‚í~ö4Û?WÃP, pnY§ïR 5³6ß­Tjß,AMåòÊG‡WæÂ_oŠªšµ°QËâ|bYœƒ'`Ó²(c­;ûííé·]¬öx­Ý_íèköþ®Wêj'‹ÏУd  J|^=ñM©àš5b¾ß0K#Јh°eMJå‹q„ 3Ž/ôølœC„ú Ùê¾u˜åðJ DC7k¾ÁQ¾¨&Û@Œ|¯ñùS[Èûüì_ÍÅŠoy|“·á Ê¢Ù=»‹®A¢Wr•»OŠžl‘ÞPÇ6å¯^ê‚š\L¢€ò]£Q©͘c”‘rå“Þ‰Ønù>á‚gàû-,mµZÁNÑVkKÂKL¯·¹¹uIx€3¬wî,Ù¡TÔ4ÃÐ4‘RàØ%ùyg®)´ãýŽÝzq»P®Ay˜|7¼ó­Ì†e¨•ÛŒr™‚ñܲlP¶pÜ=çoÝñV*Ïϸ$Š/ÌÏ—KŒí ò+î'A³ ßÁ?2Ë©Ý€>G’ ™ùPö[ЋìÕûòåœ#"GæZó¦XâÖ+È n$® •¶ x'Ÿ±ŸO=¯¨ ‘5M+H¢çÉöÖ€sËRíеê‹ oÿ*;¼¨TUsyÇÐÁÉè˜+ȾÉÐAsy™Ùw;šs×— —HcáŽ/ î±èäÀVÞ^íó{úsG?¬Ó_XdKügóU¾×â<†ú8Œn‘¶ÿåC¹²Øäó‚`nn¾Yþ—öýÛJc~n. ç º‹•2øÿÚ ü ýÀžÎÔÐuè¦^TånÈ#¡–|ªÍ]µ#£G½”dzõ<±HT×ÖŽÓ`R&J­^®`0¥>̜ы5ÈpZÐòW¹Àd¬aα†e}˜‚ÁÛñ©=Îú×Åï]挙º ?Ô¨PaâoT,"…=£ úÛ€ü àÏÈìmÏ °êû"”±”ÔÃXìâ;žneÁPM'Ù…ß´s4`œžÏáÂâúúÚº:²oÊv>˜W 1_s€ý±Iˆº°È5—MRDöÐò¼Æ¹ #ï.oEk PÀêX¬ü}ó&d À™ a²{2«Þn WÁç냳ÜC ÖHhƒ„²Û±ƒÿW;”¥› ›î’}ZÕB1ö…¾S^0YJ‰+ š4¶£½B½åD,£)qÓúW‹¡ïýŸ?1Ãö¬›µÒÓë>$‘5ÔòëÅgãø K²>y£ü¼üÄÚ‘féåLÿJ]*[çé}QàU÷Ä 7`@Ì6g1\!cËMš×  q“"¯y¤ßèGP;B“GR³šún Ž2œª—~Ì –#È/õf\›‘é\X†$ºS ×Í–îyÏžz­ª¾Vá\Qç9ŠÂ¹ò<žb¼lw¸åµªiª¯U…ÞôÜ抢(ÌŽ. çòñ8$'KÀ$4Y¬8âG‘üàT~*ÞÖ?û¶agøϸjؤöq¤µ¢À!*Êò€Å3öÂe9ûD>!úô›_D[è:tÜ— .Šq¥<£î$kFÅJG“ÔÎéØ+D‰‚À“Ô>äµã¸¬ tF$!„tÈž°¡ÇyÕË%Ëd롺i•ÊËBî¥`‡KÁܹOÂ)nÔsL Áü|P ÔçT€RYã„Q®dÛåš ®[Ÿó$Ç-sZvÉ›«».Ø5Òø‡Y­R‰\Í Ïú˜((¦…±e*‚¨È*!`8ý¥ˆ$5²ê fMœ›ºB[ ­W‚Xü*?îËò}–³(¶oþàè˜üˈÊ÷û»%,—UU¶Ö¨®Ó?8 =õÄíh gS@»LÈ3¼¾G÷5M]×vóoRUõzƒ@nîtÒ?èóPß”©.vPh犹¨•õ°¥ýŠ‡ÛØû#àç‰cà:'Í÷¤?Aˆó}­>¦575ÿ÷L‰ŠÂŸðÍßóÿ#ôº@0Âï¾Ö<ÜTö;N©èö÷UUQ&¿T×>¿ß3½'uEæˆù{Ás„ƒk)a!Çðzl¶?wKE7vœçöÓÔ}Æ‚Zí+Ðñ¢¡¡B%mã0åù̆¼ip åSÿx¸o³gþÓ›àWo8¥¢Û±íSÿdøOpE#jüÓ›Þ#ž"‹r¥ÙSƒxÐÃÉ€T<,Y©Kþ2Á¢¯É6Äð;Û^sd­:¥¢û§–õ eqþ _­úº52Áú왋:cXòNÿ¬¿r€ü¢çrnYzÞ nù—O{fL/>xúgñÓUÞþ;ˆ2C²†]ƒŠ‰ú UúŒJ¨±“'\aÇ /çÚ>¥ûç€ø6>;^^†Œ˜ÞÝûzŽjï<¡‡x„þº¡îËò¾@àÆ~Æô¦¤¼íÏT$÷þó-›Id<'y~פaŠ€£þ„³ïm_—<Ø‹ŠsR°nz<à ï¨øY™oìëí\°²*Z>F¯µ>û ñ$`sƒÝ ¤Wë8ƒOtÞk¹é¼AlQ’×ì 0‰kZõTU7LýßÞxêrËO0Ò±ç˜3ö†ó†–ë ¸É;ÿïKõTUÓ¾ðÆSo nâ¦r„œ¨mC02Ëlıåg¢¨è £ !«Z†q;þÖ~n7Ö¹îºùÜ{öÿCйJˆ¹Å#ü×eÝê}c³D ØÖ¡Í`h˜HŠ8 £ƒ½3qì2e«0W'X½;P€2ãnYØàNmÛoJ5å-5 „Aš0žÂXT¯ÀOd Û½© Ö‚êçdE‚ÇÒÚÚ¯Žeò9 Ù³úóOÏf¸Vôþý%¼pP",èЦԉDêŠÉ—Á&›¨^\Ãîöä£D–É£»°6wÃÅÔ²#‹þò~IºŸ*îh(x’vzœ)õiѤ$ô»•¨_OÑ#´+×r–³¿¼ûÞ{•¦§ÕgJ][d(üYNÝ<‡›³¬¡u!¾<;L×ggNhœÆ!ƒ*x4Bf•N}Ö«˜Ÿ£¿E•Z—)£FjÓcò,[uAj>aÉæVš5òå – +=?/xõÃ1ž[iÇœ7§Xù3 awÀÒJ\ßâöåžz:+x‚ºÀ¬N—`ž>³ÕßD:@Æ;=DÈi¸ËL{âþKíâ z .9f©âÙBÈÁqÌc#Óq KBt"ä¦[̇F¹Ç(7L×8—e¯—B¯•_5œ¨oÖ£ÀËQ[†°¿Ý¶†…_"$öuI8l„û5¿A¦,oäœOŽ/-a¼/àö—íF~xiéx¾ ÷-2} OÓi6“iób2 QËQs®·œÐÈ©üñq­ÛÝÜìv x;—åöhüª¾^Õ¶@ƪ·ÿ^É~•T·xV¢¨ :À4(4Žt’ú馎IšîH·üµ umë-T¥í,uÝŸÏÎëÉ6ç|»\’Â=yèÃVxÏËŠ¿·ŸÂz¼O í«{ÓϼH›öâCø÷›×H)ôO7ÀUxY:sü¾íI5c¡½ ‰¨GYôÏ(ýV¥¯¦Úî)ꩪҪÊ^[6>HÈ`JÈÖ‰H·Ý&ø„¢J¯FUs ëY¤äVT˜Ý”¨lËÇÕÂûNgS‹¬ý†^†hcl 6lu“i㞨j¼é m±n^c¸qESìcÛÆضñqc;_#Ü¿OÏ7"Å6q  ª"Ëb)œ¨@.Üwi;þŸDçüB—KýŸ35ÃÁ»¦f8³_(Ûuî¹cãä©ëL5¸ÆÇ:ìú§ŒØi³ÿ/Œ;Ny4ûæÎR±d“¬ÍªŽÚ”§AHC•œΡ·ž¨Äô^ÊüUÜç–>8Ní|èµ=õ3ª,ß|¶g˜õ/êþ §K¾!^Z>®3Ƙ~|yÉ®íËse>¡]^>EðW)dRÂ\õbØK8¤Ã(€„Î<Ïöà)&Ÿö ¾dY!çç£2‚›T'ãó³÷Íò&hS½È—9-ë|¬ ¨“ñùÙ¿ø -¨ÎãJ>‚Œpˆæq¯ ¾^Zñ4‰˜0ýÿš3ôg¬<¿÷åö¯`å0„w |Ž¥‚TEôä#Ü”[Ãö ðœÃ?nj§U£•´¹õ*Çü8çóܹPY-Í =¥Þ™Ü²`Ê?n:¯²ŒVÒ2ÔÓšùqî8|žÏvÙÝø ~ü:÷Å°hçP»²ZM¡ŒDMøTXÿŠK+I€U×KŽÆüd˜¸`§ÞNW³Šl“çͨ 67ÖŽWÓ¢ÛX;ÎH?3Þ} ë˜W·MåÀç7n` 0ˆ<÷jŠL6.Ó‚·ÑkÙÐD™ŸhH:§•Mðç¯J“þÈÍܨÌCfÅ@¦ºXˆKÏRoñš8”ëRã—Em³rv¶L¹ßh!˜"ê=VÔX0ÌVŸmö“agM¥ö²vL›1ñü ‹ •†ö r9a;²  ê쇯ûW®³ó7G@Ž‚Eîú› 7OU•ÀâÖó'ï»\~~kuþp&.Ò†ñ"ÿ¥6Ýl=âþ?^ß¼°é»|1%Ý|‚ÂÎêÖó‡ñ¢ª÷|~kÚ_óIH ºyp4ý³éæ`ëùÃø7IÇ‹ÓIÕí³OM[l…+"=Çýõ)ZËsfÞ®øçòµ)‰’Ù²æåǯ³¾4â@±æÕ8„N£GâbÀ?%L©‰¡±„&1;îv‰ Q¨×vNèAÔX b…üKI<°¶Ôœ†S¾'½(Ý7KÚó0Wm ìcì‹æ3¦ècìã`{u“ç;êJØ¿ìc©;°+aÿ’¥î8”Ëø bU6ÿ‚9…J‰zŽ ô`šBl‹âM–€Í7‰¢|§ÌÙÞ9¼lÌ »¼ª±úÎNi«G‘1§@u¦†íBèÃ%kAš:ðÁ8ˆë`)k}²ÂQ®ÞûPéàŹv[Ûr§®eîWUEy¤=WŒ"™¡»ó{`{˜Î })K¤±±y&r=V.3ÏÖú÷)Šª>²Ñ %ÎØlwž2cÑyyÜþL±ã矖”"1Ï•Á‹ÒÀª4BÌóR’þ¬‚Pqx#ÒÈÛ„ÈKÒA’F^ž½R–ÛsþŸ4Ðê ß‚ñ‹ùš“œ¸&EP†â(uEjÅ€Æ)T´5€²b!kà!Ì®²a }…g-UÎÍÎ šj=»f_Æø—ç!œ§Ø›}ÎÔP+¼Ü½¯©–L¿üe*[ª&Jõá&glÏÇK]j SËûÀ¥MäÕŸ éàFhCz‚BÝ:vfMF¸]^ŽéWƒ¢ +ª*ƒ<.äU‡7üŒU¯PÇ»y÷PìÁ+1( d3³î}ò´3:ÛþϾw©¬ý›;y-ÿúcÙ Þùã_ŸýÕ×eSòÎÏ¢°PåÁÞžôµ>-ÑøÚ¥•ûº–ß8Â9ùúì¿ýü O4(œ ºB•‰{ÒóLTc¹˜Õœ×úQ-Ju„‹ ¯ pD}ò°M¯Æm/¸'…”—Öf”«2~fÉxÅñÚa1Aü§qˆrúö½Ga\™n0ŒàU&(:gŠL±ÂøËÆöý!3ªgƼß):Ð%ó ¥ÒÂ|Ò¬½ßÎLe…:ØÊìb®+ã ³Öc¡÷7w’ÜŸ|‡éó¼aŒ,ag‡¨ ]!¢÷ô’AØÙyÉtmÚ.-:¼Ô¾îå/¿n*g¥ üXãþ›Z«g¿ÉçU€*Sï°['üÃ,Ô¢8õ!âøJ \!žj‰ÄŠg‚¤u_œ16mRìUãMÒßúÙsK½î¡Ï¹˜>-XLT MypìßÙÂF;ï•i“2?Võ0mNû›Ç » }¹ ¸(jƒHîI¯î§},Ë’BíB­ÍLg—·* ü<§]´ŽnŒŸ÷m4N2†¸·„  ›] O¹Ã£°,á6ä¯O±§«Y´kχƒv­fýAûþÈLT­ÜXœ½ïß±%‰BÚRT]W6çJÈ@9¦€¢Ì/“[ eâ:á?²¸Î¾É±cÛExæßU-ªÂœ¢¼þ;… çlCÑu•µS¡Y{N”íèÚ(MN’D²µÆ&M+¹æ:Ž£,¾û¨¢+ÆgCD¨åTü`Pɵó²D(‰0êÌ“rex}²‚EV<{Ã;s[ù‘Ãÿ‚Ëååβ(ž˜kÑ£[o«§{=›B«}ødUØh·Í¹Y^ÞíŸÛbΑ³gw¢¥¥Õ/p¼{êäjñèÑ[‰õçç$²’Í…„ÚÙ‰ÍÍ%cùì™óBøƒrmnž®†gm6nÛ<1—¦‡ëÝOoÏ^ñ|kIS½†ã ŠøûÐHkˆC¯ŽAwðÁ¬òúÑ‚S‘¼`üi©ìÌî颫j9‚'E8IñëÝn ¹ô^3qÊrò*Ï.ï^RÍ”oX¼»T&É-áv²PuÐm cpø„°R#KÐA"CЧ2Ö8‹(Ì.¢1ˆ Fà€hP4 Ýc"—#&ú‰úâ'–¡^¶ŸeäÞMj,ç{[^+ÝsKåÔ±âaŒʸ/ ’˜jÎ<|­IrùUþõË ¯¾âò,¯ ÝÊ[CéJ0;¸2(mŽ+hCÇ'G@¿Ý?°)jÇŽÊHØ`½–{MI¤ë~ò“ñ‡È¶Ã ²:w;òPJNåÀÖmÙpiK`ɲ躠÷^‘Ù³ýJßUôbƽ–úggsÓžØ&/’íbÔ<ŠË¶l®öx/:E.@¥ W`ÛÌlŽbÃÚl¦wkô Û¦ŒôÁh(Ý ŸHÚ<¦øÙ×Âî( #‚þvUðùìòèÍêÇ䩬Üþ'áEùu€WÃêË"ËDxÙª†³áõ×3¬ÞNrùçCpažY–ØB¿ˆßû@ˆðÐ{q½¹Ûߺ۬¸ÙA9¿xÇäâpžÂæ‡"¾„Ú–•Ô[ñ-õ΢ÿA„Ñî'â*+È{‡mªÊ2„R»9 +°WhÐdMš“I FT韃`«‹‹qLåÒ+‹‹‰–Λ0¯ ¢e:¶~l÷ÈoˆÆ}©ííPúëÕâ×bY.W—–:3µÆJÚÈ·"·]WWÁºwíîo†/þDo{AI›Ñ¼W‡Æ)›Ëöׂ3.ú#\óä<ôº?»;{6F¢jôíË„v$®éL(¶ÉD6s‘Ø“´½¥a!œÄÜ™ó×—“]™ùȤ™•À°ßéeå‹rõ°FrÍ"€¤ßH#oYa ‹xœ¢„R'¶B¨øTe’4BÐ_Ù»à8»&Àß™ó íùǯ‡`3”TxÚQ³‘w Õ9lOíQQÄÊIÞŒrQ—Ï€ÀšXtcÙ` ÁœûÐ3_³¡#…£IÁè÷Ÿ—XQb5¬†»»¨à÷©[ \Ò8 ób~f¼pí«è"QAÏ´­Ub_o–¿ ;pÁO¤×±Ëw˜Æf"V8?%•ÍLºìÙ'%ã¡Þ.Ú'ë¥mº‚Fƒ°»²¨M%80Ø4ÐÊt»ÐËÈ«•aqS©¦¤áð Ê›Õ '©ö¨GÊl2’E qA^ ìڇט3{— ÐÌÝ ´%ËêžšªìlÆ&pcšËËú8SjÈwJKâcÙÝôßhgÃ)ýnÙ¶á’q§€ Sn‚©Û7•ªê¿[r6 åY|ðbÜŸåÙ%tarLˆV±'FDcÔC«h]?nC¸²@<7ÔÏT¢Í G7Á3zƒõã1òƒƒ|©ùùˆ ¦Ùe5ÑgÙxקj(D‰¿9\ä(Eþ×H% Z±õjÛ§à³a`áÇÔ¥¶æ*‘cdò›Cq—(ŠüU”h‘GiÙ=4³€(Šü5 Ê«ó{7ƒƒïC®*@¿&+ qåש-F‡¾¡€üUYQŒÒ{å& î«’Œd ¬BtFÇd!RÊ<6A€qnoJ0åVfÄò'éóÒ„G{¨Ù³°´#=J+¸õžÐ#îaœ(¦=ìcB¾w“g`ÜuP=M]oŸÙl5ÝCŽŒk*4á?ET­¸¬ÙeK.(RKÌ:sQ£uþvþÎý)4ZèQËó¯ýå»È3:-,®ËŸÒ]' õZX‡ý‡~qˆ}+áýVy½þ6RçîÑ0¨®—@¨Äk ˜ü-v7Ó‡84†)º)¾Jé™b˜wå›<żQq’8EpÚC£jÀ¶:‹ 2K>p4 z—Û<ÐRè]Z‡^@éÚW§¥¹ä.xÁ¥qrn~òyd jP’-ŠÎŸsã¾&”;§ÿêŒÎ½Ä£ìGä~º…nDÐchŒ(¨dÞP¢€î$ÅXFõòöcµÌç‚Š—¤ajAi…Èo×Ù„ås˜Â¼Ç¹¢Ê½Cœîã5lõWAš v'L&PAÏ,€‰ºÙõ˶<˜¥ºÜۺŰ=¬ö'¢ú£`UX3 ãÉ1i•‰TI2]î©$öÉnJ!FC²•Aß« + /MÐG VýwF²WÕáËaH{Lµ]Þ¦vœ6fmÒaÏç¶À\[3áE3¸uݲ8_·ºëªª(ë “uørzæNµ=åF~ ³6 ´àC;¸ô:ç–µ~k`.®+Šª®/LRýמÃf•Ñ<Êðñ¸Ý«Q?£‹«;6̤e`GoˆÓ! m#hà‹¹LÛ ­)ßÒ•Þ”X|5³Ïþ§…µîÂææBWÓ}¾MÔ¿=`ÀÝ\Tôo)ZïK|]ú 6³(ˆ¢ÌÄ!6Ö¨µ±Qkö“=z¡ì‹I#ÿŸÅæ‘Y¹šüõ–/׺‹Õ*@õÀ n½Õ²8¿õè­Y¹xüíõ/WªÕÅníÀ¼•s˺µ¼¬š~ÎQm#0ÃfFc¶a¥ÙÍÄeö׉+P¼cá(|ç’уc-lö•Ž„S‚À sÃQøã$£rŠBc–ȤÂϯúâO[use¹O£y‰öé·jEŒñµþÚ!0·Î%gì™~ÿÙÕÇ f¾ûâBŸ1N&áz#ˆ¿Ž"O¢5 ¬Õ̧cpš²ø LOËB©yI!¡aö|€-hx ¤ª6hšš­ª¾æVQ„ã9^øáì’aŒýÙ³0ža<w`Ë5 ùQIzT6Lwö[ˆ–tÐ4jw.^ÀþÚš÷ò|´»›ÇOMµf±¾tü‡3- /)@”èj˜pÝ Í ÝÇš‚^D.FÑü|ת˲â<m¤6EÓ#¨'µT L ž¼=)§!ŇMLõ:NEýZP¥að5]†Hî,¿Õï˜A%1ºƒ Wh¸âVÒRÖ.©v ò§«çá »di‚¹ìFË"úÀ4%Å ü?o·Äyµ‰,c[Ó™mŸ(š6Ó5Ër²uÒ°¬ü9£к‡mæ‹hÓõC­œ Ïñ”+èšm¨àªakºàžÚdCh€æܲcõëv~õoð+à“¨K“@1z´1ŒýTÜÞÉ"¸yOÛ5.&þ§Ó¦¤þçªÒ!’ñ©€ßx#>eH„,É4ÇõŸVó»†ù¦¢Œ=×Ñ2 fõ:»‰ëº´,9ïz—#-KºÎoºåvG–ÉܧM]QLD]7?=GdÙ¹!$"$sX½‡Ž ¸)$;šr˜rnÀÔ¼êF}o]$|óÖöàµ7¡ ? — ÚDSc–·z’%S$e±9ý5È_{­ˆñy”+½ÞƆíËßÔ«­§" Š‚-Ó°¯°WYSv„Ó{ÂÏ*òvׄzÐÿ:a%2Ü4*oa¥`ëâ©GŠ'yâZöYáï+w¬ïžÊcàáÿü[ýµpœ$«`&ˆõÕ QOeñÊ©ÄiIB˜¡]›P˜µ]kP…¤‘l‰ÂÝ4lÍõo„³q$Vp­Á‘áÊôL<j€<¼†C‡06«ökÏ«õû5Ï#ͽ†Öš»tÉá™3 Z£†ý4ö5TÐÚG¨E¢fÜø[‘qÍ ¥žÀ1‚º<¼:æ—ç•øgÖq3n³)P¦â ÁöXÚOWA'½D&èט¶c!ñƒÈÛ„4{ˆKG©f«Õ\n¬)%ò[¯@¸xÊÆŒ¨@¨ê8ØcUÕÀ€±ME nbÛÆ2-ÕuÁ³‡'‰”!ᜠûÒFÁ³^céÌÑÑ™åº@ùÂ=Á1ÑŠmƒß>vŽšã¯…sÇ åÁ& ªæ‡ÙC(Ã#@ü€P„Š°ª»Æp›2†€âØÙþ@ØÂ,@ó+ÊYV.ŒÚgá™4¾n9Öµ| tâ²ð!]ÎxâA¼Drû¢.ñ)A|ôç¬}ȸrÄëÀŸk‹œ ß–Iå3ÙÊj¯°ÀažF¹‘8®U£wŒ©Yì`äì×­®¢ýâvnQÃú:Áýe?͵“â4[oB†<·ÝÞ @ûívÿØÒb¹¢»H•Jï ÕÕëÕrB˜BrËx•™uÕ¬;Êg{nÞ ì4r~'éÇíÁÆ ?î’ê;cçÓy?ÀæÇ€ØÊjžÁW­²uÆ”†…¸¢G4;?£ë@“¸ûóµ/$IÚh¤A6i’¼D9Ž|)|0ÔíþÜÓR£™&I$IÚl”TêÁ_o;yn#ëë-þ½%¯63LSs;ŽýAßV©z„qJü×:zqÞÍ=1í8É'ãí 9õ VêÎ^•€M%bÂß±,CÂFe¥-Lo¡ˆÊ!„B×怊aŠqYnúðu‡ýˆÌ“˜PŠâëfF´“µ]†t‚P¢ ID€A¥@”åÅ>|óï^÷(²t]$ÒHA½k¡ÆÛá 77"BÐk|èŽÏœ-,\…¹_å|¿Ü@Ô >‡¨QÞŸÿÂ$òëøÀyü_BÊyØDø~4¹ƒuu²5Òª²²ƒ[£`Ã+Œ@ s£./yÃð £›²Ä÷ئö^«º\ºŸSxªÆ{µ¦ŒZ¼äpžëTðÕ¡ü9_=ÿ›èQøEk=úÌô”/±ïÆówô7%ø Ì4LDO8fjV£4ß<îÂpÔO ¹“tÑt£˜L'ãïš«ÉQvÊón ’$èr¹E„Ñlì½MŒ(!]ý¬j ïÆÍ+€ø}ÞGÆ'tp½ÒãßÅ×IÜây‹_{¼Ò£ÎÄ—eMln’^ý ‚ÚÖ Û_ºkL$„1Qä×K^úÎq¯¤r?Œ‹,Š ã›`h<ÚtÜ39<ßõ§“ø("w²nLv:E)G©`i//gçèfÒ|Þ£[ Ì¥³·Ò0ml·,°ðóGðoqéì[¢î+8ÆÈ/„Ò¦BVi”2U&€¼±b:jBÕ7ŽGÜÆ_& nw8ìv¼*Óòñ:¸^åº|A!Ÿ½‹ö¦}Å默ÔB~]ÅskK]Kˆ[†ëëÃ[„8 O Ñ_\¬WVW=ôñ MFoÜk³ÕÇ‘·¸ºZ©/.ö…xšØScåÝo½ÌzÜzÚâjïÇ ÐÕGEÞZÒDµ”JRðW`œxè•D*UÁPVf'Ä…ë`Ú.?eq_Ó7„i!Ïš4ò äªv3·†àùån²®Ä±ØKõãnÙ÷ ¼ÕŒÉ´÷†‹ô(äú8!¿ !„Ù¶yøžþ Ã´íØ”˜7 Woé³P¬ÑÄýÎœoŸi÷ÞÈ­ºÄ¹[ÃÊù²ï4OÓ³5 +œ¥§›ž_>_ o=þ;CîuõèdM³:Êë†5¨®ýåcƒûlJ¡<ÿá,kóÏ?æâý÷ òt@6ÅÄÍ}cC'†|(¢‘™ÙÛTOŸÂ%‚ë&–â ßÆ>ã*Ž#ÛÀø.\â œÂîîQÊYmÕö‘) €U3T^„ºcY¯SºPu MÐ)YÜTÍæj̺°€}²§]2€ `š6Ú’uÐó+;%‹§! ß{º` ÕV˦ô·Áó¿?é…Ã7-«3(5ž2Oµ&A,•~]¥ÅË e®eâØHêÒ¿w¯h¡œFÃQ\A}‹hË«Vì€e,nhF_>1ÌHoØΪ¶âNSðT3î‹Ï˜èƒ_÷óŸuÚ@d§dÍÅÅueÖMº.XøB6ÿ_ªOú¼Ý..[Ý(^”}">-ÏEÓ“ ÛÁœ~€‘oÖ Ä8@Öì¯734¿"vI•qÇ­þ¹Y^xþý1ãÎZLMÓ xÍhM1ãÎÇÖx Žæ—™JN7›k/ÆÑÎÞ VÌÏMhµÏ‘Ñ;7$©¹ÙÙKÃÑ6^Ú_Æò7jó¦µkÝf½¨¥Ð*QõœSïù£nÛÑíàLmƒõÍÇaßân«}`š@ð ÿš“´½˜¦‹ }joi#² ÷E}Û¯ ˆÔÌ?Dò¡Aí'“žÏü\6‰Üþj¢mã=|¢pðG§ŠèN¢xThñ”«OG*¸žxu†wÔ ±m[R÷¦lŸ_µ#W&uðPTGüIçä…„(îÌ1Ûu'î6žïv&˜Ãå'üýMpyþöÀêFÞ:ü:%… ÁýL—`埬lÏ_ Æœx† º…,ÿù#Xó?²¿Þ¦›ÙŽCCÊï JZa(‰kJGEÎ3Ò9r¤ƒ› õ{ü=QZߺþF£‰Íæúƒ>oK!¤ý£ÓÅ%ûÅ—çB/¶—§?ú¢Ùì:©t¤oYmàDþR Dã°€RhvÔê]úçŽ1á/2.ºú]ð¯ÁÿÛ&«”ƒë£¿c¢øeÃWÎéÑwï:[í¹µiÝf=b½Á;5Àú£4‹šá‚´ëšÅGõŠfbûÆ°$¯Þ;Â?ÂP”QqÍ@œ‹ L9 RÈùg{mXÃaQ„¶RØKpqUlÇÈæE¤’íôŒ‹‹çvO(MÎŽMÂy B0üGHh6FýÝÝþ.¹F)ÊØ_®T*•e«Õ=º#%,,÷½â†4aiAø¦47÷ãÑÊÊ–#h°ì<“ÂÙZY‰Úí·:_2SmtêñüS­r4ê Ì”®ûFQHT¸áŸt@>á¢áwrŸë²µb²î’óy †i9@·þS”)”z1SøŸó_üb³&£(Ÿ ëOQ€‘;ìÚ˜?«*µˆ uv-ó÷(K2M–{Þ÷*5RK:ïÀ8é‹£K¡;è ‘ûÂÞz¤¶4ââ{câ0E×Wjj‘‡Ã&ÓqºQøù¼—ñµ»߇ÔaŒ2¥í¹FÌßrÿI Pžï{ lUVRKA±*”¦Bj©ÊÊÞ껑R ]ÒöÅ´\NÓr9½æ×€®pëâ`ìËóÏi‚1ÑM*\*l×õ4scÌpí¹®-˜´acB°Ý ÂP¾Ý¿7ŒqfØs¡® Í¬yŽãÕj®1nÍ*§úÏÚ ¶å7iÙ[—j·Èý³Æ¬frœÍÌ ¸D/Ó¡Ø¥vopãEøYÇåÚÑgþÞ>AÇ~óé7_,¿ÿüÍwÜã¾Óë£ëØ„æy¶ù9f ¡­ß|úÍ種µp礟.ÑAìoÑ—û͵.ãïˆD½ a±V5R€{€Ùâd±‡}ÊK›à¾iuèeøëjJŒÉp\0ÛDkG¼ c|lD 4¸µÒÓ½'ÓÉôÏ)ýnÜLþwHßJDÆ)Åi~™‚ï¾Ì·OÛöiÛ6š ¥3£#%4Cø&@„!u·ˆþ>ß-uòVÎcüÖÓÌIoþUêœUê¬C½ÅÅ)qÃG™..zŸ!Çj{îQµÓÐ(` —¨K¸cg¿Lö¯¹÷Át³ Ð¢*Èd§Óß±M&8Àxsoý œÈâóV«x2ÌÿNâêL$ôîû“+fê@¾§+ÍT¢? tIýÕH¿4KK”ž €Ž‘QÁ shsÌGòí'•æeêùÕ•¬å p\W TK­¥¦Œv]‡¿ÞèÒ”¾òUè,lK~ÂqNp¹½ÐsÍ ÙpGP*iJÛ5Ž TÚo0#D3 o÷ËÿåîÚº‡ÄŽs‡@ÞúÚîeȼ¥Äâ¸Wÿݱj]gUCBÝÒ]†‡=jݺ<¼Â8MN¿¡Oc¼•¤¨T¹㘨ý¢Ky ÅÉðþ$õi®L7×ø-QMûÅ$ä\oq©úõnýglx–ýÓTJcþ×K•Ê'5²°€>ögÖ×ÏâFçÿZ™úS»Õ^¥~…|üøü?²áàGHô»ø9Á×ûqs8™¶P…ËÀ§›’Ùu%ŒO‚-å‚?gO¾8-U.þ®‘2|™†î Ƽ,¬ÜAñ }ÎõœA¿8mµøž”æŽJø2cnpÃÐ}Yh#=™~ÇGVæG”›¬2°â´d@õ¹°x€š—¡]ÄùxšŸÁc7azf?ÂÝ€*£HRBƒÖu&­6H鼕 Ë?íH íÖÄ¡ ­õ›B€ÅÑ|Ãd––·‚» Fn¼ðÖò’AÎÞ`ùM[Ù%ãæ“ÖCÖû¬¿ÔâÏB‹²#iJÓæS-6¦ÞÖPôùõ$4§xM҈ЄM\ŒÇƒü&žNvÇXV£˜æmN¦ÅBóšŽÔ¡˜w‹.9)Ýû!¨‘ã®ê=vºæz'½q/·™Oœ.’ÞþëPøG6_?f ¦„šÆzT«‹'=rihü쳂ÂŽëjÎPÓ¾\+Æ\*ÅHŒ’Ê·mÛö•Üö¥$7ê«ÁQ&tàø •RJƒï„JRŠ&*D(Üîß•*¼Á*>fëÆ<ÄÛ–55úÎY›}q £—MÔm‹Õ*—!ŒÎŸ«B!GH Jyƈþ ¦¯+­+éhìÚ{¶¶ía€WüŠºR¯Ã¸‚&™²Yl#„3[1ÉBs%¥šÙBηü›1þ×ÑTð\Ínm±eQÛ«7ò×Uc¯øû/äQá÷ « ,ûxɉÊÏàOvOÓ<Íóõ$ü}R'ͧ¼X®/#e/øÕéZÓ”~½=6¼ Vì_àaK¿ñö3g®ˆü|Ï›… ÏU,÷×—á-öò;ÑIk„.ZÐãÐ*Åó¯¶k%n{é/E^”Ç \|ÃÞ-ñ³\ù ,jÁóGè©ë¥CÓ2ø;Ͼ(æþN¢Q’…6¦v¿»iÁG¼4ᄺÚá£ñ'Ä>–›ºèÑ˵ªOþø™ð&y%—õÛÏ«p~V‚ï·¿ù×é¡65˜L·áwG €Oú-ITêYDüÒLð1ôkŸe0ñ”$,ؾ??<í¸ovÜ‚ç-yw5àýö©Û‘ÓÑ‚+÷ˆÀ£=öÑlÛ-áÖA¨³>8888‚Aà€žE~§¾‡Ë<¿iíZVšL6À0…x¢R‘?BvžÉ§iYT b ýk`ú/‚sêfÙJ·ÕJ|\–³V£Ò¨Çgãz£ÒheeÉøI«Õ]É2—r.Jˆ Opâh î70¤IÎ !Î%¢TÂk0àw­Âç?$‰m&ÀŸÑ«‰ÏX/”+}…³w€-UÞÉÁ©‡Z̳[`)uu‹­µçÅ%ÁilJ)üù¼±Må·Pã3!áΛ«A?§õíÚfžÇlÛÞC¦3olS…±I`Å#Á“2m;¥&X@)³_Þ æj^G°(Ïúb‚ê(­ÕRyzooaqqÁ¦„RÛv* ¬ e%¿¶Â¾gu¨G HM1öƒ€»aòÊÕI îhÓ»Ú¿|ôÚhÒ#‚0~GÑOî,¯S³yH¢}×<ÿ£GéºÈ6)#L𫹊, ®=>⧜õy\eF6e Bu®LVWÔ†°ÞËWmÌê`&ÃûõG&ǯ®Žep~ØóÀ}f½RxÓ¼`"JÆ y·µEŸ;¿wóqlïpaݯÕ) ¶†îãÿä/†|ÒÙü°ž«U'E™óο_FÐín2ž€¨C墌Æûä ülð zWË'£òf· ;L±Q®Fñ®gÑâÞÆ÷íYw(ùÝu܉Oå­>Þ2î®C<²1¤Ê(¡E¯N4 „H^½&ž«Ôð]ß{M¡‡*¥÷¼t]\[»ÎTçÿ*µUó>Ъ¹nMLÐë›ÿ®[½þ~óçÁ1ÑŪ»ù÷ø–$KVóÌÚ³^m½)fÿûñr2ØzuÄU|ÿÔ³½4¯‰ˆšÄ1M€¬xžÄï–É.ßòb$ªºÑÒæ(MFýÁp@4@BÞY»Ðõ”"(ˆ,CRƒq Þà¼`Kã\‹žÝÖ>¬R?H!IŸ®ÝNâ‚cŒØ‚sv‚Xw‘T¿Ö!XVÑÎû×à÷ þumFV˜8¯õGþûÿgt¶‰ûÖ–€== Å¢ IDK!®(‘55Q$t±”BÇ€SõóѶ!?ºÅaR¯'ïŒãwNßD‘«Çƒ?óûæþ›ûÁXòÈáýðé]cZcµŒú–âgfîÝ3´ÇÏŸÃjµZòH›øÒYAË_¾¸U/ˆœ¨îŒwŽ­,7E‚Ùfô÷O Õ d$Ié¹;~iÊÎÑm<4›œ {‚I]úÎ]}MJÉŽl€ )ç«ëÚ¹Ë,–Ž”nÅ\¢Í•‹]Æ—IVœ xÑÛÕµ)T#µÏÙÞAoW¿¸Œ'¯EgÏü~‡)>?Ææ€ë³P¯Š6Ýåù<>³•N·[Þov‘µ·Ãµý4;q_§|µ5;î÷Î|Ö~úül³wJoû¯±÷&p ¬g9ͽóÀ° Å3ê¨ëÛOSŠ0ÿ|©ÆöT±å‡JòÛ<5#¡é,›gvcEÃðç‹hŠ9Å(ÙTçìCÆåçQUæ¸IŒ:(Y$È|ú$›©‰Ä1¶Á·©ŠI‹ÓÞòå¹E‹fÀFÉ–Äk-8Hž¸Ô>ƒoZ%kɺFWÆÿ×þ»?Æ6ûãÏnÍé¨Ýàh»Ä0³÷g=¥žÞfGÙŒs¥8ŸÊî‡?­—Õtv<ô¤Ä«Äqüù§9Èät¤)+®8(I„}¯Œ=glYÊópSù%j­0€«ÆNX$uRƒCú¼E ä¦^wvW`¬°ÛN9!:À.sìÁ [ÍV/-„Ñ7´ì{ÏC‰¡Ç¼íÙÎQ ¡TH9­mD³Îl•­¬\ZX_MYJ©ó”#ƒ=Y¡AÔÑ0nƒ°½~Ü~Wø„M»°%1Ì6‰UÂPû’Sw¿œ% ¹+Ò64®\ <ýç=sÔ+%gqkq1»QImßHYR.‡F†ÐÎ=[²üùó»Ý“'ogIÜ(ÁŽˆ»FQVaž·ƒ;.~0/àUÕZ-i6Ni[ÉÓ”„ƒ°\NíÜo·Õ;¯¿~eEÔw1|£²èÇë»r"tø²)—Yf ò›Èa“&$uR¡Dˇ;9 Fc$ Èhl‡¢#œòž Š“9ŽçÝêΫÙ”¼ù|$*uä@ó8¡6Bê³ ›G±r¨ç–¿“á¢'%_[£¾–$kõUºÐ[Ô^wŸ¯—]:*™þÿ2ZßîN¸  ¥å¹1X Ào§ç8„£qk˜]í©P©~k„{Ã.¤%ä=:ÒÚÀNR³!©’Æ¿ÿ}xù­È$?&à@¥šs ãX PM>ðÀüé"rè*¶ ˆÆcYEEº“ƒ„Ŭס°*;;¨1YÊãð×oc¼Õ.ºã ¼Ò½Öw 5ðׇC~pÿÃYž¡âí.IQPõT×»=!Xf5ŸŸý£”¤;žï)›‚R5ÄVr’' gâìåû9ž2ïb€œÑì™tª:p2¡&£ q<$RêCµøö­¦µní¶ª®.:áçJúº ʧ77šCŸ0£ž:ÖvÁd›Ñ™3ÃrÓ±¤á™·ù MÛíÒ™{þT¿·]}éÌ™¥¡º©ßÿÖÅnX$ë§TÒvÃOx£gΔ– –δýVGÖql‡Ñéh¨…#£•Ñ9 Å( @´#‚ÝÊùpÈKåru“ó»¸VÜÒ›7«åriejp‘°\1ÉKœ–…´µÐûTú>ô¸Ñ àI‰‰~Š¢®´©Zjdz²¼R¾F ç#„’W_OÉ]σìá„ùŸFRŠsºÞäœ+ûÚÿÃùÑÀMÌ̈Í?( \úV¦¯_¿iqºàÍT2'h/&:"[*tËÖ;Ù1ÅXç$`Àt§BNhAiÄðOZL5¸Å2ˆ% ÙJhM3dýû‘Ô_,¬‰â~ܤ\@œÊ÷âš™JÅ0}úô?Š“qíQ2èDÂTRôç¤^"òp²í{Ñ]2Cp€¶:D¼ç…ýG øâ,kc2È¿Ç·rÊe `ÂIŒÇv|_…‡M{¬f~?²äeU³Z¥™ÐÐàñMÞ7ÈÞ±šØŒ…žÝ¨aqgU§{J&+›V6€é NT*7 ¥Ÿ‹Zé­7² ròš“'?¾¸.@åäÉk– Ÿ‚|Yæ*·{ÑDð¯ nÿVÃN„|)\¢dãeÒ%R…ÿ6´€zTg¶ã g‡ûQÏâå-¿t77¬ŽµbmØbe/¾K`øO€nÙ.5î£ÿô×¥ï`vlZœcקyý/íR…óßǪ"¾ÿ÷=Ðû@¹r:ç@Ò'½©Ú‚ ¨Ì>‰P ¿CŒ»·®u¤3}q{6zàF½i=‹ò H)h%„g+tÝÇÿ x”ÁKƒuŠ)ME›³”ÉÃ.åF´R`ŠHúë£3Ýuè~$Ÿ}æY ßL[Oߤ‹Zù˜¾q$`2‚ H0Jµ‚y6Æ>áu”}=G0à2DŸ`TR[¥ý øàz ÿ¨A˜>&@ —7OéFæpd„Sø@ÅœPJ(]Ïl†¿ÐÇÐì=ÿð |&æ.ÉzzÁ¨V˜b8¥rÙÒ=†R¤ð0_òêUé¡™óÐÊÿá¤E!Åꙇg?Ö ŸŽmŸÈRøB?WI«$}eÙßSÏt8¬w¢-ˆŒ`2f¥2ÏÃ|ùv7#¡Ò†Â.;á»’€gýQÓzÕ¨0|0…\Sb”z›#S•3 ®o2×6@Õ÷Á×íPc¢¤È„24o·Ãô¶¿OhK¿…ÛÊ3-ùœž0ÙÜ2§yñ£Œ6„9‘cµ²VõƒP¿Ï0wÂÖþ™D1EC27pKo9‡³Ç©ÊP–›³úÅŠvkñ>[&Æq{Â<ŽâtEic žT¶€œ}p4g,.ØûƒHÿX zÞ&´x Œ^¶7ñ—ÄeÏ"²o¤wÚšWÁôg¦ÎO$é;‘éGHîZ•œŸÅšVcì^Ïó~öìp/ n7yxùÈ›avo´`|ƒ©vÛ¶¾€¤Ü÷]¾|±bÜ…g]þžô[2”“¼ê¬øÃð3Ûö® Á£Þ3]g”0" Í{Ìhƒì>šÍíªv”\èÎèÆ3_€»!®õã-'åù³m(úq.yT*Å—{6÷6k‰ßï£}ó+7BÊ~5{»{Ÿk€×Œ"Äï`ž ;ÎÀtæzFïzæ&¥~âvòü¯À¿Á×­} Kƒ¶xÉ$yKût5‡¯¸aè^4fÔ×ZÊþÒˆ!sLú£ívšÿÊš1Ý0tGã–¬ëÒwô½þ+tŠã,k°½° ­ û:ƒo†X’$% ½dco%ŽâþÀBÆ ÷Ãô¡û¬²:MÉË7Ž½ iÛœ»/ɤlz~´QŸü…¬:€™µiYü.í)9&Qø(°îãàsðô¸Ø´‡Ãö¦à±;@:C Z:Ê(yR¦›Í·ÞSndº !éTäUĈÙ2ð¤Ê]Ë*óêÁtÁB·3¯Ðô•jjŽ@v¿í®µ‡Xž 9Õ÷AƇR{ôm·ÃPfIA‚Šühæ—×õÿââœß®Ø Ç¡XÕî¿$ÓÜ°¿UšÀÂÆbÝ\“;dPæ÷¯Í[íÝ^H“´r y,Zqêd€ƒ^ `sµðû®IžSR²s›ïi§7ÿ‘ËR+Šv9IJÍf ¾êè=nOÎ1)ô9yÉw{󿿬¤Ä¬Ë¥f³”Œí,䕺µÔæ.iâ€ú‚„2"2ºQNA9Èâw°Ü°$±ûþ¼Äòç:›?O8lu:• äåR•Kycq±ÙD°6ó«ÄíQãx£|P³¹¸ØÈKå(*•s¨T:Ö¦7GÀ…àpRÙŽT\ÄQ¯W¯yn—.³Ùu¾ïzµz¯Å‚÷^iücÀúVŒ™ž<¤ö5ú}¬?ˆ-䎆 i<±?îîdÛ §ÂáJ¥\Ö|(WVF¤eó#¢"y:ÅSÍÕÕ ‰‘±ñÚj3 "NÌÚ V¶)•XpÍÚò¬¶u|ToMXaÕ³gÒbç]&Ĩ¸š2.çv· Õ/¼L(30—"@îN&^|ëþE×ÍîúWÙ£,wÜ·¾aù±ÛýWÈ^Aæ¢ð³œX̆KûóÔü(¬ßºÿ‚¶Ù˜¦vûïÍ2Fúú ¾¥ím]š9 ãù»˜ ¯î?ÔÊ’ÍfÈêÑմNXqF¥[Ã0JvŠŸ}ç£ðc­¸5éF­‰q´pLŒ9ºwÁ±Øõ–[,—{år¯W./2¶ä¹q_ÈÀŸùá0¤Cp7epþ^ǹ·Óéztâ狈N§ó ?ðô/46¬õV€]#«°oÙ²Á1Q¼ôXß?‚Åø2-‹{–wÐÄSCÀC %¨†éKmv4cì69Kúºè5r<¡Hª€“{‡‡‡„øyc=Óúé§$Mð÷÷ØÕ-NÄ^³àg_ÍeëaëUÖ#ÖÖá4ƒŽRc|½µé·äBɈ(¿‡|jFˆ8å…h‰sÊ‹©êJ-[·ÛZ+ÕZÝ´µ”[kKöm·•Òº½¶%¥¶7W[¿¼Ž¶¶¥l¯ni-åæê¶Ï¾º)¥Ö[«m)luuuõº‰{’de—ŠÞéßm)íÄ#/8zwLtÊŽ…µ¥;k—Ø«"~L 6Qã9Ìž¼ “m[ÁÁø&+<[NÒ¼ëhYJVE)1.ÊGIÚ-¦ùdʸËÞ¼$/7ÓzmÕTf³Z«S¼Í­ÖV®Ù™zÔ¹DC¿ÛïÃa¿›ýþ¥mËmÔhó4P»±¾¶å‚¢Ê¨(Z}½(F°Å [këý(âZÜÃ~¤ßï÷ûí)i­b[×[ý[qÙëã<ž&Uˆ¹ ˜êWXmš VRÊ8cpÛ÷åï¿x•Í„o û˜‡¥’í$.»\hzµïÕ¼&@ZêÁ –¼Ã‚Ýþa5ñ«U?Y»ò¾÷½O0e óL„¥’i'žuyez|=Ž×––*L¼/]”pÊ‚ç©×³¼šRŸÄu$ó9OÕѨ5RäWç«=|Ë踌èïr+zQŸC,ä(ÆŒá1¼\c¢‡ÖyŸƒà6ÜêµùÁQ{xücŒmDîBã™D©$4°|tþ?³—ÉõeWèñäsÒ+|š8ÖÙ2¾9ë´ «ãŒŽý±¥q‚‘“‘ 4»8Ä/H02ÎôÕýÝ]$`ŽÃ¤8'£ÝÝýC¶aÔ[ì+5‡˜²ÒF:›ÓVÐýÚU‹*ª]æ²æ•e#{²  :ç·lèÕ€ jX 8¹¯H»¨õšR°€ㆫRw ¥Ý=ýŸÏX‚:ŽQü°Ù¨'‚1 Zû&X. Q^m¶âBCI‚Ž)Á‘h7WËB”–ãkM€1‘ÔÍЭŒãPG<¨ÕÛ½GJ \ÄzVJ´¡RW ÜRœÑúé¡ät0¦ZXh—JINJY½ Nh(g¥×®×Þ.J¸A°kBWˆr (8ÛKº¶<…x×øÐÛ·uþ¡¯Žü¿ò³Ì.[ Üî½ãX©½¾'åáꪔ&ê ê"¨½VÍÚ†r[-…°†šÀ&ÔÖ±i2ê E+Ì’ÆjËâÉt4.ºSx¦üvD5‰±·°#C–ZyÌogOB}YBmŠn½™Ù—5{ª)vœ$*¸…v(õhA¾0ämkö—…Hô˶igfÝãÔjC½ ïò9ƒ8Ù…Ë@¬$yƒúûr 9·¹‰àmnžs6QÜëA|ƒ¿y<ïsô!-}bçÂ…º…,'é6¤Ù{þYøxJ]C3ÉÊGD%Ž” ¥êŸ›çÚ’äÞ°l7nlx .3¬|¼Ü¾cQ®xôl:Éešz=¯y¶Ù¾½]ÚN©ýu¡ÖíÒ±µßôêû9‘bŒs'Û½•ïµ|™pöôÈòÏËp  $ÿ÷êC¢¨Õ¶—êu>8lÇ¥8ž/HôûíIĪ•®y½¾øÈNÒ^£Ã«·ø1H‡e7j3̌ƹÒãZ¶haÔ‘ÒÈwÉ.(Xë«B'ºÖø‡‹h‚Ô©Í`¿¦Åëa&œŽóŽ)X?Ö®3¾Áº=zzz}Ì…dý áG„ Ù`¶‚R{çmÙ“·ß†ñm·?9ý<Z·kÝšÔjÖÖ~†ù^’x>«gYýg»µvóÙâv¶ª]Û„jÂ×­V¡Õ>~´Ój·[;GÇÛ-8Žqm¾ÄÕH Ç5Ž¸9²ÇŽ0~?§–y%á×:ªÆÁ²`<1ÚÎÆ8|Üe0jªêS4X«O,FÊ¥i mbóý³â&í´ûý ‰‰ö°(æŒ" ì6Ž­1hí-ïœ8±»~Li‡Ù_Dík»‰EI‹ßC8ª#¢”àÕïj1ßÜw=­S«®íì_räpü|ÚVÙÍûã¸÷£s±þa¨L“¦(«‘&äÚžw×ÁøôýVU0¾gfÐ r.žè<@R÷61< ¹¶Ý²C&Û¼ú‘˜1,©ÒØ·l£žer&žg(¢†@P(HÄ©º é3æKP›­zî±S«jÓzëšxqf 豌a~íU=ë-úg‚÷¡Ò›êàG¾÷Ҁ녹ý—*”àò~¥aõ¹NöÙ´ËÑ|{Õ²Á|lbqDÚPöGrÜM¯,‚q¬xåÁ´¬P†úJtù'æÏõýào~ùÏÚ~‚Ÿ‘n½ãÌú…|~¸Y¾’ëAÏ8êäãô :­¨¹à§ŽOý”»azºdò‚Ëßã«WûÛY$ضRŠUŽßÿ‰öÛ8¹£q>„Õ:vë»UÜÉ\Ù¨C7{Á>NÌh6›ÍwµžýçÍFÉ1"‰°ae¶˜¥‰-Ñœ ò¥A·þ?ÕßÂØ¥è)Ew`åÓ<9ÅGIÍ,pñ_*:Ú`j|×(B‡A#Hl\|ƒ±!Ì ¡çJ!Ta”hç:ÊB©ž•!oÚp}„©k0eDPÊ(UºZw8ò]7À €³݇RÉ)£@¤®ÖõfY n÷s™ZUë´uk K€ç]Ó2f¥è -;‹¦Ipž÷GÏ”}´ò—ÛÆh;ËlmÜvÛ5Únˆäw$óéö´qYnôWÀ÷Ë¡ëò^SÛ®©×kë,Ó¶kÇëê"³½í¡ @½r5ÅÕI|‹uѦQ®sVcþª7nf)r¢ÃŸ'º½R‚ü®´÷ì9N ‚ü"9cQ’X¿¾ÿ¾;*èRìwÞ@*c«F’Å€ŒtßÊEíõ]´üóø¹\JÞ“ÅMmBÄžâï°Ü˜ÿ¤zhx:3 ò»\ümøûì‚o»”ÑA¶p1&jú²]8yxk­É®ÌWwûÅzýun·ñ8þHR¯'ãÛn4Ší=3öJ—æßBì¢øWwÛÅF·Ûx]½þ¤^O>ÇãÛbØ 6|0¦ô#Œ- ~Ѿ¡ógÇœõÅ“„YMÕzÃaZø‚œ_!4¨“fÉ´£Y-?> ÿG5ôâíR>3¸Èì.}÷ÇAq—,ð]*uý${ú¤¼}|æþ7®ÄЋ·)ÇQÿex‘‹¥+à/H8ÿ_oµ0ËJœ—²,ö§áßÃ,ëù߈ëÖJ¿xíÝÖ§a€ðQ cØGÂÀ¥˜¿âè0Š6Öý¨”&tG)°‚ÑÀŽy·p½µ®:™NèÒºþê:Ý Yú@ª¿}5;ÐGÛÛçû½Åº¸N>nc¡€¡ó×ð·xc‚’Ñ­—m„…xþ¤³8³CBÑ`xÓCB*¾qnûTA¢õC¡q@ĘíRŒ›$®…W>Aý)­«Í ÉŽÎoo£(l»Ž,–JÈ0¤pVë8Æ,‰í³†T+¯—DkeSc§ýª”»[—Ê7 †èzbíDyaÁ– ¼ååòbxªÕÅòdCK f{§<Œ:‡•'-xÇŽ—#*ïJ BIùÞ;ÝD²Ð{Á‹ì¥×dyh—=[Ä´%JIú_Qiðy{gDhØŠtu㟫E¿_zkÎuÕKg×ËÁ=qà†JþV÷e^ŒÑ°`»UÊÕJìºq¥ZþÚVŽÓqŒäOŽÓè5¯Ü(¥ÝôËòxO[{¬†N2 XÀ.ÙA)¥[PzÔ•0ÃT02ç©…9BëËòü*Jlp4“Ž¡J¹ó{ÈÑ7“¾?;Ú“Ô²1‘¸—Â?I>£Ô@°.\ÊJ!›ô¥ÇUIߟTœc§\βrÙÁœ«v¯×–Êv:LÍÍ“Òü4¦TYuFQŠ]‰TÞ[V·ö¸2Ó:Gg¿¶¼{ÝÙ—t¨(ø#uôÔ¹_}p6{ou‹oˆÐê‰zµ€J®6*Á0h©Pº‹¢Ç\Ès Š-ñtÒL¾tÛú”I`F/ø+Š[a»”)N(«ÛÞ‚Ö¥Zlð8)§Êc!ˆcÒv#Íœj8™Ü°´ð•ëÿüßp¹ÈˆÒ¾¤sB±ËŒO%& ±†Õà‚¿ûFJ§íÇ6GÀ"-Zœ Li ½vi ÜoÝÚL¹ÚŽvûÈšcñâ4œ‰úì‚Ã@ý¶ rÀõöŸ¢H_Q¯¤Q×AjƒÌ:&ò±ê(Ñü/¡ì²@¼$R0ÄD˾Û戺LéÔ.ŒëzFaJOÇ1|Ê›Râ1¿ŽæýËößxÞK¹/ë½@ˆ °9C²¬«55bDD¸'1%œh[{qú^o¶»¹ª¨ÖÎÐ'˜Kf¦m¤ã Œ³’5m¾!‰ählúéí.#¾ŒÂ¶>õ*©ÐK‘~ÓÝGÝÝXË)»òŸæ£ÐªZøïäë>)6šŽô¤¶™æ 3̹c[ é Bߦ^káüö6"ð„v5GÊCdÁ Ö¯W‘q±g`ËŸïË›ú>l2—"“¹ä"6.ȸD<ì9†{ÌùÃÒéÀ5­Ø±Œl%Á÷Œ‰µ­ !zQ£ííóQH€ ‰]Wa ãÇ0F)X»aå¶Õß²ŠMtWÀ&û#æd†3'sĸ0"xh¿k9¯æMkǺ޺ٺßzuJNs)þáþL5ôç®7r qÇ»xaÓÈ¢ýTŒb'Zh_L±ãëS8>=›Íf{X¥ÄO´äP«}/÷|[oö´í÷z›½ÞþÔmz¾­{›Úö{ƒYy—Z‡~H}Õ¶MÒARA[?ÔÙ]ŽëòžVŒ“°×Ûõzf\îœ>süÿ9«å×1cjüðUºªÃ@ðÐÙß¿û,«˜Šm+(—UÄC®&ùüs?{˜¹ƒèà¹ë'j¨b:7[Ànùt]ƒu¿Àzçøä#œ¯Ù"Þôã| ùÚ‘ílôÙ)¶`4Ø~µÐ…S?&ÓEÃc˜ôoe๥’ëeøpƒ3ú2Š/ì Ý æ8Œ «Å1Bq\c‹Ro‘·hÄk;.w+?aYºÀ5Óq.Š:Ц"Îx‘›’"×,Y#×PA §a2Dä¨uÚË  œêñu^¥Ét 6 RBŸÉ7•$íúñh F[è?"🌸҂1Û¸ ”ûŸoÙAˆ¤iË81ÅÛ×_¿­ì]OÆŒ©/}R[0Šô|¸Á{®AƉ„ð9š_4ÿv`Æ¿×Ï;ž@>Gǧì|†`OžÎ¦Ÿìs½Þ{J¢¬mh¢©HÀ—À²N=7üˆ3ì3sÒ0Ž‰­Gˆ­Í'ˆg´M0_û¥ècÆcÛäa8È/[›“ûÄÖÆ0Ž©g†ƒ+x„pfŒ¶‰ÍÉ÷r^«u_g]`½ù2EûÍÄ$¥Qá®ØjʼnÇe焸À)à ˜Q3_‚ì!îa”¥×ý¥>‘’ô1ÆœâåeL9ÆXòwµOÅ&fÙr·ºuʺ×zµõƒÖ'Ɖ•.h¬´åíbc<™nØ/+³Á›^¤¬˜ô,2TÝL “éPO©Q™vº!Â'RzñMš¨èX qÎÒi÷dótRtóu`+û«ÇáÇÝ(r]cW*€Ì€éU„8FƉ£‹JŸ8yÇ7!Ä6N59_¾ÇüçH̹Ú××^A¤¤õþp"@®¬­-äRúóŸÇd‹bÊn ÆäýJ3¦^ÈQL6Ù?ôá+Æu£ÈUœ#a  l‡\4¢Ø1s„nºóŽ“'´Zä¼ù}ùq 2j–íÝìß &ÃAJI|)ó…µµ•³è&Á¡d Õ1cô[/TŒáÙf_ÎôàÓ¸Åz……«âL¤h&àÇS´Ý qœDÝ|´ÁG‰Rb¬|M>B8SÇϜޑœá¨×môzá?Räw) Rã@i· !¼JÑ®èÑŸO†€TùÄLŸ-rYÏÆæÿ@Û(ÅÕŘvª˜R mº^Ô½ÔA,+ìrÚzÐzÊúqëO­‘­hä€âöy•qEÁq =- jpd2L‡1mƒ¾P-°ôãI®ƒG±ŸP§rËUeÃû¢Nëøñ³goqfSŠŸª#íyןzàS×{žº©o"fÄf|~ q¦¸A`ŒaÆx‘‘ðë GxëžÔ{Ïðx3šý¦Ý ºyæ-å›>#ÌqŒ©‡±cÂ÷ßAhçøý!ãÄaÝ8ÆaäuAµêØŽõߧ”b‚äÝNµH‚)å& ]À–wуø`mýNš9èK”7ÀDQdÃÍ\‹#Ž›Àyw^“Ih©óRo´€ðʉÅÝ;hA¿‹Û 0ãêøé3Çã$踷ôû%“Ì3•¤Ö»+y¨ŒŠ¥Ä4@eÙrGçNž¬¦µõêÒ¥›¿T]¯¥Õ“'ÏíÞ)eƒÞÞÏ­–R€Ê«UÇu OZÙعoÞ†U vØ™Ô ]>˜øúm„Qž‹ÿëgôÁÝþS½6ïþ[ˆô•¤xy™…1æYûQÌ¿sE­r?AÙMX/óP¨(e3Îx7‹•üÔã( ;tJy»Ã†Æ;•/+i’Êc€ Â5ç52¥Árþô¥;ôû7›N<\"è˜X9Z”ÊBËÈ‘{7|¢ö€ª×Uúú³ptùRÞ¥‡@*®¤çÈu¡ƒ·Þ‹æý™ùsèmG>» uvê»4Ä ù¤­C{Å,ßıQÿ?IhG}§ñ¢Ã-µ[ƒ@²MB{zÑZ™Ïi<Éq×QÚ(â2ÆbûÝ=^t#ž×|ØÔtó©[û}¶= “Ù«vðklþñD¶öûG‹oܹ/AþÃQQ\µ{wŽ—§D[Œ­·`ªa€f)¶¥¹N6åX§6/êºk‘ýcõú[d÷/{r Æ>*I'žü©¦±¼‚ò‘±²R:"l/Ÿ£h^À„¸R8 ‚¥n- ÓF™{¢®¾½}þ™á,Om†òBÒ.=‚’A \FÛÛçáŬ„Š È<äþsvƒô˜úUÙÙ›&ÏS[7Zûç DI7×x#·³pÿºóÔy«ÎœþáP.w^ijdÀn;«™WúÚFÛÛç/_ ‰aoý{Ï•{z÷ëM]é”Ë #6ÛS[ûWÎoo#{–ò¥Ñý]û};Kf.ë÷­2»©¶—Þ/2-xÊãÉ´C.Ná`´ ðùý SØþtýÏ} Bðµ œ©-~ӔΠ£§ÿh •*?±{ºÉÕõ â?ðÇõOŸ£gJæ7…3qcÏÿ!€²RÃ_ÚËïß=Ýä(¡Š!"ïõíwX÷Y¯Ÿf€Nð“Þ/á¿ûh 4 L 4ÄðYMkĤ°QŒ¹¦+~§©ì©~Ë[-·Ûå²DŒ«+ÜYINõ†!½·ÇU·Š5—;â\ea…™â¼¼ªhL5v­[ó2; f™2ÌÎKw·éÏ| ŒÚA/©¥1…{/·s³Fúiµ[mì§T¤Ó ŒÆŒ‰WTи¸2ÂR½«Çc37šÅ‹~’r¬™?ÿÇ‹eÛEC¿:.€‹!n—{ëýÕk9~©íþq8âø¥åNØŽ,uȃiîimkÿËY^5εì˜KÀ8£l®v¤­òˆe=NÏL&ÜhŠdÃÚ|>L‹Y-&V„úã‘Â:øÝbôwFDñÇ,)àh%ôÃé~­^¸"tdz.Ïßã°\¯´Wò\8ºJô~ƒ7Ž  Ü0æ  Ð_K kòPšmáŒåäÕ«W¯ÊfNÒ9Y}·oR¥b-û ‹h¥$ë·ê§tÄc¢t)‰|è´åíÖIËœâ¸î§cX÷Kå0h·Gíª! Ë%ŸIÉ^ý> ¤óP:ÕôßD© ¯‡W·R?Mý´uô¶¸w:µ{°ÝÕ:¼sþÍcÌ×ᜮ õyªùïÃqîÍÿaœŒþM©(\7¨…amðíé?÷és¼F+xè ä!Äå<¼:]O½èú $‹YèOv!Lã"[Ví Ú냾HÇ‹Ÿ”Â#¦Êšý¾ù_A© ³¦^ÿ´uô¢íØñ(Ùÿû!ÜSFYUkVÎzçþ·ÇŽÁú‰$RêßF„3Æãƒo×ÿ<ýö †?ë‹RÆ OUÍ^{ê0fò&-Mš:ÃG¦^Œ‡—`à/jNÍu’z=9gŒïŸó}ç‘·|±ZýÚ[f7ÆT÷/÷Æ|¶Zu8>çûÆœ3Æyä-_¬u:µùwÞròíÞ N¶A6´•Z›I‘nýHZu¯eþxÒ†;ÌV™)/nÿGú«z>ö÷ewAé+yý×Â?½txãõ2xEŠÈüNhþË_"Ethó, a«„¬: ,p{HQ gï餫î¡át²ƒÖÙ2g<ÂB‰í¸ËÈnþaòñÕ¯)=G>]­.^q-BHñ % ÿÁlý÷=‘Ãìžø±¡ÖQדÄàr5ÇVÕ*¬U Câë­û-“\0‘§½øÛü´[Œ’&pBË4Y[§Ý"IóÂEü CFäÈzL©´ÇT2Ãõ¯Æ/¬¨‚èEB5éMÉ¢&…Zq‰^QÅ&¡š¬ã%]”0kæ9J¤Pÿõyÿq2X­HªãååXSYY$®V’Áµ£ååÈžÝõnR¬ÒJ?ÔWçÏÑÕ‘væÂ:šò&¿TœünW©v>ì<š.ñÙ+¿§gêç~[ÏTÈ«_Ù'ä£Ð÷EõøbE¡g_(ý¬šéßûŸj¦ï¨Šáýð©i&dÿ+UúJ]}'?=”s–­ öËjf ,bz>/.™v&»¨€ËÓ§6=o-H’`O^iÚç™óqª·ÓËŽ‰´ú˜ @4Õ z3üÔæSÓ I‚5Ï»­¨æüŸó1¥ qÀ¾…;ì¼Ý¼"ßlåv¼²µHn·³™Nà~PÙ^gã¡j?ïçNýy†ƒþ¸‰Úƒy#ãJ¼„ë0…ÿX ‚­×l…•r4?ÿükž×Î%£$nõÛï¿Û˜[Ü0t#ÐuoVW'ýhùM¼ûýð“¥°RŽ¶^³ó¯<ÿšçi`©Ì%£þåýw»aèÞbL3 øh3³µ–rÑ·ÒÝï/\}·†ã¨ÆôP¦yˆ°¸êÝMòÑk’“¬N ¸ö½n¡ ÷Yð¦EôBùŠ—•¢ÜÇ8™œÿ‘ïÜ®ÒÕS(8˜zoHi ü"ñúÝ÷ûÜogÜ«zq"KþÍÔ¾S:óÿu÷ûíõ{r©è§ÀÇ£ñ!²ÍTE,¨TSÛ†¡û„3o»=RïMxê;•òšñ3NËÈ”ûvÁÁ?]çZÇ[Íê¥ù[£Úð½`¤„›oPNB¥¤÷+Œ{ʽKã·wnŠ\Ìxþ'.Ê›ŽàÈpDßKOWß<óó Ûn@6ƒä¢=ø½'K£ŠîÐe«Ÿë–R…SF¯\¹ì7y0QE²æìà~bÞ^çT½Ñë738ÜW§ËQî$m gßcY”åmŸîhÁ“%•¹×À ªQ”Ž0’Í%’–ì3°'쯎F«àºp,oL`¹³Íë§p‹¼'|Æ‚Ü+Î,¯?2¬†áï¸î7ÚÇŽòÝαcío¸îï®%[@¹ÌK[ÆÅÈ„Ñ..[]ë˜uÖºNÇ®L÷z#ËX ﺖØk[åS–à„jHÙg2UÝ×çÀ½~]*[c7«˜*®±{TÀðn®³p{l) ýø!{. ‘­¥ZÒš­Å‰¼RêöŽ¨FŽ©°Óf ;Â…M~ã¼Cž÷‹sÆi‘Ç£|œÇ£¼M@Ó¸œð¶Ø"˜gä]á¾Ú³ÍöÏs€¿¼í¶Ïýåþ>xBŸ¹Ü¾C5?|u#|•Ë5È䪟GÞû+ çÏï?¿¿¿¿ï Ó8&úû¼ %Oû¥—GÆ6 Žà0h`²n·òˆXÈ·¡ë‰öCº(‰B&ƒ$&lØ.о–§*Ÿ2³x£ȣ d¼ÅxËR”!¿3hÝ/ÅÍÅÄY T^MfÑsLðzBñŽßÍ^Å`Ê’ÏA¥Èlœ3ÿMeÃYñp¯Q,.Vd¹Ü:Óˆ#€¼|úÖz×5!U³x‡tšMÁd˜OZʾìŽÖKø™Tì¢$A„ôh'­Q*ÕkÏ}ÙY/´Þ ë ‰ÏLPä?ŸºÓI òM')ð]6ü¦“!x/ò.a ’‰ÅgrN,[}+GÕü›¸=”86úƒè€8X GüÚU¤£4Ÿò|:raÄóé6¤7®¥˜æÅhÊÓ'S? 4 šz(qmí?ogÚ :¢ŸÎyç£újû%ñ½ú•ëGâPÿ˜þÕ‡âGÔþKô½Íf GÆMž·ši”h¯aõ¡~Pä<¿xñâÅ‹ý‹7cB.öë'þ¬*ô!¸@¿R+ú k çªRý¯÷—’HaL‰’ã7+6†¹hëÐY×={h+šl+7^*9ΆS*qI–ÉŸ…Ã4A¸Ø^™îú\l ¿£Í/œh¤iãļFD|Ô0ó̼L  Ap€ÊsÔwž„Ÿ×«¤qØœÀÿI™ ³?ª8¡o™Ô¶V; Þ±– `Û©vFåBùƒ뀮f›m—’J±hÁ›ZÐ5osè|®l&µ¾_ó<àK’¨I†hšeÏÔËQµ°ÁÍ’aŠ²¤(>Bˆ!tuúœ•¦‘-Ñ7?‹× w ŸE~0ÅŒÕÞÉaefœÒWêFWH“@A8AëeµÄ ¡ÇEp­ç®(Ed<íÒ¬}ôÙÔ,ì¬\¾4€Ø._EgG}¹„²ñòî’0ƒ"¾p’6k“ΰŸŠ]ܶ%°àÐÝÅ–8R”Ø@[€„1dt5"÷wìb×H°†m.ˆmŽÁ0‚¦bTÏŠ®§ë«aëýf`pq6…ü•¼bó:Ý,z¥ >j -ÙQ¢y¿kÃþ< FkW§xGž7j¡Ö =؆ž0°(àÂmhÒ¹hÿ òòÍ–äUõî¯ ¦iǶiàâENˆ³Ÿ+ŽËò}‡JúÅÂ_¾·âàRéÂì¯îs45¸ùú,}>ªo®Ÿ’µ!T×ÁbHWÈl ¤iZ’ÓÉ„,⦠÷çí7jŒ\ “§ôβì ƹlLÓ¬‹Ÿ¡tggg‡W°ƒ®i"‡SPþ +sXí`^×Ú¾)ûU.æŒÍ2¹ l ¤f úÜÓ\!ÓúÄÚ6Y¡““B<ýèªç+ŸAŒ7cXX8ÉrVS‹ÖWcXÇQCŸµ/I£@;CÐ}ù“²ëÁYEוÛåOæ§H@ñì/2%ÆtHëGà„3&G×ãÙã’䬢ܦè:ûÓ[¦ÛVÓˆà“áþæ#{èÆÛ0ʇÑú}A*ßeˆ…ä Y˜Ožã]hÒ4~fôF:j)ùk…á;1TkõŠåºV94Méðö]EÄòùƇ‰EwÜLòM²sÌÖ wnÜ}À¶;¬ú/YGÞ(øÇ3#Þ4^ñP½ÔD¤Úr‰1a±j’(¤‘‚íxÚDÁÙú3­R‰€ðbJqžbÙ7kÀ¸Z›ÖªXøü>Uùñµ=ZrŠ¸‚PRš…¿ƒÿ#¸£{Àü³ÿ³·¯ÙƦˆÅ?Ë’†Y 5‰{2úí.#œ³E,9‡°«U ¡HS~Ãpöç ?Ìú2ÅF3\'ñB¡üi½mjo˜ýƒqÃø¢òv@Ž³^ïÞ0âwK½íí,+jšÙh,¼YfÖèÞ¨}Ù:.û\øïôºÝ/q…Œ©DéˆÐ"ÐÑó“ø]Íÿ Æíf!¨T‚‚i) ¥²;ß»ó®L)0ŪãKx_rôÏs,Û¶eIdÃI’mÛ¶¾Øïx®‘ßhÔ$/œKÈAo÷ݬZþ—+ºl¨=¿IÍ>Â_ÁG¿yj@…9Év¤ª\©ÈUɱ¥9*T*ÝVEtUYÑ -ø7Å2_¶‚×ãü{6ë©Æ¥§,Àö÷8ïya¡R‚`¨š*;ÕöÒoE_E>j£-t-B­ØRs¢F–ЀÜö”_Ÿ**<ÖŽš˪‚Xf¼¡glz%¶€<´{¯²8'ÈfQ+A;RI ñG w° ò­¯ 1Ú·œ,[º&íHÜ`\Ú‘4ÝZ‘)¼0Ñ’(Ü÷Qsv8¶íš©¾iË/x,BìîÑ;’s‰?’%,ˆ”žR’x´Zÿv´Õ·©Ø¢(ð1Le‘⯠1ù;ïzWT,Š‘ÜlTG¥:Iëé}ªgUÔI«ÀçÑ– ŠÕmXM!\ëGˆ÷n,Oº­n@ÂÙ(7_Ÿ·HÛ,%•\“m¶¯†§Š¯™û˜¸¦Évu7Q† ©Á‚q­aÎlU)»\~¨-1^žù¤kµû¬·‚7‘Cí Ê<~zª“ 7ªÅBðS"Ìê{8ÁDãUrïÀÜs"´°ß£åʺçûvµjû¾·^)ã~o[ç\Ñ5•sýp¿a‚û`— ú!TU)!BpèÞÇq$þì(ˆ">|ø^„C1¨^"Í[5»Ð£èI­x¨pì?ÌÌÀ§$Fæ°BOÐPÔCÍVÉðð&AwÔêëÃ9Ü£pcèKíØI%à˜—Ë Ë‰f2¸*ÛÒ™" Ó-ûEJæ &é˧kÞÐ4(-ÎóŽb1eÀ +±¦è€A–ƒ·×b[ŸÄRaÅŠªú+¡ aMù`D°{òùQÀÈR‘BŠ„¾·ÙhTR¥ãßQÒJ£Ñœû6ó]IUóûUÇgÌ×TA%èol£,ݺ¦ÿªµNq}ÆŸ"¤?[LûÇ8Û>˜Í„Ôö=ì :æŒYP”¨„N[Ã?&)Š>ÕER×Æ* Ü!¤cœØO§è:Ê*C §)Œ)š¯Ûoº¹ï‹„ˆ¾|àÇÍu¹%ÁDÍ£1ƒ·¼=VMdŽ™ðÇêuJ6‡Xo¢+?±ÿn?ŒFe̯ݻîÞ[³@À“¢°!„òv?;ûIÁ©üÎd³Ÿ€œcü;e‰‰fáºV[FwòÔÖ§› 9¬F¸u‹ƨVë›pIe¹¿MƒD¿SóMCp^ÕK%×5sîc®{‚aúû¾ižÎ±Ï9÷4è㪠Á0}°Ä~0Ã,Ìö ¦œû¶rþ¨ sÝRÁq+,‹È,°LâsιOL+`2±¬ °Ç)”\—)*®Rìs¾UÄe‚ä)#x¦G'‘p„oÊ šªªÑ(‹9ÙÆ4…ÿ_]á†&K„ “UiY¿ò/~ÑGeÛ"[U…Â…še"˃OªaUµ=~–ykOÇ‘ N§³2\œj`Fࣲ…PÓtw[öú…œ/ì ÖíÖ®kšÔÿgf¶ i™v°ò2ƒäðç#FÁ€rÔ’ÕlJ" B0‰r’Ð甈+—S ¡FI¼ý\X[¨ BöUú×±~vÔM°4»¼#ÖÃ*Oɉ¢Ñý±%Ýï¢zi$!áê·ð]ðšCKèŠ Á )›€Ã9J00vØN 1«"†Åíq6 bJ aMÈ@ÈŽ"šò³á¶PÔ‚Ê¡·Ò]Οõ.©±ŒƒsLå‹óV ¨r®*ªÓ·« };¤êÉ~¤ªf6*Ülƒ«ª(ÿXÕ ]UEf*r™bÓ,>S ÃrÙwÙÿÀuEúá…ø¨Y<ð.nDñ2?TÐd!8£|lNPׇ=&ÔN¨}¸®«ª(Š”èõ£Ó8Ïù7•‡ÎQ&ûo¦¾7Ð&\ìF.ŠŠª{¢ìÉ«éá6\_÷ªþä$^” ³ WB%õg¦ë° ß šW‚d"Xé¢.[ì6ÇíÌýþlúòºì=p½¡û@÷W—¿X+Ú¼fB{4h©47W*Ñ7M\ªÁƒz}p'+—‹ý10û׶Øk†ÑèF#í&x}–Y¾(›†·ÇV½æûÑíK1Æû+QDµDD×/ý̇M¹|¾mä0E7aÄ{Â]ôRø Ø ~:ZaHc¦‰2 ²¬Uº3<|ƒ¥ `z«àÌŠŒáe—T‹†É‘ŽÙ¦¦QÄö™‚1[n}ò$Šª(È{L™L‚¬Ëú̾¦Z¡i¬½Nv½r ;Эf0²çÊ&œ [Å¢MHÞÚ©zVQä%T= L¥#J=måyÓ-?ÌWH¦Ø£{= è9vÌà>…ç5ŽêyªÈ¼ˆÎ‘+ ÝU”]ø or4½ƒ ’²FW¢íeÀš" tWUwŸÉcªkö ™—ôýA¢9AϾyÉ`¡‚ TÔ°R7­˜ñ-Ù}eb¾çÒ:òK!ÆgÅÓbJ,öSZ¨ûzÀ¶Ëbˆ Á¡ó,òç±Ck²!ÿ>ê®óÎb&$=|&k¢nº¸&óâ>ÉB!êÙƒ–d®¬GVʃ¯e„K…ŠmO=§„d¾ëç³qžc ßfaðüƬÔð|€bÝ=aR Qÿj(ˆš}×Â8ÌVð›^ û9O›(BC˘Âì·aŒý¹VÌß+~ èÿõöÀŸ¦ßÏ>}¶ÕzöÙg¿í_U”¨aо |·ðíì 'Móäïžüæ¿%^G7Òû ›¿¡Ú,õE£öP6ÇWIX;6˜ò=LÄY»Ë\ÎØVwAMß1u¡»U˜OZ’¬Üfn\€ IKعùu¯"ÜVÛ×Ú¦¼™ûâØ̫˹Á€U×(Z ½®nï‹…þ Ë§ 1µ2›C_sD|~•%/ôbÜ£WÁ÷zÃuàvõ±E•1uñn]£L¿·±£ªí¡§@) +ŒýòÞR2ÈòPRð=ÊÅæé ¢êìD…2F+‡ÓU²qºY,2[€1 `‡*8nu™¥· TÇMØBád–å !yë”ÒK-\ñ½/Ï8Æ 4P£<›™p 7X‡ÓŒÌXUH%ÂïeµžÄt‹ÞÜÊ°»YÕžQžtƒ@@Ï œM/@’­l‡ø úá®!$—**„†Rñº¸½Õ«Çå„sDc ¦T© Xe £—ÂÝ +Ç$ú6ªÎ—dBù§W¸q}xÐïCÛþÛ :wÔxÍs¹þ÷4UÅsEîÞâÁÙð^ä®BG©í›oÒ >©’„(`óMæNùÌf„ÍHRÙf?÷lºí$ ¾LA*—ZY¯»d—]ü É5™ž”Ñ'ÅG¡2ï˜=¨{õFq•°Él›˜¬ØS[‘Ù¨¬©Ö>Y§'Ý·Tmr: êõ&&-9Ù4'³ïßë15ÕúÖIé¶ä_Â?ÁµÞ’(«ðS„+ÿ:„f2ø+íóüíhö/¾Ë?¥i:5‰ hO=¥ 1©®iO­ ûo»wŸ"‚¨V4M§'OR]Ó*ª(SïþûgjrñºùôC7£‡Ð“uçd“"ËâM 2æSÙ„"Ï#ÁåÕ)Åç®çªjûÇÂp߉­(¨8ã%À^œ,¯ÈíŒ\Ó¤ßõ1ö¿ë›»ÛŽ ³aR¶Œý6ÿ ÕÍš¦ã~½v¿·öÑ£x®šc@sÐG)öl‚TÈ ÛLù͆­Q9±ÕÊ©ã©y®Vž¶]¦ºiï‰<àÝ'K‚bKûͦEÅ9ïóT꼿ØèÀ<úØöm>9ª¯Ô«:°‡cÛ.ãÍ‘œxÍj¡!:™ËOOð$zúX©Ü”?Zž"ì5²ˆEÒJd\§LJü”(­2 ¤ûw¯µ¤Íx1E4d²Šº$£°¸¤¢sg—W¸_ïZéwqܹ×ÝÖØ^ ¦ê€úkFEØd°1³1[íZ¤YpÍ@mËø.I`Ñׂþ½_º¿F1-ÏïiÜFëÅ/EO£÷¢ º+ô|pAcp/`ùÞ¢Æk= ”…mJ´3•€e ­àx1§ÁügI+‘ß ‰"ñ~÷:~ï¹V(Í.E4˜¡Œÿåòüá`¿å©¿†0¡'NˆøV¿ßò¥C Àüêú®f T+ñì‚p›æ½ŒIyt¥[mïê7s´a·ÚA÷£×££_¦sL(—}‰è)/¹égôF¨YÄ«+Ó2Þ÷ú¨l*îÚBéÐ’‚”¤-âÀ!™Çý”Ã‘î€ ˆ¾{bñ}R¯/c(Š¬[/Àsÿ¯öÙpiq‰1®„$ $‰€d;%Qt¡ —Š1_\¼ñÆ8f²PÎ33f™ºŽÝ0´ûý¹hqiq)\ ‚¬´ão\\ä*.°ê{5Ãà M·L¦`ägDY3 Î@Ð5ËTV0l·‹EI’¤ÖJ²H$Ÿ­ "lkxˆ:¢€IɶExKàkŠ"誦ñ `iæ/lÄÿU’L]°Â,`X°ü/­V‹‰…b5ÞøEC³ ®ª*WŒ_ØXùY f`) ºnÈ’)K²€%ÌL…aA×,€ûš¶-‘r©M0C™ºX B"B6×yÓjqôÖC1@aq"êx@gp‰}7ÄK ¬Å D I›{õ-qX ”x®–Ž;[EˆüÌ ¶õ£s»K-ºø×!¢Mô*ôFôô{—Äj.!T’¢&IÀ j=ˆý@ª Áœ²/2@›f„‘ ð{añPrFHîè¶lI‚Ž€pÜß}ó¹Ýºíb¿Ñèt ?Ÿ 2Ôeüá©sw:³ÿ4]QUMCÕU"8;QuÕ0UUtMWTkñ,E]yOG®¿ÔMõ»ð=·ûÆyÞ~éœ5Â-*­åœ±þ^ýÅ¿ßRÚ¡Ç7^¡³±«ò³OÕ±¥Ü£Ç˜ sÜOD'Ð èn„ ˆÒ$æá(sLü!n‚)'íE Yç¬ÏP®1ãpxù5¿þ}F¹F;胣“Aã o sk÷\4¬}nÃþO£ÑÈÜCùWrfj’[V¬iãÝðž!u›Ÿeƒ‡kÿd¥r`#F]´ÊS¸ˆðHÚÖ"„Û~,âvh€7Ê÷„&Y’5¬B‹­ŽÀ =¬È«~Éà×?™ÜFTÏa“¾·àeƒÛ 'Ê­&€£ÐUaHÉè×{«ª-«Þ¾®YX°ÃÅŠr 3}Sê+-Ö`Ÿ"åÙiAi—Œ”߶¯*ºöËcDTŸ,WýI¤B!;pÝe²Ì\[L×ÝÞ{Íý‘¹Ûk¥çêVÀ7¨\]½Tò˜,3¯Tªa®5ŒÃF¡Ä,–yn¡ÆÃÖœ-`G¬'Ñ":-Çqè o̺"¿òh¡%)‚QÉÖ-9––DV¶ÈÈI /!,­{Þ³ÇÛ3i´6ËhB·ôVtÙB¥âmbìeMS¨øC|„aàŸ£‹$wß±gGPͽ`)•yÓ‰\Œ¢y9z>¤(rðð+8‹Q äzù¡¯3FT9Ó¨fYÐ(íRmö}öÇc÷ŽÈr*n»b¥Ê @ÚµÒsø«ÐÑ{ÐÏ¢çÐÐoBÐÄ(|Rì5ü‰!D5v%#ǤŽÁdâÒÔvÐxá6¯å+çZ÷ËÅK³Á¬7y´„~·¾×à……*µÐ§Ö §5ÂѤ Ý#S\ž]¢ ,Ž+º\Z‚Vñ¯I©8»ÿ±>èÿ˜?,‡ü™2~fvl¨¦v^>xš˜ÝŸMï؃±m3+SÐ?6I+›ÏC÷'úÁx¦ž€GNÊ£ôÐSˆ6#‘³¥%4’׎ Ë,(r'”¶0]!‘WŒ´¹ÿ$ÃÚ? »&™uýsÞø·^A;uLê”vÔÉÄ­Æ{’›–ÀW‰ýb† ”cdåÓ<¢1K€+k™D:h®ÆŠV)?#~ŠÎég“Âon^ç³ ²Lâ¨õøÂm‡·¸q8ÄV?=:~¾!M)`Á·-ì0 DÖMGm*Z‚ ™ëü5ØÏ[!”éܲ‰àße¸[&!Є™a/þ‡lmí™’ÁàÔæb@¡…*üøŠÁ\´™±Í1Õê5UA’$A$DÓ–$ÁXëïÖÚªî. ’(I‚eSŒ¹Ì¯ÄsK@D‚fa$3Ø©/;.}ü)òò#>Õø$xFºÚþ"§†Ã­pÕqá,0’8˜š‡ç§IÊwð2ÆØè£!²£Ô™6ôǧì}œ&à˜èæ¡ CwpscáŽ)Þ·NßþÇæÇqÚ J\÷gzm¶ïË¢wáTÝ÷U;xî­;à˜hÅ÷ë§.ô 9?üÝÏ:Îg·ž`2g);?ÅÑœîäm?ɯLñv'Ë™µ>8BÕ?ÈÂ0kûÃü“V‹êŠVL7Ë+§o?É<‹jh^ëjUkƒ§^Š'’ëà ¤¨³HÒQŒ,ÒYæÓê>•YÙGÖù‹z+ãn|ÝP398Ô »K àQ2­q -ÕÄÜä,Ÿ|¥0ôá ý/8m˜6‚ßÊ14t­ooè ÀRÙÆ¥ÈH‰Œ RÆ@c+ôoÚG(ãaìRìBZX•v)cÀ¾çzk©¾0ÂÖÿ°)Ýnv !ÈŠt\TÖRÁ1B€  À`½ÚëEDUKR`B`°ðYZo‘|®(&sÊugÊÖ™Åã|L"f2Åyã¬ÿUóøW‰ëŒÿ7¶ƒ&SJKì¯H¯è ‚†9ÿñhÁáLÄ€ÎjÖiHB±Õ^"îqD`ƒ*JÞ&^£ ‘Ï®Gñ‹¯Ä*þŒ)wè`ÿà°ÅÁëÏcƒvøûª5f™HätÐrSï9DÇÞŸê=¾«Öt„”Jß‘j!~@bRV‹P‰zbƵL°ãO5_uÕs¢b‡cj>¸«®Rò\Fôµeç¤Rîn”K6¥v©Üøj]5ÆÁý.ç–§„‚/0jùB€Pð4#(õ]NÐï„£îoa´ïWŽ« › Áì @Ó®Þ í–…¬êóßD 45Ô+<.eè2D ±( ˜tp JTx±RSÙ¥€¶­äy]q?ñýÿùYÈJ¼t6 }Y\LŽï¼ÆUNz€$qÇc7I@Ü“:Ê;ygŒiéb!ý0:[â%J<׸‚ á¾!H;¾ç8€´ô=¥ØŽ8a×=)¸pçRG^ÛÆKî8-éâdG´t±$yxölÈeéb‰Fqp²Ð¥‹;ÏØã )|2ð•Úw]ƒ@pß³J´ò×pÜÀWšPÇö|.×õµ¤Ì ,KV©é>Y÷3çEšLÃÉ4ICeá²'C²¼®½¹¸+4ioG¥ð}\`éh˜öQñhŽE×g§Ñdºãîxco>hç¼Øȱ÷!N©?@M‰vAuÿñ¢;݈ï„O¹°@ÎÒï‰i‡¦•™¦¤JcŒp‡ÆŒRZqRj—)q¹n¢Q£ErúÒ† ÔF!`ˆAãwšš»„–mš:UB$1ú׉çd„Rh_çR©#Œ0Æ€ïÆ”RV©øÀêŒ'•¦È% „\ 1!u™W „6d=©ká-Ѩ¤œÕø•*e„àÂ4Ïà›±û¼†7X™ðV™\[—æxSVtâs¸vFëðtp-ÇÆ4™ÊwŒ^úäÏ ¬íñ%‚Û÷ÿa_‡ãÿý¿ÿ÷ÿþçRÃüP:ÿ€•B0v0u—!~ÞRêy+†e—bg 1_5 ;3—bgû¦îÌÁÌÌ®†Â¸]ƒ™)()àÌéÓ§O?ŠñO½øÀ…ØKùÞüûw­ùÔu°óöTì!´'Ò·;Øq©¿v¥;.°ãÒ¨A]GÔup¤°ãR›R›º¶l˲0þÈB€#ëÿYÿ̧Õu¾EYù.Œ¸["U< ^ËSQº…K3ÔKO')ŸL'| mC4JFý®Vÿ¿6Gžo¡!‹€h|Ì ÅÒFâ$âÝÈ‚éMÝb2¦–:ÞkÊ8›n¡¼èÉ®˜€ÿ¶ép0m¡ zèG0GibÌã=·Èdº1L7¦ý± Ñtµ·ÈU‹Ûtjb¦¦ï+Õ—T©Šëyn0*—³ ¨`Æ…æôc°?PîF±ë¸^¹Vï¸.„¸êl¶Šq‚P‘ž(¾up{4õ»vÀd5;«„âè^—#ÜBÏðÜ8r…Z=M@¹<±(5[j/=µ+•ýJ ªô™‰¯|]ˆž°BÜJ9ËÊÅl±–ji»]ô{D)A¬Y.Ae6½^»])þ4æ!isºœdÌ!'ÂZ]úu³"k5[´B–,Sn+à³"Ü”Ëy»×k4´ò]0R†J©H¯_´Ûi­.<Á½zyÔK¥úÃnÉáMš_F]ë—» ã]HÙ­ïJÏyÞO~Dyi>+qõÉO<“ª[ó¾.ĪNH'6;U@ü§£_^PG»V9{>F~ãekS§²À*‹£e-#¥VZ>‰j=B-Ì[1ãÑICºoDùgDȬväø‚J‰êê³`~H*öÏ"šxØ|ÏHù „1ú„ Aö6í8úm6ýR»:j;G‰]èb%bxÕŒÚëͤ4Îk^ë)ïz à/yçWÞiYù/OmäkÍýï°.YOYï·þ“õ7Ö¿€„R$ïõ.$’ÿcnìÂhÁºétõ;ì™9ð~—Ä,4á'+5Š/õP€m J(ç5Ú‘9kŒâÑQ¥`°T¼%J±šÃd›p,™c>hSó÷kâvÑѼ­à«|DVq~ý½¶¼¼– †;£Ýû‡³|™í"6N»š‰ÏLk|zûY¶?%d¬ Ý7ãÛ¬Æ_!zÖú[èʦ[—" ë2¨§ÎÐÙAZ…¨´ ‹…yTž˜'’` Îdè%ǶRº þ®Ziµ !d >ÿd`B[­ vkb²¢ÿªùÏgI¹œÀìÏ”òÊ®94nÙ;uØ@LÙ¢ö>¿#Ö®”«cÜœ®ÔËÓ&FWË•6›[MKæN%OÜ”œ9Öã8lƒeÌŽjõ ¡¬^‹ìO¼=èÇ€›!óà Ó¶õsÀ4 APG×v”ynoW²¬µòÐ5þ»ÅƸ=Þ‚.gé”ñöŽûñÐf¢È­6û‡ŸøîõÁÆ ×kójº9ãi7ïn¡xÐDƒ~A®¹Å‰Àî”pƒ†Ü&XGï>þ6ÚÂq÷K4 6¸Ät2êÆ£-Ô/ºEÚþ½¨ÍÛq›GùK¹T?ïÝA{‹ÀëµöTtàÏQÞüŸl*rº¶ DÒ‹xßn¹l\†PÇ€§1ï¬Ëz~–'ðÓ¢V•Æ¦qלù*Ž×žä,I£Jÿr´W«Jg !kö»u–0Ù/]ùwÂŒǵõªS‚©`â%¨1ôqn#«´*Ž5RFàk¯áÖފ☃P©s^FÃv|ßV lÌAÄ”–Ú0WkIl»ÑYyªUyZ‰qªœJ:nƒïÐD„—¤AÔª™®Fµ*“ Š‡µBøƒ¥1Ük(¦Ê­û‚í³ ñR‰ÏÀ*¯®9 èì6´iaý€Íaâ‹0âãPÙr†~W•¼?h4ƒ˜IþT[gRû"Që[ÌxRJ&5gdÿ4TîËûU”6AôƒI}Mu –·>ÈtÇ©i·ˆ÷»E_/¯(ËÐÓ® ]½£IKV.Z( y8t^xÎ%Ñ6£Ÿ…­7÷=¯ÚéTÝŸßЫ‚*Fn3’IáL¨àŽ©eiz¼êSV,Š £XéT{n”¼hŒ@9Æ«ù>c¤”3©]£²9Ž'Q]š³8Éúåƒ(×hÉò¥Ì j­A\hy®NµÂ”ñ9Ý0êW+Æá‚’¢¶˜¾}â ‰„Œš.BX—/•<…¡¸ãL~¦Tæ—W=H#.k…ÙÒE˜:`;ot9}@Ÿq@”£ %gŒÿô•lF™ï‡Æ /ÊÓ }p¥T¯Äq¥^ªàµàz¥ÈsB0&ô}lì/Cã¡F»!¦ª;qæ#ðzg1};®´ ¥Ëqã ¯.cÉÉ ˆµ·TÕ®Ü1OÒ" Yæò$¥E<‰ø‡ã‹ÓN@WïëM~è‡N­¬” sߤ·X†Õ•S?4¿ðû÷'~âæ\Þ÷ÊŸrF7Œ—†7?!óáÒø†‘óS¯¼¿ŒñÙT_µÕ`clYalFþ¸zv׳â A}*[Sš×n¾º˜¨[û-ʳZŸ•¿þcî¯(™êÿØß{ß²ýÿQ5¥W8ò¬”g¥óŸ]%kBcLÅ­k·aAl~Z¬4 š&Ó ³š¸nѬ}çÁ 4|ô p¢G“þÑMÿ û#÷‚”ò‹;^+áøµìDÔ‡ÈÞGK×å~øËö|S(Ù‰ýÕoYö«ØÖ–ìÆÔÑId|Qv—{«ßõ³2<¸$ÛÁ¡w÷à²oíy>–*ßwÎ;”ö·û)åÜ; nÁvÜ].WàuèÝUû[Ô'4FÐÝÔº~_éreùG]ÛøVÎãÂæœRø„°úÙ¨|ƒ&U‘ì{R‘U»ÝZµ ži¿KËʹóM”|D©»ø±Ó[z GW[m{•Håí'¢Jô åègž„Ædz·¨Nî¯L«$»@Ý=ámc. ŒFU”\/Á£]H“q1¬£®+ª-bq©“ 9ùS4î2‡²Ë‹ó«PÚ Èž·¬Ò|‹L% ¨&õm•©dì+ؘmMŠ0SrÀs±Ê¢T #Ú,&±F³„Ç›ü× á& Û6V‰+0J„Xšt "Œ‚jµ×«Vc8*–™ýÇwźߊ¥è?áE·ÀJrØêëmm†BÿI·Ñþ%”åAê±ë5ª¢éÖRöû”Š{ðm§›”{Ê`”Ö:½Ý&*•B­ÃR ¹¡5Ý‹•É±wÝ¢—hôŠîAèࣨM%Æ®±¬Ô‹ñäN’ö¹1„Fñh¬Eÿ`œ.ž˜LÇy Wëa?íÂpæByÖÁæmË*ñú¡¶]êèÙ£Eõ×áHÉsúß Ôk­Ý¢¯¼+W²°ßX_¬V!ôàS^ ý^öÏ¡»‹Ýg3&§yOwB•G¼¬´C]†VÌX|Òásè¾0•b“,‡.ޔ캇Gp§9Pe¾—„”÷¬‡xë—†ÆÖ“w½2¼'ý¥pñ²æÃkb;Ü2gÍ?ðûôžh^†ö'îglGžëCøwœ?)$©³^á,§9 Ëù£¹¨)ø’3º9jyýxÜm±YZŽÛÌEð#øa¸€ #½2Äš|ÉÃŒá&¢§ 2Â6PÂv Ùe”€G;MQóÉr2 Žƒð7f;4äÆ£tFAedˆé)F0n!Ô˜°S [aÖ̲„åÉI?[ÊšZÛÖ®u­u:–1÷à£u”ót4½Í#µß;ÒMZ%þ.é4_>ây:uaT ”ÏóƒñRÜš<9™<9¹fÌ´v_¹é”JÎæ+]­Ùxîݲ¿ÞžÒt2‰ã¥W«“/Åq/ÅOT«“w´Û“óçÏŸ¿[jOé‹!@xQkWË»ï–ÚÕúÞ º÷Ëk>Ÿç›++›yþžvûž• ÎÔ¨XKÖ1³ Öa9¥êuXïöŒ„>ILK@FÕ4+…çÞHV(³K^ÀD©'jàC†^ö öÄoÖ(çt–wÑl®1ß[bÏ(ç´öëœ{™&žGtæM/†¯ ñ’Rç5ß+Pîû½×tJ/™Ð¥§MðtEäÍÓóÿAP}:0§)Íž¢†T­¦PmªlYrªÛÛ4RkÙÚí).z¿õ"ëAëeÖ«,+y´_çm@ËoùvX0æcMÞ| ¹¸pKIÖ —ÏÓ"M‹œ§|TLótš`§ÉÓ‚öa|ûŒ‡ó8Ø›ýíâ˜hþ®Õø[MfÛ¬¹å!Tÿãûí ñR|²qªÑ8Õ|Ÿ×òý–çïÇKñ¾ïµZžßŠŠSç38Êþ}ÎFÊù¯Q2èSꡉRäQÚ9oödaáòÆÆÆF©V;[«_X8^«]ªÕ®åµÂÚÓ¹ µŽ#”Sȉë·D2ÉÆ(œ]Z½Odû†Û ŒV‹7ÛŸíÏB~ÿ 6Fƒzs>oÖÛ´D @\wñâ¼L]75ûÙh¹§ iØ×>[-·é˜¥#׸ïzGÖÛ­÷YŸ²,ð›GõCºÓÚ2Äg@?5¹”â"ò¢¯•5+ô“t5/s]õ˜ªlºNf¤íŽ¦“iº ñ6Óx—a° P.#D)¥•G;)F3„—œ±¬[G˜`€0! á"[ %=)‘RÙdÖ9yç^‚ XÍ Œ!®aáz7£\.mÁóa˜"œîŒ~hÿLÿÌóÖÛJ¥·½­Tzü˜?êcÈ_ð8B”+Š)¦›”T¹±‘_ŽÀpMnÓ Äçív”Ôί|—$Œ ¡¢O1%D ‚÷žÍ,0jðð{k{þåXvÔ#±ìܲ½{’B¨=¯ÿ†ià­?©ïçd49wyzmÚJ¡Åw«èúØ{fz¢Pçùð‘$ øÅ!µ‹^<tÛ„uCÁ!6­Y» kĨ—¸-µ§OÇßA‘;w4Cì5±-L<±ÎH0Š0‡DIµ~s5Z–CÀh11º,,!ÅGæUÜ„«UdL-›"tõBצtòýÿÛK„ߊãVÀæ­øÎÀ÷<àø+û°»®•BÆEx!ð-;>æ>yƒ,¶k™\ýõ×O9>H¼¡Ï×k¬›¬;­W`e¡rÀ’Õ“qÄÅЀÐK)…u‡":OÀýK'PÕ”¿:ÓÔT’{w½ž4œ87ßìn~xzÉø¤½ÇS/4ýÙ™ZÜ8dmmÚ€cínbÅu|lÕ%AÿmOq>MsxBvýrQøÄ5ìÿ—ÒÔsy²±‡ý7ý =öøãð.yô˃¿[Ÿÿ¹Ò0R =èŸ?òÉOöáõ›4öê›Ö ­\¡ðA0ÄÁëL’bzjÕ ÓØ•Çðu.Ì°±ß`M¦ƒa:h¢Ñ.ä…6Iç“ôݧÆ0óýz}Á÷ ƒÿ6‹¶©+úRE8aç«bD'M¡²´8:tý•%.(Š*Ѫƒ©Ço¿Ùºÿö/«î„d'ƒ¾w¿âíÿk•nûåu„`•J÷®"M¡J¡ÉxZÛ@ñ;Œu| ¢ýJÒpîý"ß|®³¨#™,½]¾—¿5*‹H±‘ÒxQKQúð†´þ­êwÑ8<„>®»÷Q·ßÿn¨<.eð¡e½ àGSáü®<û«éÚ¥÷>8XKõÙçÀÏ<×0(2òÎÙw]/óûÄGèI>¯úL{¯¼øC®|égî&dPݪúûcH'«7(Lßx Ï ¡1’í(´¸xÂq4#b¼gŒŸãfcÕr¸Í}H“öü¹KD˜$&¹iª$±U<ÏàÕÕ »9 5[íÅÝÅE„ÒbAî¯6Èõo›NÐ|¯¤—šz§\ájÌÆŽSý>­,Ne¨Æ¶uÆz9v0Å&È)í¼ÍÇb;”‡SP`Š8¡ÞçÔ-}ÅtW í dîÓ.Ám€ò‚¸ØÖÕ0 e.ÖzÝÃ!ÅDÜeüôi.˜*=DxnéonaÓÔ‡KæžØ”K™O1‘wš°¸ÿ÷²+ººGQ&bYè)8°î·.ùÕMÂL5-1Ð(ß¼Ô'ÊÁz¤·Õ‹î2ù¨€t‹›‹&SVzuð:"/P,¡Ôºë`nÛÈõG€ rp Ù73RfbÉ”Û!±%Â:ŽÍü½YÔn ¨…4*ìkðF²+Îã(þJŒxÚî÷ÛéU£*Åç ­ŒØ×½Zb*µÂö=̆ÆÞ@+ÿ¥‘Oo÷õÐÎ7Ö<ÚíÑ$lNVžõº±Î.GúGÊÛ”¶Z)m!Qÿ';ð Û´NYwZ/¶^cäÇd©$gOT£”Ûœ,ç:rVBÔâ(g""ÚÁøt2K.ÕŽ¦“qRnï<î®C›GMŽŠô”#Œ|¯;âM€-ŽÇõN B5jjH.ÉæèÀi2Œ¸+ŒÞÃE (%ǹ½fà’ÿ‡«{‹tÆ‚¿! ¸«?N(…Ágð“ ¹ĜϺHý$À7œaŒÏQ!Ø­ ¿p ‚ž#æÇ$&ôOo%„Ê÷KJÈ­BÜóI(Ù£’HºG(‘pMÆìw)P!éÚëBô¢‘UJ‰:|—Í2*}:T„Òª4)Bìõß‘Ù`0#Ú½؆A¡«ÉìÍ¡ôÂ?.Gåǹø°"Ä…Ðo—\çòíJ}KpyEˆ+’ [Ö¹_}-Nõ0&*L³>GÓÆO[“”wÚ¿~ÓïÂo¤éO ñ !¾!ÄOù!„øL „pE¥Ï!Ä3ðóZïS)é%B.Q)éþá>•")!w›Ú¯JJ!TþjÍÜM•"é¾U‡¤¾P°KÓˆþ`°8œ¼Œx‘RM„ÊÆ,CÜ à­dQ*‡ Ÿ¤$´¹¿™`3ñ)ݬ̋éå‡Û­ÆVVš°j«†Œ3‡^jx‡—‹e×­w†  ¤ÔNhÎ^(Uõµaž(ÿ3¸þôšñR˜=ó‰2däPã¿@ã¬u§õ°^ƒ¢rշ㢂, Äzõ ŽJÀÒñédÔ1Êm¼Ó¨U\Øô·€Ql’Ñp0qFE† Ußû Z\˜èË™·ÞØÒ7éÿDÅÕÐÉ õpÙ1Ðl®·góË”¸ 5„ Е58„u”ølþ´ãzæ­¥ïi‚ÅõÓ”Š7µQšÆ×:7;^d¤H®ñJ¥úz³ @ e”º - ÃÉêú5«[ca#” p;¼»6\©ùñ(-^eY´L_­Ï,k*é@+Àª„ñC„Y(KȘÍDƒwÒZ|(«Ê1É «ô­.û> ²ªœ RI„‰Y³okÉ9Øë}¯.úGU%`t§ô·fß/snœš¢T7Åd3¢TîöÍJ\À½$‘½zòRëµÖõnëãÖ­g¬¯YômH!5©9³¿˜Ð«Šû¬Ñ0Mv×W5™nÄŠ+GË4‘3˜ñFi'Å*¨k%,â§j@‚¥½D(9:Ã^Š’Å·ˆÔ'G«ýg!Ü€Üà:€•3%%iRWJT­^¯)JHCFœ1ÉÆü_8 ymà —5‰”*+Á1ï%@<¢”¼ÞùפRÄ#ìÅ1×÷„’½¡ú“öæ¿ÝôÛêQ²?ª¡DìÕæà¨U&•¨…Œ`u6tWR½ŽXª³Ñ«Sý³}¡$[“8áY… ko§4A(Y\P³5že«­Ë§4ÔkïA±mÜ(:˜‡¯Pƒ™æO2¬=÷=ká‰,.[uëŒõ2ëûÂo,P± |ž›ÜN |#ãGÿFã̉`P@ŸaÆðãêR4™«aÎŽ^äÕ(v¦4vÞ ,…:ž­†-Eù½P¶¬rßPn/=Žòtõ gËm 8N¸œX!rVýE.xŽ »@ƒR!(m¤oÑ•@¦¨ØÚ×l!ä wO\Ñz4½T—M¶ ¾]7›cÎT–7›9]Œ¶ñŠà\¬ŒƒÉ#Kq(– ƒ'ýŸB¼£%CgÍmÌ•Ðné|;4½HžÐ,»v1‹  ^QÑgÓጙߟaD&Ñâ:G‡FÊJòš@éè»|Ù@‚7›@IáE⦠`Ìñ^«• ­<ö-v¬#u“¯éÐ9„%¢ø-Ñ~;¬çSMêŽ.RŽ‚¤pïÂÁw ¬“zš2Ï ÷Ã=Fµ¶mÙ¤BPsÜ¿U*mJÛÖï+1µ‡”&”y`_ÆüÿxˆH rÆZ7Ë€€pI‚%ð’9¹5²¬N(Q¢ém›# R°/ˆ :(0Ví L¦ðéÕ¼H÷ÈõZ#ØZZ]PžðýÒð(±oÉáÏŸúkÊ»R}']ߊªüouK™½B•¤± Ý¥ÎÀÆ”|ÿü­aÂç·9ïJö7•`¯ÒAªM–C¾•[ô^¯ï!ëIë]Ö§¬¶¾l}ÍúUë÷¬?…\²I"ìEdöŠéÜ\:à {§¯ÖF¯ÃhT#ìàTv]Î?Fðò‹Y‰X€L*àÄÙ2†c„3¶Ï”q‚Aó«ss'VyBÂÜþç®}|_YÙíÎ{–¿ÊÎne§i.7{ðçž¡Ç­Ù|¿,\×Í—³p]qVf<ùS¸®;^czÜ}OrÇ¥ßfM?³Ïಥè’`bååŸÁ™o-¬™u‡e1õGGÄÏ$ø8•ÖQ`ë?YÒDyÈ+²Šp««Š!ñÊóš=”>@˜‡à8Æ/ø=»§TÏ­‰™¾5û½‚C,¦4f?KÿïlÅ{}3nÞ‡‘„|ˆ !žÍ·D[=»Æ"ös«hþ»çµ*±˜Î4 ÛÚµnΓ ¸4˜òëÓ¬O“&T`Óµx2¡©ÊŒ§ý÷Šbž;·: ‡²/îyc‰Çc|îãûN˜z\…ay1%FF–Bo°FPêøüj[µb´µJªgmÛ²x×ùØbÈu<¢Û77©à#âû_UHC2–“ +äm^›-ÅåÎ8Ò¢q×dëÄÔ†Øvˆ ˆ(¨¤ÚÅ'hh‚ Æï`â““é`¬?ÚP8ò” Ã(Cç šÚ3aä¼ýxÒ/·âø"qÍÒuí”Ý@$m_JcaÇw2|i }7ôn‰Bι›Ÿme×ù *h©Ô&#=,Ö¡¿Ç+ÃXøŽw•°ã:Á%?p6˜ó…Æú)ØüÐÛ”ph¼Qy<´r×v¿Ùœv@.êC³1¸è {}÷6m¿Î–’¿K±æK3æÓL¥4¶c½Z¾ ½Ö±_À…´ï8-m•gyx¡˜¾*ß72ŒTŸXÓ~c ØWö^굑D^CÓ‘ñ‡¢1˜;ke7 ‡—›Z˜½£ä)ºíðd¹µôÿ8§N½a„Ñu§×="YÖ_ž.³¶ª"v‡Ÿ÷ë‡ àlŽ‰ƒøþ-ÕÁÆÕ‹\¯ŸeЦ®#_ ºª÷ª]lRþ5–4Tø5 é38$Ç[ºQïd¯ÚÝ­T ‡7Š"L¹çñ4,ÄÃ!‚Jew÷U:Qßoö½P«­¯oݵºíuÀYoÃÚê][ëëµZ6Q8” &\ÒáUÕÛùû¤YS§‡Ž´lX‘NA5çÓùšäŸèèäÉ[Ç)+o‡ÙˆT†¸}<8ºô¦’ã´øÛßC¬}ë%à?Ž]G‡P&F§±h™tàzi-3r,²qu<Å‚åƒup€©ûtSƒ}bÿÁáòõÀZÀ½²Ï»Ð•ƒ˜ÀA„»3/Ü ›i,MüŸóá|öKÆ’§¹gý˜õ3Ö×µ'!,¤ Û^ˆ6ÁhÙ~SXYÝã¡ŒCûTwÔHsa§ÎâNµA÷GOf©G•ÇŸ:»[ì@wÁ%¨„@úeP‡(Æ#c< P¬Šª¤8+ËöúÃÞ–:°mô“vÛ ”t„ÍÚ}·…pœ0ft%ÚÕM‡¨abw. ® qœ ]·´äi©:|N»Î5z. ›Jµ=kW+'Ü ±XÈE‚6SȲrI ‡7_¥¤@»sÿ•Û â^!;ÄcN$\ ¨ CÎT^죌6Õ÷:<šb7óË^öÅZÝÆÔ8@ÜÑèXáïRõÆhxŠ´óÄ›uJ|1ÂÁb´JD¥uP>/í=SÙŽ6Ü‚+²êÖ–eM™¼H}h”a1ñgî©dt†ÚîõKØ-Æ3N_ºt:¥«Ó ¦U­ŽNoŒÎœmœ~Þ‚R©}æ%/9Ó¦="§¯ö9;èt[Ç­"Tu#{àM†× ½Nµêç¹_­vöÿ¦6ÿ[°œ-o´.ö"Ù6 G|X¥ZP[ˆ€ëÛâ#ÈUöÞ8Ü…+1l*àC~ÆžßvŒ›œóðîÊàÁ±g0j¶šÔNK€ŸÞ)–¬´Õ÷ƒ~»„^\JsÏæ?ƒS £eU‡©¸øÀ»/‰"g|a0ãh{‰ëºbáv»x 4™¡; ] ­n–:ÅkžU­0¿¶ˆ«Gü^f<«gËdjŠSRpsARÕ=…·Ñ`‹Š~B’Q÷Ñ3G.{|eêž_þ"S–è90»Dìþÿr*]zf.÷ÉÃ/rLÔ«óg?c´ì{)®¡ævÒžq•ébEr”©oÆJc¼fÍÎáÚlf#)MQó£+ rk ó `æ\d. !ñãªLárÙÛÏXC¡ñ''4¡ƒ+S{)ç¿ÅmÛþÊWœ&XþÁ X%çüV˜µ«5?ÙÎLâתm CÒ§ô(sßbB/\H¦êµ×ò¤ÇqÎ<á(ÇBêV8IyO@wJÝQ±Û¿?ãÙð ž=ï»ãôÊŒê[¾D)XžÍŒYè´±Z‚U–LŸÐ;cÅ÷蘨ºðúÆ‘Ÿe>©—ÑœXªÕòU†ìRÌN# ª.d¥ÑZcñ¨ú¨§s+ðõ¶Ô^û8Âuý¿”—<¨Å6Aí:¤Ç Z]XPìó܃véÚn¹¾ØÌÜÛïå ¼Þþb×ùà‰c­õë}Ò¿Ý–|;]TúSR8í†ï³úŠö·|­ár#^gCœ,\÷ÿ`¡3BˆIg6)ÿú¥}~+$i»Ûƒï@ðeGÈ.ç ‹Ad¸;N€Áùµé5ãœ4}³£ZžìàÜý+B3ÏÖ>Aõñ"ÌÜfÓÍ®î<sïÔñ ·€´µg5€Ú¬}Õ&ÍërÏÜÁQ˳ð¹U{4ªð_Á5Ä.I>@D¤zj8íà¡o‰ìAñÈïÈ;d”Gë¦ÓÕÿ‹<ë{Â8縧óÿ­\£–”¾LÁÍ0cÈ16rcÈl0¶a›ÿÈüzœ!^e¬J¢§^8ü’c„çï»@çÏjµ¤Œ«^DyÍòýùÿÜ€½Ñn6-vj똲áγ;ÖMÖeË:d 2ftKr*pyôÂ5…4UÆWYk»ÔüèŽè@b¯DɸÃ[A;†g{?£:¤³Ó¿màþÀW×0)Ö[¤qä-Sð7XäÒ%œøÞËÁ2‡®»ˆ‡¶~˜DtÈ <2£ÝQOýj7÷“…å&2jSŸ/áLJeÛJÊ¥(}.¬”£óaøÙr³ÙŒÜrþg×hý€”·Œ¨Q¿ràÆÍf³ôÙ0<VÊÑçJBpâ ¶:oþS×Hù€Ö߬~•-ë'ù]‘þÞèÒS'@ÐiùþUûyßßUè⊳ Š®÷¦ÁFúân1x[Ú´>Žú¼‰Õ”Ú)MÿýÇã~œŒÀô-Â9ŽhÚy4±·>AšègçN#0ã¯c•{^„qØl†GžÇWË !RV£›šJ%ØŒY”åúˆÔ¨·S@4¦HFÜXÙNÈ~,uE;+•Ùuüü#­S€Të`Œó„‰(Õªçƒ×ökªT&J•E[7žçÏtdøuÌZžfD„YydYy(ÖTîuVÿ# 7Šê„@’;—Êíœ7¬ˆu¨ }dè˜Il_‹ªT¶¢ÑäM¿乨z>ÊÆ& ‚R›‹n© ¶K„5e¯FmŽƒ þ66*‘'& …D ªVÁ›ÿÐdÊM¦ƒýÉ!pƺS.gÕùZ!€r©[Š"›iæ&íF3áø³ØÄvÖ^ü9x¥²°X­Â‚òû¡ÑA?4SægNõüÚ®´r (c”ñ÷O³CN'Z|BíË×oË“ ì¯ü7Ô?v\{Öì·*“v‘¤°oÍó#Ž(E93ì­X~8o§òßЩ)+—”ÒÎõÀ%õ²ÅÇðëî}}pèiŠVVµÝÈÖ䌄aeì#¹Î²fwß犚×MB÷>¦´7?²Ö—q{ÇwcŒ±—`ä7Ñ/6‰‡1&ÑÒ”¿3>%|l£î÷ħz2³_¯œª8º ½ m Ü@™yY”8Ķ͸žÍSR&DP¹wTÌç:#®ð;dõš“^³U){gom¯^sÒ;qíî©ÍñwdJXŠÎ  ÅÙÜ"ÈÂïѯTãgXóVÍ>á§5^uL˵SÞª:ÿ”Úqôú{oRó©Önk·µ5¢È‡áÇ-ìÏ$ÜþÆwà~™ÒYpšû9IuHŸ=ÝÆŒHË£Ï-ÓíY¨?8ë"07hº;ÄЪÝßöûñ¹[·6ðv ¶·6÷ö67;s°³µ¹×70«KÄ$³ž¡Úò/“ëA Y9¤4»Ü9¹p(<‡¢FtÑkÍLZÚñò´³¼¤1×™¾hX/-ï äÿ·%Z¾ º5dgyIëͯü’{š2rö麆ʤƒ… ƒƒ©=¹¸SDÂœLŽ²ÍQÃÕ%ñàᅢ—_^¯VÑÖ±sÓµõÚK ¡ªqm‚uç xƒõZdkÔ÷|ó¦†"”¼´¶¾6=wl U«ë_–\àï l|ÓÆÁ~Ë3û‡¤¤=O¾îV«òŽä¯dCÅèhÜzeFäƒÁa E0–&£ðL-[üdÈ{å€c ‡ZýqÓ7¸˜’÷š”F6Ö}øS0ÃPƒj‰Èï,%!kbƒ›RÓÒúùƒŒâ©RÒ³¯]L›U߯UóÁ]V]"µ"½M:£=<YZ»ö G«‘fÛR<$дíAŽb|þ¯g¨î";,&¾_Âo>PeyüˆÛž½A3M}ë<{À˜5”KÌ$ª0Ìru(Ëç¡›¬‡­/ô¯À®xôÖ¸ÓVAŽzúO­£nÎÅ}K^¥7¼ôi¡noª~T7ì)/Y6,´ºz3õRúïWá »ŽàˆbLÊe‚1Ð"5‘w ²N¯^~zDŽö³YFí%Ð¥P{e°öæþÙl†Ë0Áa• „l!Œ«!&Hc¼FÚŸáafMa#A9­¸óã}ûŸà •ö¾E]‡Ë]"êK=B[†V` ÐÑW.ágÆ¿`¶9¯Ï‡Ã¼Êa{ˆçzFg˜wÇ® ÏÌ® oÒÈìrh‚掖UÞ†%œ¢@ßD É¼…4ƒš)䫯6…È1‡A´è3³¬>B }kÙ:m½Ìz“ňħ”#{‹£}‚èÊâ“/ä¯ ¥Žø´x0ú`Ù@ÝÄâTy~DÎÉò>èÏÏ@.ò¦é‰Ž‰@ŽØ®Å=‰a°š_ôQèZŽŽ°z²öµ ·œC#™Y"±<¨>:}hp´#Þ÷̲¹.uEûïç]“ù¼4@p&µ 6ô){µÏ…v´ ï×~À ûÖ?p— iÀÏ=Üx½-ÿuWöôÐâÇ œ\Þ Î²ŽòF;1o˜Gø~‹Ú3ÈÐLÑV’¶rü¬)MÆEʹDK(®Ãs‹Â ©èrÏ?Bl÷æÎ*èÁëýåëlõ³Øÿ²ŸóF•`·DúphÊe%»\Æ–¾“¥]7xÇõ\¹nÞ¤ôÑÖ‚äœÝ–û;Ĺ5Õ+\BF½!XfTuc2¤¥œSÀCDË”¡2ÛýƒØr}»CóÓiJ~¸°†ŸÏ¯FâgÒódæ'^ßó›I¦L Ô¶/ÅîqÖ——–ëv\7™_J\·¡Oü[G¨†>qúŽÓwž-‰$S®{ç]‹GF®ÛÿQ7J\Œ›DîâBùNMd&Òg¶|jE@ÆIìëÊ(n…Ëœ¨ªÆg °áóØòýW­G»IãÀ˜ùƒTÙFàÿSÍ×6 #µpþ,ô×yÕzd›¼¾ÿû‘qàà“ãÜeÈ.XÖCÖ§­\Á﬈¯— öá'wüŒ‚ ÂV¹#Dl‡ïõÈ“vH?Ìó«ÂÆ®ê•1rÒœ=Ÿgâ@LíúÍjÙÃpþ¸ámñkæ^2»[t§M਷ԟrrÒi»'ÓâÌ}TÙï—à²ò<³°8-.ÏS #§¥Gi´`V÷¯”2«û} †oÞ ÝωîJ¸ä—Þù[aUi4*~ì¿ OU]µ° Üªò<óÕq·”JÝ—è+ãÚgÆã3¶kTÿ!FÊvÐÆÏ[ÊZ£…ãY6ò'?’t“%„¸Ö>AÑoÃK1"†ƒõ¼…+•ekþ:¤ARïõû~Ö\\\]YZlf¾õp>â39rRéV¬ÍµµCXýhVïùí=ë.äÕªq]S­æ ÝÙóA©B:26fpdõ ²zb¤íÚ×1ØòÆO5Ùá.+„·êM>h¥Ñ„ž5W|užð?Ø[M'Å!ƒÂŸß-ÇEa{‚©º:íæÆÆõõÿ?ÉÛü'1ZC~»¹"|is«ÛªÕ¦ !¼9iDQs¼‰bÓZ­ÕÝÚ\fA4n´}´†°DŽµÚ`P« á y-¤¥R –J)S¨¡ÃØ1,‰ÛŠ?¼ÒÁLEQ’D‘b¸»üNÝ@Š«vœ0ãÄ!¡õÓ½ñ1Ò…c;ý¾‡9Y *• &qìõû;Ç K Ÿ´z§×È…n·Z¨T»Ý óößwñûƒ¤Ö³//,”• ø¶5c:Ô¶ÿý^- lU^XXÆ`÷û‹ëÖ4rÀfç[)I5v;‰_,×°~B4-Ý¥+—‹ËÒÒºâÍÛb|$ƒ´Û ÞîüdCȈ›ždê-îØØ œà°âMu`OÞþ~U…·O†1y‘ÒW=ö:¹³ØC V©/$`54&yHCDêIª58ÉÔ5À[¢#eµ‰Nx†µ¢ž«ŽÆ׳{Áþ wÄs_ëÖ"àüÃ6¿ú¯°·7*‹Æt¼fóäß;e ô¹€j>À`:#PšÕ§ í"Ë$åÝbäàŠ'SnÄ$yãÅÁ (‘3ÿñ”2ã–K%¸3#´´<[îTçÿf¨ŽŒIîÄÖµ&Üúæ'$:w¼±Ó|ùNc§ñàNc§Ç Š™+ÿ£[.•RÊÌHÛù"›-/¡Ôÿò.õo“dqb¼®œ5—oGžïönØ ¯í†Ýðd'세Áù0š•?(ýióPßÕL’€\fÞ8Ý]H?ÙH`ÆJd®ðÓ¢ÌuKæüT§¹§8ÿpÉu;®Jú™†×ëäï-I'®ôÒÜB‹-ò.Àëð„Äq…ªiûÊgù~p…Qü˜O¦£iV¢dÏ(6ë(©ö |³bÆsø®_Ò†ôn`B°ÆnðB%|N¹øƘìOT®ÿ¼u‡£¸råwÿªËÒ\K3³Í|¸C!yÁî`<æ†Yòä´*˵"«Œl©×]§y:Îù6*òxÛ"Û‹<¥"ÖÈë¨nµ,Y9_pkè³  ð¾Ê½ÿåEå7dOU^ô©ûBæßSžßAtˆ)ÙÑÅ”)_ûÑ€>¶!s Á»ãü²…ßéÁAÖØgC²˜è³Ÿá!S<—(åó³Æºu‹õ2k9_ª]jK5‹FƒaÚ÷B'“Ü¿][/Y@pþ®iM ØqÆ¥ '5ÈGŠ ¸½žV]»fø±´Ì‹þÀø¾ÙA¯œíÚ¾ð/3>ÿ]²§ò}¤•÷fJ5›€VV¯dÉ÷"ÓiW)cW7'Õ&“SIj¾m²ø|} ”Øâ"!_£¬è³/!ÅJ n'cE£F#¢2)G¶š‚hø@&¸šúë×bˆMèÛAúñ®?QbãhNaáþ¾)¡vdBªT{=W¬†ó‚œ¨=yÙîÀf‚º I04¦‰Å§¬›(ï£<@˜>l#ä3oŸrŸ/HKŠæ@ă[]æè¾ê”§ÓbÄÓiñIS~ꩲ¹5ÖºÓ\ôïìËBÓ§[Sʨ³Ø\[èh×Õ µæ¢C¥ÚvNŸ‘Î^ÆÅfGëøÖ•Ú=ÎMÿû¬¹P…ŸNøÚO>¶¼²\=çJÇÖ´R™úÇìžÃ•ÊÚÉ“k• >çRm;¥¤RùòæÚŒ÷\uyeùcÓqv¬Z=–­¾Ö#²ÊÖ¨ðŸ¿iÑâ­Ì(…†4IšÿÞH:DJ™ùl3„GÃù3p¨µ;ÿÑFaîvµ>:8¸N6Ÿ·ž´>h}Æ×åaXÕ û¾9´ÄHÄs=áì¨,œ^!ã´ ¢8‰]Ic¥”lwÚÃnt qæ}¾N”¤cTIJ†y™)ªëÿˆTK‚&x P€#iW ”N ‘œø˜ÔŽm@~Ýpc-(eKÎ0æŒ^ÊÚœÞõTHîؾ««A)½j BÏ ãÁdy¹<¿ˆÀG_ÓÛËÍÏ”‚+¦¥TC (Ž$‘X1(C!Á‚Å;Øfœ8þÕ,(¦ ¸>’?29‚^£}îØ16ÿmÂ[¥®¢©„žƒ‚i­¾úbþ'v•%yü|dYÖ>Af 7m’¦]­ŽrÜöˆò æ‡Uw8Ò1ª­þ0ìÓc¢`tÍïm¶Ù”OEÌËXmDAš§)ô0âWzh“«$-þà:8 潿ïû}ÞÍùÂBɧX)§¨µ]Zò*)Ä/%7/RÒ7¦7,ñžƒ¯Ó'tñæ¤ä'Ž”€ªùh´²HY»V8Jaê—ò›= }ßïý3dÅ°{픶z±®Æ8¢FioNˆDù¤®6Dlîj[h Ï"|™RŠßC ]ÙÈâ!+Çdú–›0Æø!„=p–ÐÝŠz›þ“+Ù>T±¨5P Ѫ³.}‹íK«ƒ€ß =öI§è ìÚaˆÑ9¾Ý\h‹/º iLS|˜Ñ½”H[g&›‚Ìv²™æ!°híá¸$~ ùÂ"¥c×j¡QS! áÜNþ Z6´Aà aJć´m{3ý jsNˆK醵šýõC˜žÑDµš Qê“ghÛžÑ>Ë#ˆ¢fº ±i?[øš¸An;¥ÐÿáÜΞé†Ð•¯ ù[îÞ}¹)ŸeöüÀW¬më:ËJcnc¹i+ 16X¾íHÔA^ËDk GVw(å f°¶vËúŽn«S¯;AiPÎÉb¥åGJRºšJÇfa³Ùí3PÊûˆ¬Þ<ïwœ|úÛí6 7>á4›kÙÁ©cYéÉfœWÃìÀüÔw p2dòt©ÓêOOã(Ž°^b%rÁ¨ûN ÜìϯnSTô¶É°Ûu2?jàjàƒk±©KkÛ×9û0ÚîêÁ£¿Zεù¦Cÿ"U‰}Ê»jÁÝЩ‚ÅC4îŽÛHlø”(öÇDÞ¢#æ^îÃÞÛÙá|‚À±°Û`9­7©ãAs'r¨??‚}àéÞáýŒé¡p„’ºï+PB„‚¿ù7ò¦D6I³±×õ¬=~­ýïÝÅÜè"Ÿïâ÷Y=GuR쑼݈7ž4Ñ0¦µ©ÔØ…d4x•‚i›ž#_ÃÿóóOºèŠx¥ÒÓŽÍÏô’à 'ØY×Lø™ ¹zuÏpÛѽJ…ƒF¸¼› 4Y—ÒŒWVšcû©é§lÛfQÄlÛ~Jï­'OÙ‹æÊÊpcž%Ž¦€¹¨k²Ñ=ÂÀ' óh»ÚMn ›-utÚ[ÉŒ~ô˜¢¹½C‚Ùn]£ ÆHC•Ë™ÈÊeÕČّbÌFÒ’å®ÜýY %HRru]©´Û•Šn`ÆlJ%"TÛàR£ãÆ2Ur¯ò.¥Z;/na4^ìhM©û‰}Z;€ý|;žMP#ß‹{ûœ‰*Pm;÷ga…ÙýFk UÁ¢«PÔS)?ßÔ,;iˆê†â¥^q[âyÑXCß [ zÝa1M¹Ã{¯øW¾¿oÌ=^g¥ß3úå>Üg¨‘¼—Þ…ÕJ¦!dýB¦>sæÄ™_:sâÌ øª1û¾Á be^î5Mˆ¶ƒÿråôú+÷ÂwŒØ%‡÷¥œ^˜v’/ÙþA]s£UnGãw¿Î-ºcžN»­I|Pøü&;;²TâwÇpžg5tY `›Þz©ö ®¡~©>TŘGó671§œkŸj³Ûƨ -1‚ò7}ýbuo^Cå¢Æ9åxsóÂ|Ä1V_ßPg7ÞQ=6"û|Ž ‚ꮋI¹T%ž"9aräŸ/9çl&èçè غxwbLsNiö]R;T ¸Ð§Jî¾A:¥ós­£ÎhEª èUm6í«]‚UO»ØKƒ˜º—¤q $z‡?|J¡/ò^’aôPô0Ÿ†»£ÝÝÑ®âõ|’çæl„ã<ÍMñê ¦÷ óüêF*yžo[Úªí‚Íê£Ãèúx@´Î…¼0 ÖÏTi|¬§,&kŠéÊj&Iî% ª§Ã@êMdæ°/ u€ÝãŸlªjpæªß—¼ÖÅà»g9c½óT÷n0Î|8Æ1H†á¤eý0[’ŒÙˆeY< tŸÁ!Í$ºLôsÙ-ìrÆp¥RUT.´eõÕ(+Bö§L ’ÖÞÇ fx¥¦„ÍôļqW¡®§B®iéÔ‰%ΗNœZ’ˆÎÂêºT$eQÇ35B¼£Vð–FŠs")¾}„etxÞRADK,Q Ÿæ~ S$¡S81G ¢8Mv•âŽ$ƒ«—ØK᪊Ìí0F^ýi’Ò#ËN3œƒÞžùŽO±÷ÃúDðþì™Z9Ù‡Ò4Œ˜iÄÔûì;z~Ù0ăü°lÛpt{>é÷ϧ‹×@D½?3Ù¨™Š•÷1‰O€8)!rÐBpmâî€Â@ Að ¢!`5û˜IT7Ϲ. ÎØö$ SÁáÖÜBq@·Ý‚üa'pùõQo993÷\$^3(önRœO¬¸ívÚm"*Ì·*´p6Qb@sp“ð2ÐYm€9˜Q$ÑO$Púïeð%›÷J7/-Õ0T{Ë·FU Æ-KKU¡Öë_˜½½x÷`PÇõ8¾º&JÖ5Q«Žë+ɽ®Õ…E­/Bo0èYÍ4åÅ~¯' ––J³¡>X]ýV« ºm‘ Ùì ƒá0aÆ"ŸŽC´„·jC¹{tcKѽq‚qàûm¼Œ­*ÎÍím (:th0È`£÷R¢1:ÅÓhm7jÉf®Úvùy—sŠ µ¼ÆIbg‹Ï¬j8Á³^ú‰nz:_Šqzk]6CûÞܼÐo³ø…l±ˆNsÊ ­¦eáµdÈMñY|3Ò[w].ïãm}0B=ÏŒâí»æ ÿÀökªf‰ }NW ®‘iSÈÚióŽà3&5ªuÌIŽ¶›nû0š¯uÊ1Ž6O }I¨–BC¶åOä5éÃí»îë¾ ýZdaxWzOr«ÆJó}¿˜D9¶>cª§„ßÝ©?貘ÆYLÍ7:7n̳`ÏFÜdÏ5]RÀô>BôW}a•ÝèÌÒê±Õ¥³Á1²s¦š“J9ØØvš0¶¹åǽ×|cm÷Q\ Ntöž·xæø1bë£cq„By”_‡.hXÎ@ò¡$\/B !m{É5´ùKÙ*7ŽãÊ.y>$HŠúŸ7ÿ¬b©z¨â¹`W-[·Às+‡5MYhÔM¯h™`ðb+Â:÷*e×%”ØV¡é]süJ&¢Ö‚VÛ‚ªŠŠhYÕ¢]µ EK· UÓ"ºP*ê`ZÅbÙóÈ=Ó%âØ•z`p¨¼™Ô²~fÛ¯F´Ë7.Ã.eü±‡teð­!D¶ƒÑbÀYÜxÜ%$=¤y0ŒDÔ5Õúë‡ô4ÓÒ:Æ`~¥9ˆÃYtºnÑM×~Ã./†\#°ï*,V±jFâÃ44'2>¸'ô)¢èƒO’7îψÐ_k6#Üh®õ2lZ ÿÿL Æñão~óñãó§ > ¾ŸtS%MåG­®Vn’€Ý©5½.0©Ä‹EA(¹DMh'Pm÷÷K Mدâ&>NtRÇ.¤“h íWc8>À'Þþ­йûƒ!j$:¸ è ‚ ݘ€‹ 1õp0쌗‘æ`d:#…ùFé¡ú//QŸ÷¾›!A<”Œð~¢ëz˜beìªq0W¬¢€¨]Ø·º…}1á V!/lp*º¨Ð 9ÇË–÷ÇBÿ î•scÃ?ÁlR ÃB¡£B—UÕv1(º?-öÀ hÜMçs¾Tt4ι¢¬»÷ÿƒÐ´¬ïY…‚e~nb§Ù Ïð8›„]Œ‚ढ˜"Þ4ëø\KÒœ/c‰pU]ó ³7@hZ…‚õ=Ë2?7ÍÚe?dÕ°/÷)@eÑå"ÙñQ‚ô$ù874àe6ÑÔpz© ¿ži®³˜š&}ø*‚P–cDb+Y¨ÕÜñëú_ }Á¤åàˆfC mÁR—ê–öWšòÜ’´;š%9OD´3m[iS—ÊDý¢Ä¸¢¦M«MKO"0¢ Õr s5"@á‰y`晆~Ãä–©ÁÙÒ& 7ŠCçZ*ªv´™C°’È¥Æ7’±ŠÄ,Em«‹@•pÒ×*ðЉ5ì¯ë“°º@j*&/åú»Ç<©]Iܶ2¿ª›dÁî„Œj…ŽtúKN|×*.ˆ£f¬ö‹)Ò¬Ú}õÑÍè4B÷£‹6·j¾tãA”ÅHŽSº,=&É,§„H¶W’%â”ÆI”äΫC”'b嬤¢ûNû3^á¼"Š¢’U$Ƥòš"ŠbeËkåòZ™óòç•Î9¯ðŒóŠtÍ— …BŸÑ¡âD™²þôt¿ßï~™Ü)úzÚóùU‰9·-ER|Àh#B1p‹xÃ_ˆµxr:Ïz?ÎŒõÙöó.ÅòÇÃpd)Ù'™„a¾H|¶Ð®—P±ž½$Qqh˜Ñ†ÐúX‡V‚Dzð1ÛÑ/<›'3÷-0Ž½¾­¦ @ü'Ü¥ LÃ2bƒã€ì‹rj|ÈìÛbù~5ék°®oýj †uê/KèÄäÎN¦ðx™PG¨|èԧǛ¼ëú( ?à`9väQ×Á7¤)Aó ;RÕ‘\•á\ †¨¦ë)ôµ‘7¦š“¯ò ͉âó6D1b©GDÑéDÇašÏºàhm(l[מ;:†‰w?‰çŒ²ˆ|Hþ3™.Ïê ©Mc=d—?‘OA¼ŸI³e·,ѵ/áÖ ¦«ÐeÜÚÀl¼4sÿö6ý˱ng¶cwðËñ‚¦WÑrG§Ö”ý]÷t´§ÞªÝi6åCØKS¾šNlÄ^v‹¢Ï¶_¦w߇^=òšñ‹°ÁfÝÁÏè,Ï'Ì]i´^q,Vˆ‘dâQ‹SÑCø*ƒ¡³šÅ* ÝÇÙ~#z-µËÛ©n±úæ°Kœù¨f—î’ê»ýí£Òî=Íp~µMƒÐëG¶ÝbJ‡ù_Ç™ ‡8édƲ$k¡€‹“„·Åô½Ïqäš—þ]ÅsƒòJ\¯éÑuMÕ2ut,]Eƒ- ƒÙ%—Þ¸G\¼¼Õ2-ö‰}5ç©^î#.•Û]ßo=Ô\Öw$ ÂÔ~FñîèËÞ ¤v¶ô2wmØopy]‚q«3c¡üÉ|Ž!È*+ˆùV‡ˆ—Â^I0ï·m6UQ}… É x:P~5ç­C=^SEŽE'¿¬Ù¯hê=@Á+•EqÊ%?ðFðeÅPÎFlpŸµÃ¨HBÍþÂæ¼ßeJ' ·r·‹¼é6E¥{2•Õ‰kÝT”ûƒZÕ·0vÅÅØò«µàþ25_~CRØi8ÝÔ1„ ã31>É·“Ä„ py YðÙ]'jP®Î±M µƒlÏÚ=)še±Êí&ML˜_jW1ò\[¹6 òï€öÇû9IÉ-Å õnÃ-Eɇ'^Ɇ=|R¯J‰Åϲ 3#9uRÊá–zófØ™U´& Ó¼¼3`ÛåÿFu®Y²ªÊ9#ÔØíïsJèèg>†åÙ•* ,‹ÀJnKwJ¬‹…kOA÷èYªêM>Ëæ¯IMÛWÕo,c¤‹"ó˜fòê~qR›«à ªw©Èÿ]FDêÄq+ëÎ"méW‰£…º=ã Ÿúƒ,¡±sÍ4ë_³˜º2tfö¯‹‘!íZT‰ë…~ÖÒu‘¼ü9åÕ»æ¼b­»',XÚ'ìjñ‰Bؽ¾Å‚m¢˜¥[ßWž™ýã;ñ'ãp÷akÊó¤à˱áÃü·»púõã þÂ|éÁû±´}ÕUŠ™ä%UÆ¡$jkŠ7{Iq¦,NôÊó£›÷ŸÜÿ`‰G˜÷ÅÇ£GµI卵ÑŠÏå¥af¸kË,oþ’ö½ ïÁ%q¶#;³ïŒxH~_3|Šù]Ù·Á c’œq¤œm‹¶bXÉÄ´Pi¸Ú W%?8‹õÇšrÏ“ð\ž«pˆ¸Ñwc—Oì)/´ƒDL½iʽ†‡ß¹Õ5u¤|…E¢òƒñ8S¾·)ò÷ êòh ¦Xg÷: Ð@‚?¦²´É ƒ’‰7‡7gŒ í"”1¢avi;7}*?’eʽNO|?qöÓÁ;v*¯Öû¢L™àµ*OUˆïttA¤ºLQÈçH}8ˆØ]?ŸÔUb@ŸµžRks/؆=O>¦K#ùÜ_/ÝF†ó£ÌsÚŽózÆø.„\ªÑ*HNê´¡ÂòOÔÿ±$þó‘}Œ|”X0…)8“Pæ)i»C‰¦iáÄÉÒÒØ~& Àšs¾åÅ)ñRjL~ļµþgò÷g|Äاþq¨ŒæiJ>²ÆMD“&QÁûL7ÈÙ34?Z“îe»mð‰€.øŒHzŸÁÞ1prc·¢%êßÖíÍKÑD5nöÙþôÓ0A-o;‘eƒ¤Ex$jþðWè6›Þ0Ó™…d¨ú‰ÿX?€ÜU)cfÑquNÃ…nšvBÊu×)šŒQÕý£¹ÕÕ'VÓ¨r“‹A·uøðw><·ˆÜäaÆX£ÁN²Ú⊢(¼µšt:˜HTÃ耎SÕ˜botãjãj5^\·¦Ut DU[Ceµ}DƒJÑÄ*RƒN†ÂaDG³]™3$'Ç=]%# •—×Ö–Ô:´ì »}ËhûJT‹_Þ¯ÆÍ2yôèâÁyª›­o—Ùòó­ÑÕÕ–•ý|i^¾qåŒÉTêíê²Òq¹•5}<ËÛ)ÉŽ‘4òÖ#¡ÌV&hÔçg¦xÑÚªmõçOšdº»•a0‚¨è(3Îq[3t:W3ä¥hFoRŸ¸ ð.¶ø4ì€Åhù7•u<’«!€ncÚÐØŒ²ŸtܲÙK®ÌË©¨ ÈªÑ eÝw€ŽôÊÙ›×fd¥WæQ{‰e»×–]4ÌÖÜVå¸|Ëa« Ð ‹ë'òà磎ƽòüaJ~[IÄ”Ô}Yg%6ÐÈóu*Sù$Çõd×Þ†%ûôŸ¥ßY–%{}ô+ðp)gÒÚñjÐØ-,5&²3 Ê’âß  Ðãhž-Ï» ³òlyyy–½cøòØuªºr†ör”E«P¸qn‡•g˳æÀ}ÔœY÷tX{®Ü°˶¸~Â86T(–U]üKYœ‚Ì‚¹ƃƒ ez+e¨Ø ôæì‚îMbÛUv X)‚ØEE¾<Ð+Z2ù°Ò¯Ãr˜ê¹…Õ¼9;/äè¤P^¾òÕI“ÎÿJÆW§+)Þ{Â/òÆ@¶6±¿ò¦“Ï/û,ú@8£ŽÑ;7²µf¨ÿŸ¾´õÃà0d¹ «ìM]Ùâ‡;ä4AÎp¸!Ès@^òGBþ*(pBA µÃÐ8N…ÂN(rBÑ*(ê« ¬$ 8 %Q(m€²”% ¼Ê#P1*bPY•a¨j‚ê0Ô¸ ÖÎV–€SaôzÛã¼0~*LHÁ¤09SG´v˜Þ3â0Ó ³ª`Ö˜Ý ggEÁÝ gûáœwà—ïÀ¹8¯~å„óóOÀýpQzá7Uà9.IÀ¥>¸t\ïpy \±®8Wv€¯® ÀÕmpM®µàº¥p}æØ`®æ`¾æ§Á¿ ntÃM#á¦htAcnî€[šáÖmÐÔ·ùáw°À‚« Ù··Àï›áŽ &B ˆÁp—îJð(‹£°$ÁV¸»îé†;üi"Üë€ûŠÀý!x  ضA¸ÂIøK3<€¥G`Y–¯‡-Ðê‡ðHüõ´€ÇÚàñ4<郧Ð]ðLt¸àÙ.øÇTˆtÁsÝð|¬ŽÁš(¬MBçzx1ëöÀ†&ØØ›bÂKAøW¼\1l¶`óxÅ ñFx5¯.'tõÀè [úàí¼ƒ÷]Г£ðÂGqØÚ÷Á'íði¶%`‡;Û!UŸ5Ân`Ïù°7û"°¿zûáó#ðE7|yÄáP{!í†t¾òÃ×ýp´Ž»àÄ8Ù§½Ðw-|ão=ðÝTȸá{/üÐ?ú¡ÿ ø)øy=¢)ƒLÙÔèG7D·Ô£[QÓè¶Z`G :Qs;º=ˆîp Àztçt×z´Èõ¢Å ´$‰‚Atw3º§ý±µ¤Ñ½ï û|(T‡B­è~7º¿=° =¸…Aá¥èÏ!ô-µ£eh¹…V8Qk#zxz¤µµ G#èq =±=5=Ý…V¶¡g¢Ž*ôl ý=Š"9€þÙ…ž‹ ç#hU­î@k\hm­íC!ôÂHôB+z!ƒ^ £õ#ÑúN´¡m´£sÐÆÚÔ‚6õ£èôR½ì@/'PÌ‹6;Ðæ4ú÷BôÊToD¯FÐkÑkQôº½C]nô/zcz³uסîhK½eGo¥ÐÛaôNzgzׇÞó¢÷PÏXô}F&РD}tý¯m‹¶†ÑÖ~”lE/DŸ´¡O2èÓôim›ˆ¶ÅÑv;Ú¾mÏ ~´cÚ9í ¡TJµ£ÏêÑg=hWí^ˆöô¢½-hoíó¡}ÝhÿD´?Žzèó^ôÅHôE}™D‚è`:äE‡=èð”nB_¥Ðÿèkúú:r>:ò:ÚŒŽÕ¡cO ã:¾¨G'§¢“it*ŒúÞAßt¢o2èÛúÎ2õè{ ý0ýX€~L£þ9è'ÐOhÀ~.C?g0Ä1Z…1iŒm"fP38†Éò`²`ì-˜l 3Ä…Ò‹qX‡“karÓ˜|'¦ €)8‚Ɔ1E˜¢Æ c¬m˜â¦d¦ô¦¼ SÞ‡©b*R˜Ê=˜ª¦Ú©ö`ª[1Õ LS³SsS;SÛ‰q6b†¹0ÃZ1ÃßÁŒHbFF0£|˜ÑNÌèfLfl3ÌøNÌ7fÂ̤‘˜É 1Sš0S0Ó&b¦½ƒ™>3ýfÆRŒË‰qÅ03m˜™×bäá:ù¨N)ª;Õý=>ed¡'¨^ÕK¢' Pæ~T%j05ÊGO¡&9¨i:jú%Š¦£è ôôCè™,ôÌ)”U„ž=ˆžKGÏOD±F¨Y5‚š§¡æWP‹u¨eÔ2‰Ze VQë/Q›ý(ûôÂDÔ6€Ú– G¢xÅßEíb¨Ý1Ô>µÿu˜‰:.Db¨SêC‹P—('ºQ·S¨{.ê1õ(F=sQ¯BÔ;…ú†Q¿8ê¿ ¡WР48Œ/DƒKÑ>hh ¡á™hø”ˆ¢—æ¢A4"½\ŒF~ŒF­C££hL)Aã2Ñø\4ᚘ‡&• ÉCД4µMK¢éEhFšYÍÊF³hvÍéæFм,4?Ž„Ђ"´0…å¢ÅA´ø Zò.ZEËAËóÑŠ¹hå´j$Z“†Ö¡Ü‰è•uèÕ™hÝD´>­ß6ôAChã:´ù´%mMG[¯ ¼$úG#ôÚJ”@ÛÂhÛ—èßi( Jf¡×¢íÑŽ´s)ÚÕín„ @{Òоƒè@zc"zó :T Ã)t¤öAo¥¡·èíbôNz7½Eï/DDУ¢èh]ŠŽ– @—AŸd OòЧôY6:BÇ. ã¹èD £“_¢SKÑé:Fg« âèó0úü:—@çcèèÂtqºtºTˆ.E—¯ +Qttu!ºGס™èf#t+Œng /BèË è«Sè›tT’‡¾Ý„¾‰¾?†~h„~Œ¡Ÿ²ÑÏAôó1TzýRŒ~ýý¿S€ïX‰Ý§Åðovà;3ð#ñ]1|× üÛLü»/ñïã8˜…ƒ)ü‡"üǃøO ÊÄw§á»óð½à{Kñ}…øþ0¾ÿ ~  ~`$~à~0‚¼‚Jâ‡ûà‡OáG²ð#)üèB\&‚ËÃeóp¹(.—Âåâ qŸR®”‹+‡på©8\‡7á?¯Ä…ñcKñ_îÃUá*7pÕ•¸ZWÛ„«gàêù¸F×ØkÆqÍ®5×®‚#ñ_³ñß2ðß'âô0Nÿ×Ù„ëöÀuÀŸÂyø‰•¸^?¹ gVÀ™Wpý4\¿77‹wÄ p“Üt.ŽÖÀOñSã§/à¬~v,~.†ŸïcAËÇÍàæAÜ"€[\À-¸UKܪ·Nâ6…ø…2¸íXübŽp|%n÷nw·_ˆ;ŒÄߟóTÜ¥ îò%î:w‰»ß‡»§pÏÜ+‚{GqŸlÜ·#îW÷ßÜÀWâÁ!^Â+SxU.^Á«ßÅk¦âÜ~%¿ÁkKðº™xýH¼!Š7‚7.Å›JñæR¼åœÁy)üZ ÿ3 çÇð6ð¶ýø_›p2„“ùøõ±x{o/À;ªàyxg>Þ•‹wïÇcñž‡ðžB¼/ïo‰÷—à7‚ø$~³‰ÝÀG¸ð>üV¿Ý¿ó~·~/¿w ¿?†?(ÅGøhćñ'YøÓtüY áãa|ü >ÑŸ àS|z>“ƒÏæââ \\Œ?/Äç—â Ùøb_j‰/½‹/—â«5ðµñ¾Ä·‚øöXüßþ"ÿ7Ç_oÂ%)ü]üýüÃ~ücþ9€K³ñ/™ø×l̇ÿGa--F_„AYŒYcwÂ80nãÅø{1ÁŸ˜ð&&zˆ‰»a’n˜4+†òbè &k„ÉÓbŠV˜â ¦‡©zaên˜&„ibÚ_1}"ÌÂŒ1S3/Ã,1Ë̶ ³WÃìw1ÇI̹ s ÂÜ›0oó^Ä|ÿbþEX`\†…Êb¡‡XdÍŠÅ~Åâ?`‰^Xr–š‡¥a™‹Xö.–aù(¬° +vÃJ9±rY¬Ò «Vêð³½øy/ü¢,~9 ¿zƒ_OÂo²bµ_±&XëÖ>ˆõâaýœØ -6ˆ`Ã06zˆMCج¶a‹UØj¶†­ÿÅ6«°]"lß ;ÌÂŽo°ó^캻Ş­°ç¿Ø;ö½ŠýC8p™‡C«âлˆÃâˆ~8rŽ:Š£#8& ÇÃqÍp|-œP'ÅIÓpr'œ©{qÚAœÁ™%qæYœgÅ9›pîŸ8¿.nÂEÓpñA\2 —Äqå \ÕW'ÂuUq}IÜP7þ‹›ÅÍqËMܺ ·ÅÂíEqgYÜù'îJ„»NâpOQÜûîœÄƒa<4 Ä#0¼ ¿‹ÂRâUñ§ZxT<.ž…'ëá©Dx:žY‡g£ð|/<Ä‹7ñrE¼² ¯NÃkñzJ¼~oFá­mx{Þ-‰÷ªá}ñ~ćËðqE|ÒŸVÃgWñù"Œ€/Å—íðuA|½ߤÄ7ñm;|ŸßÀ½ðcNüÆOwñ—(ü-þ¾ÿ†N¿Jâß)ñŸjøo'üoþ¿ˆ€A´”Ñ£‚‚Á1~ ˆ!ˆ“ v˜ Î$‚¸­â^$ˆ—“ >ñß$8JpA¢0AâjI2$­H4BšF,Š EY‚' øðØäø$râr²9u9ý 9s9;‹¨cHn’ûÉïDòß!ÅÒ8R¦²ÿHÅe¤â;Ry‰5"ñ(RUTÏ"5WÚWHý1¤!@ï M³Hsiþ„´Ä‘Ö¤­ioE:z#Îà_pp8Î]è*Â÷(L É‘9Ž¦U4ö*iÙG„j²ÙÂ^ÕvPÁ™Ö?ôŸMdI«ý±[Nt;Pyúõ#ÕÎõDØùü‘Ú±lt½içëG¶PÙøÈù󑸑ì£ÈyþßrÛÏŽÈçÙe­²:YªuZ˜`c-‘Q^Êø*ÔV%ü´²Æ¬­zÖí7¾U]Yšu­êUFk5cÖ¼te½[ëV¯’´ð-ž×™Ð3¾jh¨vãUMu5UÕuªdeosµ«kVõn­[]ºlm6ÇbçŒo_¸)³Þo|{¯¦úþŒÖ•ú:zLp!ã--[U’*UÏO i©|"‹&I1!ŠuÌ ÍŠ½ÖÁø¤QX †5Vñ°¸ô¯«,‘¶ö,šÃú£µ×£è'ƒ~l5sÏái*©Ç¥74¢:º…ÜKÍYHÕï•´7Ð@5.ñ@~õÖQCÕÔ¡(Ùj~sKªùqij߿”e,–€fbĘ8žêcI|WîÞ ÖŸ»ãq‚úg­ÜKªçi¾@¥ÇjV”¢ôU¦xÆÆ¿ í/assets/css/font-awesome/webfonts/fa-brands-400.ttf000064400000562364147600374260015777 0ustar00 € OS/2_W^k(`cmapœò×J ¬†glyf/^4ˆ$\¥|head&€'>¬6hhea=;ä$hmtx×/ëˆ$locaR±H4(maxp2: name88QeÉØpostG¿y@ÍøùAm¤ _<õ àîðààîðàÿÀ€ÀÀÿÀ€ÿøÿñ‚  8'ãLfGLfõ„AWSMÀ!ÿÿÀÿÀÀ@9¥ €@ÿøÀ@€€À@@@€@@@@@€À€@€@€€@@À€@@@@ À€À@À@@€€€@€€€ @ ÀÀÀÀÀÀ@€ÀÀ€À€ ÀÀ €€3€€€À€€@$ÀÀÀÀÀÀÀÀÀÀÀððÀÀ€ Àà€€@€À€ÀÀð@À€À@À ÀpÀðÀ€ÀÀÀÀèÀðÀÀ@ÀÀ@ÀðÀð@€€@ ðÀÀ€À@ €€À@@@@@@À€À-À@ÀÀ@€À€€À€€À@€ð@@ð @ÀÀ€ðÀ ÀÀÀÀÀØÀ€€€À @ÀÀÀÀ ÀÀ Àà ÀÀÀÀ À@ð€À ÀÀÀÀ€À€À€@€€ÀðÀÀÀÀh€€¸@à€À €àÀ à€@€€ÀPÀ€€ € À À€ðÀÀÀ€À@ ÀÀðððÀ@€ð@Àð€@°ÀÀðÀð@ðÀÌðÀÀ¸À@€ÀÀ€€ âÀ À€ÀÀ@€@€€€€€ÀÀ€€€€€€€ À€@@¾ÀÀ€€ @€€ððððððððððððð€À ÀEÀ@ð@ðÀÀðÀðÀ ð€ÀÀ€ð@€€ÀÀ€À€@@À€€À€ÀÀð€— À€ð€@ðÀ@À€€ÀÀ @@Àþ$º$ º–ÊÊ!%+9Zabcdefghijklmnopqrstuvwxyz'1'S'T'U'W'•àààààIàRàWà„àˆáþâÐã@ã`ãÙää:äJä™ä›ä å1åpå®åÇæ æðgðið‚ðŒð’ð›ðÕðáññ(ñ*ñ6ñ<ñUñZñfñiñjñnñqñrñtñ~ññ„ññ”ñ˜ñ›ñžñªñ·ñ¾ñÌñ×ñéñîñõñúòò òòò0ò2ò7ò>òLò^òaòkònòpò~ò‚òŠò’ò”ò•ò™ò›ò¦ò«ò¬ò®ò´ò¸òÆòÚòÞòàó\óuó}ó€ó…óˆóó—óšóŸó¤ó²ó½óÀóÄóÆóÇóÈóÌóÐóÜóßóäóìóîóïóóóùóþôô ôô!ô#ô%ô1ôMôRôWôYôÕôåôæôùõõ,õ1õ6õAõ’õžõ£õ¨õ²õµõ¾õÆõÌõÏõñõ÷õúööö?öBööÊöÌöÜ÷1÷]÷{÷…÷‰÷÷‘÷™÷±÷³÷¼÷Æ÷Ó÷Ö÷á÷ãø=øBøžø¦øÊøÒøáøèÿÿ!#*0<abcdefghijklmnopqrstuvwxyz'1'S'T'U'W'•àààààIàRàUàwà‡áþâÐã@ã`ãÙää:äJä™ä›ä å0åpå¬åÆæ æðgðiððŒð’ð™ðÒðáññ(ñ*ñ6ñ;ñUñZñfñgñjñkñpñrñsñyñ€ñ„ñ‰ñ”ñ˜ñšñžñ ñ´ñ¼ñÊñÐñçñíñðñúòòò òò0ò1ò7ò:òKò^ò`òcòmòpò|ò€ò„ò’ò“ò•ò–ò›ò¥ò©ò¬ò­ò°ò¸òÄòÕòÝòàó\óhóxóóƒóˆó‹ó‘ó™óó¡ó¦ó´óÀóÃóÆóÇóÈóÊóÐóÒóßóáóæóîóïóóóõóþôôôôô#ô%ô&ôMôRôWôYôÕôäôæôçõ õ,õ1õ6õAõ’õžõ£õ¨õ²õµõ¾õÆõÌõÏõñõ÷õúööö?öBööÉöÌöÜ÷0÷]÷z÷…÷‰÷÷÷—÷¯÷³÷»÷Æ÷Ó÷Ö÷ß÷ãø4ø?øžø¦øÊøÒøáøèÿÿÿàÿßÿÛÿ×ÿÕ )   ëãáÂÀKz ìt?¸·³$æ«”QEà×ÒÌ–‹Z84   ý÷ôóñðçãØÕÆö²¯®”Ž‚qponmba`XWLJIHE:,*) ® £ ¡   ž œ š ™ ˜ – • ” “ ‘ Ž Œ ‰ ˆ † … „ ƒ  ~ v u r q p n S O K J Ï Á À ° 3 ( $     ÿ Þ Ù × Ã Á • “ 9  þ « € d [ X U S N 9 8 1 (     Á À e ^ ; 4 & ÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖÖ”œš†„ŒVRL86Švr@ÞÞ."ðÜÞÐÀrrld !"#$%&'()*+,-./frzŒÈõü Ÿ Ìå!!#%*+09<Zaabbccddeeffgghhiijjkk ll!mm"nn#oo$pp%qq&rr'ss(tt)uu*vv+ww,xx-yy.zz/'1'1'S'S'T'T'U'U'W'W'•'•àà0àà1àà2àà3àIàI4àRàR5àUàW6àwà„9à‡àˆGáþáþIâÐâÐJã@ã@Kã`ã`LãÙãÙMääNä:ä:OäJäJPä™ä™Qä›ä›Rä ä Så0å1TåpåpVå¬å®WåÆåÇZæ æ \ææ]ðgðgðiðiðð‚aðŒðŒcð’ð’dð™ð›eðÒðÕhðáðálññmñ(ñ(ñ*ñ*ñ6ñ6nñ;ñ<oñUñUñZñZqñfñfŸñgñirñjñjrñkñnuñpñqyñrñrzñsñt{ñyñ~}ñ€ñƒñ„ñ„…ñ‰ñ†ñ”ñ”‹ñ˜ñ˜Œñšñ›ñžñžñ ñªñ´ñ·›ñ¼ñ¾ŸñÊñÌ¢ñÐñ×¥ñçñé­ñíñî°ñðñõ²ñúñúòò¸òò ºò ò¼òò¾ò0ò0fò1ò2Åò7ò7Çò:ò>ÈòKòLÍò^ò^Ïò`òaÐòcòkÒòmònÛòpòpÝò|ò~Þò€ò‚áò„òŠäò’ò’ò“ò”ëò•ò•ò–ò™íò›ò› ò¥ò¦ñò©ò«óò¬ò¬õò­ò®öò°ò´øò¸ò¸ýòÄòÆþòÕòÚòÝòÞòàòà ó\ó\ óhóu óxó}óó€óƒó…!óˆóˆ$ó‹ó%ó‘ó—*ó™óš1óóŸ3ó¡ó¤6ó¦ó²:ó´ó½GóÀóÀQóÃóÄRóÆóÆTóÇóÇÈóÈóÈUóÊóÌVóÐóÐYóÒóÜZóßóßeóáóäfóæóìjóîóîqóïóïŒóóóóróõóùsóþóþôôxôô |ôôƒôô!Šô#ô#“ô%ô%üô&ô1”ôMôM ôRôR¡ôWôW¢ôYôY£ôÕôÕ¤ôäôå¥ôæôæüôçôù§õ õºõ,õ,õ1õ1õ6õ6õAõAõ’õ’ÅõžõžÆõ£õ£Çõ¨õ¨Èõ²õ²ÉõµõµÊõ¾õ¾ËõÆõÆÌõÌõÌÍõÏõÏÎõñõñÏõ÷õ÷ÐõúõúÑööÒööÓö?ö?ÔöBöBÕööÖöÉöÊ×öÌöÌÙöÜöÜÚ÷0÷1Û÷]÷]Ý÷z÷{Þ÷…÷…à÷‰÷‰á÷÷â÷÷‘ã÷—÷™å÷¯÷±è÷³÷³ë÷»÷¼ì÷Æ÷Æî÷Ó÷Óï÷Ö÷Öð÷ß÷áñ÷ã÷ãôø4ø=õø?øBÿøžøžø¦ø¦øÊøÊøÒøÒøáøáøèøèô²ô²ˆôø8Ôˆü„4Àh  p `  h Ü <  €$¤ œ¸0¨ ¤ôhÐpè°HpÌ@ (´„èÜ€  ˜"p#$°%,%Ì',, ,°,Ü-Ü.\/$/¤/Ü1 1ð3¬4Ì66ˆ6Ì9:„;°=L>>€>ø@@ÐDXE@GGxHtIXL\MST,U„VVPW8W¼XŒZŒ[<[È]°^ø`0aaœb0cŒcÜd4dxe€f<f¸gpgÌh4iØj”kklkülÈmŒmÔntsHt¤uÈv¨wpxxìzŒ{| |˜}X~쀠lôƒ<„Œ…Œ†@†ô‡|ˆ„‹@ŒŒŽ|\t‘À“”D”˜–ø—˜˜Hš4›X¨Ÿ4 Ì¡0¢ ¢è¤(¥”¥ì§§ð¨œ©ì®¯ü±³Tµ µü·(¸(º°»(½À¾<¾ô¿ÄÀÐÃtÄ0ÅlÆhÇÌÈ$ÈÐÉÏ„ÐPÑøÓTÔXÕÕðÖ ×ÀÙÙÜÛÝÌÞ˜àÈá„â ãhå”æìçç”çÐè°êë ëìì<íxî”ï8ï¬ðŒñ$ñtòòÌó¤ôhõ°öèøùPü4ÿÿÜ@ðج@ x „ ð ¤T¤˜œŒÜü¬ÀLD <"À$%''Ø(”)H,(,ô.\/”0˜2H3t4`5 646¤8x:D:¨;0@øBTChDE<EÔFGH<I¼JM8M¼NNÔODP$U8VWÌXhY˜ZŒZÐ[8\lc€fôgŒi j@kTlÐmÜu vœwdx\z8zø{x}~€pÈx‚¼‚üƒx„D„À†,‡ŒˆŠ`ŽüP‘P“ –Ø—À˜|™˜šP›ÈÜŸd  ¡,¢L¢¸£<¤L¥(¦D©D©ü¬,¬Ð­®€° ²³µì¶¤¸¹œ»H¼°¾,¾Œ¾¸ÀPÂÃ$Æ|ǸËËtÍäÒ4ÒtÒ¼Õ@Ù0ÙtÛ¼ÛðÝŒÞ(ÞØâ„æ\æç çœè„è¼êtììøî,ðtñ€òPó€ô¼õ´ö`÷„øù¨ú°üˆþ@ÿ0@¬¼Ì   p 4ÔpD"#€$P&´)¨+¤/¨0`11Ô2¤3È4à67°8\9À::œ;,=4>,FÌPUìVÌXHbbPiiljkàmmìo4p€qÄrèt8udv”wx\~  ˜€‚0ƒÄ…†ˆx‰¸Œh`Ž Ž¸<’0—T˜4š›„œ¼hžTŸè¡ ¢¢è¤\¥|ÿÀ€À %?'3'77#7%67167!!&'&'@ZZ'³ZY€YY3³YZþæ    þà :††þô:††À† †À††  þ`   ÿøÿàH  4'1&#"32765676'&'@     € ÿ þ`ÿàÀ UZ13767632+32+'&'&?#'&'&?#"'&5476;7#"'&5476;767637#µ _   : E: E   _   : E: E  __  ;E ;  €  E ;E ;  €  E €€ÿÀ0Àr2123011/&21#"'&=0#01#1&'&'&'&76767676'&'&/101&'&'&'&767676754763  0  /0 1     1 1  À $       ! #       # €€ -6514'&#"327&'&767&'&767w þÀ @÷    I þÀ @ $$$$ÿ$$$$ÿà€ =2176/#"'&='&'&76?'&'&767654763À p  rs  p  o  rr  p   ˆC DE C‡ ‡B EE Cˆ ÿð°)4'1&#"#";3276=327654'&+5      p      ÿà@ '67167&'&'57167675&'&'--DD----DD-- ))))D----D€D----D€`)€))€)ÿà $&'&?#";27654'&+ `  .@ `` @€ @ þÜ   `ÿà@ *"#"'&54?6732#!&'&?67&'&'" +<>())‰³ ÿ ¿"` *)(><+ˆ  ¾""ÿà@ 94716;3#"'&/&767636767&'&'#&'&?#"'&5 ð „:&''&:O   Oh „ž € x'&::&'  x ÿà€Ÿ/6'1&'&;3276=327654'&+54'&#"#7½ € à     ®kr  þðP P   âÿà@ 66732+3#"'&/&767636767&'&'#"'&?!À ¥r:&''&:S   S˜ !†  p'&::&'   °ÿà@ !;6'1&'&01016767&'&'71#"'&'&54767632è  ‘%--DD--*+@?   k  ¬+9D----DB,-Kë  ÿà@ 47163!'&'&7#"'&5  à ÄÈ € þ€  P ÿà@ <X&'1&'#367674'&'673#&'&'6767301013010150901#0101&'&'676730$%6 6%$#$%6@6%$#€@   6%$$%65$ 6%$$%6 $5€@ÿà@ 5132767654'&'&#"&'1&'6767'&'&?@   XA+*--DD--$‘ @   -,BD----D7*¬  K1 '%&'67%6} þú  þÀ@ n ƒƒ      @°@'"13!27654'&#!"13!27654'&#!0 ` þ  ` þ @   À   €1 7%67&'%& þù  @þÀ n ƒƒ      ÿà0 3@6716733276=4?676=&'&'#32765676'&'P +'  *$%6 6%$  P   "0  !6%$$%6 þÀÿÀÀKX12#&'&'&'676767&'&'&'67676323276=&'&'&'&767R6666R H9:"""":9HH9:"")-$36%$$%6+    66R@  €66RR66  "":9HH9:"""":9H )!!$%66%$ P   R66À$$$$ÿà€ &'76?37676/#7Þ x( Æ  (x*HHŒþà`  LL  ` þô­­ÿà@ '41367674'&'67&'&'##53;#5@€6%$$%6`````` €   $%6#"06%$À€@€ÿà€ +"327632#"'&'&767632#"'I1<<1//1<<1 DVVD,,DVVD 1//1@@1// AA-9999,BB ÿà€ $671673#&'&'3#36767&'&'`?2332?` ``D----D`32??23@þÀ--DD--ÿà@ +1327654'&+5327654'&+5327654'&+@à à   à à     €  €  ÿà@ %13276=327654'&+5327654'&+@     à à  À    €  ÿà¿ 716767#"'&5476;2&'&'&'676767'&'àD----D;++ }  >>Z?2332?X=  ,?`--DD--$#8  X9:32??237  (ÿà€ )%3276=4'&#"!54'&#"3276=!@   ÿ   ÀÀ à  €€ þ€ Àÿà@ *"1;#"3!27654'&+327654'&+  ``  `` €€   þÀ   @  ÿà@ %21&'&'54763267674763  --DD--  ))   ÿD----D   )) ÿà@ +6514'&#"54'&#"3276=77676/77 ›.   A… Œ‰j  /¹ þøx kCÀ  Ë ÿà@ 2132+"'&54763@ À à   þ   € ÿàÀ $676#"'&5#"/#"'&567¥¥  …  …  Ÿøøþ€ ÈÈþê €ÿà€ 647632'#"'&567  þù  žþÄ( þ€=þØ €ÿàÀ 3"132767654'&'&#1#"'&'&'6767632à+%%%%++%%%%+à45;;5445;;54`%&**&%%&**&% =3333==3333=ÿà@ &671673##"'&=36767&'&'#`D----D`  @`))``--DD--` €àÀ))ÀÿÀÀ <7167'&767667&'&'&'&'&'676767'&/@--D,#H G--DD--5D?2332??2350 .ÀD--V  U*7D----D½"32??2332?V=9  8ÿà@ $013276=37676/6767&'&'##53@  _g T(()=pppp"" À  €’  x$#.=)(à ""ÿà? b013'9&'&'&'&#&'&767627676'&'&'01&#&'&'&'&7'676'&'&'7&c 8 :7E    9  8  :7E    9 W   $@     $@  ÿà€ "1;32765327654'&+  €  €      þ  `  ÿà€ %216767547632&'&'54763  $%66%$  66RR66   à6%$$%6à àR6666Rà ÿà€Ÿ61676&'&767 ‚ƒ      þÇ9  þ€€ ÿà? %6167676#&' "'&767 nUUn  QQ  ž þÚ$þÜ&  þ€þé€ ÿà€ )6'1&'&'&'&76?7676/7y ‡‡  ‡‡ k  ¢¢  «¬  ££  ¬«ÿà€ &'1&3276=76'&'&': š  š ††“  ×– –×  ¼¼ÿà€ 47163!32#!&'&7#"'&5 @  þëü þÀ  ü € þµ  L  ÿÄó¼z09&'1&'0&'&'&'&74#1332;67&'&'&'&'&76767674'&'&'&'&'&'&71&'&7067676'&'41‚`    #/ ,=-3    &   !77D\CB @-* #"""  --&%     &D77 !98X5## ÿà'  6BJXdh767&'&'35#7&'1&#32767533&'&'&+3#36765+53#3#3'##73'!!27676'&'&'#32#3'~  (OO˜É"++-_((_k-,¦97 "J €þô z@@67k÷÷k==;:pT þûG..[E>!! S+-¦--K[  [[äþ@:9n+43&%þU–21ge34 ÿྠ;%67&'&'276274'&767'/'&?'&763?6322.?>__>??>_)&2F:;;:HHV5IV::::VW::& –,E))E,DDÿàÀ 376767!"11!676745454545 "!3GGCC13%$% %$,+   (I3!"<H2"",-9;22;ƒ%&2 ""210A@10ÿÀÀÀ*/&?5756/7''54?65'ôP_`PÌN_PNÌÌNP_NÌd.88.\wï.]8p/.ww./p8].ïw\ÿàÀ .%&#"327654'&'%!#5##"'&'&5476763257+    þÕÀI5(  8µ   ëþ@Àþ‹   N ÿàÀ  E[h}¦77674'&'&'&"#"#&7232376767676'45456'&'"'1&'&767676#7&'&76#7!"3!27654'&###"#"'"'&5&545474763632322à#  }    }  "U  [þ `''''õ  #)    °  "”  žþ `þÞ''''ÿúà†,&'&76?6''76'&'&7676's   \\  ã\\   €   t {} ­„}{ ¬® ÿÈ»¸9ER…Ž4'"#&#&'&'7&'&'&'&/&'&#"#0'0'&"#016767'2676711"'&501736765&'&'&'&76760'&76'„ ~ c &- /8     /%   2  _ X þO66HH67"  /##  ,+88**4¶@ '  Ý $ ,   %9 ¢  @y #'%35#53535#35#35#35#35#'35#35#535#Ã}}}}}}þ=}}–}}—}}–}}–}}—}}}}ËIeHHþíI®IIIIIIIIIIIÿÈæ¸271016'&'&#67676#67677675'&'!5Ì34@i;: 78M°  9 !!5BDD&+??21:ÜB97@@Y0$%4./E70/ i?4?€A'FUgs|73#"'&'&71676367&#67674'%&#"632&#"3273354'#'&547632'&+3532725676'&'+5327#'#37j9)+""      ^?' ''  ø$%4Oé)  002      OY    Ž»L? A \\x@¸ ÿÀÀFPZfr}­·Ã%'&576'&/414'76'&#'"1&'76'&#&'76'&&'74'&&/4'&&#'&'&"/&#"#'&"##'&1'&0'&#&0#"032137??0?223?20132?6376?236376574367765'6776/67276/67437276/657676/4?654'&#"/&'&&'32=4#7323&'671#&'673'7676/3#&7'47631&'732#"'&'&'0'6767&'&'&'&+6732?#"'673&'"'&7631ý        – %)(& ™-0  O á X 5   ›?     Ç+>)!! #Ÿ Å  Æ         ## 6#    ³x#%$ $ T    / %(  ÷ šÿÁÀÀ-%"''&'&'&7676&7676531ÀD70100#!,-3X +$î'²4)) ''21.-Z] 3ÿàÀ  %!533=#3Àþ@¦¦¦Úúú}}Æ}@€`3[%'"'&7637676?4545&'&&#&3!01012?6'&'7"#2#3010132765&'&'˜çé<>A@(« j  23 °$$5€"C"A  (  c  6#$»€&!7676767!3&'&'&'&501!6'»þJ !))U8 þü%YQ€N88 @## G&&,8 '*+,ÿà  5F%'&#"32?6'7;2745'&+"'&+";2?45#";2?6'&#€€'CoBCCC’BmBmÁÞÞÞÞÂÜÞÝÝÞ¿¿ €`$276767654'&'&'&#7'!3@   þÀ    à  B/.`þÀ          @./Bÿàù  37%'#'™êtþÕ-vçÌìutg Ì9]ÐìÛÏÍ' ÿÀòÀa%&51476'&'&'&767676776767676767676545&767676'&'&'74'&'&'È! ,HAA   ""          c%,,,!"F$& &   !   ÿàÀ  ,@L%#327654'&#'#327654'!!6767&'&'#!"'&54763!2#327654'&#1:: œ:: Úþâ!!!!?þâ}:: £b  œb  a!þâ!!!þ‘b  ÿà´ "CLU^itˆ‘72767654/7654/&3276=3"5&'&'&#32?675&'67&'767&'67&''674'&'67&'367&'3767&'67&'¬ uKdt—JJ ee %@?? @ > ½× E+ :s UC‘+††+ ::, T  T $ RHÿÐð°,N`11676767&'&'&'&'1&54??276'&'&'01&3'67632'7654545'5C66  66CC66  66C†( g N   I//80+* Â"! ñ<=[° 66CC66  66CC66 þc--5! N +$%þºû \=>h€!3FXko7#'1#'317337321#"'&54763271654'&'31'&'&547672153#'1327654'&'#5##"'&7533'533#²%&-&#$/¤   " ¼  "" &&luu«ttvv,h    >«f   fLF$AW%ÿÀ€À %?'3'77#7%67167!!&'&'@ZZ'³ZY€YY3³YZþæ    þà :††þô:††À† †À††  þ`   3ÿàΠ3535''5#73SSIRR|yTÍÎ p/AA/PÜIIÜþ—{{iL€j'2Qcm£Ï7"5&'#;276=327654'&#&'5677674'˴'&'327676'&'&'1#"'&'6763267&'1%"9&563270176'&#"&'&132765&'&'"5&##&=3275&'#54'&+"1#"1;3276'V œ.   # "! #V''''2  #` + ú>² $"l +  !;Z-  -""  ""k       =3@) €t(8<Qh˜74'&+"'&?6736?6'0#01#2;6?45054'e#337#%#"00136741#"30136?6'&'01#0010136741761#0101301327â• • •"  • Q)3i43,)[)\») ) 7)\)\þø * )< f)!h)3QÎz¦þ¢^þÐ))4þ¢^•))ÿðÀ+@Th!&'&'567673'&5476323763231&'&#!"!67675#"'&=4763213#"'&=676321é(þ¸(( IXK (' þÀ @ þø    ¿     X'Ê(+Æ'  EE  F   Â+ ! ! ! ! Q€@Tan{“%1#'&'&76796705#"7676767367676#01#01"'&''&'&7676"?6;2#'"?6;2+32754+"%45145&'&7674145   !< e 70)%-,+! 8.&""6,& þ pq/Ž”KD?õ, %ý&   + ->+  -+4(,     - (ÿÁÿÀ!F763#"/32?/&+7632#"'26?6;#"/&#"#'&54?3ò Mab L L baM–L  M%;;%M  L :: › MabLJMaaMLM  M::M L::ÿÀÀÀ13!67671#1&'&'367167!31Ôìþ€--77-,­7-,­7--þ€ìÀ€6$$À$$6$$6þÀ$$6€ÿÀÀ'132?654/&#"#1"'&547632###ˆ%00%ˆ##ˆ%00%ˆ""""%00%ˆ##ˆ%00%ˆ##ˆ‘""""ÿ1HY%1#'&/&'&'01'"'&5676767267671%&'1&767476716'&'&'"71€5-"", 1##&7))5%##& '2))þŸ0'ô0#"5/0&*‚E'(K5 V''CI??''0'&%>>L~.005J>/ÍH`@?N>EÿÁ€À#)1:11/'&/5671?1 '%737'7/7&76* „+ ED +„ Šƒƒƒ „ ^J +¬)/þ)  —*À þÌ ž  ž 4 þ¾'{z'@þÀc)÷ma*MBŠo U`ÿÀÿÀM{½ +M'&'&76767221237676322#"'&/&54763251##'&'&547676323232147165167654'&'0'&5&'&7416743436362"#"'&#&5"5&'05&7671#"'&'&541&="#"'&54?632#"#&/67676'&'"'&'01&7&7476767231#&/&74763267&'&'&76761"'&'67620#"/1Ô_98 HJa,,W@>3$#*)$$ª  ##W8. >?J,,W@> 34U)0F? '0ˆ11F? ')NPaaB@e//Y<=WWG" k!!&& "&'++'&þþ!"%&!"&'++&'zD:IICC('c//W<>VWGFú1#E>!%#0V#10#F?!$$ÿà  %K6'&/&'67632674'&'&'&7671'&'&547676#"/1‰ ?"!!"? ·   ¦S2  Î ?!!!!? ·  ¥S2   -88=?88-¶ ¤EW.,+$ þ@-88?=88-¶ ¤EU0,,# ÿÌñÀ5>G]{‘67&'1#"'&547632673#"'&'&'&'367%&'6767&/&'&'6767651'6776767676'&'&'671!&'&7677'1êO"x""**//*+!"x"#..#þøny##  ë!! !Z! !!ªí[..*)  )*..Ò."    "ˆ  "" ""   ÿÀÀ &+73#5353535#33333#5##353533#35` €  € À € @ @@Àÿ  `   þ€ € @@@ÿßÁŸU!"!6767&'&#11#&'&'&#"5632275#&'&'&#"&'56767632276767þÀ@0       ŸþÀ@þè `šÀ ÿàÀ I!!&'&'6767'&'&#"#'&'&'&#"'&"132743?1676/0`  þ   N,{- C76E   þ   ` Át\\t3))3 ÿÀÀ8AJt}†ÀÉÒÛíû&'&'76767'"#&7676765&560127'&563/6"'47674'&'#101010901301'76'&7/?'119'01"#0#'&'&"1&5676767&76'%6'&7356#"347166'&'3256'&'"'&'&5&7620#00101—AVU@@%      `Ï\:!   ==   8  $%$' "":9HN>þ¯ èU   Y 0/.L%     _ME`3,-#%!  ª=  •//*+&  H9:""(•}(    )ÿàÀ 47676327!7'7'7'7'!#"'&'&'&#&1‰:   /þ°********P/   #"š  >0 88888888 /3 ?ÿÀ±ÀÍÚòû(,;FLQbo09"'63016323#656'&7#&'&'&'&67016'01017016#01"701601#3016"'101&77'0103"#"#94#'&'&'&7&76'767159327676716?676710767676701677639621727016'12703602016'0'1&#'01&'&''0101&501429&'9&1&701631&'0945&5065&01'06'01"71'14'&'&76741016767672&'&030101657670167676725967216'01&?6747141"1"303051&'&'09&'7'&'6#2123'101&'6724#01"5479?67&'1&37#7101&'41&'?09'&'76?%030#3761"10301674501&701ø „      2)*             :C  $$& ” ##  \+  $Eï þ~ ¿õ   #         '&55;%            ,)   / L   ;Ð   ( þï  )y  * ÿЮ°Pc%21+&'&'967673&'&'27676'&''&'&7676&'&+"'673#172767&#"1L, #3[i7117ij8 ) ,VV+''+VJ' /$-    #:`› Ô(''%5E>ll>EE"0 &662]]26) (!%% ,iE - ÿàÀ at1!6767&'&'!#1&'&'9676312&'&'27676'&''&'&7676&'&'#&'673127167&#"#7#@@þÀæ "=G$  %FG%:991  &@H     þÀ@Ô#.)HH)/. ##">>!$    FD  ÿàÀ "'1!6767&'&'!#'#7'373'#3@@þÀ)hz_KV/oubCO/&ª¬ þÀ@Tw¡bb™ZZüááÿðç 3#'#7'373#…GšµŽoG¥®‘et(ý*ÿ°ð‘‘¼ä……þŠNþ²ÿàÀ L1!6767&'&'!1&'2327"'&'7&'&=&'&567&767676701@@þÀ)*<9,/" #")  þÀ@§-*+  #  ÿàÀ /!";5#5356763201#"3#327654'&#þ ‰??+ E :‰ þ ˜H7.= /H˜`ÿàÀ +E!"3!27654'&##53'"'1&547632##56'&'#5336763 þ€ € þçBC"   BC@1  þ€ € þ€ÖÖó   óhjÖ ,u ÿàÀ mvˆ‘š£¬!!6767&'&'"74545&'6767&'676'&1&#"&'&#"'&'&#33701#&'&'6767'"'432'#"'672''&563''&76''&76''&76''&563þ   `  {         2--GF//3b     þ   ` þ€  .    .   *+8F----F8+*=  ÿð8101&'367&'&'327&'&'5&'67&567676767Ë#"CBaZG K8$  %,'87B,/$ !(GDD--.,' 90 , % ÿËø¸0%&'1&'1&'5#5356763201#"3#6767ø!!88EE88!!::[??+ E :[::ÀE88!!!!88E_CC­H7.= /H­CC_ÿÕð¸~‡™¢7#"5632'76'&7365&#1'4545"'&'4'&'&'&7632767&'&'4767&'&76016324767676767&'&'&'76'&'76'&76'&'76'&¦,BkDD..M    ,!!  !    L.-!"89F” ! 3DDjU@@    F    0 #%  @@UF77 þ§#ÿÈð¸n%11"'676767670136767&'&'767676'&'&54767&'&767676'"01&'&'676767ð!!88E&# 9##++BP*) 5.!    G++!!88EE88!!ÀE88!!   ,+B?'(,+=   + -3    >=PE88!!!!88EÿàÀ f#676767676767&'&'767676'&'&54767#"'&76767&'&01#&'&'6767!À ö9##**BO)* 5."   Y  ` pþ     ++A>('++=   +-3 # "& `  ÿàÀ 8E!!6767&'&'&'1&'6767&'36767#537##5#53533þ   `  ì++)  9^,Ü  þ   ` þ¼++  " ,R s€$1%&'&'6767&'&#6767#535##33535#‚12TR6666RN24 3!""!38mµ¹877888ÜT3466RR6602 ""44""C888888ÀÀ-7#3'&'1&'676#56'&'#336767d]].Š]"# ]Z "D+)þ¬’”+)'(>¤à€Bew71&'&54767%'"#"#'&'&'&747&5476726326763&'1&'#"'&#&'7376767'167654'&'º    &#$*)&&++%%)",-)'!(@$#""$0$"#S  w32-%%-2@1   2@3""++7{%#76'&+###'!Ía41’0ÿàà '73?!7!7!7!à@ßÁRt†þ³M þ²— þPP_),,aR5RÿÀ|À9N`%6'&'&'5#"5##"#&#236'"#232#3523013567676'&/271611'"#55236'"#6- /11     @11=&%#ŸÍ>*OMNO4Ù :DCCD8.l  `ûj  1€:>&'&'&'"#"#23012367676767674545&'&'5& %22++++22%  %22++++22% þÂD%  %%  %Ö£QRÿà '71+&?2#'&73271#"/67676;£ A E,A -Ü[ A ]!] B î+1  zL  M¤ý§  ©;¤  ÿàÀ &9!!6767&'&'#&?01'&732#71#"/67676;þ   `  þü. 1 . 0ÜgB /B</   þ   ` þà W6  7U Öµw  xj(  ÿà  '7'77'?'7'„„„„„„„„„„„„„„„„„„„„„„LUTTUTTTTþèUUTTpTTTTUTTUÿà}  %'7''7#3!5#!5##ÄÄ;š™¶µ w bÈÈ'þé(g(‰)')~€€ U%T  ¨((x  ÿàÀ #0Y’16767&'&'&'1&'67677&'476324'&#&#"#""7236776565454'#"#"#"'&'&'&'&5454547676767623232à1 !! 11 !! 1   “ L%'6%$$%6(%%'7%$$%6'%0 ""  "!  !"  "" 3! 11 !! 11 !¾  à  7'%%'6%$$$7'%%'7$$$%á  !"  ""  ""  ""ÿàÀ &8!!6767&'&'&'1&'67673&'1&'6767þ   `  ÿŸ  þ   ` þáÿÈð¸&#711&'&'&'676767'3733øA‚Aø!!88EE88!!!!88EE88!!d””"¨"bcYE88!!!!88EE88!!!!88ESßß44ÿßù "!676'"#!#'3DF Dþ-h þd ¡þÖ““ÿÀ8À/1&'&'&=#"'54767676;3#766 $; /  .G S  T!  ! D "!! s R … AÿàÀ B!!6767&'&'1#&'&75#"'54767676;3#76þ   `  R7  ,44   þ   ` þ”Z+  H4S(ÿà| .?%&7&'&&'&'6767676767&'&701'6716'1017?38  ,"#- 9 '³7( !!C'* ¤  *#ÿàÀ  7#55#5#35¸¸¸¸Ìôôôôb²˜þ¼°–"Ô²|´Ö"@@…1%&'67!&'67%76'&#"1&#"'&#"1!&'&'¥þö01;@@;10?&'@'&?’‘SUUS#;:KK:;# ÿÀ³À'Œ¦¾àiµ31327&'01&"3232710721256#&013&'141&'&'&'6'&'&'0'&'&5456'&'&'#76767672317676767676'6312&'07676'&#&&'&7'216'&#16&7676716743676#"'&'&'&'&71'&#&'&716'45&767676767676'&'76'&'&'&76767667676767767676726'&'&3"#0#6'&1'%1'&767676767217672360316701676'"&'&'01&5&'ÝÝ    &+       Ä   )                     ÿ    Eþé  *% !     =      =    þ±      $                      ÿÈø¸'5CR`n11676767&'&'&'&'&&'6767'1&'&'6'1'676745767&'67167'&'&'1&'6E88!!!!88EE88!!!!88E¤.++7 :8322'æL77 -z ??R :005R++A 4980ø 3%%$¸!!88EE88!!!!88EE88!!r8L0#" #!""02&'¿((-:T§#%%;++% )):,%$ÿàÀ  `%65&'&'"&'276767&'"'1&'476367&'&'"'&'&'&'67632#&'&'&#&#©::W'0 ::W'/ Ã2#" )  +!"(+!!  ( !!"+”W:: 0'W:: /'[   +,   &,ÿ½p½$J!3676767601621367672576'#32#"65673Cþï  ?S 0:  k[I :Û½þNI ! ó@J<    FSÿàÀ .D!014!6767&'&'#"'&'5676;271+"'&'567673ˆþ°PÃS  S Á Q  Q  HG¥Pþ­ þ  þp  Ž  ŽÿÈð¸111676767&'&'&''&'&76727676øE88!!!!88EE88!!!!88Esqq  ¸!!88EE88!!!!88EE88!!â™™      ÿàÀ %F173767676'56'&'&'&#&35367673#&'&'#&'&'++KK++++KK++-3005M)*++KK++++KK++i@JC11XÿŸ4F\n|…6'1&'&76'&7"'1&'1&'676763272167&'1&7676'17676'&'&1'&'&7676'&17676'7&76'— ' À611J3-- >## C=>g..BA()/.AA)( %  *)4O!   V    !   &þó+DK20 3 33+,“*!!+*!!+ $3++ þÉ         ÿÈø³ &1&'6767&'67677&'1&'5Ö()B899Z)A5+  ,5B¿B)(Z998TAB!C]^CCœþ±'(00('W!BATœCC^]CÿË€µY%1'1&'1&'&5476767'&'667#&'&'66765&'&'&7&7676'"'67676€0/; 1()6$$ ""$#;"!  < .""!! ''-‡2 >$# 3 6$+;%%.&& A)%"ÿÀ®À&7!+5#"'&=!5!5!5!%!!54'&'œW°œþdœþd[þæœtZZUUnUUÇÿàÀ :!!6767&'&'#"'&'&'&'"'67676767676'&6þ   `  ?B-   %  B2  þ   ` –.RT34 7`- N?ÿàÀ #3GWk{71#"'&'67673347167&'&=7"'1&54767#21#&'&'676;471632#5#1&'&'5676721&'&'535"'1&'67673+^   /    /   /  v  v½   /    /   /  v  v…   /  v  v½   /    /   /  v  v½   /    ÿÈø¸IR^y”&'&'67&'&'&'47632321&'2327630127'&'&56323276301276767327&/76767&'11&'&'&'676767#&'1&'1&'676767>e6 !R ;U8./M/!  L Œ@%"A·A0=!!88EE88!!!!88EE88!!  65BB56  65BB56 þê32@/(L& 6,çŒ[åG&¹ ³y -¼00<8.fE88!!!!88EE88!!!!88EB56  65BB56  65BÿðÀ%&'&'676777'7&'57DY8955T7""&%;D±ƒ%(F2#  ((96(' + %'T!þ€+ aÿàó '#37674'37à98`j'^ & ##B]h]3ùZSˆ"# &õßßÿÈè¸)%1&'&'&'676767&676767#53è@AmE88!!!!88EeAC/::,++,A1ìºlBB!!88EE88!!?A*)*FC,,VÿÈø¸#N`i7&'67%11&'&'&'676767'"&'767&''"&#67674'6'&'#1&'&3276'&767&'Ê.!!88EE88!!!!88EE88!!„ #38=3# %%88&%E##Ž2E88!!!!88EE88!!!!88E) N  V ))t KÿàÀ &;l%#"'&763276'&'27657367&'7!&'&'6767!"&'732767&'&#'&&#67676'6'&'&&"![ [ ¥ þ   ` d &7;  B6% ((<=((f6  ¹þ   `   T  ]  ++ ÿÈø¸<T11676767&'&'&'&'&'536756767'5&'1&'&'5767535E88!!!!88EE88!!!!88E :"¨ ":¸!!88EE88!!!!88EE88!!²k  ..m { / /0!÷€;%&'&'57676=3'75&'&'&'5#6767547632÷ /0 "4 Vá#3 // V /0  ¶F/  /FG H:$/.£EF/  /   ÿàÀ /;&51&5&'&'&'&'01&'&'&#&#!3!27654'#5#56733¿þ   `°À°À| þ  `þ”À°À ` "',1#35##53%3#35##533#35#73#5'3#53#5RR…3)RR……RìRR……3{4444¯ûL†]]†¯)ô†]]))ô¯†]]u33L¯¯ÿàÀ 1CX1"'5632"36767&'!&'&'6767!67167&'&'"#7534'1&'"#7536765Í  5   ¾ þ   ` þù  -4 ž 4   D CD  ¢þ   `  ¯!" Î 3!œ 3"ÿÀ9ÀEIØÜàð7&#""17&'&'&'101674'&'67676767#5"'&'63675&'1�&'&'&"3"'&'&'5765&'"#&'"#276767327676763676=&'&'&'01&'25276767&'&'&'7/7'27676745&5ô¤55 '  f-  19 ×;##8  !  5    Œ   !"    % %!Ä N G ÊÀ-  ^"  ±þƒ-##                 %$/".–=3Ÿ ÿÀ¢À!@Su&'1&'0101276745&'&'01#"'&109&/&767167671&'&76767#71#&'1&/&'&5&'5&76710*##65SR88##*®  +-P*  ~; &T(11CS8866RC11(ß  ,2’%( "j= $+%.ÿàÀ &Qz§4716726&#&'&'&'&'&'&7&'&5016767676326'67654'&'"&6'1&'&'&'&'&'"'767674'&/#"'&5&7'2767767676767672., d,&  ,  ,-  --d ,T,'   ,,  %d +-  d,& u, -14 ˜-,d  , 5-'  -/4  $ @u%*DJ765&'&#327674/36+5#536#%#534'1&'27##&'365'67#è0 !/§¬2$%AšI OSSU6g8 =;$###=\>>¹º54sÓ54þ6Ee  Sêb5 ñ##°:('&&;=$%W @55ÿàÀ -2B^7'#536'&'1&+3273&'7!&'&'6767!35#4'65&'&+3276?4'1&'27##&'34545»-. (+„?‰ þ   ` °NN+#[]—! !2" "e›4R -šþ   `  in'  À   !/ "ÿÈð¸1HZl%11&'&'3276572767&'&'&'6767'7676'&'&'7"'1&'67632#567167&'&'ð!!88EWA@_T)'(;… EDeE88!!þ¬    ®    ÀE88!!12O'<)((V 7b@@!!88E€    ‚    ÿàÀ HZl76'1&/6'&'767!6756767#&'&/!6767&'&'&'1&'67675671654'&'¹ ×þ  u8%%&OY `  d  [    E ¡0 Q%%&8%q  ` ß    ÿÈð¸1Mf11676767&'&'&'"'&'&"#&56767"'1&#&'&"#&'47676327"'&'&"##&'67632øE88!!!!88EE88!!!!88Ee/556 >=<6  0?@?dM 9POA5A765+ ¸!!88EE88!!!!88EE88!!þ“  B - L  ÿÀ@À3#1#57'#53?67613@b[¡ ,]]Vœ+bc³ € T]´  T]5€K &3@MZmˆ•¬¹ÆÓ7#"5'7477"6?'"32?'&#"32?'32?'&'7"3257'4#7"3257'4#7&'3257'4'&#"413276=7'&'"32?'&#&'&'"36767&'&'%657'&/6?'&'"6?'&#o—òox'&7Ú""þØ6ÀAEEA-iEEi‚DD‚`####9899 DBBDFDDFo± @²  /:£ŒDDŒ>7#$ ù"!<‰AA‰‘CC‘CCÿ倛2%#'&'&'&'367&'&54767'"'67&#"7€&& !"K&+!&18 %%6Á4;++ $$MNƒuFF-,?&'12 !!+*.2< ÿÀÀ %*/3'&?6=4/'5#'75'77'7577'7öê ê ê ê à¬M_,_M¬¾77¾¬M_NNNN_M¬¾77 œœ œ œœ œ as3?gg?3sœ%%Jæs3?g4444g?3sœ%%J:€0]£%&54'&'&'&'&&'&'&323232767676'&''"##"'"#"'&7676'&76327676'1&'&'&'&'&767676'&'&'6767676'&'&'&76ÿ()120).'' %#" ""\\( ",<='('(C ""&(244%$ + X  "# &   3 Ó3)0!!$#'%!!#< (( ''? **&P   # -  ÿÈó¸j&'1&'1&7676741272767016'&'&'&'014'&'701676701017676501676'&'&#&32G78 7.   ,,  & ($$BCl8"#99F<44$$$232  32  %% $&'"#.-YoDD ÿÈð¸.=Lg‚“À&'&'77&'47'67'7&'&'&'5"'767'63567'#6767'711&'&'&'676767#&'1&'1&'676767'67&'6767'67&'7&'&'7&#"'767' ;00 (>ë   >( 00;x(>;00 6(>;00 ]!!88EE88!!!!88EE88!!  55BB55  55BB55 '  ·3 @@ 3  4 @@ 4  Š0  . þô 1::1 p .  /9- 0  þò. /  ‡E88!!!!88EE88!!!!88EB55  55BB55  55Bk  /;:1², ,CC, ,CCÿàÀ /8\n711'&'6?1654'%#!"'&54763!2327&#"#&01676'&'76767&'7'"=#3#"37''&741535#01545#236767e ?þ `ã1 CD* U 4  He&$  ,r  tŠþ `E.&   -  XiK  =(B* ÿòŽ):I_hŽ#&"13676'&'&'776767&'71'1&'67'&'1&7167563676=4'&'&'733'&'632"'&=416#&56767373#07ØO! 7mC  %? % 3    …  T?$$$$à%$ &9= "(.   H' & Ï  †d w!© ô$##$ä#j$! )a  ÿàÀ  !!1010101#5'36767673Àþ@ÚP%  #Q þ@ÀÅ6eg™8   7›ÿÀgÀD1'&767&767'1176'&76767'&76767&'&'H 6  2x@++   #$3:'&&')8..//G0bPP7"5IHYð%%877 /.-'':.!"   )(4G//ÿÀ·ÀI%"'1&'1&5101'&''&'&767&'&5#"5&7676767&767#²  $$$$   '&VU''     4 Z=>==[ 4 ÿà3 '5M[i2&'&'727&56767'"'&'6763"'1&54763&'1&'6763'6767'"'1&547633"'1&54763 76IS77LD ..Gh    ‰ £00CH....H6Ûk<&&..GQ3;"B+,5 0 œ<'(('<<((0!ÿÀûÀ#`~"167654'"16767&'&#5&'&'!&'&'&76745454537676'676'&1'1"#"&'&"#'&'5476!6¼ þ™  P!  !O 0('"'&/ =,&ZÆÆ %#H*+ $  $ *+G$$ Á /¿ÿÀèÀ#3'#3'3737#5#!‡&&j''¤ataM®'MMDW5YnnnÕ[þ¶[[¥îI@@ÿÀ~À!2CT7'&'&767676?&'&77676'&/&7&'&?676'%76754'&+dk  ,$+   J‘; " i •! > k þÁ h  :6Ð1 ,) ð o R n^' " …( [  Ï µÐ ÿÝ£$P711+&567272"#&7&'"#"7367410767676237676'&'oK ;+=, $$3  ö"#%&  @  6&& ˜  t &&./4 g#"  ?=ÿภ %5&'&'6'45#3&'&'13&'&'#7&'#6765&'7  0] >h !05''r &&9mü YI AYI30(%%#%'I Ri401,XQ]^dh]]ND  FLƒŒ.445ofÿà@ $27\o%1#676707677!&'&'6767!7#/&#;7#374'&'4727&'"#"/6767'#&347673013Ö!j þ   à þY?+'@$+^((Œ"      <*4%Ù —þ   `  û›jH ‡››2 !  #2›Ž  ÿß@Ÿ Tj‘›»Éåú *8HV_Œš®%&'67%67&'73&#67&'0920#0011"15015"101&1414143014103030301201003101410501"1#3513'!&'&'6767!127&747&'6514'&'&&#"5#345&323&5&36357#&#2735"'6327&32#"'767'#"'535#5##33?3&7''&'7&5#35476747167&7''&57#&7353"5#35476?#&73573535#3450'01"50#01"10##101033230303052141417#'#1537357&'1&'36767ã  þÉ  v k  jK þ   à þ(';)#76#);'(à5555Ž   -(    $   ;    B  "(  (':*#$ %#*:'(&        Yþ   `  Œ:('0CD/'';l,@@--@@,M%%      % %%4K|}P;''*+**'(: ÿà@ -9@Re‘›§%4+3257!!6767&'&'23161#'##'3#3#3#'73#/21#"'&54763&7'&'6762716'&7676&'73#5323#53!676767%&+327654'þ   à  ,8--E$#'  1a     f  D¥þo`YX>?þ* ü  ¤ þ   ` ‹#!!RR77TT     B   R  Rþú"! `6 ÿà@ $15CQZ^&'1&'6767!#'#'#3373!%#7'373#'7'73#53#3#17#'#5373#5##73#/3'0  à KbNRBÌ > þ ³+1CC3)*3DD3*]''þôSzzSQQå%"%&= <'ÊB +>3@, !'  `  00@@¹¤## t.GI//HH.CS*)P!! çdddYYdHO.. ÿà@  5Ke†œ¸ÇÐ7"'672'#"376'&!#"37&'&7!&'&'6767!4'1&+;6?62367#01&67;6?4'7454'#"'&'#"36?4'1&+;2?62367#01&67";6?4'74'#;6?167&#ºi Ô þ   à þ@ ( -U    (@ Ÿ ( -U   /Z¾0 ‚þ   `  ‡f-    @b\'&  kf-    @!he4 ÿà@ $CUeim–%&3&67&'7!!6767&'&''527&'&'&'672&#&7#327#"'&'573&1"#536761#53557&'53672#7#727#"'&'67632ì$u  ™þ   à  þj/  .  E  #J$ ,$$$$J#¡F ã5¿ þ   ` ù' "  '"  82 r!U} }}®)¦ !3  1NN7'"'&56762767&'&'&'&76367&&'&'&'&'&'&'"676501â#* "#J7!! '$(*; [*F <, NA!"~1Q3*63 +,1$M0; ! @&&'&F‡ ÿàÀ `!!6767&'&'&'1&'&'&'&'"36765&'6737&'&'&'&767636&"3#þ   `  \/    NR1  % ,9%"  þ   ` þÇ "   UY)   & 0  ÿÈ€¸$FQ#&'&'#36767674'367&'1&'&'!67&'!&56767!!%3#&'67hC<=NE88!!5C<=NE88!!5`98U9..þÖ98U9..þè*þÐÐÐ D)*!!88ED)*!!88E`U89/U89/-ÿÀ’À>Pf{ÐÜ%67167167&'&'&'&'&'&'&'67676'&/67167'7'47161&#&4#&'&'&'11&'&'&54767#"'&'&767"'&'&'676'232367414'&'67676767&'"#'&'&'&7636'12&'&'[      5--JY32 ##  "!ª "    ¸,A-"!             b  é!" '' -,"89-,98X! k  ^< -eÄ  º1*!       %% ~ ÿàÀ  #?!&'&'6767! #373à+V+à þ   ` A_€_[p[)  Gþ   `  þ»*þÖ[[ÿÐ2°FJRdnrx|‡‘–Ÿ¦¬°¶¾ÈÏÓÙè%'65&/65&'"#&#"#&#0227332733674'7674'767&''35#&501750'"/6501457275'650501757'7#7/77#''7''73#673'376357'557#5&/53#3&'#73#7'3?37#77'701'3 8jj86  7 4jk4 7  þs,,,-3843.,,,F#@b¼  SPSPOD|q:bSu q9¦{K”3ht36<]EE#‰rQQ""RRs<0/!.'56 hLL##A@VŠ>23$EF^½#RQrsSS"ü&-!11<86‘#NMi VBB#9€)@#&&#"67267"'&'"&#+6766'&#&&"67632632ƒ 8//8!-/=*(;¶%!48<++<84 %*>G9119G>*+"14;,,;41"#&8//8&#Qù +*þ¯))]""þ£-''þè  ÿàz #0=JW%65&'&'&'!6767&'&'#&'56733#&'56733#&'56733#&'5673/0G;,-$!"#4~4#"*þ¬  YZ  W  ÓG0/##9# $4####4+!! ¥  oo  „„  ££  áá'ÿÄÀ¼ #'+/37;?CGM_“—›Ÿ¤ª¯³·»¿ÃÇËÏÓ×Ýá77'7'77'7/7'7'7'77'#3'#3'#37#37#37#3'#37#3#37#3#35#367167&'&''6716#&'&#"36''71327674'&#'&5'#335#%#37'!!5!#3#37#335#535#'#335#35#'#37#335#3'#3d#¨£|ÏFXÔ!!/""/""!!_""/""_!!Ž""þŸ F""F" ©''''0       y V þª 5ÞâÅÁ†þz†þ’ u!!á ²!!² ƒ!!0""S !$""&    - * 0   & P þÚ"ú "Í''''o     U"­"+!Qþjbb–þ}VVþò+;;‚! !£ ˜! !W B!£"­ " ü€*<#"#54'&+!67&'&'1&'67673&'1&54767áj º jÂþµÔ€ (( þ´LþÜ€|g%1&'&'&'&'2767676701&'&'6767676'&'#&'6767&'&'&'67676363€!!2>**$#*)<79!!!   )(*@,,*+BI10'!$$01.  !2  ='&/ w3 &%10%% )*    ('AB))))4, "!"" 2    &%= /ÿÇ€¹S"1367654'&'&'6767"'&56767&'&376767673676765&'&#ÌP<=''=4!  "      5""54I¹0/T5  >%&5#$ !))*+#*- --/L,,ÿàÀ .t&'7316767674'&'&/7'&'676727&'1&'&'&'&'&7676'&'&'&'&"1"#&03767676'&'&#}B[>22v19>23 3+F54NL6755Ne  ' _@22><3s22>-(( þªD-5N4566LN54Š        ÿà€ ##'##3#3735#735#7'3€@Q^Q@00E RgYYgRD00À6 ÀÀp0 0ÐÐ0 0pþÐ@@ €v$616767&'&'167671&'&'167654'&'µM3333ML3333L ''&&‹  v34MM4334MM43 00II0000II00,+AA+,,+AA+,ÿàÀ !!7#/#35Àþ@ÀÔN!. -#M þ@Àÿ’[ [^\ÿÏ@±ž©¹ÇÓâï 3@vŠ ±Å×âô*:%6&'6&'4#"&4527676'&'&'"""'ʤ52767676'&'&'&'&'&'&636'&54'&'&2""&&#3&&#&&&277367674/656&'16'&'671#&'2301&71676&'6767&'"'&774367721&'&'67631'&'232'1#"'&'&7123#1"'&74763231'67'&'&767125772377637767201&'&'6'1#&'&'476'&7167676'&70367&''151677677&'6731"'&'67676&'1&161767676'򻒿&'&'17676'&%"1767&'&'&17674'&'=       6BB;($    !   ªªJ     þZ    0 ¸   t 6  I   j$    #''2/&&!      *882R››5<=7 5;9/ j   »F8þÖ  Ø ß  ±             $+    !!     !  þ     !     !¢ !! ®6  3      $#­  B- @! ! -  {$$;þ´   °  ó C   * ÿÚ¦#D%1#"'&547632'"1327654'&#"'1&'1&'7667676'&#§   þ  $•WV22' JIy&&#%*%G"#~  .   * "#)&:%$ÿÈð¸/<I]x“16767&'&'67167#&'5&'&#&'5#&'5673'+"=473+"'5&54763211676767&'&'&'"'1&'1&54767632#øZ<<<{ Ì  #¹þ   `  p%1 $&''Z€ ÿà@ &;P16767&'&'&'1&'676735!!6767&'&'#&'&'67673ðK2112KJ2222J(  Pøþ   à  Æ[Q7777Q[Q:;.-5p12KJ2222JK21þè $$ ÐÐ $$ H þ   ` þ`66PX4554X5++ÿÈð¸;Vh7&'&#"27'&'67623&'&#"2701'&'6762'11276767&'&'&'&'1&'6767ö! ! .! !  .H88 !"88DB88"# 88GV:988ZW99;<RQSS  !865#-    !  { !ÿÈø¸.=JYfs„“ ¬»ÈÌÛè%'11676767&'&'&'761'1&7'761'1&'&7'11&'5676'&/&7161/&716731#&''&'1&76?6171/&716'&?6761&'56711'&/&71671/&716'?1/&716767#&'16731&GZE88!!!!88EE88!!!!88Eœb:K@  9(^BC@  m°t°#­&mR!!88EE88!!!!88EE88!!¯Y"*  ‹Iˆá *  mt°tÝCÿÀÀ-?767327&'&'65&'3?#'6767167167&'&'!n%L`=>m)˜"":9HmqÞ0"" M$44>H::"þÊ%%%%ÀG:¿…FFcB$;%-3G::""¾Â-…-"#:€%%%%ÿÉø·ø%&5151&'0/010145&50105&5050#4'54#45&145&14101&54'0101&'14#4'0501&50'050'4'05"54'&5&141&10'41&101&5&5'4'0'4#050/"501&'4'&'&'&'&'&'01&'"#"#"1&+""090109016?0103272301216'&'476767&&'&767&672767670145ø    41//% /.&   (+*)-CC^E88!!Ï      #&)() "" ?./"9"2:BZ9:!"88EÿÐðÀ#;11327"#&'&'&'6767673&#'1&'67654'&'676:V343&%-7,DaB65!!88EaC,7f "#++ "# 55Ÿ<'./7/+›&#"2222%# =((+þÁ-*(FH](!--5,* $%*3ÿÈظ %H%11##531&'&'&'676767'&'&'67677&'&#"6767§ &1 9:ME88!!!!88EI87"ºÀ&=*P@****@J+;..8=2112=<00õ ,a–E)(!!88EE88!!$%@mb E**?@**>"012==214ÿภ %'?#7%737d%…`TÖšSYþØ.úþYÖ}úÎÖTš§&`†º×:LÈ9ÿÀîÀfs€%#"#5&+"#54+"#5&"#5632376754#"#"'&#"565&#""#&#54+"#54+"#5&+"3567635&#%+"=4;23+"=4;2é$%%   $$$··þà“  ³  &<  p  ³ Û`$ $`Û@@@@ÿü‚„a%#"'&'5#35673#&'5#&'&'&'&'##"'&'67632237676762367#&'#"!5476‚Yî YY e  %%  7YÀ5$Y ,< "!#6ÿÈø¸ '6%1+53211&'&'&'676767'&'1&'#3536767F FF ²!!88EE88!!!!88EE88!!€%x2F%å J %E88!!!!88EE88!!!!88E%%øJ%e€!&7#57##'##53373%57'537'#'#53Õ! &=& !B$ $BKVIIV VIIV r¶¶e˜®®˜¶­­¶?>&44&>>&44&> !!ÿÔ€¬!F7&56763'7&#"76'&'&#&76&'7'3767676'&'*0/GF,,2&8C(#"#"">&#^P@!#=(115' ! Ã3L&'H'$%  ?/'G# %$#" ÿÀ À -'7'711''&'&'476766#7''77'%+,,,+§*)99--,-9V22žO}J]]JS+V+Ü++V„f7777fe9987—X†°I]]Iª€YÿÀ&À ?''77'755Ä]’VllV”b)22222¼gÎV ll VÆ•gg2d2œ22dÿɶ4%/&'&#&#'&'&'&"3016701?3676'øF/¾/F "j5  5j" ó¶¶(*)O((P)*(ÿàè &+6;%11"'&'"#"##&'&'&7&76767%35#5'&'7'35#Ï1 0&=BG#!"'&54763!2&'#''#!67%#53#53?##53#53'7##53À þ– j % o==n jþûIIII 6v@ÒÄÄÄÄT@v6Tccuþ– j þ–jK22Kþ–û%%J&&“,,I%%J&&“,,Þ%%ÿàÀ @1111#''&'&'&'&'&1132'&'&'&'&'&'&'QRQF "33:0 P $$1# ; &'9888$RG+'33L5F. !/11 '&#-((ÿàÀ )l'"#&'&54767637!&'&'6767!&'1&'&''6767&236'676761&'&#36767676367227ý  à þ   ` @ C6T   %  + ** Eþ   `  »A''+S;  !  ÿÀÀÀQh%&''67674'&#3236'&'676765&'&#67676767676763227&'&'&/'"#&'&74767632— 59'&%$B    (:('  ¯  ! í ,-6 -.+C##? (,-5!   TCC %&' ÿÀ¼À;\1&'76'4'&'&'6767267&767676'11676767654',!! &&=n 02%%<  R006#/0/0#)m  $!! ()OH+,(y<('H…97/9:01 &%5:))  54IH=% %/67-     " #$00'ÿàÀ Nk!!6767&'&'#1"'&767672&#67676'45&'#27674'677&'676767&567676767þ   `  w"/0"!4&  E&        þ   ` þ£##&-. ! %! $$ 2-"$R.%""“    ÿÑò¯ƒÿ%&'&#&'&'&'&'&7676767676'&'""4'&'&'&'&#""'&#72676701676321767676767676756'1#&&'&'&'&"'&54'&'&'&767676'216'&'&'&76322354'&7676767671723676763203ñ "   "**"   !  "     7   ))   7 Q           $      ÿàÀ ”!"3!27654'&#1'01"01#"'&'&'&#'&'&'4'&'&'&'&7676767676'&'&'"'&'&'&7632234767676322363232'&'1&701&767676'&#"#"17056'&'&'&'#&1"'&'"#"013267676327654767676'&'€þÀ@               $        $      þÀ@þÁ    &   &             ÿàÓ©,<&#6767&'"'6767676767676'&&'1&567672È+H/6X;;;;XX;;: ,22K/) Hþµ22K(%2//0© :;;XX;;;;XT= 2CK22 U+*2þ##'K22.GGiÿÀ»ÀQX_fx70901097"''''7777327'67'67'67'654'7&'7&'7&'7&#'7'75''5716767&'&' Ó - 3= @DD@ =3 - - 2= @CD@ =2 - ÛÛÛÛÛÊÊÊÊʼ¼¼¼G////GG////GÛ„D@ >3 - - 3= @DEA =3 - - 3= @Dÿ€€€€ uuëvvëenÚnnÚn3/0GG0//0GG0/ÿÔÀ¬3?3##&'&'5676?356765414'&'&'3#673&'7[º³, &'åC+% !-$)>2f€Ö ·0>tÎ%Î&8pKb11 3 ,,gŽþÖ0; ÿÀÀ qƒ˜£®¹Äê471632&51##&'&'&'"'&5&'67&'7&'&'&74767672676767676767672632#63%16767&'&#"4767654#"'&5&'6753&'6753&'6753&'67571&'&'4767676767676?4'1&'2766765Ð 0 %%     " "!   ##(  /   þ¼    2)!0)112M*)4I++#    ! ,/ 1  h ''      %% ,@ Ÿ   i)**  2ÿ        £-34G4<.**&'+d*"5))%ÿÈø¸BN11676767&'&'&'"'1&'&54767632&#2767#537#5#53533E88!!!!88EE88!!!!88EG!!0#!!!Fu 7ç$##$#¸!!88EE88!!!!88EE88!!þŒ!! !!!+ 6!!j##$##$ÿàÀ F#&'&'567275#&'&'"#"'&547632676763276767À !------   --! þ° @ Ð þÍ €    ÿÀµÀ-'''7''7'&'&7676#015??n;'al(K\}* BN !.:%%( Ah>&1,'‡!e NF6 7 M"$J,ÿ๠#<%#&'6765&'&'767676/&'1&'63#&7&7¹!;:ON:;%%89<%(#/  nnp= "''1Z5556YC10 :œ?%=€#e‚654'&#"327654'&'4713517&716714'1&'2&'&7676767227210167676''7&#"32767674'&'a   CAŽ]+ &#     ( ¯ AC  `"&&23''!$ ?f\>þ¼Ÿ##$74&& / %$  *)8 ¬>\f? $!''32&&"ÿÈð¸W11676767&'&'&'11'"'&'&'&'&767676767676'&'"'&'&#&5676767632øE88!!!!88EE88!!!!88Es    e  m$2¸!!88EE88!!!!88EE88!!©"!""   E  /ÿÈø¸11676767&'&'&'#73E88!!!!88EE88!!!!88E0µUµ¸!!88EE88!!!!88EE88!!þºœÿÈø¸ 2<Wå%/&?6'6'&776'&7&'1&76'7&176'11&'&'&'6767674'1&'&'&67236'6'&1"1676'&'&&'&'&767&'&676016'&#"41017674'6762765016'#014'&'7676767677-    H  0 ‹!!88EE88!!!!88EE88!!B   $              ì       ,tE88!!!!88EE88!!!!88E+             #$ ÿà€ b%11&#&567676567454'4'&'&'5237670#&'&'&'#"672767673#&'&'&'2'"';2767673€WVVn  (@@DD6 ‰ W2-Y)d &<<>=) ¤   ( ‹'+ ÿà¿¡+;\p 7#53?3#5#'#53532+7276=6'&'"#"#15367632'"'&'#76=4'&#"32711001!01&&'67!009!674'&'!Z$$B / .D  +#:" -8  þ|„þ|„ þ||ŠŠIAŠ]][[Š #IŠ0rY5 rŠ,&   #  $  þ€ „ þ|€  ÿÐó°iz%4'1&'&'&'&'&'&'&'&'"#41"1"#"##01223;2363676767676767676767674507015&5'"'1&#"#536ò        ¡ II 3Ö         % ^¿ &ÿàÀ ?o!!6767&'&'1''&?6'&7676'&'&0'"'&76'&711'&'&23'&'&'&767676aþþ(())2''&        %        % ''&   (þþ(((þÄ%     ('%Ð      '(%%   ÿàÀ -1676767676'&'71'&'&7676À>??>F/.W>?>?F/.WP+,==&',+=='&   11G*&'W  11G*&'Wè=&&*+==&&+*=ÿÀÀ5:FKP%11&'&'&'676767#&'1&'1&'676767%'7#'#7'7/'7'7""::GG::""""::GG::"" 32?>3223>>32þÁW%W%n/213D EDP77ÀG::""""::GG::""""::G>3223>>3223>ƒ%W%W©^ddk uDE+77 ÿÁÀ#,5>GP|ëô7'&7676'&6'&7&76'%6'&76'&776'&7&76/76'&1''#'&'&'&'&767&7676766&'1&'&767676'&'&#"1"1'&'&'&'01&'&'&776767676767676767636576'&c     V   z    ¿    u   '  P      !!"!)10-5((F                "   H  Ï  Ë   «   :  œ  8   J    ‹"$$# %##37 K     %%       \  ÿàÀ I^t15&'1067454=6767672767#&'&'"632767675#&'&'7!!6767&'&'1#!"'&54763!2Ê        ¶þÀ@ þÀ @ (À  š`  xþÀ@þ€ @ þÀÿÀ¨À5G\%'&57'6'&'&'"'6?''&'&?672'67167&'&'&'1&'1&7'7'#¨  ))(-''"/L+3D"!"!  :j A³)( ))9:4'Àz&?+'!'&( V. = B šþ$$"'(7C))'(ÿð€-]˜%5'03670167676701010145&54?6767673176767676'&'&'&'&'&'&'&#"#"##0#&&'1&'"'&/&'&'""2176767676'B3 !!+2&' ]  (( !",/%$™  9"##$,-<;-.  ÄB ! +1&&  "x  $%00%$  ++9;//  J  ÿà Nl“£º!"3!27654'&#&1'0#&'&767676'&'&'&'&'&'&7676767676'1'1&#!"'&54762323236"'&'&'&767676501&76232361#1&'&7676"#1"'1&'6767676#âþ;ÅþÐ    >? ../ % þuÆÇ  *,+ (4þÚ   þz„¼    )   0  Þ  TþÝ  D31 Gè#23 #ÿà)71'&767676%1'&'36767674' ()* '()* '_:KJ:% +*6&56>L=>$$Ó70/76//79^)(21#"-%$>>M ÿÀÀP11276/&'&'&'67673'&'&'&'&76776'&'&'&27765&'#G99#""!::HB9 '-X:::;WÐv6$+'&%8?,+)(=2&š öÀ!"99FH::##<;YV::þh'$,&8%%((?=**ˆì ÿà° BS"17676726767232323236'6'&'&'&745&7676767ð/01(  *),) -22)( 6%+*  /.d2 /& !!"   "&  ##  )=%%þ¤    1€NN^fko¬¶ÌÐ%777'7??'7'&767672?6?77?7?''&76?6276777'7/???41676763?6'7?7''7''%67676'&76767?&'&#7'€###"@ /  ]Õ  þ÷  ' A$$%%7 K :(~,   8 ‡ª( 9 & ' +"% (&9m  "?  ÊÒqsvPS†xx$&  uoV\F  G<!-&(Kzfh?B)    +.O,-+#'%'  *(?BR#     &'ÿÈø¸!9Tf763#&'6737'&76'&?673#'&'&'&76711676767&'&'&'1&'&'6767 W?¹4B O ©5   $ZE88!!!!88EE88!!!!88EØ==\[>===\[>=G — s$ Ú" >" ." ? !!88EE88!!!!88EE88!!ø[>===\[>===\ÿàÀ 6N!!6767&'&''&?67#&'6737'&767633#'&'&'&7673þ   `  þï ‹¶3A  V>b    4  þ   ` þŸ "6r#  • " &%!7 W€'ASmœ¥¿721156#&#4766#7#'7&'6&?3367632''##54'1&&3276573167632''##54'1&&32765747632#017'3''&?456&373362#45016"#5*&&.'++N&  'Q  :&  'Q  5 ! L& $' L&7'# 'Ñ   L'%0  _     F©==     F©=$   ) .   Dwÿõ@‹5>%654'&'&67676'&'&767673773'673'67''7:+,Rcml[O\8984sH—¾2+ /!d=*D"e"#ˆ!-fI¼!#"fO‹=72$$ 3*ABPãþâ))." =+(63"%5 GnQ)5 | ÿú€†#8%%5%7&'&#"3676637&'&#'671617&'&'67€þÀþÀ@@Â/--67,-GQR9Ý 5!.="yCMNHH31)ABOOAA*ø6ÈÈ6ÈÈH+*8 G. /‚4  E>%$$$?ÿà 4!!67676'&''/767/?6760ÅþÈ989: s)4:E g  _ þÌ4þ¥n @ =0dq  w€€6JŠÚð 71#01'&'#'&5&76656'&0#&'0#&56767676671676'45&#&7"/&5&70103237476;67476;604#"'&501'01'#"'1&'&'563676743676'&'&'&'"'&'47672#&'&'&01'"11#'&'&766767&11"1&76761676'´  & % ' V   « 2 $!!%  !!    !    )6EECXRQB“ª~s   !$$   õ   "   E    ¥ $$S ‰‰      i'<S0!  ##  ÿàÀ 0E!"3!27654'&#1#"'&'##53367632'+'&=47632 þ€ € @C @@C@. .  þ€ € þÿ& #èK %#  ÿÈø¸Yiy%11&'&'&'676767'6'1&'7'&'7'&'1'2330#"''"'&'777676'&'67'1&'137'1&'1&'73ø!!88EE88!!!!88EE88!!Ž   %     #   # > ÀE88!!!!88EE88!!!!88E# -+,-  3H -,-- #W< X6 ÿÚðÀ(:Ef67161'&#"'&7716'&'&76'&76716'&7'5&'6711#"'&747&#77675&'"N1==>=2 BTTA cU)) ,+A”].. ((P>  G @? $#--#$},/ >: þ] JIV@==..!QQ`SFG OH H   A<G44G s $0<HT1#737#3676'6'&'#367654'&'3#367654'&'7#3676'6'&'#3676'4'&'#367654'&'¦)GD ~DF' ËDF) ´DG' ½DF' DF) ½DF* KY (Y ƒY Y 6Y ŠY 6Y ÿàÀ /h76316323"#"'&'&7&1223?6'01&'&##"#"#"'"'&'&'&'&5&545454747672723233'&'&'"'"'&74'&'&#"'"336367676565&5¢>'  0   'ß, $$PM$$   (22AA22 U     * ü  _ ‚,   $$QP$$ '  $$RV)(º- $.ÿàÀ 4Le%&'&#&'&'&7&'&'&'"'"2327676765654'%6716323##"'&'&7'&'&'&76763016¿ (%  2C " 0011 /# þ¾ #    + ÀM2  ?@  á 2) I;I &$% #"!!@ È  ÿàÀ  "',16;@EJOT35##53735##53735##5335##53735##53735##5335##53735##53735#€€xpp(€€xpp(€€xppþH€€xpp(€€xpp(€€xppþH€€xpp(€€xpp(€€ €€xppx€€xppx€€xpp(€€xppx€€xppx€€xpp(€€xppx€€xppx€€ÿÈø¸*;%1'&'&7676&'1&'1&767676'76'1&'1&'767IVJ78 %%8SPP56##<>HA22%>>[J;;!!´ #17$%'%   LT  >3223>>3223>D----DD----D& %&7 +  Xp  ê23>>3223>>32þ€--DD----DD--ÿÀÀ"%#'57327167654'&'&&3ä8ää9ãÿ%  %%  %Ü9ãä8ää¢ $$  $$ h€/jw„‘ž71732767676'&'&'&'&"1#"'5#"31'&'&7&'&'&'&7676&'&'676676''&/#&'5673'&'5673#75673#&'#&'5673•'(<(56'4#" 8!"%%+ / 1ã6$% )* %%$   ø((v    žp    4!&+0,,, + ( "      $$ !!" "& (h(((    ]    €€ 2Ye£7&'1&+36?3+3676'32?#"374+&54?#311#&54;6?#36?6'&'%#"276?6'1#32?332?6'&'&?6;2+32?6'&+36?Ò% #    œ (%  ÷N: # 09 L$ ì0   b! 5 / C ä  ‚ `   )# 4 "… c#b@ (!J   (  ÿà€ 7!13/3?'9'?#'3##þ€9so bc156¦p{ò þt44ŒP/2’J&=.//ÿȯ¸)%1#&'&'6767267&'&#2767&'X,,C"//7E88!!!!88E7//"CŽ,,O'&!!88EE88!!&'NÿÀ*¿<œå\&76767676&'&'&''&76'&'&"201"01&'&7&'&"7676727#0#0#767476725010'012410767672323#00#057676076767650#0'&'1&'1&'010#"'&7676767&4747656'670101&7767676'7&'"'67676'&'&'"'#&'&'&'&'&#"#"'&'45&'&#"#&'01232&7677676767'6017676'&'%&'6&7&5&5&'&5&76741671&'&'&5&76767056'&'&#"#676'&2767633763'67'676'&'&67&'&'"'67&247676'&'&01"#67676'7&'S " 9       Õ( , % ë   $% %))¬          !   þz               #  ] )  :#    $ {  . + )"° !$1 $  &/         %!  ¬                       €%9Kav3#5'&'4767651327654'&''3#5'&'4767651327654'&'%21#!"'&54763!5!!6767&'&'~44) @   33* A   D þ€ €þ€€8ð4 h¢  ¢ð4 h¢  Ê ÿ  ÿÿÀàÀ#V^727676'4'&'&'3#"#727167#3'##&'&'&7&#'&'&75476;0363274'36'&Î  O&È ¯w+J!   [R T6 …@  @&  %¨ à©7     +Õ ! 8ÿÈø¸-335#'35%&'1&'&367676967676'5#31WJJ>>•)*8VJJ..`//7 ''4S>?ì__"J===ª8)*?>S4'' 6//`..JJVç__ÿàe HZl&1&'"&&'&#02767054#&'&543676332720"3367456'&'1&547673&'1&'6767 :>CC>:8CP IKLH ODfþÑÄz   UTSR1 !! 1½‘þôÿàÀ 211013676767&'&'&'"'7&56767â>33â>2222>Q$%66%$$%6 22="",,!!33=>23þ  K"6%$$%66%$ÿÀÀ#5+325&+32=#ŽŽŽ^r__½½Ó` ŒŒ ‚dQTþÂ~ ÿà€  <AFKP%#535#35#35'#353#35&'1&&/!327677676747'%#353#353#35'#35^BBBBNBBœBBNBB $ #þM 8nwTT) þBBNBBNBBNBBÔ;;Ì==‘;;H<<<<01@ !239[?EÿÈ߸ )2Ëã÷67162&'"5617165&'&"67&'#67&''1&'01323721&5676676632'"1''#"''&57"#&5473&''&7676767&5&'7676363676367&7676676222'%4'1&&767676'&'1&'&3276?&'1e"1&76767676'9   É   ÏŸ>h00    D0    ,_   5  =# þñ " 4   ˆ    j£ h        _    $    *   £   :T    ÿõ€Š(#3&'6713&'&'79!67673WWdL@î#ª$ç1þ‹!!J3&%` QŠþkQ„tL %% @bU67*0.#•ÿÀ)À%7#5476735"'&#"#335Y (7! QQd ]<O =F]ààÿÉø¸#>176767676767&'&'/&'&?676?6lEF%  NIH//EEk•I  : OI  : O¸BCj6-.!  ;;XjCB¹t  ,< t  ,; ÿÀ€À '###535353##3535##3535353535!€@€À¦€Z€¦À€Z@þ€€€€þ€€€€€&€€€šÀZ@¦þ€€€€ÿÝ€*=M73#3#572'5&#535664'&#"3#572=&/73''7'73733r]M;³ &i%E   ! n *+ & &à3ž"# œ3c-  þý" ” (Ð"[-  -% &&!ÿÈø¸ ð`7#3675&'3#36=&'7&'&'&'&'"'&'&#"00111011111001201010003211132010201010110000111011010101212322123032320321232303212230303232323012323232321212321230363230323212363032303216321230367670121474707014707412547250503474341056701016565070147416141654374705257074147056567470105416565434505434541470541474145650141705056501054145654501450505505250545454545&'5&'&&'&'&'54733547335473356235&'632632327632#"'&#"2363567335673356;2Ðv„*44),))12))- ((    Ó4444}   ?Q'  )Q?þü L L GZ 1ÿã¿œ"C6716716'&'&'&7'&'1&67'&'&'&7667&'67674'0   0)   -6\====\[==`    1j  =<\\<==<\:0 ÿÅH»~‡&5676767&'&'&567&'6767675&'&'&'"#&'&'67676'&5&'&'476'&576767674'&'67&'676 @Ac Q43""9  3'&>  >&'3  9""34Q cA@ $%>?M M?>%$ÈŒJ  ,1hHH|h@@XE88  32?G77\  %  &&  &&  %  \76G@23  88FW@@h{HHg2,  06N@?''’’''?@N60ž/ÿà %0%##&'&'676727&'2767&'&/#35&'&#D &48&%%&86(>A[>2221?0+,$ ( jv4%€##&&99&&'?A23>>32*qY)1ÿàÀ *l1"'&'&767627!&'&'6767!5145145#"'01&'&'76747010301'&'401#76765,  #”þ°Pv' 3- !!%$$% -#gþ°Pá/0Z($;+  "  'ÿÁcÀ>T73230127676'654/'&'&76767353501'&'&'&1727676'&'&#+ 3)(3 $FN-. ('<. ,8787 ’)""*# 6-3 1!"A,-Y$"6 =‰HH<+, .n !E.)) **,6 !ÿà  %3#!7! 'S¤¢£¡‰Q6QþÊ0šQœS…þåþðŽÿÀçÀ %'% '7654'%'EÜ<þêþÿ©;AA<þ‘<ÜÖÝ¡<ê þF â"@A#  þï¡<Ý ÿÈ@¸3i747167167167&'&'6'4'&'&'&'&'&57&'1&'1&'327676701270367674'q/  Í      “$  $%-$# '!    ""' ÿÀ~À)4`l~<Q`u„#4;NUfvˆ1921677476567'&'&17'&'&71101&'&767767650765&'167&'&50171'&'67#"327676'&5&5476767276767&'&'0101&#&'&547676'&'ǂ#&74767637'4'&'"&'&76701&&'&7&'&545#1&'&'&#0201""&'"1676767676'&#63"#"&'&'6767&'6763%&'672&'&##&'&54'&'2&'10'&'&'6?6727676'&'&'&'&7676301'01&'&'67632017016767672453&'110101"#&'&'&'&+"6767"'676'&'&71473"'&'&'1&'&7673767677#6'&5&'2767'1676501#"'#"367676'&'=    Ž   >  † ½                     %++&  +    þç   ,       **      u    %.  o,v,Q L%       >      -      - çf                       $+  +$        (  ¯                      ‘  + 2  E  Ùæ ÿÀô¿->7#"'&/327'67676#&'01&3676?6701"'&56767"'676?#'"5676767&'&547676760#'41"5'"7'&70567621276767676727670147676326767610161474767632676760##3670767657'&'71#1"'1&'67672?64'#"'41367Ò"21!Ä       &%        0000æ#"--#" !1 =9 F  9PO ý}        O^          .  ˆ 1@<)ÿàÀ 0!!6767&'&'1010101#5'36767673þ   `  þ…ÚP%  #Q  þ   ` Å6eg™8   7›ÿÀÀÄ!!6767&'&'"#1"'1"#"#&547676507676'&5&'#1"'&#"##""#&7472767676=&'&'&76723322327630#3676'654545&'&'"1&7672223236327233»þt%   p        n    Àþrþk     =f    e> ÿÀéÀ411101#67676767673671653#676767j )b !*b<*b *b ÀA)(4A()5þÑ4A()5A)(ÿÀçÀGY%&#"327674'736767&'&'567&'&'&'&'&'65&'&'67&'1&'6767 '2  2!.7%%0  ' £Zì%9-!2  2%$82##>    = s£ÿàÀ \qƒ16767&'&''&76723670125454#'&'&7676327674'4747636767612#367675&'&'&'1&'6767àI0110IH1001HO    ( *ò,,ò,,yR7667RQ7667Qp01IH1001HI10ð   8(%  % B#/  ,ò,,ò,þd67QR7667RQ76ÿÜ€ ^%'&'&5&767676367016765&56#1'&'&76767276767654'454767636767612~ +  ,+++ !   N/B<)  "!N R/2  )((" {DGÿÀç¿^yí &4JQZ†œ¤ÆØì6NZh%&'1&'&'&'&'4767676'4'&'&'&'&!6767656"'"#"676767&'&45&767&'676'""'&76767674'&5676'67676&6'&'&'&'&&'&'&'&'67123&4'&567676&'6'47''61257674'1&76/&'1&732&'672#10141727167#71#&'&5&'&'05&76#4'#&'67677623476#7"1#67&'&'654'&67676716&&74763127&'&503'&'1&7'&771767676'&'&'&'&'&56'&'&7'&'1&'"&'&7&61&7676717'&''&'&'&'&'&3723ç !01(  ¦þç i" %    %$        Þ     h  ¨.8´ð      5   $S  ô  ¸  `      Ê, Ž\     4:;*       ‡]  É        +))      }  ! :&     %    I  @     F               / ÿÈð¸2X~&#"767676'&'1"'&'&'&'&767676323'&'1&767676'&&767601"'&'&'7&1'&301676767676'&##?6'&'z>D?88$$;;AA:9%$;4016 M( É* $@%%*2SSN9 --11¸    ª.“%9;AA:9%$;;AA:9%þ½2    V "  MHL.$99?7  ÿàÀ =!!1#&'&'7753&'7674'&/&'&'67676&#Àþ@ô"*c:"   (!   þ@Àþ£! @(  #  ÿàÀ &M!!6767&'&'1#&'&'7753&'7674'&/&'&'67676&#þ   `  œ"*c:"   (!    þ   ` þ£! @(  #  ÿɸ?[x‹›?7'&'"'&5676%6#"'&7&'&'01674'7%&767''&56762%1"'&'&'67&547672'&'&767673'67&'&'@<.Q.( 1;B4   c-    @þÅ . '-  i   ?2M.(1;B4)Ð<## --<<##('8; J ';A  *   ü08E4    6F,&h 0,;,&18E4  -  ?9h0((0((À]BB!!88EE88!!BB]d*/C .1MME>@A+ô +$)*',87/1(p((0((0ÿàÀ  3#5;#53#5;#5××é××é××é×× ××××é××××ÿøÀ€%767567676756767675!þ@€þ£ ï ¯ t   ÌÿÈð¸'6C11676767&'&'&'476327&#"547632&'547632øE88!!!!88EE88!!!!88EP0  x  x 0  ¸!!88EE88!!!!88EE88!!þ   à Ö Ö: à þðÿÈð¸%%3&'&'357%57365&'&'&'3`l!78DD87!lhhþøŸ¡K !!88EE88!! K@7  7€ii€0ПŸÐ&*E88!!!!88E*&ÿÉð &DXo‚%&'3767#"'&'5632'6312&#"&/327675654'5&'&&'2316367676545"'&'1122301&'&"#&'&01327014'*d,'01@@11',33+Ñ3@@2 -11- Y,, ;;JJ;: ,,*8887+×3‡3©'%J È ¡R))))R¡ :.-F01\--.-Z01E..þý  )7 ) {  ÿÄÀ¼Cy"/&76767676?6=4/&7675473"'&/&=4?6#74'1&'&'&7&7672;2765&'"'&'&+"67à >  /¹¸¸2 5 0¹¹¹ •+)   WR&, 9$ ;Z<%kÕjjÖ  ÒÒ8 Õ k k Ö kÒ  A:   >@@  *%#53%!#5#5!#353353#35353#35335335  þà€ @þ`€@  €@@àÀ@  @@€À À €``€  €€````€ >€B+UˆŒ¤®¸Â735#3=&'&13167#&'&'#1;276=#767##"'&'5#5676354'&'&#"3%275&'01&/67=&'&'&'&'56335#&'6?'&'675'632#"'#"'5632'#3135#h5 O&%!#01"" !  !!  ¢ (%   )&  ¶`  #" $%I/î;?³   %%0#""#0%% %$ -     qD    4  :  Z)^‡ÿȸ0I[m‘£µÇÙëý!361147676'476767&4'&'&'2'&'&'#"'&'&74767674'1&#"3276=4'1&#"3276=4'1&#"67654'1&#"3276=4'1&#"3276=4'1&#"67654'1&#"3276=4'1&#"3276=4'1&#"67654'1&#"3276=4'1&#"3276=4'1&#"67657&51&'&'67X  *#!%8! ,,00,, ! @``@ þè      H      H      H       =SS= B^^B¸8   * ,>þÄJ: :J%!"/0"!%h   B   B   „   B   B   „   B   B   „   B   B   (  ÿÈð¸ (1>HQh&'1&'1&'67676723=367#75356'7#'35##5##5##56'3=5'575'#353&'&7'676'øE88!!!!88EþõΕ•`F)o9  sD)*ˆE EEEE$   8!!88EE88!!þˆpÕÕ ]?Š 6  480M<=Np0!!0¹ g E  ÿà8  D|%&'1&676703167"'&567674766'1'&'&54765'13!76?37676'&'#&'&'#54'&'#&#"#& à , 8&'  ¶! A V  þ" <<)H  ##  5("!<( 2211 UÙÙ #ÿʵ%1&'&'67673#44NN4444NN44þZZýN4444NN4554NþÍëþÿÀ®À5P&'676767676767&'&'1&'1&'67671&'&'&716767&'6rÌœf ) 0ŽÿàÀ ':!!6767&'&'#5673#"#"#5673aþþ))))Ð š8 °8  š )þþ)))©8š  H 8š ÿÈð¸…11676767&'&'&'#"#"#"#"#"'&'&'&767676767632370176763232327676767632323676#"#"#"76767632323232øE88!!!!88EE88!!!!88E«  DE          ; ¸!!88EE88!!!!88EE88!!Ÿ34   #" .. 1     ÿàÀ (KUfw#&'&'567673'&#"#'#35676327#"'&'365654'&'&'&#"32767/#67632327654'&#"327654'&#"@À6$%%$6À6$%%$6  $  t S " 3 P     %$6À6$%%$6À6$%Ï ‹Z"h  %"G   d  ÿÈð¸ 59%6716/&'&717676%6767674'&'&''" &¼Æ ZABÞ4 $ ]Ü 0þá8GE88!!!!88EÓ&%ª ' 6b944T@ .%)! " %P"!!88EE88!!þƒ„I;ÿÀ>À#5j†%"1327654'&+"1327654'"1327674'&'&'&#"&'&7673276767654'"'65676'&'6767   n  Ý   ™)(327$$2))33))2$$732()þù-,3ABccBAABcß       8$ 4BB4 $)..)ñ  8,(8@****@@+*ÿÈð¸611676767&'&'&'#'&7673'#7632#"##"1øE88!!!!88EE88!!!!88EZp KTUZ”  ž e¸!!88EE88!!!!88EE88!!þ\„cc­ ¹wÿìÀw "',16;@EJO'7'7'7''7'7''77'77'77'7'77'7/77'7'?'_7JNaŸ."7A %  " <& )#.'UF7(T*3)=5P"3CBY,".',)$#$X##TJ " !- & %; / 1@ )*r@ DŒ96ç_ l--_W OVB?ÿÔÌ PY577'&'&'6767'&'&'&'&'&'&'&/?67654'&'5'&'67ÝD66DT%;&%'&;8  &,$,@**   >t¿ƒÒ`5 #(6 ,+>>,+ þA  1 &*4,,B3'  ð€711!67676'73&'&'&'X+AA98þx3%&/ 0+11'(`FEPP6è23A&%341˜8N"#22@mST22ÿàÀ %'67&'&'677%&'1&'6767À“//FG////G<-’þç7$$$$76$$$$6•+8H/00/HH/0%”v$%77%%%%77%$ÿภV7&71676'&'?&'&'&'01'&'7767676'&'&'&'&56766@;CEVV?;C *@?@A0Õ' )  (  8FUV?<BEVV?2Ô) '  *(   ÿ¿·À!E%'&716/&0?6'7'&'&?176/&1/&?6?6'ª:DT^˜-ÑÆ ÒÎ+«29_\¡-›§,ARJ”"Ĥ}΢*¥'7\HŸ$À€.K]1&'&54763231&'&/5676767&'1&#"#"'&'&'676?&'1&#"6767Œ4 1m!:aG 01 õ  &Ð!  !0 O!k'f0  1¹  ¹!!  ÿÀ@À %"3'&'1&'1&'&'&'&567676'"#&'&76'"'&'&'&'&03207676567276'4'&'&'&'&'&5&'&7676767676767633632765672327&'&'&'&'&7676767676747676767676767676301667676545&'&'2 6          øN          )                   ÿÀíÀ:6767672237??7'7''''/'7'?à'8P  C]8Y8}­R¦sfý|1.Ã+l &  ,ND% '$J .3E6 {l&Jc&Tz8a %   E€`'Q`lt€ˆŸ¾ÇÕ%1"'236767&'%671672&#&'167&'&'&'672354'&##&'&5017#"'5#675#35367&'#3753#35367&'#3753#;2=#+"=4+323;2=#+"=35#53354+373535#37353735#'#€DEg&" gEE2.ý°EEg "%gED-2<      y "'  9'  9 & ?'4;¹1! $$6-!#6$$!!2!-(     J7777VH++H+" >=    @LÿàÀ 5!"3!27654'&#'1&'33675&'##6767žþ„ | °:**^DD^&%66%&""9  þ„ | þ™""9D6""""69**ÿÀ¼À '575'7/7¼âÚX…ˆeWe‡UYVX@ÿ€€Ö-uKK—:5:O17/5ÿà€  $(,048?CGKOVZ^gpz~67#'5#345#3&/#3&/#35#35#3#3#35#3#3367#735#35#535#535367!35#35#!67!736767#73014=#535#ÀEþe  s™É  %  R  ÿÀrÀ=eˆ111'&'&'&?6?676767674567036=4360"'1"27676'&'45&'"'"'076'&303'&'&'&'&'&'&'&767676'‘ ”  •  1«  †•   •  Ž> !!ÐÐ  1   þÐ ; ÐÿÃâ¥3L·ÅÒßì%1#"'&'&'6767632!1327676'6'&'&#""'&=6'273221+&'&+654'&54?'77;1654/&547416167;5&'73'&'73'&'7;27676=4'27+'&5123'7&'&547#&'&547&'&547â 99?@89  99?@98 þ734::4334::43  ÛQ       fc W´B77! "77AA77" "77A<2332<<2332**   $$5  0,('H&% ‹ *&,/#"39&%    !  Ž  8e"..((4   8`=>í.   !%&T/  65QQ!+ !%=! %$Bb 9        ÿàÀ :!"3!27654'&##"'&'&'&#"'67676767676'&6“þš f @B.  %  C2  þš f •/RV45 8a. N@`€,Xˆ7&'1&7'&'&73067610176767301#!&'1&7101'&'&730676#767673#'1101#&'&/0'&'101#&76701747673i 8! $ $ !8 #‹ 8! $ % !7 #¢ 8! % % 8 $` p KK p  p KK p   p KK p ÿàÀ Xm€1716767&'&#1'&'&'&'05&'&'67670563230167676762!!6767&'&'"'7&56767à8%% 2$8&&''6N    bþ   `  °)#T--CA/.-.CE%&8& 0 %%87&'¼      þ   ` þƒR%+C-,..BC-,ÿàÀ 0BŽ5/7''7'/#''773?7'77'?"'1&'67632#''#/'7''7/5?'77'7?3/2767;?3?/À        wH/7'6'' * $%7&66'5%$ *  $-&           -( #&4(66'2#&)'$4'4. '-$ ÿÈø¸"+kw11676767&'&'&'47&'&'"'7#6765&'"#"''676'4'"#"#6767&1"#'76'4'E88!!!!88EE88!!!!88Eßk9""ß!CD#'    "0R  10;Y> PQD3¸!!88EE88!!!!88EE88!!ø1*þÜ55Cß Â» G_’ñ.9 ))JðþÖÅ/! 0;>32ÿÈø·!Df}%1'&'&'&547676763'&'1&'1&'&'&7676767&'1&'"767676767654'%2113276762&'&7r!;3*µ    27 "$$ þ™, 1>=>!‚)   !  %%.® !!! & 33>?<#")881!   ¤  ÿÀþÀ7#7&'&5676;#5##&735™W@`"+*?R7..#%„ÄÒ""9P)(þÄ ?=ßÿÀ.À 533#‚o7R^4y3@¦*æþ¤¤<€C<JRnyŽ#4767"1&'&'3676736767676501&'&'676703&'35367654'&'#3#5673354'&#"367237&'6?#716?##'#'"'23u            d*I#))#£&5 " f 5#$3!      %ÃB&%M«a  &  J •ssŽ ÿá@¡%._n†˜%#536757!&'&'6767!276509&'1&'476721&'&#"&'&'6763236765017&'1&+3532767&'"3672671357##'#'"#23?.0â þ   à þ@  <      ˆ 3 Z& %  f$ %æ7?  Êþ   `  v  K 6 ˆ/  DQQc"hÿÀcÀAN`7100&'&7676741672&'&#3325276767676'&'&'1&'&767677167676'&'Æ !  †&)$)#"!! ‘Ž#$! B     i$""5)++&'%%()#þã(44-þº¬,/.!(55.$%%/.,ÿü€ƒ;fox—¿Øë#8<@"/&3676?2=4/&=4;2#/&'56?6#74'&'&5&76;2165&#3#"54+"32?&'67#&'67#&54+#536#01201'4#32'%4/&+"?6=4?63276=%/&=4?6756&1'"#"3?0=36=4/&?6/&=4?6?"32172=4#'0#54/&?6745'13#'3<::9 :::/ 7    þñ>=$%P===%-Ò===%>$M    þ==>=KM !B!!B  BB B!!B!B  2      $$_,  ,_h±$$G$ ^   $$G##  ,G##G##|‚ÿÑ÷°3e7671676'&'&7676'&'&'&'&'&'&'45717676'&7676767676'&'&'&<¡NxN¥())Tj ¨žþ2¨ Ÿ°þ QQàþª‚‚/9 / 86€I.Z•ÁÛá%471656#36'#3'4'&5&7675&'&7&'1&'4327&'""'36765&'&''5#&735#745654'5654'45&367''017&'1&'4327&'""'36765&'&/1327'#'305674'&'63#e**j$     þ™K*)  è$      ›"!_!9å 0 "" 0        ;²0  0 "" –";      E'' $ !BÿЀ°<Tk€‹%?"&'&'4'&767616'&'"&'&5&767654'&'1105019&7676765016'&"654'0#&14#&'&'&54767676'&'&01727676'&'&#767674'05016767677676761"67670769676767101017676765&'45676765012767674'6767676'&'1'&767676767616307711#&'&767676'47012767670017&767.ù      :K44 $#3 *0 89E)'($              ')  ,þS  †o V  EW           #*)++ "      $        ‘ .!\  5  À€#'##373 eM80°àà[þÓ5sr6¨¨€YYþ€€ ÇÇþß!ÿà°  73'77#'##ºL&&&Ð °° N1n0‚´[[ìJþìbbþôBB$ X€(  Efêñ7'##7#'3''373753#7#5#53##"'&'&'&5476767276323#4'&'&'&#"32767676757656574101&''33'373""01''67&'53274'5#35335#51#35335#5276?#35335#5727&'5767&/7#'#k4>>-'q>-->QÑ)d)¯          _YóAA >? @@óY   P   &&   P   ɤ**„„c++g„``„€€ttt 3       a  )ƒƒ)               X++((€€r-=Rf|%"101#&54701454'&##456'&#'&5276765&'&001676'4'&676'&'&101"&56567656'&01'67674'"01'676'&#&1"""'&10127676'&&"#'&1376?7676760133767676701376767677676101765"76?37670107656716"101%4716716676701#1&'0547620127051476012#01€                   +  ý¾     T  Á      %%!       #    #      :  |  ‹   ÿÀpÀ 7#37#33#33#35B22e33e33d22}Cþ½÷þL´þL´÷÷ S€(  L[¶¾Í7&'7'%67165&#"35#35&'1&&3012767676'45456'&'1#"'&=66'&'1&&&'015&&35&'&'55476754'&'532767676'45456'&'%&'&761#"'&=66‘&98'-™  ::J::    'k9-) *: "       þö"*Æ`  s  xnnÃ1     H)    *  'J 1 ^ 6    1?(‡)  ÿÀxÀ 3731'#7ž—Y>>Y,-DqoÀþÜttXXÜÜ <€D $Gai{‰675#"'535#'#356365&77425&#"#&'7767&'&'&'4'1&'3675#'&'365'671632''#?2767&'&#&/63235#¥+   ""Y&,  \,,þÓS !  VX Ÿ ',   ,,/ Ž "?& ™g ) H % D  *   (    "#"( !  A Í 3 *'{B  !™ ÿÀuÀ0625&#&'&'32767&'&'&'&'&'›/!&%"GGX44 !$*)%KQZ76"!!%! †**L/   &'M4 ÿภ!7471676767'01&'&'&'7&1676765&'&³622 )(& ! {  ()7r (8877%%'&=32>>%.#..##*)+ q/fÐía76767676"+"#&'&'&'&'4'"5414'&+&0236745415767656'&'&#&#"#01&762'&'&5454545457"9""#76367600#01&'&76743323274=4'&'&'"#&#"#'&'&76762&'&'&323672767676767656='&'&'&'&#"#"#&#"#&376767656#"#"#"01&5 =B /0TO /5%&)'QAž  "  /  Í     #    „   $#"{ !  :  ÒI* *  j €    {65HI  YZdÿà@ 3HŽÝK{74514=436'&'&576725454545454#&#&'&%!&'&'6767!#&#"#&37676767674#"#"#"04501&'&'&'&#"#"76743323254=4'&'&'"#&+0#0#76367621010#&'&'3232745015203767656'&'"'"+0#"41014'45&+&&'&'&'&'&'&32321213030367676701676'7&'&'&32376201367436767670145} › ( þ   à Ï              ‹BG((83 6D # ,' 2 ö $     ˆþ   `  &'?> T f  Y  c¯< è 0    ÿÀ8À %''78˜˜˜˜˜˜˜˜˜»]]þûz\ÝÝ\ÿྞ$!!6767&'&'373#5'#53#ƒþ¹GþÔ`>oQ¼¢B`ÀXvžþ¹GWtt„„þðrrƒƒÿÁÿ¾$).711676767&'&'&'7#5;#5#533#5""9:GH9:"""":9HG:9""À++*€€€€€€€€ÀG:9""""9:GG99""""99GjÕÕ++U++U++ÿàÀ L75%!&'&'6767!4'1&'&'&'&'"#"#0123236767676765»__ þ   ` *!""!!""!ö66lzþ   `  °ÿàÀ  !!###!Àþ@fYZY  þ@À³ZY Yw 2e¢4+";25'&#"54#";2="1&7670132=4'&/&7676754#&#"01#&'&3270327676'%&1132=36767&'&'"'&56767'"1327654'&#ü))_$))""Þ : '  5!%þý)!//”   "É¿ Qþéˆ  {ˆ#n  -  " € )¸Y/.«ø  €h5EVsƒ”211&'&'&'6767635"113276767&'&'&#1'1"#723637232767676'&+73232#67676'&"##71'1"#723637232767676'&+@WDD(''(DDWWDD(''(DDWYHI*++*IHYYHI*++*IHYf y%  G!º%  %%!Þ y%  G!W"#((#""#((#"&&//&&&&//&&›Gl,¨Õ,& `¨jGl,¨ ÿÉõ¸/1G#&'&'&547676765&'&'&'27&'&'97"1767654'&#:+$%%$+I-- !77DE77!  !77E##N )%&)*&%33H-4E77!  !77ED77!  © )ÿï@‘(5BO\iv#"&'&+";27676;27675&'&#+"=4;25#&=4;25#&=4;2+"=4735+"=4;25#&=4;2‹% %Œ  ZK  KZ  þâ¡¡¡¡¡¡      ‘$$ õ && õ þ÷==z==ÿÀ|À"=^q¢¸Ê%67165101#"'&7676301&767'&'1&'1&7676'709"11127676'&'&'&767676'&6761'&'&7676&7676/117&''&767#1"'01767672'1'&7677&'$"! "%%>=3V -2  %s   4>    ./;;9:    #gRQ''à%005 ´=?@-*066'' 3+,)76? ‡  &)*!° $ þò  >   )  a   Œ  ÿÙ€§Y11&6'0167676212'&&'&7437676762676676767676701€3  G559 ,144X5 =56051717335 !&§#   $ `   h,+  %$*/ÿÈð¸4F%##5#5476;2'432#"5711&'&'&'67676716767&'&';Mff#""##G88 #"88BD88"! 88HZ889:VQ<;99Wþfxxf?##""{!!78FJ87! 88FC88""-;;RU:976]W99ÿÈð¸Bf11&'&'&'67676767676701'#5"'7374'"'&'&'&'7&1676353&654'&#øF88! #"88BD88"! 88HÀ :9V=''])"" -,`À/0-_" " ;;U¸ !78GJ87!!88EC88""µ$U:9) &&" +‰=+ ''!  9V:<ÿÈð¸FJl11676767&'&'&'&'1&'47#3#3367'#"'&'31'#31735#'6767&''6767621'øI87 !!88EB88#" !78GV9: A ##,*  [€'&;MG '<$Q $# W99ˆ¸""88CE88!!78JF88! þ=9:U# 2. 8¿  / ) %.99W<ÿÈð¸9>T11676767&'&'&'&'1&'47#3#3353517#5775#7#/#'6767'øI87 !!88EB88#" 88GV9: :@@=AQ&&9X:7&?B+(BR+*DW99e¸""88CE88!!78JF88! þ=9:U 8' '88$$Š3t` V3$#99W -ÿÈð¸,1611&'&'&'67676716767&'&'#53#53øG88 #"88BD88"! 88HZ889:VQ<;99W^´´´´¸!!78FJ87! 88FC88""-;;RU:976]W99++P**ÿÈð¸Ea11676767&'&'&'&'1&'1&732767'&'&517'6767&'&#'6767"101øE88!!!!88EE88!!!!88EG23O$  K,4..:Âà(GK,,5V98¸!!88EE88!!!!88EE88!!þ>''==B#1 ,! /–d*1!*89VÿÈð¸,8DPX11676767&'&'&'&'1&'6767#3767&'&#53036'#353676'4##53øH88 !"88DB88"# 88GV:988ZW99;4 221¸!!78FJ87! 88FC88""-;;RU:976]W99¨)2((9./(,11ÿÈð¸,©11&'&'&'67676716767&'&'6176714747276;##&/'41'&''05'&'"/5'0145''&/"#53767670167476327014767øG88 #"88BD88"! 88HZ889:VQ<;99W   :3       4- ¸!!78FJ87! 88FC88""-;;RU:976]W995l<   :@ a , ]  7H  ?_  W  Y9 Lb  E\PbÿÈð¸,€™11&'&'&'67676716767&'&''&#"'&"'&#"'&#"'&#"'&'&#32732?32?32?32?32??35##&=#&'6;54732øG88 #"88BD88"! 88HZ889:VQ<;99Wk      +3      3;N¸!!78FJ87! 88FC88""-;;RU:976]W99Í ] 3E  -^ TC P9 Z I +N FI QH :@ S,ÿÈð¸,AJO11&'&'&'67676716767&'&'#&'5#&'56733356735#7#35øG88 #"88BD88"! 88HZ889:VQ<;99We  ‡ 6  ‰ 6½) 7l°ll¸!!78FJ87! 88FC88""-;;RU:976]W99„ ¶  6 ·  6se (›XœœÿÈð¸,>JV11&'&'&'67676716767&'&'1676'6'&'2&5&767"'&?øG88 #"88BD88"! 88HZ889:VQ<;99W<<<< 6) =¸!!78FJ87! 88FC88""-;;RU:976]W99<,,44,,,,44,,6d. j@€@>P[u}'#&"3676"#"65&'&#&5#3653676773&=4'37&'1&547677&'&5663354'&#2767#'&'7#676^77% ,"(A !  %'=$cþt  É3-þd€#*+!__mm "# 'P©   B t6Â|/. '$     ÿಠ`u˜¡%67&'7&'1&'&'6'&'&&767'&#&#&#"#50177676'&'76767674707765&'%''"'&?67601//&?''&'&?&'&'&567667&'p$      -   .-AA= #ÿ • #"Rh”  $011+!  >^];:D Ç8""á  Ý7,++,7I45 >= Kr#$)8&% EK *+Ð (&7IÿàÀ >fr!!'1&'&'"'23"#"#"#"#527276=4'&'"'576327"'1&=476314'&'"67#53#"'56301Àþ@           t  $& þ@Àþ²..m  %‡   -E""ÿÀ-À5Y¬01016767&'&'67636/7676'&'&'&27676'&''7676/76'&'&767676/&'&'05&'&7654'&'&21#'™1..'08:\23 KK_=;Ž&$=JMRSNJ=7$  $7=J NSRM¸!!88EE88!!!!88EE88!!þ 66CC66  66CC66 Ì12==2112==21þP;7$ $7>JMRRMJ>6# ÿÀ'À '?5'?7'?/`$##T33))P#$$T**33,,+yÆ::ÆÓ--/,,+Z--ÓÆ::Æ ÿÈð¸5<Dmt{‚‰˜&'1&'1&'676767"1132767654'&'&#7&'#1675'#3735677'6735#&'7'&'5#3&'!367'7&'#!67#5&'367'1øE88!!!!88EE88!!!!88EA4444AA4444A.%,989,$/  ;;RR;;  ;;RR;; ·"þ°"*"‹"þØ,9/$Þ$/9,8!!88EE88!!!!88EE88!!ß44AA4444AA44" !3R;;   ;;RR;;  ;;R%.9,,9/$9,$//$,9z""ÿãŸ4KŠœ®Àû6754767632&'&'5#''2676767363&''&7&''&7&'1"#&6767010132701016767675&'&"#&'&'51&'1&'&'6767"1327654'&#1#"'&54767"0163675676726501&#01"10101#"'010101"1&'&'ú         $@$        #(** *# #* **(#         s   Ÿ::RR::”   )&""&)    !    !`         C    ÿÞÀ¦Ž%6716'1&#6'&'&'&###015&''7'7&'&'&=5'75"'&'&'&7"'&'&767&'&'&7"'&'36767676'101- &# ????" #& .--LM--J>55 !+''@32##!!<++ 20 7./HG8999GG0.7 0$2 ++< !##23@&'+! 55>-$$$$-ÿÀ¤À¦Çê&5145656767454'454'4'&745&5476767676'01'&5&'&7674'&'&1"'&74767656767475'&'&/74545/05&'&54'4'"'&'&'41&?'&'&'&5&76767676676'4'45&5&#&'&'&'&'"1&'&'&/5'7676326767&#&'&76163276367633?3272?#&376767676767674767676#74'4'4'4'&'&5&76#'&'&'4'4'&'&54'&5476#4117'&'&767716'"'&'671'è               GW A 4 "! =Ò,+@         <                          '-      &    5) 345³(! # ÿÆð¶[¯úOŸë723123222333"####"'"'"#"'"#&'&'&'&'4#&'&'&'&'&'01&545&545&547454745474747676747676767676723632363236323"032323727272367236767676767676767676'4'45&'&'&'&'&'"#&#&6710"#&'&'&'&'&5&'4'&'&'4'4'&767676?1230#"'454545654545454545454545676767676765&'&'&'&'"'&'672330213676745054545454545456545454545454545454545450103747416767676323013236767676767'&'&'&#&'301"1"#"#"'&'&'&'&#&'676767'&'&'&'&'01&'&'2232323232721636016567456767654745656745454545454545&5&'&'&'&'"#0'4741676767096110#&5&'454'"#0#"#"#"#"#014163252767036345&#"1&'&#&#�270125476?2723323001""#001220001"#"#"#"#"1"#0#450=454565167222#"'&'&'&'&'&'05&'&'45&545&54765476767%1310#&'"'�'&'ì ( +    4  +   +   (!  '/  i       °      e      "      º    l      ¶'  2#  ,A  &   -<  #  1                ; 7778               &&-           ÿÉ·t}67162&6727676767676'450#&'7676767677676'4'45676''&'&'&'567676767#`#+*-,*$%B.5"*/'+"2 )L,15/.!QÿàÀ "3D'7777'''6'777&#"''2#"'&54763"327654'&#F;FF;Fw [[ wF;FF;Fw [ [ wà2&$$&22&$$&2#### w [[ wF;FF;Fw [[ wF;FF;Fd$&22&$$&22&$$#### ÿÇð·5DR\fpz•£°ÉÓ11676767&'&'&'&'1&'1&'6767675##33535#53##5#'353#/7'7'7'7'7'7'7/11676767&'&'&'##5#'353#'1##6767&'1&'4733535#535/7'7øE88!!!!88EE88!!!!88EB54  45BB54  45B›Â›%v0TT’IS|¬‘O  4  œ  t  ”?4334??4334?_T4u(Æ’ .''Çž76H[<< ,s@TS‘0<<[E  ·!!88EE88!!!!88EE88!!þ 55AB5555BA55 I/R.ÅÄ/#-ÅÅP8E    ‡   Y  ¯33@?3333?@33¦3ÄÅ2R3™RA()þU<<[ 8ÅÄ?39P[<<à  ÿÀäÀ¦®·¼ÅÑÙâçðü7676767674767&7'''77656'&'6'4'&'&'&'&56767676'7''7//7/&'&'676'77777''&7'6767577?'677&'6705&'7&#&'65'16767&'7&''67&'0547'6367&571&'&'67  4      :l,! ,k:        4   O    ë       $$%#- "&"!#  $%/"#>']<&1xx1&<]'>##/%$  #!"&" -#%$$  _  2  J$.«  2  J$.ÿÁþÀ%Q€­7'&76&7676732323"'&'6'&'&73450567676767624'&'&6716'&'&&'&#23632767676'767165#'"'&'77676'&'&#L $ #$-J..l  ( "**81  --F,"# s) "++9   N 8++" *G   ./K,#"!"†  ) "#$+þý,,C-## %   ÿà³  +5?e¨¸ÓFm%66'&0976'&767201760156'6'1&?1674'09'&76'&#"276767674'2#%4'1&51&'676'&'&'"'&74'&'67&'&0'&'&#&376767654'&#&'1&'&76'&'&'&76767601""1"'6367676'&'&'&767654'&'&'&76763227256763"'4#&7676'&'&'7676/672100156767201003&0'05K 6   6Û  ,  !- ,,)* AB@AþÄ  &-- Aï  )##  '#   $$!˜  5$$ Ì   O    ! ..-. CA  0  r4   4Qe            Á   ÿÈð¸ ;775'511676767&'&'&''5''5''575757×!!!E88!!!!88EE88!!!!88E‘!"!";<<;îB!!B"¨!!88EE88!!!!88EE88!!þbA!!AA!!AW;X;LL;X;WÿÀrÀ%77&'6767&'7"1'6767&'&'&'1&'6767÷†O'(-22LK2323K9%%%%98%&&%8•§$ãþ±L1221LK12þÌ%&78&%%&78&%ÿà­ ;%1'&'&'&7676771&'&'&'&'67677'135" ‹"."-,CC,,)(=mmR6589UÒ­ -('#")C,,,,C?+,(??&99SV9:ÒÿÈ÷¸&E#&'&'&'676767#&#"74'&'&#0101017276'”BRE88!!!!88E_Gc=<((,4#c&#"&(! .0-1!!88EE88!!?'(L6"!Þ  6;ÿôŒ3Sh7?63232717654'&#"7&#"'1&1132?6'76'&#"'1&54717&#"1327'?632176'&#"1ºšw('õ('žþúšw('X('žišw''hžWšw''5žÿÄÀ¼!3;CRa6/&'567"#1"#353676'&''676'&'"#"#3533'1#5'1#5711676'&'11&'&767Ë¿¿¹k   Œ  *C á" ## #¸l Ù mm Ù \fe#f""T!&~5]"1&'&&&'&#767767676767654'&'&/#&/&5476337673767© & <= 'A $# (' "$ A ,- -,$~*  *! 4&;, 55 ,A(3 %s°#!uu!#¯ Œ‰‰Œ" C€<E^™110147676721'&#"'&'&2327676767676763237&0327676'5157&#"01'&'&'&'&#"0172767676760137'‰  s# (& #B    Bs  ¤S  SS S<  #…m00m… ø %' ø   ˜ — U|      |{      {ÿÈð¸411676767&'&'&'1&'&'&7667676øE88!!!!88EE88!!!!88E''44''  **  ¸!!88EE88!!!!88EE88!!þã22  ((  ÿÀèÀ3ƒ&'1&'1&'1&'6767676767654'&'&'1&56345474'45#'"#"#745656'5"'4767#3454'&32322Þ'&!! ! '''' ! !!&'¢P P@  $$--$$  $$--$$ þâ2/.X CG&' ÿÀ0À'76'&+"4+";2=7;270’ŒE„33nC6¶‡†2þmÿû€…!(!!67654'&'#5'#5373'3533RýÜ  $  ÿ>=>>>=>=ˆ\=>=… þÒ  . þÒxMMxÒMMÒliiÿÀäÀ $)#'#735737537#75'33#Ÿ_lVb(m{WaþCH×U4NþÄ4POIH(6SPߌHH@›\?â°q?þ2«þ35ùþÌ'Âþ;erÝ5ëþFºþÃ=µf5{/€QXg|À3735##'#53'#65345&'#67"03276765673#013767767476'05&'&'6736'&'1%67167&'&'&11017&'&'1"1"#1"#1"152767676'&#76363#3'"'"'136=367651«*1za Iv43X  4 B@  6 =œ –   ä  = +*67$  &†l  -z,ÚÚªª^)! ,  K2$A     ;  Ge d G ,I ÿàÀ AQ!!6767&'&'&'&'&7676765#535#53533#35&'&'16767&'zþÌ4#--/&&04>7H ²\nn3mmX &'$$þµ +'E(2 þÌ"33#  ëþÝÿÀýÀz·ÇX½MPepŠ›¥Óê%&'&'7676'&'&'&&5&545&1&'&'&'&'&'6767&7'041&'&'&#&#707367676107677&'&/721'7'676767&527216&"17&'1#&'76'&'6'31#1&'76?76767&'2301235'67676767635'&"#&#233373675326762&''&'"#1012&'&'&'&'&'&'7&7'"4''671#11&'&'&'&'''&'&'"17'1&'101&'&'76703727'7&'&'37'6367277#00''#''&5&'&''"5&'7''&/676767&'&'&'6767667415'367636776'7&'&5&76757676?5'37'732"'&'"#''767276767&'&17&76'&'75&701701&'&476"/71651&7&#"7#2&'&#11'676'74'&&#012767&'&'767676"/45671901'&?'&0167017#&763'è    !#   5-  !  .B\^?? Z     (  ÷    '         -       -  ;,, (@       s!  !/.,-##      5/    )  í        -(  D      *    Î        ,   &  !)*/<9:^ƒ              % $          &%þ¶)      Ö    ,'         T     g $ /  23       8     ÿÀ¿À4jžïN¢Ñ-ex’œ«¯111#&'&'&'&545454545476767676710101'0'&'&'67676762327013=014#"#'&'&"#&303"#"#&54323274565456&#"#&7236012=4720;&'21"70165"'4'43676767&'&'1&5&'&'&''"#6727201'&'6'&'"3'&'&7672'6567654#"#"'&567433232'6545456#&5676432327'613"741&'&767674721'&'&767#"'63545456'"763207254105456#&7360#01"30013"#"#'&'&7%1#&#"30#"#&76'&'4#"#172#&7276767676343270325415454#"#"7010323"3'6&72323236'6&#"7012370160'454'"#&7765656"#"301&76156'&01'1'4'&7674560101#"'&547601"1&03765476'01#&703274545&&#&72323'7121"#&721545&#"#&70323230#"014767676767012#"#"#"010'&'&'&7476#'32376'&'&#&71'&'4745765&'01'1654'376'&'&'â *+  "!(()32%% %*"! aa   »   !    º()  XX W   ++4        Ç   P    h        &  % &  '&Z ·!!) [ j    P ÔÀ}~""./'' 87 æ     0   FGæ   32—&% "JK‚           W     A  %n   j   :!þí . ½    ÆhZ€%/9p–¦®Ç 6Xesƒ’¡¯Øçþ3%67&'&'&'&701&47456'1007201&5437&10127&#'6''&'&'&#"#&54'&#"#&'&77'7'12632016&'#16701#47016367654'&#56'%&747&7654'"31667"362767"#&7017"#66654#4'&'&'&'&'&'2#"''&#"1'2725#6716'101&'&+#23276765416'&/2316'"#52363'"#757#53'1#37#711676'&'&'1&7167'7#1'7#3/"37&7"&701&6763&'&"#"#&'0123161'"#1&'&'#3'51357'"#1"#1&'010676"01035236'011676'6'&':  4    '  ó!"- þù 'þá  8    )   e%4IQ<×& &' %[,*-,*#    å'’  Î       4N  L6!š  m    ' NLN   B&&B ª'    - *  M0  U `     ÿàÀ  !/@L7&+3276=4'%!"3!2767&'&#1#537#3#3#&'5673'1&/373xþ˜  h  ú /0 e5 5>?h  & !&ðh F° þ˜ h þý¥GX&&}s‘rr‘ÿÀÀ3oty7'25107167676&'&'&&'&'1'&'&'&'676776'&'&'41&7676761216767 7'ßßßߨ:              CÿÿðððððŸßßßßß:      <       eÿÿÿðððð€} -<‰›£ÖH~¶Óÿ2Vt‘ºLU]~™¦7176'&097676'&'&1676'3276565'113676701767&'6763&'0167&'6776'0161&'&'&''1&'&7601?'7'#6'&'&56701&3676730#&17"7"156'&'4'1"#'16767613&#70170915&/31#16'4'&'&'&'127671167273'&'523671301717&'&'4'36721#6136307311"#&11276737#01"'&'&76767676'&'7216017&#"#&5&'&1711'&76760752476761&01&'&'76'014767&#&76'"'1"#57454&14#ۧ=3010'631276'"17&'&'701#&'&7&#&'0107376'&76"51&'11'?671&1«17'05654'&"'&'017'&'&'&72017&'1&'1&'"7'67676577'7'276'&'&'&17&5&'&'7'&'&'&"101'6767'77'777'774'&'7'676721'6176762'%2701&'&17'130167677654'&'&'6'"3767&176#23134547Û Q/)11110/),¤ 2fJK**09:!*==I=""    ))??Kc       7  -       %         *       #)(A( !U[! =    "*$ )!  ( _ ;  "  %6;<þh    ,  -[DC&&!"GGqÓ =f L &+ ¶   —!"$%  12[6$%    7-,þÞ ˆGu     ,       X  s   Y   O     ,       P+% & D 3X +^%  ;   * $  +  =A= !!Jr '&| !!327 ,54'&ª  + ÿÀ)À %7# 373ÑX 8Îì Ì• vË!ì'–_bþi`þËÊþ£•ÿÀ=¿ :Wnv’•ª×äî +3=”°Ì7Wak˜¢?'7#'#7'7#'##"'=46;2'45&1&717456##532=4+532=4+";2=4#'675&#";2=3;2/'#53274'&#&;276573;2/7532=4+";;257#53252=4#4+53216514'0+"#"2;216154'0#'#";2=4#'=466=4+"#02;216153;2/#532#7#0#02130361532=4#+532'#7'?&'6'&'&67601&'&'&767&''&'0#&'&7367676'&'676'%671636&67&'05&'&5471#'&'7676767017&'"'67&'01'&'&'#&'670#'#&7670167&'01676767667&'01167670#'#&1'=05&#&1;2=0'&'#7'7'7'7'#53270=41&+53234=05"+"1100;216154'0#'#7'7#û=]Q  * O  Pø] .   V   ÉÜ$$(( *+7/0    6 ! 2##0( B600    r]þ¡++1//+* 1++2//$  $$ 88  $$vj  <  89 < 2!"s  &ì9 $ ( < ;& ; 66??((4  $   ?  !?   Fˆ;(('&  !"= K"" $$& } -&  !"=K!" #$,%‡A" þJA">Š  ,%(%#01 %&" &r2  244U@dÿàþ 7!'7&'#705676/+;¹¦X) ãstGKg#þ@G-ÈÈÿÀÀ/7&3276'&'7111;276'&'&'&'&'&'&#"˜ } ¯ 2\4$  ® #"$#Ô û>KK8äULLEFA//FFGG12ÿÀéÀ§%67167167'&547676767'&'&'01'&7476765'&'&'&''&'&''&'&'&'01'&'&'2127676760134'&'&563010'&'&76763€         `           ÿáÀ %-5:>FJNRZb55#73753''#553?35''#37%735'7#!#3753'3''#35#7'3'7##5'#'75#'3"LvM- , -8 €88€ Ola8€ €8þ!Z[ P=NZ[²M -‹mL!=[ZNlM=L-ÀLm×- ,7o[Z!P^MlMl € €8à -87, -a8- ,7PZ[[ZîlL ³L‘ [Z ŠM =Ll=M-g€ €7aZ[ OÿËÿµ$I77016767050176'&'&'&6/&1'&'&'&01017676767 j +*Q2 tHI)*ü j **P3 tII)*$ B 4(  r6 ,-'8 A 4 (  r 6 ,,( “€í %*BGQV[`is737#'37#7"514710167676+36767#%7#3#3?101307676'&'#3237#!37#01;5#735#35#'#7#37#;7#î;;îRW­3)dD=(>(>þu_[o -vpÎINC;; Þ_ZMI VQ¤:(':!^†“ 7 55 9 N55<ÿàç q7111#&'&'&'47676767&'&'&'4767672254565456563232367676767"&'&'&'&'ü  !!!!  !  ]   !"   `€<CR_gt%7#'#535##&&'&5#535#353767#'&'3673373'%631#&'1&7167#53#3#3'5355##7'373#'J5>w8—  7''þñ!!!!!!!!õV:999WB55f  f55B---- |`˜¥°º1&'&'01&"76'&'&#32767&'&"#"'&'1676'&'&763&7673&767667676765254##01&'&'01'&'7670567&'&'&'&'�6763'&'7676'&'&5147× '(0'67K 2E      9.%"1 1@   < '  Y  , / '9    !'!!3  )# H   ÿÈð¸,>N`tˆ11676767&'&'&'6716'&'&7"'1&547632#6514'67&''1&'&76767&101'7767'&'1&'6217øE88!!!!88EE88!!!!88E5  Ö  *''*ä   $-'&.#&'-$$.¸!!88EE88!!!!88EE88!!]   »   2(--(2„  F (05#i0) #5ÿà{Ÿ%4BPq7#1"'5#7675#'6767675&'&1&'&=67635767&'&56#&'01711"'7674'&'&'6725&g ! !c21UT11;EEAA0f)*WX*)NZZSÑ    O  ‘hg$ ŽiÝJ&%!!&%JÝ Ý>!"$$"!>D lÕE70ve- W      %`9Z%6'1&#0163276327671676#'3&'&"#676767'11210!Ì    pE !)43ÄGGp&*40&`34$ýB2w10  ))<<<<((§DÎ  ]ö0 ¨    @ÿÈð¸e€Ð%1&'&763&'&'"'&76701#'&'&7&767&'&76016767601676476767711&'&'&'676767&'04'&'676'&'&'&&'&'0101&#"17276767676767676'Š)       #  f!!88EE88!!!!88EE88!!O            g        $   YE88!!!!88EE88!!!!88EK!%      ÿà°  >i7&'&76'1&'676'&#'&76767676767676327&'1&'1&1767701676'4'&'&5à&%Š 2"* ,0%'   !! /? !42', 2K/$,,$/I A-,),85' && 07DC1 ˆ†<;  i455&% (- %&5 ÿÀÀYbktÃÐÞé%671676'&'676'&'&'&'&'1&014767'7767501&'&'677676'&'6'67'&?&'67#&'6767'6767012'&'&'014767037&'&56&'&2&'&'1&&6766&#767631#&'547Á  "  %9  ;"A   '0" ""Y ,N!,3š  × ™ .' '## 3E0   8;;*+(-A ƒ  !#Þ 4! ' 6( * " 1)- j8$ 8 ¬¶ &. - ,?5OJ 9--    $,9'   ¢9 -ÿà9 5JR%&'#36?&'1&76'&'!!6765&767675&'#532#'#367&'N*3+2·þ· '' H '' Ùbb! ' 2446÷!G$ 0000ºîmO'&ÿ௠%2%/&?6?65'&/&?6'%?6/&¬ÅÅ/‡‡//‡‡/ÅÅþhÅÅÅÅCaaCC‰CCbbr[[[[ë€*7!"35!#32767&'&#134'3&'&'3&'&'&'Àþ€ +€••  þU@.+**@À+ 45BR66€ @@þÖ+ * þÀ@U*-?+*•A55 +66Rÿà }Š1#1"1"#"#"170&71673276516'&'"#&'&''&'"'&'&'&'67232767676545&760122'01"'&'776'&'&y   mO        #"# "  ! A   Q <o  þÌ       %   "=66""8 Íÿàù <f”ª16767676716765676567675&'&'&'"#"#1"''767676'&''&'#"'"'61667601'&'&5''&7676767173272375&'&'H  1**3788„   +JJJI*    ") ,, "   **)  "]    †:988  98:9 6##/ -  - /##0  ÿà€  .X»Ïû1r‰°Ú 7#4763670#1&17216765&'&010175&#"%1'''&''&767&7676767264'1&'101&'&'632707674'&013#"'01&101657103076720&#&767016=016'&'705"1#0#112130305709&'&2765'4#"#&'&741325054'4'67&'&'"1&#&'4720767654'&013"'4#130174+47676212576#01&"#";"1'4767676767325094'1&'01676'7&1"50'01#0#1011307015&760125676''&#''&5&76327416741&010127657&'1&#72765'4#"#&'&741325056/"13&ù ‰ ô ò10B#$/+,*+=##2 /<&!0 0,,ýø        /  8 %$     B   6.   /  6   % ÊD(( 01 %$33!)('0" $$2  + "O25  :   86  '  `2N7#"'&'&547676;#32+&'&7673654'673276=4'&+654'3Ör … ‡r  ¬ ®T* Av‰""˜    x3x" "ÿÈø¸š11676767&'&'&'&'4767&'&#76'&56''&'67633674167676703&'&'&'&'&7676'&'&767667676016E88!!!!88EE88!!!!88E†   '  '      $   ¸!!88EE88!!!!88EE88!! +  *%&!  /J     4 ÿàø -S]g‚%1"'&'"#"'#&'&7&'&7672767676767671676'&'&'622323676'6312#"'36312#"'&7161367676&'&'ö >  9+ =43%%=$1ÉG      ÿÀÀ*-JS`k&'&15&'&#3721676711227676/9#&'54/&76;2767275&'#9'367571/5?õ> gÈÈg , ¤n54  %% n7s&Rs T3„x'!XDgùg0<aa†¥[..\ FF  ¥=PCþã4+RB4"H TTÿàÀ 7%'&#"66'&7'#"'&7675&'&7'32?654'¸Ä (32  /  2‡Ä ÃÔÄ)42.z  {  3† Äà ÿàÀ  9HLP71#537!6'&747;4'&'"'01&7#32?4'1&+35367677#7#3õ  Ëþ@—1   0~ 4!10ˆ0Ø*Èþ@Àÿ      &8 Š/ ]ŠŠŠŠ ÿÈô¸>KZcr}†%156727654'&'&'&3&'&5676323&'&'6767'"'67676'&51&7167'2&'6711&'&547&'67#67&'Ú34QI/.$$#$./Je779:kV77>=auAAAAua=>Ž?I+)R $ $+*++H$ # I? 5*4  vF&&1J/.# !./J1:9hk::&'HS--AAuuAA--S”DI  b”##3“IC&'    ÿà8 0:KWe11676767&'&'&'32&#"73#'#73#736767&'&'733%#327676'#367676'&"# N?@%%%%@?NN?@%%%%@?NU‹M†/ ![› $ % ›Å! \5hþÇ      32??2332??23þ›#" :¶Z##Z%‘= RÍ$9c0  _9 (<HT37373'#'3#376767&'&'&#56'0176'&'&#3276767&'&'4101#57516' ,-. -)*ê00î 4.3  ÀPPMMÀvvÀ0.“f !" JÀ !   mÿÈø¸ &*3?#3676'6'&/11676767&'&'&'#53'&'67#53'./2+'E88!!!!88EE88!!!!88EQŒQQ94š ´!!88EE88!!!!88EE88!!þ—ÐçÐ '*ÿàÀ Fƒ454'&'&'&'&#"+"#"#32;2327676767654=45""##'&'367&'&'&'&'&53676'&''À È    È F&%)B'+((+## #)))@/. : $  È  ¸ñ = !''$   ,&&?!"%''"$999%ÿÈ÷¸c11676767&'&'&''#'&'&'&7476745676310;2767654'&/414?32ÿE88!!!!88EE88!!!!87F‘ 77      ¸!!87FE88!!!!87FE88!!þö)  )  )) ªÛ#â2s ,G ÄÛ 4Y : » FÉ : d/ 4ë X“ . * »Font Awesome 6 BrandsVersion 772.01953125 (Font Awesome version: 6.4.2)The web's most popular icon set and toolkit.FontAwesome6Brands-RegularFont Awesome 6 Brands RegularCopyright (c) Font Awesomehttps://fontawesome.comRegularFont Awesome 6 Brands Regular-6.4.2Font Awesome 6 BrandsVersion 772.01953125 (Font Awesome version: 6.4.2)The web's most popular icon set and toolkit.FontAwesome6Brands-RegularFont Awesome 6 Brands RegularCopyright (c) Font Awesomehttps://fontawesome.comRegularFont Awesome 6 Brands Regular-6.4.2ÿÛ       "# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ exclamationhashtag dollar-sign0123456789 less-thanequals greater-thanabcdefghijklmnopqrstuvwxyzfirefox-browserideal microblogsquare-pied-piperunity dailymotionsquare-instagrammixershopifydeezer edge-legacy google-payrusttiktokunsplash cloudflareguildedhive42-groupinstalodoctopus-deployperbyte unchartedwatchman-monitoringwodunotdefwirsindhandwerkbotscmplidbilibiligolangpixsitroxhashnodemetapadletnfc-directional nfc-symbol screenpal space-awesomesquare-font-awesome square-gitlabodyseestubberdebianthreadssquare-threadssquare-x-twitter x-twittersquare-twittersquare-facebooklinkedin square-githubtwitterfacebookgithub pinterestsquare-pinterestsquare-google-plus google-plus-g linkedin-in github-altmaxcdnhtml5css3btcyoutubexing square-xingdropboxstack-overflow instagramflickradn bitbuckettumblr square-tumblrapplewindowsandroidlinuxdribbbleskype foursquaretrellogratipayvkweiborenren pagelinesstack-exchange square-vimeoslack wordpressopenidyahoogooglereddit square-redditstumbleupon-circle stumbleupon deliciousdigg pied-piper-pppied-piper-altdrupaljoomlabehancesquare-behancesteam square-steamspotify deviantart soundcloudvinecodepenjsfiddlerebelempire square-gitgit hacker-news tencent-weiboqqweixin slidesharetwitchyelppaypal google-walletcc-visa cc-mastercard cc-discovercc-amex cc-paypal cc-stripelastfm square-lastfmioxhost angellist buyselladsconnectdevelopdashcubeforumbeeleanpubsellsy shirtsinbulk simplybuiltskyatlas pinterest-pwhatsappviacoinmedium y-combinator optin-monsteropencart expeditedsslcc-jcbcc-diners-clubcreative-commonsgg gg-circle odnoklassnikisquare-odnoklassniki get-pocket wikipedia-wsafarichromefirefoxoperainternet-explorercontao500pxamazonhouzzvimeo-v black-tie fonticons reddit-alienedgecodiepiemodx fort-awesomeusb product-huntmixcloudscribd bluetooth bluetooth-bgitlab wpbeginnerwpformsenviraglideglide-gviadeo square-viadeosnapchatsquare-snapchat pied-piper first-orderyoast themeisle google-plus font-awesomelinodequorafree-code-camptelegrambandcampgravetsyimdbravelrysellcast superpowers wpexplorermeetupsquare-font-awesome-strokeaccessible-iconaccusoftadversalaffiliatethemealgoliaamilia angrycreative app-store app-store-iosapper asymmetrikaudibleavianexaws bimobjectbitcoinbity blackberryblogger blogger-bburomobelexperte centercode cloudscale cloudsmith cloudversifycpanelcss3-alt cuttlefishd-and-d deploydogdeskpro digital-oceandiscord discoursedochubdocker draft2digitalsquare-dribbbledyalog earlybirdserlang facebook-ffacebook-messenger firstdraft fonticons-fifort-awesome-altfreebsd gitkrakengofore goodreads goodreads-g google-drive google-playgripfiregruntgulpsquare-hacker-news hire-a-helperhotjarhubspotitunes itunes-notejenkinsjogetjs square-jskeycdn kickstarter kickstarter-klaravellinelyftmagentomedappsmedrt microsoftmixmizunimoneronapsternode-jsnpmns8 nutritionixpage4palfedpatreon periscope phabricatorphoenix-framework playstationpushedpython red-riverwpressrreplyd resolving rocketchatrockrmsschlix searchengin servicestacksistrixspeakap staylinked steam-symbol sticker-mule studiovinarisuppleuberuikit uniregistryuntappdussunnahvaadinvibervimeovnvsquare-whatsappwhmcswordpress-simplexboxyandexyandex-international apple-pay cc-apple-payflynodeosireact autoprefixerlesssassvuejsangularaviatoembergitterhoolistravastripestripe-stypo3 amazon-pay cc-amazon-payethereumkorvue elementorsquare-youtube flipboardhipsphp quinscapereadmejavapied-piper-hatcreative-commons-bycreative-commons-nccreative-commons-nc-eucreative-commons-nc-jpcreative-commons-ndcreative-commons-pdcreative-commons-pd-altcreative-commons-remixcreative-commons-sacreative-commons-samplingcreative-commons-sampling-pluscreative-commons-sharecreative-commons-zeroebaykeybasemastodon r-project researchgate teamspeakfirst-order-altfulcrumgalactic-republicgalactic-senate jedi-order mandalorian old-republicphoenix-squadronsithtrade-federationwolf-pack-battalionhornbill mailchimpmegaportnimblrrevshopware squarespacethemecoweeblywixello hackerrankkagglemarkdownneoszhihualipay the-red-yeti critical-roled-and-d-beyonddevfantasy-flight-gameswizards-of-the-coast think-peaks reacteurope artstation atlassiancanadian-maple-leafcentos confluencedhldiasporafedexfedorafigmaintercominvisionjiramendeley raspberry-piredhatsketch sourcetreesuseubuntuupsuspsyarnairbnb battle-net bootstrapbuffer chromecastevernoteitch-io salesforce speaker-decksymfonywazeyammergit-alt stackpath cotton-bureau buy-n-largemdborcidswiftumbracoassets/css/font-awesome/webfonts/fa-v4compatibility.woff2000064400000010730147600374260017557 0ustar00wOF2Ø $„8$ `‚ʺËP‰ …AUµ ‘²pþ~?ý¦ÿ3 3 Ó6÷6BË´×*4Ð:OÌóÄg"³ÇÊ„iú­zž›qž¹ž‡½–Ï™Èð3œg®ça¯ås&2Ëq¬L˜¦ßê¡ç¹ð€¶8®ôá Æò)£sÈèF[HÉ—ÂHw“4ibš41Håg/Ü  aë ªÕ–è ¥îG ^JË .æ$Øq)­è „hU«h[,à¸àŠxÉû•!S l‡ÅÏôlAq„Å ˆ-³B©‹ŸÛY°añ¿]’-ò¿.£àEáA×ÀØ{û Ó²Ì,Êäò²dÔº!ïnñ³¦yGE:˜£#+w\ˆP¼Š-˜A`zâ¨Ï6˜Z£ˆÿ9XƇ¬ïŸá€îBæàh8nðÕBàWÕ^T_g4lG:ÒÕ¥4‰Õ¢ZöcÑ°££ \J“8õ³æÄ¢ üªZ‚s”¸#tŠ;:*@ÎE_.à/w?ÕPpž©–Æ]ÎEñQ‰Y†êà™‚óœsÑR’ γ](䧯ŹèåJz‚óÞ Ù¡ B6áxT_—80Ëðz®a÷ÕE‡’ѳ†ô«Iš¤1Ið¡‡+•‡-!,k¸Ëî[–Ö/‘5ä\d³b£1›gŒç?\qÝÊÖe‰Íªz›Â²,‹s1‚ö†‚sl4ff zh`}щ±€¤ò2êו¸¢j^ű¤£ƒhP¶@Y5Pj'%ùãû‘²ö`’âÅ4© Øó9ÞϹå8Öûf]Ïc¡¨vT€lpflfK‹\"Ê;zÂw`ŽžçξÏr‹ó÷Œû}Áy Õ)r0l“‘ˆ39.9ÚÄëâźJt;:ê–*PUÊ( ³G!þ%{ÚÅö ßã\à±%#Ój”ã,æ00†Ý¥4Iãn‡ög•ù¡ûq•¸È®LÎ`àïKÛ-<ë¬kv/[¯ ‰g”J­ÖÆñ— V ‘£G½'ÁÕ© š(?Pòë*H“-L¶0IÅKþƒØ™ÃHG[—Kù¯ŸÌa'¤Œ2#ÒL¥y›˜tÛÊÖ®DŠ2º¾ÿut¤W¹3¾Ú (%rn›„™ EYÔVe‡CR«¢„ÉL!¥+¬’aœÐíúøŸ° £ìÒê~RÌc»³¾qÌ1ë6b»³¾qÌ1ë6Ž\Ū|ÿLÍ4kÚf”ðñJÃ1Ä>³.ʬ—™ËKF™•+vÅõë^µ^Æ™™lkù°eT*Îbµl qüêêT§3µºzüñ««SÎÔêêñP €}(Ã4¡ €a7ö§)[ ÌÔJ¸A"é6úín»xwy¿_ÜQ¢#긛Ú$EwF€p/Újµzèˆz–‰…ƒV+{ƒÑ¬ß p€»x!.Þ-TL« >Pö…*¦ªÃ$‰:]å|¤m”BL§‰ŽôwÔe¶™3Θ±…FÌ6sÆ3ªLKScŠá.i¢è!'­¹G †SáZQ¿Þ$A¼¸E’îÒÑ»Þõꦕ3µ¦®SØa™N•Ñf¤ ®ä/‘aD‚)ƒ/ Šº'ñуÙâ%ø™Çn+BÓ\öK¦YòW[ÙN|{%Q_ úe #*v¥çÉP|Tzu Q¼—o»q¬³YIÓ\öG°å|¶g„dØöA!†ÓàjŠkZ1¼°¨@én¼ŽÁd¾b?L#½éØ7–žíùõwÓ@ù!eZÃ$t8a6—5j5ÄZ­yJ(²¬„˲³¿µZ#÷ŠŠJ911991!åÞÔ©(Ë5Bjcc5BjeRsk¤i×t;®ÈáÒ¼è”Ïò›Xèê æÝò<©Õ©Õȱ5BjT>`ãpŽƒ àFx •_¦—ô‚¬Eu˜œ&Ý’“±™4Ñ‘ÄÎBgÁÙˆ^ª`‹éB¢%¡¤˜£(Ûxl©3Tj´E¢ÕŒy~%C¤æÌzî3Sóq.°b ¹sïVÀ¹(¨Y Q{Á¯0ïéÔ¢«ž¦ã\ì€Õ´J£€áK¼¶€VQ@GºÛÖ£H0Ñ^?‰¨»´…‰ ”ßna†žçö8﹞‡n"ù=\‘×0…ö2Ÿ3ѳÇê Óô3ùì,»¼'Ñ“0Ê1÷%Dx\u·õ=Z´Ñ‘["¯]mWab[¦~ ÄØ‚à¼_ä˜a¿š%5>ö ó•bm xuÒåxGí¸zØ ¯IX«®kÐ'$4?AjJ9œbHG99s˜ôµü‘¦’… PÀ¸ÓDGs¤TUAm¢ŽB<ŸIÉŽ}½4ÊÖíĶ§žrl›LÜn• ùúcƒ®áÜw¾‰õ ŠwçºíM‚svÒIŒsñ¦Û,!JÁsÅs¸xK¥T=Û,—F|sÍÓm !Hu….?¸Øªú÷¤Âîª3æyµÛ.´ÖéÚ˜!.9,L=š!ÎwT€ŽíÛå²AmÛ™$3³óâ‡% $œóñµ˜£¯À¦0Q@¬+F>XÈ`÷^ñÅIŠ—̲֓ؓ–Áä…œ‹å»Ã3“é)¼P2²²cš;Nð‡Vhj:ÉÑé—›Üa#ãµb‰‰ ÖÝäÅê÷:Ü)ìÆvl!ì¿Ûæ¸ >Ì` $I“´]R ŽºA¢óª NÒEQ;v³ åS>aí£)¢¦In3îÜ­  Á?<%‘øœµ¦¦I§(=ºÍˆÏ‡=0Ã]8À[J’µ’“Õ'PqÚGe*ä¤DKYL“ÔÄ7±†‘Ž’ŽŽºÀ¹Èܮ٤eÁÂÕk~Êj·¼`•ˆi:¶=¨R¦Î÷êÒà7÷•ÜàM­áÅç´ÜùhÛ²oîŒl·'EñDÜnÏ"¥Xb9—½¬[–¾›qC˜ºâ1'uSœˆï¾Â¹5ÕÌ™µ6'¿dçz¨Q_ªªB0¶›1!„PÕ`x±ÞØÔÛÔÕõ!C˜:'âÝ”&o~Ñ͉¸.Lcˆ®ZœSccxMÏlò(_£È”B° ª ˪dB9¡;{{íC/»5­,¦ÕšPÀjìCõ,#ñóÆJ®9{0®ÓÎù°Ž$?[R‰4¨DÊH9Í‹^é(e† Ý:kq“œ˜›µ/ÓljNÒœ­’¯X*æ¢N´SobÌŒ«ã.¢Bò äKÅÜÅù)Sj@ÓÌ;‰-Îww«¤sËä!­XÜ8dqîÔ¨4k+pnEi¯( hši Cu;ï‰ÞE±X!dòqÝ mÌåέ‡YõaŒ[gQÞ9aç‹Ûà"‹¶A°XÊEgjIWÜ'™wJ¬Ëú§Ž äÀsÉÌ·ó¦ÓMœÉsÖ®oˆ{®3dÙ6‘Ò“¢ˆµ”qAȪZF“6mÓcìiºE#ðŸA\ðt൪¾œ|MÛÉT¶›Ý˾eCS¡WCó¥üA}@ÿʨ‰±VœŠ¯Ìµæ«æÿÖ€(Y ІWAkŽÄŸ8B|»Ãå4À쬬Öc‚ÈâJŠ†ÊsñcÀÁ"&ŒNÄh¤£HåòÊ=CXH0 ,ÅeØIŸWV÷LcJ!EÃrjÏèØ­|ÌHÒ}LT9¯XŠ»Ò«úKN•ëÞñòÉü2ïxmدŒTŽUü3ó¶–ÇOž\éU}y›^žÌ˳þ„ï×ê©Ôa¯êƒšõä¨w¼SÏ4¯˜Ì'³ÏÈÎòd½âUe©”M¦3ý…\&[½°°7 ÛÞͬe^íÌde|—½£³d¯_ôÛ'ÊòTyÄ­Ëã^Ý—5¯vâØ𤬌zUY/ûr¸:&}Ï;v´â'±=*¬„‡*|,Á)”Q‡‡ã(ã$òX–~j† FPÁ1Tàã æa+ÊÇ Ã0àD“g*σ*Ï»ž€5Ô1€R8¼Ño…$Fq« ¾¢I¬¯Õ<‘DIdÇ“'ʘD•þ^ï%”EidÐrÈ ‹$zqR@w²O: ×ü5œÁ$*§Ã¦“èÅ(fAŽSØŽ è;>…2FࢉãðP§ ­AeÇ!HT¨Ö|u”w<Œ*Æ áÇc8ÊÏ¿$ º’¿éRÚassets/css/font-awesome/webfonts/index.php000064400000000020147600374260014712 0ustar00 ðAðGðfð~ð€ð‹ðŽððšð¬ð®ð²ðÐðÖðäðìñ ñ#ñ>ñIñLñVñ^ñañcñxñ•ñøòòzÿÿðAðGðeð}ð€ð‹ðŽððšð¬ð®ð²ðÐðÖðäðìñ ñ#ñ>ñHñLñVñ^ñ`ñcñuñ•ñøòòzÿÿÀ»žˆ‡}{zq`_\?:-& òØÏÍĽ¼»ªŽ, ¬>€ê4~¶î~âL°ÖnÆ,ÀVX¢è2€ºô B ¦ : Ô p  J x ¦ Ô J º ø€ÿÀ€À $!"3!27654'&#'7'3#7`þÀ @  ZZ€Z´Z&ZZ&Z´ZÀ þ@ À zþô††L††:† †:††ÿÁ€À'67167167&'&'327&'&767Ø''66RR66''  $$$$3!87;;-R6666R-;;78! s  ÿÀÀI"3#5&'&76753#32?6'&'#53?654/&#53676/ @  `@ @`  @ @ `@ @`  @· @`  @ @ `@ @`  @ @ `@ÿÀÀ+3//&?'&767#&'567676X 'W W' ° 'W W' À 'W W' þ 'W W' ÿÀÀ+6#&'567673//&?'&767· W'  'Wþ‘ 'W W' ¹ W'  'Wþ÷ 'W W' ÿÀÀ"&#"3#32?6'&'#53676/’ h 88 h h 88 h¸p  À  pp  À  p?@"%654/&#5&'&76753?øp  À  pp  À  p® h 88 h h 88 hÿà /BVi21!2#!&'&'476321#"'&=47637#"'&=4763221#"'&=47637#"'&=47632   þp" €  €   @  €     þ°  "P À @ @ @     ` ` `à à ÿà F#"'&=#"'&=476;547632'#";2+&'&'676732#z{ {  € €  Ú@ @ @))@ V{  { > @ > ÿ  ))  ÿÀÀF32?76754'&+1!676754'&#"!&'67327654'&+` *ª ©) €þð""@"  þÀp pÀ)© ª* € "þÀ""p p@  ÿà F#"'&=#"'&=476;547632327654'&+"'&5476;#"'&54763Ú{ {  € €  †@ @ @))@ V{  { > @ > þÊ   )ÿ)  ÿÀ)À%7#5476735"'&#"#335Y (7! QQd ]<O =F]ààÿÀÀ;Ic776?6?6754/&+"/&'&?676/&?6/"#&'65!67167632#"'&'&': : +"  G55– þ0!"<=CC=<"!!"<=CC=<"!ÿ ('      ((@?8-  2F::$""$::FF::$""$::F€5#53%1!67675&'&'!!5!%1!67675&'&'!À€€þp     þ`ÿþp     þ` ` @  @ þà @ @  @  ÿàà @#?'&3676/73675&'&'77675&'#'76'&'È (OO(  (OO(  (OO(  (OO(   (OO(  (OO(  (OO(  (OO( ÿÀ À.3Le32?654/&#"1327654/&#" '732?654/&#"32?654/&#"ë&&&&½#}#þƒ·iiþ#8998`8998•&&&&þ #}#þƒ8ii"9988ÿ9988@€#+3Mc1!6767&'&'!#5'5367167#7&'1&'347167632#"'&'&57#;67&'#5&'#@Àþ@@@@@€@@@þ°L€ÿþÀ@À@À@À@@00DÿÀÀ+EWi{767167632#"'&'&'%4'1&#"3276567167&'76'&"1"14'1&#"32765271654'&#"3%4'1&#"32765!"<=CC=<"!!"<=CC=<"!   @ @P   P  `   ÀF::$""$::FF::$""$::F   þÀ‘ ’       ÿÀÀ6!5676'&'5!"'&5476321#!/&54?6! @` `þÀ À þÀ` `@`@ ` `@  ÿ  @ ` `@ÿÀÀÀ',67167!!&'&'4'1&#"32765!!@þÀ   €þÀ@€þ€€þ€  €þÀ@ÿÀpÀ',671673#&'&'4'1&#"32765#3ààÐ   Pàà€þ€€þ€  €þÀ@7ÿÀHÀ+&'?76/76'&/'&#VD™ o ‰‰ o ™D5 vVi²   nœ II œn þ2l U x8ÿÀÀÀ06716727676'&'&'#!67675&'&'#5"  "",=)(@ð0"   %()=0ÀÀ0ÿÀ_À%6/&#"3+";67675367^ ˆ ˆ X P P6%$X   À   $%6À ÿÀ_À%%#"/&767354'&+"'&=476;3^ ˆ ˆ X P P6%$Xq  À   $%6ÀÿàÀ /1!&'&'6767!5&'#32?367€þÀ@@‰!B$B!  þÀ@þç‰ !B$B!ÿà@ H4716;2+32+/&76732767#"'&5476;&'&+"'&5 @° 8# $ !!.‘  àP ™ ™ @ €    ,g      'ÿà "B^b#"/&76764763276764716;32+&'&?#"'&5'&/#'&'&?673'¸  X    Xˆ € J3 € J3 ` @ X @ ( `  $. þÒ$  `– I  I À€    €((ÿà@ "5H[n#"/&767647632767632+"'&5476332+"'&5476332+"'&5476332+"'&54763˜  X    X¨    ` `     à à  `  $. þÒ$  `¶   €   €   €   ÿà@ "6J^r#"/&7676476327676"'1&5476;2+5"'1&5476;2+5"'1&5476;2+5"'1&5476;2+˜  X    X¨     ` `     à à `  $. þÒ$  `   €   €   €   'ÿà "GYr2?6'&'&4'&#"'&'&3%&?#";27654'&+54/61'&'&76776?65&'&'  X    X #0   00  !    1%% `  $. þÒ$  ` º  4   ` Ë  q  B$%% ÿÀ@À732?6'&'#4'&+"# ˆ ˆ H @ Hq    þàÿÀ?À6/&#"3;2765367> ˆ ˆ H @ H   þà    _7/&54?6!2#!²     þà " ˆ ˆ H @ H _%?654/&!"3!O  þà  " ˆ ˆ H @ Hÿà€ O2176763676756763#"'&='&'&76?5'&'&76?54763` w  ‰w  ‰@4$$  66N`   )  )   #" '" 'š""5  N33 ¨    6 ÿÀÀÀ'2=H67332#!"'&5476;7!!&'&'675&'3675&'3675&'‡ x ` þ€ `g€ÿ```®   nþÀ@@ààààààÿàÿ¨ "7#3'+7%3'#"'&?6;2©WX¯×H92²²²²þ–I8²è è p ð p x]]MM}ÄÄ0MM(ÿ˜ ˜ÿà /ASe%67167167&'&'&'#09367673'21#"'&5476;21#"'&54763471632#"'&5H9:"""":9HH9:""/ ,&#08€  €  `   //::////:E4% ð       ¦%ÇÀ+%Ç2t"ì ,H À 4q J³ ¥ V_ J³ d  Dý Xµ .A :% ¥Font Awesome v4 CompatibilityFont Awesome v4 Compatibility Regular-6.4.2The web's most popular icon set and toolkit.Version 772.01953125 (Font Awesome version: 6.4.2)Copyright (c) Font AwesomeRegularFont Awesome v4 Compatibility RegularFontAwesomev4Compatibility-Regularhttps://fontawesome.comFont Awesome v4 CompatibilityFont Awesome v4 Compatibility Regular-6.4.2The web's most popular icon set and toolkit.Version 772.01953125 (Font Awesome version: 6.4.2)Copyright (c) Font AwesomeRegularFont Awesome v4 Compatibility RegularFontAwesomev4Compatibility-Regularhttps://fontawesome.comÿÛ'      !"#$%&' location-dotup-down-left-right"up-right-and-down-left-from-center down-left-and-up-right-to-centerup-down left-right chart-columnright-from-bracketup-right-from-squareright-to-bracket facebook-fearth-americas bars-progressmaximizewand-magic-sparkles money-bill-1 gauge-high right-lefttablet-screen-buttonmobile-screen-buttonstar-half-strokeunlockturn-up turn-downsquare-up-rightindian-rupee-signarrow-down-z-aarrow-down-short-widearrow-down-wide-shortarrow-down-9-1 down-longup-long left-long right-longturkish-lira-sign trash-cangem comment-dotsassets/css/font-awesome/webfonts/fa-regular-400.woff2000064400000057650147600374260016412 0ustar00wOF2_¨ ìè_]8$ `†P¯Êƒ–h˃,ˆ …svU!=o¥=DTÔz8#9iõ¨j•w‡½*~ýñ×?ÿý3p\uÞ<<ÿ~µN Òã½ e¾Ñí´Ì¯ž™Œä!âiûÍGû€‡‰É.wFA?úÙSCˆH48YúŽ`:¼=ýÿ¨šý½Ä{ ¼‡ú@‘ J”DJYœ‰=Í)šIsº¶;»>cíTgÛ(ÝÙª´j¥ùx»Ó:·uoù¥;­û7eçø'\ë«^%©JEª*Vi1:ÐiÒ„N€ G?ãÌ|ãÏ7ÖgõYgÍþñ÷Ì8ÿ«7+'ÞgΙsbÖãC¸Yÿf’™II ²-•–PE´¦¬ˆÓæ¶l…d»ßEúï«™ÿÿKM¾)w–ÍO{7,'¸‚`cûÞŒÎÉÿ’ÁŒ%0¶ˆfw){F[GÛåM-¨tÓÌH¥i¶w˜®M)  Àœ°H ä!æïM5{§ØÅ@ç*õ1”)t!Í{ÿoñÿþ-v €Å‚T±<]± I?«]„@RÖ@™—)^J”CÈ LyTq18'§À“Cˆ‹†Ž©SéÒ×¹to·î\*mc0ó梾 ,Pä[E¦T¹µŸ0BȲ쾊8á_šr0HžiÕÞ«ŒteªBè­D£ÆMÜñÁoi7ù­ ÿàIø_üá5ê³r¡”ÊhŽä6eCRù³2…¡a’wú'©sÒ¸VÞŠ('nœ~˜nÔ„´(íÆÜðhïèáR š4ªtÍÔ¾þˆé ++«þì³~´¦²b¿j MH¡ŠTB‘"L*j—Jš§RZSûT,ÂaS|][*~´ËMªýK–Ê]¶´ür] UyÁ2­í¥Ë,¤„ûŠº¥r<¥^Î_àG]”Iƒ2vºÈÊW_°HÔ~ üÑŸÿHíS¹n»v^¢ü2Ši©Ä‹õ=˜êµÇœèÏ¢|´Ë'àãÕkR(ª*Ôˇ‡–U•k.ê׶—ªòÁ4k¦r[YªøjË/XèS{*Kõ,º¬‚æ57­ö–_Un‰…ïC ÍbçV2.Ñuñ–æ£5Zy¹:´Lû_Ö6nÞžôD3ßQ­Þ ¬·Ív;ì´Ën{ìµÏ~tÈaGuÌq'œtÊigœålçxÊóµýkߪý´þÁúï×Tÿq&ëõÉ&dë³ ÙÆlS¶9Û’íʞΞÉ>—7É[ä­òÖùˆ|V>'_™¯ÊWç ùÎü¶A½õT7hÙ/ûã§Ñ(šDÓh£kt‹žÑ+úDMÔÅИ³bv̉u±16Ş؇ãhœˆSq^”âò¸"®Œ«âê¸5n;â¾x0Ž'â«ñøCü5þÿŽ·âÝx/ÞO+­+*+]*=+½+}*µ•þ••Q•Y•9•¹••%••Õ••ÚÈX™*Óe¦Ì•-rA®È}y ä•|”ïòC~Éo©•´²VÓšZ[ýÐÞÚ_ê ¥“t²NÑ©:SçèbÝ«ûô€ÔCzXèQ=®'õ”ÞÔÛúX¿„\¡Œ!hMè†í³ÓÙ…ív)»Œ]ή`7±‡Ø[ì‡ö['«“ËÉï”rê;íœÎdg±³ÆÙíìwŽ;'óá0Š4d&'EiAKZÑš6´¥½:‘¯¸ÁU¤VÏÏ]ÙÇ+OVMjJ=ñKk㎙qUNœPáÖÕÕ€öÐþ:àŠwßø„žÒë×TÛà sæ:«]ÿÕÃÏÃÏÂÂ÷Âwx#ù¦äyÀ—|Ù|ÉißÀ×ÇÓü1ß]Ú¼®a sÝ\3WÌesÎœ6Çòç³+|“Ùf­™`Æ›ÎkoZ„»LC0åÓ›KšÖˆÉd™„`â™8&6˜˜&’·½PïCð÷nñnô.OÛò¹ÞéÞ1àÞ^ÞàÍ ÞœÞÞìÞ$àM@Ù ¼Q»;žçày ž'àyœz€€ç2xNyvy–yzªx\î{îàîîîìîäîèîànï® îÈÖ}Þ}EVÀªfµ Z9¬ŒV+¡ËòY–Uu?Gܼé\©]™]¸Rº|Ÿ#ìˆ÷o]‘íaz7ý.ý«0¶0±0±0´0¼0<½œ~‘~–ÞL¿IßHï¦wÓÖBóBÓ´3mOKÒ¢tkZQèXhŸ^M×lô(ébÒßÒ‹¤?¥¿¥Ý?jº;ÝNÚŸö§Þ©;ž.M—’f‘6'i¥Óz‚–45Í0õf‹1_šCœ›ˆ´{êïg¾Ô*öN¿^¸‚´3m%u†ÖÔ?µŒæR ú×+õ&õ$*”º“fø™ñYsjk¿ƒÞ 5'5%5&J›Osôî~Gßz}ÃPCõW·'~3ÿw©ƒŽ:鬋®ºé®‡žzé­¾ú©R­F­:õ2¹þhÁ†j˜‘Fmœñ&™lŠéf˜i¶9æYd™åVYmël°Éf[lµGëCÚûHŸë<%—¸ÌÕ®q£›ÝâV·»Ãîr<èzÌãžò´g<ë9Ï{Á‹^Òz•™E#ì•f£úã=jQob웄&Ž h†ÉXØÕÛU7ìPݱSõÀ.Õ»U/ìQ½±WõÁ>ÕûU?PU8¨ªqHÕà°ªÅU‡£ªÇT†ã*Ç Õ'ÕœRqZ Â5g©!8[ Å9jžRçáùs¯¡¶?Ø@í[àj?û©,£þû ú8Ï| ײá¹~ºY‡ØBÖ,"›Ö‘­ÏmÏ“m/mO“mÏ’mÏ‘í#Éž dÏpÜ|àlò&` y °œ¼¸Œ¼5¸š|hB> <@>‡aVt&_Å0«1ï3n7o{³`$ùm )ƒzÔ›aê´ Œâ—áüñS0‚ha9јhÒžMFÍÀh¢3xè vÝÀ¢'x„è'ú€MD KÔqÄP0ž˜ &³ÀDb6ØJ̉a Ñ@¬Ã$b£co6L&ö€¦Ä>Є8 ¦GÁ4â(§b˜NœKœ‡DÉYÄå`6qØC\ öW9ÄÕÌws+À\âv°Œ¸ƒùbî˜G<æÇ°Šx”x=T†àƒê<Áó@ >w,{ó<6ó<†èüÔ†`܆ù -] ø¨Áÿ@}7Ð$ÇM\¥AâÅ  HBÄ@C¤ðƒ$ €¤ʃdâ‚dž÷•+WòhR€”š‚T`o*#‚f Õ@ªÏ³R¤ö~âJ½C‘@ü MÖ@i ÒFÞ=d ÈØý•©X2=‚Õ 3@fî®ÌóËlA]@N€\Ø7\¹ È} ?ÈŽ›G`^›W€|‚|ü`o~ òˆ3C@+€V†‚VvÀpÐjÀКÀ(ÐÚ ZÔŸgˆÁ$Р½É ý]¦ƒèÍ ;@GA'3A'3̳@§2ÌL.Ð9@dÐÅ1(ºt/0tŸæ‚æd˜Cæƒf˜#€e˜ãˆA^Р'… §\ ^½ ,½í€  e _€år+ ”1‚•j!¿.vCk¬ƒÐ `=Ø>`Øé€Ù`†¥´Ç(íÀqJp‚Ò œ¤t§(#ÁiÊ\0ˆrœ¡üÎRþëÉz ÙT'[€ªd;P‰ ΑcßΓ3ÉY¸@Î'—㹑܎ä~òž“çÈóxI^và5y¼!ï‚·äcâøT—2A|êAé">ýN™,>ýE$>JKQÚQZ‹Ò‹2V”Þ”q¢Œ¢4e%å([(MDÙ*^oƒäéí¯÷€2@”ã”3¢œ¥T奫(7)}D¹Ci/Ê]JQîSF‹ò€2R”‡ý ”½¢¼§ÌYƒ2PdMÊl‘µ(­DÖ¡LÙŒ2DdsJs‘‹(ýDn¤,¹ŸùâäQðØœ<J7‘W(cD^£Ìy‹Çïä0œ|†“/!åõ ìùe»Èÿ(íDþOé$ò;eµøŒrY|Êñ¹å¶ø\‘rE|®D¹*>W¦\Ÿ«Pöp_<)R€ž”(À Àƒ|ðĤ/<ñ)ÀŸžT(À_ž,Q€?<©Q€?<©S€?e! žGãh/Åi6É6#õN²ð M&=…ß# ‘4žé.ñ|‹IOƒ÷æîs&“´q±q¯Pyö¹žBåY"%9"R’çz„ɳwF åíGGâö\Àó+!^RFõå{= V`”Ñ8Š£8Êw4öÇOúi6M³4K œ8<è,¹Å—¾ô{xúi"%Q ÝV§HuCºK• ÙhU)´:©]©X^™9^½æ*DáüÓ5–&ùoUXF³UñXÁk®à5IˆLˆí®´*CgÕÍ¢¦YÒ0˜B©Æ\¯TdLÁ±$DŽ°dMÏcyÅ2!•*ždš:Ú]¶D /á%(]Lãˆ!õe†êð5Vy† ëöóœ[V¾àܲpžßF¿Rñ1T Xϲ,Îó…eqŽsQº.jpoÃEò÷8·oâ“x ]GúÞdŠô%£Cô(‹âé$úÆQ–¶pšf I^í%ëõ¯·J†ûj"Ó¾xLä{(Y®ñœç®Uzདྷ\ø³ýùÍÛ·ð:Ae^t…”I_æ_Â$Í¢8œþ+‘’KBäql8¼”È„)X!s<bgµïOéKߣŒ²(ŽâiFÙˆ2OúÒO³4›FqY[;}zm„/}œ´ÚˆíV’F i8|ô9Àv+9¤f4_=À+c Ûˆ#Ô—»hÐÙFì#뺡Ÿ·ŠÜ9½' ‘çÏKBä^挲¹áZ¥åücDA¬—êNÎååQÂqÒlù$©p;Q¯”šÞ²ÒèZçÝÁ)vG?&¸zõŸµËß2©Zþç:bµ3<Àz—sË Hâþ;+ïiø(¸(ÿy½תؾN8ÛØ‘:'Tú”Qq4ÄiÒ%ýIšõ!©Ÿ=D"˜”–ßÚŸõ"Ĩ7{Q³²ÄQ³½2±:/êúÄŠßýIÂÎ?•/w¢–ߨ7›õ"4Eµà•5»Ð$æB½¸(ÿ‘ý;ç¯@sä8b õå6N%™baÙŠŽ«QªskNN?üÆ/ã/»zÑÉoée]uŸ'R’wHBä;¾Ï½Îƒ†‰¶]ôÇœ Z[unHBäçý×_'yYÝ÷u•Ù^Yå—¹É>Tf Ûøë)Éåë(œ/ižÎl­êž\ÔÊŸžïSÙ° ЋâQSt~gâ´“Ý£8ŠÓ]Ü*ª ‰íV2n«K³<û+Œ]#O¯­\þ5Ó6õû®í!mÅ½ì ®–æ«¿kê¦ýÂ9r¬YaìK¦Ð8Êœ9irFé-õKÿñ2×u=?°‹†‹ˆÔv=y-¸Îà¨x«àðؘÁ¯¸Gqš‰€‡˜—¥Ù$%£ÀhÓd“Q˜Œ’]dÿa‚a8íOÃÉrÍ41 §÷NÃM³¶L~ÉlKÑ“í{#Y³ßOO`RìNÃ1 §[]«VRªõšÕÝú%ôd»Üs¶¥‡ÉÛeâH$ýtSµÔ2Ê|:8k³>^‰ï7„ÓEðI|òˆ¡dJFã^od½ÔÇ_avþŸ°gke/¿®£{žŽxú›Þ\ölíœ]ÓìïT|y&ìáuL €C™ô;iÅ/Ê+ÏÁmTrOc¢õR×_Sпc[êÛåÚK³¸1E³±—ÿ'[+{¸§£‘_÷Ê÷‹0.Ø56 0oßÄa;û+Ð ÜÂÒlº±‹i–îà–é÷´i挷1æ(ý ø±µ.Úp>]â{Ý´öº©eûÜ°“[*ý@d°´B$!’X¥À®V›jÚë"v{)3JFŸ&?a¸€3ð îal2mË,‘Kb·³–=gUK3é7Ðõåd<¼RßØXw8·½MÈöö9Iˆ¼ws+ƒ`kóÞxAµªa:É[çÉj›’ºãèÙÞ>w/†Ýnˆ¡ÜÙÞ>WéC¥$Uq<¼W«Hz=‚A0©5~µ„DîÕÝ0t§~n{›ÜXö\×[‰ü<¸ýe[E[sË‹bªé½]œX€¿DÅ 3ÿßRӤט땂›AÉsÙµ»?ýâã9"ϼsxÀe%òÿöÿ£Îñj°lM3w‡k ªáÙð ?œ*‘6Û$Z+ £x:«˜Q˜•_Ÿ†!:N«« ú\¸ð(² Ê£ýÑGë…xد3ÄcfåÚµâŸXN{¦Óiâ_1ͱ;²/ªâ1Ä…£9ùq–šÐ>óxkñ\zæL:§gΤ¦Åùêl6›­®rÎùj|Ÿqn™xÇÆFz÷ÝéÆç–=BˆÁÚææææêªà\¬Zç6V÷C<}®%-µÌœ °u%²Ôóž°f ‘?;2=?CaVÎïŽ'&b³1ïžgã˜Èòë ÉxtöìhL´ ¦±èŸ-Ì îÙCËeÇŸ"Ø&¤›f© 1{K"o1ü´$D~Ù³H"l9ìû°f«»¨ÍËÕ|¦jq[ÏH¤$m8Ç72Šk·/ç} ahoâò©›KwYl½³¼S7ùúœN’Ò[%!òŠUÖ±xêÔ Y\åÜŽ0L;9ƒׂƒ•»ˆ”D×ílnNH2ÓÆ*ι–%€Þ'cÎÚSºcViëÓ³l÷”w:¿; Û‹¿Ôßú4J¿ÃšÒ¹²/ùKž³Ô$ý‰‰Ì†Z‚Ë`E"vˆ5ÐŒ{—/£ÕŸÉnŸÈª­€Ÿã³éß‘fÒ7ŽúYi†}¹iJ—e?•ObÒù¿z0ªBmZ†Ú¼Ù}àÑOuŠÌ—Y:Ä,#S›Vyï-Â1Kïz;ç–õM¿¶[‡’ùøÞ¿XeáüÇ·[çßü·\ÿ¸¶æÌÀX„3?Š­4›IòïoZ–Îc"óˣ߈G~•­ÖœÔ¯aªtF±Åh ±’f–UúøÇK–i¾:ßà ƒ1ÿh¯xþC´xZsV€óï—ËßÏ×*·è½¡år6Zi–¡ñUr¦(c4¼B”óÿX*À+=ÿ >óŽ(0Y¡Œ/Í?Ú‹ŒÉôÈcX‚ €°µº‚s:³Ä-qúÏýƒh<Îd¬&Ôs3é÷+•J¥ßOJGÍéööt£ÙÀ¯õTüå•õõ•e¿²Ôs}g2i5›­ÉdçeÛ"Ám m^…Ó4SÀ0CH4ÍV¯;Ùê%dÚ¥;W„ Vî<‹-Âl4WW› üK†· Vî¼se@P˜•› )yÉêÅØôða ã‹&óÌ€Ÿ—2ÊTRàRæÒO‘ñèl:x‘aÚâE+@ûLf÷Â…”óÉVjG¤‹Ÿó×ΆùsÉi/ÿt|† Ȉ/ö*—À©Ù²=r­ØîXú‰”䃺åð·¾ßféÜùŠˆöÊ_q¸nýÝßµÓÂpÖt² ;*RS†Ï=O0ZÊÿ ëNZáuÁh ‡ùWø\ϹR¼Œ/'ò¯C€«U…)€3’Û(}¯3%3Ý2泎'»çM³8 eD‚¿—f“ÜAüÿLÿ½ó}¯£j þQä‡0pj¯­Ù6¢m×ð°´ÃïUÎMí}j ® DqýMm»–/Κbáð­Ð…çøC¤*‚/i–fÉ(aÍD„†Aì$ñ(ÅÂÃvO¶PÊü3eÉ(±„%#ñW”?"vÚÓSc^¦šJǧ¦íâðò m»R©†R"¶ÿðÛˆR†ÕJŶ‘•JÌ%\»SIûq¹ FÕBX*÷û©rçÚ‰®ãÓÐu5MeµjOYm}ðƒ­U¥W­1UÓ\ àß^>.  ”-"})зJ>yyü]’f£})0K[¨;ÿ3 Û‚~§P ¥‹U¢ëÆÞ`è:©^,TñÎÓLLUãñçièýl¹ür—Ÿ÷¸¡NqÆoH…óÒCïá%Ýw+ù{*q®Èß0ðYÊŠõÜ¢~iFéì’^|®¥”/n/p Ð!‚œÀ(Ž˜§Ünd#ªÑRìTéþ5zA㻌† Ž¦˜`ÜïǸVÏ Ëj6ƒ Ù´¬Ò^âKµ°;~ñ8ìj#2žœ}ñÙɘ5#ÿ%C+â|­"eem©#l4l˲pY÷üú¨ÕBlµFöÙɘñ䬡‹š¡­‰†ðúK0»z.ºÎtÃñ::”Ŷ˜Y°ê‘Ç(Ë<·…èÅrj]x£^²l4ªÕK!O°ܱó´§íÜtðë—õ­ò¾ÃËös‰”d±96êõÆp¸¹Ôq÷ÖV7º[[w¿Â/_6ؼl;|ó%‘ 3 áù„:°»p?<~^þ¨îÉÚ;,Ì×âod£îºž;ÍÓI*ç>b{Å܃x4N‰S—Í*c..¢Èçs¬I ÎÉù¼d?Šç'2º·(+%÷ G%í“sx€"¿Ô8h^Æqeó¹ê$^Ùù_(™W]|žŸoz y8ËçI‹ÀuËR_îâ@{‘ÀôNCG¯É—™Ç¨ï³Õóí3÷."7¬b7ŠÂlû¹?¶¯¬­ *ÓÉÙ½3A¶–~þå‘þ´—~Òõ j=¬ØZ‘©¶]å^ý™K%ÇCbý¢³Ôuìïûäúb½©–šWèYYÚB«3ù” 2ѱhp÷Uœ¿*¿ Öµ†þ®w醎xär“ü‰‹/Æ7$8]ý^Î({è!FÇOkÓl×:%¬Â¦oYË£0Ga ÈÈJ³Nç.Èž¹?p)ÌsCq!P½Ìt=»©é:ÛSQàanÊ|Fí!ùá^´Nfÿãd׋ŠƒRé€â\`òõY5ÛÆE00¸–ÿÿðó  } qÝ|)0ÎRŸe>£³tS±­7:8S;%q”²µYYÐÚøóÆzò¾ùºõשtËBõƒf¨B©ÄÒ6þÌótÙhÈü«>‡foiI9 ÓËV~Ë*ëzÙòõ÷û¾V·¬Æzƒó?{ÝúëT´¶¨úÍ?ãÖOòRQi¨ÆŸÉFCêžãÒR/¿U«TðaX™‹¦UÖEþ¹OÀ1Êù!QYwñ1Á£"¾ç€¾Âß(¯[#p¶cp>rnYáe•× é ø@=XyÀúÐûu8ë&’»ØKQ³‹=W)·Q°½;pü<+Àþ‹Â±í©8Š[ÜO0"Lk¤J2óG=d; e0Ý bw”ø}ÕMŸ©ÝÛ£~¿ÕprÙq­~´m!ÿ¨›$;;IÒ }_WUÝ÷ï˕UµìûáENv-"AÛ®iJ?àA»! c7k†ï7µ¦íàÇO£Nàûˆ¾t°®ëõ0üÚì¿¡ôƒÀ—¨iÃa@ |É܈/ïþ/l@ §áÇà¢oÆ}ÂMWða«‹ýa‡m4ä·LìÇét#óLj? i'Ëx¤ŸfCäjgaœÅÑ]/v„n’=GèæË®[.†s¹É`¥sðöôé£?eɶ—RŽÝ^: ×ÿîAÖÁ.µ­æµ(àÃÿ Ù “dçÞtå_°ÛK]{Ö³fø9ÝtDžè¦#lµ[KÙÛ´jç_&óàñjµêJ-–‹Íîû熘½%Âxµ99ÃÝÆz·žm!ÍΕ´×EºZì¬ Pâ#^H` [° wÃYx0›ˆ(n²+‰q.ùÊ&^8õ&^8ÝÆ•ÖY84eátz¯ü(žN²p:ñôÿ2}ëê mײfqt~oooïpÿhooooÅ|CϹÀ½£ý}N³ÚvÍLnC=&$œ eOÿÚlv~þÏÔÉlvÜ8›Íf(údz™~œcÅ < K}eq)£Ì}\SiÆv(ä>|B›SFY&! “Qà bTèÛA2JF¿äVúÉËf3ÄÙìe/›Í°k R¬òŸQˆ¥1h÷jŸ%Nè×)C¦• e*Q6¹&”arêT2T”arjÔ^M¥åB¡ÚÛ8³5Ökˆµúp¸UžÁæV‰,•Õ”‚ž ܪc Vc²Ö¸•Z"S÷ºŒ²û/ † жk¯izƒ÷±¦lͶ‘Ž_éðnßoék¬ôÜ?Jo€¶]›“ö¹É§êkL+š| NÒ]Lã(îPVÛ SÍô&Ï,i‹&aœ‰I»t i%;?°K§Qˆ7óÄ‚EQ˜`³ÔVXH$q¿òP´Û„†A /3™ßxص‡^ëmÆ» lÂ]ªÌ{é¤3ö§Ìƒñì4Š;3"Ñ´7ð³;UÓLr²:mšÍjjŠüЄ÷D~¬>§š**HÄ/!Ó,ˆÄ äoí D±"nö+ys¿‡Éýä,­|§äÜà!”`öá<¯ÀP60›³ ÛˆGQ˜Œ’`ÈXÑ4Í¢éFí`èÙM³Œ³ÒHº3Ä »¤GÙ;)`Ø$›f'³›Î\–8Úè±0Ôƒ‹’öQ—œb‘Wtò¥ì"úçÊ|o!°]ónôð"ÎöAB‚úÚvm^¹'2L°X‚bÙ®¹IH[ Šv¥?çŒWp®i& &/1&I¿ÙÒ jË1,ß²|ÉæôDÑïï¡@Û®Õl5­o—ô–cX–÷Ù “{’{’!ɯ£ˆBàuMÛ²˜g*óV΄6p€Qœfú@ý4Ä“N#ùYOñ ^Ê¢x³2ÏPêAK'Ô“þ-¢q 8/T¢8ͶјŠ]wÖÄIIÎó"oÊ™P|g½t ô¤ü€¨—Œ’‘‡Z–†QLà ¦¥ƒ¾CÆê8Aëƒç¢+Hÿ–¶ö+‡½(ö §ã±íĤ¹@Îâ©xîýMàáÅ Væžl*·±a `™ÑP¬nuÙ(¤, õ X1iŸ"ù_-9¢Pg ŠôL\m„I±q¶;k:qÙ’œŸ‰2ÿ”GA‡,(CvzX6Á}‚j&OYš(c..Óz”­éLC<4»¿~ÅÂö¾”Ÿæî¯÷²Úfy;Aa±OµÛªFâôß*ÃÿÖ姹VR4”d»­œÄ¹«` Æ° àhDçq&‡PfáœsÇ-dq4:î&Ӳ̛LC_ˆâ>F'N„ÔÀCzÚOªÎýÁýHäBSàÞÑQ[ív S|_iêý¿™8µÿ½&ªÈ°6ûI6CKæÞÞ­®cÛN7EôZ8Œ:‹uŽ;ˆñœŒö°×q.‰ †¤pŠ7Š#¶œŒãÝÔ`$›/'ã]|ˆÔ $õ>ßà øŒ BùiIä™ðLkzºõÌ|·A¨gç%à…ŸâÓoˆã7<´¤t±5ýíÔÌ¡et=P…±£ÜSÐK{Ò>#‰Ò©ë¥('Ôn\=šXï”u|þù6c|ÝT}ƒH/žÕ„PJmöDØ®˜$µÙ“ØbŸ1žÕû[,óðëf3†]ÉS®¹¨¸+e7V s5†1šF:ƒŠÃÑë¤á~ähw9í%јkFaÝF™RÌAÀÏ¿á1gl%™˜ŒP‚¦˜˜NVãæ|« ýÉQ [{›0G£QÔjAcƸoÍήM],Çu\× Ê‹Sk³³–ÏÛ…fk~êòúúå©ùV&‡µ ‚²“Ž…gðºöOº¡w*,ÕéqòU=_ÕRÅ?¡û[2•ò.“'†)0Rž r>ÝX„&ë0•{«8¹¹²6'«ô£„Šø_É%| 㯿ž|ª# N¾õ‚IgyQQ‚Ôd&Þ?qyþʇ¥Ý ø?=ï(¼4¹ÇÀƒl½¿ï®Éí°Tû?‚Vv‡à·Sê¢Sè>dI#Ta! JŠ‘„1"ˆÉx$„xê¾?3BU ÁJá©Ráåþk51¹ı/7|¿g¨.Ìp“ÔÞ#ùš„kèiôï,ŽçÔÀ§yG*‹8-œ²ÃÒr)ä€1Ìó<ƒŸ·Ã ÑBÛó„ë5šý~³á¹ÂóºÀ˜ë£æ2ãɃs‹g’ ײ,Ë\ú¾¾“ãû’‹WmS~P²<ŸWÑShØJ±¨AÔG©iÑçÿ¾ÓŠBâ&ÝùùnÂ0bf¤ÚmÑöÃtû¡aE3‘RÑLd!‚²Ê{?Šzy˜/ GÑó±n¨çQÜC¤àôK)ÛÏCU¬òÒÈGs†-•Å]”^Å£:·«‚V·äi›3FBLñ¢Z-@u;öO…at¦†0Æï3™«Ù#Ø×Á>7XD§Ñ%ôzÚCoGF_‰¾}®¯d9ž%¤–Žœ$Kž¤Î¨E>{èÕ ôyïظ㠱5RÀp!äÄß!ˆÌé Û î#¡Ëk£€Oÿ‹ŒW6¶^êäîœßÆÝ2΀m„õ˜gè,/Í—®Oiî¥8É° V Á!N‹Šê Ëñ¼ÅW$)ñ@Ý×ìs>B¸]éÕ¤NLœÁÕÐóÑûšY‡^:§è£_¹Å)\”ëÓ47~D—PŒ)Ò„Å!·èNi9XdI/͆½´ÇíÁ –ƒV¬ùÄÚÝ<y2m6ƒ:ø*/{ÙH2Æu‡}Äq>l¹Â²dGž_XÀ†13‰A4MÇ€ XªO k:øAƒw&ÿ%_i»lÂoB ³ÙŠŽPÑ4÷éˆç¯èˆ§ŸgÌ|»-¥ý6fYb/,œ_hµ$1t cÀÒ¡€1ü—¯Œ×Ž„ñ«Ý3FûIÀvQ`ïçÑ#ÜCOdMSJZi7äÏ ËÒW 7]°0cù +ºe‰g]ã)vaè,ÒFØ’Šyîˬ§â©02Ø24g¦í¥Ý&t¶ý@+fÙ‘°0u߇c˼c*Ž%ÖÓ’ú†’P<†/µAEÅš#Ûœ±Ãý™hâ=öíµàv`Û,”  Ãßf3™p`:ß÷vPŸüÞIû6aí8‹Í»¦GÆb…Ý ½22à^"¸¼üp÷>„DCíÛWPiŠxÜ·g›369G`äÏ÷ë0Sn÷ÑÈ"a€(†­é7¢'Ñë‚0Š†2Ç>õÑ›Çnp’†@{ŒáùoÁÜE ZÜ°‰Bá@€‹7ûå´7p¾U­2BÜeWø21U¨Ó7 åïÌÑ4SÇ5tSèây¡Ü¸í¯7»Ï«û>ÄÐ|߯?A Ãä¼9ùýÞB%ßàëMΛa(V=Ï+•vê¦ [UÇuAغá8Ì ®¦9Ž­[g!ÆìYË ølžW÷;”‹ùõºïƒ”a«Ze_Ï?æŒ1Æã¾±?æ!@¹>§AÒAoÂzÐsö/Ñ¥$ o‰¤ J§ ×¶Bz rè•ûôΚ}ËwpUÝÞ!=€&“ÂT|ψzöÎXQÙ[q´PG|¸Ž6|hþ…iv)IºI@'PçÓe–Ï7ÓÞÛü»I6 ɳS0;{.// 0Ôjó­E¸xm­`0‰®›†á„š_ °çµ€ð°æ†®†®Á“Ëg®¬¬V {Ë.Ÿ˜UgÍÇÙòô ¢k̲0ðé?&³IR0tÇÂãžQ"B½8d—,BÀ m–Ë"„¬;¡7Ì„Ñ—ÃÎÕz×áZ•3\€P½íA5¥\×u•ªM…c?*Øu]W«ñfÈ“Œ½/F h =€BÏÓ|"9j¥ú\x f‹èµRˆm;yî¶÷‘ ¥Æ(#8; 2 PFÀÁÄ‚8€9 5î 0Šœ å·¡‰é=µ#4´&L™Œ•ÜëÄó\ÚI€è(Œ•”»Dlă€å#!·Oq¬G‘ñƒ9Áí þ¾}ù¨ùd_ÀY©H˜'ÛÞ†e—}Íľ€}#»îqSÀ–aO‰ÑÈŽ¡Épûs¡R~Û€^¼ó˜yÅâ„ÇBŽ- ìWŸfbœlSBV;Hrs+Mêñ(ä¡2õð¡‡$€|è¡s{€ŽŠ±èJ<¯{\ÒYXpd ff¦K?§ûkéˆ`u5ŽÌ²G•œýH:…ˆÄÁL(3cI'C3{ŸF7ßšÅ|@°ðóçççÓ4MGìvŽ°º#´‹NTÁúΊi:Žiê¬UtK­¢GbšëXÒ—ÊbÎÑOxþÜã‚ašÆ¬c0fôuÝ`Y§¿Å ÝØR1´-c|‘ÒÓiŽ(3™iÞé¯ZíÃ)´€VÐ9ë?9oðÝ–zU©Þ„._œì˜€ëìåE ø+-t,ëiªÍÊ—R%2¤‚‹£à E…ªeH=€¡#¸úEúèŒ`cmíÐÖ*—³Ä;sP?Ü5t!ǨOÉ\+^Ì8¢T£±N›qéTÝ‚-ûíG€áJ£¯îcË¢ÓžÞ4µ<âûnè3Ça~èªÈÞ£}ËÐhÒ­ï® Õ Koõz-Ÿ¹aX©„¡Ë|Ô×è’&TP¢öXe1¨;ÝEˆT ØFɺþiØfŒïrÆ4Ý°um!³ô³$jJ+ÙÂ`ß±·dý/»{ 7U.´oˆ£U±~:å’[õ¤ÏãÜó2Î3Ïã¼ÝÞMÒ¥·fgòGž·‘‚ŒsÏk·»ÏôY“=@͵PŽ6Ð%9ÏRùRÙR1Ú °&alɪb†vJÅE6S+ð‘NL¨†õ¤E©bä>Ú˜Da\ª`_¶ï*®\)¶U½®¶Ï¯b¼êpîyÎù§Ÿ>ïxçN~‹î¶ënÏÌwWv‹+WŠ_ÿÛ϶ë&¹õæŒ>loTÚ‘ü„éßö_ß>Ðrƒ0Þ~¾e u*IØ Ö c-è>hRSÏ{°úeºÁþÔÊÿbÃÚŸ2CŸü„º³€Kl¹"䊴„(—¦Õ;ßp…/¹±öpy¸ ß•[Ôžw„p¥ßÞ l§wÛ—®`gÐ3Œr°‘SìvîãÎ}?¸ôz €¦>eµñÓbª´ütìØ”Ì$ÉI„9Q.ŸÅ³£ìTvÎWˆÜëMž›Ã53ŠL¸hF‘9ù~1¾ß6Ü}ÎؾM 2Ê®n¬ì_mÞ •02'ÿ³é41£pGún’.¤LÞ‰9À±œ5»‹èz½½}}ú ôëËì»(—úÍœÞ"„ñÀ´L}É(òÒ‰aa‰×»‘ê&¦`ûí©í¢Ì‘ Í{iQ„v“A/]\™±.Õ$ÙYC¤bd]6í•FÁv¦Ñ“‰¾£dƒ0"´›d ;ÂÕ2Ûö}Û߯‡RÒŸ£R†u߇YIØ#Vyæ¬jÕú¹?¥tL br`Ž5W|àäR}Ìöq9\æcØd”6™I`rœ3,8€¹« oÿ>.-”’¾l«ÅfÑ#õTªÖˬjB|/MŒË=¸€èÏ=ˆUkffë-$÷ëL×e©Ø_dp÷H9»Ø'•±´ÙÐí2lØK§sXˆs› sâúUŽ÷g2>>î–·ƒƒŒ¶Í;0Ù[X¯#Zp;ÀÛä6Ð,Ú@éLítX¯eŽ„ÖK4d¦jT™õ:{é蘇£1lùH»0ŽaXñÑ"0±¥1å²lýpµý9 _À÷e_Ðÿ{ôÐIT¢X–`F̈±¼ú¸×» i/&–ªéòÞ"вX‡$ ã V4aîÖÍy0#kÂüÍÜÖ¯&Æ÷Æ­›Ÿ Ãïô1ŽÂÁæÂÍ[ó›²Û›ó·n.lXM¾Õ Ô¸uó_ëÝ è³¡µ+÷x“i½ÿ ͆¾$r78ž© Vq„T·†){…‹8­Ò8‰OŒçn5áZ7o¶àš·`|Ø­žüáÍö\̵nŸ0Û7ï{&¿s ‡0F¯‰ÔÁÕZ!Oc$ rg ÚG]—Þ!±›Ð8¥ŽÛθ¤1IºÊ4-ÓM¬œa¯ãƒ.þPnF:åò(^ðxMÏ߯ëºß»EÝ÷Áç¾ÏbÏksÎ,çJ5 æºl,Ë ›Vùˆ‚¦%óîT|ß$ÞûBu»¢ÑHîÔÅDßœ¾_ÙRJ»ÚuzS†„ê¯T«ýH¤S8Ò¶‰aâ±Ïò‘/7 Ç0FCôáûsÀQAD"X‹6¨XÂKùÒ8’.¤–'rm1¨9áæ&Šrl ’mF™‹½£;‡ï©F‹× [8Ó€ú¾åÔ}´ V ƒ`gzñä²i¾¸˜‘èK^߯;–ßçƒSº&¥mn“>==0ÌG6µ,Ûžw8‡e1îêV¡YiAVkÁÎtÐÅÅ‹î‘GóqÝ÷AïâÝòb€Ãž ±R»$9çÏ §§u8½cÛ–5gTþ‘+Pü<û'¾Ÿ§DoF¨ ÛÉsd9†Ë6³SÒŒ•CâÞç/—½ty°< ˆs—P—q±`lÇ4b€S×<íÍA—¦1 “pb[Çü + )€<¿®™5Î ©úg4ݯ÷ìÙnAÝnnîÖ¦ßQ÷<€Å7IJl½6²]~Ä«c^‰¶çø~«âáâæ?(5B­øt=ð1&JÕê.7RC†‰6=ûv&3i  {~Ýǂζªó! ÛooTqÕå®”!€kŽÃ˜ ý„îMÍ;ô×b!ˆË}—æïúR‘¦zéðÚDFr¤‚·ziI²Ä.žëâá~°Æû*JF6V />‹ŒëuGˆçprž_MÚmu#ÒšG]ï,ý*xi4«ªW)¬÷©ûCt7» aØØqq½³j‡!Yá‰åW(ŒÕ+¦/L1±nûþ·Û¦»‡PЛ7ñ˜_ø¾Y´Ø•^´›t“äkÁ—Õ ’ª½ÞñR¾”/•v ÁÑöÿ{é-Â'‰ãÖj*6[.‰¢z…s!ë®KJÞï™ÉÌ ODº&ýjUy¹eÙUé]38× =ˆXN¹«_2}?ÚtlÓ~bõ“™lºÞ`+˜ ½FB—š¸ \èm#ô5xuMÅ&qÜÚË/Ö9× ß¯è:UªþËí6Àð¿ZU‘¦{î{jqÅ¢ZÄ5ƒOÈŒ`ßÕ)ÿþŠëºKÔr­æ@EÉ ]ãw°˜óBþ€÷sþ"àƒ½l^Œ^ƒÞ†>0ŽT}& 3Š£ju—E9ô€w^“¹nåE.£ö׉‚Åx?åk:ÕZü¢© €n7¿½óT@«àkÚ'G'É]¹.¸ôŒÏ'à:‡®¡ÇÐûÐÇYëØÇB3¸žPʇöuœÉö ;˜LÏ7"Má 7iYä*¢iœtiLWæE²TÉR.èœ\ÍS”˃åG¶ÄS°MøßzjÔ³â¸VµmsX¡ #ÑY Xʺmš”xšà죥"$×\N>—ãnÏï›&„7ïv1n…G:äÍèp¬Ëų ?‚¥¬¯j¶ÍX×¾"N¨;Ò[²3Hž•zê_' ‹o暸ýÀ×À³œèüe†ÈsOöŠ.ÆÄsv»y…36lŽâûu¬7îPß‘~à'†*ÊÑô¨V§¬fÍ;{dÄSnÝ ¨]‰ç»±¬v¾Ûi²¦~ì—P£-†?ú»Š8Šä&è¥ß벺§0-XýÉ^˜~ åú«¼>¾7Aò8ªâ&p°uÐc|X”Æ2u´ ­Õƒ®j%![sûXœBz£w\׫~ÿbÄøB´Ð:ÅÊ%Ì×^^н‚P®¤Š§¹s×$ç×Uá±GÁG's3êSóëô;GÔb¿Œ’ìyHÔúékJ¿t{K\ùé(ÒºÔDÝ(a¦Šxá° n7ôŠMxS0¼Ò£à¥^¼ õpaŽ™ßsè؈çLó{mûÿÿçî]X98ÈîÞ…¯3É=IF^_שéÀöYm¬ôE“?[€æÉÉŸ@+›üI†oüÏp«ìGmS…ÖâÖðˆ8ZÃÓÛy<€¥v¯ãÁ:Hã*‹Æ˜ = ¹ —ùÁÿµ v3Ã3ËÎ4¤„ù‘áu:ea’g’ɱ€·é®¡ëVDu0bú®"ÔoŽ t‰s@Ls*’ï†ê•«…Ò{ú…pPpƒm@ºU¶ÂÍ‘£-Fe¥n·ÖËî¸ÑñMÄÇ÷I÷ãû8^| ôçGÄp6eQ®"ÇAÛ‰êÙTD3VA3M´²DêQ@¡ÚCo¨Éˆt“C&@ '‘•È[Œ[ 0Ö4Õœn´•0¬[-éùIšKÕ Ò¨âÁt£5¨ª¨EMC÷:–©kÐ’ÒŸn@s©_ÓuMó|-ÆÚšãUL(€ àplìï5[7œª"M\k€‰®­ké Á zPŸ'šà}ØG¯DDÏ¢¯A©¼™ƒHµñ€œÑjƒu &:e±… ‘0MÕŽuˆÁp’£¤$í-j½´&¸Ey /Q)8K±1$jeI8Zâþ cE“XŹAÑÙ]”FQîþ{™Ç~]FaGMÓºí`0\Dz™í0®ãHÁùÕé¨^W1ÄçÖVN´Ò~_c¼°‡ ³‘5ê•°RñëtÚtãΈ~?Ôp}nÍ¢dÆèL£—6/š¦'·<É\ú•I„ùLHqýUï̉¬ð}PӴΘ¦9šÆlÆL›SƒZŽç] ü¸ÕªœM¦ë Žd¼¹X¬jØ,Ô°'ü:6Á´p6àÊ Àý2U…ÚYÓ²©ãœs…ç]ás )¸úÛëÄ!ꢄ‚¥A–gƒX5‹)w†Ë›@ü$¦N"èF2%²Òœ†½Eè%÷~Aû´„òÓÚ/ü2sQ3 “= GÒù…8t¥ /õ ®„ƒcÃ}Æqžq üñ?{C¿á‹€~Böq¯y~9Æý¦÷q†EüúcLŽ¾ïZæ‚¢ €„ŸŒ5¤—&3³µÊtG8¢ÑØÞ™h‡}½{쀈 C°ZbLÞÓ>‚yZ‘B [·”Ë0-°×ï>BÔÇ:|@Æ0+9ÚÛ!˜[Õôþ¾ÎÇÚ";yðÑFC×ë¥TÕTŒV_PV*/™!HlÈFZØ`dž‰ñ([UÑIt=ŒP0…ñˆ¦ˆ{âYä“ç E ú• zf/UL¬s/ã÷ù!)Hóè%Ôué²K‡^v@£lõµ994»ƒÅI{k@pt“ñLµ GX~öÌø/¦¯·ímϲž²ÍCìñZ/5î·Z9^݈Â~ÌÛhˆ6 ú€t Ô1«_NG9q2w “raTÔ{R{ß®¾E¢¨ÕŠ"býöàV(±ÚÙQXî÷këÇ ºm:dÇ2D\Þ ³O̯¢Ý@Èè2%øÙ†Pƒ‹Ðl*˜€G3Áä±À5— =—±Gµ gf¡`Úç͇k“Ÿ]¹búrbšäårfþ0ÁQ¯ÉïP+Äø¨ ‡}!/¸ÖêÊ`ˆõS=®dÞ@ïA»4ÀDrÓv†½´;IÜìmÈ^ë*çW%T¦¡ÇJÌ™é%„Fƒ#ô\™HÅ´$ázCþö¥«.Ó• ØiçœZ‡ÜUfó&]QwÃV<¯Pžtà><çõÌ:H¢.BA\&1ÍÓxâr&O©¡‘¤›j~ñomPôî|çom½kuéóŸÿüç'_ñ®K+ðù¿¢¶Mÿʶö¨óOݳl¸ûä“õk×Þþ?‘]»Ö¿L_eY_%úz¹µ\„æÐô8b=UuëA( ƒ…%É' €°,±gOÂîž99<ákBZÔOÛÞaeEn’E±m±Ÿ>8ìh"½O®*·ÿ€°×‘ àüŽms3|{8o„qHmJ£iFÄd\“%âC­û>|§áà_\¤"ªpãžø(–ëžG0F—Ñ ôBƒt{‰(o3È\Aý‹a²J|UàCšC²!þshe'¥ú ÚÂ%Þ¥ï( žã4T À…Ÿ¹Ü²|¿Z ª¦y–sÏ[ ,‹»™/8@¬ŽãV++¹ünù›G?²šáØþ?ø¶cÔ,ÆXù†#: '‹)9nSê:щ™™VSb†×–lZÖYÏã|-]ˆ—R^wHM':Â1|…'Y§³ rÙ´|Ûqlß2—%äÙèc£%T¢«¶=BU £Ëi˜ÜS âpMC õh4­9ZO•3™@]ȧrÖò‚Îgà£5O‚Q,oØßú­6ÀÆra€'kMÓúKÿCNþFBƒ“ÿ ³Á„“Ÿ1rÀJNG¤Wsì·`lؼÝvjž„þ““ÉN§-áJm„tÞjûŒc”<„žD(Hb"2» aå=àq‚ˆ²Ö@ 7{SiBgŠß×èÃà§3J“m-·ÁX³8¶™g;ÍZ™ v®QìÂF¡Jþ‡äµ'¿ê²Ø—Û@™?Yöötœšüɇ[^ãn€Ú–w^ëá'¹™b}o:€“‚Á&û$» "›ô^ËѤŽ<„À›ò¦f’È‹ò©|è “)8šìÂád7Ëà0Ë&»p0Ù݃£Š8KV1ïv¿¡²KØQ“ÕM•ê02™± ëBG6("­Ñá‡_ë&´\ëŒÆ€ªÍ.ËÇë¡ç¹JèÖ™îtXÁ VVžÎúÏ` ƒA¨fXº®ë”`¨ÇI­l­­¶2)Þ`vÑðÞ8QÄébìÀ•<¶}v¼M“[®ª‡²?Axùmd‹šHuc ”RËbyÜCˆû[\Xž©}•›ºŸ758Gï£æz:,¾cäóÅ¥ŸÀä"Tk(tÇŸ”¾sÇ®´Û±ípΤǢ×÷ß;O96J n;–ÅÓ{$l¡ç¡7Ï?À‹×n«2]¦š2¡Û„ÃÈ~Â"¬Ë5*g*É–píÀ¯ÕüÀâÂóìzÖþWsÆlNt¾Ë‰æ¶‰}Çkqð]W#Ü!ü Óî"z£ç9`–ãy®àsá¾…1Ž±¦sN:šË‰U{[[„»Z‡pWÓ±V™‹ðt?Fè1ôZn˜OD]U*‘W•Ÿ ™È;ÆùjÏ‹Už,Ö@JûÕO†R‰ýŒ _ý`%ì÷G¬>79. mô$zŠ pA¹§©Qœl6%5\ÄÒ‚ˆErF¬4çÄrÉ*@¿QœZ[#ÿíM²€¶ÿ«¾Sw9.,E!v 9ÔïÃ*Â$±ÿõ̼²ÙŽîeµáyü!ò£ +dPrÔ?%.¡ÇÑ+‡tÐ+AÒ!/:~ú½ßmQª¹Õj§S­º¥V·ßïö¸é?ƒ¾S3 «áyž×° Câ;Ǽ{gÍN¡º€®¡]ôÚȇÁVds¿Ì0¿µ&q>L¢|˜D§°‰:’FÑû•ž»5DŒMfw…¦Ùïtv;Ž ùÜ=(ƒ¶S}%@€~¼xƒY“eÿò(B*E·ýâŒJäX$õw˜QÄ5®B 鿺¥òÃÞxŠ3Fƒv»×k·ÊL1¿´4ÿKŸ?.cÆ܆ïy~Ãe Ûö o‹:ÿ g§Ú`GÅ*¢ñÓŽ¬á.#@þÅÞ!‡Æv/z%åx½*nÇFÀ6ªÌÃ=çMèÛn«,¯ÈÈt£ÓlEÉ*&3˜—š’tòAúßœñ_bïÀ:áœs¢cÍ E¥"$D;Lp=bl&bhsºnÆ:q\¢c :`Òˆ"Œ£¨AN!×ùü:ºŠžÐk!ô÷+É9“DþéùR™õ¨¤Äºi’tqÓΣØö(J­HŠ jáT§3]ÅÊáôw±*Wq¾<˜^bI~0Qq6È¢|¯Bú/Ê*ÀËÁBLÛ¢`€ËCJn­_IûϹÜu«ÞY˜S§v.—ã2Æç—–æ…Ù5•ùúbSiÕ‡ ¾ˆpVwOVbAˆ%¥°ÌÐåøáþkÂ×׫X4ô…ò'„/œ'Äw còÛ}˜T jøŠ"W¤¨„Æ‹=çyèîÍQñ@áÇa Aˆ{¶,ÚØ'΢ä<‘BAC<Ýà”hág8¡šîØ\êºcó·ê’ÛŽ®Ñ³/KžF(wGo|ѧtÇæg¸æéŽÍ9¡š!9%ZEê:%œÛŽîiüÌó›÷œ§ÐënD]Œê^48vÇF(`l±A ¼Ä*Êë)û1Ó|ŒD›žÖˆAaçeˆÜ6ÍÛÄ ½Ú¼¿)ÓÓ3MÓ¨¡ÍÍiÕ4ÍÒõßéÌ0“t DóµY€ÐEôz z?Z9]äˆC ínÃŽ FN:-<ËÕaì¿ÀäÜ]¤EIŠœ7{Êl•Æ\›‹°:Ï&¨¨ é š§»(‹(rz”E¹‘b<ŸáS" …àn£é[˜R{rxæÁ‡®`làÍ­­rHé¬ç›tÖ²7àýtÓÜ•®mn=°r!¾”9®N-V¯w»]n/™Ž'ÿþ<‹­©bhdE× ôG×aò'oò/‚»Fð .h†>Ï…CaSŠ-¿Ùp×7lk–š¾7KIQnmmbã+=xæÔ&$¹% dÿ|}ÒáÝn·^gÕ—ÅÉt¯×Ô±žGš¾B4ƒíóš¾jüÝá&„=Ÿ6&/~þ¹h/ìVÉ®;3,°¦ !eCNã"ÎÜÇp ˜Œ[µ+Vìrf/aÃÀ^Ϭ7(èºÞíêºNë:`£ç¦ƒ^§ŸÊÒÑçौq£öWæ·F×ÃÐê3†¦aßÇšfôjša€Ñ=ûÎQf©ËFm ×ä0S¶Ñz?úâ/‹©ØÔNÃp‡ñ¦uDìWÚi¹´`2EH-¤™ˆäûÝd¾”ÌåC«$Ò¥©‰Vô,ËðíhŽ¨Šiy¯fEAòM˜Ê”° ýSS‡OMõ d„ÆÊ¥ååR9ö‘£Õ1SÓµPh¹V¯×–C!M×̱êÑ?š–e7ŒPÄP©à%äÇ„T¥D·B)F4,˼Oïzäª*ž/NÎñ>²lè\žs]B\wNæºÎäé#ø4‰ÑLö #Tº65MéôÔ5‰ù@6Cÿ÷í !ºÙÑaÆ$™ªV<4Ý^>ÁxÜR ‘%Æ„ÑÑaê„å^ûEUUß âGPYtÅ4æq °"Q"p®Ã&å‹ æº`’IÍJ[[Ž¬48À"W †tk'_Âzõõ•e] ß Uš.—ûúÈÀI‚ÍÑk™éfÑNj1IU%fÑNò±+‹Ž6“ÏwRÐÌäÕÐKF°+ŸŸHcÇÍ~ƒÄø_HuRb©ªEhgj§Êsû6c#y{ÄØ•ÆR5<‹#fª¢ßRý¬…”÷Ÿ0)KâB›Ú·JãB¶R·¡>gB:y "8ëûäOÒ83q\JœkCqû7[‘Kn*« Û™L–eM’$!¶ þ¿?—‡$ÇLìb'p7áã @ªâ,KO¡¢{–³.²d°â /ðÖéI_5dSß‚‹˜]VËû5ÂèHCè›DQ$=ÊbÌŽ’Ëíàú¦â+±Š—¥¼f×CªaèA»¯o¡(~“¢v'Ä ]7âqSו°"Ô(%v^rû¹ÐÿÉìÅÞ—ª bÕ™N«ËjÕ\Âœ{[œŠæ"µü·AR2«r¸ì;çkAUÌêz¿‡œGã¶È€{E2ò·BGì©~ú; …˜¯àÁaË\da#?úœêJ‹«dƒ¢9þžD`±\(äÞ{Ý3¸ŒK^è:l‘v<·¹H«hzUª‘h.Q [*çò#¬KK^Ê—tÚâ< +£ Ù:^2r§û&ð}ØMªw–xª‹¯‘´[”f·E)ë{ÌŽõÕI§˜ɨÇe4T°n–\ rEúDÿµ-eŠ‡%—(«jÆb¼‘Ri„Æb´7–ò0î}R9¨•)ëx…–ÎÄN¤@1°ÙÐNŒÒسm{6 q]+P¦Q×í¹•õ*I½¦‰W‘‹‘òèóùãïLE‹8Ž:| êÕêS[8‘ÈH@:ƒÑÅpQzuîÕ¼¾IÐrXtƒvdG"v¬ø¦x$ª¨DºAé7u ƃrÀNÐ0I}=Ûo…t3³ë'†ªú ý­©ªÓì;!¥ÚmE¹wGtÃÐ#P×´÷„潦¾W7­ÐÁ騤/åר#¸/^#ÿù †[hÇ_÷ØÃ¥¯º &Žé{òYùyò®ü+f°[ì7<Æ·ù›ø_Ĉ¸(^%¾¢@))uåAÊÛ”¨9uCýˆ¦iOÑÞ¦ý, Û§vƒ‘àÙà'ô^ý1úŒ—1‡ÌG…”ÐB? ßϳ~ÑQïøZ¤7²¹'º}Sìlì}ö€ýƒ=Ïê<Þ¥tÝêúL\‹_Œÿ¨{­ûS}´¯Þ÷ç¼óŸþÇ%ž–øA²–|Zò{_’Ú›ºWê3®ãÖÝ{Ò±/ ÖŸ3zÉðÂðF"#ùÇè24³•ù^ö>Ùwå®ç‘÷ó(<­è”N—žQú[ùhù5•ãUT_7Ö=ö‰ñ'M\žøÞäáÉWMuM=`êcÓ½ÓO˜þÇÌÃfWgß5wzî{ó·æ°pqá oX´?µt|éKË•å×ÔzkOÙÇ÷-íûÜþÂþO˜:𩃕ƒ9tøÐÖáß;ò°£¥côØ‹Ž_?þ¿/8¹sjçôÈ鯹çìcνç|ëÂØÅÐÅ7]zÅåo\ùÓÕÇ]»~_Ñ çÆŸêÏ[9¸:´ê{Š÷6@Œ xêR]x£{Äñ£ý6 G·IèÇk¢rº6†FÚ8öà*ÓÞÏ6|k ÀƧÛBèÀ ?ÇXˆ¬(Ñžý6‚ ýP…AÍ6 ôDTþÐÆ°JδqäÈ»Û4œÇÛÈЧ¶…à’_þ§ àæé5ϹãÕÓmg³Ùöíæöí-§±ÒÜrÚžïÜØZuüfsc½ágÎz­v£¹åT«…L.?^.æ eg ÖÜòù;^»¹é9;^«ÝhnM8•L)S¬5·üù;^»¹éUj-Ï=éݼ½q£UknùÎü¯ÝÜôœŠSkyÞɳÁbsûÞ­ÆÍ5ßXtÒ»Ÿî<ä\F+™R¦°æûÛí‰lö®æ–ãíÀfVš›÷5Nc ܇:ÒhÃÁ&šïZ¦í`û]ÍœímlàZpÐÀ šØ‚ƒ6¼T§ç¶° >šhbëhÀGgá½K“zã>§¯Š* È ‡<ÆQFyP†ƒÔÒ¹>Ì¿·&6_Y|ç‘ò'à ‚ JÁÁû*¾Ì\A -xð0Š“ðpó>WGÎŶøÎvº÷F wóù¯Ú^Áོöž«œó ££×7õ|øØFÈ"‹»5~ãµ³L‰¬ŠÍ然üassets/css/font-awesome/webfonts/fa-solid-900.ttf000064400001402654147600374260015641 0ustar00 € OS/2aKbK(`cmapÚ … DH‚glyfÀöspuˆ?Dhead&€'<¬6hhea;¨ä$hmtxñÂNˆ¼loca Ð_ÈÀmaxp†" nameT_6´Ìípost@­Ùú¸¼Lî’†~š_<õ àîðßàîðßÿÀ€ÀÀÿÀ€ÿøÿø€oo „LfGLfõ„ AWSM€!ÿÿÀÿÀÀ@9¥ €@ÿøÀ@€€À@@@€@@@@@€À€@€@€€@@À€@@@@ À€À@À@@€€€@€€€@@@ @ €€@€@ €€€€@ @€€€€À"À"À€€€€€€ÀÀ@@ÀÀ@@€À€@€ ÀÀ€ À @€@€@€@@@€€€€€€€À€€€€@€€@@À€€ @@@€ €@À€@€€€€€€@€€@@@@€€ €€À@@ @ €@€ € € € @À@€€€€€@€@€€€ @ €€@€À€@@@@@@€@€€€ @€€ €€@@@@@@@@€€€€€@€€€€€€@@@€@€ €€@€€€@€€€@€€@€€@@€€€À€À € @@@@@@€@@€@@@ @€€€@$€€€€@@@@@@€€€€ € € € €€€€€@€€ÀÀÀ€€@@@€@@@€@@@€€€€€€€€€€€€ €@€@@€€À@ÀÀ€ € @@ @ÀÀ@À€ÀÀÀ€À€€@ÀÀÀÀÀÀÿúÀ@€€@€@€@À@@@ÀÀ€€ÀÀÀÀ@€@ÀÀ  @@@@ €€@€@ÀÀÀ@À€€€€€ÀÀÀÀÀÀÀ€@@@@@@@À@@€À€€À@ À€€€€ ÀÀ @À À @ @@À À €À€ÀÀ€@À@€@ÀÀ€À@'€€À@ÀÀ€À@À€€ÀÀÀ@ÀÀÀ@@À@€€€@'@'@@@'@'€ € @@€À@€À€€€@@ÀÀ€€€€€€€€ÀÀ ÀÀ €€€€À@ À@ @@€@ @À@@@À€€À€`€€€ @€ €€€€€ÀÀ@@@@@@@€À€€€€€À @ À €€   À@ @@À@ @€€@ €À€ @€@@@@@@ÀÀÀÀÀÀ @@@@ €À€À@€€@€€€€€@€€ÀÀ@@ÀÀÀ@À€€@€@€À@€@€€@À@€€À @@€@€€€€€€€€€€@@@@€€ €€@À@€€€@€À€€€€€À€€À€€€À€€€@@@@€€€@€ ÀÀÀÀÀÀÀ@@@@À€€@À@€@@@@ÀÀ@€€€€€@€€@À€@€À€ÀÀ@€@€€@€€€@€@@€À@@€€@@€À€€À€€€@€8€@@€À @À@À@€€@À€@ €€@@€@€€@@À€€€€@@@À@€ €€€€ÀÀÀ €À@€€€@@À@@À€€€À@€À €@€€€@@€@€€À@À€€€À€@€€À€@À€€€À@@À @ÀÀ@€€€ÀÀ €@@À€€€À@€€€À€@À@€€@À @@À €ÀÀÀÀ€€ÀÀÀ@À€€@'@'@@@'@'@€€€€€€$~$ ~Z   !%+9Zabcdefghijklmnopqrstuvwxyz£¥©«®¶»×÷    9 : ¤ ¨ © ª ¬ ´ ¸ ½!"!!‘!’!“!”!•!—!º!»!Ä""####(#)#*#+#™#Ï#é#ê#í#î#ñ#ó#ø#ù#û#þ$½% %¶%Ï%Ð%û%ü&&&&&&&& &"&#&%&*&,&.&/&8&9&?&@&B&Z&[&\&]&^&_&e&f&r&z&{&~&€&&‚&ƒ&„&…&“&–&™&›& &¡&¢&£&¤&¥&¦&§&¨&©&ª&«&²&½&¾&Ä&Å&Æ&ß&é&ê&÷&ú&ý''''' ' ' ' '''''''''!'1'D'F'L'N'S'T'U'W'd'•'–'—)4)5+ +++$+Pàà ààAàvà†à˜àšà©à¬à´à·à»àÏàØàßàäá1á<á@áRácáiámá{á…áá›á¨á°á¼áÄáÈáÓáÕá×áíáóáöáþâ â"â-â=â‰âœâ·â»âÅâÊâÎâæâëãã¯ã²ãõä<äEäHäläsäwä{ää”ä¥ä­ä°ä³äÌäÞäæäëäíäîåå%å/åOåXåoåtå‡ååšåå¡åªå¯å´ðððððððððððððððð>ð@ðDðEðFðNð[ð\ð]ð^ðfðgðhðiðnð~ð€ð†ð‡ðˆð‰ðŠð‹ðŽð‘ð•ð–ð—ð˜ðžð¡ð¢ð®ð²ðÎðÑðÞðàðãðäðåðæðîðôðõðöð÷ðþñññ ñ ñññññññññ"ñ#ñ'ñ(ñ)ñ*ñ.ñ5ñ:ñ>ñFñGñNñTñUñYñ^ñeñxñƒñˆñŽññ“ñ•ñ–ñ—ñ™ññ®ñ°ñ±ñ³ñ»ñÉñÎñØñÙñÚñÛñÞñæñìñöñ÷ñùñúñþòòò òò-ò6ò9òIòJòNòPò]òlòwòxòzò{òƒò‹òŒòòŽò‘ò’ò•òšòœòžò¤ò¨ò¶ò·ò¹òºò»ò¼ò½ò¾òÀòÂòÃòÎòÓòÔòÜòåòçòêòíòòòöòùòþóó óóó(ó2ó8ó[ó]ó`ócóó‚ó‡óó¥ó¿óÁóÅóÉóÏóÑóÝóàóåóíóûóýóÿôôô"ô$ô%ô4ô6ô:ô<ô?ôAôCôEôGôKôNôPôSôXô]ô_ôbôfômôrôtôyô}ôô‚ô‡ô‹ôŽô”ô—ôžô¡ô­ô³ôºô¾ôÂôÄôÆôÎôÓôÛôßôãôæõ õ+õ,õ0õ1õ5õ6õ@õAõ‘õõ¢õ§õ±õ´õ¸õ½õÅõËõÎõÒõ×õÚõÜõßõáõäõçõëõîõýööööööö!ö%ö*ö0ö7ö<öAöDöGöJöOöQöUöXö^öböfökömöoötövöyö|öö„ö‰ö–ö›ö¡ö§ö©ö­ö·ö»ö¾öÀöÄöÈöÏöÑöÓöÕö×öÙöÞöãöæöèöíöòöúöü÷÷ ÷÷÷÷÷"÷)÷+÷/÷=÷@÷C÷G÷M÷S÷V÷[÷_÷i÷l÷p÷s÷}÷÷„÷ˆ÷Œ÷”÷–÷œ÷ ÷¢÷¦÷«÷®÷¶÷º÷½÷À÷Â÷Å÷Ê÷Î÷Ð÷Ò÷Ú÷æ÷ì÷ï÷ó÷õ÷÷÷ûøøø ø ø ø øøøøøø*ø/ø>øJøLøPøSø^øcømøyø}ø‚ø‡ø‘ø—øÁøÌø×øÙøåøïøÿÿÿ!#*0<abcdefghijklmnopqrstuvwxyz£¥©«®¶»×÷    9 : ¤ ¨ © ª ¬ ´ ¸ ½!"!!‘!’!“!”!•!—!º!»!Ä""####(#)#*#+#™#Ï#é#ê#í#î#ñ#ó#ø#ù#û#þ$½% %¶%Ï%Ð%û%ü&&&&&&&& &"&#&%&*&,&.&/&8&9&?&@&B&Z&[&\&]&^&_&e&f&r&z&{&~&€&&‚&ƒ&„&…&“&–&™&›& &¡&¢&£&¤&¥&¦&§&¨&©&ª&«&²&½&¾&Ä&Å&Æ&ß&é&ê&÷&ú&ý''''' ' ' ' '''''''''!'1'D'F'L'N'S'T'U'W'd'•'–'—)4)5+ +++$+Pàà àà?àYà…à—àšà©à¬à´à·à»àÏàØàßàãá1á9á@áRácáiámá{á„áášá¨á°á¼áÄáÈáÓáÕá×áíáóáöáþâ â!â-â=â‰âœâ·â»âÅâÊâÍâæâëãã¯ã±ãõä<äEäGäläsäväzää”ä¥ä¨ä¯ä³äµäÎäàäèäíäîäïåå'å2åQåZåqåvå‰å‘åœå å©å¯å´ðððððððððððððððð!ð@ðAðEðFðGðPð\ð]ð^ð`ðgðhðiðjðpð€ðƒð‡ðˆð‰ðŠð‹ððð“ð–ð—ð˜ðœð ð¢ð£ð°ðÀðÐðÖðàðâðäðåðæðçðððõðöð÷ðøñññ ñ ñ ññññññññ ñ#ñ$ñ(ñ)ñ*ñ+ñ0ñ7ñ=ñ@ñGñHñPñUñVñ[ñ`ñuñ‚ñ…ñŽññ‘ñ•ñ–ñ—ñ™ñœñ«ñ°ñ±ñ²ñ¸ñÀñÍñØñÙñÚñÛñÜñàñêñöñ÷ñøñúñûòòò òò!ò3ò8ò@òJòMòPòQòlòqòxòyò{òƒò‹òŒòòŽòò’ò•òšòœòò ò§ò´ò·ò¹òºò»ò¼ò½ò¾òÀòÁòÃòÇòÐòÔòÛòåòçòêòíòñòõòùòþóó óóó(ó2ó7óXó]ó`óbóó‚ó†óó¥ó¾óÁóÅóÉóÍóÑóÝóàóåóíóúóýóÿôôô"ô$ô%ô2ô6ô9ô<ô?ôAôCôEôGôKôNôPôSôXô\ô_ôaôfôhôpôtôwô}ô~ôô„ô‹ôôô–ôžô¡ô­ô³ô¸ô½ôÀôÄôÆôÍôÓôÖôÞôâôæôúõõ,õ-õ1õ2õ6õ7õAõBõ“õŸõ¤õªõ³õ¶õºõ¿õÇõÍõÐõ×õÚõÜõÞõáõäõçõëõîõüööööööö!ö$ö)ö.ö7ö;öAöDöGöJöOöQöSöXö]öbödöiömöoötövöxö{ööö‡ö–ö˜ö ö§ö©ö­ö¶ö»ö¾öÀöÃöÈöÏöÑöÓöÕö×öÙöÝöâöæöèöìöðöúöüöÿ÷ ÷÷÷÷÷"÷(÷+÷.÷;÷@÷C÷G÷M÷Q÷V÷Z÷^÷i÷k÷o÷r÷|÷€÷ƒ÷†÷Œ÷“÷–÷œ÷Ÿ÷¢÷¤÷©÷­÷µ÷¹÷½÷¿÷Â÷Ä÷É÷Ì÷Ð÷Ò÷×÷ä÷ì÷ï÷ò÷õ÷÷÷úøøø ø ø ø øøøøøø'ø/ø>øJøLøPøSø^øcømøyø{øø„ø‘ø—øÀøÌø×øÙøåøïøÿÿÿÿàÿßÿÛÿ×ÿÕ + % !õÞÐÀ¿±¯¨¦£‡~2+(ÿòêá×ËĹ²¯¥¤£Ž‰‡€v_UFûéÏÌÿ½¦¢pàßWON+%#!  úø÷õôóòñðïìëéèçæåäãâàÙÕц…„ƒ‚~|zxwutsrqpnlkjihfcba`SRNMLIHEDCBA;:987654210/.-,   ùø÷óïìãâáàÝÔÓÒÑÏÍÂÀ»º´±¯¡œŒ‹‰~|qonmjfe^VUSQNLJFC@10'úù÷öÔ̸ Ÿœ™–•Šˆ„}qnh_NM@?=<:9876310.*'&%"! ü÷óñðïîèäâàÞȽ¼»º¹¸·¶´³²±°¯®­©§¦¥¤¢ ›Ž‹‰~|wrqolic`\ZXVRQPNJGFDCB>=<;986*)%    ÿ þ û ø ö õ ò ð é è æ Ü Û Ö Õ Ï Ì Ç Æ Ä ¹ · µ ² ­ ª ¨ ¥ £ š ™ — – Ž Œ ‹ Š ‡ € { y x w u t n l j i h g d c b a ] T O M K J I G A ? : 9 8 6 5 1 ( $    û ÷ î ã â ß Þ Õ Ð ¨ ž ” “ ~ o¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬<>\„PªÜÜ6 $@ð^¸º¶¸zz‚΂ά¬ÜÜ8⎎ r„~t|nL"nnRæn–`¸VŽŒÔ„¨œ´œx˜’pxrrxj’ÎÈÈ*.."$$´¤¢ 8*.*""j¸ò,"<žžž”œ’ššHF–tÞ:$*è,ò2 || æ⢠ žäìJ‚€’zJH42~8¸´ˆ„t–”ælÈЮ 8¢¦¶¶:4  j´rº’†Š4ÒÜ@¨<jj2dÚÄŠ¶úöRÔzHr†z|€ÈæxvBD¼fdb`t\|`œœföHøœpnf\žŠš4 !"#$%&'()*+,-./ž‰Š‹‘”–—œ ª«¬¼ÁÂÃÄÅÆÇÉÊËÎÏÐÔÕÖ×Ûâæìíôõ#-.0567;=CDEHIJKOPRTWouwz}‚ƒ„…†‡ˆ‰‘˜™Ÿ¦«»¾ÃÊÌØÛáâãäåæçèéêëìýÿ    %'()*,8:;<>@FPQRSTUW\^_ioswyz{|}ƒ‰–©Úàáâãäåæëï`a”–ž¤¥°·ÂÃÆÉÌÐÙâêöý $&-247 0ÿ!!#%*+09<Zaabbccddeeffgghhiijjkk ll!mm"nn#oo$pp%qq&rr'ss(tt)uu*vv+ww,xx-yy.zz/££ƒ¥¥…©©Ì««D®® ¶¶¾»»E×ב÷÷æ  Û  O  P 9 9H : :I ¤ ¤Ÿ ¨ ¨„ © ©‡ ª ªØ ¬ ¬‚ ´ ´â ¸ ¸4 ½ ½†!"!" !!Ô!‘!‘Ö!’!’Õ!“!“×!”!”P!•!•Q!—!—W!º!º.!»!»œ!Ä!Ä5""Û""ï##J##K###(#(W#)#)Ê#*#*Ë#+#+#™#™«#Ï#ÏÉ#é#éÆ#ê#êÂ#í#íÇ#î#îÁ#ñ#ñ@#ó#ó#ø#øÄ#ù#ùÅ#û#û”#þ#þ™$½$½–% % %¶%¶Ã%Ï%ÏR%Ð%м%û%û%ü%ü&&˜&&&&2&&ý&&z&&$&&& & ê&"&"&&#&# &%&%ž&*&*Â&,&,°&.&.·&/&/É&8&8¥&9&9T&?&?ã&@&@á&B&Bâ&Z&Zy&[&[|&\&\}&]&]w&^&^z&_&_{&e&e‰&f&fÛ&r&r«&z&z«&{&{«&~&~ï&€&€â&&å&‚&‚ä&ƒ&ƒá&„&„à&…&…ã&“&“o&–&–ÿ&™&™–&›&›& & â&¡&¡0&¢&¢æ&£&£ç&¤&¤è&¥&¥ä&¦&¦é&§&§å&¨&¨ê&©&©ë&ª&ªR&«&«R&²&²ì&½&½Ã&¾&¾s&Ä&Ä2&Å&ÅÐ&Æ&Æö&ß&ß#&é&éÆ&ê&êÚ&÷&÷-&ú&úÌ&ý&ýë''''''''z' ' -' ' Ù' ' ' '  ''F''a''`''''''‘''‘''¤'!'!Ã'1'1'D'D:'F'F:'L'L‘'N'N8'S'S'T'T'U'U'W'W'd'd‰'•'•'–'–Û'—'—æ)4)4_)5)5^+ + Q++ƒ++ƒ+$+$R+P+PŠàà0à à 2àà3à?àA4àYàv7à…à†Uà—à˜WàšàšYà©à©Zà¬à¬[à´à´\à·à·]à»à»^àÏàÏ7àØàØ_àßàß`àãàäaá1á1cá9á<dá@á@háRáRiácácjáiáikámámlá{á{má„á…náápášá›qá¨á¨sá°á°tá¼á¼uáÄáÄváÈáÈwáÓáÓxáÕáÕyá×á×záíáí{áóáó|áöáö}áþáþ~â â â!â"€â-â-‚â=â=ƒâ‰â‰„âœâœ…â·â·†â»â»‡âÅâňâÊâʉâÍâΊâæâæŒâëâëããŽã¯ã¯ã±ã²ãõãõ’ä<ä<“äEäE”äGäH•äläl—äsäs˜äväw™äzä{›äää”䔞ä¥ä¥Ÿä¨ä­ ä¯ä°¦ä³ä³¨äµäÌ©äÎäÞÁäàäæÒäèäëÙäíäíÝäîäîžäïåÞåå%óå'å/å2åOåQåX9åZåoAåqåtWåvå‡[å‰åmå‘åštåœå~å å¡€å©åª‚å¯å¯„å´å´…ðð†ðð-ðð‰ððŠðð‹ðð“ðð>ðð—ððˆðð˜ððRððUðð›ððuððœð!ð>ð@ð@FðAðD»ðEðE}ðFðFzðGðN¿ðPð[Çð\ð\Îð]ð]Ïð^ð^Óð`ðfÔðgðgðhðhÛðiðiðjðnÜðpð~áð€ð€ððƒð†ñð‡ð‡ðˆðˆ‘ð‰ð‰õðŠðŠ‰ð‹ð‹öððŽ÷ðð‘ùð“ð•ûð–ð–ð—ð—ªð˜ð˜þðœðžÿð ð¡ð¢ð¢;ð£ð®ð°ð²ðÀðÎðÐðÑ"ðÖðÞ$ðàðà-ðâðã.ðäðä–ðåðåæðæðæôðçðî0ðððô8ðõðõ<ðöðö‰ð÷ð÷¦ðøðþ=ññDññ\ñ ñ Lñ ñ Rñ ñOññQññiññìññíññSññ ññXñ ñ"Yñ#ñ#õñ$ñ'\ñ(ñ(ñ)ñ)`ñ*ñ*ñ+ñ.añ0ñ5eñ7ñ:kñ=ñ>oñ@ñFqñGñGwñHñNxñPñTñUñUñVñY„ñ[ñ^ˆñ`ñeŒñuñx’ñ‚ñƒ–ñ…ñˆ˜ñŽñŽTññSñ‘ñ“œñ•ñ•Ÿñ–ñ–Cñ—ñ— ñ™ñ™¡ñœñ¢ñ«ñ®¤ñ°ñ°¨ñ±ñ±;ñ²ñ³©ñ¸ñ»«ñÀñɯñÍñιñØñØ»ñÙñÙ»ñÚñÚ¼ñÛñÛRñÜñÞ½ñàñæÀñêñìÇñöñöÊñ÷ñ÷ÊñøñùËñúñúñûñþÍòòÑòòÓò ò ×òòÙò!ò-áò3ò6îò8ò9òò@òIôòJòJýòMòNþòPòPòQò]òlòl òqòwòxòxòyòzò{ò{©òƒòƒò‹ò‹òŒòŒòòòŽòŽòò‘ò’ò’ò•ò•òšòšòœòœÐòòžò ò¤ò§ò¨#ò´ò¶%ò·ò·'ò¹ò¹(òºòº(ò»ò»)ò¼ò¼)ò½ò½*ò¾ò¾*òÀòÀ‹òÁòÂ+òÃòÃ,òÇòÎ-òÐòÓ5òÔòÔoòÛòÜ9òåòå;òçòç<òêòê=òíòí>òñòò?òõòöAòùòùCòþòþDóóEó ó IóóMóóNó(ó(Oó2ó2¬ó7ó8PóXó[Ró]ó]Vó`ó`WóbócXóó6ó‚ó‚7ó†ó‡Zóó\ó¥ó¥]ó¾ó¿^óÁóÁ`óÅóÅaóÉóÉbóÍóÏcóÑóÑfóÝóÝgóàóàhóåóåióíóíjóúóûkóýóý”óÿóÿmôônôôoô"ô"pô$ô$qô%ô%%ô2ô4rô6ô6uô9ô:vô<ô<xô?ô?yôAôAzôCôC{ôEôE|ôGôG}ôKôK~ôNôNôPôP€ôSôSôXôX‚ô\ô]ƒô_ô_…ôaôb†ôfôfˆôhôm‰ôpôrôtôt’ôwôy“ô}ô}=ô~ô–ôô‚˜ô„ô‡šô‹ô‹žôôŽŸôô”¡ô–ô—¦ôžôž¨ô¡ô¡‰ô­ô­©ô³ô³ªô¸ôº«ô½ô¾®ôÀô°ôÄôijôÆôÆ´ôÍôεôÓôÓ·ôÖôÛ¸ôÞôß¾ôâôãÀôæôæ%ôúõ Âõõ+Òõ,õ,õ-õ0éõ1õ1õ2õ5íõ6õ6õ7õ@ñõAõAõBõ‘ûõ“õKõŸõ¢Võ¤õ§Zõªõ±^õ³õ´fõ¶õ¸hõºõ½kõ¿õÅoõÇõËvõÍõÎ{õÐõÒ}õ×õ×€õÚõÚõÜõÜ‚õÞõ߃õáõá…õäõä†õçõç‡õëõëˆõîõî‰õüõýŠööŒööööŽöööööö‘ö!ö!’ö$ö%“ö)ö*•ö.ö0—ö7ö7šö;ö<›öAöAöDöDžöGöGŸöJöJ öOöO¡öQöQ¢öSöU£öXöX¦ö]ö^§öböb©ödöfªöiök­ömöm°öoöo±ötöt²övöv³öxöy´ö{ö|¶öö¸öö„¹ö‡ö‰½ö–ö–Àö˜ö›Áö ö¡Åö§ö§Çö©ö©Èö­ö­Éö¶ö·Êö»ö»Ìö¾ö¾ÍöÀöÀÎöÃöÄÏöÈöÈÑöÏöÏÒöÑöÑÓöÓöÓÔöÕöÕÕö×ö×ÖöÙöÙ×öÝöÞØöâöãÚöæöæÜöèöèÝöìöíÞöðöòàöúöúãöüöüäöÿ÷å÷ ÷ ç÷÷é÷÷ê÷÷ì÷÷í÷"÷"î÷(÷)ï÷+÷+ñ÷.÷/ò÷;÷=ô÷@÷@÷÷C÷Cø÷G÷Gù÷M÷Mú÷Q÷Sû÷V÷Vþ÷Z÷[ÿ÷^÷_÷i÷i÷k÷l÷o÷p÷r÷s÷|÷} ÷€÷ ÷ƒ÷„÷†÷ˆ÷Œ÷Œ÷“÷”÷–÷–÷œ÷œ÷Ÿ÷ ÷¢÷¢÷¤÷¦÷©÷«÷­÷®!÷µ÷¶#÷¹÷º%÷½÷½'÷¿÷À(÷Â÷Â*÷Ä÷Å+÷É÷Ê-÷Ì÷Î/÷Ð÷Ð2÷Ò÷Ò3÷×÷Ú4÷ä÷æ8÷ì÷ì;÷ï÷ï<÷ò÷ó=÷õ÷õ?÷÷÷÷@÷ú÷ûAøøCøøDø ø —ø ø ø ø —ø ø GøøHøøJøøKøøMøøNø'ø*Oø/ø/Sø>ø>TøJøJUøLøLVøPøPWøSøSXø^ø^YøcøcZømøm[øyøy\ø{ø}]øø‚`ø„ø‡bø‘ø‘fø—ø—gøÀøÁhøÌøÌjø×ø×køÙøÙløåøå øïøïmøÿøÿnññúóóó ó ó ó 5óó6óó7óó óó™ó!ó!/ó&ó&øó'ó'öó)ó)ó*ó*ó-ó-Hó1ó1ºó2ó2®ó6ó6LóKóKüóNóN~óOóO~óhóhIójójótót<ówówÁóxóx4óóÝó‚ó‚Ïó“ó“£ó—ó—¸ó™ó™bóžóžŒóŸóŸvó§ó§¡ó¨ó¨ùó­ó­™ó²ó²ßóµóµ‡óÀóÀtóÁóÁXóÂóÂ1óÃóÃèóÅóÅYóÆóÆúóÈóÈóÊóÊtóÍóÍÞóÐóÐ…óÓóÓ„óÔóÔäóÖóÖyóÙóÙ¡óÛóÛ±óàóà—óâóâ¦óåóå=óèóèLóëóëóôóô ó÷ó÷§ôôÑôôÍô ô ÕôôàôôÔôô1ôAôAàôMôMôNôN‘ôQôQÞôUôU ôdôd‹ôeôeÈô{ô{Úô€ô€ô‰ô‰ ôŽôŽ]ô”ô”ô™ô™‰ôšôš‰ô›ô›‰ôœôœ‰ô¡ô¡4ô£ô£Âô§ô§½ô©ô©Dô¬ô¬©ô°ô°Nô²ô²ô³ô³ô»ô»Lô¼ô¼ô¾ô¾ô¿ô¿ÜôÀôÀÜôÁôÁìôÂôÂíôÄôĈôÅôÅhôÆôÆhôËôËOôÌôÌ÷ôÍôÍôÎôÎôÏôÏþôÔôÔ©ôÖôÖÕôÜôÜéôÝôÝMôÞôÞýôßôßKôàôà¥ôáôá)ôâôâôæôæˆôðôðÇôñôñdôöôö•ô÷ô÷ñôûôûkõõåõõYõõ?õõ£õ õ ¤õ õ ôõ õ Æõ õ ˆõõòõõŸõõÿõõ;õõÊõõªõõõõõ%õ%ßõ'õ'õ(õ(Ûõ,õ,Žõ4õ4Rõ5õ5RõGõG¤õIõIµõJõJ­õKõK¯õLõL´õMõMÄõNõNÜõSõS˜õkõkõnõnÕõqõqêõuõuÝõwõwìõ{õ{ýõ}õ}\õ‚õ‚-õˆõˆ÷õŠõŠGõ‹õ‹`õŒõŒÎõ•õ•Eõ–õ–õ¤õ¤‰õ¥õ¥\õ¨õ¨«õ©õ©Éõªõªõ±õ±jõ´õ´õ¶õ¶«õ·õ·¥õ¸õ¸Üõ¹õ¹‰õ»õ»´õ¿õ¿ìõÁõÁíõËõˈõÎõΉõÕõÕ6õÖõÖ5õØõØõÙõÙ‘õéõéæõêõêôõúõúöö9ööRööAöö:öö;öö<öö>ö ö ¼ö ö jö ö =ööUööNööPööOööBööDööCö ö ö"ö"gö&ö&3ö+ö+wö,ö,8ö-ö-fö.ö.rö3ö32ö6ö6ZöBöBSöDöD[ööîö†ö†òöŠöŠ…ööÖööhö‘ö‘>ö–ö–­ö—ö—†ö˜ö˜¬öšöš#öœöœîö¡ö¡7ö¢ö¢Üö¦ö¦šöªöªçö«ö«Óö¬ö¬Ÿö­ö­ö°ö°1ö²ö²Õö´ö´Uö¶ö¶ ö½ö½5ö¿ö¿2öÁöÁ3öÌöÌñöÎöÎöÐöлöÒöÒëöáöágöãöã™öëöëdöìöìcöðöð(öûöûœ÷à÷àR÷á÷áR÷â÷âR÷ã÷ãR÷ä÷äR÷å÷åƒ÷æ÷æƒ÷ç÷çƒ÷è÷èƒ÷é÷éƒ÷ê÷êƒ÷ë÷ëƒù ù ‰ùù‰ùùýùùùù´ù#ù#?ù)ù)@ùAùA"ùBùBùCùCùDùD;ùNùNsùSùS9ùUùUùZùZBùwùwÌùù–ù›ù›ßù¦ù¦æù´ù´€ù·ù·xùÍùÍ—ùàùà‚ùáùá‰ùæùæÀùéùédùêùê£ùìùìùíùí~ùïùïiùðùð ùòùòçùóùó:ùùùù×ùûùûíùüùüLùþùþüúyúy‡úzúz9ú‘ú‘Îú›ú›ú¶ú¶éúÁúÁˆôø8Ôˆü„4Àh  p `  h Ü <  €$¤ œ¸0¨ ¤ôhÐpè°HpÌ@ (´„h„4L Œ!Ì#0&¬(|)P*0+Ø-ä.Ø0$1˜2È3¸5<66ä9Œ;;°<Œ=`>Ä?ÄA BdC DDðEüG€HàKLDMÌNTNÜO°P”Q|RˆRðSœT¨UpVW€XYˆZÐ\]P^p_P_è`Ôb<c$cÈd4dÐeœflgÔh˜i`jkk¤lLm|nloxp,p´q´rdsTsètäuxv°w xŒy˜zÀ|},~ Ì€ €‚‚Ôƒ„8„Іl‡pˆì‰¸Š¬‹|ŒLÌŽôìä’“è•T–̘T™¼šÈœ4¼Ÿ0 ¼¢À£¼¥´¦°§Ð¨¬ªx«Ü­h®h¯´°°±x²8³@´µµì· ¸d¹¸ºì¼ ¼È¾LÀ(ÁôÃÌÅ´Ç4ÈøÊ°ÌP͸ÏhÑôÒ˜ÓÐÔÌÖטØ@ÙdÛÜDÝ Þ ßœàüáìâÀãðä¸æxçPè<è°é`ëüíï4ð\ñôóPôXõLöL÷0ø<ùPúHû`ü”ý þ ÿ¬Èø Lx  ¼ è ° ´l´l Ô¤Xü¸´Øt4H`øL È"$H%€'¼()p)ü*Ô,Œ.</è1T34H5x6ˆ7È8Ð9Ð:ü<8=T>˜@A`B¼DDôF\G<HÌI¤JÌLLM N O”Q<R°T¨V WXY(Z$[ø]<^h_¤`ÄbcTd`e$f@gdh”iØkk¨l˜mxo p¬r\s¬u<uàvÌwÐxxylzH{¨|è~ÄT€8€Œ<ô‚¤ƒt„„ˆ…€‡ˆ‰œŠ‹ Œd¤ŽÈ|‘ “”t–(—¼™štœØž°   ä¡¼¢ £ ¤°¥œ¦4§€§ô¨€©$©Œ©øª„¬$¬¨­d®®\®Ø¯|¯ü°Ü±è³ ³Ì´Pµ µè¶t·0¸d¹ º,º°»`»´¼<½P¾Ô¿ÀÀ8ÀðÁ¸ÂÂØÄÄÄÜÅTÆPÇHÈ(ÉÉèÊÌËäÌèÍìÎlÏ(Ï„ÏüÐŒÑtÒÒøÓ|ÓèÔ,Ô¸ÕÕtÕøÖ`ÖÜ×,×€ØؘÙ@ÙÈÚ°ÛtÜàÝ|ÝèÞTÞÀß,߸àÌáàâ$âÌãÐäxå8æPçLçÜèhéØêÌëTëðìDì”ílî8î”ïï¬ð@ñ0ñèò„ôÄõ¨õøöÌ÷`ø@ùú0ûûèü\ýýœþ<ÿÿø¸¤è,p´Lä|  4 à  `  è pì„„Ø„Ô€¤äôxØÜÌ LŒÌ<¬ì,¨ d!4!Œ"Ä#Ð$ %T& &Ø'(Ð**¨+<+ì-$.t/h0H1,1Ä2\2ð3ˆ4 4´55X5¬5ü6p6ð7l8H9$:X:°;¸<¼=˜>|@¬AØB`C4CðD4DèFGHGØHÌIÀJ4K€L@M MpNNäO P(P°Q8QÀRðS¼TøU€VVôWxXXXÈYLYÔZTZø[ˆ\]L]Ì^L^Ì_´`tb bØcœd|dÜeœfÄgìi$jXk´mmän¸o$ooüphqLrs<s´tDuŒv v¬wÜxÐy zD{ {ô}<~œè€¨ô‚pƒ`„¸…°†Ì‡`ˆ‰TŠŠ°‹dŒ0HŽXÌì‘œ’ ’ä“È”D––¬—Œ˜p™x››Ìœ€ žˆ €¡4¡´¢h££ ¥ø¦¨§4§ä¨°©@ª˜¬­$­ð¯°°H±²À´`µ”¶h·@¸¹»À½¾€¿ÀÁÂÂìÃÄÄhÅÆÆÜǸÈ`ÉDÊË0ËÐÌlÍÍ”ÍôÏÐÑ8ѨÒ0ÓTÔÔàÕœÖt×$×ðØ”Ù0Ú$Û(ÜdÝ$ÝàÞtßLàààá¤ââÄã|ãääDååæXç@è<é@ê$ë8îð ñØó4ô¨õ¤öx÷Ôø@ùLúTû ûÔüèýÜþÐÿĸ˜hL´8xLè < ð X H ì ÌÀt<¨üÄ$ÀxÔ0ä°hØHì0Ô¨DìÀ \!l""œ##„$ $¤%˜&$&”'(@(è)˜*$*¤+8+¬,0,¼-X-ì.€/(0\1T283€4$4ð5¤6d6ø7Ø8¨9˜:t;¤< <ä==ü?@|A\A¸B¸CŒD,E EÐFàHLI|JLKdL L¬MlN OOàPtQPQôR°SÄUV|WHXX˜YYàZ[x\È]t^„_(_ðaŒbxccìe`f0gDhTi\j(k¼lèm˜oo pPqXr8st`tøu„vwŒxHyDzô{Ô|Ì}”~ˆ8€<$¨‚ˆƒ\†‡Hˆt‰tŠ8‹°ŒLŒÜÄŽˆ$‘0‘ì’´“ì•$–,–¬˜˜ì™œš0šÈ›„œ0<ž0Ÿô ˆ¡x¢D££”¤ü¥ü¦ø¨0¨ìªL«¬L­­¼®¤°°¬±|²$²¸´(´¨µ¬¶œ·¼¸|¹¹Ä»T¼P¼ô¾ ¾°¿ÜÀxÁèÃtÄÅtÆ@ÇÈ,É<ÉÔÊŒËËüÍÍ°Ï Ð$ÑHÒ4ÓDÔÕ$ÕÀÖd×ØÙpÚ`ÛœÜ8ÜÜÝÄß”àTáXâPâÈãüå,æÐèé ê ë|íLîtï„ñXò¤ôìö ÷pø¼ù¸ûüTý<þTþè|˜<T h X ¼ Ä ´øØàll$,¸X`ì„plàô @!¼"œ#@#ð%œ&L&Ü'È(¬)x*¨,,Ð-ü.˜/ˆ0œ1<1à3x4$5ô6À7p8„9”:x;Ð<Ü>>°?œ@lA(B<C\DLDðE´FpG<HIìJˆK$LôOPðQ¸T U(VVèW¼Xà[\l^^ `a|aüb de\fgìi´k˜lÄo`oüqsÔuw¬z”{D{è|Ð}¸~tœ€Äè‚°ƒ|„\…P†8‡4ˆŒ‰h‹‹´Œ¸è8Ì‘ ‘Ä’¨“ø•L——¨˜Œ™¸š€œ¸ž0Ÿx d¡¤D¥8¦T§ü©©¸ªØ«œ¬­4¯<¯ø±±È³³4´À¶·È¸¼¹€º¸»ð¼¨¾°ÀÁDÂPÄÆÇ€ÈTÉÊˤÌ°ÎÏàÐØÒ@Ó¨ÔŒÕ0ÖÖÈذ٬ÚÜ8ÝLÞÞ¼߸àœâ@ãtäLåÔæ˜èéédë0ë¤ììàídï ïððpñ(ñ¼òÜó°õö¤÷|øˆù8úûLühý¨þ˜è°0ÀÀè ( ¼ ˆ ` Ð (  ìÄ„¼L @茰<ȈP<”ä”T !,!Ä#@#Ä'œ)0* *ø,|,ð-”/801,2T3ˆ4À67p8˜9T:0:È;0<$=4><?DÿÀ€À %?'3'77#7%67167!!&'&'@ZZ'³ZY€YY3³YZþæ    þà :††þô:††À† †À††  þ`   ÿøÿàH  4'1&#"32765676'&'@     € ÿ þ`ÿàÀ UZ13767632+32+'&'&?#'&'&?#"'&5476;7#"'&5476;767637#µ _   : E: E   _   : E: E  __  ;E ;  €  E ;E ;  €  E €€ÿÀ0Àr2123011/&21#"'&=0#01#1&'&'&'&76767676'&'&/101&'&'&'&767676754763  0  /0 1     1 1  À $       ! #       # €€ -6514'&#"327&'&767&'&767w þÀ @÷    I þÀ @ $$$$ÿ$$$$ÿà€ =2176/#"'&='&'&76?'&'&767654763À p  rs  p  o  rr  p   ˆC DE C‡ ‡B EE Cˆ ÿð°)4'1&#"#";3276=327654'&+5      p      ÿà@ '67167&'&'57167675&'&'--DD----DD-- ))))D----D€D----D€`)€))€)ÿà $&'&?#";27654'&+ `  .@ `` @€ @ þÜ   `ÿà@ *"#"'&54?6732#!&'&?67&'&'" +<>())‰³ ÿ ¿"` *)(><+ˆ  ¾""ÿà@ 94716;3#"'&/&767636767&'&'#&'&?#"'&5 ð „:&''&:O   Oh „ž € x'&::&'  x ÿà€Ÿ/6'1&'&;3276=327654'&+54'&#"#7½ € à     ®kr  þðP P   âÿà@ 66732+3#"'&/&767636767&'&'#"'&?!À ¥r:&''&:S   S˜ !†  p'&::&'   °ÿà@ !;6'1&'&01016767&'&'71#"'&'&54767632è  ‘%--DD--*+@?   k  ¬+9D----DB,-Kë  ÿà@ 47163!'&'&7#"'&5  à ÄÈ € þ€  P ÿà@ <X&'1&'#367674'&'673#&'&'6767301013010150901#0101&'&'676730$%6 6%$#$%6@6%$#€@   6%$$%65$ 6%$$%6 $5€@ÿà@ 5132767654'&'&#"&'1&'6767'&'&?@   XA+*--DD--$‘ @   -,BD----D7*¬  K1 '%&'67%6} þú  þÀ@ n ƒƒ      @°@'"13!27654'&#!"13!27654'&#!0 ` þ  ` þ @   À   €1 7%67&'%& þù  @þÀ n ƒƒ      ÿà0 3@6716733276=4?676=&'&'#32765676'&'P +'  *$%6 6%$  P   "0  !6%$$%6 þÀÿÀÀKX12#&'&'&'676767&'&'&'67676323276=&'&'&'&767R6666R H9:"""":9HH9:"")-$36%$$%6+    66R@  €66RR66  "":9HH9:"""":9H )!!$%66%$ P   R66À$$$$ÿà€ &'76?37676/#7Þ x( Æ  (x*HHŒþà`  LL  ` þô­­ÿà@ '41367674'&'67&'&'##53;#5@€6%$$%6`````` €   $%6#"06%$À€@€ÿà€ +"327632#"'&'&767632#"'I1<<1//1<<1 DVVD,,DVVD 1//1@@1// AA-9999,BB ÿà€ $671673#&'&'3#36767&'&'`?2332?` ``D----D`32??23@þÀ--DD--ÿà@ +1327654'&+5327654'&+5327654'&+@à à   à à     €  €  ÿà@ %13276=327654'&+5327654'&+@     à à  À    €  ÿà¿ 716767#"'&5476;2&'&'&'676767'&'àD----D;++ }  >>Z?2332?X=  ,?`--DD--$#8  X9:32??237  (ÿà€ )%3276=4'&#"!54'&#"3276=!@   ÿ   ÀÀ à  €€ þ€ Àÿà@ *"1;#"3!27654'&+327654'&+  ``  `` €€   þÀ   @  ÿà@ %21&'&'54763267674763  --DD--  ))   ÿD----D   )) ÿà@ +6514'&#"54'&#"3276=77676/77 ›.   A… Œ‰j  /¹ þøx kCÀ  Ë ÿà@ 2132+"'&54763@ À à   þ   € ÿàÀ $676#"'&5#"/#"'&567¥¥  …  …  Ÿøøþ€ ÈÈþê €ÿà€ 647632'#"'&567  þù  žþÄ( þ€=þØ €ÿàÀ 3"132767654'&'&#1#"'&'&'6767632à+%%%%++%%%%+à45;;5445;;54`%&**&%%&**&% =3333==3333=ÿà@ &671673##"'&=36767&'&'#`D----D`  @`))``--DD--` €àÀ))ÀÿÀÀ <7167'&767667&'&'&'&'&'676767'&/@--D,#H G--DD--5D?2332??2350 .ÀD--V  U*7D----D½"32??2332?V=9  8ÿà@ $013276=37676/6767&'&'##53@  _g T(()=pppp"" À  €’  x$#.=)(à ""ÿà? b013'9&'&'&'&#&'&767627676'&'&'01&#&'&'&'&7'676'&'&'7&c 8 :7E    9  8  :7E    9 W   $@     $@  ÿà€ "1;32765327654'&+  €  €      þ  `  ÿà€ %216767547632&'&'54763  $%66%$  66RR66   à6%$$%6à àR6666Rà ÿà€Ÿ61676&'&767 ‚ƒ      þÇ9  þ€€ ÿà? %6167676#&' "'&767 nUUn  QQ  ž þÚ$þÜ&  þ€þé€ ÿà€ )6'1&'&'&'&76?7676/7y ‡‡  ‡‡ k  ¢¢  «¬  ££  ¬«ÿà€ &'1&3276=76'&'&': š  š ††“  ×– –×  ¼¼ÿà€ 47163!32#!&'&7#"'&5 @  þëü þÀ  ü € þµ  L €"R'"3?;27654'&#54'&#""1;6732;2765&'&'#'&+5'#"#À` `` `    d!;;!$ @ --D    ``       @ ..  D-- ,, ÿÀÀ#Sh2172#/+"'&54763547634716;76;57323+"'&54'&+&'#"'&=632#"'&=4?à ` `` ` à `    D-- @ $!;;!d µ  À      à  ,, --D  .. @Ç+ +ÿÀ@À,9%1#!&'&'5#&'&547%625476;2%3675&'#@ þ¿   k   5 þ¸PPÀ     à ^% y. ?PPÿÀ@À%8J["3276753676/673#&'567&'&'&'271654'&#"3'67&'&'f ÐB/0º   ÐF@@þøN4444A   %'&:· À00BpÀÇ@@044NA44ÿ   ˆ%:&' ÿÀÀ?Sn67167&'&'47675710016767&'&'01015&'&'67167&'5&'%#4'&#"#32?6'&'€   "" 00 ()==)( 0  P   @ @P  ¥""¥p 0¤%3=)(()=3%¥0 þ` ! 33 ! @  þà@ @ ÿÀ À?Sn67167&'&'47675710016767&'&'01015&'&'67167&'5&'3676/&#"332765€   "" 00 ()==)( 0  0  @ @   P  ¥""¥p 0¤%3=)(()=3%¥0 þ` ! ÓÓ ! @ @þà  ÿà€ %.9BMXew136767;27654'&+5&'&'!567"567&#567&'7&'567&'567676'&'521#"'&547630  ++Ép @ þ@ `PppþÐ----    ÿ **  ð @ƒ ˜€qqƒ˜ “ÀÀÀÀþ'((''(('p   ÿÁ¿€‡™¢#*<&&'&'&'&'&01119"321'??232776/6776/6776/676776/6'76'&&'76''1233721#"'&54763767&'?76776/6776/6776/676776/01656745614541=92#"'14576'&&'76'&"#"'&'&'&'&?71&#&#1#"'&5476321            Á0   @ƒ            ý 0€   ¿             þñP   0þ§             ÷  ÿÁÿ¿€„‘š6'&&'&'&'&'&010111"31'??776/67567576/6776/676776/6'76'&&'71'7676'&'7&'67§ !     '  %     #     þµ44€¡                 $  þ´+  ˆÿÀÀ8E332!/&54763#3!367&'#73!567673!!&'&'5]s  U $ÿ/ 00  þ O þ` À [@@½ à@@ pp À0  0ÿÀ@ÀKR#336753675&'#5&'#6716'&'&#&'67;27654'&+"#";2?%31"101à880880P  wy@ @N-#-%  ¡,$þ‘¨808808þ   X  $ @ ^ÿÀ€ÀPi‚›216754763267547632#&/&5476324545476326754763&#"32?654/#"/&54?632#"/&54?632@      /@]Cq  <   Ñ0000à0000À а °p à  &?k  : °Ð þ¹Ï0000þà0000 ÿÀ À#0^iv¸271654'&#"3271654'&#"3&'&76745015476?6?6'&'&?6'&954'&#"%76'&;1376'&&'1&367&'#&'67367&'#&'67367&'#&'67367&'#9#7676'   `  þ €.< .  N >  D+  ,   /   ? <''3°\  ||  œœ  |ˆ]. €   €   þð  0I'#"7..%O ‡  k uK1 G*2 @/ (  %('.      ÿÀ€À2L&76/&/'76367675&'&'+/&#"'7&#"' 37676776767' P ‡ ‡M  ±*  LH!YR#~wþ‹  l\ » þ0 j {< £ € /IBcþ_% € S ÿÀ€À'9IRaj&76/&/'765#/&#"'7&#"'%37676776767%'#;276=&'67%;276=&'#67&'' P ‡ ‡M  ‹H!YR#~wþâ\ þÂ7   0ð   P » þ0 j {< €½/IBcþ_á›S ú,Ð ´”Àà ÐÐÿÀ€À4FOXajs|7671671673+1##1#"'&=&'&'!271654'&#"367&'7&'6767&/&'6?67&'&'6732?I77 * mk P(  .`  p˜(((à>32--E5    I=M    x¨xÿÀ€À+HQZc%2121#'&76673+1%67##1#"'&=&'&'&'67'&'6?67&'À, +' ý° 39MI77 * þ@;>+ "P(  .h@(z" " Ð (,--E5  f:1ø" I=Mˆ0 ÿÀ À#BT747#"'&=&'&''67673#313#3#3+56701637271654'&#"3 Ý€ .øã56DI77 * Ð!8Æ œ“ ‰‘ 0  à!¡  I=MG¦:##--E5  @    P   ÿÀÀ,mv7671671673+#+"'&=&'&'7'&766767676'&76767&'&'&76'&'&'&'&'6767&'32?I77 * @ À .à        (à>32--E5  @  I=M         `PÿÀ@À,9I%671676/54'&+"'&#&3!6767'3%&'&767671673#&'  5   j þÿ  A ÿ$$$$p"@"À   /y %^ à    €  ð""ÿÀ€À"'E6312#5&'#3#&'&'5#&'&?35#'4716;23+&'&'6735Ú Ð @@    ІÀÀ0 à  0À0  · À &@€ pÀþÙ     ÿÀ€ÀV—Ûäí21&#"54763&'1&567672"/&'7'654'&5456301636767&'&'"'"'4547654''&&'&'&'&76'&'&'67676'&767676776#&'&'5456767676767&01#"227767&'&'67@  } # & H            ïH & #  qHÀ | | Ä  '&,,,&  â         E&,,,&'   « ÿÀjÀ -:Zy676'&'671673#&'&'5&'&?%676'&'&'673#&'&'57654/35676'&'5#/&?6@  & ,+@0    ¦  *,     0@ ` @@ ` @@ €$$$$© @/I  t2©$$$$ˆ 2t  I/@(  @@   @@ ÿÀ€À51#'&76'&733%#&?#+&'4?'&567I¾ ý° Ç(8 etþ(AB 81g+*  • Ð œ°?ýr¬: nn "ÿÀ À2K3532327654/&+4'&+"13676/&'&'#3#&'5#&'673567€€<" "!< @ º–c     ` " " €ààx    "ÿÀ À2H3532327654/&+4'&+"13676/&'&'#1#"'&'6767632€€<" "!< @ º–‹   ` " " €ààÈÿÃðÀ]fo&#"767676'4'&/76'&&'&'&'&76'&'&'67676'&767676767&'&'67 ½ /.VV./ ½         H½P3EEAB+ +BAEE3Pm         ÿÀÀMZ47163232765&'&'#5&'&'#3#";27654'&+567367&'##55!!6767   ))@00P àà P88@Àþ@))`  ))À   ÀþÀ ))ÿÀÀ +Vk676'&'676'&'74'1&#"32765#&'&'67673&'#!67675&'&'136767&'&'+Ð  p$$$$`   )À))X€))@))ÿÀ  `   à   + )))&)€))€)`ÿÀ°À0DOu"1;6767&'7654'&#"&'5327654'&+1&'&'56767675&''"'&?673#&'54?6=&'° L11;;XX;;  +9 `p   t  %' ,@' À  "88PX;;;;X@1 # "  Ì``4`  `  ",  , ÿÀ€À!+=&76/5#'5#'!27654/&'!'3'3#5#367675'' P 7@€@+F Lþt#Ue À@ à @» þ0 +ʘd4"  r »O  À  P  A3$ÿÀ€À+5I&76/=1#"''676727676/&#!"'327'5#"'1&'!27'#' P W ³ ())*:þœ8Ij!0@•Î» þ0 DƒdŒ %%%[ $,ÚS¡…ƒ@ vÿÀ€À#8J&76/6767&'&''65&767!'%327676?1&'&54767' P n&)); "þä&9HþÔ   î ±   » þ0 V55MR6666RK5.&,243'0-þ„íL55  AÁÿÀ€À+<IV&76/367&'&'#"'67&'&''67&'&''130101&/#1!67'#7676'&'' P ¾².*)0)"+'D.Ö Iš8&&J¸@û----» þ0 •. ."#)$  ""».+9 &&8‘À'((''(('ÿÀÀq~‡4'1&#"/&#"#";32?63276=676327654/&767327654'&+&'&?654'&#"'&'5676'&'&'67     &   &        '   '   p€   &        &   '        & À  8ÿÀ€À@Jx&76/&767327654'&+&'&?654'&#"'&'54'&#"/&#"'63'%#";32?63276=6767' P š   '       `â  E‰þÿ   &     » þ0 y     &   &  K± 7çË      '   ÿÀ€ÀPYk­¿?63#/&&'5&'&'&?6'&'#&'673676/&7676756767&''4'1&#"32765176'&&'&'&'&76'&'&'67676'&76767674'1&#"32765À              00   @           À              à@  P        p  ÿÀÀÀWbm7'673676754/&=&'&'#0101"101&'&'&'01"10101#327&=4?/&7676'&7Ï8//F € 0  0 €  Œ0 0 þÚ0 0 Ó§Ó¨  Á H J  J H Á ¨ "x0 0 00 0 ÿÀÀÀWd}Ž+&'&'54?6=67673010103016767670121010;#&'&'54?&'676'&''?76/76'&'&;67&'#5&'—8  € 0  0€ F//7       ð z§" ¨ Á H J  J H Á  ¨Óþ~È      @`/%"1;276=4'&#"'&#"'&#"32?#€    © i‰   i“S`    Sª jŠ   j“ @`/"'1&5476;2#"'&=#"/#"'&54?6327#€    © i‰   i“S    Sª jŠ   j“ÿÀÀÀ#K"32?3276=327654/4'1&#"!676754'&#"#!"'&=÷ € I  I €·  ))  ÿ · € JÓ ÓJ €þ© @))@ @ @ÿàÀ EIN&'#";#";76?37676/327654'&+'327654'&+'#73#7þ H[ @ 3  Æ   3 @ [G@ [v Œ¬   4  LL  4   ¬¬MM@ ÿÀ@À27AFR"1#";3276=367674'&'67&'&'54'&##535#5353# J F  0  0  00@  @00@    À  z*v    0%0   €````  @````  ÿÀ@ÀIUb4716323547632#"'&=##"'&=#"'&=476;536767&'&'##36767&'&'#0   # 0     p  ppp         '%0      v*z À  `@`  ÿÀ€À"?673232+"'&54?#"'&5© .‹ Á  / Àä {  þç ½ ÿÀÀÀ-:671673?7675;2#2+!&'&'13!5!")` 66     þà)@ ÿ `)¿ ++ ¿ þÀ @  )@þÀ @ @ÿà@ 9V#!6767&'&'#'&'##&'4?&#"'&?6776367332?6&'#&'5Õ K€K "z" ëM #21$ ÿM #21$ ÿ¿ "" M@ "" M ÿÀ`À6@4'1&#"3276=67676'&'&57676'&'&'5&'&'6767  F,--,F  /$    $/@**  # 34II43 # # ø #dø "!..!" ÿà /BVi21!2#!&'&'476321#"'&=47637#"'&=4763221#"'&=47637#"'&=47632   þp" €  €   @  €     þ°  "P À @ @ @     ` ` `à à ÿà /BU21!2#!&'&'47634716;2+"'&532+"'&5476332+"'&54763   þp" ` ` ` `€ €  @ @   þ°  "P `  @   `   ÿà  -#3?"#54'3'#3?#13?#!!67675ÀV\@hvÚ\\æFÀþ€ €@h€@ ààÿàÀ 1#/&+32?622?63676754/&747636;67654/&?654'&'#"'"'&5&?6=&'&'"/&#­           ÿÀÀ,5bk/&54?6367675&'&56767#&'67%676'&'5#&'&'4767567673567&'@  PP   "" $%6ˆþø  PP   "" $%6ˆ( H H (§ "" §6%$(˜8 H H (§ "" §6%$(þhÿÀÀÀS\e67&'71;276=&'&56767#&'&'47675#&'&'5&'&5676767&'&'67PP     "" )0 "" 0) ""ÐxX ' ' "" ')G "" G)' ""þ¸ÿÀÀ,5Xaj3&'&'47675&'&'#/&54?6&'67&'&'47675&'&56767&'6767&'2 6%$ ""   PP Ê ""  "" H¾($%6§ "" §( H H NIÎ "" Î "" þé ÿÁ`¿LT[6'1&'&76?76?67676'&'&7676'&'0#&'76'&'&&'7&'47677&'ÿ   B)*      2'  6     \. => ˜  -33F,%&G  4  *  Ù <  0g¸(%æõù ÿà  J7671677676'&'&'67676'&'&=6727676'&/&#"&#"&'&'`--D?,  =X?2332?X=  ,?    +ÀD--(  732??237  (`   7 S&'2ÿÀ@À+013#"3!27654'&+'36767&'&'!!!@° E  E °þ@Àþ@ÀÀþà    @þà ÿÀ€ 0=Q"1#";&#27276=27654''&#676'&'"13!27654'&#!    #6%$$%6%      ` @ þÀ    1$%66%$ `    ÿ$$$$    ÿÀÀ #0F\iw3276/&1!6767&'&'!&'&767671673+"'&=3671673+"'&=7676'&'7?6'&'#"…@ € @ E€þ€`  P @  ` À @  ` 5 @ € @»@  @ {ÿ`°      €  µ @  @ÿÀ@À1J67!&/&='&721#"'&'&54767636'&'&?76/7 ° k=''@ · ¬'!!!!''!!!!'; %% $$ %% $$©ƒ //A)$0 OàÉ""&&""""&&""k $$ %% $$ %%ÿà€ 9"1#";#";276?327654'&+767327654'&+; 7k P- % % 7k P- % % …  l  …  l  ÿà  !&'&'5!!567673;Àþ€@þ€    àà@@ ÿà@ ;"1#";3276=327654'&+5327654'&+5327654'&+P    P P ° Р  `  @ @  @  `  ÿÀ€À3=D"13276=67674'&+5327654'&'54'&#&'&'676753À F,--,F  F,- €" *<  **@\ "À # 34II43 # # 34I \  ) # „ø "!..!" ø\" ÿà@ 3:E&'!";;6?3276?32?3276=4'&+5#73#'!!&'67þ@   ( `h C Ï\iò€þ€ˆ p    h K  P ø@;°ÿÄÀ Phs&'567/&766767547632'&/&7676/&7676/&7676/&7676=67547632'&?6Pc   f|   %166)d5 ]] uu ]*%)%  %   °@@0  0  `| ' š+%$'d5 ]] uu ]þ’**0b( š+%$Ò 0  0 ÿÀ@À -=%1#!&'&'5#&'&547%62'&'&7671367&'&'#@ þ¿    à  `"À"@À     à á  $$$$`""ÿà@ H4716;2+32+/&76732767#"'&5476;&'&+"'&5 @° 8# $ !!.‘  àP ™ ™ @ €    ,g      ÿà€ =6716'&'&54'&#"#";3276=7676'&/327654'&+7U  «     «  ž© ©žh  ’z      z’  ˆ  ˆÿà€ _21632547632'&'&'#"'&=&#"#"'&=32+"'&5476;&'676754763   *   #    .$%6     /2   !! 1#$. -D __ D%?6%$   5K;..1 ÿà€ /4'1&#"?3!27654'&+57676'&'&5€  )    à‰  w€ –  ¨  š' "ƒÿà€ 9"13276=6767327653276=&'&'54'&#À F,-  *  *  -,F   # 34I   .!" þä  "!.   I43 # €€(5BMXc"+6?67675&'&'+"/&#'&'&=673%6753%673#&'3#&'67673#&'@*"% H)l5DD5l)H &"*¼(#•#(þ§àààà  €U* #" *UþæU0E55E0Uƒ0PÿÁ€¿Q6'1&'&&'"&'"3276=676776?276=76323276=&'&'7. "  0     N  $   +•  _!  PÐ Ð  +Ú  < šdÐ Ð-6ÿà€ $+2?T!67675&'&'!1#57153#6767'3&'&'676'&/&'!67&'!&'&'5` þ`@@@@`@@@à'((''(('ð""3þp`àà @ @ @ @p----Xð3""ðÿàÀ 6:>&#";3276=37675327654'&+54'&#"#'3/#5{    da    9Œ¶w::’À  € €’€  À ÀÒþî@VVÿÀ€À %?'3'77#7%67167!!&'&'@ZZ'³ZY€YY3³YZþæ    þà :††þô:††À† †À††  þ`   ÿà€ +=V"1327676732767&'&#"&'&'&#471632#"'&5!2'&''&?632763.  EFllFE    EFllFE 2    | FccF  E W   þœ  d €   ¶      W ! ÿà€ -5="1"33276=36767327654'&+&'&'##533#5@    `;++   ++;€Û»`  »»  `  `  `€ `$#8  8#$€@@@ÿà€ DJRX"1"3"33276=36767327654'&+654'327654'&+&'&'##533#5#53@     P4))  ))4p¾žP/ž¿¿ž/Pž  @   @` @+    +` @ ` ÿÀÀ167167/"#'"#&'54?5'&=4?5À²«: nn :«²bBw 99P+*   *+P99 wBÿÀ $0JW4716;'&/##"'&=36767&'&'#%3##"'&=476367167&'&'#3 P=)('4 8*  @0""0P0  00  P  00€ ()=-#"€  Œ€  àÀ"" ` 00 ` €     `ÿà@ 74716;2++++"'&5476;5476;5476;5€ € ` ` ` € ` ` `€  ` ` `  ` ` `ÿЀ°U^g&'6767165&'&'#"3!67674'&'5!27654'&+56765&'&'!5%67&'&'67€  "" @  ""  @ "" þÀH¨xa "" 7  7 "" 7  7 "" 77IþØÿÀÀ'0BT67167!+"'&=!+"'&=&'!'&'#4'1&#"32765271654'&#"3"`"   ÿ   ‚ ¾      p""þà)0   0) HHH¨     ÿà€ O2176763676756763#"'&='&'&76?5'&'&76?54763` w  ‰w  ‰@4$$  66N`   )  )   #" '" 'š""5  N33 ¨    6 ÿÀ@À*DW133733736767&'&'!676'&'521#"'&'&5476763&'5&'6767@@à@þ@ ----+%%%%++%%%%+  Àþ  `þÀ'((''(('ð%&**&%%&**&%ss !  ! ÿÀ À.3Le32?654/&#"1327654/&#" '732?654/&#"32?654/&#"ë&&&&½#}#þƒ·iiþ#8998`8998•&&&&þ #}#þƒ8ii"9988ÿ9988ÿÀÀ k6'&?'&&/&&/&32?32?6/&'732?6/&'732?6/&'76'&&6'76'&&/ùXXÇ      E E '& ", &' ", &' .;  :. —XX '& *! &' *! &' D E  !  !  .< !!:. ÿÀ¼À C]676'&'&'&'&76?63'&'&?#&'&'676727'27167654'&'&#"3@s )  )&,Z&b  F --DD----D7*-    I + + z"D----DD--6þ¹   ÿà€ O&1#";367675&'&'#";2#"'&=327654'&+5&'&/$     ) R66)  $%6    %      )66R )   6%$    & ÿà   :EP[fq|‡’673#&'3#&'673#&'6747163!2#&/&'&'7673#&'#673#&/3#&'67673#&/3#&'67673#&/3#&'67'3#&'67°8 Ê 0è0à`Øx`ˆ0Hk  6))))6S`````H ÿÀ`À I&'&767&'5'&'&?676;23+#"'&=+#"'&=À  H :- " (    Àþ7  a'!$  ` `` aÿÀ@ÀX%671676/54'&+"'&#&301;23232;276=476;2;232;276=47'3  5   j þÿ    @ !     /y %^ à  Ep @ @  ÿÀ@À/%671676/&#&33'&?'&7636767'3  ÿ þÿ  f U< v Q&{    á à   4 GS ] C@ ÿÀ@À =%671676/&#&3!6767'3%6733##&'5#&'56735  ÿ þÿ  A þà 00 00   á à    P0 00 0 ÿÀ`À=21'&'676#"'&=&'&'676754763à /$  !,6%$$%6,!  $/  F,--,F À # $%66%$ # # 34II43 # ÿÀ€À)=4'1&#"#";3276=327654'&+513!27654'&#!"à  p p  p pà @ þÀ   p  p p  pþ@  ÿÀ:¿ ,676+&'#"'&?6&7!!&'&/ à à, € € Î "!,þÊ,!" °  þÀ @Q àà þÍ**ÿÀÿÀr6767676'&'&'&'&"30011'&'&'1&'&#&233137676'&'676'&'&'&'#&'&'&7&901#&'&'&7676A(  6,/  " ))   5,/   ) M) ( # `   6 *     4 &   Ñ   ÿà !.5@KT1335+"'&54763!67&'!35'&67'7674'#327&'&'67&'@//E8¯ þp H@ €7)Vy&}[‰ …++8¨ D--À  þXH "#F@/@W$À ]0@ÿÀÀRwƒ21/&+#"'&=&/&'&7676367675&/&'&56767547634716;'&/##"'&=36767&'&'#   !4"#     4"$ þp P=)('4 8*  @0""0À  #%'     #%(  @ ()=-#"€  Œ€  àÀ"" ÿàÀ +@671673#&'&'671673#&'&'5%3#&'&'6767              p      p  þ   `À      ° þà    ÿà &R1#3/&76735#&'&'56767!5#3676'3!&'&'5676733#332?3¨. FF .¨€@S Gþ€G S““ @ FF @@@ÿ@@@@ÿà D%5!!!&'&'56767!1#&'&'56767;3/&76735&'#Àþ€€þ€€  "& FF &P @@@@@@@" FF @ÿà D%5&'&'!!67675;#353#?6'&'#5&'&'+36767þ€€þ@ àP& FF &"  @@@@@ FF "@ÿÀÀIZep{67167654'&'&'/&'&/&76?6?67?632#"/&'7#"/&76?6673#&'7/&76'&?6F::$""$::FF::$""$::F/'  #       A  +  '·  @!"<=CC=<"!!"<=CC=<"!›      ×  þß… P ÿÀ€À,A`e&76/65327654'&+&'6?654'&#"&+"'%1;276=&'&'#";32?5'67'' P š@ @ @ @p É) ˆ ) @ @@ ?%5‰°8'_» þ0 x  @ @ ž)  )ÿ  % @ ?!mß&JvÿÀ@À!;T671673;#!&'&'#521#"'&'&5476763&'#3675367&'#5  €8$#"ÿ€€€0'!!!!''!!!!'0000€€ '.->-%%€@€€`""&&""""&&""P0000ÿÀ€À,9W!6767654/&'!3##5#36767=21#54763";276=4'&'&'%// LþtL [@À@ à  @ P   ""  rr     P  P € 00 0 € € 0""ÿÀÀx…Ž673#7'&76/3567&'5#76'&?'3#&'6735&'/&767&'#&'567367''&?6675#&'&'&76767&'ÀP/# 8 "" 8 $.P/# 8 "" 8 $.0@¨" 8 $.P/# 8 "" 8 #/P/# 8 "È  hÿÀ€ÀAr&76/673675&'#&'776/&&'5367&'#3'76'&'#5&'6753'&76/7#367&'#567'' P Ÿ"" 8 #/P/# !_n"" 8 $.Pü» þ0 |#P/# 8 "" !KÑ P/# 8 ""ÆÿÀ€ÀUo~1#"'&54763267&'&'#";#&'&'576/&?;27&'#=327654'&+4'1&'&#"3276765'/&7676@   ))))   0)88--DPP "   +""&&""""&&""M H ( = `  P4))4  Ð)88D--%P€  À'!!!!''!!!!'+ H ( < ÿÀ€ÀUoxƒ1#"'&54763267&'&'#";#&'&'576/&?;27&'#=327654'&+27167654'&'&#"35&'675&'567@   ))))   0)88--DPP "   ›'!!!!''!!!!'`  P4))4  Ð)88D--%P€  þ°""&&""""&&""`PPÿÀ€ÀUoˆ1#"'&54763267&'&'#";#&'&'576/&?;27&'#=327654'&+27167654'&'&#"37/'&?'&7676@   ))))   0)88--DPP "   ›'!!!!''!!!!';$$ %% $$ %% `  P4))4  Ð)88D--%P€  þ°""&&""""&&""µ%% $$ %% $$ ÿÀ€ÀWd‚1#"'&54763267&'&'#";#&'&'576/&?;27&=+5327654'&+21#54763";276=4'&'&'@   ))))   0)88--DPP 0   » @ P   ""`  P4))4  Ð)88D-- !Ð  @ 00 0 € € 0""ÿÀ@ÀKWc312?654'&#"5!27654'&+5327654/&#"32?+";'&#"354'&#"#3276=‰ ` )` `) ` ` )À@` `) ` @  @@  7 ` *s  s* ` ` *s  s* `7€ €€€ €ÿÀ€ÀEQ]jˆ7654'&#"5!547#5327654/&#"32?+";'&#"32754'&#"33276=#721#54763";276=4'&'&'—` ) K) ` ` )€@@ @) `  @€  @ð @ P   ""7` *ss* ` ` *s  s* ` 7€ €€€ €P 00 0 € € 0""ÿÀ€À#0=JWd‡67167335673+&'&'3675&'#3675&'#3675&'#73675&'#3675&'#%#"'&54?#"'&5476;'&547632  ` (   ` @      °    þ§P P s s   HH à     P  p    p  ×P P    ÿÀ@À#Xj~%2716=327654/&#"32?3&'1&7676767677676'&'&'&1&'&'#676763635&'1&'#16765   P P  #+*#  &,21  12-&  #**#N  €  ` Ó P P Ó F       æ ¹  à0 á  ¹ÿÀ@ÀSˆ1#6767636367632327626=&'&'#5327654/&#"32?#5&'&'#&&'1&7676767677676'&'&'&1&'p  ! 0 P P € €Ã#+*#  &,21  12-&  #**#À Ð `       ` “ P P “Ð þZ        ÿÀ@À#0=JWdq~‹˜¥"1;32?3276=4'&+&'&767&'&767676'&'&'&7673&'&767%676'&'&'&767676'&'%&'&767'676'&'  3Ê É  € €0  0€þÐ  0°  °0  À  É Ê3 € P  €  °P    PP  0°  Pÿà@ 6Z%!"3!27654'𒫢'&#"54'&#"'&#"32?%"54'&#"'&#"32?654' þ   )  ) ` `þÀ )  ) ` `   ‰ *Ó Ó* ` `. *Ó Ó* ` ` ÿÀoÀ!.;”©'&?6'&5&'&'&767&'&767676'&'76/6?;276=?;276=76/&'&+"'&'&+"&+"?;276=?6'&5&''&@@Ø°8  þØ  $ 0 $   0   & "  " &   0 ×@@Àv@@vÈ  `  (j1 D16 61D 1& &1 G ? ? G 1& &!@@vv€€GZ21#"'&5476313'&547632#"'&54?##"/&54?632%#"'&547632   × *æ* ` ` *æ* ` ` ‰   € þÀ @ I )) ` ` )) ` ` )þÀ @  ÿàà /G_36754'&&'"637675&'#"3&567#'&3276/674'&'76'&'#?275#;*  p "=V|! p "5A#ZA#! p "5Þ;*  p "=V`#! p "5A;  p "=V;*E;*  p "=VÀ#! p "5AÿÀÀM#1"'&54?632#"/32+&'&'&'&'##"/&54?632325÷ ` ` )@ @6%$s* ` ` *s#)) ` ` *þí  $%6) ` ` )¤*ÿÀ€À(5]†³63125476321+"'&5476;'&547676'&'#"'&5476;921#"'&=#"'&54?471632763232+"'1&'&595#"/#"'&=101014767630932+ i  ` j ÷   `   i j-  i j ` mj i   ` · j `  i ÷$$$$`  ` j i j i  `ÿi j `  ÿÀÀ6Qm213#"/&7673547637632##"'&=#&'&7'35676'&'5#"'&54763&514?632+/21#"'&54763  @ @ W@ @    ‰ @ @  ) @   @I  À  @ @  þw@ @   ©  @ @  7 @    @7   ÿÈx¸3@Uj6567#&'673'&767167167&'&'&'&7676'&'63#&'5677&?#&'673&'5'!'&'5673#'?`&?w %%11%%  %%11%% º$$$$?&`?ýÀ?&`?@?`&?±?&`?å  L  1?`&?þ?`&??&`?ÿÀÀÀ-[6312#"'&54?##"'&=67673'&5476312#"'&54?#"#"'&=67673'&547) ` ` *Ó  $%6Ó* ` ` ` *“  )“* · ` ` )   6%$) ÿ ` ` )    )) ÿÀ°-Zgt63123#"'&=4'&+#"/&54?#"'&54?#"#"'&=67673'&547632676'&'%&'&767ù “)  “ P PP P “  )“ y  þÀ$$$$§ )     P PÿP P     ) g$$$$À  ÿà@ 6Z!27654'&#!"3132?3276=327654/&#"312?3276=327654/&#"  þ  )  ) ` `@ )  ) ` ` `   ‰ *Ó Ó* ` `. *Ó Ó* ` ` ÿÀÀ@"16767&'4'&#1!6767&'&'#"&'&'54'&+  Ð     P )) PÀ þ÷%%  € þà     À))À  ÿÀ À,@3676754'&'&'56767&'#9#9#"'1&'67676#`€p@   ÀA !ÀÀ! Aþ‚      ÿÀ À=HS3#5676?6;2#&'&'67&'67&'67&'67&'367&'#367&'#xP€XZ   @````À((˜      Xpÿà *D6716703036767267632632121!&547163!2#&/&'&'   þ  Ê 0è0   [  6))))6ÿÀ€À1>KV67167!#6=675&'&'#56/&?6757%67!!&'5#!"'&=!367&'#    Ó p; @ @ %% ýÅ`þ ` ÿ @Ð``  þ` ó !  PþÕ @ @ $yy$ «  Pà à@ÿà@ @EJO"1;#;276=6767;276=67675#5327654'&#!#53##53##53  (H)   ))   )H( þ¨PP€PP€PP   @€)@ @))@ @)€@  @@@@@@@ ÿÀ€ 5:?D^m"1;#;276=6767267675#5327654'&#!#53##53##534'1&'&#"3276765'/&7676@ (H)   ) ))5A/H( þ¨PP€PP€PP˜""&&""""&&""M H ( =    @€)@ @),'H@  @@@@@@@þð'!!!!''!!!!'+ H ( <  ÿÀ€ 5:?D^gr"1;#;276=6767267675#5327654'&#!#53##53##5327167654'&'&#"35&'675&'567@ (H)   ) ))5A/H( þ¨PP€PP€PP'!!!!''!!!!'   @€)@ @),'H@  @@@@@@@þ`""&&""""&&""`PP ÿÀ€ 5:?D^w"1;#;276=6767267675#5327654'&#!#53##53##5327167654'&'&#"37/'&?'&7676@ (H)   ) ))5A/H( þ¨PP€PP€PP'!!!!''!!!!';$$ %% $$ %%    @€)@ @),'H@  @@@@@@@þ`""&&""""&&""µ%% $$ %% $$  ÿÀ€ 5:?DQp47163!2+#&'+"'&=&'&'535#"'&535#5#3'35#"1354'&#671672+"'&=47635  (0  ,)   )H( xPP0PPÐPPx @ P""   €  @ 0 )@ @)€@  @@@@@@@@ 00 ""0 € € 0ÿà@€3h47163!2#"1=&'&'&'&'&'"'&=6716'&'&'&'&''&'&7676761676   )) 3#**#  &-21  12,&  #*+#` $ } €))€ } $þÚ       ÿÀÀÀ8#567673#5&'&'#47163!2++"'&/#"'&5`0+*A0A*+0,0,` €  ê  (A*++*A,,H  Õ Õ ÿÅ<¿>}76'&'&#'&3?6776/&/536?6'&#&'76'&74'"'76'&'&?7?6/7?6'&'6'¥!  " &&&& LB 4  % #  "     UI :: I ( 8((8 ( ´/ %?P  '   - $ & 5    ÿÀ€À$1>KXerŒ¡67167!#5&'&'#&'&'3675&'#3675&'#73675&'#'3675&'#73675&'#3675&'#47167632#"'&'&57#3?6/&   3`  ` P  P  p  Ð  p  P  `""&&""""&&"" YY 8 8   ¸##)L2P  P  °      p      ÿ'!!!!''!!!!'C  8 8 ÿÀ€À$1>KXerŒ›1356767367&'47675&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'5674'1&'&#"3276765'/&76760  `  `3 þà  p  P  °  P  p  p""&&""""&&""M H ( = À þ` P  P2L)##¸ ð            þð'!!!!''!!!!'+ H ( < ÿÀ€À$1>KXerŒ• 1356767367&'47675&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'56727167654'&'&#"35&'675&'5670  `  `3 þà  p  P  °  P  p  à'!!!!''!!!!'À þ` P  P2L)##¸ ð            þ`""&&""""&&""`PP ÿÀ€À$1>KXerŒ¥1356767367&'47675&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'56727167654'&'&#"37/'&?'&76760  `  `3 þà  p  P  °  P  p  à'!!!!''!!!!';$$ %% $$ %% À þ` P  P2L)##¸ ð            þ`""&&""""&&""µ%% $$ %% $$ ÿÀ€À -:GTan‚135676736767&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'56?"133675&'#4'�  `  `  þà  p  P  °  P  p  ° @ À þ` P  P   ð            ` þ @€ ÿÀ@À$1>KXer13567673&=675675&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'56721#54763";276=4'&'&'0  `  Y  þà  p  P  °  P  p  À @ P   ""À þ` P  P€%/’ ð             00 0 € € 0""ÿÀ€À -:G^i}”135676736767&'&'!673#&'573#&'567673#&'5'3#3567#&'567675&'67167&'&'5'567/&'56760  `  `  þà  p  P  X0  ˆ0    Ã# # À þ` P  P   ð      °@X         )4+`  4+`  ÿÀ@À.;HUbo†67167!+0+5&'&'#&'&'3675&'#3675&'#'3675&'#73675&'#3675&'#6'&'&'&76?'6767   *& 7 `  ` P  P  `  p  P  § x 6 6 xh_2  Ÿ -88,P  P  °    €      r0!))&&&&))!0V&¼*)(ÿÀ€À -:G^w135676736767&'&'!673#&'573#&'567673#&'5'567/&'567667567&'&'5670  `  `  þà  p  P  # # }  À þ` P  P   ð      ©4+`  4+`  @@@  @ ÿÀ€À#0=JWdq~’13567673&54767=&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'567&'&7671;2765&'&'#0  `  Z  þà  p  P  °  P  p  0'((''(('à Ú 'f'À þ` P  P$`à ð            °----Í ''ÿÀ€À -:GTan{‰—¤±¾ÉÔß67167!#5&'&'#&'&'3675&'#3675&'#73675&'#'3675&'#73675&'#3675&'##5676731#5676731#567673#&'&'535#&'&'535#&'&'537&'567&'567'&'567    `  ` P  P  p  Ð  p  P  €""""""€""""""`¨  þ` P  P  °      p      P""€""p""@""`""€""ðhh@    ÿÀÀ0&?6?76/767&/76'&'&''& pcg5 e!!e 5gj G" £¼ £ !e 5gg5 e!"G jcp ÿÀàÀ >GP[f&'6753#767';276=!;276=&/&'&+"&'6767&'76/&!?6'&^Œ Ð K       Œèþ¿0000¨PPÈ 55  O%(@     @(%OƒI0000ÿÀÀ/8AJS113&=6?676;2367675&'&'&'&=#3'3'&+"67&'7&'67H9:""+ t +"":9Hk À Ö¬žtÈÀ"":9HÀ p!@ @!p ÀH9:""þ (( ê**‚ ÿÀ À ;p676'&'533276=7676/&'#76?32765+";36/3675&'#57675&'#5&'5&'°$$$$   44 44    <,05 @  þ €€ ³  R,,R  ³ àd   `\ T8m tÿÀoÀ FS‚&'&7675#"'&?'&'&?67'&/+#"'&=##"'&5&'&767#"'&='&'&?673'&/#"'&=# $$$$H :%::%;     ˆ$$$$   44 44   À  þ P]%  N..N  %]P PP à  þ€` ³  R,,R  ³ `ÿÀàÀ(267167&'&'&'276767&'7657'¢"!¸"""’""!%þú¸% ’""!J""€ ""+ÐJ JÏ€ÿÀ€À0Se1#!6767&'&'#&'&'21#"'&547636716;&'54?65&'#"'&75471632#"'&5À  &%    V:  ,: 6   ÀþÀ@@   ¥ $   »  ÿÀ?À!,7BM‚21673!&'&'67676767'&?6%'&?6'&?67'&?66716'&'&'&'&''&'&7676761676à "þÀ)S0  0  G 0  0 ×0  0  g 0  0 1#**#  &-21  12,&  #*+#À)þÜP P ! P P !P P ! P P £       ÿà€ 0FQ\n!5!%13#"3!27654'&+'367675&'&')136767&'&'#3#&'67673#&'21#"'&54763€þÀ@þÀu K  K uþÀÐ  @  @       `àà@à   à þ   ` @P    ÿàÀ *@Vk;276=4'&+"1?676/&'&7"1;276=4'&+"1;276=4'&+;276=4'&+"'"1;276=4'&+À @ @ m   7   7Í @ @@ @ @À @ @ € @ @€@ @  7   7   @ @   @ @ @ @  @ @ ÿà€€)CR1?676?67&'&'!#1"/!&'47%4'1&'&#"3276765'/&76760 Ú:'&3 þ`öÚ('Z""&&""""&&""M H ( = € ¤ +.  þí £Ð/A '!!!!''!!!!'+ H ( < ÿÀ@À0GR676#&'&#"#'&7667'&7663237671!132#!"'&5476;&'567ô ‰a WG   PL a?f  ¯þLÀ  þ  ൠþÏ7W4 h XŽþK   À00ÿÀ?À<Av323!'&76734763!2#&'&#"#&'&'01'&=4763!5!6716'&'&'&'&''&'&7676761676à€ K þ° K €€ 33  @þÀ³#**#  &-21  12,&  #*+#À    € |H H| @``æ       ÿÀ@À!;DO671673;#!&'&'#521#"'&'&547676367&'5675&'  €8$#"ÿ€€€0'!!!!''!!!!'€€ '.->-%%€@€€`""&&""""&&""ðÀPPÿÀ@À!;F671673;#!&'&'#547167632#"'&'&53&'#367  €8$#"ÿ€€€`""&&""""&&""à€€€€ '.->-%%€@€€ð'!!!!''!!!!'ÿÀ@À!;Dg671673;#!&'&'#521#"'&'&547676367&''6756736757674'&'#  €8$#"ÿ€€€0'!!!!''!!!!'@ (   ( €€ '.->-%%€@€€`""&&""""&&""ðŽ      ÿÀ@À 7>671673;#!&'&'#56'&'&'&76?'6767  €]!7 ÿ€€€' x 6 6 xh_2€€ /%%-::/€@€€b0!))&&&&))!0V&¼*)(ÿÀ€À7k}¡676&'&'67676326716'&'&'&'&'&'3274716;2#!5"'&5476;22#!"'&=47635271654'&#"374'1&#"32765271654'&#"3&  % --DE-,3L $ #þ®   À    ýÀ        þà  ¼ $-D----D*22.þó*%  @@  ` @ @ `À        ÿà@ 2D&'&??676767676'&'&'&'&/471632#"'&5 ] .. ] N)#"  "#)Nm   š 17 PP 71 ;;Ú  ÿÀ€À#HS7#&'&'"'&5476;2#35#%;2#!&'&'4?5"'&5476;3'&=#¯) @@@ 1O@@€  v þÊ v  0«1@;)   öPF``@  —¿¿—  @  OO  ÿÀ€À "367676'&#!'3'&/  !¦! þÀ)ü!!À þl  ” ]]  ÿÀ€À 4"367676'&#!'3'&/7&'1&'&6767  !¦! þÀ3ü ­ À þl  ” þÖêêf  ÿÊö¶)S}§Äá6716'&'&&#76767236767456?&1237676'&'65&'&#"&'&'1&277676'&'&'45&'&'"#&'6'1&'&"#767367674'67%477675&'#"76'&'7'&3276/67&'&'&É  !    €       þÿ   !   ­      þÌ <  !]! =  x   !   =    !  þÓ  !          !H=  ,! ';'=  -! ÿà@ .5dk7&716?6;2++"'&5476;67&'#'&'%13010#1+"'&=476;76;2+3761#0103  $-   %-#-N@ @yw vº  $-   %-#-N@ @yw þŠð ] @ $  X  0 ^ @ $  X  0ÿÀ€À#IcŠ¤¶È471632#"'&521#"'&54763213&'&'6767&=673476327167654'&'&#"374'67&=673476323&'&'6534'1&'&#"327676521#"'&5476321#"'&54763ð   0    +--DD--,   À5  +--D/%&à   Ð  P        P ''2D----D2'' þÀ   `'"3 ''2D--'"'  `   0    ÿÀ`À[r4'1&#"#;67&'#76=4'&#"'&?6'&'&#=4/&'&/=35335367&'+3`  V €@€ V  E   /@/   E@€@€  €@€    @;$cc$;@ @1\  #   4&> >&4   #  \1@þ@ ÿÀ€À *^’&'&767"/#'&?'&?632/%217676/&5476321#"/&'=4763!21+&'&'56?1?632?6=4763@  -   && þ» 3     Cd 0 dC    3 À¤Y##Y  d (P(3   !.O d'f@8 8@f'd O.!   3(P( ÿÀ€ÀM21#"'&'&5476763217676/&5476321#"/&'=4763!21+&'&'56?1?632?6=4763@####þè 3     Cd 0 dC    3 À""""@ (P(3   !.O d'f@8 8@f'd O.!   3(P( ÿÀ@•&@W732?&'676726=&'&'&'&'&27167654'&'&#"3732'&?#"'&?60´  21K+$!!4#!   !#4!!/€'!!!!''!!!!'0$`$`”© +8K12 6&'     '&6A,Ô""&&""""&&""á 6H6HÿÀ@•&@O732?&'676726=&'&'&'&'&4'1&'&#"3276765'/&76760´  21K+$!!4#!   !#4!!/""&&""""&&""M H ( = ”© +8K12 6&'     '&6A,D'!!!!''!!!!'+ H ( < ÿÀ@•&@IT732?&'676726=&'&'&'&'&27167654'&'&#"35&'675&'5670´  21K+$!!4#!   !#4!!/€'!!!!''!!!!'”© +8K12 6&'     '&6A,Ô""&&""""&&""`PPÿÀ@•&@K732?&'676726=&'&'&'&'&4'1&'&#"3276765##&'6730´  21K+$!!4#!   !#4!!/""&&""""&&""@€€”© +8K12 6&'     '&6A,D'!!!!''!!!!'ÿÀ@•&@Y732?&'676726=&'&'&'&'&27167654'&'&#"373#&'5#&'6735670´  21K+$!!4#!   !#4!!/€'!!!!''!!!!'0000”© +8K12 6&'     '&6A,Ô""&&""""&&""Ð0000ÿÀ@•&@Y732?&'676726=&'&'&'&'&27167654'&'&#"37/'&?'&76760´  21K+$!!4#!   !#4!!/€'!!!!''!!!!';$$ %% $$ %% ”© +8K12 6&'     '&6A,Ô""&&""""&&""µ%% $$ %% $$ ÿÂþ¾ !,V%3&'&'#6767!15&'&'#536767574'1&#"3276=33276=4'&#"#5½A =Kj#"'&=4'&+"+"#"#"+"'&=4=#&'&547%627"1354'&#671672+"'&=47635€  @     ¶" @ P""     @ @ pE  à Ÿ %%€ð 00 ""0 € € 0ÿÀ€À3M\%1!&'&'5#&'&547%62&#"#5&'##3367347167632#"'&'&57&'&?6'@#þõ   Õ )##( 00  ""&&""""&&""Ó = ( H P-%&   à »00 0'!!!!''!!!!'+ < ( H ÿÀ€À3MVa%1!&'&'5#&'&547%62&#"#5&'##336?21#"'&'&547676367&'5675&'@#þõ   Õ )##( 00 °'!!!!''!!!!'P-%&   à »00 0""&&""""&&""ðÀPPÿÀ€À3Mf%1!&'&'5#&'&547%62&#"#5&'##336?21#"'&'&547676376'&'&?76/@#þõ   Õ )##( 00 °'!!!!''!!!!'$ %% $$ %% $P-%&   à »00 0""&&""""&&""% $$ %% $$ %ÿÀ€À'D213##5476331!"'&=#&'&?6#336753675&'#5&'#à pp@ Ë‹þ¿ à500 00 À €þÀ@  (wþŸ ÀÀ¨0 00 0ÿÀ@À_|±6716727676'&'&#323232316767677676'&'&'&1&'&0101"'&'&5676727676'&'&#723276265'4/&&'&&'1&7676767677676'&'&'&1Q"!+  $X;<%%C1  12-&  #**##+%  #=*ü  ``3*##+*#  &,21  12-&  #*7!  88VF55     % ( y   H Hþ¶       ÿÀ@À)?4716;2+"'&5671673#&'&'"1;276=4'&+ À À ÀÀ` € €   €þà @ ` ` ÿÀ@À)?Up4716;2+"'&5671673#&'&'3#;6767&'#&'&'#;6767&+#367536767&+&' À À ÀÀp* *0* *0**   €þà vJ  ÿÀÀ@&#"5&'6753356736754/5367=&''54/ ,:``;,¶ g MT8 !3@@3! 8TM gÿÀ€À(;6733#&'6735671673!&'&'5!3276=4'&#"`P`$%6€6%$ÿ   ¨è6%$$%6ÀÀ` ` ÿÀ À;HZg€ˆ“4'1&'&#"32767651&'&'67673673#&'#'&'&7673#&'67356753#&'&/;#+"'&=6767&'#33#&'67ð   , '&4=)(()=4&' Hh  hHŒ$$$$`ð`pà € ðP    @ €˜°°0   1()==)(1  `   àpp     P@ P ÿÀ`À )4?&'5674716;2!567!!&'&?6/&7%6'&?X˜ À ÿMD þh Oh h  h h¨þØ  [77 H H H HÿÀÀB3#32#!"'&5476;56733353353353301!&'&?212=PPÀ þ` ÀÐ@(@0@(@0þ@0À@   pàÀÀÀÀÀÀÄ  ÄÿÀ€À151#35#5!35&'&'!#367675#"'&=33'€-!óÀ@@þÀ€p  À ` ``Àà!`à € þà  Ð ```ÿà€ ';6'1&'&7677&17676'&'3"1327654'&#¾ € €G @ @[  v  þ€  €*þ€ €  þ€ € ÿÀÀ)6T6756756767&'&'327&'&76721#54763";276=4'&'&'Ø) 44IR66''  $$$$Ð @ P   ""3_%+G-,66R-;;78! s  p 00 0 € € 0""ÿà@ CGLV_3&+'&'&'&'&??3?376/3676701015&'&'&'##7#717#&'678L56@* ) ð O+( 4K 0P'   "!!88E3/X0!ºN&— -.Ha  72  þÐ e7 F* FD ,"(E88!!¨((&)'a0ÿÀÀ/%#"/&'&'6767'&#3?6/ ' ~5FX;;;;XX;;¯vvHHðF5~ ';;XX;;;;XYHHÿÀÀ%0;%#"/&'&'6767675&'7675&'675&' ' ~5FX;;;;XX;;þÈPPðF5~ ';;XX;;;;X@@`  @``ÿÀ€Àâü&'1919191919191999999999999#399999999999999999999999999999999963#67#396595959 59 59 595959595959595959595959595959595959595959595959595959367&'#1595959595159595959595959595151515951595951595159456767&'77675&'#21#"'&'&5476763'&#"'&?7&'4767'ø '+=D--&&;;&&' ph  Ñ L (B  N ;; )!<À '%--D=,+  +,=0%' p€   n J E-  P 663E.'&JÿÀ€  BP\'&'&=6737#5&'4767676?67675&'&'#&'&'365&'354'&#"Ÿg)G#;  :$G)"#'("#(g Á@  D9U0U* /M)*M/ *U**0U9DÀÀ €€ /#3!6767&'&'!4716;2+"'&=ÀÀ  þàà @ @ €ÿ€þ€þ€  À À ÿÀ@À*3<ENW`k671673#&'&';276=4'&+"67&'&'6?67&'&'6?67&'&'67367&'#ÀÀ@ € € 88ˆ@@€þ€€`@ @ À88888hÿÀ€À-V]e&76'&?#&'673'3#/&54?63332?#65&'&'#6'&#"56767#676713527167654'&'&#"3@@®®þR®®@@ òuòu@@€@à  —@ @þ°@ @9 Ö ×@@À@   ÿÀÀ2HOV^fs9#"'&="/'&'&76?67#"'&5476;12167167!!&'&'53&'&'7#6767135'15#&'&767×  i [[  pYU ` þ)    þ` 00 00 p 00 0`  ·` jNN  `LT  þÙ      p0 p0 p 0p 0P$$$$ÿÀÀ #.;IWdrˆ–ž¦³1&'&'673#&'673#&'67673#&'767&'&'71&'&'671&'6767'&'67671&'676767167!!&'&'53&'&'7#6767135'15#&'&767°""x00 pp00ð""€""P""€""`""ÿ    þ` 00 00 p 00 0`  À""H`¨""""""""""       p0 p0 p 0p 0P$$$$ÿÀ€Àh6/54/176767&'&/76/76'&5&'5&''76/&?1?6=7676=7Ð *C…$#"™( & 0 22 0 & )™"#$…B* 0  0:17 Wz*%)*3 @ '2&99&2' @ 3*(%*zW 71 8 8?  ?8 8 ÿÀ€Àf·¼ÁÆË&?54?5'&'&'676?'&?'&7656756327'&?6&'&'''&'&='%35673#3#3#&'5#&'5#&'5#&'6735#&'6735#&'673567356735#35#'35#35#© ;u  1   --   1 "#  ( +    W00000000P0000 =,<f%* *: @%'++&&@ :* * # +2  2 )@ Î0000p00P00€00P00  `671632!&'&?&&--&&l þ> l ''½½ÿÀ€À-:GTagw16;#367675&'&'#5&'#5&'&'#3#&'567673#&'5673#&'53#&'567%#'?&'!676'P G Iz  ( `         þÐ<=0J  ¾ { ¾À \w z"" à HH @  p  `  P  £c@)z,þÆ:ÿÀ€À (676'&'!;67674/&#"'&'0----þEK{ „ 0~  Ø  '((''(('þ Ø OÉþ§ÿÀ@½AF&'1&'&'5&'#"3!27654'&+'#7#5%?676/73# ! l„  ‰C>BK5)Q !*þ½ p †ƒ  ['#'þø   ¾NK˜ŸX^  !›þ} ÿà€  -HU[hnt’676'&'57+"'&=&'&567673567&'673+"'&5676'&'654'%&'&76757654'1+"'&=&'&567673H. @  0 %ð.% 0  @ xÿ$$$$P@ @  0 0 h   žT2*B4' "0 Ü'4B* 0" H   žTÖ  þðT*T*"+ +"0  0ÿà€  -:“&'&767676'&'"13!27654'&#!%676'&'76/6?;276=?;276=76/&'&+"'&'&+"&+"?;276=hØ  p @ ýÀÐ  þØ  $ 0 $   0   & "  " &   0 x  ˆÐ   Ðj1 D16 61D 1& &1 G ? ? G 1& &ÿÀ@À r‘676'&'13277676/37676'230176767410176?03277676/&/77676'&/&'&#"'&+%676'&'32?6?'&'P      9t  G 2   "#&ƒ5  r< =(` €  {‡  6 @!NX  \ 6A  %"< ð>; > $-ÿÀ/À6CP~1&'&/&'&3276=3327656?6'&'&676'&'!676'&'13276=33276=;27654'&+'&'#è     ;    ;    X  þÀ      0 &+!…#  #DþÎ €€ 2D#  #% `¿ €€ ã  ;$ÿÀ€À#0=–'%'&'&767%6&'&767&'&767676'&''+"'&='&?676;27676;26;2/+"'&='&?&/+"'&='P  þðþð  !  °  8å 0   & "  " &   0   $ 0 $  ¼  ——  œ`(  Ã1& &1 G ? ? G 1& &1 D16 61D ÿÀ€À Fi676'&'53+";!27654'&#!57676/&'&+"76?'&#"32?654'&#"54'&#"À  @X xPx þ¨ :  : X P P   `þ ``   ¿/  a a  /¿€ó P P ó ÿÀ€À Fi676'&'53+";!27654'&#!57676/&'&+"76?'&#"32?3276=327654'À  @X xPx þ¨ :  : ßP P    `þ ``   ¿/  a a  /¿GP P ó ó ÿÀÀÀ LY&'&767'&'&7#&'54'&#"/"'01&'&'&74?676;2'&'&767à----Õ? <(  f   C $L#3 uÀ'((''(('þO  -% 03  P eG  3  ÿÀÀ ?g676'&'533276=7676/&'&+"76?32765&#"'&?76/?'76'&'à     :  :   þç L (B  N ;; 27' L`þ€€€ ß/  a a  /ß Î J E-  P 66 O)&E J ÿÀ À =V&'&7677676/&'#"76?3276=33276=67675&'&'675/ J-$ :     X  »9  Y" a  0ß €€ õpp ÿÀ€À Y676'&'5332765;27654'&+53#5#367675&'&'#+"76?32765À    8@ ÀÀ@ à  à MB :   `þ€€€   @À 0  à  P a  0ß ÿÀ@À ;Ud676'&'#"'&='&'&?676;2&/#"'&=#47167632#"'&'&57&'&?6'p(   :  -   ˆ""&&""""&&""Ó = ( H   þЀ ß0  a J#/ß €'!!!!''!!!!'+ < ( H ÿÀ@À ;U^i676'&'#"'&='&'&?676;2&/#"'&=#%21#"'&'&547676367&'5675&'p(   :  -   '!!!!''!!!!'  þЀ ß0  a J#/ß €€""&&""""&&""ðÀPPÿÀ@À ;U`676'&'#"'&='&'&?676;2&/#"'&=#47167632#"'&'&53&'#367p(   :  -   ˆ""&&""""&&""à€€  þЀ ß0  a J#/ß €'!!!!''!!!!'ÿÀ@À ;Un676'&'#"'&='&'&?676;2&/#"'&=#%21#"'&'&5476763&'#3675367&'#5p(   :  -   '!!!!''!!!!'0000  þЀ ß0  a J#/ß €€""&&""""&&""P0000ÿÀ@À ;U^676'&'#"'&='&'&?676;2&/#"'&=#%21#"'&'&547676367&''6756736757674'&'#p(   :  -   '!!!!''!!!!'@ (   (   þЀ ß0  a J#/ß €€""&&""""&&""ðŽ      ÿÀ@À ;Un676'&'#"'&='&'&?676;2&/#"'&=#%21#"'&'&54767636'&'&?76/7p(   :  -   '!!!!''!!!!'; %% $$ %% $$  þЀ ß0  a J#/ß €€""&&""""&&""k $$ %% $$ %%ÿÀÀ Ks&'&76733276=33276=3276/7676/&'&+"76?3&#"'&?76/?'76'&'Š    &" 5 5 "&Ç L (B  N ;; 27' L  þ°` `` `s8  YY  8sn J E-  P 66 O)&E Jÿà? -:o4'1&#"6763276?676'&'&'&'&'5676'&'&&'1&7676767677676'&'&'&1&'À   !i  i?=&€$$$$ #+*#  &,21  12-&  #**#€  )$#’ a   ( €  Æ       @ÿÁàÀ>K213'&/+'&/#"'&=6767676=4763&'&767  !9W, &`\    . °  À  )##P:  3  øJ J1((   ÿÁ|À>Kz4'1&#"3276=477676/;7676/&'#'1676=&'&76776/7676/76'&'&#"'&011327  .    \P& ,G9! p; O A' L L (B $'    ('2J Jø  3  :P##) 0  Î6 O  -F J J E- 1$ÿÀ@À (J&'&767532'&/#"'&=1'671671#"'&=#"'&?'&'&?    ;   n  &" 5Àþ à a  0ß €ªÿ` `s9  ZÿÀ@À =Jkv676'&'73276=33276=7676/&'#"767%&'&767'&76?367675&'&'367&'#&76/À  …    / J-$ : ¥) 0 7°88  0 0`Ñ0ß €€ õ9  Y" a  A  h;* `  87f(2   ÿÀ ¿ +;H3675&'167674'#"1;7&+357676/&';276=#÷—˜""œ¨ ˜£i¨Z«©6 M € À² b""p  Y¢«.Z Ë   ÿÀà¿ AW`6?#&'3&'&'47'01'6;27&76'&'#"'&='&'&?67#'67&' ˜—œ""ä6®2_  8 $L  V€ 6  Lµ™ 9""þ”Znù ¤ ` @ 4 nZ þýÀÿÀÀ %1>Tk‚3675&##67674';23'6=&'&'#"7676'&'1;276=&'&'#654/&#3?7675367&'#5&'&Goow{ž €¾@‰¢$$$$  € @ˆ@  XX  @H@  XX  @³ A  ²  o+ j‹      þþ 8    8 8    8 ÿÀÀ ?JU`k676'&'#"'&='&'&?676;2'&/#"'&=#6/&7!6'&?&?6'!'&76'Ð(   :  ;   ñPPÐPPþ0PPÐPP  þЀ ß/  a a  /ß €YPPPPþPPPPÿÀ À!V2#5'&'&?676;'676'&'%756733##&'5#"'&=47635675&'67; ' À6  L%2i'((''(('  50,< þÔ®Z  p----Pt m8U \`   dÿÀÀ+N&32765732765&/676'&'5367576/&'&+"?67à  ÀÀ  à    &  &  ¼€ þÀ -nnþÓ @ €ÌþèXX®1 G G 1®ÿÀ€À HZ676'&'431277676/&/77676'&/&'&#"76?6?32?6?'&'3127654/36767&'&'#";#7654'&#"Ð  TG 2   "#3  < =([ D----D€ €)) P P`i@!MX  \ 6A  %5   ‡>; > $-w --DD--  )) P PÿÀ€À HZ~676'&'431277676/&/77676'&/&'&#"76?6?32?6?'&'%"#";32?654/Ð  TG 2   "#3  < =(É “ “ P P`i@!MX  \ 6A  %5   ‡>; > $-·    P PÿÀ€À HZ~‰”Ÿª676'&'431277676/&/77676'&/&'&#"76?6?32?6?'&'%"#";32?654/675&'&'675675&'&'675Ð  TG 2   "#3  < =(É “ “ P PŸ`i@!MX  \ 6A  %5   ‡>; > $-·    P P™00˜¨x00$ÿÀ À HZs676'&'431277676/&/77676'&/&'&#"76?6?32?6?'&/&'&76?6?6'°  TG 1   "#3  < =(> 6 @ 7 @, `i@!MX  \ 6A  %5   ‡>; > $-> 7 o   oL ÿÀ€À*DS1?2372367&'&54767'5&'&'4'1&'&#"3276765'/&7676¸¬: nn #M€""&&""""&&""M H ( = ÀTi B1G+*  "#).&%,Tþ'!!!!''!!!!'+ H ( < ÿÀ€À*DMX1?2372367&'&54767'5&'&'27167654'&'&#"35&'675&'567¸¬: nn #Mð'!!!!''!!!!'ÀTi B1G+*  "#).&%,Tþ""&&""""&&""`PPÿÀ€À*D]1?2372367&'&54767'5&'&'27167654'&'&#"37/'&?'&7676¸¬: nn #Mð'!!!!''!!!!';$$ %% $$ %% ÀTi B1G+*  "#).&%,Tþ""&&""""&&""µ%% $$ %% $$ ÿÀ€À.;Z67167'"#'"#&'54?5'54?5"1354'&#671672+"'&=47635Àf@: nn :¬¸P @ P""   bT:"G+   *+G1B iT’ 00 ""0 € € 0 ÿàý %0?O^m|š1&'&'5673#&'673#&'67673#&'767&'&'571&'&'567&'56767'&'56767&'56767&7163!2#!"'&=&'&'°""x00 pp00ð""€""P""€""`""ü È % ÿ % "" H`¸"""" """"""œ  & &ÿÀ@À A[r"1354'"1354'&#"133276=67&56767654'&#!27167654'&'&#"3732'&?#"'&?6` @ À @ ÿ $#8  ##8 þÀ'!!!!''!!!!'0$`$`À `` ``    ;++ C C=.- þ ""&&""""&&""á 6H6HÿÀ@À A[j"1354'"1354'&#"133276=67&56767654'&#!4'1&'&#"3276765'/&7676` @ À @ ÿ $#8  ##8 þÀ ""&&""""&&""M H ( = À `` ``    ;++ C C=.- Ð'!!!!''!!!!'+ H ( < ÿÀ@À A[do"1354'"1354'&#"133276=67&56767654'&#!27167654'&'&#"35&'675&'567` @ À @ ÿ $#8  ##8 þÀ'!!!!''!!!!'À `` ``    ;++ C C=.- þ ""&&""""&&""`PPÿÀ@À A[f"1354'"1354'&#"133276=67&56767654'&#!4'1&'&#"3276765##&'673` @ À @ ÿ $#8  ##8 þÀ ""&&""""&&""@€€À `` ``    ;++ C C=.- Ð'!!!!''!!!!'ÿÀ@À A[t"1354'"1354'&#"133276=67&56767654'&#!27167654'&'&#"373#&'5#&'673567` @ À @ ÿ $#8  ##8 þÀ'!!!!''!!!!'0000À `` ``    ;++ C C=.- þ ""&&""""&&""Ð0000ÿÀ@À A[t"1354'"1354'&#"133276=67&56767654'&#!27167654'&'&#"37/'&?'&7676` @ À @ ÿ $#8  ##8 þÀ'!!!!''!!!!';$$ %% $$ %% À `` ``    ;++ C C=.- þ ""&&""""&&""µ%% $$ %% $$ ÿÀ€À4J_'&#"?765'76'&/"1;276=4'&+"1;276=4'&+;276=4'&+"b4& // &4b € €à € €  € € Š00%54%Ê À À @ € € `@ @ ÿà€ $+A"13276=7#54'&##3?3?#'3?#3327654'&#"   UU uJZJZ*J[JZ ZJZJ U   U  þ€ ¶ª  @ µ µÀ µ µÀ µ µÀ  € 6ªÿÀ€À*5[`!2#!"'&54763675&'&'675675&'!#3+"'&=&'&'535#"'&54763#35` ÿ €þ@(()   )H( ¨PPÀ þ@ À È@@¸@@X@@8@@`)@ @)`@  @@@ ÿÀ€ =Wf33276=32&#"54'&#"327#"#&'&'47676347167632#"'&'&57&'&?6'ÕK  K+-%&   Év‹""&&""""&&""Ó = ( H  @ @ x#+ @  @ L þ°'!!!!''!!!!'+ < ( H  ÿÀ€ =W`k33276=32&#"54'&#"327#"#&'&'47676321#"'&'&547676367&'5675&'ÕK  K+-%&   Év'!!!!''!!!!' @ @ x#+ @  @ L À""&&""""&&""ðÀPP ÿÀ€ =Wp33276=32&#"54'&#"327#"#&'&'47676321#"'&'&547676376'&'&?76/ÕK  K+-%&   Év'!!!!''!!!!'$ %% $$ %% $ @ @ x#+ @  @ L À""&&""""&&""% $$ %% $$ % ÿÀ€ 0CPn#"3547632356756767'&'&+#"'&=#"'&=4763221#54763";276=4'&'&' KvÉ  ,K  @   ° @ P   ""  þ´ @ @€%-V @ @À@ @  00 0 € € 0""€[$76716567656765676+5!2#!"'&54763@ c c c ‚ D@@@@@€ @ ýÀ K  ”‹  ”‹  ”‹  Âëþõ   €€*/Z;+&'6735#&'6735#&'6735#&'6735#&'673!!#3#3#3#3+=;  X þ`  €XPPX(  (þ€€(  (XPPXÿÀÀ /H376'&'##901!6767&'&'&'01&'&'/'&?'&7676À€/ Ä /€€*) )@) )*////////`G  G "#78R))R87#"Ð////////ÿÀ€À6CP_yˆ&#!1#567671367#&'&'67676725&'&'#'3#&'5673#&'56?367&'#5&'4'1&'&#"3276765'6/&767Rˆv  @$%%%,;-%& vˆò    à @""&&""""&&""c H ( =» [ þÀ `:) %%% #{ [»@@€@@À ð'!!!!''!!!!'+ H ( <ÿÀ€À6CP_y‚&#!1#567671367#&'&'67676725&'&'#'3#&'5673#&'56?367&'#5&'27167654'&'&#"35&'675&'567Rˆv  @$%%%,;-%& vˆò    à °'!!!!''!!!!'» [ þÀ `:) %%% #{ [»@@€@@À þ€""&&""""&&""`PPÿÀ€À6CP_y’&#!1#567671367#&'&'67676725&'&'#'3#&'5673#&'56?367&'#5&'27167654'&'&#"37/'&?'&7676Rˆv  @$%%%,;-%& vˆò    à °'!!!!''!!!!'$ %% $$ %% $» [ þÀ `:) %%% #{ [»@@€@@À þ€""&&""""&&""% $$ %% $$ %ÿÀ@À.;HUbo3#3#5&'&'#&'&'567673754763&'&767%3675&'#3675&'#3675&'#!3675&'# pOYf°  °fZ 0ÿ  p  þ  €  À@@àp  pà@@ ð  @@@@p@@@@ÿÀ€À)6CP_l‹63&'&'#131!&'&'6767373675&'#3675&'#7676'&'73#&'567"1354'&#671672+"'&=47635.ˆv  00 @@þð  vˆÞ    ð2222 À @ P""   » [ €0  0%` @ [Ë@@€@@H*,,**,,*x ` 00 ""0 € € 0ÿÀ€À"-17135476;&'&'!'&?6'&?6#7  €ÿ«` ` `    u€€€  þ€u` `     þ뀀ÿÃðÀ8AJ&#"767676'4'&/6732;2?631&'&'567&'7&'67 ½ /.VV./ ½m (0( ))8`½P3EEAB+ +BAEE3P— 66 v))v†ÿÃðÀ<LU&#"767676'4'&/36767533#"/&54?';#"'&=67&'67 ½ /.VV./ ½l, @"0 c (  €½P3EEAB+ +BAEE3Pþå@ "3 * ~  00ÿÃðÀ4&#"767676'4'&/671672763/&' ½ /.VV./ ½}S S½P3EEAB+ +BAEE3PÚR RÿàÀ ,CN67167!!&'&'6757675&''&675367&'#5367&'#3&'675@þÀL B B ”000@ `þÀ@A  fn   fn @`P   ÿàÀ "D1!6767&'&'!676'&'67167"/'&'&?6765@@þÀ`P7 1 ) þÀ@p  hf78  ` *;ÿàÀ Vhq1!6767&'&'!76'&&'&'&'&76'&'&'67676'&7676767271654'&#"3&'67@@þÀ    X þÀ@>¢   ÿÀ€Àjs3#5367&'+3#5367&'#&'5'#"'&5476;'#&'&'67673'+#&'&'6767;'54105676321167&'ßA))(((())+' $)# #Z Ÿ•))P))Pd+  )$_     EÿÀ€À0=O¨"'&?32?76/767&/76'&'&#&'&7674'1&#"3276547163276765&'5&'&'&#76765&'547632!"3!27654'&+=  9 7 7 9 9 7  7 9 $$$$   8     """     þX @ hÀ 7 9 9 7 7 9 9 7 `  @   5 !   ! 5""" !   !  ¨   ¨`@€-&'1&'!!5476;57#21#"'&54763@þ@` €€€€þ   @ÿ€  þÀ€€@   ÿÀ@¿37I&'1&'67676'367673#"!&'&'676753271654'&#"3  à†   …€ þ €€€þ        €þ€€€   ÿÀ@À6+'!"'&76? à   €€ÿ   ຠ þà àà   ÿÀ€À37/&765677662#!"'&5476;576?3'ò PP (({¨  ýÀ € ¨MMPH H $zz$ €       €þÇ€€ÿÀ@À"9&!76'&76/!?654/&;53276/&/è "þm! PP !’! PPµ¨  À``  ¨º  H H  H H¡€        €ÿÀ@À 76'&76/!675&'&'!7&;53276/&/x PP !q""3þ!»¨  À``  ¨– H H ((3""}€        €ÿÀ8À)@&5&''&?6'!&5&''&?6'&;53276/&/Ò(( PP `(( PP ÿ¨  À``  ¨P $zz$ H H $zz$ H H7€        €ÿÀ€¿)3276/&/&&;53276/&/¡ ¨’  ¨š¨  À``  ¨¹z €)   €  €        €ÿÀ@À *!54'&#!"#6753675#!&'567@ ÿ àþðè   @þp@@ÿÀ@À *7JU32!54763;&'5#&'5675&'732!54763;&'5#&'5675&' À ÿ  РÀ À ÿ  РÀÀ   `þp€@@à   `þp€@@ÿÀ@¿3UZ^o€&17676'&5476'&'!1767654'&'&65&'&'76?37676'#73'#7'6'&76'&547%&7654'?      ­  ‰ Ü ‰¢†Q&L&}   &   ¾ 2::2  '--'  '--'  2::2 £þÒ  --  .Û ³SSƒ #''#   #''#ÿÀÀ;?EIMX6#+32+"10+"101#"'&5476;7#"'&="'&76?'3'7'#7'''367&'#ò     E _þ` E     I;:uu??t .#n- "v  ½P P À   À P PþC11À55SC&&CðÿÀ€À#0=JWd‰67167335673+&'&'3675&'#3675&'#3675&'#73675&'#3675&'#%##"'&=#&'&'67&56767  ` (   ` @      °    þà "  #))  HH à     P  p    p  Ð )#   #) ))ÿÀÀ$%'&76767&54?632#"'XcB ÿ P Ac _`  ëcA P  Bc  `_ ÿÀÀ 6K`3673#&'#/&'6?64716;2+"'&=32+"'&=476;!2#!"'&=4763ñYX  XYÀÀ/     ÿ` ` À ÿ » H  H `  ` û @ @€ @ @ @ @ ÿÀ€À4:GTi67167!322+&'&'#&'&'#&'&'35'#676'&'%&'&767&#3?6/ @ 3M  ))€))  €M3ÿ  pþñ'¦¦'PP  0M @  )))) @ÐM`Ð0  A''PPÿÀ€À4:GTh67167!322+&'&'#&'&'#&'&'35'#676'&'%&'&767%67167&'&'& @ 3M  ))€))  €M3ÿ  pþÀ   0M @  )))) @ÐM`Ð0  !! !!ÿà€ BGTa671673332+&'&'#&'&'#"'&547635"'&=476353'#676'&'%&'&767 à%4)5  ))€))   `V++à  p`$w  ))))  ` €``Ð0  ÿà€ DIVcz“1"3";676736767327654'&'&'#&505'&'#&'#3#5676'&'%&'&767'567/&'567667567&'&'567`   ))€))  5)4%à ++Vþðp  ã# # }    `  ))))  w$```ÿ  0É4+`  4+`  @@@  @ÿÀ€À*IR[d1??&=&'1=15&'&'367533675675&'&'!673#7&'6767&'Ȉ{2[ZX  ÿ P˜àÈèÀkQ @%R( !"RŽa°à! +((+ !à  O11aÿÀ€À "4F]jw67!!&'67!!&'676'&'6716732#"'&5&'1&'6;+'+"'&547676;27676'&/&'&767Pý°Pý°S  3`V Î` Rg3 à 0 ` ,  q--..¨þ0H$$$$      >0 /‚$$$$@'((''(('ÿà€  /FS`t&'&7671;6767&+32765&'&'#"'&+";2767&'&'7&'&767676'&'"13!27654'&#!Ó  ³ V`ÎR `g ` 0 à 3¬  ñ--..þÞ @ ýÀ`$$$$     >/ 0‚$$$$`'((''(('à   ÿÀ€À  +8O\l{ˆ&76/!?6'&?6'&!76/&%676'&'3674'&'&'&+""'676'&'136767&+67&'&'#"3'676'&')HH.HHý°HHPHHþé$$$$l°&P($  8 FpF 85  ¹HHHHþHHHHù  P  # %p  P pÿÀ€À+8GVivƒ1!6767&'&'!47163!2#!"'&5&'&76736767&+367&'&'#"'&+"3674'&'7&'&767676'&'`))À))þ@ À þ@  €8 Fm8F YP)°)ŒÀ$$$$À)þÀ))@)` þÀ @P  …  / &  & q  P   ÿÀ€À-<O\iz‹œ367&'#"675676'&'136767&+67&'&'#"3#&'&+"3674'7676'&''&'&76?36754'&+5&';67&'#!3276=&'#0Xh €  8 FpF 8Y)P)°$  P  xX hþ8 hXÈh X hX°  P &  &  p $$$$Xh þ`Xh  hXÿÀ  %?N4716;2#&'&'"'&535#47167632#"'&'&57&'&?6' @@@ 3) `@@€""&&""""&&""Ó = ( H €  «,9&!')  ``þð'!!!!''!!!!'+ < ( H ÿÀ 05w‰’"13674741&'&'676705&54767527654'&+53#1766767676'&76767&'&'&76'&'&'&''&721#"'&5476367&'  ), @@@@@@xh  (   þà)r   ``¸X   `ÿÀ€À gŠ•6'&?'&&/&&/&32?32?6/&'77414567&'767&'76'&&6'76'&&/27167654'&'&#"35&'675&'567ùXXÇ      E E '& ", $. +F.;  :. ¾'!!!!''!!!!'—XX '& *! &' *! &' D E  ! "2(  5 .< !!:. þ""&&""""&&""`PP ÿÀàÀ?H671673&'&'54'&#"&'&'567673276=#&'&'7&'67)&&'&::&'    '&::&'  )`)&V¸:&''&:P ¨  ¨:&''&:P ¸)ÿà€ '@Yr"13!27654'&#!"13!27654'&#!'?76/76'&'&!&?76/76'&'3?76/76'&'&  @ ýÀ @ ýÀ7777777777777777¾77777777    þ€   ù777777777777777777777777ÿÀ@À F&'&7673276=33276=3276/7676/&'76?;à  ˆ     ;%::%: €$$$$þ°P PP P]%  N..N  %]ÿÀoÀ F&'&767&/&'&3276=3327656?6'&'&#"'"1"'  g% +   , €$$$$i   )þý `` +  ÿÀ@À!;J671673;#!&'&'#547167632#"'&'&57&'&?6'  €8$#"ÿ€€€`""&&""""&&""Ó = ( H €€ '.->-%%€@€€ð'!!!!''!!!!'+ < ( H ÿÀ@À!;T671673;#!&'&'#521#"'&'&54767636'&'&?76/7  €8$#"ÿ€€€0'!!!!''!!!!'; %% $$ %% $$€€ '.->-%%€@€€`""&&""""&&""k $$ %% $$ %%ÿÁ€À"FP]30101#!3#/&+'4#676=#36767&'&'!!7676/3+0101547&'&767@à.@ àDLG)"I.+ª  ýà  ! TJ(ŸJEJ€  ('2J@þÀ[?##) þÀ@ `  þ  2  ~0Jg  ÿÀÀQ671673276765&'5&'&'&#3276765&'567673276= ..""33""3""..  H 66 3""""3""3 66  È È €ÿà€ ,1%+!"'&54763!5!"'&='&'&54?676325%!€ P@þ€ €þ   $$$*)%FÀþÀ@•€   0 u  /!¤ 9IÿÀÀÀ<Rdv"'&?67!/&+3#"/#+&'&?&'5676735#"1;276=4'&+4'1&#"32765271654'&#"3W  **  q()#B( 7€7 (B#)(qI € €   `      0) /B 77 B/ )0p     À     ÿÀÀ!%#";27654'&+576'&'!'!  ×@ `` @× þ@à“&“ÀÖ³   ³ÖÓ““ÿÀÀ*&'&'676725&'&'67672=67%6ó )))ÿ)))@ º Hþø"""’MÐ"""H` ÿÀÀ4%#"/&'&'676727167654'&'&#"3 ' ~5FX;;;;XX;;Ð'!!!!''!!!!'ðF5~ ';;XX;;;;X""&&""""&&""ÿà•732?675&'&'&'&'&0´  ´/!!4#!   !#4!!/”© ©,A6&'     '&6A,ÿÀ(À&'?76/76'&/=  @h€h @®„g’ DD ’g„ÿÀÀÀ-727167654'&'&#"313!2765&'&'#à####.K32  „  23K\À""""023K   K32 ÿà "/<IVcxŽ67167!!&'&'3675&'#%3675&'#%3675&'#%3675&'#%3675&'#%3675&'#;276=4'&+""1;276=4'&+€þ€0  p  þ  p  þ  p  ÿ € €  € €`þÀ@þð    p    p     @ @   @ @ ÿà  )#53#53'#533#51!6767&'&'!À    à     €þ€`€€À€€@€€@€€þÀ@ ÿà $).38=B1!6767&'&'!#5;#53#533#53#5;#5#5;#53#53@€þ€XXX8XXðXXþ€XXèXX@XXÐXX8XXðXX þÀ@@@@@@@@€@@@@@@€@@@@@@ÿà $).367167!!&'&'335#)!535#)!535#)!5€þ€@@@€ÿþ€@@€ÿþ€@@€ÿ`þÀ@@@@@€@@@@€@@@@ À`1#"/&5476327632· ÿ € ié W ÿ € jê  ``)6514'&#"'&#"32?327654/7W ii jj ii jj) jj ii jj iiÿÀÀ3%#"/&'&'6767675367&'#5&'#3 ' ~5FX;;;;XX;;è@@@@ðF5~ ';;XX;;;;XX@@@@ÿÀÀ%%#"/&'&'6767%367&'# ' ~5FX;;;;XX;;þèðF5~ ';;XX;;;;XÿÐðÀI4'1&#"3276=6716'&'&6767674'&'&&'&'4767    ) 66CC66 (  21KK21  à àY "/08C66  66C80/" ##)K1221K)## ÿÀ`À':Na21#"'&5476321#"'&54763#"'&54763221#"'&=4763#"'&=47632@  €  `      `   À þ@ À ` þ  ` €ÿ  @     €@ @ ÿÀñÀP]/#"'&/&''&/&'&?&547'&76?6766?6763276676'&'ð ,,   8  8   ,,   8  8  ð---- ( (   ::   ' (   99  ©'((''(('ÿÀ@ÀJ%1#+"#"+"'&=4'&+"+"#"#"+"'&=4=#&'&547%62@  ! @      À   @ @ pE  à á ÿÀÀ(1&'&'&547676776/5&'F::$""$::FF::$""$::F ` UÀ!"<=CC=<"!!"<=CC=<"!xˆ @ 9{ÿà@ .A#"3547632367674'&'&+#"'&=#"'&=47632KvÉ  ÉvK  @     þ´ @ @ L @ @À@ @ ÿÀÀ#@I4'1&#"'&#"32?654'&#"51!67675&'&'##"/#&'67  I € € Ià€e.-fp  óJ € € JóþÀ  --8ÿà ,"1!676754/&'&#!!##&/&'#7y9€9þò03  x  30  ã\\ã @ÀÀ ÿàð @#";276=4'&#"'&'&767654'&#"#"'&547632‚2 €  ,9999,,,,9999, 1@@1//1@@1  € 3,,,9999,,, //1@@1//ÿàð 5p767632#";0109276=4'&#"'&'&7673276=1767676'&'&#"'1'327654'&+"##i 1@@12 €  ,9999,% B  ,9999,%  1@@12 €õ"//  € 3,,%.  V€ 3,,%.  "//  ÿà@ '9KVal67167!!&'&'271654'&#"374'1&#"32765271654'&#"37367&'#367&'#367&'#Àþ@€       `àààààà`þÀ@À   €  à   ø``ÿÀÀÀ +35&'&'567673!&'&'567673 ""@()==)(þÀ000""00=)(()=0ÀÀÿÀÀÀ+4'1&#"3276=76?675&'&#"'&5@   @@;EI"  $&E   þÐp €" ø ÿà 9163&'&'=676767&'&'567672&'&'Q99   """:9HH9:"""   99Qp32O € "00H9:"""":9H00" € O23ÿà@ &'&#3767@‡DD‡€  x@x  €ÿàÀ '/#&'&'56767376'&767&'&76-‡DD‡p!!   þ€  x@x “//  ÿÛ€¥/@W1'&767654'&'&761'&767&'&76'&767&'&76'/#&'&'5676737611 )) =!! 33 I367&'#367&'3367&'#3367&'#367&'#'67&'XH`¨@ þpþ` þpþpþpþ` ÿêµ '32?654/&+21#"'&54763°†°• p  p–°†°    ÿà *<'&?654/&765676732#"/&574'1&#"32765Y€''pp€þ§ –¨†¨   ™*66*qq##¿– ¨†¨V  ÿÀÀÀ ,7B1!327654'츝4'&+!!!"'&547637673#&'3#&'67`))    þàÿ  ÀÀÀÀÀ)þÀ)  @ @ þ€@  ð0ÿÀ€À2?367&'&'!šš þà þHll¸  ÿÀÀ<E1353354/&+!=!3276=&'&'!;!67675'&'67€@ã@ãÿ@  þ€  À``CCþ  @@ `` @@ˆÿà 6#!6767&'&'#'&'#21#"'&'&5476763• K€K "z" k  ÿ   ÿàÀ /3&'#";27654'&+73#";27654'&+#7þ  ˆ `   ` ˆp88‹þ•   00   kû••ÿà€ )6C4716;+"'&5476;=#"'&567167&'&'#336767&'&'+ 0€6%$$%6 0  àppp p€ $%60"#6%$      €@€ÿà€ )4716;2+32+"'&5476;#"'&5€ À ;…@ À ;…@ €  þÀ   @ ÿà@ 5Y53#";27654'&+33276=&'&'+32765%"3#32?6'&'#53676/@@  €  @   pp   · @   @ @   @@ þÀ   @  0  0 W @À@ @À@ÿàÀ 5Y53#";27654'&+533276=&'&'+32765176753?654/&#5&'&@€ ` €   °°   7 @À@ @À@@ €   €  0  0 é @   @ @  @ÿàÀ ';O1+"'&5476;21+"'&5476;2%47163!2#!"'&51#!"'&54763!2 à à à à þà € þ€ À þ€ € €  ÿ  €  ÿ  ÿàÀ ';O4'1&+";27654'1&#!"3!276513!27654'&#!"%4'1&+";2765` À À ` þ€ € þ@ € þ€ ` À À €  €  ÿ  €  ÿàÀ ';O1+"'&5476;21+"'&5476;2%47163!2#!"'&51#!"'&54763!2À à à à à þ@ € þ€ À þ€ € €  ÿ  €  ÿ  ÿàÀ ';O4'1&#!"3!27654'1&#!"3!2765%13!27654'&#!"4'1&#!"3!2765À þ€ € þ€ € þ@ € þ€ À þ€ € €  ÿ  €  ÿ  ÿð 4HUb3675&'#"13!27654'&#!"13!27654'&#!"13!27654'&#!'3675&'#3675&'#(00˜   þà   þà   þà°000000           ˜00ˆ00ÿúÿàÀ ':N\47163!2#!"'&54716;2+"'&532+"'&5476347163!2#!"'&=&?6/ € þ€ À À À À À à € þ€ f  f€  €  `      ³ O ž OÿàÀ ':N\47163!2#!"'&54716;2+"'&532+"'&5476347163!2#!"'&57'&'5676 € þ€ À À À À À à € þ€ €f  f €  €  `      ³O ž O @€&67167!!&'&'%/=?6ÿ/``@ÿ ÿ @ € @ ÿà -:67167!!&'&'&#"'&#";276/676'&'€þ€D W @` ÐxÔ  `þÀ@k ! P  ° ÿÁ€À11#"'&'&'&'6767€''  ''66RR66-;;78! !87;;-R6666RÿÀÀ $%&'1&'6767!67167632#"'&'&'À66RR66þ@!"<=CC=<"!!"<=CC=<"!ÀR66þ€66RF::$""$::FF::$""$::FÿÀ€À+&'1&'6767676;2'&'67&'&'&'ÀR66!!''  ''!!66R` 0"@66R/??77 77??/R66°0 "ÿÀû» M"7654/?6?''1!676754'&#"#!"'&5476;27654'&+ØbþÔ  Y ¨b¨L)))  ÿ ` `ªbÜ X  ¨b¨²)ÿ))` `   ÿÀÀi"32?#7654'&#"327654/3'&#"32?654'&#"5332?654/&#"#5327654/ @ s @ @ s @ @ s @ @ s @· @ s @ @ s @ @ s @ @ s @@€ %767&'&54'&#"3276= À   À  @    ‘ þÀ ‘  €*%//#"'&5476327676   ¬¬ v  v @ v  v  þÀ € %767&'&'=&'&7675̬¬ÌÀ À  @  **Y`€         @ÿà€ &7%67&'%I þà™ þ  °°@€+136767&'&'#3136767&'&'#0      À      € þà     þà    €€67167!!&'&'ÿ@ÿ€ 7'&'6767=676'&'55««ËÀ À  @  **Y`€         @€*7??327654'&#"'&'&««   «« v  v @ v  v  þÀ @€ 7'&'676547632#"'&=5À   À  @    ‘ þÀ ‘  ÿàÀ #2!&'&?6367167!!&'&'à° þ  °à `  þ   ÀÀþp    ÿà 71327654/7654'&#" À ªª À× À ©© À@ÿà@ %1#"'&54?'&5476327 À ªª À× À ©© ÀÿÀÀ267167654'&'&''5#&'6735673#&'F::$""$::FF::$""$::F@@@@@!"<=CC=<"!!"<=CC=<"!¨@@@@ÿÀÀ$67167654'&'&'3#&'67F::$""$::FF::$""$::FH@!"<=CC=<"!!"<=CC=<"!ÿÀÀ267167654'&'&'676/'&?'&7F::$""$::FF::$""$::FQ////////@!"<=CC=<"!!"<=CC=<"!Q////////ÿÀÀ(67167654'&'&'/&7676F::$""$::FF::$""$::Fq€@/o@!"<=CC=<"!!"<=CC=<"!/€@/oÿÀÀ<N67167654'&'&'6716;&'54?65&'#"'&75471632#"'&5F::$""$::FF::$""$::FV:  ,: 6   @!"<=CC=<"!!"<=CC=<"![ $   »  ÿÀÀ/A67167654'&'&''35#&'6733#&'6?21#"'&54763F::$""$::FF::$""$::F(0P(  @!"<=CC=<"!!"<=CC=<"!°@XÐ   ÿÀÀ9s…2132+#"'&=&'&'#"'&5476;67675476315476326767#"'&5476;&'&'#"'&=32+721#"'&54763 H11   12G  H11   11H • ,  ,   ,  ,  •  À  12G  H11   11H  H11  þà,   ,  ,   ,  @   ÿÀÀ -%6?67&'&'%67167632#"'&'&'oþõ#66R?0."66R?0 þc!"<=CC=<"!!"<=CC=<"!# 0?R66".0?R66#þõoF::$""$::FF::$""$::FÀ€#71327654/!27654'&#!7654'&#"   j3 þÍj  ×   i  i  À€#%6514/&#"!"3!32?·   jþÍ 3j  ©   i  i  ÿà€ #"32?32765327654/×   i  i  —   jþÍ 3j  ÿà€ #312?654'&#"4'&#"'&#"©   i  i     j3 þÍj  ÿà *#367&'&'&'67673?654/&3pK12  )`    @21K8%%  )@   ÿàÀ 3Mg"13276=327654'&+4'1&#";27654'&+5"1;3276=4'&+4'1&#"#";276=   @ `  ` @ @  `€  @ `   ` @  þÀ `  @@  @ ` þÀ @  `ÿàÀ 3Mg4'1&#"#";276="1;3276=4'&+4'1&#";27654'&+5"13276=327654'&+   @ ` € @  `@  ` @   @ `€ @  `ÿ  @ `  `  @ÿ ` @   °à%1#!"'&54763!2° þ  ` À  ÿÀÀ$667167654'&'&'&'567471632#"'&5F::$""$::FF::$""$::F   @!"<=CC=<"!!"<=CC=<"!€ppà  ÿÀÀ8HQZ+"'&5476;#"3!276=4'&+65&'&'#'&'#!1+7673235#367675#¿"H   * À * %33%P H#  þ À À{;   @ @ %**)+% ; È° àà °àÿà :1673+0101"016756736767674'&#"+<--3=XH'!,4..>C66  h`"!7 ./9K0:$$''BAQA7ÿÀÀÀ :6676&'&'&'676727676'&'&'&'&3Ÿ)% 32??32++GC%      1» &.  @55  55@Z66I:/ "   '66S`21KK1221K;,   °V88 9#$   ,;G11ÿÀ±À?23#  @h€ŽÀ„g’ D¸þÿà #K%6514/&#"#";32?%271654'&+327654'&+"'&5476;÷ € JÓ ÓJ €þ© @))@ @ @© € I  I €·  )ÿ)   ÿÀÀ%147163!2+#!"'&?6?#"'&53#"'&=   9 þÀ 9  €@     ”@ @” þ ` `ÿÀÀ#O"1;32?3276=4'&+1!676754'&#"!&'67327654'&+@ SÊ É   ð""@"  þÀp pÀ  É ÊS   "þÀ""p p@  ÿà &J32+";6767&'&'#"36514/&#"#";32?`@ @ @))@  € JÓ ÓJ €` ÿ  ))  · € I  I €ÿÀ@ÀFR^##+";27654'&+"'&5476767676767&'#654'&'3&'&'&'67673à j#!%%  À  %%""j þ¡T&#Ÿ#&TÀ E21!       !12E pC//!##1Ž!//C1##ÿÀÀ"@I#"'&=#"'&54?632#"/367673!&'&'5676767&'  I € € Ià€€þ€pSó óJ € € Jó  hÿàÀ 1C&'1&'"'&27676767676'&767651'&767676À 998,+ 998,+ë*  %%2 `+,899 +,899   * 2%%ÿÀÀ!&'1&6?6'&/&&'&'76/¥ X< ?  //  ? > -- > ?  ..  ? > --¹  ? > -- > ?  ..  ? > -- > ?  //€ 4Hw21+5321+"'&5476;71+"'&5476;221+"'&5476;'3#&'&'56?673#"'&=&'à ÐР @ @@ 0 0 ` @ @X  D--. %5  `  @À   @      `--D>B/ %X 88€ 4Hw"1;5#"1;27654'&+'1;27654'&+""1;27654'&+7#367675&/&'#3276=67  ÐР @ @@ 0 0 ` @ @X  D--. &5  `  @À   @      `--D>B/ %X 88ÿÀ€À 4Hw471632#5471632#"'&='21#"'&=4763471632#"'&=5327327#&/&'5676732+36767  @À   @      `--D>B/ %X 88  ÐР @ @@ 0 0 ` @ @X  D--. &5  ÿÀ€À 4Hw13276=#713276=4'&#"2716=4'&#"3713276=4'&#"'632676325&'&'#327654'&+&'673  @À   @      `--D>B/ %X 88  ÐР @ @@ 0 0 ` @ @X  D--. %5  ÿÀÀ.%&'1&'&#"3276767%63#/&?!"<=CC=<"!!"<=CC=<"!þçG¶¶GppÀF::$""$::FF::$""$::FGGppÿÀÀ.713276767&'&'&#"'&?#&'673'&76!"<=CC=<"!!"<=CC=<"!G¶¶GppÀF::$""$::FF::$""$::FGGppÿÀÀ.67167654'&'&'/&'5'&?6F::$""$::FF::$""$::FGGpp@!"<=CC=<"!!"<=CC=<"!G¶¶GppÿÀÀ.16767654'&'&'&7656776/F::$""$::FF::$""$::FGGppÀ!"<=CC=<"!!"<=CC=<"!þçG¶¶Gpp ÿÀÀ +3>LT]%#&547373#654'7#&'+676766+67673#&547&'3''&/&'&'3!1673`ºº{{pt(<-,•°   Ñt,-<({{» °  <(<-,tf,-;'tÀ!!!!@!!!! b6'(87(##(78('6b !!!!ÿ(77(##_b6'(88('6bÿÀÀ-6%671674'&'&+&'54?6'&'&#2?3&'67`D--M9MD-- ¶¶þð€--DL9M--Dµµ Xÿð !5I]j#"/&7676#"/&767674716;2+"'&54716;2+"'&547163!2#!"'&5'&'&767˜ H (7 H (7H à à à à @   þà p  šP(=  P(= f        0ÿà 67!/&='&7 ° ·@ · ‰à  0 OàÿàÀ#<3#567#;5&'&'#5&'&'##+"'&=#!67675¸ 8@À€À@€À @ À€(((``(è   €€ÿÀÀI"3#5&'&76753#32?6'&'#53?654/&#53676/ @  `@ @`  @ @ `@ @`  @· @`  @ @ `@ @`  @ @ `@ÿÀ€À -A[k&'&767!&'&76767167320101#&'0901674'6;#'47167632#"'&'&5671673!&'----p----þ.*)Ö•)*.Öµ   `&&8v8&&þ¶À'((''((''((''(('þÕ. ;%%; .`  þû8&&&&8ÿÕn«7o%6514'&'&?6#"'&'&?6'&'&32?%1?676'&'&'&'&54?63276?6'&'&#"D**'43,  q  &-9:-pýø**'43-  p  &-9:,q´-:9-%  !q  ,43'**p-:9-%  !q  ,43'**pÿà€ &71!6767&'&'65&'&'"&'&'01()=p6%$,)$$-D--+p=)($%6/"# )$--D$$0ÿÀÀÀ(3+"3!67674/&=27654'&+53#765 €   m 6 l   `@#«"À  …°°…  Å……$88$ÿÀøÀ+5BO'65&'&'27&#67674'6'&#"3276/'676'&'&'&767' 00  0''0  00  v œ@×0  '0  00 '( 00  0 —v œ@ç  ðÿÀÀÀ,32#&'&'67673#353#&'&'6767Ð|D À   P@À@ à  ÀDÜ    €@ÿ 0    ÿļ·E&1"32?632#"'&54?632#"'&54?632?654'l¸ !++!˜ ˜3AA300¸%//%##°  °l¸!++! ˜ ˜003AA3¸##%//%° °ÿàÀ ,91!676754/&+4716;2+"'&=&'&767@@Mó À À  $$$$ þÀóM` @ @   ÿàÀ 67167!!&'&'@þÀ`þÀ@À€';47163!2#!"'&547163!2#!"'&51#!"'&54763!2 € þ€ € þ€ À þ€ € `        ÿð 4HUb676'&'7"13!27654'&#!"13!27654'&#!"13!27654'&#!676'&'7&'&767@  €   þà   þà   þà€  00P           PÐ  ÿà 4GZm6733#&'6735#&'&'&?6763#&'&?6'!2#!"'&54763!2#!"'&54763!2#!"'&54763 P?  #!X H‰ ÿ  ÿ  ÿ ˆx`þã  &  N            ÿà >l6767676'&'&'&'&01#"3!27654'&+0101#&'&'&7'&'&'"1&'&'&2997676'#¡!8    E7: ] À Ò7 ¼!8  E7:L 0   @#    Á    @ ÿàÀ ;O4716;2+67675#"'&5476;2+&'&'5#"'&547163!2#!"'&5 ` )) ` --DD--  € þ€ €  €))€   €D----D€ þ€  ÿà  )753#3#553#7#53%1!6767&'&'!@    à     þ€€þ€À``@````` ``àþÀ@ÿÀÀ&5147632#"/7'}#þƒ#Nii}#þƒ#iiÿÀ€À4:GT13676736767327654'&#=4/&+5&'&'!3#5676'&'%&'&7670  ))€))  M3 þÀp3M€þÐp  À þÀ ))))  @ M0  M`ÿ  0@€#+3M1!6767&'&'!#5'5367167#7&'1&'3'21#"'&'&5476763@Àþ@@@@@€@@@à  €ÿþÀ@À@À@À@   @@7312?6'&'!‰ € ÿ €I €€€@@"!676/· €  €7 €€À`7&514?6/ €€© € ÿ €@`76514/&?÷ €€© € ÿ €ÿà 67167!!&'&'3#!#3€þ€@  €  `þÀ@@ÿÿÿà@  6312!&'&?'&767!#"'‰ € ÿ €€  € — €€þR€€ ÿà@ #1"/&767!· €  € €€à@ "!676/· €  €— €€€$1?67&'&'!!67675#"/0 ÚÚ þ`0€ÚÚ€ ¤ ¤ pÐУ £ÿàà @32+"'&=476327676'&'&547632327654'&#"~2 €  ,9999,,,,9999, 1@@1//1@@1  € 3,,,9999,,, //1@@1//ÿÀÀ-G"32?32?654/&#"'7654/"32?654/7''? x  j  x  j ˜ p 0 p ;-;· x  j  x  j þà p 0 p ;-;ÿÀ À6'&37%6'&'#7] ÿ pM oL“ à³ à³ÿà@ m671673#33#&'&'5676735&'#3#&'&'5676735#3#&'&'5676735676735#&'&'5Ð @  ˜  @  ˜  @  ˜  @  ˜ p  @ (  @  @  ( @  @ (  @  @  ( @ÿÀ>À;X21'&'&#&'&'&'&'&'&'"'&56767547632"'&/&7676367563  eEF  FEe  "    À  @@`    `@@  þÐ s"    s ÿÀÀ5>B#3676735&'&'#&'1367675#"'&=+'&'673' %9  "0 9%p  À ` @0p``À þÀ " € þð  Ð `XX``ÿÀpÀ):%671496767&'&'93671675#&'6767 21KK12  P" "P 0"@.' +9K1221K9+ '/€""P0 "ÿÀÀÀ#G6514/&#"!"3!32?3127654/!27654'&#!7654'&#"· ` *þÍ 3* `þ² *3 þÍ* ` `) ` )  ) `þ  )  ) ` `ÿà€ $9&'1&'676745676763!7?6'&5&''&=)(+--D-$$),$%6þOPP'' ()=0$$D--$) #"/6%$§PP'††'ÿà€ $9&'1&'676745676763!7?67576/&=)(+--D-$$),$%6þO''PP ()=0$$D--$) #"/6%$Ù'††'PPÿÀÀÀgp727167654'&'&#"313!2765&'&'#&'6754'&#"#&'547675&+"&'&'4767567&'à####`9##  „  ##9     \   À""""7.->   >-.3( (9A;‰ ÿÀ0¿Se167675'&'&767667675&'&56767&'&'&'&'5476?6271654'&#"3Ž ))   #$7,0  "" 21KG119#$  R  ª  y))y  y;+* + 0G "" GK12-.F ++;y Ê   ÿàÀ&335&'#567673!5#3#&'&'6767#3° 0ÿ@ € ˆ((((( þ ` þ€þ€€ÿÿÀÀÀ$/"1!676/&'5&'&'54'&#65+327à 8#$/  €  0$#8 -@@À  ++;H7  6I;++  þÿà€ &947163!3##&'&'536767&'&'#!2#!"'&54763` @@6%$$%6 )À)€  þ@ þ € $%66%$))à €À   ÿÀ€À3Ol671673#5&'&'#3#&'&'5367&'#5367&'#56767!1#3#3#3%#336753675&'#5&'#À   P  Ppp PPPP   PPPP ppþè  þ0P  PÐ0þ` @0  0@   ÿÀ€À4:GTq67167!322+&'&'#&'&'#&'&'35'#676'&'%&'&767#336753675&'#5&'# @ 3M  ))€))  €M3ÿ  pþ 00 00   0M @  )))) @ÐM`Ð0  P0 00 0ÿàÀ&3P3#567!=&'&'##336767&'&'#6733##&'5#&'56735¸ 8  @  À 00 00((( þ ` ((ÿ€þ€þ€0 00 0ÿÀ€ÀBM673#32+3#&'6735#+"'&="'&547635476;235#&'367&'# pht ff thp 7     7 P@@¨&&7 @  @ 7Ø ÿà !*5@K47163!23#&'&'76=&'#'&'6753&'6753&'675   3! Rà`8 3à@@€  !f %"`øf ˜¨ààààààÿàÀ /1!6767&'&'!&'5#&'5673567@@þÀ€€ þÀ@xhhPPÐPPÿàÀ .1!6767&'&'!5#&'6735673#&'@@þÀˆ@@@@ þÀ@þÈ@@@@ À€271327654/7654'&#"%327654/7654'&#")   ŠŠ  `    ŠŠ ×   ‰‰       ‰‰ @à€2%6514/&#"32?7654/&#"327×   ŠŠ  þ     ŠŠ ©   ‰‰       ‰‰    2"32?327654/'&#"32?327654'÷   ‰‰       ‰‰ —   ŠŠ  þ     ŠŠ  ÿà €2#1"/&5476327632#"/&5476327632÷   ‰‰       ‰‰    ŠŠ  `    ŠŠ  €71327654/7654'&#")   ŠŠ  ×   ‰‰  @ €%1#"'&54?'&547632   ŠŠ  ×   ‰‰   ` @6312#"/#"'&54?É   ‰‰  7   ŠŠ   ` @7312?654'&#"'&#"É   ‰‰  i   ŠŠ  ÿà€  13!3&'&'!!6767&'!€@€@þ€m!æ!ý¦ ÿÿþ !!ÿÀÀÀ'1!6767&'&'!21#"'&54763@@þÀ   Àþ€€þp   ÿÀpÀ'136767&'&'#21#"'&54763Pààp  Àþ€€þp    À`&M76716732+3#&'&'=!6716732+3#&'&'=""3 @@""3 @@è3""  @ H3""  @ H À`&M%1#"'&5476;67675#&'&'567673!1#"'&5476;67675#&'&'567673À""3 @@ÿ""3 @@˜3""  @ H3""  @ HÿÀÀ &3@MZ&'&767&'&767%676'&'%&'&7676'&'&76'&'&77676'&0ÿ  Ðþâ  þ`   0  µ&þÚÿÀÀ67167654'&'&'F::$""$::FF::$""$::F@!"<=CC=<"!!"<=CC=<"!ÿÀÀ3EW67167654'&'&''167676&'&'&76'671632#"'&'721#"'&'6763F::$""$::FF::$""$::F\!! ))    À   @!"<=CC=<"!!"<=CC=<"!º    v     ÿÀÀ2DV67167654'&'&'''&76767'&'&''671632#"'&'721#"'&'6763F::$""$::FF::$""$::Fa  ""..""   ##    À   @!"<=CC=<"!!"<=CC=<"!{ (( µ     ÿÀÀ+=H67167654'&'&'21#"'&'6763671632#"'&'3#&'67F::$""$::FF::$""$::FP   €   ÀÀ@!"<=CC=<"!!"<=CC=<"!P     €€€ -F1!6767&'&'!&'&767676'&/673#&'5#&'6735ÀR6666RR6666Rÿ0  hà    €66RR6666RR66hˆ  h    @€"/<IVcp}Š—¤±¾1!6767&'&'!3#&'567673#&'53#&'56?673#&'53#&'567673#&'573#&'567673#&'573#&'567673#&'573#&'567673#&'53#&'567@Àþ@      P    ààp    p    p      €ÿ@  p  P  °  P  p  Ð  p  p  p  p  p  P  ÿÀÀÀ,W`h217632?6'&#"'&=54763776757635'&'55&/5&'&'"5?5'75#?  E;7#&&$  "IE;@@   @@1' * ! ) @@!À  þè "` PB  »BA @ @C G F@ > HKI• HN–G Eÿà@ ,&5147632#"'&54?'!2#!"'&54763 À À ªª÷  þà i À À ©©þ·   ÿÁ€¿-G&17676'&'132?654/&#"!"327654/7654'‰ € € P ZZ p p þÎ p p ZZ ¿ þ@  À x YY p p p p YY ÿà@ ;&76/76'&'&7675327676767&'&'#5ÑŽŽŽŽ    )  21K0˜††‡‡    @)  %%8K12@ÿñ°6'&37®þ ° d °`ÿÀÀ@7654'&#"#34'&#"#";35#73276=327654'&+À7 6ó³Ó    à³Ó    S6 7@Ó3   ÿ@ÓþÍ   ÿÀÀÀPYb67&'716;67675&'&56767#&'&'4767=&'&567673&'6767&'PP #` "" $%6` ""  ""èþÈX X "" 6%$ "" Ç ""þˆÿÀ€À09A_&76/7654'&'&?6'6'&'&'&'61''7%?676'&'&'&'&54?'' P Ž[**'43,  `  )55,“Ès¨º-&&&þÞ9**'43-  =2» þ0 oZ-:9-%  !`)+,!'!s !*Zþ’>0 ä8-:9-%  !>(ÿÀÀ  1676'&'4716;232+"'&5476;5#"'&500 @  €   p   à   À ÀY4'&3";27654'"1;#";2?;27654'&+'7327654'&+"'&+à     þ@ ZZ   VV   ZZ   VV     P   €  €€  zz  €€  zzÿÀ€9Y"1;#";2?;27654'&+'7327654'&+"'&+4'&3";27654'  ZZ   VV   ZZ   VV  À     €  €€  zz  €€  zzÿ  P   €'ÿà ™%;27654'&+7654/&#"+'7#êPi × |ƒŠ iP|ŠD‡êP  ƒŠþ™P}ŠCÿÀÀp&'&'67671316767&'&'1#&'16767&'&'1#&'&'56716767&'&'1&'567673671À  9      9  y      yW     9  y      y  9 ÿÀpÀ>167675&'&'&'#;67&'#567675&'&'&'5À))))€+*B0HH0B*+$%66%$À) )) )Ø(D00 "" 00D((6%$$%6(ÿÀ€À A&76/675&''5&'&''67'#&'&'5'#;67&'#5' P Ÿ))¹1+6%$/+*B0HH0» þ0 |(1(( Í))6‘þW"$%6 %(D00 ""ÿÃðÀ2'&'&'&7476?63½ /.VV./ ½ÀP3EEAB+ +BAEE3PÿÀÀÀ"/#!5&'&'#54'&#"#54'&#"!!6767`0 À 0  €  `þ@ `    00      þð  ÿÀÀ3@I/&'##547675'&767675476;236?6#&'&'5367&'ô  Aà8 ! *   A  Ô`àp¹ `  #""5 &    þg  @ÿÀÿ¿-:7'&767#"'&?6736767676'&='7676'&' j5)R*2211%<"Y  ã  ? Y"<%1122*R)5k ÙÿÀÀ(%&'1&'&#"3276767'6/&?!"<=CC=<"!!"<=CC=<"!ñWWhhÀF::$""$::FF::$""$::FyWWhhÿÀÀ(713276767&'&'&#"'&?'&76!"<=CC=<"!!"<=CC=<"!ñWWhhÀF::$""$::FF::$""$::FyWWhhÿÀÀ(67167654'&'&'7/'&?6F::$""$::FF::$""$::FyWWhh@!"<=CC=<"!!"<=CC=<"!ñWWhhÿÀÀ(16767654'&'&'&7676/F::$""$::FF::$""$::FyWWhhÀ!"<=CC=<"!!"<=CC=<"!ñWWhhÿÀ@Àh1#"'&54763267&'&'#";#&'&'576/&?;6767576/&?#5327654'&+@   ))))   0)88--DPPD--88)0   `  P4))4  Ð)88D----D88)Ð  ÿÀÀÀ0D13!&'&'56767356767'&'&'&#271654'&+";à"ðþÀ()=,""    @ @€"0ÀÀ0=)(%   þÀ   ÿÀÀ3@Zl%4'1&'&#"3276765!67167632#"'&'&'676'&'521#"'&'&5476763471632#"'&5À--33----33--þ@!"<=CC=<"!!"<=CC=<"!----'!!!!''!!!!'   À4,,,,44,,,,4F::$""$::FF::$""$::FP'((''(('à""&&""""&&""  ˆ¸ø &7676'&'3676'&'7&'&767 Ø   À     8ÿèx˜ &7676'&'5676'&'7&'&767@     8X h   ÿàÀ (9K1!6767&'&'!67&'&'&'&'67&'&'&'&'471632#"'&5@@þÀ E88!!98UA*+,    þÀ@h!!88EU89`+*A,x  ÿÀÀ)767167632#"'&'&'7?654/&!"<=CC=<"!!"<=CC=<"!¼ ÀF::$""$::FF::$""$::Fm°X X@€'4J1!67675&'&'67675&'&'!!675&'!'47163!2#!"'&=@Àþ@@ þà @ þÀ €@ "" @@ "" @p   À ÀÿàÀ  1!6767&'&'!3#&'67@@þÀX þÀ@ÈÿÀ`À-7"1;6767327654/&#"32?+  `)I € € I `  )3J € € JþÍ ÿÀ`À-"'1&5476;7632#"/&5476324'&+  `)I € € I `€  )þÍJ € € J3 ÿàÀ $1!6767&'&'!/&7676@@þÀ€@/o þÀ@±€@/oÿàÀ "01!6767&'&'!'76327'&?67@@þÀ G  ÎiGi <  þÀ@l  G •iGi < ÿàÀ *1!&'&'6767!3?675&'#€þÀ@à^‡‡˜ þÀ@p‡‡f ÿÀ0À.Y%##"'&'&'&'67673547632+"'&=%!67547632!&'&'676732+`.#  ()=P  Š ‹  þð@  "þÀ""0 0à#  /=)(= |  } @€þÀ0 0""@"  ÿÀÀ*<67167654'&'&'7'&?6?6'4'1&#"32765F::$""$::FF::$""$::F3‘ 8 ‘ 8    @!"<=CC=<"!!"<=CC=<"!»8 ‘ 8 ‘ E  ÿàÀ %67167&'&'!!'"/&7673#€þÀ@  h Ð h @þÀ€p    pÿàÀ %1!6767&'&'!2#&'&?63@@þÀ  h Ð h  þÀ@€p    pÿàÀ %&'1&'!!6767'&'5676ÀþÀ@€p    p`þÀ@  h Ð h ÿà@ Y7101#";327654'&+&'&'327654'&+4=45327654'&+6767327654'&+#";0 66H ,##~  ~##, H66 Ð  @'(  $    $  ('@  ÿà@ C6716727676'&/&##";!27654'&+56=327654'&+5p Q  Q6$%    Çp p  %$6@  -2  &,-  @ÿàÀ $0‹4716;'&/##"'&=36767&'&'#3'9&'&'&#&'&'&7676107676'&'&/&'&'&7676'&'&'& P=)('4 8*  @0""0   $"'     ##'     € ()=-#"€  Œ€  àÀ""    +    + ÿà?ŸI&'1&#";#";3276=327654'&+5327654'&+76'&'&'; _4 PP P  P PP 4_ ee’  Ž   @ @   Ž  ˜˜ÿà€ :F"1#";#";3276=327654'&+536767&'&'##53`         p=)(()=pp""  À      ()==)(à ""ÿà >BFJ&'1&#";36?32?327654'&+76'&'&#'&'#'3'?#3'> 2 )9*.*9) 2 9@**@9N m` Š  –  ª¨¨ª  –  ª¨¨ªê..@@..ÿÀ€À671673;!&'&'#5  €ÿ€€€€€ þà€@€€ÿÀ€À&1<1!6767#"'&=#33'3#&'673#&'673#&'67@€  À€€      Àþ€ €€€ÿ@@'ÿà "B^b#"/&767647632767674716;32+&'&?#"'&5'&/#'&'&?673'¸  X    Xˆ € J3 € J3 ` @ X @ ( `  $. þÒ$  `– I  I  €    €(('ÿà "B^b&#"76?327657676/1;327654'&+76'&'#"76?37676/&'7#¸  X    Xˆ 3J € 3J € ` @ X @ (– `  $þÒ .$  `þë I  I  €    €((ÿà@ "6J^r#"/&7676476327676"'1&5476;2+5"'1&5476;2+5"'1&5476;2+5"'1&5476;2+˜  X    X¨     ` `     à à `  $. þÒ$  `   €   €   €   ÿà@ "5H[n&#"76?327657676/327654'&+"35327654'&+"35327654'&+"35327654'&+"3˜  X    X¨    ` `     à à – `  $þÒ .$  `þK   €   €   €   'ÿà $GYr&?#";27654'&+54'2?6'&'&4'&#"'&'&3%61'&'&76776?65&'&'Ã0   00  þÝ X    X     1%%š  4   ` þF `  $. þÒ$  ` ­  q  B$%% 'ÿà $GYs32+"'&5476;5'&'&76?6%2'&/#"'&5'&'&?636716'&'&7&'1&56767'&'&?à  00   0þÝ X    X    )%%1 š `   4   `  $þÒ .$  ` þ³  7 %%$B  ÿà 2G13#"/&'=6?6?67632+"'&=47639    a&*#) þç@ @ Ÿ (#   "  3&0.!3  Ÿ à à ÿà 2G6716/&'36767&'674'&'65&'65&'&'#"7%3276=4'&+"39    a&*#) þç@ @  (#   "  3&0.!3  _ à à  ÿÀ`À#312?654'&#"4'&#"'&#"© € I  I €7 € Js þJ € ÿÀ`À#"32?32765327654/× € I  I €· € Jþ sJ € `#71327654/!27654'&#!7654'&#" € Js þJ €× € I  I € `#%6514/&#"!"3!32?÷ € Jþ sJ €© € I  I €ÿÀ?À K&'&767#"'&?'&'&?676;2'&/+#"'&=##"'&=   H&" 5 5 "&    Àþ€s9  ZZ  9s` `` `ÿÀ@À ?676'&'#"'&='&'&?676;2'&/#"'&=#p(   :  ;     þЀ ß0  a a  0ß €ÿÀÀ0Jd/'&/&'&?'&76?6767647167632#"'&'&534'1&'&#"3276765jl>>lZZl>>lZZÊ   à""""¿lZZl>>lZZl>>ÿ  ####ÿà $11676'&#&'&'47676'&'&#à?2332?]> J21(   32??23= 21K2(( ÿà !,!2#!"'&=4763!!&'&'367&'# À þ@ ÀþÀ€        €ÿPÿÀÀw1+"'&=6767631206;24?63232+#"/5&'&'#"'&54?67&5#"'&5476;67&/&547) ˆ )× @p@ @ @ @@ ?%55%? @@ @ @ À)  )i @ @ @  % @ ?!ïï!? @ %  @ ÿàÀ %71!6767&'&'!74?6/&5@þÀ€p    p @þÀ  h Ð h ÿÀÀ367167654'&'&'21#"'&'&5476763F::$""$::FF::$""$::F  @!"<=CC=<"!!"<=CC=<"!`   ÿÀÿÀ -b676'&'6'&67676'&#&'&'676?'&'&#32;2?676'&'&'&'&+'327654'&+À  G /--D.%%  !0 !‹  ^ $ 0   E ? L`— ((4D--'  0$ G  t a  D0  ÿà@ W6716727676'&/&##";#";!27654'&+567327654'&+5327654'&+5p Q  Q6$%      Çq pp p  %$6   2  "   ÿà€  ;J2?#3'&+3!5#3"3#35367!27676'&'&#!&'##"=432‚>5kàÞk5>àÿ   ) 5.." "..5þà)   @``@ `` 0  0 `,,t X ÿàÀ !31!6767&'&'!'67!#&'7#!"'&=327@@þÀššš‰ ÿ ‰  þÀ@ðddY~ ~YÿÀÀ4F!675676/&##!676/"1"=##5##5##5721#"'&54763óàà s@0À0@(@0@(€  ½`  `ÝÄ  ÄÀÀÀÀÀÀ    ÿà€ 6H"7676'&'5676?6327%67&'%&#16767'#"/@ þè: @    Ÿ þè À66RR66Ž e'1,%B*.$ > =:eeþˆ‘33‘€€ 26k67167;!!+&'&'!!!&'?376/#7%;#/&''&?67'&7667+&'673567À0ÿ0À@ÿŽ @ J @& ,     #H4@ÿÿ0    9++E$      ÿÀÀ'8J\n€353354/&+;27654'&+"!3!27654'&#21#"'&54763471632#"'&521#"'&54763471632#"'&5€@Ã@À     àþ  @ à  `         €``CC`þÀ @  þà  @     `     ÿÀ€À -:GTan135676736767&'&'!673#&'573#&'567673#&'5'3#&'567673#&'573#&'5670  `  `  þà  p  P  °  P  p  À þ` P  P   ð            ÿÀ?À >676'&'#"'&='&'&?67632'&/#"'&=#`  0   ($$(   €$$$$þÀ` À!  ??  !À `ÿàÿ #HZl1'&'&76761'&'&767667167166#"/&#"'&=47%&'1&7676/&'1&7676'ã   $#"!!"#$ XX ap  c! !! !j  ÊF'&&'F  v   ] !! !!ÿ¾$6/&'&=476?7'75ëÀ ÀÀ À®®®®   ºDòDDòD<>>>>þ9¼9¼ÿÀ@À+07<CJ'76"??675&/&/&57'765776'757#NQQN›`"!`qr` "`"``"RRíNQQNRR÷NQQNfMR ,p$&w#* 11 *$w&$p&$$&vY Z(Ìd `$̪"d [ÿÈÀ"Jq6776/&'&?'&''&'&?61#/&?6327654/&767%'&76?6/;2+&'&'4?¯44' W &   ÿ )` @@ `  þ“ W 3    )2“,,> X <  Ï ()  @@   ' W R   )Pÿà 5GY!'&'#7676;2+"'&=!+"'&=47674'1&#"32765271654'&#"3‡&¶_# ¶ #   þÀ   X      KKKPee0 00 0[     ÿÀÀ?HZl"10101;276=!;276=4'&/&'&'010154'&+3!76721#"'&54763471632#"'&5À  #   @   #  €¶þÚE     À  e0 00 0e  €KK      ÿÀÀÀ23333276=3674/3674/3674/&#"Ó•I!K¨  ©K!I•º£ I Z     Z I £ÿÀÀÀ%8&'&'5676767&'&'5676767&'&'5À@?__?@@?__?@7 @?__?@ FccFþw FccF @?__?@p0""0""‡ f""f ƒ  V""VÿÀðÀ19JSj671673;##&'&'#53#&'=6767&'#373#&'567675&'#37673#3#&'=  €Ð0€€€Ð  `     P0  €€ €@€€à 0PP0P @ €€@`p 0@@ÿÀ€À81!6767#"'&=#33'76776"/&/&76@€  À€€‘0!!0Àþ€ €€€þÿYZZY __ ÿÀ€À41!6767#"'&=#33'76/'&?'&76@€  À€€d$$ // $$ // Àþ€ €€€ú44 BB 44 BB ÿÀ€À/<1!6767#"'&=#33'3#&'=67271654'&+3@€  À€€xD  ,D  ,,Àþ€ €€€ð  8hh 8ÿÀ€À-F1!6767#"'&=#33'471632#"'&52+"'&?632763@€  À€€À   ˜X X(00 0  0Àþ€ €€€ÿ   € PFÿÀ€À&1<P[1!6767#"'&=#33'673#&'673#&'673#&'673&'&'4?367&'#@€  À€€         Àþ€ €€€0@@HXXXÿÀ€À5HY1!6767#"'&=#33'1'&767654'&'&76/#&'5673766'&7654'&7@€  À€€     \ $!!$ 3   Àþ€ €€€â##   € #0##   ÿÀ€À1>1!6767#"'&=#33'4716;2+"'&='5763"'@€  À€€À ` ` í--  Àþ€ €€€þà ` `n@ h ÿÀ€À*91!6767#"'&=#33'/&?67'&?'&76@€  À€€g00p00Àþ€ €€€þß00"00ÿÀÀ +6ALY%&'7327367&'6'&&'&76776/654'7&#"'67&'677676'&'o0??0::[44 B[[B 44B[[B .::#".::0??0Ñ:##:2#"": :B[[B 44B[[B 44.::0??0 ::##Ñ:0??0:5  ÿÀ¶516767&'&'&'&7676&'&'&'67676ß <&&66RR66&%=  Q22"":9HH9:""22Q   12BR6666RB21 BAYH9:"""":9HYAB ÿÀÀ/'&'54?6'&'&'476ò@ xD¨ ËXÀº þ`1J T· µ,   ÿÀÀ4C'&3676/67&'&676767&'&'&'"76/5&'K" n 6RR6666R>0  ?SH9:"""":9H5/.#µHAu" n 666RR66! -"":9HH9:""#5h HA^ÿàÀ [4716;2+35#"'&5476;2+32+"'&5476;5#32+"'&5476;=#"'&5 00 à 00  00 à 00  €  pp   °     °  ÿàÀ );2+#"'&5##"'&=#&'&'6767À@     D----D   þ  `þ  `--DD--ÿа%7Io§71;32767327654'&+&'&#"#"3471632#"'&57471632#"'&57"1#";32767327654'&+&'&#'"'1&547632#7&'1&#"#";32767327654'&+ 7  ÷ ÷  7 €   À    ÷ ÷  7 7    I  W W  × ×            P       0   @      ÿàÀ 5%67167&'&'&'676767&'&''654'7`)))^())(^)))(^^(à)))/))/)))//ÿàÀ G1!6767&'&'!1"'63&'&'45'&'&'67677456767@@þÀ@UUQQ þÀ@€./--ÿÀÀ5K'&#"6?67&/"&#67674'7654/1&'567673#Ë....„ "%X;;;;XX;;  P,'&:Œ----5  ;;XX;;;;X%! PW,:&'ÿÀÀ*DT%'"#"/&'&#&'7676/6732?67167654'&'&'&36?6/¡GG= 0770 =¡F::$""$::FF::$""$::F0 < 0XFF)5&B'..'B'4)˜!"<=CC=<"!!"<=CC=<"!F # 88 # ÿàö)6CP]jw„7'&76767/&'5&'673#&'5673#&'573#&'567673#&'573#&'567673#&'53#&'567673#&'5&=K7671632327654'&'&'3277676'4'&'&#"767&'&76764DDNNDD4 =OO[[OO=  W=  '017710&  =W@  õ22 ;!  !; 56  ""  6 $$$$ ÿÀ€À*<Nbt†˜ª¼1!6767&'&'!32+"'&=47631#"'&547632"'1&547632#4716;2+"'&57"'1&547632#1#"'&5476327"'1&547632#1#"'&547632"'1&547632#@ÿ À À       ` ` €     @       Àþ€€@        €   @      @  @   @  €   ÿÀ€À#.9&76/65&/&'5&'&'54'&#"'!'+32765' P X$#8  B$“y!öà@@» þ0 E+ -#;++  7tî- +ÂÍÿÀÀÀ'#"3!27654'&+'&'#!;2767‡` € ` x þ€ ö ®   nþ­ SÿÀÀ;67167654'&'&''31276#"'&547632'&#"F::$""$::FF::$""$::F9 '33(%%(33' @!"<=CC=<"!!"<=CC=<"!Ç%%(33'&& ÿÀÀ6'&#"327654/7654'&#"?32?'+54?'Vf   f((þá (*!x-y$x-y£f   f((þÚ!*( y-x$y-x ÿÀ@À-%6?6'&'&'&'#";67674545S+¡  í%st.  0 Q$ú  ±/hi .    0ÿÀÀÀ)>Çï3276=4/&#"33276=4/&#"3276=4/&#"4'1&#"6767674305039010163290121676767296321012167676729632901306754'&'54'&#"#54'&#"#5#&'&'&'&'&'&'"'3!276=V  €  h  ¾      @  @@ #####" € º*   **   **   **€ 0G      G0 00 00ÛU Uÿà ;4'1&#"!27654'&#!&'!276=4/&'"'"/&#"3@  " þp`  A   '  O € þ°"  Pþà D M  / [ T  ÿÀ>À )%567#671672&'&'&'/30?23ßþð:9Z 6%$$%66%$µþð; <@1 0ee€SS ÿÀ ÀBO\n€‹12##+"'&=#+"'&="'&="'&=476315156767;5#"3276=4'&+271654'&#"3!271654'&#"3&'#367 f<=     À     = < '!  „  !' < >$  8     +55+ X 0@€0 @°#  a%%,   ,%%a  #Ð  ` €À À€ ÿà€ BY}3'&+"33&547676767&'&'"'3276=4'&+"'&'#76/23&'&'471#&'&'676723&'&'6767#271654'&#"3:b-e `D--F-$%66%$$%67>  / ?·  þìC ""06%$$%60"" C;   R-  --D(!!%>6%$$%66%$f   (þé4 5A  -$%66%$-   ÿÀÀ *c&'&7671;36?3276=&'&'#6'&67676767&'&'&'&&'&'&76767@  `  &  @\2   "EeeE"    2- =``> -€$$$$`0 dd 0ê            ÿà•E'&'36?2?3#"'%#"/&''&#+"&=676767676ä´W$ 1*"h´  „)3 k !!4#!   !#4!!© n  U¨ å/  SrL6&'     '&6ÿÀpÀK47167632#"'&'&567167&'&'#";3276=327654'&+5P?((21KK12((?      ­ 0/BK1221KB/0 #     #ÿàÀ  $>673/&'&'67677'&7927167654'&'&#"3"p !521KK1221K8,4! nà‘p !4,8K1221KK125! !þ°ÿÀpÀ=W61676763#&'5#&'6735&'&'4767&'&767132767654'&'&#"H //  #+*B    B*+$  ¹ ##   &&.D00  00D.&&  Ù`ÿÀðÀÜàç673/19191919191919999999999993#9999999999999999999999999999999996+96595959 59 59 595959595959595959595959595959595959595959595959595959#&'673159595959515959595959595959515151595159595159515945&'&'67677'&793&'34'1&'&#"3276765Rp '&&;;&&--D=+' nÀ`   ±p '%0=,+  +,=D--%' !þH  ÿÀÀRl276677'&7673/3#&'5#&'6735&'&'67''&?''&'56734'1&'&#"3276765p )66)E ` E&&;;&& `ð   À E ` E)6=,+  +,=6) `ÿ  ÿÀpÀKˆ727167654'&'&#"37132+#"'&=#"'&5476;5&'&'6767676767&'&'&'6732+#"'&=#"'&5476;5&'À°((?      ?((21KK12'0  0'-;K12((?      (  pB/0 #     # 0/BK1221KŽ 00 !21KB/0 #     #ÿà€  $>m&'6767&'77675&'#947167632#"'&'&567167&'77675&'#90#0"'38 !4,8K1221KK125! pXþ°0K125! p!(!$ 0"  !521KK1221K8,4! p0à°21K8,4! p !)$ 30  ÿÀ€ÀKx727167654'&'&#"37132+#"'&=#"'&5476;5&'&'6767676767&'&'"&'637'&7673/&'°°((?      ?((21KK12P-0  0 8,! p !21KN2 pB/0 #     # 0/BK1221K¹ 00  ! p !,8K125 ÿàÀ.2L'&&'6767&'776/77675&'#947167632#"'&'&5x !,8K1221KK12! pXþÀ !21KK1221K8,! p0ÿÿÀ@À4N6#3#&'&'676741415#&'6735#"'&?4'1&'&#"3276765• @ (  ;&&--DD--&&;  ( @k   » @  +,=D----D=,+  @þ¥   ppI727167654'&'&#"371&'&'6767356735676'&'5#&'5#Ю 00DK1221KD00 "  PP  "PXB*+21KK12+*B888 PP 888ÿÀpÀ547167632#"'&'&567167&'&'3276=P?((21KK12((?  ­ 0/BK1221KB/0 ƒ ƒpp321#"'&'&547676327167654'&'&#"3À0((((00((((00þà)*..*))*..*)ÿà '=FO1!67675&'&'!&'6767&'1!67675&'&'!&'6767&'@€þ€0þ¸€þ€8 @@H @@HÿÀ€À-F47167632#"'&'&5671673#!"'&5%5#&'6735673#&'`""""`23K\K32  þ|  ø@@@@@####þžK3223K   ª@@@@ÿÀ€À-F47167632#"'&'&5671673#!"'&5676/'&?'&7`""""`23K\K32  þ|  ×////////@####þžK3223K   S////////ÿà€ ,92135476;#"'&=+!#"'&54763&'&767  à à)  à ÿ  ----  ÿ  )à   € `'((''(('ÿÀÀÀ'=J132?3;676/6767&'&'!47163!2#!"'&=&'&767`)#.( 7€7 (.#)ÿ  ÿ    À)ÿ%. 77 .%)` ` `ÀÿÀÀÀ'=Rdv132?3;676/6767&'&'!4716;2+"'&=732+"'&=4763471632#"'&5%21#"'&54763`)#.( 7€7 (.#)ÿ P P ÐP P Ð      À)ÿ%. 77 .%)€ ` ` ` ` ÿ      @` ,1!&'567!%1!67675276=4'&'&'!!!5Ðþ€€þ€""€" "þ€pþ `   @" "" @ "`€€ @` ,1!&'567!%1!67675276=4'&'&'!!!5Ðþ€€þ€""€" "þ€ÿ   @" "" @ "`€€ @` ,1!&'567!%1!67675276=4'&'&'!#35Ðþ€€þ€""€" "þ€ÐÀÀ   @" "" @ "`€€ @` ,1!&'567!%1!67675276=4'&'&'!#35Ðþ€€þ€""€" "þ€p``   @" "" @ "`€€ @` ,!675&'!67167!2#!&'&'5P€þ€P"€" "þ€"   "" @ "" ÿá@ 2?7676/3674'%&# R: 8vþî ‰þ_t  r óÿÀÀY1#";#?677676'&'#&'&'5327654'&+5676?676'&'&&/&        4!!4         4!!4 £ `  `  &&   `  `   &&  ÿÀ@À$1G^&'6767!67&'!&'&'67%!!67&'4716;2+"'&=36767532+"'&= %R%%þ®%©þ®Rþ· € € € @ € I%%þî%%þî@ ` `  `  ÿÀ€À$1\&'6767367&'#&'&'67573675&'#&'&'67533675&'#&'5367&'# %Ò%%Ò%WÒÒÀ%@Ò. I%%ÒI%%r%%rrrþ€%))r%r%ÿàÀ !135676735&'&'!+?@à pþÀ€-C @  þÀp àþÀC- @ ÿÀÀ+%#535#367675#'367675&'&'# à@@à@@ààà@à@@`ààÿÀ~À26JNa32+32+"'&5476;&'#"'&5476;673'&'1&'&?63%3'&?63&'&'€€ r %  ÀÀ  % r €))8HHH0#"  __  "#0þI‘H~ __  #"00#"    (þÙ   '(  þà||`"£ £"Ü||£ £""ÿÀ€À7A"13";!327654'&/767527654'&+!##56?  .DD.    .DD.  ÿ ÀDDÀ  B/DD/B   B/DD/B  þK (DD'ÿÀ€À7@H"13";!327654'&/767527654'&+!#53#&56?#  .DD.    .DD.  ÿ @À DD À  B/DD/B   B/DD/B  K þËDDÿÀ€À7A"13";!327654'&/767527654'&+!#53'&'  .DD.    .DD.  ÿ @ÀDDÀ  B/DD/B   B/DD/B  K (DD(ÿÀ€À7AK4716;!32#2+!#"'&5476356?'&'5"'&57675#35&/    .DD.  ÿ  .DD. `DDÀÀDD   B/DD/B   B/DD/B  (DD' þ€ (DD'  ÿÀ°À<1&'5;276=6767=&'&'"&'&#"&'&#"&'&#  -2   $       À 03&;'*` i )P     ÿÀàÀH4'1&#"&'54'&#"'&#"3676754'&#"&'54'&#"&'5    <  qC]K12      а þð:  k?21KÐ p° °Ð€67"1;;67675&'&'#/1'&#( ´    @6%$+$2." K CÌÒæð     $%6q?,# @B€667167;+"'&='+&'&'6767;6767&'&'+&'&' pP/9#q ` N"P0  0P  Pp P /¤# 0 2      ÿÀ ÀR&'1&&/&'&/&#";09010167676'&'&#&?6'&'&&/÷ 5 + ?7  qC] -!" R % $  &9¨  Æ  Ï5  k?+  €  ª  ²ÕÿÀÀÀ6ALW4716326367263+1#"'&'&/&7676&'6757675&'&'675€  !    $%6@*$$H   8p0P˜ ”    006%$"`  KCþø`````` ÿÀÀÀ 4@q21#5476321#"'&=4763471632#"'&=%#'&76765;2+367675327327#&/&'56767à @ `  @   þÝSFG F 88--D>B/ %À ÐÐ   @ @ @ @ @­½£  Þ    D--. &5 €`$C&3276=32?32765&'&'1;3276=327654'&+"Z  V  V  vvþ¦ @  @ À Sÿ  s s  žž à à  ÿÀÀ1=67167654'&'&'673/#&'=327654'&+F::$""$::FF::$""$::F`X""" %=0@ @@!"<=CC=<"!!"<=CC=<"!h",K RH`pX  @ÿÀ€À-!!#67167!!&'&'!2#!"'&54763@þ@þ€€ þ€ €þà þà þ€    ÿÀàÀ"/H#!5&'&'#54'&#"#54'&#"!!67673#&'5#&'673567€0 À 0  €  `þ@ ` à8888   00      þð  88888 ÿÀàÀ#0;2135476323!56767354763!!&'&'67&'#3  €  0 þ@ 0 €À þ  8°°À     00   Àþð  ¸ ÿÀàÀ#0I2135476323!56767354763!!&'&'6'&'&?76/7  €  0 þ@ 0 €À þ  1////////À     00   Àþð  q////////ÿÀÀÀ#0?2135476323!56767354763!!&'&'6'&'&?€ €  0 þ@ 0 €À þ  I_/@pÀ     00   Àþð  q_/@p ÿà  $"1!6767=&'&5&'&54'&+@      @  ð0P  €˜T?T— ÿÀ0À*947167632#"'&'&5767&'6767675327#"'&5""&&""""&&"")   0'!!!!''!!!!'@)þp££ ÿÀùÀ5A#"3!2?6/&+4'&#"4'1&+5##"3!276=5#32765à  y0 0™    @™0 0y À@    @ 0 0 à 0 0 @à`` ÿä@œ'7767'&'67€ÀÀ  ‘þo‘ 77þƒ2 þ±:|:þ}3 OÿÁÀ13?36767&'&'!@` {‹þ€ÀþàP ] ÿÀÀ,?67167654'&'&'#"'&=476323#"'&=47632F::$""$::FF::$""$::F   €   @!"<=CC=<"!!"<=CC=<"!@€ € € € ÿÀÀ.67167654'&'&'32+"'&=4763F::$""$::FF::$""$::F@€ € @!"<=CC=<"!!"<=CC=<"!` € € ÿÀÀÀ ,5>67167#5#!67675&'&'#5&'&'&'6767&' €0@ )) @ 00 ˜P000 Ð))Ð 00  000ÿÀ@¿*5@K6'&#"33!276?27654'&+'&#7&'5677&'567&'567ý  ]V 44 V]  QèQ=`€ ³  Ð  Ð  ³ þó``````ÿÀÀDQ767167632#"'&'&'7&?63276/&=6?6'&#"/7676'&'!"<=CC=<"!!"<=CC=<"!¢       (++( _  ÀF::$""$::FF::$""$::FV  3V II V2    ÿÀßÀ ;GR676'&'"176?3276=4/57676/&'#76?'76/°   / #M  2F M/(  5C vv` ]  F+MS Y2^^  g%Û}  X5ž  ««ÿà@ '+;G1!6767&'&'!/#'&?672'37673#&'536767&'&'#@Àþ@–H R H*[8))80     þÀ@    k**`))`  ÿÀÀ&7Y11&'&'&'&'6721#"'&54763'67&'&'&'&/6176&'&'&'6?A4444N   :&'%Š ( 1)*5(` }ee<<XÀ44AN44À   H'&:%w`(5*)1 ( X<  D+  þÔ   .   ? <'+*A°\  ||  œœ  |ˆ].  I'#"7..%O ‡  k uK1 G*2 @/ (  %('.A*+    ÿÀ€À5<M&76/67676'&'&'&'&''6716'6'&'&''67%12301%' P i  #$00=3+*!p¸&11+. '   Zßþ• Sþe $#00=þØ» þ0 R  ##!"X‘"!442"  FþÖþ÷ ´##!"è ÿàÀ F#&'&'567275#&'&'"#"'&547632676763276767À ------   -- þ° @ Ð þÍ €   €€APYhq?65#/&#"'&'&76?&#"376767767677676'&/%;276=#&'67%;276=&'#67&'C`  c  ‹H!4TH\  †þ¶   P ð   P kO   N €½/}(C0àS  {RÐ àÀÀà ÐÐÿÀÀ ?#"/57"!67675&/&#@ÀÀžŸÀÅ€ÄðŽŽ0u u0Ð ’ ðð ’  ÿÀÀ$1<GR1!6767&'&'!3#&'6767'676'&'%&'675675&'&'675` þàp@"À"   PÀþ€€þà""`$$$$p@@p@@@@ÿà@ $1<GR1!6767&'&'!3#&'6767'676'&'%3#&'673#&'673#&'67@Àþ@P@"À"   €€€€€€ þÀ@ÿ""`$$$$ @@ÿÀÀ,9%&'1&+"32767%67167632#"'&'&'676'&'$@$$%++%$þq!"<=CC=<"!!"<=CC=<"!))))@€F::$""$::FF::$""$::F#$$##$$#ÿÀ€À$1<1!6767&'&'!3#&'6767'676'&'73#&'67@ÿ`@"À"   ``Àþ€€þÀ""`$$$$ ÿà@  '4?JU!&'&'!!6767!671673#&'7&'&767673#&'673#&'673#&'@þ@ÀýÀ@v Ê p$$$$°€€€€€€` þà þë  Õ  @@ÿÀ0À?S167674'&'5&'&'671670101&'&'6767010151&'&'67567  ""  p 00 ()==)(   € ¥""¥ 00  0¥%3=)(()=3%¥ÿ  ! ÓÓ !ÿÀ0À?S167674'&'5&'&'671670101&'&'6767010151&'&'67567  ""  p 00 ()==)(   € ¥""¥ 00  0¥%3=)(()=3%¥ÿ  ! ³³ !ÿÀ0À?S167674'&'5&'&'671670101&'&'6767010151&'&'67567  ""  p 00 ()==)(   € ¥""¥ 00  0¥%3=)(()=3%¥ÿ  ! ss !ÿÀ0À?S167674'&'5&'&'671670101&'&'6767010151&'&'67567  ""  p 00 ()==)(   € ¥""¥ 00  0¥%3=)(()=3%¥ÿ  ! 33 !ÿÀ0À?L67167&'&'476757101016767&'&'01015&'&'676'&'p   "" 00 ()==)( 0  P  ¥""¥p 0¥%3=)(()=3%¥0 þ`ÿà ,>Pbt†˜ª471632?6'&&'&'&'32765271654'&#"34'1&#"3276=271654'&#"34'1&#"3276=271654'&#"34'1&#"327657271654'&#"3@    !)+  À  @     @     @     <  ! +þÄ <Ü   @  €   @  €   @     ÿÀÀ1N672?6'&&'"'&#"3!27654'&#!53276=!3276=675!`  h  ! À þ€@    þ@s  h !³   ³þí,(  (,ÿÀÀÀ+Lfs%67165&'&'&'&'676767567'&'&'67&'&'&'6767'61#"'&'&'&'67635&'&767?%21KK12%=%%32??23%%= )) 1()==)(1]     L&'/K1221K/'&67F?2332?F76& ,)), *D=)(()=D* )))) ÿà (1!6767&'&'!!2#!"'&54763@€þ€ @ þÀ  þÀ@@   ÿà 7"13!27654'&#!  À þ@   ÿÀÀ2F##567673#53675&'67167!!&'&'1;27654'&+"°à@"à""þPÿ@ À À €""à"@à€ÿ   ÿàÀ .1!6767&'&'!676/'&?'&7@@þÀO//////// þÀ@////////ÿÀÀ`uz&'#3#3#3675367536756767367&'#5367&'#5367&'#&'&'5&'#5&'#532+"'&=4763#35°((((((88((((((88À À ÀÀÀ¨(88((((((88(((((h À À ÀÀÿÀÀÀ‘2176?676/76///#"'&='&?5'&?'&'&76?'&767''&?'&'&7676'&765'&7654763à 1=  D<=D  =1 À 1F#C #$ C#F1 1F$B ## C#F1 ÿÀÀ7&5676767"'#"'&54?ö,+1)$$)"ì íã!)$$)1+,í ìÿÀÀÀOT&1133276=4'&#&'"3276=67674/&#&/&'&'595    þ  "  "     0À&'Gp€ €pÐ   ˆ #à à# ˆ  † ˆˆ †˜ÿàà 57#&'5676676'&'&547632327654'&#"#1  *,9989,,,,9999, 1@@1//1?@1) wà€ *,,,9999,,, //1@@1/.) ÿÀÀÀ'2=H67332#!"'&5476;7!!&'&'675&'3675&'3675&'‡ x ` þ€ `g€ÿ```®   nþÀ@@ààààààÿàð *S6312301013675&'&&'&767671?767676'&'&#"'76'&'#1#1?@1) x *,9989,%   *,9989,%  1?@1) x1/.) € *,,%.  !©x *,,%.  "/.) ÿÀ°À1<"1;6767&'7654'&#"&'5327654'&+&'567° L11;;XX;;  +9 00HÀ  "88PX;;;;X@1 # "  À€€ÿà F#"'&=#"'&=476;547632'#";2+&'&'676732#z{ {  € €  Ú@ @ @))@ V{  { > @ > ÿ  ))  ÿà F#"'&=#"'&=476;547632327654'&+"'&5476;#"'&54763Ú{ {  € €  †@ @ @))@ V{  { > @ > þÊ   )ÿ)   ÿàð 5%3675&'&&'&767654'&#"#"'&5476323Ð *,9989,,,,9999, 1@@1//1?@1) xà€ *,,,9999,,, //1@@1/.) ÿÀ¿=Oas&##!6767&'&'67&'&'#67&'&'#65&'&'21#"'&54763471632#"'&5&'&'&5673 "p$M  `   @)) ¨ ¿ "$$%ÿ     l    ÿà@ -?T1!67675&'&'!+&'&?6327632'471632#"'&5'&'!67&'!&'&'5 `þ ì`0P @ 8 Ì   '&:@þÀ% ààk  P T   à:&'%àÿÁÿÀ 3>%7/?6?76?3?654/&#"'&?6š ">" Ç# xÇú O Ë ">" (0 Ù ">" Çy $ǨN } ">" '¨ ÿÀÿ¿ 7654/&#"?6?'k1‚1(Gé# xê‚­1‚1(Gêx #ê‚ÿÀÿÀ11'1/7632&'&?632'&?6?'Å(4`4Ôff `«Jf I› ­(4`4`ff `¬I fI› ÿÀ@À732?6'&'#4'&+"# ˆ ˆ H @ Hq    þà _7/&54?6!2#!²     þà " ˆ ˆ H @ H _%?654/&!"3!O  þà  " ˆ ˆ H @ HÿÀ?À6/&#"3;2765367> ˆ ˆ H @ H   þà   ÿÀ@À*8671673;#&'&'#5'76327'&?67  €WÀ€€¦ G  îG < €€ ~WK €@€€l  G µG <  ÿàà @#?'&3676/73675&'&'77675&'#'76'&'È (OO(  (OO(  (OO(  (OO(   (OO(  (OO(  (OO(  (OO( ÿÀ€À0;1#!6767&'&'#&'&'21#"'&547633#&'67À  &%    P  ÀþÀ@@   €?@"%654/&#5&'&76753?øp  À  pp  À  p® h 88 h h 88 hÿÀÀ"&#"3#32?6'&'#53676/’ h 88 h h 88 h¸p  À  pp  À  pÿÀÀ516767654'&'&'#"/&56735476;23F::$""$::FF::$""$::Fykk:   :À!"<=CC=<"!!"<=CC=<"!þÙdd ` ` ÿÀÀ5%&'1&'&#"3276767'&54?6332+"'!"<=CC=<"!!"<=CC=<"!þÙcc ` ` ÀF::$""$::FF::$""$::Fykk:   :ÿÀÀ5713276767&'&'&#"%#&'5#"'&=476;5672!"<=CC=<"!!"<=CC=<"!'dd ` ` ÀF::$""$::FF::$""$::Fykk:   :ÿÀÀ567167654'&'&'7632#+"'&=#&'47F::$""$::FF::$""$::Fykk:   :@!"<=CC=<"!!"<=CC=<"!'dd ` ` ÿÀÀF32?76754'&+1!676754'&#"!&'67327654'&+` *ª ©) €þð""@"  þÀp pÀ)© ª* € "þÀ""p p@  ÿàÀ /1!&'&'6767!5&'#32?367€þÀ@@‰!B$B!  þÀ@þç‰ !B$B!ÿÀÀ6!5676'&'5!"'&5476321#!/&54?6! @` `þÀ À þÀ` `@`@ ` `@  ÿ  @ ` `@ÿÁ¿#G713276567673?654/&#4'1&#"#5&'&767536767  ) @ @ D--  ) @ @ D--à )  @ @ --D@ )  @ @ --D €` 2%676'&'71&'&'#"'&5476;676732+@---- ++;;++ ƒ ƒ ++;;++ ƒ ƒp'((''(('08#$$#8  8#$$#8  ÿÀÀÀDMV&'6767165&'&'67674'&'5336767&'&'"#&'&'&'67%67&'P  ""  "" )7W "" W& ˆa "" Î "" W "" &ÿˆÿÀ@À+013#"3!27654'&+'36767&'&'!!5!@° E  E °þ@Àþ@ÀÀþà    @ààÿàÿ¨.6;2#"'&?2103767&/76'&'&u ð p è è p&:”ÀÀ“9ZZž ˜ÿ˜(`  `aaÿÀ_À%%#"/&767354'&+"'&=476;3^ ˆ ˆ X P P6%$Xq  À   $%6ÀÿÀ_À%6/&#"3+";67675367^ ˆ ˆ X P P6%$X   À   $%6À ÿÀ@À2671673276=&'&'#!67675&'&'#5`""  ()==)(à@ 0""0 0=)(()=0ÀÀ0ÿÁ€À'67167167&'&'327&'&767Ø''66RR66''  $$$$3!87;;-R6666R-;;78! s  ÿÀpÀ%Q6767#&'6735#&'6735#&'673&'&'&'&'5&'#;67&'#567675&'`))PPPPPP))à$%66%$+*B0HH0B*+` ))  ))6%$$%6((D00 "" 00D(ÿÀpÀ',671673#&'&'4'1&#"32765#3ààÐ   Pàà€þ€€þ€  €þÀ@ÿÀpÀ 136767&'&'#3#&'67PààP@@Àþ€€þPÿÀpÀ %671673#&'&'367&'##3àà€@@ àà€þ€€þ€€þÀ@@€#+3Mc1!6767&'&'!#5'5367167#7&'1&'347167632#"'&'&57#;67&'#5&'#@Àþ@@@@@€@@@þ°L€ÿþÀ@À@À@À@@00DÿÀ€À0&'1&76'&&'76/36?6'&/&&'å X0œ P þ¤1 (a\:FGO `(§ QHH:z Ð þï '(`þÁH-X ( 1 ÿÀ€À"6&'1&'!!6767676'&'671673+"'&5€ÿÿ  0W ª €þ€€€$$$$¥  ÿà *3#&'676767&'&'#/&54?6ÍpK12  )`    @21K8%%  )@   ÿÃðÀ&2'&'&'&7476?63676765'1½ /.VV./ ½D'&°ÀP3EEAB+ +BAEE3PCþ†#669:.JÿÀÀÀ',67167!!&'&'4'1&#"32765!!@þÀ   €þÀ@€þ€€þ€  €þÀ@ÿÀÀÀ 1!6767&'&'!3#&'67@@þÀp``Àþ€€þP@€'67167!!&'&'56767&'&'5Àþ@@@ "" @@ "" @ÿÀÀ-%27167654'&'&#"313!2765&'&'#'!!!!''!!!!'_D.-  -.D¾ ""&&""""&&"" -.D D.-ÿà .1!6767&'&'!676/'&?'&7@€þ€o//////// þÀ@////////ÿÀÀ+6#&'567673//&?'&767· W'  'Wþ‘ 'W W' ¹ W'  'Wþ÷ 'W W' ÿÀÀ+3//&?'&767#&'567676X 'W W' ° 'W W' À 'W W' þ 'W W' ÿÀÀ%0"76?6?654/&#&'&767%76/&¨ I %3&t)X'((''(('þ@@Àt%3% I )þP----!@@ÿÀÀP]j7#"'676727654'2323&#"3632&547&'""#"#&'&'&'4532765&'77676'&&7676'?::UH9:"" ::UH9:"" : E! ;E! ; áU:: "":9HU:: "":9H !E ;K !E ;ÿÀÀ%08@K674'367'7"7&'"'7'65&'672&#6767/27&567WU#B1,;*UÀ ,=©FcÐ>©=4HÏ>©=4H;*U,¦#B1U=©Ed ,€U*;,1B#UWH4=©>ð cF©=,& cF©=, #U1B5*;,U=©>H4ÿÀÀ+=O67167654'&'&'21#"'&54763471632#"'&5'21#"'&54763F::$""$::FF::$""$::F     @  @!"<=CC=<"!!"<=CC=<"!°   €  @   ÿÀÀ/<Ijr&'#3##33'367&'#765&'#5367&'#53674/#!3674/#'3'76=&'##5&'##5&'#67#54!ˆ!4`+Ð+  +°+€ ~P ° T€€T þp::::Ð4 HH 4` ÿÀ@À'4"1356767&''&?&'674'&+!674/#€ $&&Àd j&$ @P))àÀ !:;J#  #80c j:! þP)  )ÿàÀ :?DIN1!6767&'&'!353353#3#3#5##5##535#535#5335#5#;#35135#@@þÀ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ þÀ@@@@@@@@@@@@@@@@@@@@€@@@@@@@@@ÿÀÀÀ2?2132+32!'&5476;5#"'&5476;547637!!&'47à  ˜ MþàM ˜  ¹) )þ®À   0 ¹¹ 0   þ'))  ÿÀ°À%.;?6?6!76=&'&'#67&'!674/!`  2 €@66RŒ ar)þÀ) „  % W ŸR66  Dþ›  ))ÿÀ0 "/767165&'&'#"3'674'&+3674/#Ø ,,       Áò)À)à,, pp ù  ))ÿÀþÀ 8<I&'&7676767673276+'&7676327679!!&'4?   z,,  k(°(k  z )þ®)À%%  °°  PÐ)  )ÿÀ° (8E567336756733675673!7'&536754'&#"7!!&'47 @ @ @ 3þà3 °   ¹)@)þŽ(((( && `0 0¹))  ÿà€ ,X]4716;2+"'&=#"'&="'&547635476;5!322#++"'&=476;2#53`         À         €ÀÀ€  @  @ @  @ @@ @  @ @  @   @@ÿÎñ±)4?676767'6'&'&'76/&76/&76/&7øb- îb- í÷WD½þß½WD7 @ @ 0 @ @ 0 @ @ §'N-2î'N-2î´WE½þݽWEK @ @ 0 @ @ 0 @ @ ÿÀ€À$5Gk1#&'&'67671#327674'&'327654'&#71#327654'&4716;2+#"'&=&'#"'&5€'Ô'66RR66Ž     4    q    Ï @@    3)**)3R6666RA    2        â    €$%&'1&'676767&'&'567mHHHHmmHHHHmÀ&HHmmHH&OqqOÀ))))‚))‚ÿÀ@À0=1#'56727632#&'4?6'&'6?6&'&7677 À"l "À þ¨v/+<®3 "1Cñ----· À" l"À âvC1* q 1#/u'((''(('ÿÀÀ!!þÀþ@ÿÀ@À9S%"1'37676&'%"+&/&#"/&56?674/&'54721#"'&'&5476763à&è<,9999,3 !,þ‘ñ5% :   C  $o    é<,,3CC?ˆñ #$  C   : &5"¨   ÿÀÀ )6CP%6'&''&'677'&'1&'6323&/&56767&'6767&'677#()6Q32 KRSH$:=@A>ì.(.E$%B=†I//%&>F:&&$..P0M= AKKH#--4µPGF4BBY#0)$27$ 7E;;-.KJW Ú##;;I K<;!Z;E$55>+SED&þw')%- !ÿÀàÀHQZclu~4'1&#"&'54'&#"'&#"3676754'&#"&'54'&#"&'567&'&'6?67&'&'6767&/&'67    <  qC]K12    0P0p0  а þð:  k?21KÐ p° °ÐþÐP0 €` (1:C%367675&'&'#!!!13#67&'7&'6767&'7&'67à`` ÿþ€``¸xxx ÀþÀ@þÀ@À@pxÿàÀ  35#3'&'#!!6767533Ðr½Ð3rÐþ@@…e€ee€ ààÿÀ@À:W#367675&'&'##&'51367675&'&'##&'5#367675&'&'##&'5#"3ø( € (0¸ (0(  (0(À pp PPÿ€€PPÿ€PP ÿàÀ)F3#567#!6767&'&'#5&'&'#6733##&'5#&'56735¸ 8@€@` 00 00(((ÿ(˜0 00 0ÿÀ€À1%'&/&#"67674'&'&'4?6?632u4oo4 76QQ67 [)))  *¿gg"P6666P"1((6)  )6ÿà?  2?H67167#5#676757676/&'&5&'&'&71676'#1017"@  `@ 00 €,,'',,(* 00 )  CPAÂ0  ppà0  0²¼'--(¼'!20  0@ b8_ÈÿÀ€À0?1#!6767&'&'#&'&'21#"'&54763/&7676À  &%    q€@/oÀþÀ@@   Ñ€@/oÿÀ€À09DMX1#!6767&'&'#&'&'21#"'&5476367&'73#&'6767&'3673#&'À  &%    xh€€hX€€ÀþÀ@@   ÐpÿÀ@À CNW`ir676'&'67167357676'&'&'&'&'47&'00"'7!67&'!767&'&'67'&'6767&' 2222Ñ $à$  # ;G[E    7ýðÈhèp*,,**,,*Å  mm      [¸8`ÿÀÀÀQX_e2193&'?6767#"'&5!#"'&5676767&'&'&'47632!4763#!&'367!67#  ,6 v&   þÀ  ,66,  @ Mæ  ææ þè 8 vÀ -$$)$  $$-  -$$)$$)$$-  þ€0ÿÀ?À'A4716;276&'&'67#"'&5&716?7'76'&/ I\.Ê  Ê()#\I õ .=. 1 ˜ 1  þì#C D()0 g == ™ 1 ˜ÿÀ€À=_"1;367674'367674'327654'&#!&'&'&'#!67675&'&'#/'&=#  "  Æ  C þ0"  @  ` '' ` À  þà"       "PÀ  À    ÿÀ€À81!6767#"'&=#33'6733##&'5#&'56735@€  À€€` 00 00Àþ€ €€€ð0 00 0 ÿÀ À2613276323#"/#"/#!6767#"'&=#33'`p 2 FP 2 f€  À€€Àà #c 7 #c 7€ €€€ÿà@   =13#3!!67167&'&'#36733##&'5#&'56735@ @@þÀ€ ÿ 00 00 þÀÀþ@Àþ@@þ@00 00 0ÿÀÀ367167654'&'&'&'5#&'5673567F::$""$::FF::$""$::Fp€€@!"<=CC=<"!!"<=CC=<"!hhhPPÐPPÿÀ@À5DQ32+"'&=476333676753!&'&'6767367&'&'#7676'&'@ @ À€ ` €þ@p Ê vp$$$$À @ @ @0  0þÀ@þ‹  U  ÿÀà 2G76767!+&'&'7#336753675&'#5&'##&'&'5673`:Æ°00 00  :&'% `Æ:à0 00 0þ°'&:àà%ÿÀ€€/497"1;#";27654'&+5327654'&+3#5;#5    @àà@   @àà@`  à  €  @   @  @@@@@ÿà@  3E135&'&'67167&'&'5#1/&74767&'&'67636p ` p 00  00 + » #,D--<#,D-- ¼ ` pp 00  0à0  0àÿ ¼ --D,#<--D,# » ÿÀ€À747163!2#!"'&=!#&'&'5367&'#5367&'#5367&'#5 @ þÀ @Àpppppp     `þÀ @@@ÿÀ€À"?47163!2#!"'&=!#&'&'#336753675&'#5&'# @ þÀ @À€00 00      `þÀ@p0 00 0ÿÀ€ÀQ^3#"/"/#&'67327676376?3#"'&=+!#"'&547632354763#&'&767ã)\h / ){ˆ . £   R)  à ÿ   à ----¶6 d  = $a  –)à   € ÿ  '((''(('ÿÀ€ÀTZgt1#;+;+;#676736767327654'&#=4/&+5&'&'!#53&'&767676'&'p 00Ðа°00))€))  M3 ÿ°€3Mþ€  À 0€))))  @ M0 í`Mƒ0  ÿÀ€À=SXl€#"'&=4/&'5476325&/&'547632#"'&567167!2#!&'&'5335#%21#"'&=476;21#"'&=4763À)   <  €)   <  ýÀ` þ à     `    ;+!.   =V  à ;+!.   =V    `  @ ` ` ` ` ÿÀÀA//&767'&7672102+'&?54?76/776/¹ &7HH7&ç=88¿Y99+9 9*9 9¹ &7HH7&•=88¿99Y,9 9*9 9ÿÀ€À )7%67&'&'76/&67!67676'56'&'&'!f--D1& È / È --D1&þ÷þå +*;;*+  +*;;*+ É&1D-- È / È &1D--J7####7 8####8ÿÀÀ+754?76/776/776/767+'&?`9 9*9 9*9 9.+,àYYYBY9 9*9 9*9 9.,+àYYÿÀÀ"'"367327654/7#W þé)' ` Š“3`f· þé() ` ÷“3`ÿà #BG4716;2#&'&'"'&5#3574716;2#&'&'"'&5#35 808 "" ˆ00˜ 808 "" ˆ00€  þÐ""0       þÐ""0    ÿÀ€½#,164767%6#&'4'&#!"#&'!&'5!%5!!=!!    0 þ€ 0èþ°€þ˜€þ€€þ€(=kkþà þø88p@@`PPÿÀÀ8M47167632#"'&'&5%&'1&#"#!6767&'&'#4'76'&32765€""""##))##8€8` " !  ####pþÀ@  O N  ÿà %clu47163!2#2#!"'&54763"'&5#3#3'&+"36?654'&+"5367&'#5367&'#5&'&'6767&' À  þ@  PPpp3 x 3ppPP0P€  þÀ   @   0G    G0 ÿÿârŸ46372//&'&??/&'&=76?3; õõ *£SS£*7  ÍÌ € 7–  T .‹‹. TV[$§ 33 §$[ÿà /ASe%67167167&'&'&'#09367673'21#"'&5476;21#"'&54763471632#"'&5H9:"""":9HH9:""/ ,&#08€  €  `   //::////:E4% ð       ÿÀ€À6&76/67&'&'&''#0936767327' P v="":9HhGj/ ,&#0880þ«» þ0 \9P://6SëE4%  %*ÿà€ D67167!!5&'&'56763+"'&5!+"'&=676723!3=@$%66%$þ€à    þ@     €  6%$$%6"00"p!  °  °  !0 0ÿÀÀp%#"'0141&'&'6767"'&'9"'"'&67567676'&'&'01#&'&505476376'&'5&'3#;5#673!&'&'56767G"%%".!8;;XX;;8 ,G         Ð*HÀÀH+  þ`  , ":VX;;;;XV:!8     þü' ' @  @ ÿÀ¼ CL5&'&'&11&'&'&'&'"2?367675765&'#7&'67¡)%# Ÿ ,-((  Š)(>LJD-- d"P_.A@/ ""8 ""0:*) &=--D - "ÿÀ@€.;%6716'&'&#&'67;27654'&+"#";2?%0"141050110  wy@ @N-#-%  ¡,$þ’8   X  $ @ ^ÿÀ@¹HO&51476327632#"/1+"'&=476;76;2+3761#0103¤e f”  $-   %-#-N@ @yw þŠ7g gÇ ^ @ $  X  0ÿÀ@ÀS‚‰'&#""101013&'5&'"#&#&#&76327656516'&/&'&'67675671+"'&=476;76;2+3761#01038          $-   %-#-N@ @yw þŠ¨  "    #  þÈ ^ @ $  X  0ÿÀ@ÀCJ632&'&'54?1+"'&=476;76;2+3761#0103B))C$  $-   %-#-N@ @yw þŠ¹`))`þ· ^ @ $  X  0ÿÀ€€3f4'1&#";67675&/1/&#"/&=!'&'&?654'&#"132?6=4'&#"P  dC    3à3    Cd  X 8@f'd O.!   3(P((P(3   !.O d'f@8  ÿÊv¸/j%7654/&#"&+13276=01015;01013'&'&'532?230;27674'327674'67651&'&'0101# FN(p  ˆ"ÐJN%     xÈEN)x H"88w9IN& €€#U?6367675&'&'+/&#"'&'&76?&#"#376767767677676'&/C`  c  ±*  LH!4THP  l\  †kO   N £ € /}(C0 € S  {ÿÀüÀE45&'&'3#"'3&5476733676754'736'&'&'3&+53€&&22&&o xD#$ Œ ` Œ $#Dx pN2//2N€„0))--)š `  ` š)--))0„€ÿÀÀ _kx„676'&''&/&=67675476;2?67'&'&?6?5+"#"'&/&/7'&'&7&'&767'&/7P@3  O&/ € 0&O  3 <; Ž01% þ  N0 %1  ÂA3 [ VOXGL LGXOV [ 3A  âw1^  Ôþ£w  ^1ÿÀ@À`i&+"454567672367332++"'&=#+"'&=&'#&'&'67673#367676;&'67€))-       €   6  -€@`)) !7 ` @   @)G-!! ˆÿÉ­À-8%1'1'676776=4/&'#11?676/'?M†58U(*L(&8S\6 X€S_ 7L}’:  =]%<#!5$@`i  `X`h  RÿÀÀ@\n€11'#";!6767327654'&+&'&'67673&'&'67671'&'&'&'676774'1&#"32765%271654'&#"3] `))þì  ã `))( ))þu ))       `  ))   ))))þw ))‰  à   ÿÀÀ.1&'6767324716;#"'&=&'&'&'66T 633@  þ  ?23  ?23 W== Q:4 @ 32?    32?ÿÀÀ)>21!2#!#"'&5#"'&5476;54763!2#!"'&=4763` ` þ     ` ÿ À   þ  `         ÿÀÀ3EV67167654'&'&''167676&'&'&76'671632#"'&''&7632'&#"F::$""$::FF::$""$::F\!! ))     $$ @!"<=CC=<"!!"<=CC=<"!º    v      ÿà@ !;H%67165&'&'&'!27654'&+21#"'&'&5476763&'&767}32??2332?@ £  @   ))/?2332??23     `$$$$ÿÀ€À&D&'&''&'&767%67673&'&767%&716??6/76'&/€ 0/ þ  @à@ý× .. ) š *Àþp0 .d W"þp  À  M M  š * šÿà€ 8?Qcu16767674';67674'3276=4/&'#5&'&'!#53221#"'&54763471632#"'&5'21#"'&54763@"))"‚""" ;1þ  i129  þ    `   ÐP"""" @  G0à@=p        ÿÀ€À!-&76/767&'&'5&'&'#' !67' P W` îKpþ‰%» þ0 D   @ €­;þd'ÿÿÀ.À*/6716;232+"'&5476;5&'&?3'#  À 40 PP 048†£  ©7)* d   d *)7©c@@ÿÀ€À%&76/6767&'&''#'#3!3' P ù%()=5'& Œûô;D.- » þ0 Ã"",=)( 2nþÀ-.D ÿÀÀÀ#8Qt|…&'1&'6767676=4'&'#&'&'567673'&#"32?654/1;5476;232765&'&'&'35&'67&'s''22''   ''22''  #) ) € “L3  b € b  30??0? ``++ @ ++ @ 0))  š,,9  @ @  9,,""ƒ00 ÿÀxÀ-<47167632#"'&'&5671673#!"'&5/&7676`""""`23K\K32  þ|  q€@/o@####þžK3223K   1€@/oÿÀ€À,FU21#"'&'&547676332!"'&5676747167632#"'&'&57367&'#5&'à####.\ #þ“  23K®""&&""""&&""0 À""""þÐ -%&  K32@'!!!!''!!!!'P@0ÿÀoÀ7„‘21#"'&'&5476763327!"'&56767%6763276/#"'&'5&''&'&'&?&547'&7676766754'&765à####.\   þ‚  23K                 \À""""þÐ   K32V            † ÿÀ€À-;I727167654'&'&#"313!&?6?&'#%"7654/?6?'à####.K32  % (1J\´  G î < GÀ""""023K  < (0D G  µ < GÿÀ€À-CT47167632#"'&'&5671673#!"'&5#6=4'&'012;#&'674'67`""""`23K\K32  þ|  aŠ !>D.- ±0&0  0@####þžK3223K   .''-.D  )6)! 00 ÿÀÀ¿%?6&'&'5'+"'&?5&'6?6?6#!"'&56767ÛÈM$%66%$0 Èk G G 2 þ~ 2¿(96%$$%69 AOOG(þ¹ L L ))7 7))ÿÀ€À,9W727167654'&'&#"313!&=45&'#%21#54763";276=4'&'&'à####.K32  k 0B\^ @ P   ""À""""023K  €)@ 00 0 € € 0""ÿÀ€À-847167632#"'&'&5671673#!"'&53#&'67`""""`23K\K32  þ|  Ø@####þžK3223K   ÿÀÀÀ-HS7&'1&'&5676767&'&'&'436763671676?6#!"'&5367&'#à, !      &6%$$%6à%$; > > ;$%  þ|   €€À'      $%66%$â?./S S/.?   ‚ÿÀ€À-DL727167654'&'&#"313!23&'&'&+%767676'&/&15à####.K32  „9\5x 6 6 x h2_À""""023K  ,78.N0!))&&&&))!0V()*¼&ÿÀ€À%&76'%6767&'&''13!27%' P þê*$%66$$™áH//  „þû» þ0 Ù !"-6%$$#5xþÕ21I  ÎÿÀyÀ-DM727167654'&'&#"313!67'&=&+7"132?654/&+67&'à####.K32  „ d\Î kIkSÀ""""023K   d!!P SkIkPÿÀÀÀG7"'1&'&54767632#'&767;76+"'#5+"'&5676767à####  !$ 6!" ƒp„ "!6 $!À""""g|“ *+9  9+* “|ÿÀ€À ,Ai‘âï676'&'!676'&'30101&'47&+67676765&'&'&'#!&=&''&'&'51'1#&'&76?4545'7#"675476763276&'&'6'&/&'&&'5&'&#"'&?3276756776?676/654'7676'&'----p----þÖ)*.@%)))Ah8&&,   ”*      -\              ™ '((''((''((''(('‹%; .)))< &&8   ¼    ,¤                     ÿÀ~À15IMa6716'&'&&'?;27654'&+6?7#671676/&#%#7167676/&#  q."{  ˆ À  ! ~RHHH0#"  __  "#0þI‘H~ #"00#"  `_ ‚ %%") -þ¹  '"*â||`"£ £#\||""£ £ÿÀ}À15IMa&'1&767667/+"'&5476;&/'3&'1&'&?63%3'1&'&'&?63v  q."z  ˆ À  ! ~RHHH0#"  __  "#0I‘H~ #"00#"  __ ‚ %%") -þ¹  '"*â||`"£ £"\||""£ £ÿÀöÀ*/DV67167;!#3#3#3!'#&'&'5'#3!!&'&'56767271654'&#"3@ 6 Ÿ–„|jbÿ W’ FR   þà    € @@@`€€€€À      `   ÿè@ ?71654'&'&'"767633671672765&'&'&#7ú ,&!!  !L!  !!&,  y þŽ    r þ‡ ÿÀ@À1Haz'&'&547676%'&'&7654'&7676#"'&5&'6767''&'&547676%'&'&7654'&7676P  Û  Ë  µ   %   ”'--'  2::2  2::2  '--'  l%þ× )%3  $))$  $))$    ÿÀ@À06514'&#"'&#3674/7'&?63676'7 À" l"ÀâvC1" 3­=+/‰ À"l "ÀþÖv/#1 q *1Cÿà@ 013!3&'&'!#"3!27654'&+54'&+"`@€@þ€€À  € €  þà þà þ     ÿÀ€À%?N67167!#&'35476;23!21#"'&'&54767633!&'6767 `ï#d @ @þ #  68&&þö&&8€þà'    1 @   à&&88&&ÿÀ€À(3?&'#33567673&/5367&'#535671675&/3X  q``q  þÁ Pg7 gP¨.Dþû``D.þÎ\ î8¶ \8îÿÀÀ@Pq’&'&'"'&'676763201010109101#&'&'&'676767&'67670145""'&'&'567676767433=6767456767&'&'5%.M=W %66RR66þ¡/'(&('0\8%##9ÿ+!+ %8\0'(%=WW=  7àW=66RR66=Wp""Q  O! # ` #   # p #""# ÿÀÀ+EZ767167632#"'&'&'"'1&547632#'132767654'&'&#"'676767&'"67!"<=CC=<"!!"<=CC=<"!  `   @+,7" ÀF::$""$::FF::$""$::F     7,+ "ÿÁ|À2;1?376/3230376/6767=76'&'&+&'&'67È%þ  J…/ ')/ *>&'Q 2*À%þî 9q _q f22C@ @ÿà@ G674'&#"/654'&#"301213!276?030127654'&#"'&/5  9 Y  --  Y 9V   s  G   ûû   G  s ÿÀ€³'09BYb"32?654/67&/&'67&'677&'67'&'671367675&'&'#7&'67‹‹‹‹Kh€€€`Àrt ž‹‹‹‹¾°°Pþ¸Àt"xÿàÀ '9K]o1!6767&'&'!21#"'&54763471632#"'&5721#"'&547637471632#"'&521#"'&54763@@þÀ@     €  @      þÀ@`   à  €   @      ÿàÀ '9K]67167!!&'&'4'1&#"32765271654'&#"374'1&#"32765271654'&#"3@þÀ      à     `þÀ@@  à   à  à   ÿàÀ '1!6767&'&'!21#"'&54763@@þÀ    þÀ@À   ÿàÀ '9K]o67167!!&'&'4'1&#"32765271654'&#"34'1&#"327657271654'&#"34'1&#"32765271654'&#"3@þÀ                 `þÀ@@  €   @      @  €   ÿàÀ '9K1!6767&'&'!21#"'&54763471632#"'&521#"'&54763@@þÀ@  @   €   þÀ@`   €  @   ÿàÀ '967167!!&'&'4'1&#"32765'271654'&#"3@þÀ`   à  `þÀ@ÿ      ÿð° -&'&767&'&76?271654'&#!"3!€ þ  ``  þÀ  €   ÿÀ@À!367167!32+!#"'&5476;271654'&#"3`@ pþàp @   €þ€   €à   ÿÀ@¿*B4'&#";51#"'&54763273;27654'&+&'&'#@ ´  @À @  `` @  `  - þ  Àà  €þ   @@ÿÀÀ5%?3676'&'&'4?6?6'&'#&'4?6765&/&'76ÿ9DL? Q p,-@@-h$¾ èÿ9( " %@-,,h$//37½ ÿà@ PY132+"/6'&'&#"?967632#!&'&'676767676767&'p U \3 @ n !)) J J%Z þà&&AAR  "S\  oF G%  TEE,,hÿÀÀHU6716733675&'&='&76&'&'54'&+2#!"'&547633675&'#  %  M  þà @€€€À% š@  M  ˜    €``ÿà@ ~”ª671011390173671&'&93070307676767'&'"'&?632#&'&/##&'&'=474?67632/&#3276?&'&'015&'&'0#36767w& /2!  (   2/ &  , 0,. & .,0 ,  7 , $%À%$ , p¡      ¡  ¼ )0 .. 0) ¼  õ+  .  *+  .  ÿàÀŸ-&'1&7676'&'&76?'21#!"'&54763!4  @þÀ  ööl þ€ €b €  € bbþ¾   ÿÀ€À2;U47163!2+3+&/&/&/&73235#"'&535&'&'#1!"'&54763!2?632€ €   D--  @ H‰ &Р €) ÷ &5þè     @--D@ _7\ 3@ þà )€i $    €`/?767167767&/&'&'5'&'6?3367675&'&'")(><+HH+<>())(><+HH+<>()H""""HZH""""HÏ>()*HH*)(>>())II))(>H""HH""Hÿà@ 3<%671673277675&'&'#&'&'&'6753276756?&'67#8U $%68,7R66,< z  ð6%$ 66R6+,B.)3 ¼ÿàÀŸ-6716'&'&7676'&/7"13!27654'&#!Œ  þÀ@  ööþ” € þ€b €  € bbþ¾   @€H[n1!5&'&'67675&'&'!!;5673567356735673276=%#"'&=476323#"'&=476323#"'&=47632@  @  þ@ýÀ 0```0 þ€   €   €   €  GG  þà@     @À@ @ @ @ @ @ ÿÀ€À4U&76/675&''5#'6;5#&'6735#&'673&'&'''#&'&'5'#;67&'#567' P Ÿ9#PPPPP))¹j+6%$/+*B0HH0» þ0 |(1( -  ))6‘þi"$%6 %(D00 ""ÿà@ 08@GN767676767&'&'&&'1&'6767#1#57153#6767'3&'&'ABAA<<<;AABA<<<; """"à@@@€@@@OþË   5   ï))))@Ð@ @Ð@ÿà@ %,4<Nd767676767&'&'&#5'5367167#7&'1&'31&'&'6767'#;67&'#5&'#ABAA<<<;AABA<<<;€@@@€@@@€))))„OþË   5   þÑ@À@€@À@`0  00  000D@€ +81!6767&'&'!3#&'6767!!&'%3#&'567@Àþ@0  `þ PP€ÿ p°00@€ +v1!6767&'&'!3#&'67673#&/'&'"121&'5&'9&'&763327656'&/01&'&'6767567@Àþ@Ðàààà\        €ÿ€p˜    ÿá°Ÿ?132+32+'&'&?#"'&5476;7#"'&5476;7676r *? i@© ÔA *? j@ª ÔA › >  `  b  >  `  b ÿÀÀ.@Rdv%9+"#&'&'&'6767674'1&#"3276=271654'&#"374'1&#"32765271654'&#"3b  H9:"""":9HH9:""þ€         `  À "":9HH9:"""":9H   `   `  `   ÿàÀ !;1!6767&'&'!327654'&+##"'&=476;@@þÀ€0 000  H)) þÀ@à  @@  @x ))ÿà@ ?6716733567673#&'&'5#3#&'&'545'#&'&'5 ` À `  ` ÀP`  ` P` p    `  k `  `k `ÿÀ€À&1<G6767676///'&'67367&'#367&'#7367&'# ((((((    ((((((   RÀÀÀÀÀÀ¾ "" "" "" þ0 "" "" "" ÐŽÐpÿÀ€À +6AN[hv213!&'&'6767354763367&'#3367&'#3367&'#'&'&767676'&'%3#&'&'56767!1#53@ xþÐx p  `  `  ˆ˜  þ     À @þð@ þ€€  (HÀ `  ` ÀÿÄü¼1#1"/&54?76/776/776/776/7632²\30 0*0 0*0 0*0 03\þÄ.\30 0*0 0*0 0*0 03\þÄÿÀÀI1;!67675&'&'#&'5#&'5#&'5#&'6735#&'6735#&'6735&'&'#01 `@  0@@PPPPPP `   ` PPPPPP@@0  þÀ`@€@871!67675&'&'#&'5#&'5#&'5#&'5#&'5#    @@@@@@ p    PPPPPPPPPP  ÿÀÀ1671673#3#3#3#3#&'&'   PPPPPPPP     0@@@0   ÿÀ€À&3@MZgv&#!6767&'&'#'67167#5'3#&'567673#&'53#&'567673#&'5%676'&'7367&'#5&'Rˆv     vˆR€     þp    þø*,,**,,*X » [ þÀ  @ [þe``à@@@@p@@@@ 22220 ÿÀÀ'&732?6/32?654'&#"Ñh V V6 P (þ¨p @ p¹ P 6V  V h(þîp @ pÿÀ€À*HU113276767&'&'&#135#27167167&'&'&##%135# !%%##))$#341þà  143#$))##%%!þà À€ ((`€þ`(( €`€ÿÀÀ6CP%67167&'&'&'011356735673676750501%676'&'%&'&767 ,"":9HH9:"", 0@0 þÀ  $$$$1--6?2332?5.-@ 0000 @$$$$@  ÿÀÀ "<S\&'&'67'3#3675&'#'67'67167654'&'&'367&'&'#&'&''#3dO`\0?R66#é S3 #ƒ|0?R66"0mF::$""$::FF::$""$::F    *`v/O`]"66R?0 @|#66R?0/À!"<=CC=<"!!"<=CC=<"!   à`@ÿÀ0À>'&#!"367676727676'1#"'!5#"'1&'!6767=$:þœ:*))((()*0 þÀ@X[ [%%%%%%—……ƒ@@ƒÿÀ€À'3!27654/&'!336767=##5#!32765#%6 LþtL  à @À@À  @  rr   P  P   ÿ €';47163!2#!"'&547163!2#!"'&51#!"'&54763!2 € þ€ @ € þ€ € þ€ € `        ÿÀÀjoty~767167632#"'&'&'%&'&'&'&???76/776/776/76'&'76'&'76'7'7'?'7'7!"<=CC=<"!!"<=CC=<"!9 "" !-8 9." "" ".9 8-! "" "-9 8-" "" "-8 9-" ª----D----D--------ÀF::$""$::FF::$""$::FÀ "" ".9 8-" "" "-9 8-" "" "-8 9-" "" !-8 9." À----D----D----D----ÿà 9\35&'#56767332#54'&#"#54'&#"#54?6;533276=33276=3!&'&'° 04€  €  €4€€  €  €þ€h(((((4L  L4þàP  PÿÀ€À367676732/#&'&'5'&/&76?6;Ô  !!  "  8 4À3 8  ~" À  i  @ +úú+ @  iÿÀ?À HZ676'&'#1"'&'&?6?632/&/'&/&?7#"'&54? !  3#"   2  G9(= <  —   5%  A6 \  XN!@Ç>-$ > ;ÿà #51!67675&'&'!&'67!27654'&#!21#"'&54763@€þp þ€`   þÀà  ð   ÿÀÀ2Kc767167632#"'&'&'6'&'&'7676327'271654576/&374'76'&?32767!"<=CC=<"!!"<=CC=<"!S   £ `   À `   ÀF::$""$::FF::$""$::FŒ     |          ÿà 6"13!27654'&#!"1;56767;27654'&#!  À þ@ @@))@@ þ@    þ€  €))€   þà ÿÀÀÀ -;AGagm{67167!32#2+!&'&'13!5!"7''&'&'376735#&'4'1&'&#"32767653&'7#67766#6767)    þà)@ ÿ · ? *  $$  N""""ß $  $ 9 ? `) þÀ @  )@þÀ @ „ ##  &+¤+&R####&+ +&L ## ÿÀ€¿HUm…6372#'"/&#"/&/&574/&?65'4?6?632?&'&76772370/'&7'6?412?43/#&'®              b'((''(('þñ+ )% !8 ø%) + 8! º               º----úg$ Y 1=YY=> !þ°ÿÐï°0BT&?6?6/&/&/21#"'&54763471632#"'&5721#"'&54763÷"J$<"S"J$<"S'  @   à  ¯(L"R"; (L!S":    À  @   ÿÐï°%7I[&'&?6?6'&'&'&'&'&'&'21#"'&54763471632#"'&5721#"'&54763 "J$<"S"J$'  *1  @   à  ¤ (L"R"; (L! & )t   À  @   ÿÀÀ;4'1&#"#";35#13276=327654'&+&'&'#3€    àà    àà    ÿ@`þ@   @þ  €€*5@IR[dm1!6767&'&'!32+"'&=476367!!&'!673#&'%&'6767&'7&'6767&'7&'67@þ à à  ÿ@  þÐ0P0P€ÿ@ @ @ ðPÿÀÀ&?X67167654'&'&'5&'&767'676/'&?'&73676/'&?'&7F::$""$::FF::$""$::F$$$$› %% $$ %% $$ À %% $$ %% $$ @!"<=CC=<"!!"<=CC=<"!à  › $$ %% $$ %% $$ %% $$ %% ÿÀÀ@Oa'932767676"''&=4?&'&76767&5676767/&/271654'&#"3` 5$44D $6-- (::E508 8< F ))1(,8 (u  `['Yv '  2b  7 h  x))þÖ!L 7  F   ÿàŸ*K6'&&#"56756767567675&'7?&'&'&7&767632õ i4>mHHE2>>2ELDÂ@ o =ee= >?/:  ¥ èÿK !  845& .==<* ¤ ÿÀ€À&1[1!6767#"'&=#33'3#&'673#&'67#&'6736?67633#"/&#"#&/@€  À€€°@@@@6 #   6@     Àþ€ €€€@@þ  2'     8!ÿÀ€À01!6767#"'&=#33'76/&76567@€  À€€(HHÀþ€ €€€èfHHfÿÀ@À04671673;#3!&'&'53'&76'&?#5#5  €¨¨ÿ€n'PP'n€€€€ €p€þð0'PP'Ѐ€ÿÀÀ(04671673;!&'&'53?6/&#5#&'673%#5€  €ÿ®'PP'®hh€€€€€ þàp'PP'àà0 €€ÿÀ€À&1FKV1!6767#"'&=#33'3#&'673#&'6732+"'&=476335#3#&'67@€  À€€°@@@@À À ÀÀ@@Àþ€ €€€@@` @ @ @@ ÿÀ€À&11!6767#"'&=#33'673#&'673#&''&#"901&'5&'1&'&7609227654'&/1&'&'6767567@€  À€€À@@@@€       Àþ€ €€€P@H      ÿÀ€ÀGO1!6767#"'&=#33'376/'&?'&'01#&'=6767&'#3@€  À€€˜H +" "" !AH44Àþ€ €€€Ä(  <,@PP(ÿÀ@ÀJN\j1!67675"+"/&#"#&/#&'6736?67633&?6?5#"'&=#33'"7654/?6?'@<@     #     _€  À€€&  G î < GÀþ€   8!  2'  < ^, €€€Œ G  µ < GÿÀ€À01!6767#"'&=#33'&'5'&?6/@€  À€€(HHÀþ€ €€€þhfHHfÿÂïÀ 6"32?654/&#"'327654/76!6?W R\u&&¾—5QQ1 25—*þÁ\· Q\&&u¾—5R¬2 15—*\ÿÀ@À 6L63127632#"/&54?'&547'!76/&#"'&'1&'6767632) Q5—¾&&u\R °1\?*—52 '· R5—¾u&&\Q Þ2\*—51 þç  ÿÉÀ,Kcž767167276'&'&#675%&6754/"7633676=&'&'&'1"3676=676'13676=67673676=&'&'&'?6=0;;X0() #22;H9:""Ëû  6%$ 12Ki $   i)    )  $ÀX;;" )"":9H((5(({  $%6&% )*K12E.>$$ ++)  )64 ;=66 :<)`[T ]c@p+=67167&'&'&''&?'&76674'1&#"32765µ''00''  ''00''Z .. Z   25 PP 5r  ÿÀÀ$1>GP767167632#"'&'&'367&'#'676'&'%&'&767!67&'367&'!"<=CC=<"!!"<=CC=<"!°€€))))#$$##$$#þàÀÀF::$""$::FF::$""$::F€X#$$##$$#H))))ÿÀÀ+=S67167654'&'&'21#"'&'6763671632#"'&''1&767632'&#"F::$""$::FF::$""$::FP   €   z     "(("@!"<=CC=<"!!"<=CC=<"!P     ¯  ÿÀÀ!&#";27654'&+576'&'!'!#  ×@ `` @× þ@@&@¦ÀÖ³   ³Ö€@@ÿÀÀNh?632?6/&#"332?6=4?674/&7676&'&'"67167632#"'&'&'²     $  '     !   66I*$²!"<=CC=<"!!"<=CC=<"! )      0 "  ! C**ÁF::$""$::FF::$""$::FÿÀÀ;Ic776?6?6754/&+"/&'&?676/&?6/"#&'65!67167632#"'&'&': : +"  G55– þ0!"<=CC=<"!!"<=CC=<"!ÿ ('      ((@?8-  2F::$""$::FF::$""$::FÿÀÀ+Lfq|‡7?6676/&76;6?6/&76?6?&#&1"/&#"?667%67167632#"'&'&'76/&7?6'&7&?6'4         !$X;;—   $9þ5!"<=CC=<"!!"<=CC=<"!‘  \j   ™      ) ;;X    .I,F::$""$::FF::$""$::F\  Ö   ÿÀÀ!).38=EM_q67167654'&'&'7#53#7#532+53#53'#53#53'#676;#"'&'3'671632#"'&'721#"'&'6763F::$""$::FF::$""$::F`7 /7 G@@@@P@@@@P7  7   À   @!"<=CC=<"!!"<=CC=<"!p( 8( ((8((`((8(( (8 (À     ÿÀÀ/AS67167654'&'&'761&'&'&7667'671632#"'&'721#"'&'6763F::$""$::FF::$""$::F„ ((43(( =GH<ô   À   @!"<=CC=<"!!"<=CC=<"!Ç -- i     ÿÀÀ/AS67167654'&'&'761&'&'&7667'1&'&54767&'1&54767F::$""$::FF::$""$::F„ ((43(( =GH<´   €  @!"<=CC=<"!!"<=CC=<"!Ç -- y@ÿÀÀ/]‹67167654'&'&'761&'&'&7667'9#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9F::$""$::FF::$""$::F„ ((43(( =GH<ª @!"<=CC=<"!!"<=CC=<"!Ç -- T    ÿÀÀ;P~¬#"'&'47450367676'27&'&'&'676767#"'&67676'&'9765&'&'79341016767670103939765&'&'793410167676701031Ý    ÝN=! "":9HH9:"""":9H€;EE; ''22'' ¦ B    ~( "/6H9:"""":9HH9:""þ ++ Y    ÿÀÀ/G^67167654'&'&'761&'&'&7667'1/&'&7676767676/&7676F::$""$::FF::$""$::F„ ((43(( =GH<½A  › A @!"<=CC=<"!!"<=CC=<"!Ç -- ¸ A  A ÿÀÀ/DY67167654'&'&'761&'&'&7667''&54?'&5476/&54?6F::$""$::FF::$""$::F„ ((43(( =GH<þYY$$$$ZZ@!"<=CC=<"!!"<=CC=<"!Ç -- ¦0 0++ ++0 0ÿÀÀF[q†›6312"##"'456747456776767'67676'&&7676766721#"'&54767%767676'76?6'&7?676'&#/4'&«   - ) >ASTK ) >ASTKþ¶   m 026 ,..$# þ¶9 b² a8²   KTSA> ) KTSA> )þ‡   É 621  #$..,L8a Áa 8ÿÀÀ/Nm767167632#"'&'&'6'1&&'&6767'"?765'76'&/"?765'76'&/&#!"<=CC=<"!!"<=CC=<"!— P67167654'&'&''&7163!2&'&'7671632#"'&'721#"'&'6763F::$""$::FF::$""$::FŸ  ++::++/   À   @!"<=CC=<"!!"<=CC=<"!Æ  4!  !4z     ÿÀÀ,Zˆ67167654'&'&''&7163!2&'&'79#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9F::$""$::FF::$""$::FŸ  ++::++y @!"<=CC=<"!!"<=CC=<"!Æ  4!  !4e    ÿÀÀ,AV67167654'&'&''&7163!2&'&'7'&54?'&5476/&54?6F::$""$::FF::$""$::FŸ  ++::++%YY$$$$ZZ@!"<=CC=<"!!"<=CC=<"!Æ  4!  !4Ç0 0++ ++0 /ÿÀÀ,>O67167654'&'&''&7163!2&'&'7671632#"'&''&7632'&#"F::$""$::FF::$""$::FŸ  ++::++/    $$ @!"<=CC=<"!!"<=CC=<"!Æ  4!  !4z      ÿÀ€À=FUbo4716;!2+&'&'47#&'&'47#&'&'&'#"'&55&'#3#567673#553#%3#&'&'56767 "Ð C  Æ  " °P`PÀà  þð    "þà      "  @((((àààà € àà € ÿÈ@À+:F%67167167&'&'327767&'&?5&'&'#"'&'5/""33"" q‘ tþo {q!!Àˆ"#%%3""""3%%#"¿: . þÑ<þò3ü 1D11Â7ùÿÈ@À+:FS11#"'&'&'&'676767456576%'&'6?67'5327'676'&'˜ ""33""t ‘þê {¾!À!(  H%%#""#%%3""""3P . þñ:/> ü31Â1ù7Â1´ÿÀü¼)"'&#"?67654''?6?á%% VV t‚¥»‚@J fJ@¡ VV t‚¥%%þÂAIf IAÿÀÀ 1R&5673'!&'767347167632#"'&'&57&?67'&?6/&/m EJ2føf2JE mþT)*..*))*..*)¸2 $ --  $ 2šr 4šš4 rþÖ0((((00((((0_ . #11# .ÿÀÀ+=767167632#"'&'&'74'1&#"32765271654'&#"3!"<=CC=<"!!"<=CC=<"!Ð    €   ÀF::$""$::FF::$""$::F0     ÿÀÀ$>X67167654'&'&''3#&'6?1&'&'67327654'&'1&'67327654'F::$""$::FF::$""$::F@€€ $  $€$  $@!"<=CC=<"!!"<=CC=<"!)   )@)   )ÿÀ€À )6!6?367&'#!2#!"'&54763µ P(þð(PPPx@ þÀ » Pþ¾BPþõ°   ÿÀÀ 4&'1&37674'"13;276'&'676527654'&#!ø Ñ‘jþ(  = À =  þ@µ ši µ  >.. ..>  ÿÀÀC67167!!&'&'547163567673276=#2+"'&= þà  " ) @ €@@þà "  Z  ) € € ÿÀÀÀ'-3?E_j67167!!&'&'&'39&'&'376737&'#'9#6767#674'1&'&#"3276765367&'#@þÀ·, ' ) 0 ) ' , , '8 / ) ' ,©""""ðàà€þ€€×1-  ++  -1g-1P ++  -1W####ÀÿÂÀ +67/77327654'&#"76?v$"Ï @ µÌ @ ²`  _2S¥"$´ @ Ïæ @ S2_  `²ÿÃþ¾ .7654/&#"7&56767"'7%6?'p7}8.P  X š    ™ ,®8}7.M, þø™    š X  ÿÁÿ¿ 6R'76327'&?6?'&54?6320#0?2105"10?2141#"/7Õ9r9þXÿrÿ h  Ì’WN@ @- -@ @NW’­9r9þ²ÿrÿ  h ú’WN@ @- -@ @NW’ÿÀ€À2DV56'&73'%&/&5!2#!"'&547637471632#"'&5721#"'&54763#)( mk#@AþÖ R @ ýÀ `   €  c0&’  M T þç   P     ÿÀ€š!5'&'&;27%676'&'#"13!27654'&#!"}Ã.“c: ! I ‰G 9hþƒ @ ýÀ MI  _2 U ‰%K5þ“  ÿÀÀÀ:F"13276=332?327654/7654'&#"'6767&'&'##53   3€j ii jj iV& 0pp  À  ` @€i jj ii jV (0  `  ÿÀÀ$5GZ#"'5&'&'&'6767675&'76'&#"76323631276'&#"767675&'&'`-33-:#""":9HH9:"""#: $$ z $$ m    -;"::HH9:"""":9HH::"¾Í        f      ÿÀÀ&:L^713276767&'&'&#"67'&'&'"'1&'67676#71#"'&547632'21#"'&54763!"<=CC=<"!!"<=CC=<"!ðE/ '5P    Ð   À   ÀF::$""$::FF::$""$::FP3 *P  Ð     ÿà€  :GT35#'#3#5#3#&'&'#&'&'#&'&'56767;#&'&767676'&'@`XâQQ¢â``))€)) x qo @þ  XX`X````À)))) è„l   0ÿà€ FR\e4716326?6?;27654'&+76'&6=&'&'3276=7#&'56734=#67&'!!À  T) )^  € T {))  1Ÿ((PþÊ L@ )) !H#GO&  6 %))   ±3/H?(0ÿÀÀ3a67167654'&'&''167676&'&'&7679#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9F::$""$::FF::$""$::F\!! )) 6 @!"<=CC=<"!!"<=CC=<"!º    a    ÿÀyÀ+05:?DK"13#";27654'&+53676'&'&#!3#7#733#7;#7;#'7#'37z4Ù@ À @Ù3þt‹v ‹ ;e[ nj tš” ª Åit `e [Àÿ@   @@hhhhh0hhhhhh0hhÿà@  276767673+&'&'&'67371&'6767632·3# #3DU $#=?^@ @)!–  “#**#  &-21  12,&  #*+#w ]=>  $$$$¦       ÿà@ Dy67167'&/&'"356767'&/&'""#15#&'&'56716'&'&'&'&''&'&7676761676€)%   À)%   À³#**#  &-21  12,&  #*+#@)%   ``)%   é`aéþú       ÿÀ€À &867%765&'&'&'&+"'&76/%1&'&'67@R6þÖ66R¹!!''  § P ~þç"0 @7ë9+R66/??77 !!*ƒ þ0 b#" 0ÿÀÀ:Od67167654'&'&''671632/&+"'&56767''&54?'&5476/&54?6F::$""$::FF::$""$::F[ )++) YY$$$$ZZ@!"<=CC=<"!!"<=CC=<"!· ¶0 0++ ++0 0 ÿà  0&#6?676?6?6=&'&'"/º ) $$ +%  %Œ)/ÎzzÎ/* ÿÀ@»&=N%'#"3!27654'&#!737676'&''&'1&'&#"1&76'5176?67Z00P""°<10 01>>>b ÿÀàÀ 6CP^ky†˜%7767&'71'#"'&''&767&'&76676326276765&''674'&'&'&'1&&6767"6713&'&'7&'&767'21#"'&54763  ¾"R R""R R"B  S  Ÿ   â'((''(('P  1"!!5 (( 5!!""!!5 (( 5!!"C  ¯  0Y  t  1----    @`C1;27676763"'&'&'&+"#&'&'67654'&'67672š À  "(("  À  "((" /  "00"   "00" ÿÀÀ)947167632#"'&'&5'&/&'5476;6732    P0 #` bP Pb `# 0`  ˜þø Ë 7þø7 Ë ÿÀÀ.]1"'&'#&'&'47&'&54767&54767&54767676;21"'#&'&'6767¸    Àþp      ÿà 9FQ\3!767#;276=!;276=6754'&/&'&+"3#&'567673#&'%3#&'67¥¶þÚZ#        # ¶ …``   h  `KKeP%9 00 9%Pe°  €)BM4716;23476;23!&'&'567673&'#3675367&'#5367&'#P @ ` @ þ€0    þÐ```  àà`    0ÿÈ^¸$-Xal"'&?6?67&5&'&#'76'76?76?6/&'&/&'&76676'&7° L (B  N $ ,) M À‡ Ê  F0#    ÷    ˆÚ ¸ J E-  P !#'.< J š$ 96/ E#&>  B  >'$T$ ƒS ÿà€  <IV3#767532#'&'#";6767367673276=&'&'676'&7%&'&767«5qeQ C­d.¶ ) !$$‚$$! 1]   þí  ``L`` T}#hp #### 02##¯ ÿÀ@ÀUl1"3!27654'Ȕ67675676=&'#5&'#5&'#&'5&'&'#5&'&'#32'&?#&'&?6`     % y : p : p Àþ€    | 0000 | %ÀS K ` K `ÿÀÀ26312#"/&54?&#675673?6/ä  Ø Ø  Ø ØW @@ P P´ Ø  Ø Ø  ؉ 8008 P PÿàÀ Q30101/1"#&'&'6767231?1#1&'#&'&'675&'6767367`Ò  Ò %Ò%%Ò%  )Ò88É%Ò%8  8ÿà€  />67167!#!#67!!&'&'%/&?67'&?'&76@€@þ€@@Z!þ!00p00`ÿÿþÍ!!Â00"00 ÿÀ À#66/&'6?/&'6??7/&'6?7 Ú  ÛÚ  ÛÔ5  ÛÚ  5˜%%˜˜˜5  ÛÚ  5˜%%» ee eeÍe eFFÆFe eFÿÀÀ9S`2132+#"'&=&'&'#"'&5476;676754763132767654'&'&#"7&'&767 =+* # # *+=  =+* # # *+= €""""€----À # *+=  =+* # # *+=  =+* # ÿ####P'((''(('ÿÀ€Àc21567672"/&'&'576/1'&'01?#&'&'545676767676376754763@  # & H![  l, ,_  [!H & #  À „.'&,,,& "I: E < :I" &,,,&'.„ ÿÀÀ%IT4716;22#+"'&5"'&=4763!6767&'&'532+!"'&5476373#&'67         € 6%$$%6R66/  þà PÀÀ   à   à þ`$%66%$@66RK5   @ ~€38271654'&+";+!2?6'&'&+53'53@ €  P00 C ·§2Q à00@    A Î $ PVAÿÀ¿=633!&'&'6767&'67673&'6767367674'&7þ $þ"¹%$$" ÿÀÀ$>&'3676/;276=4'&+"27167654'&'&#"3;  `  À  `    ####°  þØ  È""""ÿÀêÀC4716;276/+"'&='&/&76?'&'&?6765Ð   z  zz  z   z  zz  z  G  FF  G G  FF  GÿÀÀ1CUgy767167632#"'&'&'4'1&'5&'6767'271654'&#"34'1&#"32765271654'&#"3'4'1&#"32765!"<=CC=<"!!"<=CC=<"!@  °           ÀF::$""$::FF::$""$::F`ÍÍ°   P       ÿÀÀ+EWi{767167632#"'&'&'%4'1&#"3276567167&'76'&"1"14'1&#"32765271654'&#"3%4'1&#"32765!"<=CC=<"!!"<=CC=<"!   @ @P   P  `   ÀF::$""$::FF::$""$::F   þÀ‘ ’       ÿÀÀ1767167632#"'&'&'4'1&'5&'6767!"<=CC=<"!!"<=CC=<"!@  ÀF::$""$::FF::$""$::F`ÍÍÿÀÀ0767167632#"'&'&'&'76'&"#6767!"<=CC=<"!!"<=CC=<"!@L  MÀF::$""$::FF::$""$::F`“ “ ÿà@ %6FWhy‰š67167!!&'&'3675&'&'713675&'&'3675&'&'671675&'#7167675&'#671675&'#73675&'&'671675&'#)€))þ€)°0  ° 0 þÐ0  0 0 P  0° 0 P0  0 0 @))ÿ))088  0 88 P  °  0  0  °  °   ÿà@ &7HYn °1!67675&'&'!1#&'5676767167#&'5'1#&'5676767167#&'5!67675&'&'!5&'1&'567375673&'&'&'1&'567375673&'&'`)À)þ€€ 0 P  0Ð 0 P  0þ°€)þ@) 0 P0  ° 0 P0   )@@)@ 88 0  88  0  þÐ)  )@  0  0  0  ÿÂÀ/Hd}–¬71767&'&7'&7676763767676701&'&'&7600'&'01&1676717676?6'&'&'&7&'&'050167611''&'&'0505676101'&'&'47676K -,-    ',,SS'' *W     d$#,-,- * &'SS,,      ˆ      &&%23,K6<„   ¤:'Û   ì%%% ':¥   ¤:2›      c"& ÿÀ@À!.;16767&'&'#&'&7677'&'676'&'&767@--DD--À`  00  ÀþàD----D þ`°  PÿÀ€À;tºÇ3'#7322#&'&#"#&'&#""'&547635476;56767336'#&'&'/&7&'&'56767&?66767676'&'%6736'#&'&'/&7&'&'56767&?667&'&767 €0PƒMP  !!((!!@!!((!!    ` þõ                   P€@@&f @    @ P æ        °›        k  ÿà€ ER_#53'#"";67674'367674'327654'6'&+'&'#'&'676!'&'676qLQ‘   ! 00 B 00 !  1la  ```p @  0  00  0  @ ˆ þà    ÿà@ '+4L1!6767&'&'!/#'&?6323'67&'7567"'#&'&'67672@Àþ@¦H Z  H*¸   þÀ@    A**,`0ÿÀ@ÀE67167&'&'&571#";3276=327654'&+6767&'&'`    @6%$ / `  ` / $%6@  €$%6' !       ! '6%$ÿÀÀÀ ,I1!327654'츝4'&+!!!"'&547636733##&'5#&'56735`))    þàÿ p 00 00À)þÀ)  @ @ þ€@  00 pp 0ÿÀ€À)<Ve3#567#;676325&'&'#5&'&'##"'&=#!&'47#4'1&'&#"3276765'3#&'567¸ 8@À ##)@À` À('@""&&""""&&"" 0(((`!(þØ  €/A'!!!!''!!!!'P0@ ÿÀ€À3@MZgtŽ›¨µÂ&'1&'##5&'#5&'#!;67675&'&'#5#&'5673#&'5673'#&'5673%#&'5673%#&'5673'#&'5673#&'5673#&'5673%#&'5673'#&'5673#&'5673à ` @@   `   p`  þ°  p  °  þÐ        0        0HHHH `à  à þÀ  0      P        0  Ð  p  ÿà /z%67167167&'&'&'#09367673'&'"121&'5&'9&'&763327656'&/01&'&'6767567H9:"""":9HH9:""/ ,&#08        //::////:E4% 8    ÿÀ€À&M’1&'&'&790521676767&'6767671674'139#&'&'&'&'&'#&'&'&96756767&'&/&'&7&763276'&'5 ;;X:/ "  ';;XX;;¸Z>=S66'  " /:I66        K12   ,;K1221KÏ 88V11G;,   $#97    ÿÀ€À-1#3367675367675&'&'#5&'&'#° P  P   P  P  À P   Ð  Ð   P  ÿÀÀgnu|ƒŠ‘˜ª%7&'&'5656'&#"#&'54'&#"#&#&#";32?3276=673376'4/67327654'&+%67'67'&'7&'77'677'67'&'721#"'&54763R0AŒ "  -;  ;- "   "  -;  ;-  "  þÅ$ +A0AA0h%+ w% +A1@A+ %]  ò+$ ;- "   "  -;  ;- "   "  -;  cA0g%+ x$ +A0AA0g%+ 0Ab   ÿÀÀ)=HS+'6?56767376323=+532?1!&'&'13#&'673#&'67×G$ ` M21M ` $GR×ÚÚþ€°    ` '(YF, % % ,FY(' þ Î¡ ¡Î @ÿà %!&'&'67673;%367&'#Àþ€€   þø @ ÿÐÿà 4%1!&'&'67673;%675367&'#5&'#3þ€€   þè@@@@ @ ÿ(@@@@ÿÀ@À1}67!&/&='&747167632#"'&'&576763276'&'5&'#&'&'&21396756767&'&'1&'&7147 ° k=''@ · ""&&""""&&""y       ©ƒ //A)$0 Oàþ§'!!!!''!!!!'!       ÿÀÀiv‚356735673567222+5#5#5#33#5&'&'#53535####"'&=47635476354763=67"1354'&#'354'&#"x(0(   @ P  P @   ˆ @  @  À @ @ ` `  €``€ 0  0 €``€  ` ` @ @ þð 00 P  ÿÀÀB\n7367547632675476326754763232#"'&/&5476;16767654'&'&'21#"'&54763#-      - V )*..*) V Ý       È „¤ ¤„ È  _""_         ÿ¿$À6m76//'&?'&?'&76?'&76767/76767'&76'&76?'&'&?'&/ L '\TB Z55Z AT\' L       ÀY5 T 'A\ LL \A' T 5Yœ        ÿÀ0Àš7'&76767?6/&6767&'&767654'&7632013&'&'&736/&5&5456;6/&7676767&'&?6/&54?6'ö  &&.'  )  . #@@QQ@@# .  )  '.&&„ þæ  > "#09% # ))2/D))))D . 2)) # %90#" = ÿÀÀÀ -¯67167!32#2+!&'&'13!5!"7'00#"/6767#"'&54?41414''&?&'&'3276/7654/76'"#'4#"'&0132?&'&76'&74')    þà)@ ÿ Z% )) %           `) þÀ @  )@þÀ @ ê && $#  po!$ÿÀ@¿3>IZ7'761'%=67%%?'%&'576/57'&76/6'&?&?6'&/<ääääÛ þåþå5 +ÿ ÿ+ 5¹ @ @` @ @à '&''HGGGGvPYYPþöU.  ‰PP‰  .U           ÿÀÀôý690019?67654/&766769;33011#92'&'/63&/#"'&5675&'6727''779#'05"'&'&'&'&'6767676727217394'65'&796747674705&'&547674'&'&'9&?67&'67&'ö 0  *$)    L -(  (- L    *"*  0  H  ¼(   $""'0(   (("" +     + #"((   (0'""$   (w##j##ÿÀÀ66!&'&?5?3353353353301!&'&?212=ð¬0þ@0¬°@(@0@(@0þ@0¼b  bÜÀÀÀÀÀÀÄ  Ä ÿÀ`À+8K]"1356767354'&#!"133276=4'&#!3#&'567"16?54'&#!&/3!276=€ `à þÀ€ `À þÀð  þP ›› ÿ ˆ ˆ  À À `    € À @    ss  Uee‹ ‹ ÿÀ€À)>Sh}’Üëú 632#"'&=4?3632#"'&=4?7632#"'&=4?632#"'&=4?7632#"'&=4?632#"'&=4?7632#"'&=4721;5476323276=47632#32+"'&5476;5#&'&'5476;21#=476;21#=476;21#=476;21#=4763  `  N  r  N  r  N  ýÝ À  À  )À€    €À) ` @ ` @ À @ ` @ ¹+ ++ ++++ ++ ++++ ++ ++++ N €     € €)@   @)€ ` ` ` ` ` ` ` ` ÿÀ€À%Qar209!&'6767679016767635&'#"'&=4763!2+5&'#5&/#6#5476?3+&'&'5!!)-þœ-)!!p0   0@@Ú  F  @ À"7,+7"þHH € € HH::û    ›‰%€   ÿÀÀ µ&?6/63#;&'&'&'&'45"59&7"90267674'36?6;2#&'&'&'4141#10101&#&#&910110367675&'&'#+65&'&'?&739067676763015390'&'654'&#"""#&'&'0#&'&1"9{    þø   "  &   56%$'  &   ())( 1  0&  ¦   /  ! »    ¥        $%6# `    )`) 0  g      ÿÀ€Àø&'6736327&'6767"#017276756767"&'3276763#0#"'&'&'7&'&'&'#"'&'6776767&'1#&'09&'&'&'672327676767476747&'&'&'5&'&#&'67376?676767'"#&'&'67673&'67Ð0%%       #  &  &  #!      Ѐ                     ÿÀÀ 575'75'6?65&'&'%67167632#"'&'&'à^(6‡‡F,-%^6()-,F‡þY!"<=CC=<"!!"<=CC=<"!yM# ^n® 34I5*2My #2*5I43 ®n_F::$""$::FF::$""$::FÿÀ€¹)535676735&/54/&35671675&/3à)``) L L Ç Pg7 gPSmå``åm L L Ý\ î8¶ \8îÿàÀ )=Q1!6767&'&'!21#"'&=47637471632#"'&=21#"'&=4763@@þÀ@  @   €   þÀ@À ` ` @ À À€     ÿàÀ )=Q&'1&'!!67671+"'&5476;221+"'&5476;1+"'&5476;2ÀþÀ@À ` ` @ À À€     `þÀ@@  @   €   ÿÀ À 9&'&767?676'&'&'&'"#";676/7`  w  X   8* 06W Ð t-€$$$$È  H   -$! ]'  VZÿÀ€À1c676/&'&'5476326754/&'&767#67547632'&=6?6754?676_ x  O ©+  W > W  +© O  x » ´I ` - "!-v PU —  — UP v-!" - ` I³ ÿÀÀÀ ,Ac1!#"'&547635"'&5476;!!!27654'&#'?5'76/&1276'&#&'&'6767276'&'`))þà     ÿ N      ²$%6' )) '6%$À)þÀ)  @ @ þ€@  ê   *6%$(($%6ÿÀÀ_%#"/&'&'6767'&'#&'&'&96756767&'&/&'&7&763276'&'5 ' ~5FX;;;;XX;;¼        ðF5~ ';;XX;;;;Xh    ÿÀÀ.@%#"/&'&'6767'&'1&'76767#471632#"'&5 ' ~5FX;;;;XX;;€"" p   ðF5~ ';;XX;;;;X ""&'( ('&  ÿÀÀ#5B&56?6=#2?3547&+2?675#75&'&'#3¯2@  @%) /  ` À@%) s2ÀÀ ` À!?'0  0/)  0/)W'?Ð   ÿà@ #M6716;2+/#"'&5476;63127632#"/#"'&54?'&547È Èi f. .$AUn )) ** )) ** r  þ—°  p"› ** )) ** )) ÿÀýÀ&P7671671672#&#232#&'&'&'%6312/&'&?4/&76?6?"":9H2,  X;;;;X  ,2H9:""wG3 ?? 3GÀH9:"" ;;XX;; "":9Hw@ 2F!!F2 @ÿÀðÀ 7;?CGK%3/#373+&/#"'&54?'&5476;76732'7#/3#73'7#”*!6z66z6B5 n8  8n 55 n9  8n 66*d6š**y6Š""6XXXXW  \\  WW  [[  WX##8,,8##Ž""Z,,ÿÀ€À*:S6+54'&#"+=6?7632##&'&'54?6327&#3?36/76'#'6 yp  pyÊ@ @þ€@ @Ç    ¼e%rè` `èr%eþ G„ þõ„G y     ÿÀ€À+PT[_cgko&'&#"32767!!7"132767&'&#4?'&567376323##"/#&'7#'37'#3'7#7'3'7#'3`     þ€€P    þt9 99 9|*AFF‘!!`*`!!! À þ@ Àþ@À þ@ À þÆ106 6016 66$$p4444L<$$<hÿÀÀ'P1335335335367675&'"#!"/&#3276=!3276=327654'&#!"; @`@`@  1þþ1 @     þ@  p @@@@@@ C   CÐÀ ÀÀ À   ÿÀ€À‰‘7676322+"+##"'&=##"'&=##"'&=#&'67675#"#&'&'&'4567676?6?=#"'&'&'&76763767+;5;5+1+3=  &' -(        (- '& =3‡``H0Hÿˆˆˆˆª$ 8 B#         #B 0 $j@@ @@ÿà@ //#&'&'5676737676/'&?'&76-‡DD‡|77777777 þ€  x@x „77777777ÿÀÀ3EW1&'&'676767167654'&'&'4'1&#"32765471632#"'&5))))R6666RF::$""$::FF::$""$::F   @   €))))66RR66þ@!"<=CC=<"!!"<=CC=<"!`  À  ÿÀ6À!6Hc7&767!#3#3#3!!!&'&'56767271654'&#"3/76'&'&7676à! Ÿ–„|jbÿ   þà    Ì!!, 11 ,`, @@@       `   Á :AA:  6EEEE6 ÿÀÀÀ -BKTm67167!32#2+!&'&'13!5!"&'1&'367567'&'6767&'&?76/76'&')    þà)@ ÿ ""@p0z MM jj MM jj`) þÀ @  )@þÀ @ 0   !a !! .. !! ..ÿÀ@À',6'1&'&'&'&;676754'7#7#y '' 0ë  ðð  ë0YwwxxŒ  11  <þÛ  %<þtœœÿÀ À8ajs3327#"'&=32+&'&'5&/&'&767667671#&'1&'&51=671213?1631'&'6767&'@$  ˆ8 )  %*)3 ,  @   "00 À m  )ß  &U'` %% ` [ÿÀÀÀ?3535&'&'#35673533276=!3276=276/&'!ø0&0$%6@6%$0&00È        þ ÐÅ.€€6%$$%6€€.ÅÐð ` `` ` ÿÀzÀ$H2276"'&'&'&'&567671!&'&'676756767263ð  "))> 5P#-66R0"þð)#) "À !")?)) 4#-Q76þP")%) " ÿÀ€À;Hl"#"5&'&'27'&/&'&?'&76?67676676'&'1!&'&'676756767263&U&#))) U22UGG–  ð"þð)#) "¿U7)))  TGGU22Ï$$$$à")%) " }€_hx7;276=67532767567;276=276?6/5&''&'&+6767=6767&'%&5673&/`      *  5#†@03"" Ðþw²"00"à   X  X   2 ? fRJ""36  (&@p©  !! ÿÀðÀ )8FTdr€‘?6'"?6/&%?654/&#&'1&767523765&#675&/"23'276/&#"%'&#"7676'76'&+7'3276/&+"315N Ž!< .&N 5Ž º- <1¡ ­ Ö ¡ ­¿«VO ·NVª ÙO ’ OZ¤ P  P B  Œ b .{\   Œ   b    \{ö4@ ^4 @–xx–  ‰  ‰ Á  ÿÀÀ»!26/&'6?/&'5476!6'&=4?ɯ¾¾¯±°ŸŸ°¶ ` hh ` ` Ø WÅ  ÅW Ø `ÿÀ@ÀDM7672323+'+"'&=#"'+"'&=&/&7676;7&'676 48" pj   $,,$   -   p0!‹ "@aà ss æ1  @°ÿÀ€ÀALTj'&'&?'&76;#"/#+!"'&'&5476763%674/&'=709010109'676716#&'&?'&?`4  ), p /9   !j /"@þp”,. /þ„ ƒè E™ ~C    %M   'B/$-/B-95 %  W2+ < oÿÀýÀ@7#'&#67674'&74?6;27676'&56767276'&'&'       Y   0  /0BK12·     0  ?()21KY ÿÀÀ-CTfs€š¥°»01?676'&'&'6'1&'&#"7632?1743676/&'&367&'&'&%&1367676/#3675&'!3675&'#3675&'#!3675&'#'&'67&'6753&'675QD      þú C :P Eþ» PE2PP0PPþ€PP€PPˆ@€# -  L x  LL0 .  L ‰)$ . L $) .Ž0000€0000àþð ððððÿÀÀHk†671673;##&'&'#532&'5&'#367567+"'&=476;#+&'673674/&'476;6=67#"/&=67  €Ð0€€€¸   …## % ++ % c€€ €@€€à P P        ##  5,,5  ÿÀ À -Az21#54763471632#53471632#"'&=471632#"'&=5327327+"'&=&/&'5676732+36767À @ €  @À   `   `    %X 88À pp @ PP ` `@ @ @X  (!!` N  &5  ÿÀ€À,>P#&'6767"/&#"/&#"#"/&'&4'1&#"32765271654'&#"3( 66RR66    x   `   R6666Rþò  # #      ÿÀ@À#3%/&='&56?6;76/&?'7&'&'67ž-#'P /9*-$ Xþ}ê& Ã$ Ò!& ,  &*%1X‹Â& ë $ÿÀ€À#4FWizŒ§±»ÅÏÙ#167&'&'&#"167&'&'&#"67&'&'&#"7167&'&'&#"67&'&'&#"7167&'&'&#"67&'&'&#"7167&'&'&#"67&'&'&#"3=&'33=&'33=&'33=&'33=&'33=&/4'1&#"#"'&=4'&#"3#";27654'&+53676754'&#"+5:þà>R.².R>þ( @ @   @ @ °  À  )À€    €À)  À½055555558```````````` ° ` `)@   @)` ` °ÿÀÀ'@S?6?63#?67&/&'#&#"32?654/!2#!"'&54763@i1“<]Ï (  ( (  ( ØøÀ þ@  ë5^•Ð# (  ( #þÎ   ÿÀ€À ?M`676'&'#"'&='&?676356701010101&'5#&/7'&'&7/&'&?676;2À32  J'¢$* 8$0    ·L2Y SJ#T +8øØñŠ*d  Z [ ÿà€˜nw€‰’62;276#&'5##&'5&'&'&'&';+"'&=#"'+"'&='&?6567671;267'&7&'6767&''&'6767&'—    @   @ "" @  66R IXX0‘  )  %"  @ L L w) 1R88 ¹pÿÀ@ÀQZ%537675&'367&'++675673676/&?6545;276=67157&'67À  P 6%$`60!  "  T   0ÒN#L$%6'"88 *,24 ?  … ¤.®ÿÀ@À;%1##'76/&#&'&'5#&'&547%625476;2@ {&Q u 23"@" 8  Mpû  2   0%   0d%  33F?2332>'  & v€97676'4'&'&'67&'%6716767&'&'&'5@GhhG 7YY7 ÀG43HH34Gÿ"HeeH""HeeH"ð %%    ((%##%`%##%`ÿÁ À J\&'&767632376?6'&/7;27654'&+&/&/&#32?#";6?'&'@ÂW 9   900" #; F    €^ 5Y  e$R   6! °  )ÿà@ (:;5&'&'767675676735&'&'!67167&'#; 0  p¥)þð`0 õ)°`p0 P  0þÐÀ)þ@ 0)ÿÁ¿À.@j1+"'&=&'&56767271654'&#"374'1&#"32765671676/'&'&76?'&'&7p ` ()==)(È     þË ²²  ††  ²²  †† @" "6%$$%60     ‚ YY CC YY CC ÿÀ€À 6'&7P ý° · þ0 ÐÿÁ¿€6'&'&/&?6?76/&?6767?6/76/&/76?6'&76/&54'&'&&'54'&'&?ž ! 9P  <<  P9 !   ((   ! 9P  =<  P9 !  0  0 Ÿ U"99 8  8 99"U T (( T U"99 8  8 99"U T0    0TÿÀ`À/AJS\e1+&'&76767656767!&'1&'67675671654'&'%&'673&'6767&'7&'67¼"  î   )D))))  þ@0PÀ&442vFE  55LR66þ€66RR6666RR66€0ÿÀ€ÀpvƒŒ 6716732354?67632&##+#"/+"'&=&'#"/&54?&'#"'&=476;67'&54?6=3#;'676'&'67&'&'1&'676323`j0j  8 +=#P          ªj q'Z----`%#"%€ x"%"  " - .            ```À'((''(('À@%.#%ÿÀÀÀ #8DP3&'7&#37671674'#3/7332765&'&'#"1;5%&'1&'#6765ðg C&) R[66%$þ$%6d ”>:!/D"R  23K\  "@ 09 p2D $Dô$%66%$8¼h`O"  K32±  §#$) _ €€,9!36?6736767&'&'676'&'%&'&767@þx'  &yþ   €$$$$€ÿ"@@"°$$$$@  ÿÀÀ";Tm6#"#"/&54?6=67327%2#"/&54?63%#"/&54?63272#"/&54?63Ð Vþñ  * p# 3344þ¨3344xº `þÐ *  cöþæ4334Ú4334FÿÀÀ%Kp1;2#!"3!6767&'&'#"1;6767&'&'!"3!2+"36767&'&'#";2+"3   þÀ @))  @  ))þ€ €   à ))€ €       )) þ  ))   €))    ÿÀÀ-:6312#'#"/&54?676?&547?6/&‰ @ 1  ¢X¡1  þÚB b B b · @  1¡X¢ 1 þ®B b B b ÿÀÀ9­ºÇ7136763236723236767&'&'0#0#65&'&'&'&#4'1&#"&'&#"01"#"321230"3276701327654503327654'&'012327654'&#"1"#0365654'&#"0145676'&'!676'&')--))"&!0           ð     à)  ))" 0  `          €ÿÀ?À#GR]hs13676'&#&'&'47676'&'"#67167&'&'65&'&'"&'&#!&?6'3&?6'3&?6'3&?6'á1###6$ &   q"" )#)þå  `  `  `  À/  ## &  þ€" " )$)$ 0 0 0 0 0 0 0 0ÿÀÀ(=Rg7&'1&'6767&567672672121!632&'&'54?3632&'&'54?7632&'&'547`) 0!&"))þÀ# # # #}## €)  0 "))4A    AA    AAAA    ÿÁÀ(3>IT7&'1&'6767&567672672121!'&?63'&?6'&?6''&?6`) 0!&"))þÀ0 0 y0 0 ô0 0 „0 0 €)  0 "))" p p p pp p  p pÿÁ€À,;FQ\g‹&#'&/&'&?'&76?676762&'6767'&?63'&?63'&?63'&?671!&'&'676756767263& #) 8U22UGGV E  `  `  `  K"þð)#) "¿?!) 1"'UGGU22  þì0 0 0 0 0 0 0 0 t")%) " ÿÀ€À9Vu”³676327632;'&/&'!'&+&'&'4?&'&'3+"'&=#+"'&=;'&#""?765'76'&#/7""?765'76'&#/&#&#""?765'76'&#/@.. L Û ?'  þ ( * L€`       ` »  k  u    ,,  H 2   W^ ^ þÀ@@ @@ @@   ÿÀÀÀ_hqzƒ217632?6/&'?/&76?/&76?'&#"'&= 4763&'67367&'&'67367&'  E;7#&&$  -BA!LO"-BA>C?F85LO"-BA>C?F85LO""IE;@@  P   À  $  ! > ! ! > ! ! " "P @F!?!?!9  `0ÿÀ½5G7671676"'5&'&'&'4'1&'&#"3276765'21#"'&5476301LM1101LM11   `  ðO98 ? 98PP88@  98P0     ÿÀÀ"C332#!"'&5476;676756733533533533!&'&?212=ø=+*  þ€  *+=¸@(@0@(@0þ@0À *+=   =+* þà€€€€€€„  „ÿÀÀ :LU74'&276?6'&#765&'"21#"'&'&54767634'1&#"3276567&'îà ±/9:V7./f K þÒ####   ¿K f/.7V:9/± à ¿""""`  `ÿÀ@À -S`4'1&#"35!4'1&#"327652716=#3"76?32765327654'&+&'&7675;27654'&+'&'3276=3276=4/  @@   þ  @ `      €ÐI C)   &     þ@ Àþ     Ú›    € P  þûH  )7Ê `+5 ; 4ÿÁÀÀ@W&+&?632336767&'&'65&'&'#65&'&'&3?6'&'#76'í %   !  % $-   F4   F4 À !!€ :%! %ä i € i ÿà€ .T}11#"'&=676767#"'&=&'&'&'1#"'&=6767#"'&=&'&'#"'&=676767#"'&=&'&'@H9:""  +*IHYYHI*+  "":9H  $%66%$     32??23  --DD--`"":9H` `YHI*++*IHY` `H9:""À` `6%$$%6` `@` `?2332?` `D----Dÿà€  ,Kj¤671673!5%"?76/76'&/&#&#"?76/76'&/"?76/76'&/&#;67547632&'&'5#+"'&=#+"'&=3--DàD--ýà   Š  –  À` @   "" @ À @ €D----D@@@     P0 0""0 @ @@ @`ÿÀ€À!,7BM136736767&'&'"&'&#&'!!67&'#367&'#!!67&/&'#367 ()={#22#0  0%2#&5=)(Hþ°P@ppÀþ°Pˆhh0=)( 00 ()=à`HÿÀÀ+Gk21#"'&5476327167654'&'&#"3%67167&'&'476757101016767&'&'01015&'&'67167&'5&'     þÀ   ""00 ()==)( 0  €   €   P  ¥""¥p 0¥%3=)(()=3%¥0 þ` ! ÓÓ ! ÿÀÀ+Gk4'1&#"32765#47167632#"'&'&5'167674'&'5&'&'671670101&'&'6767010151&'&'67567À   €   ° ""  p 00 ()==)(   `      ¥""¥ 00  0¥%3=)(()=3%¥ÿ  ! 33 !ÿÁÀ4K7137632;6767&'&'0#0#65&'&'&'&#&3?6'&'#76')/“ @))"&!0 J   F4   F4 à)u :))" 0  € i € i ÿÀÀÀ$2!6?65&'!"!!'&'3654'!32?67#a&þ— `þ®(T/ âu ´þ½¢ N “  &  `6*?ŠE #v!$$ NÿÀÀ#7L&'1&'676726763"'#"/#763232?'&+"?673#!&'&'4? $$  0  ;*<+*+– þh –0 0 0 Ð BC`©©ÿà@  667167!!&'&?6'671673!53!&'&'5`   þ€9o/@€þg À  þ  p  þÐ0/o/@€Ñ €€ `  `?€4iž66716'&'&'&'&''&'&7676761676716'&'&'&'&''&'&767676167656716'&'&'&'&''&'&7676761676#**#  &-21  12,&  #*+#%#**#  &-21  12,&  #*+##**#  &-21  12,&  #*+#z       þà               ÿÀŸ° -?Q676'&'671632?6#5&/&'&7#"/&'&?7#"'&54?'˜#$$##$$#p $)33)$  %À$ Z<  0 2=2 0  h))))9     $$  ¹5&  0  H55H  0  %ÿÀ¶ .;H!6767676716732+#"'&'&'&5;5&'&767676'&'ÿ, u€    ))-,*) à þÐ  ð8.. ©   @&$##$&@ÿ0  ÿÀ@ÀLYhyˆ"7627677676'&'&763676'&'&'65&'&#&'&'&76'676'&'6'&'&#&67"6326767&#6767&"­."4*89&!786587!&98+5".  11  C:   " j,%  &+‹   " À/G(!4&:=00  00=:&4!(G/ $&&&&$ þð  ’( +$$ b    ö( $$+ ÿÀÀ7^1332765&'&'&'"1332765&'&'"&'1&'6767&'&'#3&'&'5À ?23  &'AAP 6%$  66R `  ()==)(()=     32? PAA'& ` $%6 R66   à=)(()==)(`   àÿÀÀÀ#0=2135476323!56767354763!!&'&'3675&'#€ €  0 þ@ 0 €À þ  P``À     00   Àþð  @``ÿÀÀÀ#0=2135476323!56767354763!!&'&'!675&'!€ €  0 þ@ 0 €À þ  P þàÀ     00   Àþð  @@@ÿÁÀ&.5<AFK637%676=&'&'"?'67'7&''67'7'7'7] þ«T#*+@+%3  Y. .=> V<=l==g==< ÕÔ"#)@+*Q =>5/ .;R&&C&&A%%ÿÀÀ+J10136767654'&'&'1765&'&'&#"/1?'&7676765&'&'[      f?'< 7| ‡4 =d#%&7º      ‚.= 7þö ?4 <. '7&% ÿÀÀ3>IR[dmvˆ"1;#"!676754/&'&+53276=4'&+3#&'6767!!&'7&'677&'67&'677&'67&'677&'67&'67@ P9€ÙP à    `þ 0xH¨H¨HÀ @ –FF– @ 0þ€¨hhhhhÿÀÀ3Mg%#&'56767632#"/'&'5673!/#"/&54?'&7673'&'&?'&54?63276#È (I$I(  (I$I( ÿ (I$I(  (I$I( à (I$I( @ (I%I(  (I$I( @ (I$I( ÿà@  J37#5#;'#;674/&'##";32765!327657327654'&+7!2^[Þc| }c^ZþS    @    þ T€€€€€€T€        ÿà€  /Nk…37#5#;676761'#76312&501'&'#6767!#";327653&'476?&#"67674'&'&'&&'#"'&'476772^[Þc| :cÒZ  ½þÎ    Ò0 3,-ED-- &  M# $  T€€€€H€ T@ K    6LO.13*D----D-$þó%*€H7;5673567356735673276=4'&+54'&+54'&+"#"#" @@@@@   À   àÀ pppppppp À     ÿÀ€À/8\fox6'&'&'&#3&=476767&'#76'&7#&'672#35335&'&'#65&'&''&'135#367675##763É     ™  $ £1 \ À À ##0 Àà À`1      þÀ à0 š&   P``P  ((þø €P0 P€8& ÿÁ¿FKP67676'&'&76?''&/'/&'&76767&'&?7'37'œ}}O %)  GG  ).$%  $%.)  GG  )% O,Z KñLY¯..™+,+V  V.AA.V  V+,+™75 :: 5ÿà "367676'&#!'!!  2ý2 þ@8vþ°  þ©W À€€ÿÀÀXz”Ÿ2?6;36?63236/&?67673#"32;65&'&'&#"/&#"/&+";6767%67167632#"'&'&'7&?6' !  *           87U¬    6++þJ!"<=CC=<"!!"<=CC=<"!»             "V::þÌ  ! -dF::$""$::FF::$""$::F› `À '7"13!27654'&#!5"13!27654'&#!  € þ€ € þ€    €   ÿàÀ '4'1&#"3276534'1&#"32765@   €   € þ€ € þ€ €ÿÁÀ/<&&#"767676767654'?6?6/&'&767Ñ0M#$$ '"*+33# M)0(þÿ  ¹0)M #33,)"' $$#M0(ùÿà–(676/76/6#"/&'56767w$!2Lp>L 7--°þ¾B`¢@@@À °° À B`ž~;""~y . €F:€€€ P €€ P €:FÿÀÀÀ/%!'&56767376;47163!2#!"'&=`þà;'(;2&& OþÀ   þà @Í;('1~V@    ÿÀÀ5A\67&'&/&'&5&'"13676736767&'&'#!3#5'&'67&'&/&'&5X    8 )À)0  00þÀ`       À      À À)) 00 @  `è      ÿÀþ‘#4A#"'&76767627#"'&'&?37#&'7676#'&'&767Ø& ( H(H .55. Hà&H ( à  / 5,, }• }  } P/} ,,5 0ÿÀÀ3BUdv21#"'&'&547676367167654'&'&'67'&'&;327676/#"'73276'&'&271654'&#"34,,,,44,,,,4F::$""$::FF::$""$::F8$ '  H$  $  TH  ' $8  €--33----33--þ@!"<=CC=<"!!"<=CC=<"! ? #5 1>  >1 5# >!   ÿÀ€À 9DQ‰676'&'#"'&='&'&?676;2'#"'&=#&'67676'&'5#"'&?"'&'&?67632#+#"'&=##"'&5P(          È   ""         þЀ › dd › €`þ0Ð0  þP` _  _ ` `` ÿÁÀ;@E&&#"&#"327654'77654'7?6/7654/&#"''7/7é`Z%,0( l  l Y`Y7 0 7YŸH>H>¦H>H>¹`Y l  l (0,%Y`Y7 0 7Yþ¡H>H>¦H>H>ÿÀÀB\47163#"'&5&'&'&'"'&57&547632#"'#&'&'4767671#"'&5&'&'"'&54763À PAA'&  32? ƒh  h #)X;; £R66  $%6   &'AAP ?23 ½h  h ;;X)# }66R 6%$  ÿÀ€À +6#"!6767&'&'&'5673&'5673&'567@³M PPÀMþÍ€X000000ÿÀ€À(27AFP32!&'&'6767"135#;5+%4'1&+35'35#2716=#3'35#1;5#@³Mÿ  @ P`PP`P  @ @@€ @ €@@`  @ÀMþÍ€À  @ @@€ @ @@ÿ  @@@@  @ ÿÀÀÀ 0>Qd676'&'4716;#"'&='&76?#"'&57#"'&547+&'6736756'&/&76?6`à Ÿ" J<  NK /W R CYYþó; <     P F<I CM áV S `  < ;  ÿÁÿÀ )V676'&'67'&7?6'%&?766?6/&//'&?'&76}þ† Æ.Km(  2 ,,þ t  7T 4  :™      Ý fEK4' JC  Ç Ë ! 3   I   ÿÀ@À #^n676'&'23#7'&'#6?63092#3210;210;67675&'#7674'&+&/&/&##76'&/7;P  mWX) ; 6j8+‡ž·E  900" 3, 9 `@^ 5RX ~'þø³  6! Y°L$R ÿà€ :V"13353356767527654'&+""'&/&'&'&+4'1&#"!"3!67675  )@À@)   911#") `  þ è%    ) )`  )1#þ    %ÿà /L›ë%67167167&'&'&'#09367673676&'5#"/&'5670901011'&'"9&#"'&7630927652516'&'#0#&'&'676'&#"00901011'&'09"'&7621390127652516'&'#10#&'&'676'&#"0H9:"""":9HH9:""/ ,&#085 ##  ­       þð     //::////:E4% // `00` &      ÿÀÀFR_61/;#"'%&/&76&5&76?56?'&/&767&?6/&'&767Ò *~  HG! Wþ  J". GŸ5 T%  ½ 2b 8 K!‡ 5'2 þ¥= K ," ^ÿÀÿÀENW`irƒ756776+"'&'676'&/&76567676'&56767'67&'&'6767&'&'6767&'32?6=&'U 0 8I0.–.0I8 1  )) u00  3 (    -GE--EG-    ( ))-€P0ÿÀ€ÀG[dmv#'53'&'##"!67674'3327654/=76'&'&#54'4'1!&'&'6767!&'6767&''&'6767&'+Ep@k’W){    00  +6 79 9@M  ÿ  àØ8h€ @`³Ì% p k"0  037 6SUG  G5m    0ÿà€ 347163!2#!"'&54716;2+#"'&=#"'&5 @ þÀ    €  € €  €  à à ÿÀÀÀ(GKV33!276/6767&'&'5367&'!#"'&'&79&76763209513#&'67$  $þph/PP//PP/8Ø  À•#F+< <+F#•ÿ  €@ÿÀÀ"0V_&;32?654/&'&'54/2?&7'%4'&'&+&'54?6'&'&#6676767&'O( P 6m p @ pm h;v >”ì@9@=)(U%þ8» (h mp @ p m6 Pþyv !>•ü ?9@()=U#",þàÿÀÿÀ#HUbo21#"'&54763471632#"'&56716735'&?63!&'&'533675&'#3675&'#73675&'#   €   €ˆËèèÕˆþÀ@@@p@@@@À   8  èB*00,L  @@@@@@ÿÀ€À/763#&'&'56?63676754/&'47š U$11JR665 &%¢ Q#/.3J1166RL6Y&&5+"ÿÀ@À A6"1'&76767670176767767670176767137/·/U--/.Y# V--/0Xþ‡_11''N+ L#%23b+¿ 0**1/11/ ,0//1--þ6 14410%%  ""01663 ,ÿÀÀÀ -J67167!32#2+!&'&'13!5!"#336753675&'#5&'#)    þà)@ ÿ 00 00 `) þÀ @  )@þÀ @ 00 00 0ÿà !&11!676756767&'&'&#<<11   11<<# ##?°  °?##ÿà  %!6?63!&'&'5!þø X;;þ€Ð ¥ ;;X0€€ÿÀ@À,I%1#!&'&'5#&'&547%625476;2%#336753675&'#5&'#@ þ¿   k   5 þÐ00 00 À     à ^% y. ?0 00 0ÿÀ€À0=M1#!6767&'&'#&'&'21#"'&54763676'&'671673#&'À  &%    @  0"@"ÀÀþÀ@@   À$$$$°""ÿà /L%67167167&'&'&'#093676736733##&'5#&'56735H9:"""":9HH9:""/ ,&#08  00 00//::////:E4%  0 00 0ÿÀÀ5?1327654/&#"32?6?6?01017''7'76?)     `"c c l#J-4C4-KC  M ·     #l b c#K-4C4-JDC M  ÿà =OXj/&?6;2367675476?674'&/&'&/&'&#21#"'&5476367&'21#"'&54763ì < > *!%# "L  €  ƒ      'ƒ   P   ÿЀ°+&'1&'1&'4767676'&674767À6++*+@@+*++6% #0//6:>?+,,+?>:6//j #21,&-,ÿÀ@À3O4'1&#"35#535#51;276=4'&+"/&+"1;276=4'&+"/&+"@  ÀÀÀÀà à c  C à c  C   `ÿ@à@@  €   þà €   ÿàð #,5IZ7"'1&547676767#!7&'6767&''&'6767167!!&'&'67!!&'&'5=  0/XX/0  þzSðpÿ €  þ€  þÀà   %%""""%%   `0Ð    ` ÿÀ°À8"1&#&'5"36767=&'&'"&'&#"54'&#è  -,:v6%$    À ¤  I8&;'$%$6@    ´ ÿà@ #5"1"/!5&'&'#&'=4'&+676765&'!  08""!"80  @ïDDƒƒDDýâ  d T55C@BC44T d þ ÿÀ@À&CPd13#3#3&54767=&'&'#33##&'5#&'5673567&'&7671;2765&'&'#0  Ú  àhh'((''(('à Ú 'f'À Ð@P $`à @Ð----Í ''ÿÀÀivƒ1#"'&547632&0#91#76?036767676?676?6767676?6767367676'#"/&54?632'éþ  ` .               ü ήÎþà© þ  `F               þ~ ήÎþà ÿÀ À!)65&'&'#;6767&'&'#6?!o()==)(  6µ5  þñiiÿ =)(()=    €Ò  Òÿà€  =67167!#!#67!!&'&'%6733##&'5#&'56735@€@þ€@@Z!þ!  00 00`ÿÿþÍ!!ó0 00 0€*5@67167!!&'&'3!276=4'&#!"367&'#3367&'#€þ€@ @ þÀ 88ˆ00@ÿ @ @  ÿÀÀ&@6'"/&'#&'5&'#&'&76326/&7733#"'&5476?67¬  *   I%+# þÿ]( L=Z[k; 2:½  ,A   P  þ©ºP 0R./   5ÿÁÿ¿2DVh&12121007676'&'&'&'45&'&'&'"#017%'21#"'&54763471632#"'&5471632#"'&5ª  YHI*+, ./JK\æ&'AAPe |à  @     ¿ ,+*IHY  \KJ/.þgPAA'&þ„ eÊ   €  0  ÿÀÀ /u#'&7673301!&'&'676767096767&'#&'&'&96756767&'&'15&'&7&763276'&'5@€/ Ä /€€*) )þÀ) )*T        `G  G "#78R))R87#"X     ÿÀÀÀ ,0U\`dhlp1!#"'&547635"'&5476;!!!27654'&#'#7';32?3276/76'&+'&#"#"373#'5'3?#3'#7'3`))þà     ÿ Õ 7 8  7 8 88*E7À)þÀ)  @ @ þ€@  °0 00 00 00 000000H0€5#53%1!67675&'&'!!5!%1!67675&'&'!À€€þp     þ`ÿþp     þ` ` @  @ þà @ @  @ ÿÀÀÀ'>332#!"'&5476;767!+"'&'"?67576/&#¤x ` þ€ ` „€ ö À P''P À   €þ­ S@P'††'PÿÀÀÀ'>332#!"'&5476;767!!&'&'"?67576/&#¤x ` þ€ ` „€ÿÀ P''P À   €þÀ@@P'††'PÿÀÀ¾'A^56?61&'&'5451167675#6?6#!"'&56767#336753675&'#5&'#`` `$%66$%0""   G G 2 þ~ 2`@: $$ :(6%$$%6(0""˜ L L ))7 7))ÿà€ 74716;235476;2++"'&5#+"'&5476;5€   ` € `   ` € `€ þ      `    ÿÀ€À 3@Zg676'&''&#"3276=4/7;27654'&+676'&'34'1&'&#"32767653676'&'34'1&'&#"3276765  > S<  +<) @ 5þ#$$##$$#È""""¸#$$##$$#È""""`@1 @&o € 1!  à))))####))))####ÿàÀ  )#53#53'#533#51!6767&'&'!€€€€€À€€€€€@þÀ`€€À€€@€€@€€þÀ@ÿàÀ #5GYk}¡³Å×éû 1CUgy"'1&547632#721#"'&5476321#"'&54763"'1&547632#21#"'&54763"'1&547632#21#"'&54763"'1&547632#21#"'&54763"'1&547632#21#"'&5476321#"'&54763"'1&547632#21#"'&54763"'1&547632#21#"'&54763"'1&547632#%21#"'&54763%"'1&547632#%21#"'&54763"'1&547632#   `      À      `      À    þ€  €  þ€  À  À  þ€  €  þ€  À     @   €   ÿ   €   @   €   ÿ   À   ÿ   €   €   @   €   @     @   @   €   @   @   ÿàÀ -?Qcu‡™713276567!27654'&#!34'1&#"3276534'1&#"32765#4'1&#"3276534'1&#"32765'271654'&#"3"1327654'�'&#"3  P þ°"    À   `   À          P  "þ°              €   ÿÀ?° 0K676'&'6767763!"'&?6737%&7#"'&=''&'&?ÐÆ 2' #O"  `  ÿ   þ°Sp  =% 0 €  —&+%g".   Œ \0` Ko  !ÿÀÀ8J"'#"767323676'&'3276545&'&754'&#21#"'&54763B""  r  56C  A""  r  56C    À56C  A""  r  56C  B""  r  à   ÿÀÀ$ANe|&'&'67675&'&'676756?676;23#&'&'567673&'&767%32'&?#"'&?6%/&76767676ô `  þW >   À  u'8 € '8 € þ­ a `¹    9v   `  þ× p  p h  ‚Z p Z p ; d dÿÀÀ!6716&/&76?66767'&?[ X<\ivƒ!!&'&'56767&#"'&#";276/4'1&#"327653;276=3!&'&'67673675&'#3675&'#3675&'#3675&'#@þÀÜ 8 @ P0`Œ   þð` €  þ€PÀààk T P     ÿ   @@hhÿÀ€À#-D&76'%7376?6'&'#1#"'0510173'#";27654'&+7'' P þí,g    ”« q¨ u!^$3   *6» þ0 מ  , Y„(sJþé   >+i'ÿà "B^b#"/&76764763276764716;32+&'&?#"'&5'&/#'&'&?673'¸  X    Xˆ € J3 € J3 ` @ X @ ( `  $. þÒ$  `– I  I À€    €(('ÿà "B^b&#"76?327657676/1;327654'&+76'&'#"76?37676/&'7#¸  X    Xˆ 3J € 3J € ` @ X @ (– `  $þÒ .$  ` I  I À€    €((ÿà@ "5H[n#"/&767647632767632+"'&5476332+"'&5476332+"'&5476332+"'&54763˜  X    X¨    ` `     à à  `  $. þÒ$  `¶   €   €   €   ÿà@ "6J^r&#"76?327657676/7"1;27654'&+"1;27654'&+"1;27654'&+"1;27654'&+˜  X    X¨     ` `     à à– `  $þÒ .$  `   €   €   €   'ÿà "GYr2?6'&'&4'&#"'&'&3%&?#";27654'&+54/61'&'&76776?65&'&'  X    X #0   00  !    1%% `  $. þÒ$  ` º  4   ` Ë  q  B$%% 'ÿà "GYs2'&/#"'&5'&'&?6332+"'&5476;5'&'&76?6'6716'&'&7&'1&56767'&'&?  X    X #  00   0   )%%1   `  $þÒ .$  ` þú `   4  ‘  7 %%$B  ÿÀ@À8@Ic76?37676/&'#77;6767&'65&'&'#"#53;#56514'&#"'&#"32?pC  Z B &} P" "@ `  0÷ ©I ` ÀÀ      --€`` "$" @ @ — ªJ ` À@€` +87&'&767367&'&'!6767&'&'#7&'&767----x()==)(()=`=)(()==)(pè----€'((''(('#-=)(()==)(()==)(()=-# '((''((' %G671016763#"'&'67676720116767676&'&'&'&76@    *+55+*    Ñ$44EE45#& +%>>\\>>$, &€ ((34% %43(( Ï :+'',9 € 06;26765&'&'&/&'&+"1!%&+"™ <2$ Á&™àþé)3 .&&89#Ã& £4 'øÃ) ÿÀ€À35#367675+%5&'&'#3°D----D@D--ÀÀ€--D°À--D €D----D€ D--ÀÿÀ¿)4?J6'&!6767&'&'#%&'&767673#&'673#&'673#&'ïþS €å----þà``€€``‘~ !lQÁ'((''(('@@ÿÀÀ3M_767167632#"'&'&'%21#"'&'&547676327167654'&'&#"35271654'&#"3!"<=CC=<"!!"<=CC=<"!  ####  ÀF::$""$::FF::$""$::F`   à""""`   ÿÀ€À9DOZ&'#3676754?6=4'&'#4'&#"#4'&#"#53#&'673#&'673#&'67p  à    0      ¨H œ\  \œ   Hˆ@@ÿÀ€ $8N[67167!32+!&'&'#&'&'535#&'67354'&+"'"1;276=4'&+676'&'"PD--   þà))"@€  @ à € €`  P"--D   ))"àð`@ Àà @ @ þ°ÂÜyÜ2G1 , ˜¯ 4y 2­  õ >ç 2­ dƒ ,W Xÿ .% &S  õSolidThe web's most popular icon set and toolkit.FontAwesome6Free-SolidVersion 772.01953125 (Font Awesome version: 6.4.2)Font Awesome 6 Free Solid-6.4.2https://fontawesome.comFont Awesome 6 FreeCopyright (c) Font AwesomeFont Awesome 6 Free SolidSolidThe web's most popular icon set and toolkit.FontAwesome6Free-SolidVersion 772.01953125 (Font Awesome version: 6.4.2)Font Awesome 6 Free Solid-6.4.2https://fontawesome.comFont Awesome 6 FreeCopyright (c) Font AwesomeFont Awesome 6 Free SolidÿÛo      "# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij exclamationhashtag dollar-sign0123456789 less-thanequals greater-thanabcdefghijklmnopqrstuvwxyzfaucet faucet-driphouse-chimney-window house-signaltemperature-arrow-downtemperature-arrow-uptrailerbacteria bacterium box-tissuehand-holding-medical hand-sparkles hands-bubbleshandshake-simple-slashhandshake-slashhead-side-coughhead-side-cough-slashhead-side-maskhead-side-virushouse-chimney-user house-laptop lungs-virus people-arrows plane-slash pump-medical pump-soap shield-virussinksoap stopwatch-20 shop-slash store-slashtoilet-paper-slash users-slashvirus virus-slashvirusesvest vest-patchesarrow-trend-downarrow-trend-uparrow-up-from-bracket austral-sign baht-sign bitcoin-signbolt-lightning book-bookmark camera-rotate cedi-sign chart-column chart-gantt clapperboardclover code-compare code-forkcode-pull-request colon-sign cruzeiro-signdisplay dong-signelevatorfilter-circle-xmark florin-sign folder-closed franc-sign guarani-signgunhands-clapping house-userindian-rupee-signkip-sign lari-sign litecoin-sign manat-sign mask-face mill-sign money-bills naira-signnotdefpanorama peseta-sign peso-signplane-up rupiah-signstairstimeline truck-frontturkish-lira-signvaultwand-magic-sparkles wheat-awnwheelchair-movebangladeshi-taka-sign bowl-riceperson-pregnant house-chimney house-crack house-medical cent-sign plus-minussailboatsectionshrimpbrazilian-real-sign chart-simple diagram-nextdiagram-predecessordiagram-successor earth-oceania bug-slashfile-circle-plus shop-lock virus-covidvirus-covid-slashanchor-circle-checkanchor-circle-exclamationanchor-circle-xmark anchor-lockarrow-down-up-across-linearrow-down-up-lockarrow-right-to-cityarrow-up-from-ground-waterarrow-up-from-water-pumparrow-up-right-dotsarrows-down-to-linearrows-down-to-peoplearrows-left-right-to-line arrows-spinarrows-split-up-and-leftarrows-to-circle arrows-to-dot arrows-to-eyearrows-turn-rightarrows-turn-to-dotsarrows-up-to-line bore-holebottle-droplet bottle-water bowl-food boxes-packingbridgebridge-circle-checkbridge-circle-exclamationbridge-circle-xmark bridge-lock bridge-waterbucketbugsbuilding-circle-arrow-rightbuilding-circle-checkbuilding-circle-exclamationbuilding-circle-xmark building-flag building-lock building-ngobuilding-shield building-un building-userbuilding-wheatburstcar-on car-tunnelchild-combatantchildren circle-nodesclipboard-questioncloud-showers-watercomputer cubes-stackedenvelope-circle-check explosionferryfile-circle-exclamationfile-circle-minusfile-circle-question file-shield fire-burner fish-fins flask-vial glass-waterglass-water-dropletgroup-arrows-rotatehand-holding-hand handcuffs hands-boundhands-holding-childhands-holding-circleheart-circle-boltheart-circle-checkheart-circle-exclamationheart-circle-minusheart-circle-plusheart-circle-xmarkhelicopter-symbol helmet-unhill-avalanchehill-rockslidehouse-circle-checkhouse-circle-exclamationhouse-circle-xmark house-fire house-flaghouse-flood-water$house-flood-water-circle-arrow-right house-lockhouse-medical-circle-check house-medical-circle-exclamationhouse-medical-circle-xmarkhouse-medical-flag house-tsunamijar jar-wheatjet-fighter-up jug-detergent kitchen-set land-mine-on landmark-flag laptop-file lines-leaninglocation-pin-locklocustmagnifying-glass-arrow-rightmagnifying-glass-chartmars-and-venus-burstmask-ventilatormattress-pillow mobile-retromoney-bill-transfermoney-bill-trend-upmoney-bill-wheatmosquito mosquito-netmound mountain-city mountain-sunoil-well people-group people-linepeople-pullingpeople-robbery people-roofperson-arrow-down-to-lineperson-arrow-up-from-lineperson-breastfeeding person-burst person-caneperson-chalkboardperson-circle-checkperson-circle-exclamationperson-circle-minusperson-circle-plusperson-circle-questionperson-circle-xmarkperson-dress-burstperson-drowningperson-fallingperson-falling-burstperson-half-dressperson-harassingperson-military-pointingperson-military-rifleperson-military-to-person person-rays person-rifleperson-shelterperson-walking-arrow-loop-leftperson-walking-arrow-right&person-walking-dashed-line-arrow-rightperson-walking-luggageplane-circle-checkplane-circle-exclamationplane-circle-xmark plane-lock plate-wheatplug-circle-boltplug-circle-checkplug-circle-exclamationplug-circle-minusplug-circle-plusplug-circle-xmark ranking-star road-barrier road-bridgeroad-circle-checkroad-circle-exclamationroad-circle-xmark road-lock road-spikesrug sack-xmarkschool-circle-checkschool-circle-exclamationschool-circle-xmark school-flag school-lock sheet-plastic shield-cat shield-dog shield-heart square-nfisquare-person-confined square-virus staff-snakesun-plant-wilttarp tarp-droplettenttent-arrow-down-to-linetent-arrow-left-righttent-arrow-turn-lefttent-arrows-downtentstoilet-portabletoilets-portable tower-celltower-observation tree-citytrowel trowel-brickstruck-arrow-right truck-droplet truck-fieldtruck-field-un truck-planeusers-between-lines users-line users-raysusers-rectangleusers-viewfindervial-circle-check vial-viruswheat-awn-circle-exclamationworm xmarks-lines child-dresschild-reachingfile-circle-checkfile-circle-xmarkperson-through-window plant-wiltstapler train-trammartini-glass-emptymusicmagnifying-glassheartstaruserfilmtable-cells-large table-cells table-listcheckxmarkmagnifying-glass-plusmagnifying-glass-minus power-offsignalgearhouseclockroaddownloadinboxarrow-rotate-right arrows-rotaterectangle-listlockflag headphones volume-off volume-low volume-highqrcodebarcodetagtagsbookbookmarkprintcamerafontbolditalic text-height text-width align-left align-center align-right align-justifylistoutdentindentvideoimage location-pincircle-half-strokedroplet pen-to-squarearrows-up-down-left-right backward-step backward-fastbackwardplaypausestopforward forward-fast forward-stepeject chevron-left chevron-right circle-plus circle-minus circle-xmark circle-checkcircle-question circle-info crosshairsban arrow-left arrow-rightarrow-up arrow-downshareexpandcompressminuscircle-exclamationgiftleaffireeye eye-slashtriangle-exclamationplane calendar-daysshufflecommentmagnet chevron-up chevron-downretweet cart-shoppingfolder folder-openarrows-up-downarrows-left-right chart-bar camera-retrokeygearscomments star-halfarrow-right-from-bracket thumbtackarrow-up-right-from-squarearrow-right-to-brackettrophyuploadlemonphone square-phoneunlock credit-cardrss hard-drivebullhorn certificatehand-point-righthand-point-left hand-point-uphand-point-downcircle-arrow-leftcircle-arrow-rightcircle-arrow-upcircle-arrow-downglobewrench list-checkfilter briefcaseup-down-left-rightuserslinkcloudflaskscissorscopy paperclip floppy-disksquarebarslist-ullist-ol strikethrough underlinetable wand-magictruck money-bill caret-downcaret-up caret-left caret-right table-columnssort sort-downsort-upenvelopearrow-rotate-leftgavelboltsitemapumbrellapaste lightbulbarrow-right-arrow-leftcloud-arrow-downcloud-arrow-up user-doctor stethoscopesuitcasebell mug-saucerhospital truck-medicalsuitcase-medical jet-fighterbeer-mug-emptysquare-h square-plus angles-left angles-right angles-up angles-down angle-left angle-rightangle-up angle-downlaptop tablet-button mobile-button quote-left quote-rightspinnercircle face-smile face-frownface-mehgamepadkeyboardflag-checkeredterminalcode reply-alllocation-arrowcrop code-branch link-slashinfo superscript subscripteraser puzzle-piece microphonemicrophone-slashshieldcalendarfire-extinguisherrocketcircle-chevron-leftcircle-chevron-rightcircle-chevron-upcircle-chevron-downanchorunlock-keyholebullseyeellipsisellipsis-vertical square-rss circle-playticket square-minus arrow-turn-uparrow-turn-down square-check square-pensquare-arrow-up-rightshare-from-squarecompasssquare-caret-downsquare-caret-upsquare-caret-right euro-sign sterling-sign rupee-signyen-sign ruble-signwon-signfile file-linesarrow-down-a-z arrow-up-a-zarrow-down-wide-shortarrow-up-wide-shortarrow-down-1-9 arrow-up-1-9 thumbs-up thumbs-downarrow-down-long arrow-up-longarrow-left-longarrow-right-long person-dresspersonsunmoon box-archivebugsquare-caret-left circle-dot wheelchair lira-sign shuttle-spacesquare-envelopebuilding-columnsgraduation-caplanguagefaxbuildingchildpawcubecubesrecyclecartaxitreedatabasefile-pdf file-word file-excelfile-powerpoint file-image file-zipper file-audio file-video file-code life-ring circle-notch paper-planeclock-rotate-leftheading paragraphsliders share-nodessquare-share-nodesbombfutboltty binocularsplug newspaperwifi calculator bell-slashtrash copyright eye-dropper paintbrush cake-candles chart-area chart-pie chart-line toggle-off toggle-onbicyclebusclosed-captioning shekel-sign cart-pluscart-arrow-downdiamondship user-secret motorcycle street-view heart-pulsevenusmarsmercurymars-and-venus transgender venus-double mars-double venus-mars mars-strokemars-stroke-upmars-stroke-rightneuter genderlessserver user-plus user-xmarkbedtrain train-subway battery-fullbattery-three-quarters battery-halfbattery-quarter battery-empty arrow-pointeri-cursor object-groupobject-ungroup note-stickyclonescale-balancedhourglass-starthourglass-half hourglass-end hourglasshand-back-fisthand hand-scissors hand-lizard hand-spock hand-pointer hand-peace trademark registeredtv calendar-pluscalendar-minuscalendar-xmarkcalendar-checkindustrymap-pin signs-postmapmessage circle-pause circle-stop bag-shoppingbasket-shoppinguniversal-accessperson-walking-with-caneaudio-description phone-volumebraille ear-listenhands-asl-interpretingear-deafhandseye-low-vision font-awesome handshake envelope-open address-book address-card circle-userid-badgeid-cardtemperature-fulltemperature-three-quarterstemperature-halftemperature-quartertemperature-emptyshowerbathpodcastwindow-maximizewindow-minimizewindow-restore square-xmark microchip snowflakespoonutensils rotate-left trash-canrotate stopwatchright-from-bracketright-to-bracket rotate-rightpooimagespencilpenpen-clip down-long left-long right-longup-longfile-penmaximize clipboard left-rightup-down circle-down circle-left circle-right circle-upup-right-from-squaresquare-up-right right-leftrepeat code-commit code-mergedesktopgem turn-downturn-up lock-open location-dotmicrophone-linesmobile-screen-buttonmobile mobile-screen money-bill-1 phone-slashimage-portraitreply shield-halvedtablet-screen-buttontablet ticket-simple user-largerectangle-xmark down-left-and-up-right-to-center"up-right-and-down-left-from-centerbaseball-bat-ballbaseball basketball bowling-ballchess chess-bishop chess-board chess-king chess-knight chess-pawn chess-queen chess-rookdumbbellfootball golf-ball-tee hockey-puck broom-ball square-fulltable-tennis-paddle-ball volleyball hand-dotsbandagebox boxes-stackedbriefcase-medicalfire-flame-simplecapsulesclipboard-checkclipboard-listperson-dots-from-linednadolly cart-flatbed file-medical file-waveform kit-medicalcircle-h id-card-clip notes-medicalpalletpillsprescription-bottleprescription-bottle-medical bed-pulse truck-fastsmokingsyringetablets thermometervialvials warehouse weight-scalex-raybox-open comment-dots comment-slashcouchcircle-dollar-to-slotdove hand-holdinghand-holding-hearthand-holding-dollarhand-holding-droplet hands-holdinghandshake-anglehandshake-simple parachute-boxpeople-carry-box piggy-bankribbonrouteseedling sign-hangingface-smile-winktapetruck-ramp-box truck-moving video-slash wine-glassuser-large-slashuser-astronaut user-check user-clock user-gearuser-pen user-group user-graduate user-lock user-minus user-ninja user-shield user-slashuser-taguser-tie users-gearscale-unbalancedscale-unbalanced-flipblender book-opentower-broadcastbroom chalkboardchalkboard-userchurchcoins compact-disccrowcrowndice dice-five dice-fourdice-onedice-six dice-threedice-twodivide door-closed door-openfeatherfroggas-pumpglassesgreater-than-equal helicopterinfinity kiwi-birdless-than-equalmemorymicrophone-lines-slashmoney-bill-wavemoney-bill-1-wave money-checkmoney-check-dollar not-equalpalettesquare-parkingdiagram-projectreceiptrobotrulerruler-combinedruler-horizontalruler-verticalschool screwdriver shoe-printsskull ban-smokingstoreshopbars-staggered stroopwafeltoolboxshirtperson-walkingwallet face-angryarchway book-atlasaward delete-left bezier-curvebongbrush bus-simplecannabis check-doublemartini-glass-citrusbell-conciergecookie cookie-bite crop-simpletachograph-digital face-dizzycompass-draftingdrum drum-steelpanfeather-pointed file-contractfile-arrow-down file-export file-import file-invoicefile-invoice-dollarfile-prescriptionfile-signature file-arrow-upfill fill-drip fingerprintfish face-flushedface-frown-open martini-glass earth-africaearth-americas earth-asia face-grimace face-grinface-grin-wideface-grin-beamface-grin-beam-sweatface-grin-heartsface-grin-squintface-grin-squint-tearsface-grin-starsface-grin-tearsface-grin-tongueface-grin-tongue-squintface-grin-tongue-winkface-grin-winkgrip grip-verticalheadphones-simpleheadset highlighterhot-tub-personhoteljoint face-kissface-kiss-beamface-kiss-wink-heart face-laughface-laugh-beamface-laugh-squintface-laugh-winkcart-flatbed-suitcase map-locationmap-location-dotmarkermedalface-meh-blankface-rolling-eyesmonument mortar-pestle paint-rollerpassport pen-fancypen-nib pen-ruler plane-arrivalplane-departure prescription face-sad-cry face-sad-tear van-shuttle signatureface-smile-beam solar-panelspasplotch spray-canstampstar-half-strokesuitcase-rolling face-surprise swatchbookperson-swimming water-ladder droplet-slash face-tiredtoothumbrella-beach vector-squareweight-hangingwine-glass-emptyspray-can-sparkles apple-wholeatombonebook-open-readerbraincar-rear car-battery car-burstcar-sidecharging-stationdiamond-turn-right draw-polygon laptop-code layer-grouplocation-crosshairslungs microscopeoil-canpoopshapes star-of-lifegauge gauge-high gauge-simplegauge-simple-highteeth teeth-open masks-theater traffic-light truck-monster truck-pickup rectangle-adankh book-bible business-timecitycomment-dollarcomments-dollarcross dharmachakraenvelope-open-text folder-minus folder-plusfilter-circle-dollargopuramhamsabahaijedibook-journal-whillskaabakhandalandmarkenvelopes-bulkmenorahmosqueomspaghetti-monster-flyingpeaceplace-of-worshipsquare-poll-verticalsquare-poll-horizontalperson-praying hands-praying book-quranmagnifying-glass-dollarmagnifying-glass-locationsockssquare-root-variablestar-and-crescent star-of-david synagogue scroll-torah torii-gatevihara volume-xmarkyin-yang blender-phone book-skull campgroundcatchair cloud-moon cloud-suncowdice-d20dice-d6dogdragondrumstick-bitedungeonfile-csv hand-fistghosthammerhanukiah hat-wizard person-hikinghippohorsehouse-chimney-crack hryvnia-signmaskmountain network-wiredotterringperson-runningscrollskull-crossbonesslashspider toilet-papertractor user-injured vr-cardboard wand-sparkleswind wine-bottlecloud-meatballcloud-moon-rain cloud-raincloud-showers-heavycloud-sun-raindemocratflag-usa hurricane landmark-domemeteor person-booth poo-stormrainbow republicansmogtemperature-hightemperature-low cloud-bolttornadovolcano check-to-slotwaterbaby baby-carriage biohazardblog calendar-day calendar-week candy-canecarrot cash-registerminimizedumpster dumpster-fireethernetgiftschampagne-glasses whiskey-glass earth-europe grip-linesgrip-lines-verticalguitar heart-crack holly-berry horse-headiciclesigloomittenmug-hot radiationcircle-radiationrestroom satellitesatellite-dishsd-cardsim-cardperson-skating person-skiingperson-skiing-nordicsleigh comment-smsperson-snowboardingsnowmansnowplow tenge-signtoiletscrewdriver-wrench cable-carfire-flame-curvedbacon book-medical bread-slicecheesehouse-chimney-medicalclipboard-usercomment-medicalcrutchdiseaseegg folder-treeburgerhand-middle-finger helmet-safety hospital-userhotdog ice-creamlaptop-medicalpager pepper-hot pizza-slice sack-dollar book-tanakh bars-progresstrash-arrow-uptrash-can-arrow-up user-nurse wave-square person-biking border-all border-noneborder-top-leftperson-diggingfanicons phone-flipsquare-phone-flip photo-film text-slasharrow-down-z-a arrow-up-z-aarrow-down-short-widearrow-up-short-widearrow-down-9-1 arrow-up-9-1 spell-check voicemail hat-cowboyhat-cowboy-sidecomputer-mouseradio record-vinyl walkie-talkiecaravanassets/css/font-awesome/webfonts/fa-brands-400.woff2000064400000326360147600374260016217 0ustar00wOF2¬ð Íl¬¥8$ `$¥ÊŠÊ|Ë(ˆ  ¥µfqÈ"Ö €«~ó Œè:©Ý ªê!!ÜT5à?ýòÛýóŸÿýe`ìˆe;®çžÿúëß}NëªÁ'¨~*°FþQV…Á7ñˆìEœªØÙˆ»ˆ(a$9u%ï¯ÿê|j¬È v¿n’ íà›÷”vçžlz‘t”’Íž}§~Í›ÍЂ1ĨXJš¤±-[ ´KÛýÈ×,ñ_‚ÞÏQwÁGü8Ä9æEç'\Ÿ:of4#âY@iWú¼«ÕJú@÷ÿ‘í»³}dŸí3Qâ¸MÀþ€CƒÐ\vÀ)þrÊ)¥å\ ûýçùýÿ;÷˜kù6;âûž³ïõãû>¹Ï¾I¾åkäÇ~â„8þ0 A‚X>æÁƒ?hÐRÌÞBÛ´¥%î÷Ÿç­iûÞÿÿý˜êWUWê®ß«ºªººQ Y(! I(­BEFB2ÎmÅad´Â6JŽÈ‘õ0™µYo;ã5ÞÁ!c9$­3–±WÓ@XkÕJƃ{,~ 35É“ÿ}YÚ»§ûÆÙþ¶dìÚ»v6öÿœûrñ^fEèeu/²ª±ÈêÆ"«‹¬n,²Ìêîá¯0£Èùr pDE€ÃÑ3?™¬nFül€Ê¡jR&”©&eä7˜ù†ó 92ã¾£/rH™12cdWÒNZî´)Η³K-V ï–+-v²1”Ää×hâB„íÖ1Ôû«í| „¨ŠLëöÕ/²šaË’Ñiõ{¥}Ë‚i‰¶§i„J¸Ê¿/ോáM<É&áÌú}¢œcŠã£QMÄYÿ?µÝÂŽ-t&$’)>ïü³ñÐüêo„ú?ÿcüõÕÖZq€‡öRÿqÀÉWw ¶þgý'½¨ÎùñW¨Ï®úÉE8o„ÐòäIùRn ²“l{g¿ÑÄ% ¤LWKŸMûî¹3Ž®z]Ž¦8Œ\›Y’GN ˜úŸâ@ 9±åmâ(ˆé‚{×ÔÈ\U¶ñ ÿ[B¯í÷ƒÚ;^Õκ^×V=öº_-kB¤<´òIŸ âH©ÉûÍÚ'Õ†²×Sʹ@!£ås‚H¡ cé™vr¨{ðR7æYµ÷³I5äuhµ //Ñ×Ê2Di1xüK’'m¢£ñÆÈiÕå£,´qoIn×»?"/ß•MËxsuŽ/ÄG»ŒéŒÃ½öˆþfS Q;GwwÇÒ$O Y…¤B#¾Xw`®J&ÎCå¿GCN噌ZÒr¯JªP.¥W%ëÄŒ!ºmGÁÃgBNVx¶»ˆÃëÏ.-Ž¢.ŸW¾¿ÇS(ñJÉ5Ó)†f~^Ø2v½SœÝë¸üê”c»5ÅŠ#£†„|«<µuŠGª¯§ÚˆóT—Ÿ³'óï1>Ò£|]¤åîÂS=NÏŸbA6ëÚøļï)Èöpc~î~¡mœoÐùtÉ6³žÜ0~ÃÒ:‡õ›ÄÒ)ˆ°*tÖWŸCÅ•N8÷UÕ“VLOtÒ~µüxÝå,™ÊAö×e¬ˆo.OŸªëS•²Þ7êgžl–‘1Ï+ëßyg,Yù¢Äº®$¸ oðä=ö:žŒçs‹ª¿]§Wø‹v±²‘Ó­ç mž¡Ip¸²­Œ¾´*q›qÈØx¡æ/ºòøhrsp[e@<ÍSeœg–¡A -_vÚLB?%ߌ¹½}'ø⨪õcYtKÞ¸õGâo²¨ÈCÈä5 ¼Ö¸ê,ÇzøëCÙÀ Ä%ãÅFÿ!|À æÀ+à³›ˆ ‚—ýÿÐã°Àë‰@<|PJ@5èý ? €0à Ã`8Œ€‘0 FÃp@8DÀXãaL„I0¦)W¤C‘ŽE:éRd½`f0³›¹Íff{³‹9Ï\äüù*ªnTߨÏÑFtõèæÑ›£·FïŠ)ãˆ9ó06$6‡5Äfͱ–Yk¬­Ö{ˉ°(ÇÊX;awŒÃp8ŽÆpŒÀq8gã<\ŽëpnÅx/â |†1SÑÆßäCA$)3•¥òT…jSKêMýh&Í 9´„ÖÐ:ZO›i+ £tŒNÐ9ºDè ý “{òxžÎ³x>/╼‘·ðNÞÇgø:ßâ{ü€ò#~ƯøÿähNæTNcæ_ü_ù)¡²¨|ª€*¤Ê©Vª½ê¢º©÷*FŪ_vF»¤]ήl׳×Ø;ì½ö!ûŒ}Þ¾a?°ŸÙ/m´µýÛe¸Ò»ê¸ê»¶»ž¸ž¹¾érº—žªçëÅz¹^­7ëÓú¬¾¦è·úƒvê(w-w}÷÷÷÷·Óïñ@>(Å¡,Ô´çÏM's¢¹0«lŒ#æX̃ØجtåìŸt³õæêE†àpŒÀ±8gá<\L½Û‚;pžÃkø_a¦ …¿É›IP•¥rT…ªS êM}i"M£Y4ÖÐZZOh+í§ÃtŒŽÓ)ºD÷è=}'“{òPžÄ3y./⥼š7óvÞÍøßâ»ü€ò#~¯ø ÿd'Çr*§1³Íÿ•· PéT6U@R…U+úå/ZŪ8;øÊÇceu/=å\¥7ê“ú¬¾ú‹óSG¹+ºë|Ké1=?=_==ïᇒ·XÞÜy³æÍ”')OTgž;ynån‘kJ®œÉ9Ç嬓3SNÿ—r\Ìq6GÁì±Ùf_—½]öF†i|4ÞÏŒ ÆR£{é»íUŠF#À6‚Œ@Ã×ð1¼ä?©¥’,QZ2NFÉOò½| ïÊ;ò‚<#OÊr\%WÈ92\:ä9ZŽ’ýe?Ù@v]dKÙ@6“Me#Y]–”Åe1qBì»Å.±Cl[Äf±IlëÅ:±V¬+Å ±\,‹Å"±@ÌóÄ\1SÌÄx!Â…@ŒD›ç×›ü}Nskª q¦‚IˆËLAÜ\Á4ÄíÌ@¼}³ï1 sï ñ¾À<ÄçB|‰Í7ˆÏÃãùâ,Ï—ÿ§ +òÕVâëå*¬Ì×[TX…¯?¬°*½ñV£·D…Õé­Ta zVX“ÞÅÖ¢wÅÖ¦?ýù±ý=h@ëÑ¿…þmXŸþsôŸÇ©?0: `¦f`:lJ·=UF·cC鎤; Û~wJª°5ÝY}lCw!ÝÅxnëÞ¢{³~÷åQab² »sW˜œ˜÷s~ ÑER»KKaÕuS…ÁÄFö$¶ëÓ.'¶'vĬ;%ä[;»aµ-ö öÄ¡{[è bobLH†C‰#ˆ#q4q àXâDâTGœCN&.À)ÄEÄÅ8•¸Œ.åN'® nÂÄ=Äý¸˜x„x —/¯à*â â}\K|C|‡[‰ŸˆŸqÑ¿á.âoâoLA"ãr9‘cÉqx„œ@N‰ÇÈùÈù°9?¹ž%E›ô<¹¹ ^ W&WÁ«äfÔÇëää–«Æ&rkrg¼EîJî†É=RŸ’‡‡­a›È#È£ð%y yzäYiƒÈ³Ésðy. `yy!~"/¦M¶ÑäµäuòFòfy mÒoä­ämø¼ƒ¼’Ðú|†|ÿ“ï’Ñù)ùm8ùU´‘Ô&}Ú(jj_™¶¨ ¥MCNA›‰:š:–6 uBÚÆ6;u2u:mêLê|Ú¼Ô…ÔE´ù©K©Ëi RWR×ì66Q×QwÑ– î¡¥-O=‘hkROSÏÐÖ¢ž£Š¶õü˜¨ÚºÔKÔ+´õ¨7h€¶!õõ m#êsÚdÛ–ú’êѶ£¨i;Q?SEÛ“ú¥Â)T Ðö¢~£þ¢íMýO[Üðë H‰¥¤¦¤ÖÄJR{RWb©;©ÇŽËO½RE õÀ?¤¾¤ÄAÒªˆ³¤™qŽ4¯"ΓTÄÒ[ÄEÒ—¤¯ˆK¤¯ c þ éOâ ¹¹q?ypªÐ<¢BGòØ íÉ“*4"﯈§È§+âiò…Šx†|µ"ž%߬ˆçÈw*âyòÃñùé±x‘\/‘_©ˆ—É¿UÄ+äR¯’ÿªˆ×¨ÚVÄëT*â ª ñ&ÕäŠx‹êÔñ6ÕsTÏïP½HñÕ‡Äû”á”Ä”%4@|DYNYA|LÙDñ)e[E|FÙµ…ñ9e/eñååñååñ-å ?P úØòïà¸z‘ëŽ-O"×ÁÞ­[ËÿÙ»uëøì[Ç·nùQ“Úa”³XüÖÝ6~òô„\„¤GH8ÍÇY:""•“ªœ¬¬Ê<Ë…*QsÃp]ø«ì)Û4måã¨Î?%mú€,FQˆëÂc÷ôÇXÉc„„‰'Šª¬J•¨ÄC1QII±™½@!EžåÙRºÀAžÍ¦U¹Š6SVe²¨Òïw¥„yÃb¦å¸RRcO®ñ«ñGªúYkùYE|#¾Elÿª+%rÔ…9RIªê…¹êJ6ÚÂÅÑqO1Â1y !áD“6&ÅhœŒU¢)¤ØF&õ½OÒÅdœ¨¤¶˜2Ž¤Hyv£t4NÇYþ£Rc]%•Án•mcF 6N’nVåîêìÂT»†ñ”åØR2f¿æµcB·ë)•]û=¼ÆfLÊÍ`aî;.KÆl˱õ+W¥íØcâòÛ1]{û¥Ï÷–Wã–͘¼üÝžÄ?ý<ƒw’uB lñ`&RÉ>”ç:¦y¶ˆTæN³Ÿw–\?žª’†ô<þ„9!aÄ+ž¨DÅB ™åY>«„ '*Q0^?˳œÐ­­+W¶¶èý¼Xoµ€Vk}¤Iõè}Þ!Z­õ£ÖHUb·µ d•0Ë3¸ëªtÖ øhQ&uǶÏΧë¾2ÇQhæ\wlÛ¢Lv—ú-Õs8nÖ r†pàÁ­›³éTÐ#¢¡Mû!¯OYey–õ ÞAe¿îƹ këë_ú½êÞø”ĆtRJ pXïB}ÎÐõµ ç6ÞáІþOÔ¥ KŸ]BÂi5.÷‹ñ‘”B¦ƒ<ÛFéTI‰*ÊJžž4—L ÃýØÞ'{YäÙÞݽfË£ç¶mÛ’:í»»QDQ÷Åû†±f ƒ0öÞ„<ÛÛËr~›Û¶-5ÎmÞè‚®{‡±÷&Ãp}¬ód›°ÌÇ®~Ø€(ƒÃ@¢´úqsÛ±mq$ 38Á¡éÕôP9Àw¾ ¯ql[hœÛËÿð=ï,»÷€V½Ÿ¿²£.ÑÛµ|=«¼bÐì‹Æ±·L~Cüš¯ïéþn½áhÏ­Æý}>è™íãV:‘÷Ô×Çû^Óø=>Ö²½güìÈ>ÙÿX׃QÅ£ñhìa}²<Ë+ɱˆQ\fï^U•¨$þ0-Ç6Þ5¤nø­9³1?¨;N¢ •8NîÔx™å؆˜ß¾± €zcÇ¥Í-íön&=V%Ícݺ \Î-ú‰J$Û LT!îî¤fêú‰n۶͘øÙ_ÖÝò|yd3&¤cÛ¸Ç0\ÂxçuÉ9ò!Èòq–§b­„q?á4Ïò²2¥Î ãeUŒÆ£ñÍ‚Ùh£q:ZgÑ@Yþ¾Ã«Ã²WW´îºX–ór¸ ×­§8ò[µP«µæ™I¿×+w’k­ËÙj­Ù*Y¯×jÖVgG¨ÕZÍ_`«VÃü;_û4ÈŒ0RãdSG¡s„RÄJ~YE_ÅèÖçÆÝýÈÅ3x²Õw¶c™€>1ììBÛÚ¼‰OÂyuæÛMÀ0lǺݗNƒ<§Iƒ$r,¤ƒÕò/$óa–—Õ°T‰ÂMs{ùi›sMÚ¶½<€sÛ¶%^iÛ¶ü¢/’¶mÛœk 3 ͅƹM(ñÉÏ`NB’äXÄ‘JŠþ¤*gÓç6äòSÓzoÌ|–ǧ ”ø§'aA 2_;yhÁj±¬åyÄ)!…¬=dîë{î_se#G„ÙcYñ|4³|å={~¹í|®4GPϾpôVme¥ÏA,Z;ÀñÏâÇ”à˜Üî‘X맕¨ÅûW>a¬z@D<ó4ѦæÿÖYžå óu’ûÊ’Ò²¼Oxk^ÛÝ €Á`o÷Zz~«µ¾µ²Z4y÷FOwd{kZ–÷ÍAâ‚#Z–÷ÝW–v¸»4”¬{0ÃöûýÇ8ÌSºa¸÷¸›p_YÒcðÈù?‚´H‰4„d*Ó,P$¾¶Uå6X˜VêÏ8Öß´¦qͱm[t¾§Ù¶íhœ¯½éÌ;¯]ÃW„@¸<9´m[p®9wÜáhœ Û¶Ñ[þÏw|!„ÙÚD‹ädJHˆ¶׆)„ÇšTé̱íö°WÙ±äQ9\E¬´»>}xxxhÍ&u%y„jµÖbaéíÕa™¶ÛÁ`TWq|dΪG>á‚l‚,C2¿˜ø%7ÆÒŒrÒ¹[ŽëãsçÆÛÛãsçƦã¦y塇®lz®ëm^yè¡+¦i8Ž‰ñööx>ooÇßê‹·vwww7/]2mÇ4 Ùè:BLÍ5Ž¸‡Ù HƒiÒï̃IÑîv19ÉÅá¡4œ—kç×j-Ì—ÇØv_¸¿ ù¤ÎÒIG,æD“Ýóå-òºÁé¾òè°«þd¸$ÄZ¬fåÔéŸZº¾OûI,H¥ I5óÝI ¼¸]~À;ñ1­ý ûf¾¨wF® ãÂ…ÇäqŠGΛ€aÚŽ¹y€ÃX¢‰Õt§i·çºê‘Ý=*  ¡•á8¦ k¸yŸ#,È:!Cœ8OѦמ‹róóèƒ:qO'5@Ž‘ —{Ħ¸Ëã•Ç:Ñ{Æ“õìÇ)ŽSÛµ@L.¹*D9 H^ãèBY¹tcªÍ‹éÃÞ˜¨qš™ÎEŽS”UYÓª,Ðs #N“2%@Sjõ4HS(<¾A ™Nœ¿Ê£#ìŒÿ*TFòb*T†iÚŽù‘³}ʹø%ºíXeúW|)^:Å›æbû‡¤¾üä›F&ûe—-FuÝv¬_ùÊvôöð(û¯lOlƒ<›õyzî†9ÄèçÄrÑ SÕ/÷8ÞôË.Aà–ì ™R¤ƒmä­QV*q¿áÜ$ñËs¾Ä óKÄ´^‚OhµO~²¦éJYöAò‹®û‹ËªyµÒuvA‡°TQ®Ìkœ‰c²†Ù(ö–ŸJ/ÀÇ…¿üY¬Ù¾G‰.<œ_þa]«ßk4H¡¥TNÚlÚãó,U"Æà|æý©“á0‰ãd8ÜH]ü Úél6í´ñÚq'ÃìÌ™ìjùºÅù¢èv:Ý¢8®ÓÑ©7I†›­)w²ëýÕ_—Y…u¿ök-@7Çú¶oŸþõ¯û:óñ¦Ìoÿ6=jdù¸io<^æm쳧;¶m2ªØ« úa2Ó¶ýÖ-¼ÇdT×Ûþƒ÷«ÓËîý`ÛŽ®SfþØ‘ºR<Ð"ÌhOÅ@vbº½üçÏ*çµ—Ç‘¡Ûˆ?Ë4Ρ¿ü~ï6dz¸Ã0\B(±Oÿ#Œ¼…p´ šNÔ(6õi:Æû™B ©¨HŠÉ¾6è$Ú_±"_k1SC"ùû9Îò¬•ãI¾‰@·Œ2Ïòéø qh8®q;ðÆr€4ŽECQ8xf‚zs»ÙÔMß«mJ}¥u~«Ùbð½Bš,Ëu ÀäœézKPpÇrüÀà èõ«êÊ—/yR78æ[QP“gzè&IÔJŠx0À¥”°@å맭­l¶²ÒeµÂ25Mê:…É)ít¦G¥0,§ÑÈ|Ï“Wªª×ÝÝyd–¦:ˆAz§'4Ç‚ØÄ'mR’KäÙäò|òbBl¶¸Œˆ³´R,›Æ¨!R³".†³àâ"QB¦qQVål³"Nãÿw®òT¦U¡ò~ПØs¤`í²B )ÒPùç÷\+Q6…ëFkwßýAhBº®~I D»³±±uÃ]ÖÜ/ÛÚüÆݪ×é ž­u´úJoåhù?°ß2ŸµZY½ìÿÿÿeçÏû{O= û-Úî¨Är»±ëbù™¯|–«qœåšwöñ«ú}Û¾Ÿnlá±µuûãÊTN?þ7ËùÞî+7¦E6¤ËñþÉøE/(¦0šMB%ôô?Y!û„ Ë*Ë3˜’&(˜TSoÏ¥J¤Ø^MúW‚äYU(‹I—NT"ñÕgA.ܸqá€Òƒ 7Ö3·'œ"âÛöb0Î÷÷9gˆ÷(¿V‡Æiý§`Í®?´·GéÞÞCïíQ<³9E£Û­¿ó*g”®¯SÊøÕMªqz…ó+”koü â‘‚J†eUVý‰d%ðajfÉ‘îÏ3û{õzÀ _àYϺ|y\ W‡XÐáêæFÝÒ ËŽzkAPk6|\/ú´ÏáÚd0€ÚÜÚÝŸLöñEq<Ì&Í•N«7=©›µZ„Á`ÂÆ£‹óñˆB@Èé1ŽqS «bÙf2®feIbRU¹ùòÌ×V«YÿÏ=œßÐø!ç÷üê]T»¡AÜsׯþê]÷h74zׯâùg9ß¡t‡ó³O¼ñßÏ>)èÕžÒ°}öo<» í)îPñäÙã„6^X# 9KÈ0K©е †A?`é,Îibþ!9«°a9‘ë8N;®Öò÷p|}­•Ä¶eÙqÒô]ÇÞù~á8Q⸮Û–%þy9ÇñòËë-×IÔÊJ¢GÓì»l"ˆüNa“«äqòbr“|#!Õl §y–"¼ù™¤ƒ4cKEq°D¢’jRL „5éŒél:+ó,—Æ3XW")Š„^ï%¤H«~øŒ ¶Œ`šg)‹¤HE:Hù ÏfÙl:›VÓª,ÊbRLhÃR’8Š#y’º¶jözðü䦑¸õF$4MÄõº›š-½AÐÎmåÍF™†Ækµz]Õ·^)º@È•×:Qä9€ùÄàzQdçýÄ&àxQäqþvù`áu>¥®] ¼·Þô‚šíRê‡Ô¿øæ[s¦¿]Êï¼® D;ýEü(~ˆDd—\%÷‘/!_µ íRLn•ÃrÚæY:HGù(Ï̇ŽŽ:„Ô‚A:òØdQ ™O¸º¨¬ÊJ†_f¼¾1ȳÙh\%*ñ*YîħTË:šª*s¾ï»•øbÎ=ŸÂ²äçC×MK×ñ<¦ù+”v-ëÄÚ3)ƒR ئÌݱ]ÛÖiš´'¥i(=‰d··Yâ{¥µZwF Ú>¦>[,£±ªFñLB¦/}G©HÑE$G±5 ò ⨋$–B%]Dñ÷g+Ôdœ(S½T Q2 F±º&j²Ø³Á&j4VI19@Y¬ù“âá³ÍªiQV&©ØFY©I}ZT÷f&§(gÓ\f›L`A×ôåÅä<¦2­˜7þ×ÅâaG–—Õ8QiªY$*/m€"N³*ŸVe1N”Y®Jh )REærê˜Ý/«^ ¨DIÑE"ÓA‘²p¤Åþ|.AÈ^‡GAy€I)åMJã JÁWŒjœ³˜1œ³€1—rN]ÆÆ9 €Ò˜q®Q¦8ã ´Áƒ ´¡QJM NA=Ô9ÀB$Œ%Àëµÿ˜´ÆûPökB)ðzS ôùÇÞ䣈9¿ÃõáúZ¦C㢧ëbl #nš”1ªKónÝp]Àuñ—4ñ’‡>Ò”2Ñœ™ÜÖ¸tA]‡~Ì4Ý0Ÿ4.u žm†i:–ÍaãBk‚·Öûý¸Æ­™”ú'àÂ\?gpιáîÏ»Œ}³”=-oXŸýæÓm3Þú\QvÿbOÏX—ž'¥x.ï ¨“µT0i˜´dH9¯iz`ê†Ól¹”º.¨#“)u¿×ešÐ¼7¥ÃU¡ñså7V9· Î0•iê0§ÚŽÐ)Û¶œ7ôº®ÙÂ÷}fxBÃÿK0¸Ö¥.oÆ(WþÔµ¶ò8¢"Iëx§(Iv¼øA±Ïã!«p|¥j¯ŒÆ£QÚZ½±¹UÔ“Äs]O%uåºPk£»úoù÷L××ÃÀ¶ó|2>»¥ñ˜ÔeÕUJ]×ð'-«hG „P -‰EÈ0îÏŠ¸84.p¼œå7~ã7þñ§?}óæÏߌ7 sz„CRÇ 擽OUVå¦³é €š,‚ðÔÞ„ýÑx4ž Ì³¼¤Âƒ)&*‰Åöß–‡HEqÜ p{ÅÿžRü“0ÔÝàÜ…‹óz-ŽÃšÔµµV÷q0aáK§0„iÖ& ¼ˆÃÐà Ï0hX]1J)gÔuãpyÐm4/:°0Jh«µ&%çVì:xh7v0J)gðÜØ  ‚2]ÑÁâˆd„ ©D%JTºÚÓíËh:â;¾_æøÑå³'误w:ôÁ¨V3—ŸÕ‡ºqܨ7qÄ9îÀÑ];;½yšºzÏjfÙæN7®…–Ù¨çgº]º±Iá„œžP‚ñIÌÈm~²-Ä2ŠMs‘2¯’}Lªé,Ï60ˆ…ÒEe+ÅÉ>&˜Îd:ˆ¥PQÖpež¥àG=úxÈËÀ«€KC¦Ÿ¾wŸ>¼;ï¾D_ÐKÀ+à§þøW¨ ? úçðgœŒu𓾹W^÷t©O@²J‚IüÈ]L ó,ÕT•Ëþ(ëbuò´1ïµ;‰²mÛVI§Ý[/‹N²~€KÛgÃå±\?³X,‹ÛÆ0ÇÙíKû$æÊÓ| ‹}úÛHTQiÃ&të˜d»wÔÅ&UœÑ•Í}ºP2‡òæcÓY>S þ€\.Ë^èõÊòòô[‰[k‰2^äjÆ]@¹ô=* êù’ƒÂÀõÎööÎhãLï§}CsÿSÐsçÇ3ëâ6Îåó:[[³~·fQ)—wéŒ1Íu©aP×Õc:7Í0Z.ä3’ !¨Õk4ž8}}i/¦GPÄ#}RÛÈ#äeäU„Ti>–i^¨qU¨¢*ÔD9ä8tL«²ˆ'Õ¸G‡5°—J 5@g¿‰ÏŠ8Í…/ Ü–ñ\!¢ÿo÷Õ¬ˆE‘ä³Bqú=Ãv;ÛÊZ´•ÕíNAÐiA´kBJQ‹4 "øz§±â:ŽÛª;ƒ^Ç—Ð¥)Eðc=xªiš@µ00²ìå¯ý·½îuoxÃf-èt‚Z-èt‚Ú‹mÛó-°-ß³maÔl†5Ô.|Û aÙ¾gÛ¶íù¶…Öb×UwÜÖÁê҇„S Ø\FŠÓüú8wEPòLjÅ,â\ÎÒ RAqÿý¸~ß}o{ó¿ö뽧¶/^ÜÆ=zýúŸ.?ðÖ·â%™"‡#äz„—’6ÉÉ„ÜKžG^A¾Žü!Õ@Θ֌8CBâ€Ûk¥2Ëge•(!»-tòÞŒêÆÍ…¬?ýÀ!Á—Ó‚Ø•%ljv‘Í(.A5£î€ÝÝHT¢ šŒÆ²:efy–f2KEš‘Ûš³,O´¤ˆÇqz7Löïù?PÉjøm ÊX›QVS­ V Zn`šÁ c+õ)õ}hš„f#Ï›  ÑÌóFð}J}xH„¾Ð &ê+ÏC- Š(‰ãÔd¢žvýaâIJíH2b”¯0F=Æ(¤‡š©áÓÑ Èïa”1ÊŒ( WQørØ6h¯O÷áû€/5í±-Í4ÓÔ¶h Ý^Eq¯;D1}YÝó}¯®|ß÷Uß|]*M“ Or×u¦aPj˜ 6(|©ùŽµLƒâ¼ÜBWÆ(e¬Ã(Sú|]c‚HBˆMð:²FvÈ9r/y1yš|ê© F5doðâB%j²—†#^Xi£ñhœ …,ªt˜¥£q:lGj4.Ê*œŽY*< ð54^ëü,‘ŠeÕ·x–ŽÆZUÞo¦ÂƒTÂF…ó1ò¿¢ÀûL!xK6ÞÇ©Ž÷ š-³eøµ6Åû4X÷t]CR¼dÚ-° ¶®ÑÇùº†'~t]s]=úCµ®á‰ùeƒ-?iì §_×è9 èºùÂ:…¶Î(ãþ‹Wêu€¯(bÃò{ý-ßȵåׂŸ‡åoB[ÿ©×½£#¦àÿ"þ¾uðuX¦eC³§ÿÁÃŽo9y€¼˜…_{=Ó6(ü±ÑEÑè´P ÅÇ2˳´¯ó"‹ÌŸi .êI7;d\”_UnÿØ h6Ö–?´ÖhÍÆZ»a†ã×¹Ýà)•§7Úk¦á.]Ó0Ls×4°ü¤†ç¦i¸®ù“E¹žaÂ0]×À#­ü—W½ÅÍŸÏ[ 4u×Ñ ãêUÃÐWo¢q›g†áý´k€aº?½a¸ý•.u—ùdÎä^z„9y€<‡¼’¼•¼‡¡eêtàJûä»(«Ñ,XôUaد)…éh,ÒÑxÙíñ‡»V‰Ô(÷1‰¥HsYpFÑ”PŤšM70ð0œÎÆÞ´ò&†ŸŽ§3¼SÓLCÓ„çÂè4{¶UëÇŒç £[¦~Ö ‡a¸1 ­³ºeigì ·.Äzï#Šr6€ûÂðþð̲|6¼Oˆû³g¬³*€zÖZ¯u»µu묦±`½ÖíÖÖBñ£C$£€odyàðä¡ô×ω…äÙoýÝì€,/Wõjy‰|êNq¨–—Éìàïàð  ð! J<”³©UHƒ¡ýå.dœ}âȉřµFîë¾q¿y8ß|ÿC½Eõz½EZ ‚NÇo~W­¶hòÿÀûQ†N£+ }žE9R£MDãŒqíeÙÂá<ÏŠl˜¤¦´({Û¦UYeÂ;¶—ÛýC¦°ÊðA»U,GÑR3JmË‚,Ž“ªÓ…Zm~¾ÆqÒìõÒÉü|­³wkõZ·Ñ°,Àã SÇíüÛ ŽŠÑØ´’?^w"ƒn÷¦BÓ8k6›ør»MÒtÿ†4ÅA0Nëu€d¸½}æ5+Ž ÐéŒÇÅ€Ã`šÍѯàÓ÷îîsA}û„¨a„’:úI|‡¨Žb42´Žd¡ð²ÀÆÙ8K“.¼²ÊHv ã¤Ã*çUZ‰³T’ IUvÂÎÞ@‰ªê'ŽªJɘþÖ×sùõ¯W¤7€z÷ë-~ržH”ÜÙ|ïcTbÊà´Ù/ƒú:ãIJgúw¨S f?ž¾òivg‡æÿó‰ûÎ2J±Ø{ë“à)L"—îE!†ÐÑ!Á!:‹^‰~ 4X„³‰3ÎRàò$ÕDL²‰óPøm`2 áâ3ÑM²Ú5ºPxL|öW†{FÂç~\yÄaÀäkŒBîóLA8^dQ8N“‚ÔµNVVÓ|š—y¹}øew+Š£4‰“"*’t\$UYe®Qì ·¹<˜!Sù¤ Ò“9q2‚ á›Èã³URA£²šä™óQ¨ xùÔ2nغbµvôaŗÃÏ~ PJïY[UµÓ7ÞÇëÀPŒ fpe^L`K?/©~Ûî¶ÌóÚ ^ dp×q]§K€P‰ ß@ÖvjŒà蹎ãöàÆàtÆç1Ædk²Hfû¶ÕEéõ¶wnÄ{’SÇ€RB–eä3€âúm»Û ˧—0ûƒE&Æó0¦”’“ö¹àN ¥„P‰ŽáÍͲ¥\ò!_z>سĹ[î»oow_ëø¡Æâ¬Ô1íhù#J%BH㊴¹uÛm§"!T ð< a¿Ÿ$½(Ä¡@1©%éâbšÔ>°ž f3€  “~œ‘€Àhü˜z’Ö·†Ó˜M^_¿á†ýý¹t‡6?ÐÀ@±$‘!#"I˜nÜ&mn_¾íÔIÿtÈ9ªÿÉb 䥡t»Ñ¶•( ñø2Ž³qL€œ$%@ÈN£?h‰Rª­‹G×qO¿sÜMAYËÙÍzeýª"êzº%A­ÌJmG©X.¼EWv¢~?Ú‘UMþ² È†.ßh6'*Ɯ뿪«;ý~¿¿£,•©È†®|ïh6&ÚWIp ØòêêÖÎêê2¿¤èº¢(ßsⶕ¥Å×uU%³Ý??Æ­B—ÆKK1×uM!ÉÈ:úeøçq2» ´N¡«è•è]ü~ 2º¾»è bMQVùàá2‚MRQW½¬†ÏF(¤UèQP´•¤eå‹’E(Ï8[ÒkÉ¢4äŒgäT®„o{(Xšý Kp³íÔjŽ}ï顱—ß‹¢……Ñha±y>y‹â••xö_ø‚à °`øøåÍ8n6XX7 ß7zÈÛïYVTEá2•̘lûMηwô—ñ¦o;’¤ªžëȤ߇ò1öŒƒ¿¯9¶íìÒVÜÙ]YY˜ïõÇqz½ù…••n óÁ~€Á‡ŽÃ®„DýqU‚2%5oÖôš öAöis’k‰(êvt½Ó"ayªë9Ž$)¢fèþm<(A‹U¹ùíg“‚ØɃ$ɸˆƒØ™[4Èyqoï ×ëÁµƒ^¯×;ì• ±Ûëíî¡k½^ïÞk€z½ôf½,ìîîò? G>º„PÎRˆ² ÈÍt¨õ8â°Â1bRåÓŒ Ãð! CÀkg‡-×uÝ–$oð±ÌlEÕlMÓ4ËRU+´,aš¦YzïCKÑ°iX&Ö+ -Khªb3>١´oØm¹îì¯0f„¥„ÒåK÷J%¯NɇMŒÍC Àb„rÎ1! ãkq¼;è£òÀ¥=eUVÒ!ÌšD¡4‰£4ágf"YÞj˜ï@F˜Cb¡‰Ù5ˆÉž[Bö!cè¼²=b¼~aŒ eP¸Â~E$B¡<Ê\¸¶ä+ ~ò)Ú×îÁ䮻ȊŠÐ§ Ñl8ù< ó¹Óh6¤×U£nÝ“Ut ݈žB¯FoD‡èÐo ?@þ|„Ô6ª%KPÆM)UÑÂëERô¡Á8óy·Qšenvu–ÂçQ:­$ηëw,{ùÙ8g\H-rÄÃÜçã,¥;÷O^Y0‚èBZ×Né¯ ü€q–Ž³(û“bû4ø²Ê&n…BJøýaIA¿ëŠûyX”qäÓ*+E)I$©È'E™>*ྰNü¤`]Æ'AÈÇñâ¸DÁŽ]¾´»Û¢´1Tf ÃÖm›0ÛÖu¦ÔëíNèsC'À¤š,ßK0¡ô׌ ܵŽ]·ï¨AhÈšãy”ê:€-$I‚-0C'’±ª3NA6t!–7RB î‚4C!cÐXøÜöì3„PLÅ S‚)!˜ü&@È%Ç!=ÓàŠ"wº¶¯€D$L%L°¤R!ÌH1` ¬1Àhå ÁòPå® aÐíèÆšÖh1&Ë–Õj $ <®8¦ ¸ô@í=0ànΞ¸7_ZŽ‡}[ÀPtßšµºŠ)ù¡ß¹ m1]#’¡‘÷qÛ ªí=j2†ÁuF#Ñ\XLaŒi¦çꎭLÑÜû(&”`B^‰„1%dŽ!¸§k ézM膦zÇ’T•–¸,Á¼=ö…QJ%@‰.jßC¸†¦U¢ƒBìÑT_¥·^?厗?íì-ëÜ0BÇ4LÛ÷Ûõôz£ÙgnN·Œz=Xêô[í8²?,Z¶#Ëš©iÖö¸ÛƒÕ×z½Q¾”˜[éû;ÈBÁÑ!|‘ ¿¿ÿÿ‹9îà9¼„7ðI|ߊïÇO*3Î,âi™³2Ÿä,eÁË4©[sxY³ÒyÄ·°g%ÐÒŠ8ãaIƒ3®ÛÞÆ ˜à¡ð³PÄ¡óqVŠPDi(x(²¢¸I3*_¨ñ LÖ©ºlŠqŠ(Žâ5˜¶ØÒ¤Jª2­Ê*+ÖÀǬƒ*+s0DU6®Êçbøjœ•«Êœñ5`¼“,¬ŸTã¬i(Â-,œTã¼ã`Ò÷„e:Ngv&aŠ4½—ei’a9a1Φ"“5æ¡HÒ5Hx(X–>~ÏËœñŒ‰$¯ái‘LŒƒ—EÂ}>ÎX6Óqå]šbi6%œ4§Ù8ƒ²Ü‰ð%bœ‰1£½,BVâèŸ3õvæ¤Xƒ²šde:Î0ÜA§UƧY”EŸóq‘,HÒpŸØç²4I½0(ãI6ÉKӫ܇e5 8ãÓxœEÅ´bÜ_Æý(+ž¤Y’‡ã$ˆ+òÔ ›N³$Ýñ„]H“TTŒ—;0çã8÷«ÚpiÉ¢lœ³²âŒO‹q–T>gÿÅ$ªÈ˜Pé •“P4k­¶C(Ã&c’dE–eœk˜Rf‡B–$‰c2À˜H„B%NèD¢2c2lȘ3‰j›T"Ü°dà¦Ï¨û“ù…Z SVšÜ!¸ó¥D@Q4%0\×á‡1®`[®ÌþQeç2ÂTIâX–a¾Q ëä刊ˆ²Àd‚©‚q.›Ì¯Á§á³èôBñðcôbÞ½&(FÚ K¥ÙKiYÉt7 Þ ÏTǬ°+Ī½¤‹ μäê”ÆùðX•dÕcðøj˘Wå˗S€tñòiY ™× Z]õÆr¯E5« †ejqgî•á#`;¾ï:’_ã¼gø· ˜k¥é°€ÛÏþö €ÑXMš%@9¹zuRÂ|½ÑðBc®ÞÇØ ‡C!(ÐÐp%f×–€ p\Q;ËŠb0;p¯Ÿ[!áK¾¾&J\Ä)«4UÎÓX仧ã5æ}Å=7]=ùâû÷o%?Ôúdå;ùâK¿óþû¿íCwÜñßü&¨yôOð—ðN¤#!È7ø&ƒä$öàéSþâÛŸü¶Sßûéw=ôT}îÿŽàŸý§w½ëGÿìé§go…s³ÏëîŽ.@gŽÆd¾J~’NòI¥IVIšlÁÈîÂVfWŠ*ÆËÊb:ˆìŸdtƒp~asmI–GQh;Ì´BË2S–A®ÇѼäy½¶+<9ð]Ó;»ï_^XlµZ-C÷1‘\§2(–é¸VÇuI _Ò„eߤԾ]1òàÛ7 ˆ‹¼@•ë¡‡ï'E3Á %‡w*§zËÎÔë‹cCW( œÐÖß2·×LÕ)?xºZ©×1†-]³F§?¨þ"Çûq{>ª£EtboÒÒµ8ÄE¤%HvXŠYA\äºÖkå¡yײyÈýhö—{ûnð ·UÐT{À¤z]æ°¿ ̶ë™mc¸¦¨ÆìÀPE5àÀP•ÙÁ׿þ¯šf;š¦iŽ­iÿú¨ï:l;|üëmCÕ Õ^z1B)]?¦Æè%¼´/á‡Ñw£O"œ;K"µ¦›ÿÑ«€^QOâ(k]„BêìÀm6fàÿ‡A˜‡Õ8ó?Óë©´J¥Q:Í'ÏSGiYMDÊïz2©àø„ñ—3üIîBv¦ÿJ@m‹ƒ ˜nÛØBÛ¶Îc°͉l™:WdÐ(Ų$©ò°(Þr8ŽŽîºóä$3PÑW20Î CÆÀ˜÷ŒÁÐM(¸€Â»—†7vÜùMÍLÚ.yþq;àž“1€”d Şǃö±ç“Œxâ2.„1ÈAa¤˜NöNï<:ŽŽî<=ØOÎȞØLÔ9&‰ˆd#Ó7‚×ÊRs‰o~#ïsNE¾˜÷~±Êç«¥ò³±)JÄÓ”ºTo±mø÷¨&·ÝxÅÓwyþ}§;Ž56ô§e‰¼sÈÔ§Í Bpx2Øúãa¿bWÉ»r˜”w "ˆ`º×«É£á…~kÞïsÏ; €‘J¦9÷G¥›¥_ø÷ø8>äÌ'"è׋4*´–Ù¼†l›mƒc<>=½ãŽÓÓñtñâ3Ÿ­g.^¤[ ñ/àå·Ýý@ŸPÎD·ÝörG;Î ¿áCŽvb§ã|ºóùÎûœ¯s¾ÕqYMI)ô§CæÅj»™Uƒ8 dõ$ë¢$ ndkVÏê5»sà»%VO{ÈË"ÜÞ†‹¨¶\«³‰jYªfw~'¸BçµÀ¡€7Þxûí„ããPœd™ÖÚ#©bø¾›ä…ǽÃñ˜¤ðˆÈ$­6 Æ£¡ïE‘gˆ˜§¢¸ÓéG@rÿñ0žœ^¸ó«ˆ1"FÌe `ŒÆÄ8ãä1vYa ã#øåAÏðtûíoxñµkøÜ-K‚¾†’€àIW¶,eé™ï{2I:,ð™1ÐZ*ÖIéù~6/ ­É­¦}_øè\»öâ;›f4ÄùwmÞ’n!*fMÎ( Î@œS.ýkϵ÷îÇÔBªI¾»m°'}P·:ƒq(·Uö8Ñ›N5ÛzbÕzsM<\ø•³<@>>Vk‡›UÚΤ„ŒÂìBU7Úßóý–:gÃ))ýÍq¿Å8u]Î…F©ïõZP©~ÄAw 1H•?w]?‰c·(¸§5n\­wA‡gýnÏc’»ZpfÃ(:Ž½îÑj8bqÔ:~ß‹²,ì]9{èŽÓÓñ /=†‡Ï9Ò‰™êxÙ³\güOYž7ól Þõå%nÁ²ÿ­µæL ¨0L/ThÿÆ‹öö¿T¨q§dJŠ~sÜëE>INࣕ¤IƵ4‚{j1ovFãGaè–ó´\¿²[ƒÎzÝžÇIWsfÃ0: ÝîÑj0ô½S÷*è(„Ul,&å,Ï£¨Ü„õƒK‹¥ìÕzæœZKŽÍ=³„®Fu‹ªjÖ«ÍŠ]6U^õ’·`•¯òAÓýgÃl˜ƒ½N×íw’ˆ“Nß÷éÂËíÎáŸõo–3²E?‹^ï`5míŽOˆs:f…¡7Qæ°ÛÁ#+ ïã;½½>h€2„†ìç”Yàq™¯“0*rQÄé?t®(ž÷:ÙäbšÏŒs“©êy­¼%8£Õz<ñů¬VÕêêêšîÅ| ™†Â㉪*EÓin·Ä>,™Ó"ÄÁY— -#TÅNžž^iÆ+À’»Ê¹²Ú©^½º",  Ñl6,KÀ[¯bYŽbMƒ«w€Šè¸1‚Åy°,ѵMÓî Ë‚Ù'ßݬ×1Ñy/,Î{¦8Ûþ„EWÎ…ä =ôz)B•Ï³S¦‡ †î3¢Õ›ŸV„jæL‹óÏC FO2 ÒmOr8 Pb¥½9ÏX‘}O‘eÅóeìùñ`a>!˜Òdqq8ô˜ç„ò¨^¯/-ϧõz½Ï)•ç`\o†Œ…B„L EìyBDÑ`<ˆâPÀOQÅóEQ¼—:®‹±ë:Žç¸ž“O–‡¶s(Øöpy²›Õ궦™²ì«ŠÏeSÓ캘ìæQ­£ V‹ÃË2ÃÅ \ÏY?rö–0‚W¢¡a\•i²$öb{(ù}küÊ}S"Ëv¶yßÆ…Íû6—á©­á@Kÿj«Êìo œý „÷ÂÒÊæ7ü±ß\Cª!ÔQy})¹Y<‚¼ ;§9GñÇ>Ï`úœôã~x€IY°ï×ÿY‚k³§¦SxÛAö¾fóLbYÛï£þ³Èu¸†l„€ð´Ê¹Ø~u»õp}÷?韗Ÿz£7{Ö†³Úìó|®ÍÞyË-÷Ì/-Ýw¾8Aôè^‡hMÍ`†¢¢D/â€Ë2“¼ÌÅŸ›F1Ÿä“8È‹I>Î늒ë©I••yTÕ«AñðTñS”Ë”öº£Ìó2Õ²š†CiÝ0 VÕ@’Ô]×Á™ïf[ÉÏ‹?N%·Vs=Ï«Õ‰H,hµƒ@„­v Ñ_ñ·\—Þ|ÎÝ 0BœßÓ †õãûûÇq¬®ˆ>ƪV¯«*Æpïÿ>kz³©kCžš, !œÁZGÛÁA'è!·pS<ñÚ6ÉÇÙ$›Uºš'AIš¤R!8Nôam2Y\$dqq2© u‰`L¤y·3û©w¼Ž/{ ÑéÖ`QëtÅP{9m(ºšÀ jÝŽøúwßz¾ŽéotšŸÅd¨Y±˜ÄiRå“.T<!£ìñƒlBþݸæ4eõ˜AO,Iæ1/ÿá;c:»ŠþU®îôÈb;Ó±þŠ3:6Î~Ïÿ¿Žõ$íïѱŽ"]÷&AkcÑ\ˆ“gûƒÜ.KìÓ2ÆŸ'#³ÿ[QHÖ¥êŠ,õðX’ÿð‘=¢ŒdilºBâ#… =÷â:(·• (¹¤|ý‹/U@y™ôxwNe }‚Æ6\C22PˆpÁÓ*­©Ow ­<ù 7EàÌ¥‹/]¼xñâì¯.]ºxñ[.^,Ó—®Ç·‡]‡Wk“òP¡ašBè<å‚pQñ8ÈE¿ˆƒ~Cü3òÏl|¸þ!éKö{½—öîÿêWÓÙ_ÏÁ#so™Oç_sÐ=P. /‚^»Vû¹¹—]»†’:²ŸöuPŒÆè z7ÚÓõ³708^ÍTŒ')¦X¦i'qG<âL°À|ï #“¼¬Âª,ôH&m 6ŽrïЯÀæ ‚â°îݢͬË¿žõúý^vßö ‰×{é{H­Že®k2‡3ôô‡ƒÁÐ+熀1 ÓÊC¿L‡c£ãGQKá\iEý c¸®³Üèý9ïù@ýoÄ!ßö­²^~üóôzA?]Ǹ®ÉœËZ«J‡;a~ÉïåôòƒÁÐÿæ6¾ƒûl5øÔÏÒ+MŠýç¥Ëh"}ŽZŽ à:­æýÃ6?^¸œò¿ ®Ó\A× ‰‰ÒÏ êdJq%üz–ÕÒZ„¡à)Ï«\äÿuìuÇë.'ûáyð½ïíD?u vÿWátÖ…o|c:E±£ohn‰L• üÀdc^™Fqè<Ë!“¤ãÔ“9&†Ù2tm}¬×$ÊÏttøN‹Î¾þž÷ Ì ~«pˆFüu@³[Ginm@(µ‚Ž§dÃ=d9”Z½1Øèõt}Ø;1pÓ„Þeð¨Ìcq2VRPÁùȳhµFãîûìí®ˆ'ãqóv˜G >·ãºäu-‡ç…zrP7¬yEB:L³ÙÑ_¼>VEÙÒõåÉÈ#*ŠŠ&M1P}×Ì¡\K¹vÝœs†€èsȯRJÒ ß}Z(ææyf!î†X <)'«ï >–žŒ¿ðQ|*žwŽ«Ž3ye<Í"ï÷Ê´Þ*½7QŽù¢Þ6‹m¹«åiW±êŸÆqìGÚ[íÃIEŠ¢¢hGQÒnÅQÖÊó0”GÆÐ…”3JÒÄïR=øÑf°+ „€²„ñø¶z?ôËPДÝ^Úä··³ÔÀÚ`°ÊáŽóÂGq Ï;Ü1Nऎ“6yµ‰ËM•±©ò8_m”ó¡}èC¿ù/ÿò/ÿ‚Wv~äk϶óÁ¯îM~ïGð©?öÇwˆ®Ñ5|.¤øù€Þx Ób 5«&ê•%;˜²›7|GATäŒåçÿ;g,/ˆ $sFLJ¶¸tíÚ¥“’›_ÕŠ®©zvõ+¨(èÿ¢_þ¨B¼¸Û}±Bdl•ö¶ÓûI™N[µd«UÌ«‰ò|¯ËÉdžrŽå¬Î!–ôx(’$ÞÝ=ºøØwUÓiyéà ,¤šwoï¢R’NwÚ¶Š¡ðy«p‘A>ÙŒë*ŧYcLíÝ™¦w&Ùöä~&ª™}À9wïátñâEѯçÃP½÷ÉèO­ÿnYM T˜zÆ÷‹=‚µ Áèƒ^4žìŒÇ¥ÃØj릻äû]­Ç½ÑxrðUyùÄÅ‹Ä `4œ×ý—QŽNêþ3iÒóŒ¡È j{Rpé(:8L“0lûÖÀWR¢ô…” dzÃ<÷ÇþÞŠŸsvœ{‘Ù+s¯À âj¾Ø–Ë|-7ͶâʆÞêê&V*Þ5(j#ØÄÛfU(Üvþßz® )…°V_íõ¤cx´m4a]Œ<æ¿1Ògvøk+ç ð+¤¤8ºHÿ4~aœ?*I}Ïh¬48àûþç5Ü{Ù%¤~JB*SäÊ2bšåÙ EŽÃ|šOë:ÇÎíÓóÅ:‡Hº W¨ók›í•[l@%´Ü˜ŠÉ)ûÀœ°…@µðÐÔ™ý;j?êj(í>ê)ý‹Zyæ>ì)çF-Fwßõ«xï(ŒÂç?àTžòÜÕZk÷ü­žÒZyï]£~/nBÿf²ã,8Ëè!zT Ž©Y^Le¡2õñ6þZòíŸø‰håIâúIâÛ4ÉKè¶újò×_÷u¶(O ?€ï é%Eay6u¹Á¤0ÙÚ¶6µô,¡Ueƒ³›•úÌ[!æhe:okþ°ˆï½Œ‹òàà¾ä¾ƒƒ²ðæÑŠŠ¼5/³LÏe·{Y¦7*Ï{ò½}Âg>Z­n¨×_ ÄgÞËò¼ßoׇk–Y¯u›®K÷!ËnÏr:Gðqä ):‰îB/@¯BOç´÷xHK“ŠD]¯ŒsFù¤šdSbÕy•Ô\ý %Ì~¤ÝÇèf3M8±øhfÁ¨²iBn•GúU2y)Oá’®»!v*j*7MrXfY· øÆ|yYKí8v©¾/I[Û¼“­¬ì››'Òhåرù9¬y”zÃvÇ05bÛ²å¹ óÓ›Ín·ßÕ4Ãl·»=Ó0.«šÊõ@Õ4®}…QYaTÓ3 ¦ÉX³‘XT²gÿêØÝÎâñ›&ŽcYc× =×±ÈóÅ%òž…Zñ~q¡^û>ZP¸í`fÛÝîÀc’›/.Šš:û…Ža¨j£Þj†¬Ôk¥D uJ¨êæ %²âÇù£Ñ³HGõ+¤È¸AË ¥'ÀO péœý:ÌÍï­b¼¶vÇü±b±×Õõ^w©Øû‰½ù9¸cm ãUíõ÷¯Þ½¿otö9h·Ò¹ñx.mµá¶þÞ±‹µ÷÷ᄎ tôKp_DWPŒ5Úw؉'¤ì—ÕP‚’jÈa·|ò1iVàËRÀAÐív»ÝñhC׳¹ùfÐî´;a9„bqEƒXÞˆú¦X„šÖÝÔtUÁ`[ΊEý>áÔjiºü¦‰mSª*°=ˆ4C»+¾W†Lò`Û²k{“e¼åüÅ¥­‚Cx' Åø›æ½`˜s*§J«ᜯØǯ¬®a\«(H†Ç?÷úagîä$Vìž27·VÎ¥Ú¢ÚlÓVK†‹ýÙÁ3­Àå‹JÇ»!‚¬£ëð¯p qä£BOcÁsO0΀î§4‰+žW××Vï}<½û=±F+ŽÁqj{W½ ù;ÞñßwÀ…7ã(n5 ;©9οãyt>ù«ðWð܆çÅOΪxà0q;ðWx÷Øý×ÅCÇöGëëK‹/.Ë:Ë$ÏüýáçïíáQ^6Þ9¶@ÉüÂÉý¥%lÊÜÛ»ìÖ’®…@F1–ÜîǪԃÇÎYÈ]n%UŒ§P%@9ŒpsÇ3Aõ‹~Q`,”Š+VƤ]óä,%ÎU Œ…Å·$ìå±b5˜$0WW“!Æ¡Ä'ìnצ”R?Ž}J)•`ßNvðBðcò«²™ÐB Ÿw¿¨’ß¾ ²JÒ*æq°¯clm*צƒ_´¦¯,‡ƒ&¥A’”RÉŽúŽDïÄõÆ5Ëwš·n³†qí{1ë=h©Iåm—5yç­­-ïI8(‡šÕf¬ŽñÜÜæÖÜ©3Ö~˜J®+QJM“Ò²Žq½†e®5q]ã2®ÕñWÜ^‹>£6ðEC“¹Ì5Ë`ZÀ®’††ëuKVÛm€v{Q‘íZ_üÏ¡ÚDuûÌ‹h~‘¡(«žoV<-Ú^¬ã‹êû ™û_hIÆml§;ƒu°€ ìvÃ"íXúâ86¬«@Ú>öóz¾±}eÅ°ŸHž¾0è U lx¥!0³;ÒÔ‘ `ûœ0‹/Á ÐBÃ)/¢­Ü‚< ÀÄÑßÕøòS.Þ9m€ÿ„^o4îõ šž§¾üÍ8ǽîhÔëa\«ãËë$d®k\þÒIõÆop·7:iÛ§j¸¬^·­Á¨ÓèvV¾»†qíÄšæšÛÛ«%Fh!H 0ÛaÿP“ØQÌQµ8êš ^t1ân€1A-GܶϘ+u°¬3–õ$]°>{øyâUwÊ.°á1ɘ.c,H•’dlö^ ?kJ´HÆô#¸1¤ùÏGJÑ’L‹ƒ¼ˆÛ^óf˜ÝI9k/ØqA•q‘æA\yçÏ?w»0þüÓOŸïvÿîüù§ŸÎ»ÝWN§Ó)øŸùß3o¼zõŸiÍÿÛ¯^oÍÿÛgÞxõê‹óüÌg>ƒ$„Ž®3MÔBÚG·#äyTùQ !¸'|:·ZÂ`â8¸oTE˜‹iš%© –UYüŠ¢çš¡(…Ƙf(f×oü¸©Öü÷yü„ë÷\gyªÛß]IbFØ™V/À±5èqªiö>=NASmGÕ¾Ëõý~ý „¢‰”_Us©Þò°@–ôv%P”ÇÑŽzá]À-G9…s‡sóGΟ9u>æ8QSf˜¯©V-€f*R¾HtÆn ¡”´MLTX3­2^*ߘ»mµ±Í˜¦ëPU¨Ræ!ÀßÁ©«7ÙX€?àUÓ¡T²„qdTmµ8›½¥„G§µéf»Úf;çE°k¹Yn’jÃú¨¼9AÙÔCì±—]JªBÁñíQ»¨Í$‘µòÀ In åsG.çaàT,˜”"$º7ê?Ä¥VUºJk’ kÆy&㔥‘¦÷}×ÅÆÀåAà b–1"âZ*ù%®Æ RßõTšg®Ð,òhµ‚  dÀ8À¦a „6qOÇDY‡ö؃­bt‘’h…Æý F€¸%¥>²ñ Ž—Á‘% ©%€òeiΔìÅIk’žR¶y`? àü³ª Nn«B˜TIð~.…ðÀ¹å9ù^Hî1cÀƒ‹”Ź’±PJŒ7ͼ^¾jx¡•&ð¥¤T»mJk] ^zºs2ôC¥‚”ÄIë¸ËZ_}¬>໯3Œ|ªÁ ·ð­¸åŒkΣÎ;Y¤cÁ=óFg-¾8QçNêÙb~ôÝÎ&7§5Û‚îf³1?×€„]8—Á¨îßÝÚË9Ð]®Èràû¾"˳LËbŒ½Îuš ×uÝFÓq­ý«ãÜ„a@»é‰úl«Ê4KF¨ktðÐimiÏjvL J!.µ1ÎbŠ75‚@Çz¸$õD}¢aU>ú…1É츞+˲칞+·MÃd¿s’¼¼Ø W¡Vëu€F=¹<¯Uw\éÊéÓçÁšcØN­>ýBÝÓ C÷\C× ÷NË0™Î¹âzžÇe™;:c’ 'À0ýïøVÖkµú0©×W;ž`Zbø­ÃÚ¶o€c×ëÀѧ¨×m,ÐuÏÓuø²Ÿó(CgÑÖˆ¥%Ñš%-‹CÑg[Æ5¸Õx)ÂçpRr9~]«Á£ 3ð!&Š¢`Ô}{k³T±Ñä`¼³»ƒ1¥.¶ýšè>xVÃN—³µ[n> ±°U«ÊbQâ‹­¿#gï¡M‰ê`ZؤR—&ìh)Š®-1J–¹áÂÚ㲋q[×kÌÉžw»pˆy8IdqQ¥q‘Д–åìÞÏïüNc‰Hpõ*¿üQs‘Hp?<ð¬z \Ä ®~Aù6uf-„L„Pà&{P™9ÚEgÑè ôfô>ôIôôsè7ª÷ã¨H«iUpá &C&.xŸ|òƒq]!âR/]õU:¿¢‰ ÚÀ`DE•NS‡¹/ŒL_d§‘Vt<à;vcl/ÀR÷„ÉüõðàýEYTi2p>á#Rô‹ŸdŒRÆ( ÅH’€ÖEÄEÿ,Iƒ$®a` 0Î× c„pNf’”sú/SŒ;“eJi3ðÑ^€ !@žd;F ^f›,Mª–Aþý( Â0šý®Á¿ç”+¥ 1 X³”ó;äðØ JO#dYzì '“jÒëŽKÒñ×I÷’8&$ŽIxm•àµ5 9¾GÈÞq‚ÉÉã”?Iž„›yi¦ð¹^O–w?/a KøÖÔÁÂ׿[‚½í¸$ÛVÅP1ÿoCFýPÀ&ð·ãüØ[8ÈÀÞµÏØþ»PþÌ>`ûÏp„„Žþà#h‚Ð0`1ã”cRpŒé°&F4™Åã< EXÁA«ÖIÏV¯×Ü›Ìn7Yì'AÐld«a€±A„°8@³ñpXþä”m,.j†Éƒ³ç^ÿâ“'——vü$Í&½à~q¡…!ðÛ+“ÍfSG2BG‡˜'p ÔB½1Ò‰F(GÒÌ,Ãì@¹ÓžqÀÓŠ ^ˆ´AL°aQ ^¥Uÿñ7ºþ7ª:5ØõOž½géž³ŸüñªúñOž½'…ÞGeù£Lÿ¨Æ?*ËåÚGuvß‹òGÙÉ_ôÑáðÆ¿xQ¾óÈ3ÓétúÌoÚo³%„ð: 1ºŠ¾;ç“„\TYA™ÁÄcâ³Î-,Ò‘ÓJŠ”^Z)!ÇJÒF¯E3zZK-ªfŽh°—wSm—+È;Íeÿ@ƒÃ̼¹ùl2ž¯a x%M™ÔÑ4Mk·†q¤iQt×]s¶¢Xv´–6·ê5’Î¥sd¿eªJÛ¤<ŠŒ%J¥`n2´EUkß.yn½îÙm[z·]“y½Ö$˜R.1É à(î%5zž§š&jcBBI/¯éýM™ä»y»-ц˜ðZí±DE¿?ˆÃ@M¤Ã~ßÿX ›½^Ïçöœ>`"Ï… EIÓM ’[j–àX¡cYJ؆¦„PB Q|.3î¹8ðÃn»aé’ä5ÂqcJ$I’–%Ò¾ ÿ Ï¡Ç’’4KÒ,©Êª¬¦Ù$`œq&ÜV㬼¬ü$Nukƒ1¤—®ÀI)¸é±ï1cg9¬ÓÅBBÁ9}dAÆNU«½.àN§†’´RÏ÷ù4åæ2(Ž‹Ûž®«*,-™”‚fÙÐtà Äw|ß²*†eÅæ {ûÏ_…(^[;¹9è`0É'7Úm?OÕzªi‚ð\È'Âó°«©ÐSL ‹á°`P$i!…úÊò•'Ç!¡qn¾‰ºhm¡3èô:ôtÈ#î š³©’tZ¥~€A(*·>Ë©4SQZQVi™ëˆ:EYAʸ`@: ¬Y–ÍZ'º²{ “‘òPð0`\ì9™p¨f•¤ÕSCJXËøã/x(* º¨¬Rè9ÎÆxܱÍÛ–þV(  &Û €†-³kÛs®¦ØñxÃq¤—¹sÛÔÞf/(ݹmiuu`ÒG‡n¯(ööŠ‚ ™3¿OjËL¨ ó¬|¹n箲KÈ®âævÝ0LÓ0êÖÔUv ÙUÜ©U~ÿÀ[‰GZ­±böŠQ›ýou»-î˜j¶¾ž)–ó-ÆŠm˜Ê¨Ý"©ÁšµlÔ6k³ôÙ¿Ø+E/B{¤˜Æ›ž7VKüá|óyªét(ÛRFëÙç%wÉoM×õ°á/¹Ò>!ûå¡®ëš8à}y2n£¡U&ï6:ËØôŠM“´ÜdL”Å4:)Éà^Æ‘0‹ˆú&X›‡ëNÔ“´i´1óañ ¯O M³"/âqÆŠi3Lò’?œáCš"d[¶m°Vê5;h6*o¹ÿ§0ÂØfa»E°/@7Éþqß[à\V\Ç2dqɦ„cÐÓñ–Ä àî1j¼$Üú:¿:2•B™=…}ÏÇoM”¾CN†+LæIKõô!ÏJ7G-%€ƶbƒ'I¼>#&î“ÈlaŒ•8kCÊÞ.à7öÇWX:Î ÿƒ¼×Ùs.:÷8/w^ç¼×qÒJ¤*ʉ‹+ xôH©ªõ”o‘\¬Z)ÄdFIUn4ÉìEsšU.We^ÏêíjY^¶Lm-¶ÕLÅ®¹Êò¬ÌšU^åsÌ‚aÿèEùpÐ*Ac$Æ‚Ò­VófÂpx›ëù £—'Dþô*µ;í6Á&ÁÔ÷±êmL§m´ÑÏUÜ#ƘJ<]Ývv€ö§;Q!Ê®ç³Ø…3b¾?ÀD%Éîq»ÖMLÜnù>î®­% ç 0šõ|ö#)= cæó(Žãˆã8¦W"ñnAÄÁÆߣÙè_°SU;øÛ¢°z°Ã¢p\z9gØ{¤u·sœ>Š[14Yž3rœ4Çã7˜/JÓMW;8Ê•rpëüZþ'Ǧ×2Æ8cÖíWãùók¸õËÛ×¼öëNËÒJmµ)Šæ‡œö ·ðÚ\ ÁíŽÃT ã•ž™T X%%9ÒpE#Ii— í)bVßíûL÷º[7 Ge‚zÝÁ²ÕRï¹vpà{]íz¢pÝjgu±žÚ­Y½ N»=ÐÉÉ]ó^ùÐCM¯Õ"Dak„Éæž»ŸÂÇh:=m_Êàäøh0êúâñx†–|_¸Y¶·»¾ëä„x~$õ ·ð“¸åÜ“ïý‡»AâI)„š_€¿É´¤N‹è¦¥Ã¹D*«ð#ÊZc|¯Æ —ÃÑÎNšî쌆’'qØñ|c¬U‘TÚrÁêÙã/®k&¸ÕJF=ßó}´º½BãIDž1¢èu[ð}Ï/[ë,ËZÖ{úì ÑÙÙ3žmeY¶n•WÕÈᣴâ^“¬ó€óŒóz6A*\((J¥ñ— ª_×õªBк¢”JÌpá¶Ù®ÈºÚÔk®\•”€Ï´&h¶÷<Ú4D÷§· Ùë#éøø®×•@éi0ûÇœ÷…®1Ƹ- …o£ùü¶»‰Žïîö@Ûp&øS-¤ºÊ7þ·Eháòl:>¾ëáÕ¥ 4¿qpˆ ÊR¹®’óÉÇÊßx¹Þ%Ú­/_ÞÝ%hôçe¯?nI©•”'ôº¦8áþnÅý6žu>Á‹ªp"Z±*… ƒ-U|ºKÓÕÙp]ùÍ"’Worq(Wnú7øÍ–ß‚…¬“j’«M„ðѼr¼UùϪÞöîÄIw¾¬Hí¸o’ðýôüë2ß'¹RÈîCYGÝ.ãÝîhÇ鋺Ro8ß­;œMb¦3ÎÛõìÄèÎfqÔjG‘îè&ZQ\=Í%1ÛüW¢‚G.•;­îÞ?BßÛÙ^¯ ×íÂŽï…ÁþÁ];;ž’*msFí€kãå/¶] :ù½ÞLë…[øG^–‘Èi9ª|UWùªVñ*oVM¢R›*ãóg³7Ôõ·¿â¯xàë¸ý lðÔ[Þò–ßæü'žyæ;àü×{®]C’ç¥q Ÿž£¨céÜæ<æ8 3DÇKY(7˜«©Ú“eQ6RTÛ fJ–á•Xê[OY<€í€^G^>¼: Dotµ&pcÍáÎ5 ~àÝ«@úË/Ikõ$åœÛ×Gƨ÷'cm­¼¢ŽÞh¹àç¿h¯sÔ¶·Yè0&¥=ܳœóµ4¤²ŸIá>¢­+ßò2M¤zµ5–M¸ë…Ÿ»ÛWóLèy|À¬±ÿQ«<à<ùˆU ¢íã¼ðçø |›³ã<ä8M˽–Ê0Û¤ÛfÙÄ–ÃD²¦éëä$¡¤’,WÅ”hÝ’xÆSM=«?8œØ}Þ% ÎZíüP›8ÞÙYynøü˜L'ÕtÖWÂ"p¯Œ˜eR¢ílæ Îó¯u»½^' xxGL2›Ÿ9ˆóä}ŒÇñº(D((ÄÖL0‹€Fc«Y¯Û:ãH>ºÏqëˆêhˆ œ§?K™N “òŠ‰Ç—à¿ÆU’.æÿo™’ôcU[÷TÝ$<¾ªIÛíGuÏëKò¸HSþB5IÖžø?ª]‘Ág7¸:ãÐcWnÈÇsÃaõ’팳¾„BŸ¨Û,y<´ý=zW^»}eg1¥¦dîBÍ,Þ]Ÿ«Ï½- Aø*•ôZÇõ4]8WGbv»ç¹ðL¯k±ÍJ` »Ž,;6–$ÉøÀìšoªòþïGN›@˜ö¦|dÒpU}¦Y³U•©ŠL‰LbÀ4k“€ùvP*)²½ ):úÞ…Ç—'P]D£oCïBA?‚~ý9úP „X…Ópî·Á‡áÓþŠ¯†Cøʱùãy‹¢61^ƒI€â?”ŸE+Æ+¢lœ%Ù4›fÓ|œM³qþ˜•M‚q6ø8Ï–¼‹qeq™ÈSÏ7NK碞$2bß«/ˆ¦£ÓÏfÂlÕñ7ÀéÌÇù¯»®ì» Rè7ÚE«ß€.zàûÎìè`·¾´W5ØV{—ê]|t³ÙlÞ‹@If¤Ðšy.i0ß’>Ò\Ç@¬¹Þ%_RJ¦] ò4 ”dÆu±Óùfù¾ÖÚð ël¸ž‰};xI+c„ æJ¥¸u]Às WJÞÐÊu×UzBB0­ç´«•k‰\Wj $ñ 9æ  pìÖ÷«Ï÷¼iµ±ÞŬ’&aÝúš´AÁa;xâ÷Ÿº2Gû%wk”óÛn?)Au}éM‡×®]»vø@h%øTð<çBðeÀ’„¤˜v<Ž·ãɺ\p) Ö(’±r]û`~ HBδ€*¸æÓ\¤ÍH(Éxr¦¤`d®9Bδ˜Bði®Òaª9–´Ö÷ ¯¹ÔKû ü4Î看‡.Õ5!awaqa¡+ [GHoƒó9j¡e´†vÑyôz-z¦Ýˆ¾¡áÔ„}à"#zOrp¦u|.â4â4§L´N§¢Êy<‚ 's¿L kMA ~Òn‡5/­ÂœÇ¼Cæ2žÇE,~&Ëjh0ÓË–$YrÓ½E`˜þ¥¶i‚×ðCl¯.·[­öò‰0trœz†ažA2Èl+XÐZ‚Nî;…^í>7lÛ¶¬È2 Œ}ßR™þ°¾®ƒ¦‰ã¶ ß æìÉ{¯Ü¾½ãθE©Ååÿôºñ= )wóÛP×£q¿ÞtÍÐ<_U/’grz†Á<“sÏgÜôTM¯×t]Ý“ÎmG’ MÌ™$;‚ROUóºæZºçgÿc‚õ»]ý^^2E×eÄ:ºŽù”é,n¹ýVtº¡°âT¬ƒf'™Æ<òJ侩µþ!hÑûVAZIyïrFVñ8 â">“†3dº#ñxžŽßˆ¾79Îý­sç÷~¹ÛÛn‰ÞôÀ³‹Ùþ~>¿?ž/\MÓÙ¿]xÅ+.Üz럣a²Õëm¦¿¸§/nç»KzßO½^Wù;Ç»»_ùž8ß4à©•S7ŒF§O¯ì_X˜¿¥ÿŽ¾è…ùàƒ¾ãÊ•wíÓÕÓyø4ÈóüûÛN·oÛ¹Àr[±í^Ëõ<·Å„P†œCçªRŸ3%€­ €1OPƒ lzzxž,¢2¨Gæ}§MëéêO¼À»žAØZð\“HzßXõû€»½Tbs tC½s¡ÓÅø¤ÂÛŽ°¹†*%N§}îX?¯Éêµ[slY¸^[(Cív®›‹í6€ç-eŽÃ0È. øYž;Þp3Yö{¾ß×´Ý$49ù&Œ #„ŠSÔ>Ÿ„%ÏE¢„¥^cXlYD¾9Jl˜t{ºÁOÍ]`¸š6ˈÆÜö»FA ¬hzÃ5L]÷BÝÐ-«{ÃùÌu5Œ¹a¶†šæHÒ€ï5ÖØ7ë!¡µ‹ƒ‰p` þ<¸nS–{® ¦5,Tzýø¥+DmÞEóÞoH¬&m]ƒ1à9PMë´4Sí®¾Šà94@'Ñ­AŒ3p_4×=¹‰ÍNSÐò*7ÎíÝ/«$í'q*É>ã¡è‡ÁˆÜÚñ£ûÍ­s¦¥;,!ÆaaƽxmõÒÚÊJ¢¨³¯³nÎþ*Øìk_ 1'f w|~ÁLuë‡!.{4î½´º†¡Õá0Ä¢þë¡: ŽCËG‡ðn8DÛèô0z%úúC„Ø!¤|ì<¶"$,ã”–UÑó»¿Áön¸mÄ‚´Jåªdv!‰>­h˜C•¡ W¢c!½Qs%ןøð;Çi¥“|’ÃÆ2Í¢ Ñ“^ÈÜÇÂ3ž†"›èDZp'Ó´t ÿ׫ÀsÓ”%$Ã0MÒ–ë"=FÖ¦A’ÂÑѽO­–€u«Š¹Ö÷c\W`2þ^!¬MˆeÒµFƒÂ0².Œ—$A¨”üÐáõ£É8öŒ ”ç».˜1JYm¥Ó$Ë\—BS‚žŸxaè!b,évò`Ì‹{½NÇ·ŒŒí¾Ò¸\¸†qà?ÅÃápgAjwÆ“¶§/êz4"aÑ9:œ(É8JƒO/2ºpúä¸Ó¶oôÚ-Fíà _vYIåºG¯ˆûý~/ú0•e§­-!KËÒ“Já§e¹?Nb ŒâXi(š ʲ0|?ÌÓ„“ïy~‘¦žáÂM £3É8SÒ5ýÁt:útF0ÖXÆÇq˜ã¼ðQÜÂósZÎÈqÒ²ºŠ8 îáuQ±US®>zðøÁG;“‡÷úËo¾ü™·¶žÁÞóÏߥré8ÿìŸÿÁ3ÏèO¶9xá#´Ä;{GœW;oqÞæ¼ÇùTç3Ïw¾ÜùjçÎw:ßï|Ðù çç_sþ£ó»Î;ÿè8Óz»™ ª$¨fÕDRª¬Tí!ŒƒÔb­° ,øŤÊiWÍ ó²š¦ÕÇÙIR)̓"NŠqV§ÑÊbœM‹jR‰ HËb¼¼xH‚§UÀE\ \T‚Ç©’$¼§<­RžVyŠ²ÊyšóªÌ/‚Jð´æ6ˆ ‘Œ Èyœ')¾çWœñ4ç;ó*®„Ï MÞù˜ ÆNs Æ*€É¥Ç%Î¥Ç)71¬Ê¥ UÚtðy”›É½/Û¡ÒÔÙ‹–––`9À«0¥$_ÁKKKpâÝûT 5¸pË…[ØÍÇÙ«œoÅxßáÅÊ·®}}%eŒÞôÞüѧ /77ož Î;Ïã„ÀwÂk)cô¾»’»{ÅpÇ‹\ÃãاìUñ üÚm„ø^LL`Œ10 ¾ªw]£÷`¢“+„˜ Iã;ˆŽÉ=D×Éoœ9sÃ8ß)îÅã;ðô®‡G”‚}úë¦Í¾ÿaø)]×._¼ý<;ªåÀàA ô¡Û_…_¾µIhY2 ¥êæpçÒâ…«IræöåËîÆw€;î¡ôž{tp×…pkëDà~þ}á÷Ü ©«#ïè>e›i‚¸/‡@¯ïp˜Ïj‘ê=1œú½”ðBgúgi½ÊŒË7Ÿ1òëp;4›éŸ'‚Ë÷z |âÑÙσ¢ïXwü•…ÿñÉþácÈDM4‡ „ìg~Y±^ó†?Ô«¤˜–U(üLRKÏ3Æ Ý™äÛõÚÕ'bxKÐ|á­·F^#:þEVmŽGý•´(M¿CõGÏœ‰›øØîå·6Û“¼Ó68qòîkzñù[_Ø ^táBôÉr?Ë6yÝ7WËwušñ¹³iôòÞ^Œ²¬¯á˜wÌ£]„@ÄzÄ$ã^YMDY9÷š(¾¹µ^Y¥3y)Iâdpcˆÿ.}ÍŸ®àõ–¶:­ö;Nwy´µ0·ñ¥aºº¹¸¸¹:í aaûÔZ–­Ú^XŒ²éÆÒÒÆ4‹ân7YV“n7†[ÿÚ-™€]X\€ÙgìÌÏC͆«ànC4ûîe¨¦ÌþÊR”v[Q,„„ØÑuü ¸†b4F[èFtBòH¬›œÒþ»âä•ACÇçÇçCŠ /nQ<ŸÚXZ¶jݨé»à(žÂk¦q„¡Q_˜}]c³kà+`vM˜è¹cÉG߆ö¹Þ6ðoºÞ©ñC¯ùµZ¬éV§3˜Æ1@Oû}í{ Œ'MŒÍ' Œ7˜æ Œï6Ìï606¾ibl~¡¡£ŸCøQDG8Èãq„Ó‹^”åUhí }t E÷ ÷   £ïA?„>ƒžE_F?‚~ý4úyôK-yâwСo"TìUZá)«>Ì£Ü#Vºcã ¯>«²«ÁÄZßåÀ ñõõ²Ê#`tìÆI9Üë6ei•yCÓ4áãvÏÒ8È¥¼ˆ‡qGTá©Ó¯C¿è9ÉX¹È“-€ÃZgΫå|¦å>إݸK;?@»Òww¤Î«º´ók´+”:ôvÚ¥¿Õï¢hEÏôû÷ÌœÁ=ýþÛ£höqM;E'E¤ý`ÛbÒP‡üt ¶m‡.Æ20USd Ù\wm°íØ@YôçN]E1Óz¹¦ÁeM›ý¦ü'íŸýIxãìðÆÙ»5MÓ^ÜïSÓ4íóýþç5MÓ^ßï£è‚ÖQ”˜ªÙ2Tƒª¦ºlªæ‚¡˜cÕP»ª©&Š¡Â-ªªªûÌ~?úM‹~…þ ŸúίÓ.ç €Í !Da@¢Ç8€á*„¬Ê•ÜKѧ¢Å>Ü:{üþûáý³W_¾ æì_`qcãu}µÿÝÚûjÿ6m¯ÿÝѧ4M‘¦i(·ÃI)Bðp€jhm"<÷IûÙßtƒ—á„…`µZž8#¸UǾù¸&ó–¹öxà:üT“Úì‹-¾¾£Õò<ÏkýÖ¤Z°98¹67§q×f_¨a\ƒ35<ûCðÜv+Õmµñï)C^ß/¢ø^…Á±8$Iäø´k>'Ráqäl‹»ã–”‹<–¾Ï÷ùôöãè÷'Û ƒxa~³j5¡Õ^ë÷ûMLYÆXo~nawi ã…Ž²qÚ Æ™mÛöŠeh²é5òט^Òv=M¦*ó›ÍöVš¸î¨×ƒ—æÝàd˜‡CŒ»½ù…ntÍÃDÅ 2Τ–íÌ¥ÇöæçÏÏO—z=L¢~a$0EQ'½.€¢*@“Y¨i8n©šíÎ!ý<ÀWЄ< /UL×´ƒ&Ò?8ée((¹~ö2·¬gìƒô·#þå[6·ŸSʘħéÖ´ßPdß<ÃÄš D(°*qMQLçíišJ$Õ÷ü"ŠÓà+ãÑÅ¢ÕÓà’¬¦·=LZ­¢MÐu¿Õjµû2wìùF-lÌ/,ÆAÀe d¡Ù\6]WQ Ý^^YZB¡£ëpÈÍ8XAOqŸW/jŠWa©§j‡©ðªJÄA¿Äø®¤7q®C°ÍTÅ GfGvp/ó‘Äðê½;·'“NÚÝ—dkÛ“¼Ó×é},_ä'=Ú\LÏ)+LŠâÜC’iJ\¢#T®¹®E¹$çûΠ3 $Ɣܬƒ€¢©^K¦¥+ºNy Û îÙhw&“íÍüEÝæì×Úå¹¹Þ쇠NÝã|¹87- ,Ïœ+¦ø­„3,q‰sÂ$Í4›ŒQS’@‘UYÒ pªižïØ@i6=`Œ9WC‰`@¸Yú ,»‰Ä©bÎøbäÎváð·ÎõW8Ó—ã³m¿¯½GèÝwšFóÎwÞ}ª!tôkx>‡¾ý ú úyô›èOÐ?€=Èa^o…kð9øYøøø7,ã^Àë Kž¤%OÒiñ„O‹É™ú­ˆxÄ£4‰ËªÅäÄä>ÎýSÛã»B0~T8ÊƵü`"Bñˆ' <…"̃„'q0žˆÏŒõê¡hNGP’ ð¸ZÇÁå†2´ÉÑ$g’G*ó y¢qÒ ý” ur½‹ñ ›Lb.ÜüÞ tšß3iì™Êš(›äœÑy!ýö< ƒ§²qÛxYe“âÚøåyX…U™‡Uè!ÆÜšG0ᚺ67ÎTÇJr9áI’øãœEG’J,õ³Bm¨`Õ r-ÏýâÇ3æÿ:žH–RŸUA_½ãq5 ã]@…*æ:x3'‡§d —M'¥Òômo)–ĨÅÆ$K×,K"„»D׈-™jG®8–e) ÁX"!]¥4 e'ìnoܸ$E§ÜÝ)\Oq–&s(- ÆBFa¬­½?”«€<µC×$BJ£B.EhjµZ½ð{¿7ìµZ-à^"Ï0Ñ¡R fbƘղårÆ¥`ž”çOƒ1íÔ†”¤¶Œ±ØÌ¥’ž¥"þ¡Q‘y19£wHáY@H[€Û(2 @¯c+@IâºC’Ò‘|ÇsAÂÄ“Iê9ÏKP(fÂPK© ªº^žÌfc_äÜuƒ0Žm«L]c À¹ËI0€Óþéé’xä¾as9Nˆòü¬±›KN‡&îr„ôÇaè{Ƹi«üÞn÷ûÁ§çÄ1ÁX߸.RºT!¨,:(Š=F­¿„TÚ•ÄHikv¥äÂu­g (ŽƒB#á+%áZÝ ¹–‘ÜÌXkLb½LºÂ€‘&¸qÃ0|_ Æ4cžl§uÀy#ÏØ!jh‚ûÄ4c<3“}ýï»yÄ +Üpœ“ið¸Ð±Ô<²¦TJYRš¶…<ÆE¦ô•‚ˆsÍã8ö ”I’ãaa¢ÈZ׿ìqðâ8f&@¿†Áø[‹|4Î  ÈÇ£¼øÁ I”*ƒHF1cœG¡Ü2ÁÓÔÀd9_~i#t…CVJf.@¤däÚbŒíôzaÔíURý€¯5\¶â˜‰0J¿‘gÄ™DŒp4Š½Ö5)q¬$ m6öÉðˆp©HPžuÛ2´.¬IÒ0â<Ž[ø” Tª·séüÇ(ð#8cZkëÚ²žï%œ‡8ÂÿŒ“t…R ­ÕmÖµZkƸ0Ð>””®$΄Қæ8/ü }¾Ó‰Ê¹Ýq¦™ZÈjRÏ6ëFÉÐÈëI‡*> YmÒðcvly6¬ð]¾Ÿf¾ïûYêûçî ,{ÝaçýO<¾\ÖBúÃÁ½÷|é'ÍfAPM;ûÓ»†ÃIõéjs¼~Ù$¥òb_›Þ`e  ìt&ÕÞlxqºÇ<Ü$öéáç²sóRç=ÎWæª*(s›gv‡&WL¬(õ¹u.09úYCHU´ªÞÔ‘¢K‚^CŠØYWVu‰-âÔz²úøÓ—/3vùòÓÓE^noo¯×…N4h0 èwìc}<¢ÿ2?n87_Šhù—RlmZ[…]Àµõz8×ëks‡àýGþä§/_fŸ{2t{{] èîžþ¿O ¿Eï€è½_ø¹œ.ø<·Cc†6­µ6D÷_†(î|ò?žR¯ã_Y(v¦ÎEçaç Χ;Ît³\-«ùè@ÏÓ.Ák.ª“*Ù\&€]STY9ˆps:­f[Ï6¶ié5'—ÍƯ'cSÎêÍv3«·‡¢³Î >Øàqî+»Æíù*à >à?¿„wŠßu$E¯ßkåÎ|áGdzY¯ ô{³z0›Lˆ&ãú'Y5 Šï´¯|Jây¿9b~@9* Áî¾kN³AO‚Ði/‚X„ÑÎ, ¡{©u-EÚ{ºÏ [}ÂM\ª~uð€]©L“ùj#Ñ85Ä*àW·•JªÝ·\-–÷Ý»\-—÷îŽîs©>zh8s½Ã›ñ_E¿òÌÃMCÔ4?óðÅKÔëmðÖ½Þ·\Ðù?ú½îÎN¯ç}ä#^¯·³Óíù¸Û&ÿ*9–¶Û‡ž\o€M{øôöbq±^,…d m ËèQ„·tL~M ÐÞã MìûÉW æ õ¯ÐTqÙ5þƒMºô$ØówêôeEÁ}™»¡Ò¡¶Õñ ‚E­¶â¿cñC²‹-»ç7j¢¶â?szuµ×èG««Ç÷VW£ ×[]=uy} Ãêê·­­a²±yë_;&!K®¡C`©¦ ز²EÇ…c’_Ÿ Ù6Þº_ƒ(Z]Ý?¹ºÚïA¯[­Þxrµê÷a¶EÖÖ/ßØ xmí¶«euO"1d`/òÑŽ¡Jð´ÊÞÖ¬ÒÐ7²d$Ï>òȳÏ.7¼ƒƒéÙú‡y¤~vzpà5–Ÿ}ö÷yøÙg—ëÞÁA~¶ñ¡‡iœ™xõågŸÍ+)G_…ÿƸÀ=w,›E¢sxF’K&¹Û¨hm8²ì5¯‰kúٳ͢vî¦ßnéÙ›^ýj Š“¼å5¯Ô´³gEýÜMø#»vö¦×¼ÄŽa=WääMèªÞ©Ñ…ðÙ5Î8º»½†õ’Dê#‡žìDÚEÈ6„Ó Z×¼ ^÷‚3c¶euWÎX¶Å¸©¨nà×ëA]QUÉ2}¨×—–uß2™¢*õǃaU xúp{pw4'{¡ÁÎX–͘Þ]9ȶ)Z£ëcÆ Ë0\J6tŒu[Õ]ð~¹†Ãª †ƒªéº®Û$ö£ì0ÄšÖN®7ï[îÅ¥ëµxèž!P]Kˆ/ª½F»…“GZH¤á°OiVåkm:Êô9Ð4ÇqÑåô嶢í×@ˆ(²+á˛㧉¢¶ÕjY¶¡(„1f¶­¾Í˜¦ëÖ¸íYº¡ ݲ ‹1Ö¡~µšæÜ×t¯¸ïŸ$Ý)c¢à?~d‚eM–U™RÐ}›K–¡kã–¯é†5ÖRY•e xæ ´Å¯€÷™¡®Ü †!b­RKUó³­rMõçŒÃgïrtÚ›\Èë´AלïRu]„s cÞM²ªvÜvËí©ŠbÈ VÔTÄp ëΛ6ã.²ßäjúì_e9U[¹Ì;n«éô¸ŒÙP4mÄ8ÿ‚àíèù¢(n ‰Ê·zŨNҿó×Í¢MÁ±IšðU°¸—Å´4fÕK oýË‘áƒyK±›ƒA×<ïz½pñ`«¡¾Ëvl‰ëšUBã†nxšâºÎdǶÞn©*34Íl[3¦ÐÛbÃ`ƒ˜¦%s†_ÁmK9€gt’øÃÝ Nýd<ØÞ8ë… ¡@ˆD PÛl6û«eQ3…hÄ¡¿Ün6 R0 `Ìh‹zKí÷mB)1pç•J·Û÷,“BÃa L|¥ªƒ•¼YŒÚhm¡Ñô0zzzº†>‰~}ý2ú[¿ÇÃ>—jNµh“Ü,Ü*–%UZ•wž†Pà0©Ò,ë­µ.ÿ›l¹Ö¨xVv!ä+hVy( µhuvó^ñRd!¯²›ûò“j3¬ƒ0-+BÅ,y3YØ…lÿ\wu•m8›ò…¦ZgWœ¤Ç¾ ð’Sw 69_ÿ¨E’€”Xœ~?'œaF8Áë€s~!8`"QÌ0ÛeL“$&é”®·9Lìgno›¡@±&ÜâänN8' S‰`ØÛqÀaÿ§ÆK»þ‰žøìSŸ·•ý8ÇyQ€*yο¾DûFšEíÙ»òöBH{ÒÖÕ”_Ú©,N(Õ%&Icßþª÷sÃÞfßL0@õ˜oîlÕ&hãÙU•Š\d¿{žxê³OýQ½69áû‡9‚â³µž‰Úhí T•ÒèôæJe‘¤yؘgütøLê%DÐÓnÿ̽[Ûžððü½;:­'¾õÇQ¤œL§Û§××£Ù/BîK¦G‡§Ö¢ãºüiëäÉö:ƒár~j}=ŠàÇ Zí姗 €(^?Ø2„z}ȯá³þü|ýW)EVdI:Á8gÓ")ÆÙ¸HŠq1Ž§i1§E’}nËÆYRLI “fÓxšŽ‹q–ãt\ŒÓi:.¢bš&«‡I6N§Î0KŠ¤H§é8Æãb<‚¨g |è1¨.ä¡Z”Q|ID|Ì×È8»«d¹ãlœOªÍbÎa“ºÉZUº>È'µƒ¢=VøAhBûÂÇÙ´€ÿ,…µÜ&ðPÅeëi†¬2¦”4Ynõ÷õþ©ÂØjuÿ…½ý@ô{Ñ…Â6 €Fs~~©Ö¨7oÜXo¼¼½¼’ 1Ü qæÍî6xe0P”ÁS¸ÓY˜ïtð¯=g{žW³L(ó[íz^­¬Æ"ɧ·µÚmë¦ûÛssƒ±msYh˜@’œ\bR£ž÷‡ÃèGÒn/¨Žã›žXh4…•0­šízV¯Ù4B¡#ÑG4Ñ1Ä“q#›x÷JW ¦™s =ýžyοe–ÓìÜbªªªšëÝÅÄøܽ୪ïõ‡:·-M×ü¤¯ëð²9]{Dï $[\ˆTÕ„W™ªêÕ'«Õ&¥àô¦íÐ4™Z×[ÍnhÔe—óÀ¯wž·¦*ÖOŽÕèý"|¾„@¯DïF‡U,žìê¬b‰|%°ß&j PÆH{€SOY0ÎBâNº$µ8ÈÜ©$è/-%"±$y ‰ `dž†µÒPdaæÓ`Ò/Àzä &M")Çç2ÎÄ#€¦Bpˆugÿx£x8,8¡Ê\­àÍf`b.-õ“$­ªd™vu¬þ‹„°tÊcÇÆc É°,'“Æ.PÊ‹ù¹VSç˜Ê\—å\JþdíÔÉõ5XÇv/^8E…? $Š 1%Ê1‰I’ãÎ%—Q†1¦ŒQ—Q?ªJ!ËFójÚh´šóY»mRC0Œ¹Žë†¦ïD_H¬—–eš$ + dL”Q€I”0 ž.—nÜŸ›SU!6€REÁc¶¥I²Ì–T•ËÚì‹%¥ ç Êí“ö¹¢HÏ—0H„˜å“¸ã2ΩË( ŒI.#:Fˆ"vt¾×Ð"ZCÐ ‚ˆKêòî`t鮵@HÇp¿ 3õ2RÐHgæœ Á¤*¹ˆ‰¾X3LÊ VÏ@Üe#ëöǃŅ:³-e›&†Z}w/Žn4=7$†!ð}ãf«ùf¶¼|®XXlwt‰îÚù<Ìó“'î4•9]Q eœ2ÓÔ0P,ƒaºeJc Ú²R¯Oª P”bYò*XVøž Ý&¸×My,ËضŒÝ–꺪6bMŸÿn­Ñ$à¹5a3Œ1@- ažÚ¸Æ¹Æ=_a(•%‰a$C78»d:G×á³p ) ùü $'ÿ±¿²¾ø}pøØ¥ÙLvÒÿ'ûéaŠ*Ëßk¢“hXL4õµí\¹s'mqîZ¦+uËì6šÞT÷]7iaaÿê ɱ¾ô†výtšBÐ4ŒV`éÌ›š­¥ZŸRõùߎFÈŽíêH6 ài•æ\ ÖtÂÖÕ»vwŸÛ=f¿þbÌ~äÊ•ç._~N' É(ÐœCÂÑ’ 2#ð9Û>¨P,.ªIZÜD—)èÚÅyÉEQM`kU¾jHOi Dy•‹üYÿkY[~\[ÅÒÒë@ [p¦ézƒscÀYß‚%;Tx·Ç•¶,Ån‘缞áܨàá·bL¤zËO’apƒ¦öYƒüKðç3Ì:Ę: ¾ì8r¿¦¶Z*¢È;ºÇ+.8‰®b¬ˆ2§@,_ä£7üi¦DªépWÅŸÒg™óï!ÇuQ-ôýÃsªηnM³]Ót§¦Ý'“î­•%Z¦IiàÍ+wllbR'Ô4[³_P“ˆ²ä•ô;~E‘ÏgV§ÝéXœ3ëü± šæü›•ÐWûŽ¦iºíh:!Èo•Û“¤?¸w ëº>¸÷$I’v)Ýb?â×ÁøÙkv{ @Buš›»_󛣬ó⬇ʚéÜá b‹U°Ÿ¤CÇ&ïSÂ…ñë€^Ác ÿ kª¦™M¯È0±Q³ë¹ºªjÆCÌs[½,Òi¸ãÌ×t¯‰CB1gŲÄÐ蘚¦jTT¢W(J¤ÀÒ ¨×\šûþcä&4Ýšmƒ°¬ÀïtüÀ²QÔ¥MÝ Ë¡eã¾ëÖêA,ŒK,å‚šÑQŠJ~¾rƒ!2¨YFŽ2XÕšqX/G'5Õ>yÒVµÏ«y^3 ^¾lrrX«ÃŸÛªv£¦ÚÃU9Ÿ5Ökð_7B½6ägóÕ=„ ‰\ÔGÉ_~Q9Ý!ò=™Wy0äE•bu ÍEÆi\äÁo÷™–l%ëï ”ÁÜtù†.«ƒ½ðK_zèƒá§?~ðKŸúÔ—v¶“é4ÙþÞÐû}ôÌoÁ|’a2\DMþò Çì<’ñ×HTÉ$‚A›¸Y#¹)<]-Ô`<:uri) x’4W÷çâˆàfx®ˆ¢lדŽïƒÄMŒ›wß²Û·¬¹,+Ò^¿ÓRU&9?ÝÎÏ$)ác8]K¾?¬«<ðM/ĸÁÚày†pµÁ؆QÚÑ%ñÙ姞º|'³óïßßÿããÅrw½>øêïüÎOŸìì´;ðýVË÷ÑiïìLn»íÆá!Ñáám7n{ôâÅÇËP›Q{btúøÅ‹ŽãÇyÁÃmgmý+pî¬ Îç†s—ãÀ!êZ,žÕ•ªU]IÅûhšW›U °=WQ ñÊûÕÍŽ[¾—œuâùž—â ‰çO!Ì'œ½Å @à çÿïž{î¹ÇݾëÚï|øÃþðc×Þµ}ìU¯Â;Ï¿:õ¼9ï­ç¥ç_7Ü·\ÞqþÕÿo:½w6ûÊÃÃ{žùÓiŸ è;×|vÑë+¤\“yYyeD™8SÎòEbPÝþ¬«e=óM?ÒïC±‡;wo²Z]œçY쥵Œ¦a–FDåÎ΢b·è´P>\ÂóM³·€§§;‰~ä.&vP¯V÷oî&•`ÏyS|gg JÔs¢ð£ÁPT¯Ö’TC…ÁrPš¹  NÊJü¤¨Cž·lþ L¦A±’¦ÑõÒ¿Ógx'ô¬åBôKÆÀ¸nÛv»ì1‚ [ä Æ(B¨Èè hO[mÉxwèúB3àÀ÷÷÷%(¢²Õò8â;Æ(‡ü†Œ@¢¨Û»N¬®%°KƦJž÷HJ8ÛaH½þ83~0Ç!g„Ë{æaçuŽcd'‚|vÔP‡HêÉÞÍ÷Õ%oÙšàÀÿÄ >™«ž1)|Òí,K…W.õz› õ,K§;7i²y‘¤@ZNeᵿ,w/îÖ&âeQtâÜxÐÚZþCA |¢žë"Ç®0ñ_ G öáѶUb4<:>¸­ª ®v» ¬ Á`Œ¡n·Üm•`‡G›qàqFžV$D>{ì¶Û\FeÙžÎêLjã¹ÃöÂ-ü,n9ʹä¼Äq°˜ÕEY QäRIÕlëu]¨ñZÕ¶_–‚zOöùi¶µìcK¿KDËÀSÿ†¬{8Nb6v1›ñ· %À˜vg¾@Óéåv‹ÙÁè‘ùœ±mu2?™W{J¥iùæ MÓVn¤ðvÆãˆDÜëuËÑnQt°÷¢»[‡»ŸÔë_Þ­»?÷B“$'.ιM7÷öÈ–¹ Ú¬ï¹ûlê{ž?=Ù6Gžï{®± ¿ˆM«5qM7/Â’¨Ú™ÏkǹFêAç!Dƒ[Yyò”sNªz½Þè$Æò¢ÌTÂÉÖ[·91à¡ Eým3H²Œ0ÝïZy÷äd>ƒu–* ÃYY"M‡Ã(”I's]rqÍZ%T蹜wzYlje°Y^hx~èy®‰ü  ìÑ·UÕìèx4&åöt\¶¤?ììô]wyv»mLv9n·§iÌTo2é%&")ó0®Ÿ–3¥Òö`P”pÈñ_ømüüóÙÎ Ž3Õ³jVÏꙞ ïaa:1Q£LÒfßK*™Oj¥~uËÓpꩲh–Ϥo~³f»Z"X™j¶ÍFAÞ*‰§ZÎhi?뙑ùBoé¶_éKÎ+—«b³žFU÷"&˜ÊYH …7´6_íB¤ðߥ õ/¢I"¹»î!…â4ÊíK 3Æ ÒÉþþ$ $¤Â¯Ü}²}òÒ%¢K—ž|òÒ%ÂE«AËå}'{­¢HGívDÎÝ’1uþãƒ(¢åò¾ÝéòädŽï±»ón1]ºôäcg~¸¼í¾å’ÊAZÐqû`)¤Äùg¶«ª¾o¹¤äø®»^‡?/ÜÂÏp8È|ØyÒy¹óœóÇit¾¨ù4UÖòþ‘ge£Š_ÄjÙÔåö±Yת™Åª2Vu¬/åe³©ƒpO6¹Ô,Uz†ß8ýßu-+òtp”ø«3W^»¸ýštÏV~r4Hó‚»®ëò¢HúG±¿Õ½¾àܼ çæMûÎwþÓ»ÞõO¯yËŸ¼å-ò–Ìïºk~B!CÏý=ÜÂ÷;¥³r®:NºRš5ýˆÞ D+Ðï ¥ço7^‰†œÕ«2-ãjÛ¬âYÝꙟV?:È3dÙ¡7³¤¿$´ë¿»í 7MSÏ ÇG;aÀYï]Y>wó,ý$æê ðŽY:ø­nž#E»3ý­Y»Ó·Þ÷ÊÅ"σVªÕÊ |ïððµß„ò½çr”ó0).9Žuœn‘ƒ[Žï|¢óÙÎ×:ßæü óS·ÿ ÇqÒu³(nç晚mDÖø­«*(BÔ°š3Ï`µYíŒ ´¦»nÅy†—{@˜#UV¥@ëÈ|š©§‚ÿÊt¹ndk‡2ä žmÖ GzÏÕfõ”€¢i%¨ºA‹Þ§#kßïùXjÛl7ÜhÁãsc’l:íZ{‘1QdtJ·G“NŒ²É8Î3«¡ušŽb)%g´«jט¸]Æ p)†+ÝÈ‹„8ÿY£ÃsÈš0Ôf©ÛD­öÞ¸Ës%çýÁ¥ Q’Ò‚’”(MhCÿq,Ÿä>ÐÚß[ßsp9H’ÊÄÛù>ÚlG¬ÇIÂl«ux2Š¹XX¿“g"÷<¼NK¥¤NKŸï×u™å¹ùÆcî˱ÖOÂtU’´ZEÑêL§ý>…Z)a½JÂ("’ºÛˆ3†Ãk~P”ÙB½Ý³®ëºÁë½½ýý~H]· ×÷–/¤Dé(e”ž=O–Ž^Ïÿ¶£^lµ¾«Ý^_>Þß:LÝç…½Y}ðêýá4ÙìíAp¾ÝiÖëœ?í7œ &e<”® V.ÑL®Ê«_—‡0àäwû½8Žã^<¯Æyl÷{o'Ëøï$Œ†Í?ìTÕN¥,ÿù’8ê÷Çã~?ŠGãE1‚ }`ÝíxŒ7TÕNUå`öžwîĸI¡yÒ6Xäs¸ÀÇB.¸yª[g 4YÞÜòì8ÏÊ£Áà¨_ý£Áà¨×íöŽƒ£2I´ nLúÆQ‘†I2}^™åcëá}çäÜR“`@uM‚€ÌG  !µ8ÿL\]Ð-ì -…  )|Î8î ·ðãࣶ!jUäEíÕªY«!îÂY=Ëõ”ÏŸùbˆÍU¨ò*ð–KÔ¼"|Óî}ùg¾äÓºû£|Ç74у0>îR[]„˜N³ö®µ¸þº+Ù—-ëχ¯éùÞ¹õj Ðê?0Ivâ{Ç!G½ðQ}Xå\vœ©V%$Ž 4'«Í ¦Oš Zª"/&«Y3kä,ÿjùS(÷³qžÑ¥‹/zðâ%FÓéé…ËaQLwÓLH¼/Èóê¤ðŒÛ‰"7LÞÂØ[ÞÊâ3k-hÒ©ëÅÓ› °Ù>uÛbžea'N€4- {±PÞâHÒRà¿ ø¦«SÇqá0Ç¡3ÜtzÎЩœ×8Ÿå8©Â=ù©ö>õºI‹Åj“-´˜ô"±Y꺣ñœjΣ‘ŽÎ]6§Ý¹a6º2pHfÂ$Ž4‹@`ö»9¯ˆ8~9ŒBø~· ÆýÛpý½x)‚# ߟUZ—…Fu… R)¸µa ˜ÂX&[mcv‰q)Í•¾`<ºŽÛ|ÎDØïú>ÂhˆgCÅëLf³åª®Ç;œsí_}î%WÎÀíÖpXÅqµÓ¬g³¢`ä{½î‰6É4‰wFž âØ÷‰ZåþÞ)“F)úþc\…W^òÜU_sÎwÆu½ZÎf‡©£ï8OÄ™uƼ<Ù)êê,)#sv˜‰Öé*ÝÀ,GŒ4 !%—nr{^2²ŒÁFi†#øµ%Mè)×5Œåˆß¼³LR!ø‰a¾'›Œ'“²1×hã*­#¦ £Ë:î°žsû[¥NÂ\*Ƹ¶)ì?øý¦U³*eoéüÇ_üã–Fö§¿ÑFUéõߥçäÎÀY:—'œ¿sœ)ýÖp;D}dƒ²h€0uí±U9¯+þ£m¶õ¸¤¯Öl;S¸ÚæÖÛz¶˜,º¹žR¤0³œúž:8UMÔšÇÛ\4È1r³¨Ìd!v¾ Š™ØÎùåºüé)BØ¢{ÐàH)«µ+¥ÕÆ8’s):âæÓÝ¡”Q„Á(©Ü4‹æJI¡Œu¿x õßäÜ4³¾—¥@Э$²n칞\’ÐÊ­Á…µŠsî § •í687BÄm7²*µ€g’ r]O ŽÐó Ómµm' •W”YÆÿYk«”5ÚJéfB!„RÎ…"pÓ4M€vÝ(‘Ò=TZi%xðŽ;NOǧ O™—ꃀ3‘-$td¥ ú­$aÔ¹†ÖqE†IÜ%‚ën§ÓâÒ-[Ì´Z…`LxÖH?!b$E¬LL後ÇÝnZ©(ͬl·ª^”$~‘eJFNÝmnrÉNEFW±ÞìvúSÔÓë›åJY ªŸÏ»í³ºš”ù7V¢YÉ\ª,¹æ¬žÕËzRçÙ%Là&šjÅŸxüñ·hÕv-@Öt•&¶{íÚí·où¥) ʵ­/ôÙH¥”`-ðt\É Yº¿!5*^׳züôÎÎ s2 rxL¿½ÓÖFàúß— ©¼ƒJ“^}~qÂ…TJã—þRi%§Ñ@ˆó/ Œ±SÏh­=œ*Úœwð9矚0H©ñ9)IiÎ?õS¿è‹î¹þE/}é3Ï|‘6RU÷|#ɵÌ扒ŒƒÞö±`c£·}Ñ!'FŒ3N‚Ë‘‘’I&g¶2Ĉ™KŒ!„1þùMßÀý)Ê;øœŽ€aÉù§j)ÁSÜ4JÚN’ÿ…àâƒÎëOvœi)˜¾µ“ŠŠ®TOETX ¥ÑáÜ®³,—«ì–«íè^÷Wr½™7óÅf¶Ñ×ãg–¨6«|[âxv(ÁæÆæî Š•bQ0J¢<Í«£ |lj[Å…gB7LËΠˤb #±VÙ)Ã@I‚”‰*ðÿC} Œ1™R÷Üã®þ@ë&ɨãºyia»´IÒµRA˜µò2N’8Ϻ<‰üج@¼ 1¡q…¤L‹V7Š„$ _²6~Ù/Œf4>óÓvÕùÑ‘€Ö_ÏÊÿx=«g弎©Ìwv•… Û’õ¬,8ԓŪxYØ®Å^q~¾Û%Ç?¹ BÈó;fYÔõ, #¹‰ÇÈËËÂ÷¤Ì-@*66s‰Ü©uóB0IyĦ\ZSllæ±_A]Ï„ÅÏ£ÛÝ]éVìv»8ÿðÔºY×uÓn¤HyRæEQúà~üúÅ»õô#F¸ÄટBü~qõîtjÝÜÄÆf¾<ÝÕ9á¡ãת:תuäNup0Âq7n]¹zõÊ'Ç’ÂpðÄ•«W®¾ðXxHžÍj‡ggõŒð¼6Z»‹Å]û³ºÿ„ÖæGòÏf3ûgƒƒý3 Œ~1gã\tîtîsªö[+@-7àoû´Tu3¨û )UÌð š!T݃ÉäâÅ»L³ºž›Qzú^Y-`0X®®|½aœÿâÓ'¦o9 —‹`UÈÛeäÝ1¸½ÿPS6å­eqKüÍ_6ñÙÓ'¦O|ÏË^ýê7Ú`¨wnïßqP6eãÄ  ~‘BæÜØé8•sȲ'ã!çSrþÅqKÉf³¢1¶k¦XówmëiƒNµì~Á鼓EèÐØ’aîJ³Ñü•õ-ó¹ãâž•ÂÓºCÙgª/=Ì*GÔ e_¢ì@"XÎKFÅdÜÏRw‹/¹ÙÖ¸±ÒÊŠñø`9«Ipá²n·×eP/¥v;ð¼UJñn¯×#¡õÎÃÝÝá€I¥cÕiw: ’FŒ'‡'Óþu,t õz½wQt»£¤“ªÚ ÍÀ._::Œ»¾oÙ`0èse>ŒŒ¬³SàÐÆHO“¢ •eà=8<×sÁ•’lg:ŸOw˜!ùâààÂ¥“A`ßó|!̽Äy¾ïSkß·67Ù ‚ 4I’Ô. =äËEæ<è¼ÉùJçÛœŸvFàÀ™¸«žWUš-6˽¦ê6>SG»Õlk‘™úÕx¤¥¶n06ŠM˜Æ…z—“š[—f8±ÞÒ›ôªº#=ÓbR-йf™Y^(Yá¯Ï/ÅRJã—)¥LÎ?R´;®pjŸq×5W®ZšÅ™Ë„Ž"äÍ™BŸhrmÞŸFøí`ȹ`tþNÒ9gô+¿ Æ9ç0B†VrÐþáAhÚ"‰{½]pž‚ ±Žúƒ°l­vBžÿ  ]/á4y®k i2ÄóRÆ矼­¥%øœDÊŸ •jû‚˜òßÃŽÛéìy¾ G’ bŠºÉ®ëÎË4µ>€™Èû ƒŸo™a4;ÿs—»Ze–ݾZøQÄx~×ÐÿæCüc…þrÕÊÖpTRD—‚ÔŽ£6lH>ß=cØ:L­PÞRå—t¢Ö[×Ïïîí—¹ëÖýñò‹÷Ý{qêµö·³ÍöÊýgWvv€ßmÚí0™Ÿ4Ûg~rÒ\xÙÞî°µ\T“ð¨ÓÁtçÊ•|/o*l·ö>„ߌ–0`…-'š®“«¸~ɉâ‚8ÂêÔÄÌfÉ4û)8žÕœ».\¨&4_¼x÷ ‚·´­ž¼xüâ¥'>ò.%Ûv›Q·wPwºb¨ƒ˜MO¯ð½Ý³åìë…”0ÿ·0ž\¸pçÝ/V ¹ÌÁ._zêñ‹éüË^'d Önïö@»5S¢ËuœžN§‚vw¯žíïóÞF ÿlà¾ðQ|Ï;7œG'¨…T+q ²Ú²$5‰²õˆ2Ëíƒð”YÆrµ­ãm=«S ‡žpìc'óÅ®á­õŒÂ¸ý½Ã=kèh¹ÜÛKÁ¡M·»ì¤(J æ9—ÀÉñ«—£“™ëŒéx<Áó~Ð!HYW* déd&ÑFUU0æ¶Úyx^Ü– `{gÓ)ο½ Ä‘%òÂ@»ÆrÇugA7ñ “8¥ó ó2ç9çÎ'8ßïü„ó›ÎGgRR¢ Q7åU¨«!êTRÉz)…aõ\E8ßIÔU”ºŠÕ!ÕàøЦ¯²m(Á ÊF‚O4'é*Ê»†Z/ÎÿÎ2[]Ŷ¬›åΫ UªzíJÖ!êÓr¯> ©ÂÙ¥®â-­þ>ÝdU¬¢ »æŒZCôÒßïù=ÿü_SÞc& ÒN’xØv]V‡žÇØu¶C;4¥)5åÈì>Ö²ù®þôî‰CcJE‰Ûe§Ôc®Ö”KŸ¯Ãò{ù®]h mw&û\A¿ëyVùåð@ôED“Î4å=ßï=“‡R\$ìÍÚWÒÈ »Š¡RyÖ%˜ßhéèwz,¡eÔáŸøvz=ô¨ü™ž{]½A{ð¢Áó$FŒùÓ‹éè  kšÖ4"X×el—®Þ`€q­C¿2–µ¸×¼mÃÀhÌjÏ`¼åŒ ÎcœbͶ,BZ“yÕtk!d$äÞSU†Ò V´Û–N™ªÖ÷ÛrpŒ‡ú‰«‘Rê§R¢t}#Óa욥né°}Ï&%Jû™ c·“ŞDžMwˆ9ÑÙ÷èìì%Ï\9£Ço5pWj7þø~@IJo߉]F2 µ;*½BiB“Äêðx2È‹,Õ£«\À_²od¿I%_ÙÏT¹Eœžà–ót´NˆÖ#ù@ Ü¨­ÓÉ–’o«b«Ã0 µßÏ&‘«‚Ù`Ú*ÒDK=n&d;’ãÔÂ!½<÷97Òu³Âó” w~ÏYæµ÷ËRƹTR&g“•Ïw¬ëy#—Q „ÚðížË"~œå0ºÃCA–ìíïöûý/º†/æsè;S1Ê EÓRÕLc•VEÔª)µª·M¹ª·ª•„9ó×(’yÕ›ßôÌ‹^rzátýö^ïî(ýšŸ_Jy0:é_}¶ûä5Ť*¿`Üë=wO/ÿÙö¸š<÷¢Nï‹ÏšåÎŽ”åj?9ÓÙõEáßœÿu¹·w§ÓûtÛÐÍó[ç·p ×~é¤t´mú`ü®‡¹ðçÑf|µÛý³É'ÝöÀƒwß½Âbïú½èúõý(ýøö×~mûk¿vwÿ Ýn·÷;µî]iJÇýÒ÷éä³ÖÆ Gw`peºìì\MBÇqrœú:ÞÚáý™|ït l2íêM¹m¨ìa¬šC¼K…_>ÿµAÙ’D pútË.ŽÞ^¦E²·Ž.i~Gj^+†,ˆ—L‹¿\ây¤Ùàü7îT·j€õ KqþÁ[Bïš6†Q2xu_|"‰Ÿd¢Þ­q¡œ†ãÐMÜt¶Î½Î9â| ®Ïš0ÏBð­ êYÍÔnfŒ`ć~òªz>zß, •»G†[Næì:;µI-Ãæ7µyƒ&-‚ü7êY£|•EÙl_W˜«÷”ESotzƒ4˽s€ƒO}ÝÌ Œsdø-·íÁÅÙÙ•³¥1Ö¿ñØc×}cÌ«BÁ£ïíeø"Š£Ãƒë_õÒããL>Å»»E‚‡W²jPا»¸ï_»ê,ˆvª££j‡œ íøO;ŒÂ(:ñ¬µW.Zk½ó—’ïËÞ½÷<r^;;;>ÎhüðÃφŒÅÞyW_ù>{ÑÝÈ¿Û'òá»>—¥ŒÞµÎ2 ËÖw…ˆÇÁª­ü@oÐrvœ¹sÙ¹ÛyÌqR‡$¦9™tU‰q-ŸuWïêk©éàÙ°kžÇöw"ŠöîÊoz>ýöäÎ:ŠÏþûÛó;÷¢Ès‡?v{zW…®7ü¹i½Û“;÷Âoý–JïÜBÏâ¾$ ñ|ßß} a˜ø¾Ï~ Aù¾'ÕíË+¾è7™©Û·qféœ8¯s¾ÉqšíŠ~£j7 %¿)Å&×Io87Cj wåÅi|¶árï3Írµ\QsK$2®ªqzÑ@O‰ªgr™g%’ÕñU¡’°6ÛÍló­LÊ"•‚´"!²ŽÐDâJm-$ixÞpn—Œ­ÿR’5;;=°³ãZò¬UÊÙi–»+–Ëë×—K1²ø-x1IæÆÉ ”dt6ô³ï`:Ir9 ºŸG’€ÿoÔc­&XØhùrLj͸ðY‡¾SÕHim½íêá‡vvŒ¥ÚÔĬÝÙyäñ½]þÓšé©4ƒa'‘»fÇGÌówŽÃH—Qh?ôÅ)¢Ry–sï­û×8Žõ£ô¡ÙP™úÂ/¯ù¶ë:¤têc~ÿJ¢ó.=KwK•rØBI…_àFd" ìö§ÜFË"nK±å#÷úý‰Ï ï¤j[œÿ<·¦iߌhŸ1}+|`™¥ä1EW¯…!3 ÷¯|b1Råro0R5,©Þ="Ë.ÝÓi{³v[$wÚS[MÆcyMÎÐ/ 4Â÷í¯9¾ ¤ï³½6A×SN|~+_<»ZN‡lÖÖ¹ä\sîpîu^tÝ;ÿ¨yö+ALqbçæÍ÷¼õ­»VŸßýÂ2^¶xþÏÞ÷üòlí~§qý±³lwQM Ž )[½jÙÒÔ5˜EA[„ë:¸‡eY·Eôø¾|üÞæ´×Óf:=}ô¡‡6[ªº|ùîs.ŸíÝÙÜy×?Ú"6Û›ž¥½»õ•+w__.»Ó4»rå™{/]Ù]>™ÆÁÁ3ϼÛí÷¯úXï7vö;œ'ªs¤3dDì’è '~±Ð?ìÛWLµðõþF§Û­§Žoµ6®§-ÝϹY«µµÆØ+ú*I@êñ fzD45Öt»@+ƒ1®g´vý'%çü­Z»Vkëþçrá‡=¿™è0Ñ›¡~Jžv&Ž3ÍUUošU)²f¡óRZÛ¼’Š9{ú·{áo^p¦ÃQš$éh8}¶áŸ]ø›¿=ýÛ¿ýÖ8vvF£” ¨oÕ¿:ÙëpÓ9qÞà¼ÛùçËoþ1Þ…‡´DÓ"œ,¤¢çÕ¤ÞT•媔^R‘¡Mê\•9§·Í¶6i>¦ž Í‘RÕÏ©gM*~ ¦¸ |¿ªw/ïn¶õºš¸¶lÆãÉtÚ;(K‹°’,Á‰fp£’¤³Ý™ú~Òœ ã˜#Œº½ý¶ÛíNËnwºÓër1ê¸l¢už:ý¾þøn„»!¾Ë¦gÓûfèBºÐx+lǶcñ¾õpÈÆ3ôzóÃÃô0Ï97~·{ÀrŠó‘òv]èIž»a Gä×O&IFƒv;ð´ÙÙIVúže1Oü²L²É¬ŸgRúÞîëî†@¸b¦g°I^{k>ú¥í¨í.þÓü›t¾Ów–ÎSÎkœÏp¾ ‰¶`樯¶W…¸®|iA³­Õjy&ºÑªY€${JÉrU¨l¡²E¦ªÙf~CÜÿ)’ýÁ´š Ä®b[«Å|f¹?Äs½MÜ•C|ž«æ{x®–x™ð;<ҩ˪¶Ë:™/H ãºLŽzA ¾1q¹Ü2 ;žVnšþ냌¢‹œŒ¨8Ï]Îæ™VRå0£CÜŸjÚ‰|w¡ÿyÞ…N‹3+YÒ©&#ðóJ MrÌV¸ŒmbÉ™ÑáIßZ®ut›åâoS×…ý,Øg¥`KdyÙs˽Nš¢£Y±*ˆˆ†àvç#¶>Â( ñ:´.&ús _¥P½RA_ƒRfWA;iŠ{!Rƒõ/p]ôvYÖË?‚zËÓÂé9\³æ„X¬BüÖPÎR¿žÑñöOð_ù*¹`›-ÿNþVõ)òüqʇN–_Ñïß; ¢3Ÿ°“ñÅ# ?„Ÿ\¡‡#„‰m3r#â{ÂGáÉ Ó å]Ü 8èt‚ì¶ÉÉIÓõy4''“Û²÷¶Âƒþáa€0l¿¨žåEììù¬~Ðq¤S¼p‹öñ Îeç¿ÃK(¡ÒqÒY“•Û†œ‹4PØö©Ïªu߆`Aƒ!{™Ï“|¾˜Õ²œ§"ºžm˦šWsÕX!¿îr3_Ìk©æ‹eŽ4J/™èj°Íç®ã&æ›JT‘šÚÌ«9–Óh1«ç …°NÉ×X7R­›íf[»#GÓL™(pgÝ`ÑL«ÕMªÐíM¼þ¤Ñg[Ž‹Ñ<7­ÉjR¡rHK’ЄkÏò¬\®–l/«9°}›m#ëm9_t¤÷Lgõ¶Üž¨,ÊÙg6FHÃõbÛp‡Jݺ » L£\«›bµài0U(©ÜÕ¤ZQCI•¨îql%s¹*Xòj¤Ò­«£ls€aºí²<ˆ2…/Š*d'4³úQr3áì¨L/ø2Ð>ddAäY7 ÝX F®¯Jà÷ã2ÍÀs͉ n'ò„‹ˆ÷ †Ån „yw$8£^ëpˆÀ I¿=UÂ}QÒ Šø§#8|Ô ÓQkåºè¦îNø4u}%¸–I¢P rR,íM÷öz½ôý±çKòâœnÄ#w“r´ò]mM–WpFtvHæqA”r0Æ™À}££Ø%`ŒÐƒe‘†.[ƒvBô `Ô—þðü“u§Vèȵ¡õP‡™àðÅ™Œ| ÒB°G¥p릌…V¬+˜Öˆ©9ç •Æ±ð]%Ÿ˜Gà2 ä,}WXÅ¥VQà™’“ 2EK–eb4cU·Q‹<Æ®5ò3e¢b¼´S¸v¯e àk.‚‹Õ(‰‘K +CH¢¬ºÜ´M”@´Óé•£O‰ñ埣8'‚ˆ97–óÍ+ŽÞ1€Ä‹8xÐ;€´B€ö&=À!ˆ${ßKï3ƈ$ë§nw0.£P*Ïã¨'“„ÛYµÚ;½g×1jy‘ÒÝÎŒáDPžçÄYF.#¾5PZG± ã@iâ1bL¥"£´ï[Ï Ÿ†ÃHŒÆa xDR1Àr?N’¾ý~_C$yl•ÔÆCI"C,Iµbÿ[Pz^øŒ\DiøBFñ¹7Ëxäù1c~Ds¹âDAjÃHKEâ»Å˜’‚zoL2ã2pÎÉvA:r]"Ujþ`>c n›‘J†æk©¤é¶+GfwpÓIi|©èλÇš„ñhÝuã°±QY¤(wcYõÜçõ”à’»ß‡ã7£«ƒ~úzæy¼Ç\7ò<¾fLóè•ø™«U”çÑ>sÝ"Êò亙 Äí¾eijn>Þ›ç7Õ#SßEO?–'D*[—ij(~Ý·ÆÚTÞ}Æúß:‘þßÉŠîÌñ­!Iº/8º˜x¦úMÁ-|T=¨œÇQ%Ñ"IÂj¸+•g0;Ó ÍÛöJ­ê¼RõH­™Ùʳ,h欔¦VËfå°ž«²øŽ~k˜&]8´#²Ò¼ˆsÒ­öLaðký8v(y÷Á½cÙñ|ÎAÆ@Jÿ™ ÓÉsHÁÈÝ»=è=¶íöŒùÜkÒs“Ø»6SQQpbÜ•î4ŽEZä ßmt0üè÷4ü `°^ùpm»sðû1Rrlm7Fž÷zùé @æpGË“ÌQΑ³rœ¼ôÔóÕ†=([*I…5+•TÒ9$a;uñĽ÷^¹‚÷'{û§ß{ïñ1žE¿rÒ ŠÒM°®×^¹Úé¶ÿùå/ŸÜ{vvö½§{ûI»Û¹zåÑu]‡aâ–Å`{r2èãYß{ïãÿðò—;þ|ç·_ø(½Ï#I®a¦°éÎ(0¢ùYÐê >½á:Ø"­e^”sá\_•­Š2[m›õf‹c@ÑÙ¨æ_+êîïðäãâ@«ÛnS¸r§YªqÛC@ì£U Í"%ÝsßýwC%?¦Ý=wþÛE†aQ†a–.ÂòV•a„A‰OFÇE¹nÂíàÅ=ú°h£ìÆ÷¶cÇc®Ÿ¨dî”h/€ŸûòóA·ÛqÄQ»Æî×zž"G¥/R.\$”ŠlŠMj…‘Cí{Ç__Y­†üu\zÆ‹ŸKýöÃEˆÄdm;Ó-žG¿¿\ž±Éäðp …ã Ú”*/rr”›YnÎJ9C…÷¾÷½/ÃÛ^þò$Œ“Ÿû¹ß}£/ù’Ñg½ÓcìÜù¥O÷ rãÒMYÕ®ËÎu{”°Ú¬r|kaYå+@±ÍªÊWX°š¤Mq¦”j,¯]œ|÷º©§sTW ÈÀËnܸqãÁ7¾ñQIȽ<ËÄN`¢0¨Î®Û;}Ë»{l/évS&àŸcrþWúï]ºô›gg_~éÒÝ—/_¾üjMĪž Š~¿e¨><¬nlÖ¯"­F¦wé÷#î¾|YÖ£?š‡Àà²s‡gæ#ê¼jèªv:p}ö–‘c(7àû¸l›ã¼)Ó¿ œÎEsÊé9H|ô}Ï´F£V[«’¥ÙÎÎú°Ýv…ýVû~AFëa«<ËÚ‚ŸîÄ<499ùçŒ ä¯òÃýŽ”Æ÷&iêB׺:ݲ´ËG®÷v÷öæ{{%Êó­LÓtt² ˆ¢VE\jÍ<Ï-ƒaGˆ«ÇG áÚ›»]è5äPögå|±÷{eO37jÒîŒÇUÕ麎Ãs%ð.ÒøΣÎëœOŽ=•Š·¨kÆ6žRªbxt¥b@0(¦&rDÕr:€1³˜$”Ï`êe:U®ÞùÜ6Ûæi•e}†É²Ú‘ÕÆ< ’8¦îLÇP*ØëõÜW ¹ÙÛU4NÃYåK‰¹Ë[­q&eÕí êS’NIÓh¿×r¸•6j·}^Cî-´V¢(†AòßiqØ^o¶Zå›<7°î|CÇv6hwÜhÖéªñ%âœÏŸ3F‹űGÄý~P§8Öëçó‰Y±·ŠëWyé?[]9×ÞøøÉ Ž_ò}ß÷ð¶éöpvÇ۾Ͽ»a'ó+—ç v £ñruᙫwÀùlOï×ð—ø:#gÏY:ÿÞùç_QÄ&B¬‘ì™’õd£¶å¢h+SÁaˆlË«žhµ@B¦ìrQò Ž/· ž,C©dí'¸úÂÉnÖ£¦8sR}Ø`3«™p<Æ]jÉ &—y!`Š'œ“‹Ý,N§zº½e,e—¾Z‘Í©óÅdáU;Õ5.¥ÙÖ¸@®ç‘µ, ­”¿žÇ®”ð½€¹.ÿQV ìÂÔ\(À&iñ:pÏçðÁ ”ÔÖÁ(â\XÏ7þísž'àùò|(ké0`ˆ" ãþ˳,ÍŒ ¾Ҁj Å ;ÝQoã2Fd­àJ Ïª^Q"EZ¸FŠ@«–Èóÿ^–£‰'ˆ)M/¦H¢%Xƒ˜Ò0bșɶ¹_ ¼€å7¨O,‚Àræy½”åË]Γ8!ÍscÑò‰P ¹ã‡žHF0Z›}H•ÈoÁ˜0ŒSÉÃÀ¿m$$£Ð+Š,“)SáE!ðXkHbŠ?f1)FaQEȲ¢ðÇáŽóÂÿ¢›ø"G9‰“;»Ž“VñjVo›Rª…T«Y=«› T¨,˲(Ífžª¤ZÅO<ñêû ×þkÕnóïEQìüÂοãñ½«Ù´ólgô0¾èüÎ;î7(Êé´,`®½RG/Þ6DÃáþü¸ÂûÇqà”/ÜÂn9-Ç™6ÕfÝl›ÕfRϪ‰’*¯òU¾Ú  žòÜÁ.Š¼×ŒGxøáW?ÿÒËYâEŒFgw¾ô£õÃqå¯ëŠ‹hZ}uQŠgäćs£Nº¡n(2ÂIàMwÜIy6Åóº×Ɔ6SRºúfFBN*æ~#Ǫÿ*† <Ò©TÖ&#":ÿ· ·_¥™Ùý'>Á3G¶(ìÑÔÎfÁØqGg&ËsÚø=ë8MåA¯’¾ã®ˆ¤Û3€;b“ɘĺò¶:7ji3i'ë 5f˜-²òLƒlQ¹ôðÕóÿ_¦Ã؈ûÆZÛ¿_˜x˜¶îbë¼ïÑUv§¹ò}amH` GÓl1U‚ì}Æìg×úü¾Ñ)œ‰s[ë0žÐxTÖmðDŒÁÈ#·°8Aó¸«ërÿ­k©0W½þpX×ce’$I”Ô¿Ô}ÏsãÞ{B»E^n x¦Ý£íKÎ,:^ÎΨ+žUqìz®?öúJK•$Ibz±uÝ`4ì/oˆ56ÍŠ¶0![`g—_ò’ËgŒ]~ÉŹ«ÇaŽ~á—énüŒóéÎç;ïsÌ”,‹Ü}i5kÈ€‘¼§T'…;’“˜=Re®_™jb×ÊÍ{f=#³ø›b]á¶Y×w¡O©(Œ§­p ‹éÚõWyîÃëa2¹`%7TÀÏÕzv¥$ÄÂãe9œýAÙ\cˆAå•Y ‡+Ã¥½0™€Vë‡]ïUׯQÌŒ+ìL¯\}Àõ¸zeºƒä× Äç}É“íÀ½–s{¸xÝÝw‡ŸJüuùµkOÞqz:âÆŠþjyõ®¦i¿Ä´3;õν0ŸÍ¢Cý©f6ËCóÀŸÚ¬m^Òn¶w][®úÂ>:=½ó‰k×ò×qö)áÝw¿vyh9·óíƒ×®Ö5ÿ à+x]_½öàvþÍ( ¢"§œ~”Ié÷q÷Óó(‡]¥rΩ> ˆŸ ÊWE9Z7n÷gëÓÙ˜ÎN·»W®?se¹¤éô8\.®Îwø»ÞÞµn¡ÝžÞ¬*Ìf.Ìf¨¯^×I9E–í—Ý}âSØ.Ú9—¡ÞS;û1é\MŒ“–Qöó×Ê6‹õf±ÞTùÄŸN/醡ÖsW ¹üö¬Õ|QõÓ^¿68äÚ”q–]×%QÝ*MÅW!ŒZç$‡WPi6¨Û«@ƒÁê¨(oÜéŽ5u¡ˆç†!Ðïöb2èvGåùa«×.pT£Ö_!ŠOæOï"  ÏvŠòR¿vpßçe>RRé !òZkÛï×ÃÉÞ ¿ˆWá–s©3Ûj§ÖÛÍú™’ÈßÙ%Æ>«Íª}e6QaY™Ô"Ü+ƒsø3ó€ÒŒà­övW±íÑ;w>xtÌ`ÃÝúòqà‡([§Íi3ðð{“‰äq´_ ÝÊ÷¥î÷·GlåyÖ]Œ'2ËŠþ$]çtxôÔÎ$ÏKg¯(Útö…wßÝéàòÁaè{ÞqÖÆ[0ßq¼·—[$ýýÃíh|žÀöƒºq£q¦l•V!ÆÍØE™ÖxôÛ¿õÛ¾å ÆöáóߘýÃßøèç¢{þw­/ýRDçûR„ïuŽÑ\ÿƒüÓ¸,΢i-ÔÔFÌ@ÔªßÓZáŽ?CëòùÎ8ßséúõËAxþåh]þ³?øóo¹üŸÝÖù-œ¿ž\»^¹iêžÿ·o¹üç~Â㿆kø³bPfÖ5€BvVÍ<¸\U@!jÅ6¬¸À÷XÌ”8ð!:M*P»´FMÓf,k]bfy¢H K»ÃV H³îID <7b~åãú?¨4Ë2è7ašxBÒÁÈŸ ¬×Ðó09ý4}e§Õ*ËNg¸Ói3!Fý~´3=Úé´ó*Ë<-9oY–æŒ1†aZû½4aJÙþp)R:òý0̲8Žò¢ C¸YF4˜LjÏwÇIzáí³±ç¬g79ŸŽËxÏâøªhM—èAz1=Gï¢/Èië–‹­ÿgÒ*Թ‚ۜÝZÁ`®[PçêÒ}´·àLË" (ʹ<Ì]„tqL½(›b¢\­rµà|  ¢•Â0*"¼Šº©ÀETò˜ÜÌ«9ãMÍ;J h绳çòz°Yoô‰k•äÈÅ.’Qòá Ì,UÊÁFПä8`Y~ã“ G_]`tq CžNŒÚJ[\¼ÌI­^Qæze‹§*Y•›Ù¨guÞ&ô‚Z¯®óR“êùuÖpÜOå|‘eßÈs¸ª‰¤äß8 1›ÕÅ¢Xä4„³À&PZ%ÈôÁ‘˜ÄBw'*¡š5‹`£H[PNj©…7“ã j| hPô“ª‘Õ¶žmfu”ë SuvvôÜž`OVCœ r<ýúL#òe‡1†T2ep]_çÅH*‰þ0®õ4ÀÞ+U¦r2@aKŸˆå´jøQ‘kßu)½Âí¹–ûÃÏëkb¤¥PR¸‘Nâ?'R!xôÆCÏ„ðžÁ@R1æjO#y»¬ O{^áy©ï .˜€1!ñÜh@Y—„吏—{´×ñDÌÓ.c*ŒƒËVRºï…œ3.ÀRAžËíTEQ?;8È{q$g†»hk!˜Œ¼$=#Æ9s%˜‚gÜóBÇFÖbœ±Ä‹$;TL(ÎA®ñ0bùx5ºio¥ä®› 0Æ)læ§ÈaámÊFûû£ŒÚ.u’¦~f…ÿH,•7„LÈæ*ŽZíC¥c°Fr¥„ïTB(Å¥±`,C•àaiÀM!}&éªi~¬­P¹ù„Ã4áB²â]“‚'éáÃJkóûó©rÁx^†Ã|“Õ&ðýÀh{e \!•š)0-…+âX éq¡µ¬õ€àÛ D\#IH+ëª#ÏZ@kù'…Šcá ©5'~`})×* biòÄdÀ9$ãô\/JÒTzRÊÚØ“’ƒ‘ö}Ï 'È I”!9“‰[ý4ãç_ÊÓ¤×KSŽ·‰,í¿QÌ80ã$l·Ûñ­%²Öït»6ƒ.J苬¸¬éé~ÿì¹HIFBêœÅ9AéÒªÒu‰¢(©­[*[jÅ™™Óf bRE¯¹Òïk×*à}ÍÛ¿…ÿ„[N±“+ ËSK…§¦fÀAR±†Ü|‚áð”Åh4Ä^«…W¢(FãÁ~«…W^Þoµ^[5>ûNÅ­ë{»­Vˆ¼ÝZ_ßÝ+[QÖnoÎ;o·¿8á„C}n}W&­€éqõ¬Ê’m³Y×ë1‰‡”ò¦¨ “ÞZZ$*þ»ÔÄ Â­ÑY*»žçE±ç‚–ãcˆL»‡ƒy—Ù†è–iZ÷ƒ’e‘Ï¢¶"ô¾íé¾c¯ÿ¸Ï?O/—äzñ‚O%岃éÎ鲪ôp‘øgÌ úYQ$Ja¹1ÚPoÿ6¤é`ÙÏg¦° bç%Q•–BͨÀ~ „âœùb¹Yo¼7ìªd.Î’ž-Æ ¢¦äœQoÝå´7N+ üšûgGñ~øè=ó°˜ßs÷bN4_Üý"™'Ay%H0Ò¼(òœ˜'­‘1çö]\ýØ Ûõ=ƒýÿqÈܳzø¤Ï'=Òl‰¶Í#ÿº×Ãx+Í«z;yÏbN˸°Ij˜ïjçœCí–S­™/9<\Kà¼×L%gLpMdnT'Æ£µbõ·sþjÚ6ÿ&¶"úÏò¡_æC¿*ÐÔ¦6³ÍöxÛlᬭª„6ªc« ÊÆf]gÁ]y±(Søtï ‰¢0Aì&q‹1cÌ›HÔáÁÁ‹€T$©?6:÷â¸Å™‘eöK-<¹‘ç1€Ë{ŠƒÜ(Ï#W(Òz2~0âÐFk |äd™R‰®§#Ýë•)E¿¿·»;iµ¸20>ãɧÜ~×` sJ.!Á?àØîžÅ÷9ÿ.:˜a{ñ0žÆçáñíøüþ™8méAzš^GŸá䳄·Ò4LâáÁS¿¸eø–´,¢§˜¢G½[Ër¥ç™íÛ²£Ï[aÒl0ÐàLHâ Ýà†$,±…׆ ³…Ï¡¾•3%Ë©$ =òãU"O?ÈPÞÌb¹š©¥™fn[(R šZÖÛÅriA‡ìaßiåIAe›"%’GÈ\ITäXDy‘W%Ï “+:7Š²Jl]óBE yÞ’GþLP<&²<ËËj]ƒ@@Y(Rò@­Ö³´WT“E¥` …Ī’ãÚLÕ Ð&Æ.Ç›uSnW Tñ“›ùJAϨ=áAe©ôÂ/RNkf€T&î ©©ìæWÇ» –‚€62á¶,@P£®Cb£„K Bç³1³¬”Ø,Wø FBiÍHñ™‰âp<_ìKb­Š8V‰¸eó`-¸ëu¡À ƒ’Š“Öi.¤–¬>M|§R yþm %Ä*mÂ’£¤r;Îëó‰’’§ð¡ ¥iA€Hh®W™ç£;Ÿ=!IiÍ87Æm·Êþt§×Ž ­%?Š”!c bÚË:ÝÎ(Mc€Ia]—Iâj¥ø_Md,Ahc­Œ z%€¸Œ€4·FIÁ}<)8 ^çF‘°^ì‹}·Òǧ$„”Tv‡~ìcç,‚ •4®tÝàšIR²ãX@òÀl)sA)F3ÇÀÀµFì<Ê$zýŒ2Ij2©„5Róÿß¼ð=%A’ÚJt—qBÏJ™;­ÍIŠj/ •‘í0®ç¹R ¢€¾ÆGتÀ÷­sò8EiÖ‘ ùœ1 ‡&¸´ä:e8T¾We¬Ô{âÈÑi•ú%¤Ü4 ¼ÔÆdrµív³ÒÏÌS9R)®}Îãp}ñÒ~'n‹ñ–s7Z&ÏzœCÅð„¢,£T†!ã®eœ3"ÁÝ€1&…ÆJ¢W¨lq‡ø|0Æ×Aö¿†GÅê¥ou[%cJJÖz@œ$þ¯ŹQO"KÓȵ ·‹‘ð\ÏÂ^¯L×W2Šº¼)[²«”_ …8ØÛ1˜PífYÔË —\^GŸÆÀÝíT&”àŒ{ž 5$ç‚eäR¸à|,˜PZ)£YZi ι¸˜&³¶J#ò@^ 0’€¨-¤V2¾lã~Œ  Ü+‡CýyAŒQ[B úb \»°Þ­ÐÓ8#pƤ—a çR¥ˆ´«=F¸Ç·. Å­‘”âcŒ{‰qà1“|+•kHÆ9÷¡ïäÜ2p.8)Q$9ãŒÂ8ñqÒJpWkÆhÔ…±.#éù†¡mt¯z><Í\Î< ‚6(™œ(Ω=Æ@Œ³‚sr|Ód¼å,'Ogp&KA§”¤ËvÇÛÛS«åJÆ#–i9UUeFeaÎÌbJÝ®’õl5—çs_VfÊᓯÜ~õôtg .]º~ýâ…éóÄz8_l­Õ=ç¦ ³ªivC#õ¯ïÇQ<ê v®M§I,‚ýå£>x¡Ý1ÁÑÑbÑûPR–e.$(K-1#„+D1’º•eøÞãåÜê+§ƒá…•rFqþsËNp=OyI¹Œùþãðý|âY×%Ñi‡ÅwߟeÇ;.\me6ÜXÏÈd±ü­UD-Á#­©„¢¯>ÃÂ9ãtUMñ¾dL¸YååS4èXœ59½ oˆV ø<÷Ë¿ Ž{í(TØÕÅdâ ºÐ:´eàQÜÛÍÆ6N®í†Òtˆ´gèoG!¬g)±þ—}Ù5¶›µˆRWH)L¶}Õ*O8²Ü ƒN? cfÕÌy wÿ¹²oËp°ùœÿÆ]Ú³æçÊλëFÞ‡œ¡sÕyÆyóÅÎ78NF>Ù3ñê¬u©|¨ÎÛ6ÛrZôÅŒ;ñ#Cο“Í´H£••å•Eqè|›’E hC‚©½iìªj ʹDU”®•EÂ9|íòñÃÇ»Ò,.ÝXk ¤t2?@šµðª>Ø\K¡«õóÙªŸMW\]>p¼›/.ÝXïQdÑúrUIsttùrUI½[Ÿ^Âн×rÕ,+B}é:CK‰Ø>Œ1eš"ðóNà«ÿ??½cM˜K1žg´qÃÜ÷±½óp–¿Î ç€/ΊÅéë.M˜00GðƒŒ`ói_¾N(‹!è V: |¼žÌáÑÙ¥MËj&zO¯×qÅ}êfaÔqbçÜ¡Ì9s ·Ñ ]UÉZm³Áƒ$CÒ¹æQ„ØœÅÃü\7άµ6‹]—mû.ôbW#E8‡ ¹Ÿˆ\ž ÏO¿!õ}×-÷ïwáyAà^½èúëɵ™ýDpÏko»ë…O;]Æ S¥{÷/Ûþ•y>ÜIÓ4³ü­é`Ð΀ð™û|PÖÚâÁý,CYNÎÿnZ–ȲÃû¿(ʼÓIßþÆ̽öÖßu—cõÂ-üÜrÞä|¢ónçýÎ78Ï;ßé|¯óAÇÁz1ßL6óÜj%õ,Äb®æ™«ÉÅ£Dj³ÞÌ+½M»˜`šó'›?lάšç“|¾˜ÛMäq6Ä|•‰§B Ô¬˜î ëzº(U]æ!6MZÇCäó|ž/æùœ„®Œ ˜çËż¼šýJUªÍUlN°Ä>”Ú\E¾ÀǼ‚ógà!x–óW´€™_”ÆË¿Å_Êqþž‡zø{NÆÇ“žP"7ðKôC½ä¡K·}ð³Æ'“cýÐCßs2Áý÷ˆ&c >öõÇ¿…Ɇh–œÿ„ O>Äë7Œ¿xÕñÉIðì×»çï~ N³îâ§ßup´ØOîzî%÷uzi÷™´Í3ÝôÞð`Ó&«ãÔÎEç çMÎ{™µ>Á&'È!ùCH¨êšIÔŽKXža]+ÀB8Ðí%ìWÝÌó>媳ڬ¶gX`øÙ­u™X·‚H–06Ûl7h¸O˜rŸ1Ÿ0óùË|Æ|·;ýûnû¥ cÆvv¾Æ?n}þÓÇÚíÔ¸s·ÓÁ´Ù¼èE›5áààŽ ¬“#p»Ýá ßýsZÎ9ÌæüaÎf¸ýç7ðnç3pŸÁó¹?~¿¯~¥¢èvê/½¾@t°ýÂÞžeZ§D^çÆqY–‡ RŽKÞéøÎÜ‚¾^ÙÇGëMë b³B@Di¶f[oV@I¨†Æ6³zšKC?ñÌî|ô™|ÿíØM•;mݲ,ÛøûVÇt»³ƒ~íNuÍÊ’¡ß?lÑùŸuñ¬éöÂ=Ï׳Ý,Ãø„ßn‡¡4ÄâVõ‘,Ø)Šæ¯áT¤­J=Pv:öû¸Ÿ•¯úD×ýÄÏI“TK¥‘cWLÜé)ÕíîþÆÓzá~žs¸ÒÄ*®UZÇMÉT«¸lâ:ÇÏ_ûæàÚ_üÅÏFW_þò«¸ö‚3…ó’— fß¼yþ§Igç§i¾IY•q¸.¸èÜé<â|­£‡gž†QždM‚FÕÌa(¢½e=ÜÌåWQ’}âJæY¹RϹZÛÚO5æ¦mÄv5y›F\iϤ¥ß¼ 'B(9ìèåq)%ƒMRòŸÀqk¨ †1†àA`]9|K}A}A+ŠžŒ¢''iˆûÔw@¤×£€¹¾{vv¶Ûx^ìù.‚@üFiXãçYZí¤7+W€¤ ˆâ0º!]7¤ß¢ÉÄï@Šqºöä>ýRÁ[Q‘¢?èOoܘúƒ´ˆÚœ‡ÄBÁ»e™u;ía, ÛnV–Á#FaÝb]âCNÛ9qîpÞ€oÅ@)ï ªÑ9Ž žÕ˜Va„WÚ½Œª†3U‚)6Õ/ð€¯W˜Lô*Hz*m|aÕÛh³}¬7¸ÓÎwzm7„½Ë7n;Ñþâûo¿áûGAÜK’K*ìþ0Ÿ»RûJMv¯\½ð:¨¹Ôî@zÔíÜz鑲¢ódGE7n¼ôÕû‚Ÿäém¾¼xà;²ðʵëÿÀƒ½ýúð´9YH±ûÖuË+/bŸMÙÒ»S']åÕæòj£žM;ø‡ÿéKˆçÿðGùø‡:”úãO[SÇI㛾è'8³‰±Cyžç$ò<Ë@eY–Äó<Ë1í±{~ 7Ï¿­g­5ýÿÖÑÚÚþõ­1¶ÿŽ®ÑÖöZc­Ûûͺ¥îàœê½M‡5ËnÿG0©\³ìSu3ª§$Aü†å±Ïç“<4yn»Þ{ÒoQVË™9·;O:Ÿà|VûcV¯ÈB ¾.rõÖÛÕ"Ê—X5Q³˜õT²0D©7oÄÓérµ0ô¬7“)aå ACÚ…´a¨&UéÑwîg&ÅjÙÌëûy¿Ÿ¿úpX³ùâڵłêÁájuðÛ«k×–Ö-GÖ}êðлtéÞ{/]ô;­ýÓÓÓæ ÕùCJ³<Ö±àR¬Š\>±Žó4#]ä+!¿G¢žBð¢Ó)ؽ™µÙ¯uì·<²···÷È·ØÎ`pñøHʲ”¢¼s0_ _rtt|ô4†óÅð¨ã0ŠÂc…ó ×÷52z¯´ï»‚°§ û k¡4ù>)“)_Et›óIŽc”œ¥þ‡xtS¼¡%­XË#§Š¤ƒ¾>DA}£jÖ½ €ŸpOܻѴõU¡O^ÍprŒô£Ö\Q3Bb'Œý±1ö!Æ–¹çB”´QÆ$ó4ý©4ý©HÊØ÷gùÁ¹ešaÏó9D‹@â‰G(/f‡ž \Øñ=o Ë.=M—ÅTÔà|&@èà¿Ïè Do ö £´ÿ;¿sJDºç–¿_¸o´önñ¹÷Fñ;}ÏBk´†Ò)'°ëÀÅç1®”À˜”‹vžWá8Î5º†‘Ãß)œ¾³ï8–‚i>Æ™`ÇBwÑ1Ÿ ƒò‡Û€çþGo>O×Ο½ym4zþæµk½um4ž¿víæ­ÑèÖèæ³ÏÞ|~tóæ³Ï>ûìMÇ:Žs…nâ†ÃœÌ9p^ì|ó%η;?è|Èù%ÇiV›ju†Y=SR-V‹mS”¹š9Ô˽ŇÖ8CPs¼ÊÎ9¯º‚š•#6%úXM—C4½,ôG!µNç¤"8f¯ ¤fë#µÚTBÛœ¸Tê®J‚ pã.ßT]å«E¹ÚT¯ët6H³,A‡\/êvf˜v;è`\ͱ˜L:ß„Ñh<¤®ëÆ‘ë¢CÃñxˆŽçy»•ž×Á·æe°; tn­Ö†É´4(ìÍ»F+Ëdòž®á€_M¡];ÓàEJE‘ßqÂû”~Ç]Á=Î31lÖ—;ßæü¸ó«Î;ÿäüBŒ±r¸ ÷…-4–ø¤ó°9SR9,ac|¬Dð Cq5JŠ§žÈú‚’ x.Î0(ŸŸr¾¿Ô—<¦™m·Àò¶MQ>Ɇ£þ€kSûJ§i%e¶ÑjµÎ³)%Iš°ð\ÿàœb<:<œÏGcxn|íÙg¯Å®wþZ{žÖCÏÆݳð§¿Hf|»Õ‚°g>zf9pãe/»±¢8¥8rÝq ~àD‚ïSY–-at«<çíΕóß{±ô=Ï//Þ;Oz'„yo2ž¾îxc„U:¼”¿B?gæ wë´†À°lsîqn«ÊznËuû®³p®8wcø¢¬zϢȟ‹U~µ*ómS5ªÜÈßlë&SU£1`µ¹Õ×Ó(«Í¶–e¾:ƒÊËM½iLñˆ JÝX_¼ù¶ÙÖ` F3œÿ¯ßzÿûŸ½sï.äyfÁ¼½üÌÛ÷öñwAàwtQ¸ãŽ;ÂPì®" ù¢à{ißó&“ wÇÁÇpÓyÒyƒóÕÎw;Ît³m¶fk¾¨×œm,Du*™¹šT‰f;_NÛ²0+”YN&q<ëRv)6_4ËU¡ëä ²P5”ë·¹c©Çž|×ëÍ K}6ëZÌH!92ylâ6XÃ<Ÿ ‘Ñ` e€!ß' ch¶;’“6ðé—À∫÷ÀÀ$1a»ð미tÿý—O´r½AÇ6QZ›ìÒý÷_ʵQÒsó8>ÿÃÓ³³“££“³³“Ÿö_Ûz1ð:{š| R¦ f ƒ€iÒ["XV ¶?f`c¸„kgן¾¢9"QÚu‡qY&‘ketŽæ4×FK×Í“²Œ¿êäììd{î#:Æq^ø;º‰¯w^å|‚óÍÎ/:ÿ !x¯wœfÙ,–«ƒ” ’.4¿¦& ¹oIMÇ¡¿×d1YÌ*·Ò- ꙫ î¤MS³(ŒálÌÔ¨•U÷'=Ê¥Ï+±iÕæ ÚàC%UsÁ$éf>YÌ 8 ­ÏÌt¿ª x‘㥒Õæ A —¤LFóŬªqN¯žTGXXÏê™´¨•®ÑlËé¤^Ì7óÍ¡Â)lf@¼ßȨ£Ô~™U“ÅzõûÂåjž«¢Zd²gÇMóÅz]EÊßçÆpp›¦¡‹ã0G˜3L0Hîl6êy>˜ëYß“ºÕs=×zlŽ”u·Wv†Ã“jgÚïʘ4Œ$ƒŒw÷_„$%Ïuy<·¸²Tº?›V±ç‘Ï™(JÃ( %™^–GùÁKâ´4ï ±9-}UWQgT\ÇÅèY©d-7ÂÕ|Ñ°è}‰j¶W‘Ëš.Ù ÀøšNæFQðêÉþpR FZ™rî&xÙhgÚ¾ØnýÁáùG&JEQÓç½¢“»aßÿàý®’¸g»u5Duê Ƹë¾û’/ö­á¬{þí|@ºVgÃáéi–åŸe£È·JÍ·•«9 âEØvG8Žÿáœ8…Ós&Ή³q0n•ˆE;*Êâ*Åo|²mˆº³U©êTÖìvûÒ=_@5e¡ð5¯ ¤uƒóÿî)É^/£ÈVÿäI¿Y³ø‡îü¿0ó^ñÍŸ(Ù£ŸÁµV ˆõé7(Ž‡Ì8µ.;$kÃóoˆü‡ÿ!Bº½ ·¦üû9ÿv©þ²IÒ(.þ»ß7L:wœ~ä`ê³Ñ,Ò§ºR‚`hO~ållª‚®cB×BæÕÍu´Qæ«2ï~úÒGÍx’@ñw¿IÏ/w‘¦Ý7"ZÍŠù¥,ŠðÆçKÏÕQôõOň’w½±˜é!–c×Å¿²L©µ‚rŠ4í©„(Iˆ’m…!æ½4C–Ïå/£Hú~±„AûäÊo"¶º÷ß…åsEr­eà—{~tû­Ö°†ó^šâ½¯•9Èš›mcUµNSb éš6WœŸ÷HAøx¥|~SñõAŸZ¥>xj•}ñ<º½e_™ßsšÁ×”>”²w+eÿRz,ªmûà?·].šð»‡R¥îDÕr%à 6]9~×rµü½ºĨq­éñG¹\-éuêûŠ’×-[šY+ÉÛï̵Jræò,’…$‹Ü²<3š8! oæ$‚PkÃ87š É ¤ÖÄt’æ¹Ô o´áDR1iÉZ— 猥ä¬ÖZµZ®'¸ë)ÅE»-¸5ÕDÂg©"äÚ7Úd©§Äœ(Šc© ¥á< Íž€3kï:÷9/vžsÞí8¢R¼€ÓÉ_‡˜æBhBW¢i>]ó§Aó¦Òh§š:Âæ…Æ Ø¦UÆ®e®ýæ#›¸vkµDuûäíÅgåj-À{;¤¤U†¿Cã%ZãQ‚àZ[kGIF“(ŒW¬ Tàɇ¤µJJe­”òÏ•£ÁË–ÿ™núÅOk!ØäuŒ3cb¥”ˆ­«$ci2¤™àª¼K‡6š­u!¥°V¾ZJi¬BZ+ƒÆ~šßÙ8"žv…fˆ²ñMI>„lp-%C ¡¦;‘úl1«‹í‰VÂåA8ûÙÞ¯Œž¾~#ÿ‹Nœ$këz;ïç/ý3;?ÿ«òô®#5ìÇõïÎ0ý^cmPG\xÛW^@@ëõc×4ìñtoì+%»Ý‰?}hr€Ÿäü³?çžKŽ#¼p‹®Ämmœ78Ÿ‡˜ºº°5Á Ó/gÅjlšn}·"V‘§ä÷ Çà„äbRË0þÖüí¦ºÝUÍ Ñ ,UÆí¡±Ö„o$0÷ðÏCkF¼Ók`mðuåÞîjÙìì½åÞ^©ˆdÇ|µâqK"Uîí-{ÅÎN³Zîî•Îùÿ9:Ì£¼Ý0VÄ®ßxÕ«n\gìúWý¥µAh¬µAh¬a`íéN·2[D†i%ã^o°¾qc=èõb©43D­0—AÐéîìïýw/‹\ŸÍÎGõôp÷ôÚþ>Ñþþµkût]üaßÚ´’MÓ+B u×ÉNV“Ey!{cúMO¿Õ7º¼ï±?ýUn¹ßìS²N'ä¯éÜûƒÚK>'NRzÕ«~À÷*MR¼Ûq"ÇyáŸq ïöM¦ªâðU«_«õ¨VÝ”!&êüÏɦlǘr\ý ãqøé)ó*JUãåͽ¾âÇ“¦}}O½ÒôƒIÑ2UòR¶‡9+¨›å¸ÜG[̆¢kZ{º úùqP¿øÎv³ûØ~o•îmš¬n»ñÔ!&ÇõáÞN¯ê諸WöŸ¬’*y,i%­{ûa/Šü‰7>²33½dNÜÅ5/Ø›¼foÿ’ Á6þþró&´Š£âèåéî‹ïßè\uúœ þ~Ï;Òé89O9Nª6ªÉ:­ø¡:v®\ÔÿÔ×ðRÅcûô ÏÔ£Vb£+Êmóç·o··?†p˜&@QN/ͦ@=»„ÓÔŠ"Hs¥8‘ ÃÜÌ)Ú)ÊNçEv²ª0ˆwñÖµb¡½âœUÀ•þ;~¡ýÙ¿ó,ßxÝnµÛëë­=<¸råðÀœ_ÅnºÖã" v˜ZØ^o¶?ˆµ<<¼±ªm†Šˆ+¥A!lš(¼Ú”¤ýc2t†2 ÞBõg¼n òšÕ¾yszòàúõ §Éù{VÓ'£9,õnðlyç=´ýG9,W×ÅlºZ/¾öôÁxR-—×ÞüècË¥–Aƒ¾Wª‹RÜ®”–Iù2¥¾Vê#%~[õ+RØß!ÎÕo)qð}J/•’”ÒòåB¾DËo‘úHÉo ïüPÊëBñˆ”÷ ñUBL¤ú0‘øv)?í·ß*åþwQK)!„x‰”w ù!v¤t‡;|¶n:±sŽ‡6S%á—«z¦HVµN°)·ä09R~(ò¦ ;«ûˆÄÆturgl| â¤ÝI’Ì0Ê$Æ£Ñâͼl‡e)/¾¢ìßE£Ñ|1á!N:œqÖIµV&I2©ŒIf$ÆGâî’Ì;ÐÚÜ ÈúšFô¢q‘IÚ/ßXì¹¹ìÅwî⧺qW'I–j­c|DHâîOóbÍ8ƒ[t-g€3¾ãL'D%*=BjÖ)?ª¥û‡Þ¤@‘2Á¥d¼ž·ƒ0G˜­–¥!Yœ[‚¯ƒ VXеͮÀ=¼¤÷Ķ©ð³Ö`WF“Õ#¬Ê\Žc-µ— {DŠ<&MØ“Œ;ØbD6ϵ”ÖöýÀ—ZñÖ¹‘GDVq"à Zd ͈¤:âpÕÿEþ²ÍA™‡òà`Y.WMÈ®¢¼Jª©›º| OPÖÕ†Peˆúô¡X[Fp?‘Ñ¸í¥§…ÊUöÔiøiá<òoî߆ŸúeÉâøß¼ÉËù¬ï)í[ Þë>xû´íqo~eÕÝÝ+üãÕ­dk?%yÓgÌî}Õ,yì“O_aâ©ÛæÒÓY+¥n¡ã8wp[¥Níàü¼ó«ÎïûF·“º~ms\¨ Õ›e Ù6·ª™ãxÆp—‚^%ÉC×éùB5"»ß«rµ‰–9V嫼ÙØ-[||,ÏTUJ‰k¯ÈFxï¶hh©Iˆu…1S5²ñÿ#hþí¯T]ÑMvû¯M<ïµwÜAXw:ø·Òw¼Ös'Ó×Þq;C§{´Äe­‚ • žE`´îŽÚ ¹FHóIˆcD4!œDa‡¨Së8gÛ…(ì ¼ 03RJ&쪮u@-Gfʽ֗ˆ“GáK2#¢ŸZŒG$°³³=G­v¿ÚîìÆãe¿ÕŠÆG»TzR2¡5׆s*\)97œÃ½·‰ã¦ šÇèv(¸û`€ ÀÁÝw ˜ãK¢+: ³§Y¹_‚„¯ýk÷GöòÅSB¡„pô>fƒ=H³è3Ü•Ð)…Q½J¸£PRá›Ï?'þÄG’cmðÁ‹ûûêe·K ¼ _&gÓív:“|2¹€ç­ –š{þu|2¹-Є̷@ÃZÛ ûûê~¬×ä²5ŠU½)‘Éڦ̥Æ}Ÿýë?yòs¿à5O¼æó_üÔãOâÚ ÎÍ›pôÎûîûš‹›‹/Z4'¾ ”_Ë prV¢g×9D–ž}ê\unsîrîs^ä<7ý½~­óVç“OwœrÛTEYoª<ËWëMYåjv‚A7Áµš‡Ã¯žÛrÔ‹nF‚Md3Âbe ÕM'ÕÔØ0*éϬ¤j²|5_¬Ï°Ø«þÖå“?8¹üÔk_›½É/JƒøõDo‘Œ½öaÁw¾…èõLz㾚óßúÛ$8ÿÓ0ù÷ßž þVŸÿ‘P?÷ÅœoÒÍk_ûÚ׎0â=3Æ/øž‰*ÏZïŽøçÅ.ݦŸ ³m﫬çÙŸ²'Þ}Ñùkü8öñvñuá¯ûc®ZÃXdáŒ3/‰æø/Ü¢·á–sæ¼ÆùÇT hWéû[_ ^î½ ×›m3_mÏЉ´qYÎóLMT]¨Å$Ï<íH/¿¿Þxtwç¾[Ùj¾BéD=ªrˆÀ¾|'Àšss¿Êχív`¼÷»QŸ ¹¬N{ÁTqŠAßÇLdx·ˆ¼€1]Ü¥Š§1$ðyï×ÖFR*.„¡—JußïåƒNÇ7Þ{e4!Õ8 ?O“^$4!ÜõzÝVŠ眼@´ Ö¦L0ا•%-F^0çw>$È ”8ÿÒxRiÆ8çš ¢K¡áœGÁëЧϙý;ü5¾Ãi;+ç~ç'_v~ÇùKçŸï"µEùté¡Ócñ ¶‘˜,–eë²\«ûõæ{)ýå§o4«gÔe7kâ#uÚèä%,üñÃÌ­?Ûؼ7ÛY.¨(³K´™ÕM¹ª‡+ cÉëuHuÀêÙ&£ )X,W® ÂͺÉÔ WT#~°²þÃÑ… W¯^HÁÖ@.\½vát4Äyƒ^oµ¾xq½"&4õ¼ßg¦Ê ²™1ŸJþ”x ­¥~X0’™Š”f:6ZX0ND\H ¥HhbÍDèû’d‰°´šT±³ÅiÚú¹ôU\I%L ”—=®E „zbx£»Ñ4ãÑhÒ4ׯ7Íä÷ ¸¼\ ƒÁjyù[æU)ãWØa÷«"£ d ù,ŒëiƤ’®îÄYìZ-ó=øx’1Îl FYQ)…ŸK&x6Š$ËŽú’g—…>^f‡Ýos¹`GVdÄEß­9ã<”Ræ?¿Ó®âLð@ !x=R¼n¯×ØH2µ¾Z6Wë"¸ ¸‹”4¯šiAÚ•/â²9®õIEꉲx¼4ÿŒ½jÊRÂí¯.¤Ë3&eþšÛAY _52&ÑÂ4 Bhm’ÜÜv›É£5¥aœø>t‚U˜$TxQ6½ £-!'ÊAV\fD™WP’„ç¿Œ:íñ¸Ý¡0½ë]‚ d“Î`X–ÂqG:þ ¿ˆÿ[ÎÂy³ó)Η:p~ßq0«³0RáV gŸ·Ðz»í)ÌÖà;½û` ^•Pï¤S(®¨qF¹KZ™Ñ)J¨ï$½Öf|û™‡yå<õj¶é©§1]‘ófõŒÁÝê¢ÞeCÀEÇ(wÊÿi©,~Ö켘ªã“j¼Ý¹"kµÖœÑ•ý}IÞÝMÖ°–3)-QÌ•d`®×œ>{v¥û_Ž[-c$%C¥‰1ȳ4C8Og}Æ;i L¹Ý<ü°’c@Jvà‹œC ðNg*U åÙx)§;7^º‡ˆ¢4+ÓîDo” ¥¥ï&Æp!ÇYf!ixmƒ¸®sß/v¦aÐd3±ÝÊ:ß„át§ôö½Rr—‰¸%±S–À`p4ëõŒ¯HP,d&Ia˜7Ë´î¹9ïtxîvNsWçÚË¥»^Îú}–{=m²ÔSGQÔnEQµÚQ»~YÍ¢p]îÊíVÖÅ2«Yì…Y½D묖ëcI2•<$é›^¯>êP–;ª æq™;Ž#på¼ø'ÎóFçÝø²CµnRdzBú[]Vi ×*:èç6Ëbçóf=QjÓ»f‹Iû y…¹ªÓ9¥ƒuy0‰ÏÞ_¦o¼0™à/ǃÛnªzX’¡4K“4ƒ Ë'óGJ6e8©‹ù¥§®ˆ­Å„ˆ!DùÐ÷'9Ô8ÊAÕÓXðã‹ýó?ëm6·ý¥ù¥Ÿ!ø¸‹@Ú®®7³ —Åý[ä¸Û]\/jµˆò½Î±{?vþ¿|2öÜù¥+«åÀ—ò¾?éŒÛçœO‹Ô­ÆêRänZiÍj/¥š¤):’Ò/s‰Ie‘2L‡é@` õͺ¦†Ú]ÔvtIMiJ6xÛ8 ´ê÷ze·Ó¾´Ê”*[ûv[Š"oµÃg,Ïr«T¾.£Hr€[“øœSî`°Dv:JºÖ úŒMvvb—1.´æÒ|÷SÝù× ƒPK[m—hqåìʸü¬½á(ôâØ*F$ǾÑn1w‹’Ò¬ÝN~±4Š'Ør<·=ÏõúÂ3qœV«+W/Wp.³±½ÓÓÅ8õ”òëEQözé·»ža&g rÑ ˜ã8äÐ ·œsÜr"§ç8ªšYgUÛ%ÄÕ¦"Á<1Ú|Ýמäö¯>Ò÷«N'¸¿ûŸóá߉&“ ííž;†NçêY« ŽôÎVúÂ-ã–c§Ü°U™®X^}Ö'4¼lýI«k߉ý¿Gqþíߎ“'y™nâ6G;—Y9Þâ|?VVÐL&U9iwî>îJ'Ý]}¶ÕË‚ ™¯Ho‘ð¨@üjSզܦA†½4zÕÄIE»jôÒXÆ–Ùâ ÈùrõN/ó|ÇÃ{ZmÝ~èK(­]#•ç)i]¥•bœgIå2GsXÏ•¯ìâ$Nú÷ ª=`¯ú¶A€^vÚa„®hõ0ÛÀ÷ Ý&ô&ÖFϾg6à ;Ó©àBb¤~ˆ4H$˜µÛƒAîj ÆΡ´õ´¬-Rc)àlúïn Nú½$F³)ø>´ÊWäžïyYŠ–K|–º^‰4!r}cî…kÛïûÛßkr å8ŽvœþŠ®á[åDÎÔ9v^î¼Åù<çkgš)Øì_eVn›’9y/f©¹Ñb~-9Àúx‹¶…®UZ"ÌêãôFÅ(*hJtë±Õ¶YöqÁœÝ6‹|©âѹ<ý+ÇýV«?OZ(³¿óE}£}cp™) % JîjVÔƒ5s ç® ¤Úp¡m¿ž—­ò~îyxšf±ë"eqÖ™‚F¹ÍžËÛh;ÄÆ8ïÛéßwÑ sÕešàÿÆùóY°ŽQ§"ï²6€µþ}P* ”„e]H™Ä€$Éó & %È c¾Í<ï N ñ;Óéî^Õïvç³»^µòÅÏúûOŽÇ»›ÍñÎtšG'LJ]÷á ÿŸnâ³KÎsÎ'8ïq¾Ìùçœ?rþ *œâ2®9Ž˜œ`¶Ò‡þ!-UÌZ6«Œ‡ú›m?·î§ìÆTâb°Ú7»„åb»™U2ÏÀùÕ$2.e¹Wsdпô³ Ü+ú ^¡æ¶”É2a–×ë,6Åêéú³|=ÐyÃRy#ðû€^œaª–Ý{¢¨­›,$eçj¶¨'•šô‘­¢€½É3¬Ô½otÛ¥gú(®b©“,Íò 몞W!6K~¨Ê‹Üf½©«ª¬ó.3–²ó!.~ÑØÈ/QQÌM$qQÊ‹R^$~Òñ9cID¤êvÚãI†°Èô‡†Öm½*#¬˜ù·Äð9kꌌpþßÙ•ÎЬ3ND;œEDeÍHÀm{ìŒó/!ø”Á_T2òßáüŒÍRñ)cWˆR¢” và€S` ÐÀ˜nã/ƒÞ ·7€ ¸áê†âcÆÆOºõÈ–@†$&"f>ðw+ HˆÃnhwö?¿×*}s Œ'Y)å;´.Ki•-­•²²k=×/˲ô]ÏZÏõ‹V«ð]Ïþ¸ÒF•-­¥´jåʼ6 ƒ0|‡ßî ˆe6ã^KÉI?äÈóJ†öíaûŒK¢q••B´£0 ÃÐ>›B¯,{J–i5&(žpaÃÀjµ“@Yξ:õ}À÷Ótx‰ y4{®µ})9º®ë ‡Ú0dyYyHdÌÁ`à¹ÖíƒüÛ ÙµÖõF£C¥@A‘·Ê< _Ü2Fên·B³^[È?ò=EøŸ$˜ïû~™ß‘§YJ”¦Yžåi¤Y–¯|?/óýû}ß÷™(óOŒS Ï”µb@»Ç´ÖÓv[œÈͼ$ #Ñh8¿²ðµR­öŽ6šz.ÚQ¤ñ õ¥6-!Û}¦¤ßŒ†Ã‘…AÅ~ßOSßß)h‹„n⃎êMŽ Çsʽí.šUY‰”Í4DÙàÊ·<Ø~OûÁïØÝ£½ÇðûÝÙ7Ÿ/¿Û~ ÅÏG?Œžïg}ÖÉ0º`O¢¡9ÅŸRhK7qsì<í¼ßùEçO¿rœi®(ô6O›†µ²²¨ó*_õׄ›ˆ~Á®WÞ=Ó)FùtrÚç®Èaˆ×BÖ›jf¯Ý-k øÏšÕ¦’h]4×›Yi… ¶5¥d~©÷P?Ä\Ÿ´yˆÃŽZV²^Í7’ð#PÛU¡*z û™Ìhµ¤2ÛJ†¡Txã9%Qœ§;]Îø^‘k4ò4Ͻ( GqßοNá¾e‡íe2%”%( ¬i…FrúGÎ Jâh:bž$äi“§yîGQ8z™ }à(P“A'Lâ±~9Çã*{¸ðw¡ëÅsÖ¢¶ëùá„›„žç·m6=7ÔJ¡©Ì$]ßï%øEêºà\(ñÐJ‰ ( ëŠK~„Ícß ´RÔ…TÆ÷¼xÎZhù®Nø$ð=¯E_Ý€M€K áù~/¡À/R׫?ã;PäuI×bÒç9n ©¯Âã¹á2Ãq_ì8Sy“K¹DøÂΔm~Çu‚»A>ÓõhuG“òl»3…äLMr©¶›µˆŸàX Ôl%Õ4£næ¼Íƒ 4\°éwÁ¹];u÷Z)×–ºKéul¿¨É¯h¦o†‚N¼mòy³½€–{º(傖é@ÔÚÌêõæ™lKOéçjõºÞbµTJ™•¯«›¸{5o xõ]Л‘÷V½næ‹õúóî>§c@Æsq üŸa¢ÃFÄF6çÌ÷]S÷1b¦ð‰” mŒ’#œDÛvȘµ>¯/ó Š\=Æ•⢕$Ju{ï[¯]…;ÕªE\cdM‡ûó^ߧîØ«w‡;ÖåºÛëg>@G£ÀÓÚõ{I Íc¾+¤°Z¥Z €3O)É™úÆ€8“D’KÆRÁ•´±tm I­%Î%Г&ÑƳ9‰²Þó}bR2 îy„²<<4ŒBcËŒ1ÆÀ|‘PJH@q©D,I)þ œ©„ÐF=Î ‹Ð?lêà ŸqßÏ·Œ µ­Vì×f?ä{†”"ÍòÜJè) H½0p-„tÕÅÒ„ÁsC’áõGI–vlštÚƒŠ±VÑë—-EJ ͸TZK(Ýß;8ð¼2(Šþ¤ÛóGívê»džwiÊ´ïu»½^DÏ%Ã^œÄF•¾ëú¾ç“¨TDv§SäûÖ\KÅy® Ú¶)ƒNÈë=JRø¾õˆZÙ€q®üŽç¹\¦‰ïÊ š0&ëæ¾<RÈ$Ž3ÏýXa_Âe„”&¥ç¹2V*/Ì„æ JJÀ–"³±Vm®#('àš¢ìºê¢«²Y¹Àk8ð£}æüw7oÛö»¿7Ÿzêü&nŽ~õWÏÿcÇa¹cÔÌiÑýfœÈqšU­•–MʪºRUúÓ÷Ïf³Œ>øÁу‹Î[ºóÏú±gžùç{Ïÿù•¯Dvþ/7n`‡3ú˜ó$ÝÄnörtÂjTÆÎsÎvþ»ã4IYk/«Z­ê’6ý™f³Ê«€mÆóÊ0¥ÒÅ— ”»lWB ²–W"Åk¡Î“c1F¤ûlµÝl7Zw«gVóE½*WµZ5+G'w:É狺Ìʬ¬ËÌ…›2—,þÌ®ëM™ò²ÕÆuWzð‡¤çÑMn„‚e3 ² r”ÁìouDÕÓu_¹¥uö‰W⣣øÊÃaøÛÉÞ«÷~Hcdະ})…”3%¥à‚ H)gR )û3°yÈ~gÁüz–& äÛ÷÷?çs^upðÚÏyöÙÏá7o¾ãïð¼Õ«Í7Š¿}”ñ¼À5vkÛ­q]cå˜liû eÎÓÉШ³÷ÙŸ½×ÒiƬ"Ž¤’†i‡Á- Ö ” Jnˆ)OO12¼¿ž`ÆÂ5L¹pøäÁÁn¼Œ®À2—ñ6á à9Ø­iV‹‰¢°^Úì|!®(Yu5ƒ¥f¹AâHôëYš@l0ó©r«`;{&U9u#3y†!ô ÿƒÙæØ‚ËÚ5(ôÉÚè8·QÍÂ$xÔS8¦‰ÜOçüèðe`µA}5Á6rÛœÎç‹Õ&»×Ì«ìÆê6Q+K+­¢Ùn&ÕÊÉ«X­íÄóżÙnt‚™Éb¾˜úÓ–r¡R´—²ZÌê9"u]ºCT3·b¦¶$´"Õ|A7!8Œq-¤”¹0žH)FRPàG¡ð}ß'ëz.ƒô< w‰BÈ´R CÁµ6¾°nNK¬”Gû0¸JHr=vSµ¯´]°?’˜@†>…‘ç)/+}ŸŠcÊä35/Î2DDZ+hFŽæ:¸RBHß6¥Kíº€RÌ÷²ƒ$5e7@dŒȈñ0 C0ú·Ÿ'k•üR\ BH"k­ R ¥…¤48–¸Ôi#¤ã–’ŒÆ/j@ ßãàÚ„’AȲˆ` …1!}¿È4ÄÀ¿Ï‰ç!“4àÄD0Œâ ™y>ŽGÈÅFíû`y¦]ÁAI¢ˆàù¾£‰‚P€%‰Q€ÐíVc ¤ÖaTF *õ­˜’œ~l…€’Œi]AV Ê“½/Åi‚ZehiWÆ!¬Ö:yÆ@)N®KY+aÿ¡™-k…4F)|*\WI×/Ê$EØé²/.<ÊœN ²n;Ô: ˆ ”ç’ÝÙ_XôÂ-¼·¢¦ŠWñÀU«aóÕæÆrùšÕê5«Õ«—ËOÃmç?÷¯ç÷ãÇÎïÇýë¿Ú]ÔÞ»"æX§Åð`ÁûgœŸp~ÞùŽÓ”³ºÌUÑÈZÜ^‚¤%”¡ZmB…!z¸ *‹(ÆŒ«Rf:ÝqŠpÜð Û’VgñhVÏ›ŨÍWJ+Á¦æµ½)T^”›9jè~½EÓS¿O7±âU7ûå³,¹žÖÃ#|g4u; Z{ý‹ï½xq¦GɆ¾'èÆ;ójbR1­Ùçß:Æ.{í¶‘ïí_´¦ˆ³ 'Rºk³v0êu}­t‘YóüOÅþ¯©•oîY(ë $.…o‡Ö^»íi÷¼å-ÿ®»ð©RÏñ=Ïóˆˆ|×óý'â{î©=Ïóîf\Îö<À.6 ñý4·ÂsÛ­úÞ¾Tq8,ú¬_º;‘x/ ]È·Q›,[åMøŒ^ö½ÅÕÝ4¡0þüÓNüQ™·ðÜr„ã:NJyнY¨º*›oþš§®\yêðèöOüÜ:ÿ³w¼ãÉ'ÿìÏÊMñËt·;±Tûw9¯p^ï|Šó…Η:NêÁ3Ø6³êÍÕ¦*í«mi•5Ù¨¼ërY—ªÙAKÞ'&šÂ¼,9¾_-±J#Í  5îÎV˲–ª®ò«À"1¯R³l R*ÄjS}Çïå…‘¾O“ÉSlvh¬ÂsÍKÏ7,Š¢èF1‚ Ì¢v«Ý¢é¥Ì0ˆ2¢G£h4J’,’¤ã[‹Çñ$”2)û@ÇP}]¶(/˜´l(¡BOi¥½Ï8<ĉyo–o»ûiÂÒ«3ßÿº×ZÐþÝfjo·p÷µ”…5Bx.‚]ð¼VËZ!ì¤"¡ìÝ4ƒ;62T&•ê_g®ûÌÊ°4ݯ³üS ohÏMÏÅøë0ý$Ýná¸åÌcqFvõxªsgK›&¬‡ÑìBJE-§þ:Ϧ“»îzr½†]ºãa‘aØÚÙß›Þ÷ðÓÍ–;‡ù{v§c26þ¼.°¿ÿI¿E®õ¼,ÕžŸ}æhV?° ¢Ø×cÝÒÂBê5ÜŒ®”ÛHÜ‚@Ñ ÕÜQ¾Ùîe\m—ËRqÜëFýÞÞîÌšþxTø”Òš(,˶Ÿ&A@»{ Þ–h-Tœ´¼Îîé©î°õ쌭–W®L¡UQW¡×Ûß;¸ž}ðWžrBô‰ø çÄyÎù ç#ÎA¯pe@U ‘²ÊCó0©fÕû˜™Õë:ÁL‚¶ 0+ñèè,êâ™õf½Ø¬ ×\ÒÚÌ*"†]e¡   š©fr²¼ÊÙ'ÝK¢Î:ü|¾=ªq£¾^º‰3«e³>ãPO^OL®J›Þœ»´­»;ËŬóCËUÀ·%_ÅÌ ™KºìÚlÏT#NPMªI™µ~X%_Oϼ{EàÉîÆäJSe*Ó‚ßžùb¶ ˜âÂuÏnŒF'óNç±qá*.N6ÓY·CÈ):í½úáë |3Ïc¾VGåërÝÉ °d½cDœŸ€òvi% Üaã?-í¬Ddl’rÈ—Åqjci’–‰[Ý£9@±…5“â\”Òâ¾çi Å'eÝ,-°)ZPÝ»¨Œc¥4SŒ¤L%ð9iS÷\êÒÑS@¸J ­M;|§ÒIŒ“ÒC³>ErbR¢ŒþÌŽ Âp6Œ=©ý‹õñšÀç88S0¿¤#tH†¸(”ìå­vk €}BHí8ŠÂ!ŽÈŒ PJ© Øx+YÞBz^Q(m´æ2 ÃÂÎB¹ÿ\!€7(™¹‚p“à¹@oXëáåÑ„F!"Á?Sy$·Ük¯àŽŠiÏ+òY‡HªöqBò)Û”Œ„`ìî{¤BÊ ¸ä!4…±O=ÍXfK:ðjδ°¤k´»Y8+çnç½ÎŸ£À}øÇiÖ›ÅZ×Ç͉’ћӷº„(dÖiú“sfiÆ+”ÐèeüþÑͶYϯ&jžË<3'é³ÂSg$ZæoµZ®–›Ÿ&Þs?êü¾z‰ÜÌ8ÛÛªó,ÏÎëöÍ|±YæsÓ¤(½Í›Ô“ÌÐÄ€&úà³ÜËt÷†ú3%0ÀK@´Z.– „J|oh,tNXXgĪ«mƒÀ´Íh?g©Bëͧ!Î3-¸éƾA©8hyz8¥k]FÄ4våeâÿÆD=XnÜtÂ)cY…+X»%À…$&}ÆÖš¸µ ŸÁÂ0NçeJq 0–ˆ‘|OH"ζŽF!AiI_Æù×ÉDÑo»†Œí0†y¼Ž$H.J!i4ðŜ߸«Èww»Ó•1 ˆÊmoUy.8`e£ÀhxX &Í’¤6q”„´–dRJ’úü*CðHÿÛó¤Ø!ȃÀ÷: È%ΕºHAí—1«µf_ lœÝ"V”³ZÎ¥@Üœ+8WR¥¯^ñ=Fé_)ð˜1@ÙÊs­8.1ŠXÐ à2ôýWý;ßy—‘JY&i‘µ%@ LjHHèõ4:´˜ô;BÐ'#š·]ÉÚyÒÆ4ï‰Ê–e6½pÒßRƦéåjy‡ ¥mdóú3àŽqœ©ª»PuÙ(œ~íÃýÌK_ qþÿ>ù%þç/ñ—ü<¾Ù?ÿÓNr•7+UmÒšf¶¶ Ÿ}þSúP›ÜÕ~v†íóß{öÊ'<ü³ßzãÙ[O¾ ߌ(îœÿÔ ù¸«GxâïøœÏ9ÿØÛÞöÙŸÝžƒN]èÏ;gèì8{α%žN,ð´L6yµ¹DyµÉ¡œŽ|¡&“ ïº;ųkÝuñÂd‚[û7Ì­Ñœ}ü® ÏîzÃïÿþÁÁ‹¿,â;0bN˹Ÿ’ƒØ\á”+” ¼I šˆäâ'†ð¢ð%Ý6ÛÍϼüå íRµ£ñ¤×'ê÷&㨭0=-9å¶ÿ÷vû¦O¦ogƒa«­øAvQ\µ[ÃcÃA»5þFƒ!ÓMipÇgî±STy•Wñ8'= í¹§ž~ Þom?úôSðžêÛÊp4}Þí¸ÎEðœ÷9ßê8©G®ð–E–öÍZU“‰„æÖv²ô&Œ)ʽØS)†ƒ“ãáß—¤ínqÒíÄ >®µç­µïií8Ž£ÇiÑM¼Îé8ççqçíÎg;_å8X–‹¢¤&ÝJ äF«ÍĘ 5NYr+F-ýIÅ[ý±!V ·¤íPÍJ-eR°j·šjÕ¤—àYZÃ#Àµ'n¿}·êÝÛoâùE=u÷=ûÀÁþ=w?õí-ës2ŠJ.!Ú¾/>ij”l'i˜q£»Æ?=5RæQd  9Ÿ &A\ô¥J§ã¿øç'•²ÓOäù¤ÚÝ­&««ï—Ålvr2›åo§oèH» DûM‡ŒÂ´ÓN¢ïþýCÖQ8‹²"ZË$=ûÝo˜û}YpJ‡9Þ ¿Žÿ…9'ιˢ ê-QLORÌ@õË埌幤ª\0 Q.â`gšçy>Ý9¸çèH‚8Ï07Ííw4Íx„ç¿;ªJrƒÃVÛs¥(Š~¯ß‹â~¯‹<›ÎöögÓ,[­î&òh½¼¾ý§Â– Â÷Dq¯×ï¹”ž×jöú}ßAÑ£kørîºâ7œ9/q^Ö­$™Æ“;9Q5FÆÎGÄT)×€/z›LU³®˜@×n³Üº}ñ´×5¦Û~‰üoߧïŽ cf4¼ïi™à;æçç;…}¹}0ö<çÏÿyºøò¢ØÙ)ŠÀÏÿWîi2b–¤£çÿÊXÉX)Øý$üdÆÊ û;›‹?Ì y›8ÙÄ9s^æ|¢óeη:r~Ã:¢·I¢€™\]ñÈBC¬Þª.Xí—êeXe“_!^RÍóÏRtoªÙ6¬ÿƒ]èðJÍ™mÕ69Ätûc‚08€$EBxKGjØbÊü}€YB+²ìLÆYÏš,e(ËI9^9[=®lÆùÑÒX­ÉäÙ`Fi6};oµ;­û‘5 A`ŒOäsž¤k \ ü4 .EìûÚŸ(^ºtáb× ›øÝžçV¯}äáºntš&óù& FEÙ/9£;»zí( ÷çÛm]3òƒÕÁáp8,¹ ½,m¶W=óù‚3€qƈ+%%ˆ…¾Ro­^w¶7Fñ~§›çΠ?þ ÑIÜéìak£8c‡aš Îÿ!ítãÄ 0Ï/Šö(©5çÄ\)1H¥=OERD¡¿ç>c™ÔàL ¼ÂU©ÍeÌsscí—h€q­ MSÌ žëÛûcº‰ïržBµÑýÈJNm[ËyÄÊåb™!8Ët=kÖÝO´øÐ,·ÍTŒÔ{vÝ\¥)'.¬Žâ@qãºî]›ÍÏ?D‘.Öë'É6Âœm¶óÍ¢) P·»hV« %Iž»ñ}Èê,ÏýßUµÛ>'[ ŠÀug*I3*Š­#h]¸® .ŸÕd97–…ŒÀÈ}ÝáóýAߺ ™LwöOÒDû±£/¸ rÚ¼FXg Wˆqõ±yŽ˜]ÕdcUOöSµ¾G.qñhp©÷@_põœâ¹j2©ª»NOG# šœžÞ¸ýôt2†£ÓÓ»Ÿ>=]¸øø×/±‘;î=ïyNš©Ê»ZU“ɧ`<Ú©ú=ƒ'.\ ùøù=¢h†Øéxô¥ö ä–íÇœq×öO¡Ú­²¤_Hž‘%`N<`ϺÓã,ãtá½öåóGw¸xÎ<¶ÿ v'jµRö¦'šjӔͦâs¼*Š—·ŸÀÐV]¸Hæ3zåµkg×eÙlváÉ‹¬‘³«7ÊݽG²ƒýÛŸ¸pôköÈãwÔ;­½¤>=ÝÙh•EA_”ÈÖ*ydzöñÕN5]¸ðĨ{ôÞiuÙgÚ±XWKž ž#¿,D/û±û±³({\ îÈûÚßw® @Öû¬}JÇ.fMu.oH$b´- éÝDÀ*Àß{êÏë–Mó…Åï·iïZ®²¬xG–õz­8ϳnLÐóýû×YÎX÷øøâ/}4,Šh7Ëóè®þ}ÝÃÃÍãN™ ~¶Ðùªë³³U˜,º=ÏU2>ÌÂÙ)Êö8+!œô{øêW·h?–‚-ÆûíØé…Ç»mÍÔgú{êÜî<äí@wKyutÝ;ïq݇ïvÝ‹×\÷ÑRôa)_°{„WØTyÄ\·~znAGφó-»R$ˆ|¹ÙTySå«MQå»P¯ñÿó=l}ýBÛŸÛƒÛ¼éƒozÓŽz=þø?áþÞOzûö×x´û O~ã7¾çŸŸWœ{Ç1Ö+}3ƶõ¬Î—‘°@å‚RZåæýº)¡™Ë0@ýË—©þöÖeÁ­Ú”ìq@ék´>;Vö½Ì×ëÃC6<à:xu¶†CvÜNÚƒ!“ÊÃ1€<›¸æ\qržqÞé|šã@ÕUI6B Š•ù¤š¨¦Â>ÕLmª\ªÕ–™x‰Ç¾Ñdåjv†u]ª•=ŽÔ𺹟ÏÛlËíJØ–¥€ ‚qçÍo*·Ní¤—5ÍÔÍÛyÎ'|¸‹<¿î•eoÜ#Ó^š*Dá .1€8ëí¼êü¥~YA¿ŽUª5åéù«oyµŸgYvÐ* 9Vyž¥ìå/EQä ôæ7g]ÓÎ ¯´©“”:}OÛF¶¸H|Ô³Ö nöÛ_úTA».û䘠´íB×IŠ,ßå¬ÛN„°n?ïcMÏŽÿÂGñ#ù£‰?ë¼ÓùZç[¬ô2BÊ”t˜aŒ©œŠînH †••Š‘€çZÞÈÁ Â]øÄ"¤R·I @„7§µ*SöF6™@ÙsXÊ `JGOŠ—»¡ 2!ܸADÅ@üVU;ÆúA8L€t)}—s_…Œad ˜䦓YK¥°Ö2bÂcÇ­£ë×Ï:e„ˆ\O†¨^pBòQ ÆCÛºÐçìýZ™JŠˆ‰IKNÄE ­‰À´|„À^·5AŸ¢,YŽž¾Ê+Š˜óápèJÖq “¥©vò0 ù|±8÷ÓÄ—à¶{—ï»^¬¤L¥QŠN<¯ž_Z¿9¬%ÎÄT»ìïÊír‘JÞ}+Žg |XCŒsòYÆ9{סßt½à…â‡ñ¼sÍyŸðz?œRA” pÄ>EÎZÙjÔ³MOtólT%{…ÆõD%ó…©+l˜åøaDaa|zzz:~¾•¼,×gû³<Êb8êt$ÎŽO2FáTÀ}'£0ÂñB…OÀXG©çeÃaüy¯GăŒ‹Àõº½¹1O/ì„!cJO…0fG)à²È[{uÍ>ímmm¬í_½Ú·ÖèöÛ†­¦Ý t³¬‹"l·›r„µl]ºÏ;çvççbÝÃÏÑt¹ª·âæp(·Š4D7c¬ª€mÚrÃÿ%NtõÀ ôRVºõìÆõ‡¹~cVƒn»ñºWïŒwßzÛ^Ù:?bW®¼ì¥—.ÝΙ6–dDyQô«§“ þ*p‡Q”$=ÏCWKÉ[Ý?oè/z{xpØܳÞøW΄¹ïmÝjg/8Mi4ºã¾gRdÙþAšŽÄÃÑî¬8Ï .÷()Y=-âÎç¹Ý3ñ8Ãu¤ÔGN°\å’[sªIµY6^¬çÌêI½)Œ…yÙîC*"˜CKØÛ· 57ûFÀ‚c9%gýÄñÉNÛ¢R†av=Á]Æ„µ6ô8k+ƒsC¬ÓòL+ áºq‘yak¥tš( +„­Fœ#íwøÊz;ÀŒóžA„a|Œãsh ÎÃ7‡ŒcË,ä¹eøbšPŸo?²Öâ™´ Äý dº9¡c‰‡Ap„;€É„ô’‚[t/nð”óý5p¡ð~E^Ö¬nÏ ¯QÊìõ¤½Ld¨äl êòªJ–9Wàbx²2"Z¸éµK; »žD+×dw˜Áû(Ë‹‚è!¨¿n‘’ÃÁññ`´ÛukÎøéÅ—,W®ß}/o¥éÙ¥÷æj¶svù®»nãôð÷ŽŽ†—n4¯!&vO$©¹LW,äô¹íÞLÁõŒ '0"ëÁ#°Bøš™}e+ȪµŒŒ/´‰­—(€kOpe\$RNð ïñ;ÝÉñ` Ç{ý¾ºvÂ?¿ûî—¾ìâN:Û|õCwߘN«ˆ¿=Êrõú×>,“óË­„ËdyœéÀh.cÍ8K´šúBÍ™áÂeŒ¸fr@!Ê+Ý0<­ó•uÚý@k?Kû.§c\(&½D‚G8mŠ_ðç!ç•Î÷µYIq3ñâóyËö›=TuùõQMêFÍ~›uSÖ[»ZÖœþé晪ÝDuånµë¹bˆgÕ`ÁϺƒÅòìéË—»tùéáÇÂOËàÞ³(ovÊvOø~àñn§ÜÙÑ•{ùÀ#D>8×kÝ.÷ß½N±ÓäÑÙ½¾zðQà‘RT+5¬×ƒßÜ@nø!çmdûÓ—/±ok—/:ÈݬÉ+qþóûø€&ÿy@÷^‰ŠmUtºÜ÷¿±m¹­ýÂ-ÔÀ¬Ã<e¨ú*B ±©M,¾9©RåWq‚gwªê±lµÊööªvvÛßÏW«½ÃÃOú•‹åwŽNž>:úÝ_¹xñWÇuŽ³Gÿ²s»ófçΧ8Ÿå|¡ó>çk½ÂwXÒOÊb3­nórTeN S¢’ª\l›M¨RFe«[Óã­Ð6uÕJbÚ 7U©8>Öãº_«é1-àA%ÆšçJª|ÛÔM«Þu’ëz®?{]÷Ž§Éá…Ó ‡ÉΉy—ŠKš?ò×—ŠK~8 Gþºyáð'“žjëÉù'º­zɾž|{-…/V½d¢Ûç”^8Ùù‹“ ‡Éét8üåv`ÛlÞ^Ï|3Nzª½zÑý¶¢mVæ ™_8<¼p²“|Ó;ˆŸì$‡>9Ù8l¨NdVõßØ_¤ï¬ûœ/r¾ÑùAç–óÿ'͵ö5 »ŒCñfù› ì”W)b,¨o–ÛÕ,­hê纒Ê%8s‚ˆ». x^ЪÁ³1…={f7 &ÚK÷Ÿ;ûÃ|^ÎþpRÍLÔ|‘ÑÓ€=<øØei0z‹õùb¢Jo«IòÿC²žÕÿו ©wø~fÊR(ézм0ŽýR˜Ža¡ÛóíØ5†ë÷Ü™Ž¥Ç¡øáH€zýŠ±ÝýýNÚ^o¿*[Æó<Ï´Êj¿×³iÐÙßße¬ê÷"ö\ÀõâØs׋c­ c­ \­µv]­µvß*ðGY.Ã8ež_Q/OÐZk Ò¬tã‹i—±ÖŒ1ƘÖqÙ~äâŸûULö¬hûI¸^VH°½t6™ÌÒ=Ydžĉ߶'™A9uŠÈóÏ‹‹¼g¤èP.8h0Ç)ž}{bÏ…þ= Œ•HÓßM–Âmä&œò|hÓ*K óœxâ }d~Çðt{á/p ߉d‰é-òg•4¿WÜJ J¦ÌÈj¾Èø{±usïiŸÕ³3äTÝk©ºT¥jd.7³¤2ßkô@$¢2Ó`Rž’õ¬–¹öÊÚˆØQ._vDBÊ\7MiÆXY”Uœ{^` DQæ9"кz5Fq“]—]ÃìêÕÖ@‘¥C Ïã¼BY”%c3JS×ÍYŽ†©Tyqtt?àè(/”DF÷^ÙlFヺnµpmµ¬ª$éŽÇýAš^>8è÷I²AHscšã“»ï:½ÀÀØ… wÝ5?nŒ™ï,“~Ðë\NÓÁ`4î!Iªj¹º†V{VŒG›ÍÄñzÝ^—±nog§ÛÃQ9Žpú/ܷ㾿ŠÿLu§œmëÍv³m¶Íz³®×›u½®í³‹¼Õä¶Ùæ÷QdÙê󅬤ˆ§+w] Õùž‡Æ(s3W6Ë}nq_Ío6¾ AŶ=Atr³®;ߧ֋ÙU_b'^äo¼üó•FX]˦»_øðànfkßÔ—Bj;›¼Q‡r 4“¡è6Ž*:´Ãâ*VvâUÉW ׈›0p¹Ø#Þ¨'7/-ÒÏ·ŠáPI•³àjò%I¾9ÒQ¤Ë"Ä4›åÉv·efBxeø(æQÐO L"«f¦*ÕLf}QÕC9ÐôžÉªõ‚ê)­¤4w`="R’¬å™|“û(¶b §X?á~Ý—Þ”Ô€ÜÒfAOù\˜‡äŸ{ˆAKED®K¹ì @K.ŒåœO6ì‹e,)‡ Æ]¢Xj¸»š±é03+ÐMÉ0Œ gڅܤ¹än&J0Hp‘+ë€ \Rãĸ°š@Dc+!)¯E’ݬôäç±éšIéóM4ˆøeêÆ%ÂH›Óˆ€+Bʺ–ô¤½Uƒµ}?“1fh= ZÃ/›K¯s$Ý…Í¢h €'|ÎU"®»e­ýÉ8É]{ö;‡AØAœôÐ?È2!gvx)­J\…ÅÉ÷… =ÁY© W“#¡•-00\’a¬%aÀ< %#¦4“œ'cJ2e–~JÂWÒ½LO¼­¶˜ó=½ÙÎ&›IwyÜ ˆRSL±Ê†I¤úxÿ½ë89–ñR|TQÈ¿ãe :Q[L­Šf«LjzUÈOiltíB¶¹#ÂNyóz…ÿÚ,Ç•>æJ¯AM îê@¬.PG–ƒ(;"ȇ2§[¨pš¦¨²È{ì™íÄ#ªyýnòËùlYžõ‘-²|^}’­ÍºžTüBê ,’Æz±µ!œ˜¯¶«õfVÕ)Ðy¡×±•Ô·å&o¼Ù^Å2/ö¡Îà¢- ¡P­VÏ G ùÇÎË©nõh¥Û ™K5¯Ö›ùY¸µJϬjêãNá%KQPx…äX¡£‹Ô9§ˆàé˜å"[e‹%WÎG+«cLW±šðV1¤Ê#¯õ¬þg!¥ífFð¼$ÙU[]†#7 éµ:CkÁ­ºj•Í6 KEBʼ´1Eë¢_>d ‚— \¯ÕNÇ%nSšR´—­ýÀuó4 !…r6:qäY¥Íä~Üš(IF ±,'ÅÎLÎ BìŽ[‰`Zm3"u¦C0×øY§>ñ<Ɖ\ïõY‹ˆ±Øw#Ú_èŸ3Î9+¬AˆC£²òŽ }¾&llÜ2›V6Š‚ YÓœ !Ý0Joì1¦¬VžþQ6c\ê0¯A1EnoÀÒ¼D‚`¥@;-¸jZÀo—RøžVDôÐ~V?e¥¶žïKÁÞpÀ•º{Æ€ M†ŸìãøŽÉíÎ#ÎKœçœ·:Ÿì¼ßù6çƒÎ¯;¿Û¯Ö–nª¼*E÷›Õf¥Tel½â]ŸÀ5M &[,kC4]VËÑ7´æüÇeSæÛfÛl›m5˜Á¬ÆT¡jUCÏð›ÒdÏl¹­×u4À¨*á<4Ú¦dŠA—NÒZêMÉ\†’àë-ðm"ó°ü¡äM‰|#Rµš5yÔ–UußÜMS6åUÔÛ&Ë3Õdxvì|ë^ÐeÝMoèÓÅ;!ÙN­,ÏÊšýh¾Që&£êˆzž\`Q;<+…ÇÛÂΣ X‡^žÄjˆ®LuÖÕmÕ¦Ã, $I+N¸^:°n ÷F½>¿Èߤ’èÇòñ(ç½è0VodE¯?ò8ç¡u©ëRšFí$AË;†šbªm:©IdÇǹ®¿,ø߶ÂÂu½E®f=òŒç¶!´íöHbE@êK÷ÿ)ò4ïÁ×®ÛÚíõˆÇŠ(õ…Šû­ÐSYmÏJÝÙÙ™VGpíHOfj¢Æ*ï‰*:JÓH J"›% CæaÈ^– »3=‰'Õ•ú¥—Ÿ‰Å{¢(ŠÞ³3®.¿´¾RUÑÉtÇŠ,ëÉ ó0K’Ì•¥i¤eP‰^®Æj¢f=².ŽªéÎNGK뵋B”æùË]%ˆ´»ŒCÆ=2 ÿÞlŠ%ÝcÆ“X3P‡¾ÏU‚hÞã<~e8wðÂ/â·œ©ó°sÓùþSÆËÙ X †ÑØñÝ$k•ìôà Õ¤ף, áûívÇ îr]_H!"â¬× ©Ržœ{n㸎÷ÂGñ£xÞ±NÏ9p6ÎUç5Îw;r~wâÍŽ3Ý–Ûˆ¬êj~H «$Z»,M¬ëLx³Ul¶u™ï2[ÉâÐt꺚_[[ülÕ²òƒÄ÷DQͺ^V1št oî$HvÈrëÐYªPV– ݲå«CŸ3F"˜çÇ•dOЛ½"šØ,¹w9Q‹I½uÜ–6ÕV­—£Ÿ›U³ H°cGµ´ñ(èŒ#ÖÕ¬xêD1FŸä‹7œçRí­°Ù6K+¼á<Ÿ¯ é—©¤š×ó îã‚12Fß*PJ«LHÂXŽhkœ¬˜’,’R@þ)ŒK®]+U K>1!„DZsÀaC@;cžö<ÕX~ùÁðÈ—B t÷ö“´Jð,m®ß¸v}@Œ )Î?œ„!Qšä…äZiés!Hû~8;:ê c€,k]ü7äy‡%n’ôÚAœ ˆ<ˆ­»WU!A 0"®•"æû¡BÊ(ÐJ*F€aœ*VW½žA$¥ñÃá0vvZ\ ŒÓ ¯íöÁÆ|†<ÃfgÇâ7åÆ ØHÍ ´´œ1pÁ%ˆAë Æ…dLdÀbr^DB(ëûJ+ ,NŒ)+…ߌ‘Š˜b¾ê&€óP…yG¥!…YÙ:>>:.½8îÄñmE‘׹羔sø~:ô­†eãm"a‚³¬ß/ÖÑ$kÈ÷²õïö8A©ÔóÁ(èÜó¼¡yQDÕ¾ˆkßÏH+@Êü„°ÖHcxØõíBq™dÁm¹@¹6'Rp® c¿8 !4 Eÿ·´ý15±ˆXB8#ç’ã4ÀnØFÊšíªzS«|èÕlšMSæe^æ8…hP$l}y§3ž|}ù»t¹Ó¹|é¿ÞoL¾»À8ÿ•Yv}<¾þoæ—ž¼tšÞéÉKOèéFÁ ·ð¶xѣؙ: 6:éJw‡Ô±jÈ¢r™ÿÚ&jwˆ:ŸGm›÷ ½¨_ï¶h¹¼ÿ¾åŠh¹ºïÂtJ4^8΀Ùôôý³›îR÷¿9ÿáûK¢åâþûK:ÿMLgMðc‡¸†Ô?—[¹|×Õµ’Ý«sÄFOçMK ïÅjƒ ¬›¦iœkGY7MñÅH³Éñ$MqtxÛm‡‡„½Ý³7¿ù‘í†èô‹ç²(Všó HÓP\nšvÅÑnÝïÕdï¶ÃC6üN~õàPí^½:Ó.<úø…‹üwlo­ýkøW|È™9w8Ž])Þvãk¹sçw÷zž)ÄRìw§@x'qÞ _uã‘c¥¤—ߢ^ÿUg— Îîîáº^…Y5™íÆ1gÀxt<¿½ß<jQß(pŒx½{ÿv2Îó(i~à £0P\— Ó$ŠK€¶—t½sÿ…|‰ÓwVΣÎ맹‰‰ÍX¦ÞÌ]Ügš“Í7ÒöŒŽg®b[‹Är`b¸Y7 Ö «‹ê³[¯U/øáÁÇ…'?å⧃ ‰¿)̲0 ¿>̲ðÝýþ`·~ÓÿJâoŠÒ,Lâ0ìÖƒo‚óÿûMKàÉ_¾¯×'q~Sôýú0|÷°®‡ýþ7½nÂÃÆI¿ÿÍqüÄ7ͺŸÍ/‚…WŸm'o7K×Úõ÷‡rYrÄÊùl}¦”ŠÎJÙÙžj“«nÏ>ÀÈ6Û•Dƒ­×N[f—+º.›ÝÖ›I­.È*÷fó:Œpµ\-G5³2Ë“8W þB õl<ö¼ñ¨®)‰1’r0¨ëÑØóÆãÙ”BŒˆ‰oQŒxˆ¤’Æ0)›Q G¢@Ä‘ „,Ž®Ù<+ÊD¾|•E–[wgçèhgÇ–uþ×EœòN;ì1Ûҥ筓ã'q=µ¢œX˜çYìámBÜ5«ãDw–ôå›ÖÀqDm·nŸIˆx}€‰ÝCÓ kÞbÌ¿âKwHñ9z¥õJß"ämÛŸø|â\|–ZŸ‡J½yð¥‚ÙïXëÿÑM|®“9cg7*%â䯷¨!æÕ¬Ú¨:Ûºl’-cEüÛŸ¥~ø)íd¾øé Wή\¹rvåì ^rvå Ÿ›ŸïwÜîÝ]§¾óßyϼçwxàwØ›^ÿzÇm}DÄ\ÊŽ³ç8¢ªsUÅͪÜ4«q³IWM…´ÙÔ¹Z1ت;ž «xù›åî›?å‰Wœßv÷¾xýàù‡×½èž»w±}ô¡¿ü’»ï¾ö /¹Š¿|ð¯ž/ñ}ç«Íÿ9ÿÍ¿t^^zÍÛþ|ƒ:¿?}þïpöãÏ¡Ø|Š#Ç9¡›xØÂxüIçµÎ§:·XzÁæaY©:ÛÆwVm7«õfVWÛFĆM¢2ÔKtô£âð=¦Êu³•-XGm›Õ¶žÕ‹©ëJVŠ™:BoqU„µ^T•uõ¥¶Ø\˜ál†¯V˜Øj»Ê«ŒOJ-¹­€”B°Úž1k0ìfñ}¥Þ_|ò+z=áÝó®5­ Ÿž§@:KYAaõµaü†ºù†ç¹[¢Ä J:A࣠¬Ñ2‘~µ6ú‡}Ä3C)|Oÿ­Ûíu»†TtÖcšYv°¿mv˜ïgÊÌÒÏ<~•¾¯4žôÉ ÀáŸt:òKIò½ßû²½1¬E–31Ù>ä<`Ä”ÛíiX÷-9ã q¼sAàBù¾öò ®ei\š4aÁ%ÁàÏJ}^ø¾#pÎ9BÁöj²†î*ÀxŠïkÉqrœðQèëÎÃb±Z)hôrøEîÔ|;MçU¾R³N¬UÈ8¯{0J%K|òùoÒ ÈÒÖý,CuttÒšÍæ뢀Èó+ÍݾR?ò’·¼eõæ7?im2«wv¥ƒó÷ƒƒz0HïØ]†áydéàGšfƒ´U“²µ[ía»ET–I‚x˜®VéºÝÊ|ÿŸi†ó?ㄨ(;¢8ŽeC‡y›-åßpËùdç'_Å“ø9z€¢×Ð[é‹èè;èwé?³Üq¦ü:¨î?³'÷Üšqådf]ï‚ÑÊÐO=Ÿç)ý»¨×®fª*eˆrdÑ‘4ñ9J–MV*ÁRˆ¹wÁN¡Oò˜5Ó,uà %ö–7˼(›åb«25S“E³Ž´¤ÝTåyÕÛ².²Ýi*3Z³Z5Û«PMȸ2 çCµÕÆÑmG³mdH嶖"ÌF#«RùrU¬ÔJI FÍM±Zž¢!Äà¤ÃR•J br¸XÜÏK2,!‹'1É×µª· ¦ˆÝÕB.&BÂÆhÕz´­‹ ¸`Vˉ¼pà‚Xqiï01«‹UQ65[–¢qDS•ýçy­Êº¬ê²V¥¬WF)ëÉfV7u™Í{1»ÇÄVÆÛf½(6EYÔqYªQ(½úØ{Nñ™jÔ¶ÙhŸç]Ŧ^•M]6*_-Ktߤ›³^Ö*Tx%‘9E³z¶hBPÅfÖGÍFÍšù¢ñÀ(‰b…šœ È¿¿™µ;™< ¤}g¼Êó ÁK ÓxÙÂœGùLÉjˆ¾±ÜÙÝÓ°uMNh½ ª±¾èØ ¯¢žEl9½mdéù*¯š5ÛrU+©ðyôX•É,¸0nx Â÷)Ç•öµ„ëªÜçbsäQ!%8U¨ÏuC>Ä€¹iÈëCË@®=¾ñ’—]½JöÁ†>c’ÄÓ\*V>¾;+¸;ï<‚èGH× ÊØä‘ÁÓÙ. ¬Òÿ¤É–§A U¤ ¡ÔZûLÅÀ³6بΓ¡ë1•]hòœX‚$A&²Ærks0á’ïû¤JÒm¢Œ|^#z£¡ƒÙ£^/³ÖSRzL¸~¨0øðÉE>ðA2¦üÿ…T4„ç)åc<$pË(<¯FNc’‘5’y®:"Æ¥ ¦ˆˆø.Iåßn¸”2b>‘ëCIk #é”'£ ¤Äµ–œCƒR*ÚoIƒDCHÄHâ‘Qˆò”±¿¥F.çsc4"«,@Œ§!`8sɵDŠ N*<ì"ö<p£…ç{Šý™MR0Mà òb\‚€|oÿä2]¸ø2ÁY"Ž•üìÂ'.’’‘ö"©•5‘ ÆBK‘ä\ 2¾åÖ3®ð-˜ï‚qÆ3w@Üež°˜ú$E ìô•²Ðð|%(£lˆ¦ó#æ Î|NeIfÝA´ ø Jˆd˜X¢Ä†DŽ"0Ù ð•$Og⥅tI ¨¢+fÓóŸ9G²ƒ„1iK+F¡oã¸,Dà2ÊABDþu£ Ï»]¥ äsf\7f¥’Rr)#H€Ò*Ž¢öXè¢èäÆšEœÝ냴çÊ\ù±²”eyµçJóXèsÖž4þ»§ °@jÆ-K²ÌCÏDYdy¶À¢nkÔí’¥™Ï8±2ŒŒó]J¸Ï<0bÊh¼V´ZQàz;FœˆH€09çZ·3DŒYƸRŠaÉ$‚­—ŒA¸q+Öq©4˜ëy†  $‘†Ä“†˜çù!0“D¾9µDäù‚€±ˆc-¹)T 5H:Näà…[øÜrÖÞ€oÆ£é[é·cGì5ì=ì+Ø7²ïc?ä8iQ.Š_zŠ€Û€ý›í–”47ÿ­fÛ¨…]¿”Ù†õj9ƒj J±8.Xg˜/ÖUþ“µr6Báöp5_rÚÏçûÕŠ+ I¼+œrŒçYïÇeQ.Ï°.‹&î;ɳK˜ÕËŤAØÓ,‹rsÖž™Ôëz-[ŒV‚““AžÕ1N««Šý@XÜFEã…z1 Ü»ò&¢FÈZͶYÖ.&á"…_‹m¶Íº,d°ýe-ûn·fhn5×yVº7‰ÕÛrQ¬ÞkNž©I³vo$N"ÃfÝ,Q®ÊïÙ^V“z»*^y¼žhÓ¢Q‚Néæf½˜¿kج¶*u:\ÄSù|!3f €*rÙjšå‹¬šU“Õ|aZF5©äBª¬Y>ª6ýZþj­½›(‹f¾ZnÖ1ÿA3_0ðã«IçB2/VE½ÍÕŒ’`¹ÚΪ•õJ—¹læ‹eªÁƒm9ÿ"Eàgfe–Ë4‡Û2SZ¯øÊÄ@m4SóEM’†¿þ?¥Ò®7c¹hž82`è­oS…š,fî©šy¶*Ó¡&›/ªY3ßàìz“&È‘¨‹f±\jã ÅFúžS{¯žwʷγœuŠÖç‹e6†„9ÔVÆó­…”?ºŠÇÜfQÖY ¦P4›¬\Ä6µnÖ›YKlfõ|QË\ã`z]+ùD,ærËZª¿¦Ñhÿ`4"ÎÍd¼»;è ¶·ZN§DÌ úÓýÉXšW¼bhüÍ$‰’$´€ˆ}sÚ×:ý 1æ»Öua‰ gA 3G™è —JŽ­ Á•-aÄX(„y.~zwPf­yX«ÝîhØ.Ëv[<ù¤µOx’¼Ìh/âHÖ k8ëÔ¥ìÈ…æqa‰”̹ç &ÿýðã&­Æˆ1Á}ˆh0È­¶B½ð<ó«E" öK’8&ßïùœ"ŽÊó¢dmñPzðGxŠY”xŠqÉ ôÐB)SvF.,…ÐZ+Ï€$¸’HÅÐÚ¹£¼;¼%ÆcBt¸d²QNœâ)#x2q$,{’‰”9r.ƒ6g„šÁÎ ƒ°ì}¬l5yá”;›ƒHeRra=–Ba¡³Æ†Ú |Þœ{´úš1G70‚~ÒZŒÀÁ¹õ„8ÅGBIý†˜Évk44]ÏžÖÖMRz?8ûIj•ãñ`Ï>ÈBÅy$Þàäxcˆ|Ãa< ¥ÔCðƒ3Z)O2†[H“V;IAüÓ>C¦iYÆ!kõûyN šLŽOêÚc$â8ke)ËNOËGçãïÙhØI@@+(ý ¯iãHrÕ‰Fâî#éyóÀƒù”T~ª”Ї1Îηq?°T¸ó.€D—Ý"ÇßÃXcýÕ–a´5´ZJù5`TgSW„a:éõ¸÷¾Ï‘fœ NÐ7 êú}"å[Ï'p–Ö0Æ;ÝnÏx ³!çRÌ9HqXÇ·ºíí¢À„ÑHx‚ÝO£8 ]„Z®ƒtÞçY;ÌâD<‚I €dJjÎÀC8®î—L zŠ›  1âL0–å(Æ„ HOOÐxlhïy\íÕº’}²A²À£˜3)¯ê„€¼}½Ø4´8Ž€¬TŸÑâ¦v&wê›jMo‰×*¾7Ï çþs³ÀMh à Ž–¦¤ï%€˜yùùQÈ H€‹âÊ,‚Rc.~ƒÖ½óÿÏKŠ$ •$’3Q0&„k¥ c~šÆ-ùsLxžçr€I«“GS Å¢ˆ«8ÖÂSž§R=%‰×¤$ B‹riíäŽã_lËY-+¹ØFAÈj}ÛnW°Aêe®ºà€o çÛ„¬§³¦(×ÄKBØlüdÛbå0wcµ-³\æÛfVmˉ*V êeŠÙqŽÌ]ÈfRmK™oÕv#ÕÚQˆÀç›ic?€¹¡f3u#5æ{!ëÓN¶ÕœY bÄÖÄΕ æûŒpdöý8Pæ­ç&J½›gí5¸ªÕú[­ ê ß—Â÷™3Ž]Ä=gìœ8×üÊIËJc:ž„‹òh¼"v åw¤•Q^>ÉîI䥬³dƒ)|”1Wr3èmš^Ãq¼îÞ–ÿ_¸n÷dÞq]¼f3m®¤„ôêëÜ 0³Ñ ?ž}Œ¿Žss§ô½ôükÓÞtvðºÔóÏÿ-ŒB|¢0¼ëÉÙ`6 äÓR¼½¥_þ¶·}9á&(“;+çœw8Ÿä8H€÷Ôr³˜sñÁ듪2%¯Ä£Mù†ÛR‘*ôÔš(r]2^¯i¥5 OJW…½æ3 ßv8ù—ù—ß4½8 ;Y–Q¹®Œµ~yŒqÏWIb­Ñe¡Í/uûý" Â1)<_ŠHI>ì !¥µŒŒŽÉzÄÚºIêy®k¬›eYfo{ÁççcûØÇ>†üå_þå_þ%²ôâñ,Ìs"„c-m˜%ý¦‘y¾Š×]Ú\îr˜0(Ò÷¤ˆ¤àE‹q)­˜6ZA×&É;_Œq³<Í,^ó‚óíÄù¿]tŸæøΑsÙùBçœosþîƧã'ð»x4-éqz}9ý4»Ÿ½˜½”}:ûRöu¬¶oV„}ê™ó CHVIb•¨ RDm'wÛíá$ëÒ[­¿P°ñÅÖ§ÉÏqo óBåA…DMQf«!³X竘S†$œV Å[MY—Õg 6ÛFß(W°keîÄ*+óy5S¡“¶ò‰’J¸Ú&v]ƒuð«zK «r¨±feÌy3¿©‚èÐÊ‘-V5JÔ³€µŒ ½xÏøbÛ,›UM¦¿m` F§Ñù3ĺ^m›¼È—‹j«Y¹Ú®æÍ*[È<]&Ñ"+‹|ˆC¯c—@$Ù©yµº¡²ž¢:"MQ/š¼¥KÝÙ¢ŸÛ,2%99º´à`›Mñf=g2Ô²¦°ûaÙCEÇVåB•¬Ëè–Û7Íz³ÎgP&úåëjV-šms{3óø˽ ô‹Ke¬8gš3 ßS ÒLòÑp4Ý^ºÜ¿ÜÀ²÷‘çËÂ펆ڳýÁÑ3·ß6›ãÉ]w}âï2«¬6ô—gÄ9#­©r;(™=!]Á×a î'’Á /„ðƒÉð ŽOÓŽ'A?á*ÎÏ^>gÂ~ Ov¦ðËg`8ÇÚ­A/âal]Ÿ ¢("åy6¡†mh. ‘•¢9:ìtpþ’HÆ‘âLÂX÷ ’»d¿+ô;™‘ôŽÁÍL³!éÃÓ¾AŠ€Ñ¨G¤ÎE lÆ hè*YÄ Ñ$†wwö1´ˆK%Maia5Ë:r’ Æ•\u§hµI¡[WFl“xÄé E¨n1œ»,"F¾”Ü(Ƶ2áE¤¹}‰çšÈzŒ(»}ÍùTìIIÄ’½I:I¬Š…D?NA‚µJÁß.¢€K? ƒî[ ‹g £IÆ¥#Á á©Àv q͹(î1á£÷SŒâ(~‘áÄCÌÜnl|‘¶`~‡&L›Y£‘„æñCÆ4H2eU”é›Ë ò‰<ö\®4Yí6³nlò4"Æðrê q0Õ"Ê2&IpÆ„Ù™«âv"rÝÕ“þÁËô4HIÄd¤”¯H­Û^rÉýg¶/öÍŽOdT@ž$ÀÕ‚ÓYŸ4_?KÁx|/coƒ35KâÙ§BHY4¯–eŒE‡›u=£ïuÉóµR´â(l1ùؾ5V•/Ü¢½|ÌjŸY”§qå¢LÙªIW ¿ýäèô·þyô›ï½ëßÿ¹þê—ã•ç¯ž=ÿ÷¿qþmx¿ã8‡½p‹Îð ŽqRç¢ó„óç]ÎW8ïw¾×ùCçoÿ °Â¾ ÄoRCOÐ+èôµô­ŽseÝTµª†hʺ©jU•ªš”YžÕò ër›g¹¼„e½ÞÌÔb¦ò¢YÍz³­TµY-Ï°>Àfµ<ÃúŽ ?o¯m³™©êQ½Š5Ξ §zyvEÔOA®¤›×™M³*³é× _ª¢Æ.7ïÀ÷Õ‹ Êš`RÉ2Ÿ”K0·³Ø¬ëy4æDUί¶/=¯Êú˜çOR0¨6+ЀɦšW²yéØßß.>QP•Å[G!jU©¿_…º_H5cÝÙWØK· wVñ“jj¾ { Ù*^‰ |Š‘'HÇÐ`¤ˆ%i™®tygÀGiI5_4fç!ÁÕeºÛÃ¥•/«*Nh›W²–’,æÜŽS÷l_Ÿ–ÔõÜn@ª;_txhflíò óÍL=Ä-àˆy=[N¶Q:Ý0€˜bZó3¬åKõÈVë3Ì7“Lr‘ÏËùJT¯1Uý?!5üô6€‘/eH‡b‚ pŒZ<Šñpàrœï+ ‚ý˜Œ rAf½~QØÑuÀí ª‘g ñî–\<¤ëp®8ãO#ˆÒ«;w6~)Âah­ëÚcøI{£qÄÖºîã9Ø0´p­uñëZŠÛ(%É?‹“@ŠNgggWˆÝN×÷)‘2Ø?hNæ£Òu™²ÛÑÔi÷ûno™WÕ\NÄR…éíüï³A>à¾Mª—ž i÷''Y!D·<Ø'Á-_Áòä$-…è•;eÁC!¸‘JrÆŒÜÙQmÆ`MûôÔoàšÖÎŽÔ¬—£ä»„|ƒPÁHïrËpâÒ¶O/”Rh.Mû²'u0Ñy"‰—aĈ!Oò·ΩíÂÑ¡”ÅùŒ”$!IÎî–² j¥==õêŸ9W\)®nÛ †c;«v¼1Í@^ „ŒL’1\‹!c—Ù½Œ‚_b¬,Ÿ)äÒëÓŒ.qS;xÖïç[ÄÍ-c $JÍÕ[Å‚Ý Ø Öàíx€W0×SôévAþ«ÜñCû6(Ý{çóøÅ/íî†AÖBÌ\—ÙñäÌðû&Àº²µ³3 [ía?ˬKŸÖ÷]ïhê7©RÝ7žÀµ²]í̪õzúùBi ‡×ïµ…L¸K2/:ìüÞ¯¾d +ýÿ¢$• ™áöÄLw–L¹Î ²¬š/FI¹ÐÓ„ IéLð‰k¬ d¦yQÈR®²4 Ö‰Bù6K𖬃` àÅJñõvR‚+!.[}í¾ûê “ŽÃzá£8Ç¿qâäŽÓ”E9®6«+˜q+ù„„Cô/ýÔwFƒ'=.„÷7oÇ]÷uñÚ.ªίÝÅùѯý&ÅëêœÀ9qœ&dž̑sµV´râ*D”üºs«‰úÚÀý4ιù!Ã{A¸|ÉÔë턾0?h8ç([Õd§j·×Zþžþ?­$ô•ûî;ýÛßÿw^ïuµRšNNî¼ó®»K¡µã€Gœà?áVFïÄU`µñó.8_ðYäØ¢gó#a‚OMQ’jñ§<»·6=¨òâ-;äz!ÚÔhæóÅÊ–nuÛ½áÍû(†Zá&k·ÛmŠ5ƒœƒ¥µŒ¤Ê$Ëtf3¤B«¸e€!Ëk¹tMÂV[(…¦’’˜µecv† é&Ôn·Û=Ïô­+[í¶ mbÁÇDœE²Ý.K²`K6ñ,+ʼ ettË¢( .Œð=B†! Ƶû}£… Dš²XZ4ME`„6`ýþp¨4g‚Â0È•X XÀYD‘°ZQ‘—ãÜz®'„ @u;íQ»Ýíª€ …žëYÎâzÑ%¯®.šì–Ós¦Î‘³q.:W¼øAççiç•ŽƒRmT¹©šU^6›U­êj£ÊÍê*V›º¬óJ•«¼™6åjS7Õ¸*U¾jž—±ªWµª®ò„å&ÊFÕùªnbÔ{&P«¼*ëfS©:_a2¼ÿ]ÙC×=:í»7OOoº/zÓð§7]÷æéùgŽŸŽž=„³‡O‡Ï äÑÑ¿ùþ1ΆτO|ÓóûnÝÿæ?’¯d`-(Ïò<¿cCeIB/EÙê&¾ B•"'r- &Ú­v‹¬uÓS_*â¸5îö'I¿OB¹FƒµÚ­6 ®\k EÞÉòmÖjÄt¯Ó_ñgé&†Îe­åÖË×:ï¸ö´u¿…Xá.g6×W›•m»mDýà±H_&M¹ª§ÛÕ¢(«rœéIÜ ‘×›Õ¦T›ªLdàÓÝ»¹Rï>ýy„Ò¶Úí¶ß\~óbAèt†ƒhß"¼˜GQ»ðð{Eym{~]ű<ùúDH)ãHJ)âï~ùËOO/\8>].O¿¨3;>ÞítfGÇ{o»ÜjEóû"ÀóÓ¾k•*Z½= í4Š¥š„B&e‰×n_Ž3¤‹¥öºÃ(Dú]ÃIïp°Û:¼páØVëÁ`½è$é^,ÁêLÞµÁ ÀîÅf1UÁÃËZ¡Át«gW‹fSm~ˆ yÎj»Yו‰c:À"è°‹l¶›…ƒÁ`¹¬Ù-ýÌÃ&Ÿ@‘:YÆqz=^²Ô÷áY·»ÓjZe5.K>NÓ1Œõ×EsܪX1©^±x?pu˜„—®;¶ÆK’îî4ó=ßOsßÃek§*[@‘¶G$)Ål­bN G"…#k®ßÛpË™9[ç^çe(½Óuk¦x=?²šÕø«WZLˆ¯–‹ùbµaší4¯A‹ÑÊÕüì0Ëò«Ÿ¡rÅ`Ô&ªÒáòæª<@·»÷í{Ý.hoÐíîѬƒ^oo·÷ð|ÚÛ£o½ÑãWlÎQšté¡öu“ô• Áv6íöÒtâcz7n¼ò~Uâ®{½õï~ëÉ\ñáAÖ½ÞúÙ$ív“ôæµnš$i÷–~6…9…ÒH“ÞU\G’ôºIú™Ÿ™æÇâ3mP®‘9#ÏåGóŒóZæ2´¯A˜®«7õýE„•Þb,ÂÂàϱV-²£}yúö½7¡ ßÿ}w®¹÷îâ¶ÙåKg—w­6^µÙl6cÏh+&9àóÔàlôHþZüš Ã? Ã?Rln†Ÿ†Ÿ÷·C×µîȵV÷Œ±¦«­u_öõEãyÓ“š³X’µYä‹€ëÛfI˜­ìË`ÂqWˆÊgDcÛT5£st~»ªf…ƒ_ØxÙ”²ÆלEâzž›à-·KøX—{Z—%ÿ¦¾RœK"éyq¬;Gº3;“‚«‘yÀU.ey̦è÷âÄãck­›Ä;xÞs“7yH¼-B+¯ƒî? ŒŠÝÄÛjI¨îLgF/R< >$é¶VÈ5Øðãå Æ¡©¦·Cž=sr4U±QO«@‰6Ož Ð'fý‘Ò6jµ›ašø®ëE¡çÚ IGM«Y­FÃÂ<0MÓ lµfÓNÇO“tw/IS¿ÓžÍZ­H‘œTŸ£(DwÑIDáèSRB»=?ÞÛc„q`­µ~ÄööŽçí6¨mË2Ëëuwê4âdZ À`PM“ÈÒ:Š÷<·ï÷ziŠ<Ë;I’$<Ëá`§.å¾·œ¯tžw~fø"| ¾ ?Ž_Åã¿àòg:È ¼RLþn´ÙÖÛz\R g\òŠÕ"Öór` ô_~µÕdJ3AÅÛgÈÄ, Ú“—~½ñuÄ>äçÞº>í Ž@$²s%QäD{“_­­+Å‹p[¥/JÔîJ[QÎWóæq˜ä5eÛˆ`Œµ|ƒ`R—¦]nÕ/U ¸–7åbƒj‘¶ÚÔbáð=:½R‘…ícwR†?©ŸX” [Ôóm#S ‹ÆŶ+¼ƒûA '\pK–-¸ð¤R¸®«‰< %T 1¥ È€A¸D:“Ù+%=Á…6¯ô÷Ýî!õ^ZÓc‚ ³ÔÃá“Á0·i&A‚õŒi¬,³LUeë -‹0`”¦EŒ%·ƒˆ„¸´ŒAy\Æ€dÖSÌ %ù‚KF \2pÅ#í’‚¶Œ å1"aŒd$‚¢ÐÅÝ[Z…“4Žˆ­ÚAˆ(,>E‘¯&ˆY É\­‰‘âR€ (âŒE$C)Ï’bÉ| 0f‡Œ@VåáÅ»sU¾ ¦Œ9“YV–„V¹óºtäCk÷7KS×xqúœÙNJ,‹"K ¢¢HŸ+ãÈÒ,$qq QÜnÇqµ;QŒG²<·VŠ #OüÒÕ Þ(ýC5I O¸$„R®§e¤‚$i!À@€ñ}k}ß0à\aÄ=Ò${#Rö\¥„ +=Ø$™¨`2©"óq#ñú@ßKÇcν¨šLB¥¢‘¸V’N_êúÉó=%‹¢(}Œˆ…Ž‰>£6(.Ƽ#ÁÅ›k×ÑøÇK´"ÅÇ/CÎítoF–íiRùe¼ÝµA‹Œq­ëú``F"EJC‚Ó³ àJ@’à–Ò Þ9.H M†N®d¥_%Óv)ÅðéZ,Ë¢XO“DüL4fÔé´ÛôJ%E+Ob¥´J¢,3ïöË¢(¤ò¼òðÕæþç++´¹1¾‡O+ÃaT ÊBayÐ\»E'ÚSé=Ö”"äÃak[üœ|–³Çû[°lÞ*ØÙ¡N€8מ·‚Ñë5át(|^W'¶4>ä¬ÆãÝN—ÀYÈ”n£aè*øžë• Â#éVëO0ÝÞþµÍv4߉NOyäá§GcÊ‹Ýo5¦„Á ßÏõ’¯#™l|/h·³ƒHôÜC;.…a©”éši6ÇÆÆÊeÆ*•F–e> B;÷#ú 7—®šï ]ˆ‚ï¯ D§/†ò$—óFÀkS”ð ÑÏ+Ô}!×*”‚k•‹i×â£bùgƵ?~-•.]ùü#?º†k¤\³üzù±·Pyù¥±ÛŸ¢ÂÛîÜm?ýðáxùoäl_ûå¿‘òfËÿ»ë¯xÚ~çå_¢À[¢ÑRäÀP3¿t£oF†tÜL¯6Ó—Ò.¯™ÓÇØÜŠ+¯œ[Áò|5Y7ZlUž/ÿÕjµçµZ­Æþ|åŠ98)ÑÚ^/º=³Z¹Q¯·vÂuwbÂqgÂv_.G•½nÄA¼ˆ#ølC‘ù! ¿yu˯r"Åv¡. ¸ x2²õœ#9]Tó¦}-é ý©»=3Ý!Qoº×m0ç*gûz«Ezà¹ùÁ‹7ÑᨗWc‡02ôÚ]÷¸yôm-nå3ý È« DÃòÍÒô†H" ýÀŒˆlËVU£ 5$Æ·U¡TÍv«Õ H sÙÀ€;©(ÊPÝqT.µ#&Yvd{íbæð Ôv\žØnT,*Œ‰…jÅ礫ª–ËiÊiž ÓÉTÕ £˜ò”SšrR…!†iÒÕ¤ªœë“4uœ´b6¥‡Ax¹,Í…iê¤:…Ð0835ΉˆsU“d’¢(ô9¯åµšÒBÇM œ\7TE©0.‘ir¦(œ8IŠLÌ0%’$„˜K$5G6„*É´Ù1tG§ëY¥)g©® *“æ8‰­± óƒ^UAG¿Y£ÒÉvªš Ç4óf?¥¾Êœ=Y'Ð3)eœLD³Ñá4\…]Xxåf:Ý„[ -`:ƒ>è£ìÇIÀŸºWšw!çŠ(I¿c%ñ-+åtok–]×Mó<µfš¦7LË ç&E¾/‰bq0™È›bRn(¢™O$ƒÅ¢B’òd´ÞõE ×iH\QMÓüdɪ±pÕv·£Ð™.—'&ÊÃåé½ ç¦iZBá’aš–Ø(t=挹Ã~œ´¨×ØÙJâ`ÄeŒÇº.=”ú·èÿzz\ ¡‹µØÚ;‰+f·ÑYv³^#Ö`ðä AY$Í&"êô°ÄL)"ééo@'$ AÉÔVÀ0 ˆd‚y—Þ![Õ( ÓD¯ÝBÓí+ˆ1¶­Ý¦ó6lX³¦E·Œ^µ}täâk®¹ü«Õ(-0ŠÂBjUUÒáËW5_Bšnœ<Ï-2®f@äºNZ,²§¤dǃº&ÉâÉ?ØÒb—ñ«5‡¶ü ¢ª†QøÁªZ}p°^[õæõ®£ßýÍ Âqú-×å\}è6Y–'ª†NtU¨ëŠêyd ¸šV CQ‡ì²«©ìuÙETÙ݈Ìášú™n7E£ˆotXþ*ÿµ°ÏØ-…LçÀ'¦QÜ|±õDc]).Ô +¢Љ@–Ã"™¦mi¸Že ݘ²ˆïÚkLÔFºòÀç¤M›v5G»­æîà­~M»•†¤ó_Ö™ŸOåpç‡Öÿß]'nèäƒZ±¸ªÈ²G¾dΞïÛ×{§WÒ •¦Ö‡m½`Z‘¬»®i¹^’&©ãRì=‚5hö6,âdDpôl…3ŒÙAèÖL¿Õu¯oÓ¹ ToÞÆ¡¿Úݱå Bÿ <80º¥Ó› “WkF´8Z­HÝ/Ë  OôRL»[Õ¶¼‹Žnƒ†ÿnË…ƒôgrz"óÂÝ*”€KŠâkŠ~´†Q—Hâ’BrE®’ªÊ Ó„ëعÜÅS¬`ù§‹ÛŒ‘¤Û©vúRj™I¤Ý~LȼDJ=ËÒ…l˜ŠwýíTI–uÁ9ã¦ek–eJŠ¡Èœ+¶a$²,ÈŠc‘¨YÁÖeá{¡%T-¢;„åXB#!©†ìø¥,.ªB²$ɪïZ–Ȳ\—qÅeDÜq¹Ä¼Ý5άÀwmI".W]ÓRe’}›“¦ñéð/ˆ¡i—-±ZÊîÅçœÙ²DœdÙâL ,ÓTÍ0¨–’Xñ„©ir©¡Ä… ´Õ*1ÖCÅ›t c‹ZÒ2Ð0¹²4^m¬IuÙ¨~UZú²1)BµÆ…ò³XáÁ¥.GñèE°ÄÞšBÍŠÅLU‡ž¨ §9Iê£a¨éã­¡<ŽMÙqßMýRfï%O-åZ-Ôu½8µºRõý¤v·PP…W.M»åR>^.ëÓ¥²'K’tÁÔà¸cÛÎøàÔù–ëVÖLŒ' •Ë#ã³=&•J¹]­6›Õ–*K¡m;NÊyýºv¡š=2žm1 ÃêÎnÏó{Í!F†9<¡éŒ 5{\×5Aü ’‡ÓS]›qvã³8‰—ðÿFò•WzôUä†Ê ‘ŠØ ‰OÅ—™§,·‰$‘…]UA3^/B¡8d½YçÀ?Зà7ÄΪÃà6Îé¦Ñqª€ÕûM·:JlÓ¸¢ wjyÈa E‰&9dD"Nš Ûi?‚ÌC\¾õº}út ©\³íz¦sN†™Í × n( †ï:Wwxš¬‘ ƒ4ÇQUU·ò–-+iZ¯$Iž×ëW—ËdšÖøÅ5i\æŽÓyÖ±u£ê:Ö·]×0¸T|FU«ŽCžWžÌmƒùy£‘VÓ2ó#—1îØ¢ b ³¡eX®ã0²lkö¼0$:ot,aÅá‰Òšf˜–fYºÎÞF,‰‘,›šRªÖq¬°ø%’$É C¿[ó¹–e¹§8Åb˜’>0É,Ž‡™¦_”FK%É,—JuË'QŠ|‡±¨]¾î„$I'˜m §ïœ̪†¦K³ºú®,'‡Uá¡ëþ»¦r kN:®9Q.[Þøêñ’gDwǧ—l!mnb¢0¹àz%U#ÃLCCâÄbÃuíÁñ¹U(΃€È²l›q? ²LËdÆûçŸLr½ ÎýˆÍÑ{!ÐÃ\ E~ˆ L›$Q˜˜ä©.2«ÂÜ$A¯™‹z &„3$¼Xv¿™ÓÅ4Ú›¦ÿÊáq']þ‚ã(¯_pž[‚1rœm~| ¾{ó͵ 0Í à8qœëÓÝ.ÑÌ_j´‰Í4ËâDòÃœÆY–¶ä’Üú_ÁOüÖu‹¡ípâ®S¨øþ=—PÞ¬ ¨È;÷#úÇz †0ÍCzïT£Q…bÑ‹•”•ð+|(‰ªäÕÄ!%¡ÃŸâóŠ2¥ŠG…xT¨S÷9…¿¼ã6ÉZw“$Ý$I çë~96‘¤Çÿ»¿™ó›¹tÿµŒ]Ëù ‰•Žµ~M‹ˆQÁ(ú£m"êôj^)saL'«Aí¨ÓÍ›vo]!¨WÞ2͆æ´´¼è›&Ñâ;Þá+à/_±øÅÉc££ KcÎFpÙÌ £EËô–¿5fZ>ú¦µ¼´Pòý+Fi 2±zl”Þ±¦×«TiŒÍÌ\†Ô§sõ‡ÒVÀñjç ÖhËß&êí~+èì ‚ÓW¨¦ò€×èƸBñòvGŠ›\ñMÔáGVhú´Ã'’À™j¿ç¸¼)^«jVIÓdº‡Ñ%ºëØŒLB[–nhm‘® Yi*sÝ´F½Aš®)œ%±S7ÍÄzåzM±,y “‚$U™+´b–&̉BãR.Ž-K$û¾Jó.çÄî#YÓËV°|"ÍÚð)1.i–¢Xv ¾Jº^¶ÓTpI®XVU’ å’D¤H¦9äÆÂÐ%E ÅT¨¾rf¦^§Ù$‘$ÒÔä+2“4®Ac‡Æ~Ú›?ÛqµIìE#ȽámP-&CËê ß[R)M”†°Ïï\¨3!Ý,Çš9õŒõd&iZzñjЈ X!Z °Ô×ý($+Êö{ïáf?‰9¶Û6ÙvY69vÛÙVô…â¾íKb¿=:ÚéÏÎz{ýj%0<Ϩ` „3¶eË–óGZÒð<#¨T}Ù²¢º?bš†=>n¦Yw=]¢Z²ìªëUFGG<¯’¦É%Ýsë×ó0RËB(ŒB^V£ˆÑ f!3£ÈA äE)Æ^Æí6'ŠÌ¬ HZÒ#å²/ž¬˜› tÎ%®s³+æb®¿\Ö5Ê3dØæ±%N¬Ñ˜²Ì CgÌR™H¤Ï˜nL˜ÖT£ÁZ, -*1V + Yì)ÁØbDlºŠIlÇ~|ÿ‰ÿOmºŸ§#ô=¦ýF7Gº~«‘=G8ðÚ` m«0lµã>žl¤;A­®s¯Ïº¾'°—-Ì–ö¢™NœL“ÆEŽÂ&E؉“¡DØt(´„™5Óë+"l·¢$XÒÓÆ À°4býV{f%;­÷[½z»Ñj„í(DÓk{ý”8ÈïF¨ê‡fÞmÔ ¸ûÝv‡6Á ïæЇ…`¦)y5½ù! vE°-Bø4A¿;6TÀ‹m½þL£ÕÆÑ5ê‘s†ãNTo+y7„UJ2vëL÷’ÖgÈþÁNûo(ÚuÁ( ç+ÖjÇíN+m؇XÄma’7Ìr›^úgLX¥Rµv3Ÿ4k ýÅí íq-½(ü™©Ð²ûušâ¯çÂ`«Ú!gšš‘·µíg81Ý„"ÑY»µÖi NÅcã£cÁÊFƒñiW7ª•©ùf­UÍ2§5>^*ÓU™1•‘¦ê¼ÅÉ°mF j}™¦kDL ¢ª« h-%[YC® U·LÎIâÞéD:Ír‡+Š{7à¡[2Q!7 ž…ƒ@ŒR c<0g¼I"²D@Š"3ÒiºFœx°–L".L$%U(‚TbLÒ‡´%²ãdI³‘“Ã8cÍȲsÎo¶KÒ¤$„ô¹ê$ëfoÂ)FSDH\ÒÏ~ Xœ\ŽTA3$KVÂéºöéß×0b©à<ãúÿ‘%™›8w³Û&;œSÊd…$îO×›Eß [Žãymmh°Ó© çÅŒ¨U'×ÍÓœ®:©‰H$YŠ‘˜£™wÊB!RIfä×é(P×ÖŠ¦jC¦º¬ª]B4-3b$lÁ‘ñ>Í(ù€‰)BôÈ{ψ) ɆpèíL1E¡¿õ )[+q› IY×I%[÷ùi’”.`7#«’PBÍ&• AÜ©*qÇ^p¾‰Y¢’PnÈÊÎÔÄ–[ ÿiA*.“¢8’iµãe’sEpGQY¡?WÒY’]©1ˆ¶i\ ôE(U0%Q¬[õ(L®ci€Ð#s{¹ÒIÜ“g¤ÇPN“É案oÝ_LÛ²ì$)>œ†a$†áýÅÄV=)®ÅS< ·jkTE–õ!Çy¼¬ú´ì$Ͳ4±­JX|¾ÜóÙã÷„ùßSî(ŠºGU?Ž}Š“ú{ëIL>fï\ï³(>ÙOÃó.ûoL"©|m@dEäº{¸$]‘ëCÒ5ÃÎʼi5,AåLÜÓDm®Z]j8™ï?‘´zœ— }ÄÇ qþÈ2+™¦BUKU$Ù²(r"aÅ$õœ“ªªž$*—¸#<]Wm‰TaʼnfXVÊå$©UÁUÇ•#¢(Ò¥K¡$9ƒå²ÉY'žÏà n deí'W•¢2nã•ê㥠eù¶iIŠ2:Ô¬T•¨l A¦¥ Ä #²Ë¥©-ª¢8ªly¶f©iišã¾¢‚1fq)r=.¥ql&ŽãpêÆÉøF¨ZB-–×<ʹÑYz/&p9®ÏU¿dýIêÔè˜ñÓìÙKLÄNUô;ô4׬Ü\dÀäL†~•ÝzÞ¹7.šœ`SïLšê0žñŠ>PY¥9N1Jºã¹Q2Éu£Ì¶Åܘ&„› …HòVÎo¹d~ÞY¬f™Äq»5¿¦7cs"ÃÍûa’Zjø¾b¤iø^Ááò8–¤8æ¯'Ô¸ïeEדdC'Gµ´ ¼²f¶_-FÙNH±m³0ÌüžmÙäû¥8Ý46J45yá'ìbÖXÕíT*DCC+½`°\¦¶ëIRB±,;_ʲ,˲,Ûdqfy–E–åšœ›A1òü ôç$G1-¸7fá8 Â¶C½;¤9Ûë´¤Úúí¤LG*NÑEã&’;+ŠŸ-Åhã ‰^3os¤ˆ¼3Óï%Šè·§¨·šÇ‚þÌdYÎJWéúÇÆ’ãwè –Øm”q|èÞ±P ueE±¸¥ ÓŠro?¢X¼=i^$ì¡mëìÝ#çïSMæÃëç*ß¾^Uï`ñ_v‡ª¶æ ™"ˆH½é¦G^¼–óɱp’³ë Ã07n4È0ŒWneëb¶üÓîØe,Y;PHºv}s…éò¶m8'‡èö«ËÍ:ä+[y³ŸG ØA ´,& øÿ@ayG?§¦6܉l[™.Z–—D‘6¡Û¶nqÉs$Iš~TU§½>«ªßøœªŽtÛŽ¦Ežm—&_§{ž¡ë¶ç©¯–mtÑLCûœª~V3 祲¿“åb›q!¶õ"öuâQß«yÁLÞlêqt0/5ÆŠ‹šV«Ýì7§êÒÖ­]´ôÐCK$ÉaØš #YzúvÒ´Z]Ói‹d™–³ìZÕ4©JDªAÑ=Ÿ bø÷£-MŒæ8HSw+À+.Û¡zȽÎ(˜ƒ‰xùÉ'§¦=ŸQåÆšÂKý¸×ZŒùû.½t®˜•Ë]’žeÅ,®Æ1ýkKª¹ü®“ 3/ Ÿýò$«VòÑJM™èþ¨¼î1(È›ÈÒÀÙÕa IAa_Ô^IÜ™>:mû¿í‰`o@¨ƒ(ÂÃ- £#‡¿ Ó¹Çã@û2|œ„9-q&ì¢å8Ž"Ž E’ Ã餫œë%³Õ=I¶ã8VÑŒotãÄ…ÃÐ4ÐY›ûÑØððÀX£QÒµÆÈH4R*-LM2‰Gs¡…å²EE’iðu`LöEa²àÌ°Þ%ýæÛvTUÿPÒˆÈ%¿¼ÒÖB jy>hÚÕŠ1ÞlÒêZ“¢ åy}pnnŽ1¢¡RIÆ–à _”¿JnñWÖT„’›í–ÄQå¤ÙN⨸ùÊ…Š8ƒ ÖúfVSg:qö{ÛQ,Îmت6êo|Š,k Ò—ú•ËB£ƒä÷”ˆ3®êq©¬—Ë‘®rÆIªê~b*sô%º^Ž/ÝZ~e$M3‘™¦#ŽÇE$±p jVE#A(+Š#QZIù ¼1ÛcשYØIÿcÎtà³ÿ íd äWe/ º€XÔ€–Ú.@¿0TÀاs°Ø&`/Î àÜ*à>x*àüàª@pÎá < D»€èe >$›tž @á½@6 dÿ K@q/Pz(§€Ê"PUêA ¾ h¨Àà`h:äãÀx?ŒŸ&N“×SƒÀÔ!`êÐ6öïÎa {˜0ó0s˜S{óŽ+/V•€U‹Àª³À‚ ,œÖo6,›lÚlÞ œ¿¸ð:à"—KÀ¶qàŠ½À•*påVàªYàªcÀö}À5û€kçk×þÛYàÆp“Üôàžo÷îØ ì>5|ê ð¿?,>»ø\ øüÝÀv_<ŽŸ¾ÿ¹8¹øêYàëÛ€ol¾¹øæïo½øöðÝðÝSÀ÷KÀN/~tøñ^à'ï~ºøùà§_†À/¿< ¼|ø€_›À¯O§çßì~{øÝ,ð»ÃÀï÷þ°øcüñð§CÀ™ÀŸ¯¼ œU¿n^íçBàÜ)-€˜’~’¿RƒÄH•@Ú¾¤ÿdíÙ‡@î6w…σ’} ô¨ð*¨xT^ \ª¬UçAõ%Р’@¹ Ê¿>Ù ŸM^š:jMouvƒº7‚zUÐL4s4»´b=hŇAçµ@ gAk·Öí­WAæA¾ÚXmRA›çAçm AÍ‚.:ºX]ü Ð%ëA[AWÌ‚® AWmߺú èš} kN‚®]w7è–EÐíg@wìí|/èÎÐ]Û@wŸÝs ô`ôÐó ×Ü Úsèu³ ×½~èèM‹ 7ï½ù8è-{@o=zë« ·íí]Ú»zdôè>Ðc=Qýà'÷ƒÞþ*hÿVÐS[AOWAïüè]K ƒo=sôìVÐsÇA/”@/œ½çVÐ{MÐûÆAï¿ôþ£ ̃]zqôÁõ ¬}äUÐáqÐá“ ÿ‘‚>¾:b‚þy?è_öƒþí4èߎ¦ ÿù<è“›AÇŽ€>5úÔ>ЧŽ‚–¶‚>ÐgA_xè‹GA_NA_Þ úÊÏ@_낾¶ôµc o.€¾Û}w7èûÇ@ßÿ=èû@/ ƒ^úè'{A¿¸ô‹ý _š _>zy/èåc _í.NŸývôûÝ ?,‚þ¸ô§EЙc ?ÿ+è•AÙ :»ô׃þvôêc åйÀè0ß&“O€ L3ÁŒÌØfuÁœo€y»À’õ`u ¬±6¸¬ù¯`#;6õa°Ö`í¬ý °éC`ã`Ýͬlö:°¹%°%°σ7¶² ¶jlã °­.اÁ®<¶}3ØÍ.ØÍ[Áv¦`;ï»`wýììžÓ`÷uÁv-‚ýÝçÀîl÷,؃·‚=tì5%°=×½© öfìÍÁS°·¶ÀÞö9°‡C°GJ`í{ü(ؾ`ÿp#Ø“&Ø“GÁöσý÷Ø»¶ì‚=+=·ìùc`/ì{÷6°÷¼ ö¾*ØûK`ïìÐu`/¾@L6d˜ózVzè0,ßãh`g¯4] cú™ä@»‘ágŒéÇûÆ $øʘ‹û´÷Á¸otiçý1 zaŒÁæ4Ʊ‘¾Ý+ý9&ãV’ÇtÙWÆtlg›Æ L²÷Œ¹eå­ó`sºò¶ûØyß½Õ~z²ÕžëuÚÓ½êðÆûîÝ]]óšÛ¸ïžÛªýõ*ZQ™ìNN¬»o×kïßyÇŽÝÕá[FªSw?ó÷ú™êÚûoº÷Öª—Ývǃwßtÿzâå—žlû¶íà¡ß"˜ j.AÃwŸDi2Å —dÌÅUû®ñuíì¾Ù”:zò¹¬3^uôw7çvWÿ—›%óEAÄhPF„ ö¬Ù²ãƉ;öœ¦¼N÷ªu„~)0”á畆¹#œYsdÍžO("M© kÅ.c†¼î2ßïµÎDFr á‚Šozâ³{WŸü:z¥àƒú⿤L^;PlÎt˜õ.‘ÐÍu$żóå Ž¢ôt48ëe•åŒ;6AãÞzÄI>“^¿fuX?‹|â•çyþ!­YvØç—ÿ“assets/css/font-awesome/webfonts/fa-regular-400.ttf000064400000173564147600374260016167 0ustar00 € OS/2_W^Y(`cmapJ¦ÐØ€glyfª<ÒËhhead&€'=¬6hheaBä$hmtxÀ ˆPlocaày«JXªmaxpã% namen@‰Célpost9;Éít þ‘¶áh_<õ àîðààîðàÿÀ€ÀÀÿÀ€€ÔÔ# ÑLfGLfõ„AWSMÀ!ÿÿÀÿÀÀ@9¥ €@À@€€À@@@€@@@@@€À€@€@€€@@À€@@@@ À€À@À@@€€€@€€€€@À@À€@€À@€@À@€€ÀÀÀ€À€À@ÀÀÀ@ÀÀÀ€€€À€€€€€€€€€€@@ €À€€À @À    À@À€ @€@ÀÀ@€@@ÀÀ@À €€7$4$ 4ÌÌ!%+9Zabcdefghijklmnopqrstuvwxyz©®#(#ó#þ% %Ï%û%ü&&&&9&Z&[&\&]&^&_&e&ª&«&½'' ' ' '1'D'F'S'T'U'W'd'•+++$+Pá…áþððððððððððð"ð$ð.ð>ðDðEðFðYð\ð]ðgðiðnðpðsðuð|ð€ð†ð‡ðˆð‰ðŠð”ð–ð—ðð ð¢ð§ðÅðÈðàðåðæðëðóðöð÷ðøðþñ ñññññññ#ñ(ñ*ñ3ñDñFñGñJñNñRñUñ\ñeñ†ñŽññ’ñ–ñ­ñÉñÍñØñÙñÛñãñêñöñ÷ñùñúò òIòJòMòPòRò[ò]òtòxòzò{òƒò‹òŒòòŽò’ò•òœò¶ò·ò¹òºò»ò¼ò½ò¾òÀòÂòÃòÒòÔòÜòíóó(ó[ó¥óÑôô%ô:ô?ôAôCôEôGô\ô}ô­ôÚôæõ,õ1õ6õAõVõgõzõŒõœõ¥õ´õ¸õÀõÂõÈÿÿ!#*0<abcdefghijklmnopqrstuvwxyz©®#(#ó#þ% %Ï%û%ü&&&&9&Z&[&\&]&^&_&e&ª&«&½'' ' ' '1'D'F'S'T'U'W'd'•+++$+Pá…áþððððððððððð"ð$ð.ð>ðDðEðFðWð\ð]ðgðiðnðpðsðuð{ð€ð†ð‡ðˆð‰ðŠð”ð–ð—ðð ð¢ð¤ðÅðÇðàðåðæðêðóðöð÷ðøðþñ ñññññññ#ñ(ñ*ñ3ñDñFñGñJñMñPñUñ[ñdñ…ñŽññ‘ñ–ñ­ñÁñÍñØñÙñÛñãñêñöñ÷ñùñúò òGòJòMòPòRòTò]òqòxòyò{òƒò‹òŒòòŽò’ò•òœò´ò·ò¹òºò»ò¼ò½ò¾òÀòÁòÃòÐòÔòÜòíóó(óXó¥óÑôô%ô:ô?ôAôCôEôGô\ô}ô­ôÚôæõ,õ1õ6õAõVõgõyõõ–õ¤õ³õ¸õÀõÂõÈÿÿÿàÿßÿÛÿ×ÿÕ«3.- ûöäÐÏÍÌÇÄ¿½³«©¦‰ˆqha]XF@?) äÚÀ­ª –…ƒs740/. à Þ Ý Ü Ù Ì Ã ³ Ÿ z K  × ™ p l k j i h T  Ø ] M < 8 / (     ØØØØØØØØØØØØØØØØØØØØØØØØØØ"* ìôèæöÞê6::.00²ØÖòÜÈöö`dbNL”R´Œ¤‚æ°âæ š–jj„„D^FZ>B^fF,,(ÖÂ4¶d`( " BÖjl¼ þÞ–È..(  !"#$%&'()*+,-./23478;<=ABCEFHLPQTUVWY[]^_`efghijmxy{|€ƒ…Š‹’“”–—˜™›Ÿ £¤¥¦©ª«¬­®¯°± LE!!#%*+09<Zaabbccddeeffgghhiijjkk ll!mm"nn#oo$pp%qq&rr'ss(tt)uu*vv+ww,xx-yy.zz/©©|®®‹#(#([#ó#óƒ#þ#þj% % P%Ï%ÏW%û%ûP%ü%üP&&i&&_&&L&9&9Y&Z&Z«&[&[®&\&\¯&]&]ª&^&^¬&_&_­&e&e2&ª&ªW&«&«W&½&½y''_' ' Q' ' …' ' Š'1'1'D'DŸ'F'FŸ'S'S'T'T'U'U'W'W'd'd2'•'•++°++°+$+$W+P+P3á…á…0áþáþ1ððQðð2ðð3ðð4ðð ððeðð5ðð£ðð¦ðð]ð"ð"6ð$ð$7ð.ð.8ð>ð>9ðDðD:ðEðE`ðFðF_ðWðY;ð\ð\;ð]ð]<ðgðgðiðiðnðn>ðpðp?ðsðs@ðuðuAð{ð|Bð€ð€Dð†ð†Eð‡ð‡gðˆðˆhð‰ð‰FðŠðŠ2ð”ð”Gð–ð–Pð—ð—8ððHð ð Ið¢ð¢Tð¤ð§JðÅðÅNðÇðÈOðàðàQðåðåAðæðæEðêðëRðóðóTðöðöfð÷ð÷mðøðøUðþðþVñ ñ WññWññBññCññXññ[ññ7ñ#ñ#Fñ(ñ(ñ*ñ*ñ3ñ3\ñDñD]ñFñF^ñGñG^ñJñJ_ñMñN`ñPñRbñUñUñ[ñ\eñdñegñ…ñ†iñŽñŽ¥ññ¤ñ‘ñ’kñ–ñ–Vñ­ñ­mñÁñÉnñÍñÍwñØñØxñÙñÙxñÛñÛWñãñãyñêñêzñöñö{ñ÷ñ÷{ñùñù|ñúñúò ò }òGòI~òJòJ€òMòMòPòPƒòRòR‚òTò[ƒò]ò]‹òqòtŒòxòxòyòzò{ò{±òƒòƒHò‹ò‹’òŒòŒ’òò“òŽòŽ“ò’ò’ò•ò•òœòœ=ò´ò¶”ò·ò·–ò¹ò¹—òºòº—ò»ò»˜ò¼ò¼˜ò½ò½™ò¾ò¾™òÀòÀ4òÁòšòÃòÛòÐòÒœòÔòÔ©òÜòÜŸòíòí óó¡ó(ó(¢óXó[£ó¥ó¥§óÑóѨôô©ô%ô%”ô:ô:ªô?ô?«ôAôA¬ôCôC­ôEôE®ôGôG¯ô\ô\°ô}ô}Uô­ô­±ôÚôÚ²ôæôæ”õ,õ,õ1õ1õ6õ6õAõAõVõV³õgõg´õyõzµõõŒ·õ–õœÅõ¤õ¥Ìõ³õ´Îõ¸õ¸ÐõÀõÀÑõÂõÂÒõÈõÈÓóójóKóKGóâóâmóåóåUóôóô7ôAôA>ôMôMgôNôNhôdôd4ôŽôŽ§ô™ô™2ôšôš2ô›ô›2ôœôœ2ô¡ô¡Sô¬ô¬±ô²ô²ô³ô³Hô¾ô¾OôÁôÁBôÂôÂCôÄôÄeôÅôÅ\ôÆôÆ\ôËôË¢ôðôðzõõTõõ{õõ8õõlõ4õ4Wõ5õ5WõSõS5õ‚õ‚Qõ–õ–ˆõ¤õ¤2õªõªOõ´õ´Iõ¹õ¹fõ»õ»rõ¿õ¿BõÁõÁCõËõËeõÎõÎfõÕõÕõÖõÖœõéõéAõêõêEõúõúöö¸ööÉööÀöö¹ööºöö»öö½ö ö ²ö ö Ðö ö ¼ööZööÅööÇööÆööÁööÃööÂö ö ³ö"ö"Ïö&ö&¶ö+ö+Óö,ö,·ö-ö-Îö.ö.Òö3ö3µö6ö6ÌöBöBXöDöDÍ÷à÷àW÷á÷áW÷â÷âW÷ã÷ãW÷ä÷äW÷å÷å°÷æ÷æ°÷ç÷ç°÷è÷è°÷é÷é°÷ê÷ê°÷ë÷ë°ù ù 2ùù2ùù…ù#ù#¾ù)ù)¿ùáùá2ùíùíaBrÌR˜ÖBn¬ú,v¼ÞVœÀêjìp°ô,Z¨Ô4b€´à 0 l Ä ’ ´ æ B p ” À  V È  Š ð¢ô*ˆ~æ|8èbÖlÂv°V¼(à˜PjÌ ZâhÊb² X ü!Œ"”"à#F#”#è$¢%$%x%Ì& &b&Â'l((Ð)F)š* *¢+B+®,,€,ø-Ž..n.Þ/z/¸0`11t1ð2”3 4T4–4ö5N5ª6P77¬88È9:\:Þ;L;¨<<~<Æ==Ž=ø>„?d?¸@T@ÞAjAàBZB–B®CCÊDPDÒE6EªFF’GGDGÎH2HÊI<(',¦Óþð Ó'p$#+'(<=*œ Æ('ÿà@ 067!3#"'&/&7636767&'&'#&'&?#&' •(8%&&%8[ ![$$d •Äˆ &%88%& $$ ÿà€Ÿ6'&;675367&'#5&'#7½   ø((Ð}} þð hh˜˜íÿà@ .673#3#"'&/&7636767&'&'#"'&? м‡8%&&%8_  _$$¤  Œˆ&%88%& $$  ¸ÿà@ )%&'1&'6767'63&'&'6?6 02  00 ~D----DD--)‹ I€0 #'0  0Ÿ--DD----D@,« Zÿà@ 67!2'&7#&'ð  Úæˆ þp lÿà@ <X&'1&'#367674'&'673#&'&'6767301013010150901#0101&'&'676730##5(5##)##5H5##)|  H  ((  (  $5####5:$"5####5"$:|  0  ÿà@ )16?65&'&'#&'&'6767'&?0 02  00 ~D----DD--)‹ I0 #'0  0Ÿ--DD----D@,« Z '%&'47%6~þÛ% þ°  P s ’“ ¨¨P°0 !67&'!!67&'!(pþpþ0°€ 7%674'%&%þÛ P  þ° s ’“ ¨¨ÿà0 +=6716736754?676=&'&'#67271654'&#"3@" "4#5%$6 6%$`   ""&"* "6%$$%6þÀ   ÿÀÀER1&'&'&'676767&'&'&'6767673276=&'&'&'&767X;;;;XH9:"""":9HH9:""'1#63""""3,    ;;XH#$$##$$#;;XX;;"":9HH9:"""":9H'%%""33"" P X;;Ð))))ÿá &'?376'#7Ö¨ "à" ¨F¸\\‘þp QQ þßÚÚÿà@ )91367674'&'67&'&'##5673;#&'58Œ5##$##5lltl  tt  Œ ¨¨##5%#65##È 0 ÿà€ '"3276'&'&'&767676'X6EE6226EE6,8888,,,,8888,<446FF644++-9999,,,ÿà€ (36767&'&'#671673#&'&'8hK1221Kh8h?2332?hpþ°21KK1232??23Pÿà@ #1367&'#&'5367&'#567367&'#8ðð¸¸ð𠨨˜ˆÿà@ 1675367&'#567367&'#8¸¸ðð  Ð¸ˆÿà¿ /16767#&'6732&'&'&'676767'&'àK1221KD00 •Ÿ  >>Z?2332?X= 0Ep21KK12+*B Y9:32??237 ,ÿà€ %67=&'!5&'675!Pþà ÀÈ記˜þpÈÿà@ 3#!67&'#367&'+ppppˆˆ þ `ÿà@ &'&'567676767(--DD-- 00  þøD----D((0  0ÿà@ &'675776/76'&50P” š—çˆþð€vPÔ Ú—çÖ ÿà@ 3#&'678Øð þˆÿàÀŸ66&'#"/&'67 ´´ œ œŸþïþp@í íþÀÿà€ 667'&'67 & þÚŸ þ£Nþp ^þ²ÿàÀ 3"132767654'&'&#1#"'&'&'6767632à0((((00((((0à45;;5445;;54p)*..*))*..*)°=3333==3333=ÿà@  #3#56736767&'&'#6758p,,xxA*++*App,,Èÿ+*AA*+àxÿÀÀ 47167'&7667&'&'&'&'&'676767/021K6+[ [*21KK1208H?2332??23:6 6ÀK12k k0DK1221K¸'32??2332?Z>A @ÿà@ +1675376/6767&'&'##5673#8nw e.'&:€x€€%% À°˜¦  $$1:&'à¨%%ÿá@ŸY201'1&'&'"1&'&767676'&'&'"'01&'&'&'&7'676'&'&'7&[$#; 96G >&$#: 96G    >&e!  $=   !  $=  ÿà€ 367367&'+¨¨ þˆxÿà€ 6767567&'&'567()==)(66RR66 è=)(()=èèR6666RèÿàŸ66&'&7 ’’ ¨¨žþ¥[ þp ÿà@ 6676&' "'&7 wccw aa‘ŸþµJþ¶K þpCþ½ ÿà€Ÿ6'&'&?76/7z –– ›› –– ››y ²² ¹¹ ³² ¹¹ÿàŸ&67576'&'+ ££ ••– â  â ÍÍÿà€ 67!!!&'&7!&'P þÒþ° /þ㈠ þ˜  iÿà 51;!567327!!&'57'&+!6767&'&'#"'üþ`†""+Ì þ€î+…€@ `""+p°°’+þÀÿÀ€À %?'3'77#7!67167!!&'&'0ssæssssVæssþÍ    þà ¦¦þ´*¦¦Ð¦L¦Ð¦¦  þ`   ÿà•$T/&'567676676701016#"'0'101'0101&'&7675&'&'&0101001#"'â¯/! 5>2 2>5 !/¯  # ¯¯ # £-A6(' # # ((6A-£ C%,££,%ÿÀ(À3/'&?'&76?6776'&?'&/ D™ o ‰‰ o ™D5 vVj i Vv 5À  nœ II œn  Ol U x88x U lÿÀÀÀ &1E&'&767#47167632#"'&'&5!&'&'#671673#!"'&50'((''(('Ð""""/^#$2\2#$123K\K32  þ|  @----####þ°11K3223K   ÿÀÀ3B%1#"'&'&54767632!13276767&'&'&#"776/5&'Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!è ` UÀ9////99////9F::$""$::FF::$""$::Fˆˆ @ 9{ÿà@  "4?JUgy!67&'!67167!!&'&'471632#"'&53673#&'673#&'673#&/"'1&547632#471632#"'&5@Àþ@@Àþ@`   hààààààH     pþÀ@þÀ@@  ``@   @  ÿÀÀÀ#3&'67576?67&'&#"'&5767'&50P@;EI"  $&Ua)'*--+53KPE¨(þá1Xd"  N ò $íÿÁ€À6716776!5!/'&' ‚‚þà   šš  0þw\ \‰0 þHnn¸ÿà ,9/&#"'&#"167!%1!6767&'&'!676'&'Àˆ S P€þ€€þ€P  pþÀ° l+ p@0þÀ@ÀÿÀü¼(R'76776??6?654/&#"1!67675&'#!"'&5476;67&'#¹ .ç†.†:£Å  d Å þã%%% þð pp… .ņ.†:çÅd  Å '%þð%%pp  ÿÀÀ3L21#"'&'&547676367167654'&'&'?76/76'&'&9////99////9F::$""$::FF::$""$::FQ////////117711117711þ0!"<=CC=<"!!"<=CC=<"!Q////////ÿÀÀ3B21#"'&'&547676367167654'&'&'6'&'&?9////99////9F::$""$::FF::$""$::Fqo/@€117711117711þ0!"<=CC=<"!!"<=CC=<"!/o/@€ÿÀÀ3Vh%4'1&'&#"3276765!67167632#"'&'&'76716;&'54?65&'#"'&75471632#"'&5Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!ª:  ,: 6   À9////99////9F::$""$::FF::$""$::F[ $   »  ÿà@ !Ge167676767&'&'&'&'67167&'&'&'&'&7676767167&'&'"10#"'10521#"'&'&5476763 1(( ((11(( ((1Á$00==00$#  #$00==00$#  #Á"""####p!""!## ##!""!## ##!ß"""Ð""""ÿÀ€À6Dao&76/67676'&'&'&'&''67'65&'&'''654'23&'&'&'&'67'67/127'&/' P i  #$00=3+*!p—6L1(( 6$%61#.ÍR" &.1(( &" $#00=H6*Ô$%68%8» þ0 R  ##!"Xv)* 6%$$¡@ " ƒ$.$ ##!"!Ÿ6%$, !, ÿÀÀÀ&+05:?FKRW&'#!6767=&'&'#5&'#53#53#5;#5;#57#53#53##53##&'537#53˜(@(hPPPP€``PPPPP@P€``@P``¨(0ÿ0(((¨88h@@@@@@088 (8888( 88ÿà O7636767&'&'676767&'676767"'0#0##01"1#"'&767670101|(0_8888__88$  g/"":9HH9:"""":9H80# 9/0>>0//0>1( )%4E:////:://  ÿà ,67167323!&'&'7!67&'#"/&+„+žþ€@€¡ - „`+ÿ@þÀ -ÿà@ 136?6'&'!6732335&'&'#"/&+3!€0 p þp Dv!/u0uu( Àu  þÀÿà (3!!&'&'67673#&'3#&'67!!&'67 þ`hÐÐþð þ `hH`ÿÀ€À9s76'&56767"'&6767'676736767&'&'27676'&'&'4'67&'&'&'&'&#&'&'X!++II++++IX- B9X;;;;XX;;°9B -87UB'&!/##21>‹"+2&&&&22&& …@. 21KK1221KþÐ  .@I11%%/+" -ÿÀ8¿'&?'&76?67% ” o ™D  vV]¿þO œn ; U x2 ÿàÀ 0Zl"'&327676767676'&767654'1'&#&'&'476'&7676767631'&767676p,..'&  ,..'&  "--;:; "-.::; y( &'3p &'..,  &'.., 0" ;:;--" ;::.-‡ (3'&ÿà@ '2=!567!!&'5!%1!6767&'&'!367&'#3367&'#þ Àþ@àþ0Àþ@800€ppp ÀÀÀþÀ@þÐÿà  09B63!25&'!!675&'!#56767!!&'&'567&'7&'67@€þ€€þ€0€þ€xp¢¢ð``àà``0€ 4`lw„#;67&'4'1e#&567&547&=6767='09013#+&'&'56767367&'+37;67&'##;67&'#À² à 3""$ ÐR"@G0//0G@0@  (0@ ""30(  ((((P(  /0G0G0/þ°°@€ 4`lw„3+&'67471630101365&'654'6=&'&'=70901#3;67675&'&'#&'67;#'+&'6733+&'673@² à 3""$ ÐR"@G0//0G@0@  (0@ ""30(  ((((P(  /0G0G0/þ°°@ÿÀ€À 4`lw„6;=&'"1010136767#&'#"'+&'67367&'+09016756767636363#&'&'5%&'675'2=&'367=&'@ ""30(  ((((P(  /0G0G0/P°@€² à 3""$ ÐR"@G0//0G@0@  (0ÿÀ€À 4`lw„75;&'7"'1&50101567673&#&#"&+3+'09016767536736736767=&'&'#&'=6727&'537567&'5@ ""30(  ((((P(  /0G0G0/P°@² à 3""$ ÐR"@G0//0G@0@  (0ÿÀÀÀ !?%#&'6733676754/&+1367675##&'6735#€ÀŒDÀÀDŒ€À0À pDÌ0ÌDÿÿ 0ÿàÀ -2?!6754'7!&'&'676732'&1#&'5#735#676'&'0@"þÀöJ"JÀP   `þÀõ"õ@J"JdhPPð$$$$ÿàÀ  "!&'67!%1!6767&'&'!€þÀ@þÀ@þÀpþÀ@0þÀ@€ 132?5&'!!675#"/67167!!&'&'@­¬þ€€Ž$$Ž0€þ€PŽ Žd¬¬uuTÿÿÀÀ+4E\;676;&'&+&'&#"#35#&'673767&'&'673;#6716754/&+3P = >))``@p€ 0ÀÀ4œÀ`     þð0(þh0 À0Ü4ÿÿÀpÀ<N[%67&'&'1#&'&'9&'&'67679#6767967'1&'6767&'1&'53)$%66%$1 21KK12 1i "" "Ç )6%$$%6)    +9K1221K9+   y "þ€""ÿÀ¿À$6A"1!676/&'5&'&'54'&#3!67567673+32765à 8#$+ +$#8 ,(þÐ',@@@À  )):!F7  7F!:))  `,!J==J!,þ ÿÀ€À%=ð"1#93939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939393939!3136767&'&'#5&'&'#3#3#3#=!39#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9#9&'5367&'#5367&'#56?673#5&'&'##336753675&'#5&'#èXhX°øX8888XþhX8888ˆ°@  @XÀþà €(0h€Ðþ°h0(8þø€@  @ˆÿàÀ  ";!67&'!67167!!&'&'5#&'6735673#&'@@þÀ@@þÀÈ@@@@pþÀ@þÀ@ø@@@@ÿÀÀ3%4'1&'&#"3276765!67167632#"'&'&'Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!À9////99////9F::$""$::FF::$""$::FÿÀÀ3M_q%4'1&'&#"3276765!67167632#"'&'&'167676&'&'&76'671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!²   (( "   À   À9////99////9F::$""$::FF::$""$::F>  n     ÿÀÀ3L^p%4'1&'&#"3276765!67167632#"'&'&''&767632'&'&''671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!¯  #",,"#    À   À9////99////9F::$""$::FF::$""$::F€ %%   °     ÿÀÀ3EWb%1#"'&'&5476763216767654'&'&'271654'&#"374'1&#"32765367&'#Ð117711117711ÐF::$""$::FF::$""$::FP   À    ¸À9////99////9!"<=CC=<"!!"<=CC=<"!ð     x @€ "/<IVcp}Š—¤±!67&'!67167!!&'&'3#&'567'673#&'573#&'567673#&'573#&'567673#&'573#&'567673#&'573#&'567673#&'573#&'567@Àþ@@Àþ@°ààH@@@@PÿÿÀH`````````ÿÀÀÀ&/&'#!6767=&'&'#5&'#5!!&'˜(@(h`þÀ¨(0ÿ0(((¨ÿÿÀÀ3C%4'1&'&#"3276765!67167632#"'&'&'76'&=47Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!¼ À9////99////9F::$""$::FF::$""$::FmX X°ÿàÀ  "-!67&'!67167!!&'&'3#&'67@@þÀ@@þÀ˜pþÀ@þÀ@ˆÿàÀ  "1!67&'!67167!!&'&'/&7676@@þÀ@@þÀQ€@/opþÀ@þÀ@q€@/oÿÀ0Àb†%=&'+&56767;67='3;2?654/&#"+;67&'1410#&'05&'&1&'&'&56767;%1!67675&'!&'67367&'# .'  00 jj@  ‹ Š   D--   þøPþ°@@Á $0  __0 }  | ---D-  Ðþ°@@PÿÀÀ3DV%4'1&'&#"3276765!67167632#"'&'&''&?6?6'4'1&#"32765Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!3‘ 8 ‘ 8    À9////99////9F::$""$::FF::$""$::FE8 ‘ 8 ‘ E  ÿàÀ  "2%67&'!!71!&'&'6767!'"/&7673#€þÀ@@þÀ@à h Ð h @þÀ@þÀ@p    pÿàÀ  "2!67&'!67167!!&'&'2#&'&?63@@þÀ@@þÀà h Ð h pþÀ@þÀ@@p    pÿàÀ  "2&'!!67'1!&'&'6767!'&'5676þÀ@þÀ@@p    p`þÀ@@þÀ@à h Ð h ÿÀ€À'67#"'&=#!6716732!&'&'@P  þÀ¦Zÿ Pþ€ZþÛ€ÿÀ€À'2=&'673;!1!67674/&+367&'#367&'#@  PÿZ¦8€P þàÐþ€%Zÿ`ÿàŸ]s&1?6?6;#"/&;6767674'674'67&'&'#6?6'&'"1;276=4'&+D  4 3 †   a> ="a\þÜ @ @9 8        ) )   à à ÿá ]s'1&/&/&7676/&'&767367&'&'&765&'&'&765&'&765&'#"'&?6;2#%"'1&=476;2+D  4 3 †   a> ="a\þÜ @ @99        ) ) !  ] à à ÿÀÀ0Qkx&'&'&?76?676/76'&/7'&'&/76/76?727167654'&'&#"3'676'&'x SR b 99 b SS b 99 bjAN- -NAAN- -NA@  ¬ 99 b RS b 99 b SR bZ-NAAN- -NAAN- þþp$$$$ÿà R#&'&'676?167676767676'&"#"#01&'&'4767670367676'&'&#"#01"#01#‘!))CJ21,>Y::32?H8 K11  ]4AK8921K4*)B>>[?23( 21K)## ÿàÀ  "27!67&'!&'1&'6767!!74?6/&50@þÀ@þÀ@p    p @þÀ@@þÀà h Ð h ÿÀÀ3M%4'1&'&#"3276765!67167632#"'&'&'%21#"'&'&5476763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!  À9////99////9F::$""$::FF::$""$::F`   ÿÀ€À-:GTa356767367&'!67167!!&'&'673#&'573#&'567673#&'573#&'567@P  Pÿ@ÿX00000000þ€@  @€þ€€(00000000ÿÀðÀ!5=NWn3#&'&'676732#5#"'&=#73#&'=6767&'#373#&'567675&'#37673#3#&'=@ ¦Z0P  p  `     P0  0€Z…€ Pþ€p 0PP0P @ €€@`p 0@@ÿÀ€À'D7673;!&'1!67674/&+&6?6?6'&'&''0  PÿZ¦700€P þàÀþ€%Zñ SS TTTTÿÀ€À'@7673;!&'1!67674/&+&?76/76'&'0  PÿZ¦[ -- %% -- %%€P þàÀþ€%Zé 99 00 99 00ÿÀ€À';G&'673;!1!67674/&+67536767&'&'##532#@  PÿZ¦H,  DD,,  €P þàÐþ€%ZÐh8  h8 ÿÀ€À'9R&'673;!1!67674/&+4'1&#"32765&#"'&#";276/@  PÿZ¦`   E)  ( 0 (H H€P þàÐþ€%Zÿ  /<@  hÿÀ€À-8CWb&'6733673;!1!67674/&+367&'#367&'#67674/&'#3#&'67@0 0 PÿZ¦0      €P þàÐþ€%Zp@HXXXÿÀ€À':K!67#"'&=#6716732!&'&'/#&'5673767'&7654'&76@P  @¦ZÿÀ $$ V    Pþ€ZþۀЀ #0# &&  ÿÀ€À'I67#"'&=#!6716732!&'&'4716;2763"/+"'&=@P  þÀ¦ZÿP ` -  - `  Pþ€ZþÛ€à  h  `ÿÀ€À'6E&'673;!1!67674/&+6'&76/?&?6/@  PÿZ¦a00`00€P þàÐþ€%Zþß00"00ÿÀÀ 3>ITa%&'7327367&'76'&&''&?6776/654'7&#"'67&'677676'&'6KK6PPD99  D__D  99  D__D  "P P,,"PP6KK6ÔP,,P #,,P PD__D  99  D__D  99  "PP6KK6$P P,,ÔP6KK6P1  ÿÀÀ"7132?7676'&%''7Œ  >| @þ@4VÜ{O¦Ö0¼  :g J4  ÿÃõ3‹EïþÌÿÀÀ*.28<@Zj%'"#"/&'&#&'7676/6732?3#367&'"'3?'67167654'&'&'&36?6/³YYL"*EE*"L³ÇKøKÇF::$""$::FF::$""$::F0 < 0WWW&/0S"::"S0/&9” ãã þÄ!"<=CC=<"!!"<=CC=<"!F # 88 #ÿà  ,9DOZe!67&'!&'1&'67676767!!673#&'573#&'673#&'673#&'673#&'67¨,þð`þh``È    °ÐÐÐÐpþÐ 0þp(þØ0þÐXPPPPPÿÀ€À!1@K&76/6/&'5&'&'54'&#"'6716;''#67'!+32765' P X+$#8  D$‘· ,å¸=± /+@@» þ0 E 7F!:))   9r,!2-´þô02;% E7  ÿÀÀ3U21#"'&'&547676367167654'&'&''&514763276'&#"3276'&#"'9////99////9F::$""$::FF::$""$::F9 '33(%%(33' 117711117711þ0!"<=CC=<"!!"<=CC=<"!Ç &&'33(%%ÿà@  "Ce!&'67!%1!6767&'&'!76'&'676'&&'&'67676716776'&'676'&&'&'þ@Àþ@Àþ@ˆ ,)),     ,)),  pþÀ@0þÀ@° ))   0  ))   ÿà  $1G^&'6767!67&'!&'&'677!67&'!4716;2+"'&=36767532+"'&=0 X  þ¨ MFþº € € € @ € L  þè  þú@ ` `  `  ÿÀ€ÀFO\esª·ÄÔ4501016723&/127673367674'&'56765&'&'"#&'&#!67&'#&'5673&'67"#1&'4567%3#&'5#27673367674'&'56765&'&'"#7676'&7'&7676&'67101"#0  0  Ê  Êp+  Ê  Ê;þÐ  ‡.  Ê 0 Ê  EY  þà  -  }  j  j   j  j ¸  ( j  %%  j    æ     ÿàÀ (35476;5&'!#&'&'6767!+@à PþÀàà@ZpþÀP àþp@àZÿÀÀ)>36753#&'&'567673#73675&'#'567673#&'&'@à0à@@ àà@àà@@à0à ààààÿÀ€À&.767!#3!&'67356?'&'5#&'3&/76=#3P+RQ,þ°,QQ,o¸RQ­à¸¨?-QR,??,RQ-?þ¤RQó""ÿÀ€À&0:3#!67&'#5&/7675367&'!#56?5'&'53,QQ,P+RQ,þ°¨RàQQàRÀ?-QR,??,RQ-?þÞQ++RDQ++Q ÿÀ Àq67763763763675676=&'&'"&'"&'"&''7675&'&'7'&'54?6767=       &&&   + €   h…v#h@  " &! m€ 6   B@ÿÀàÀ5Š&#'&#";23236767454=&'&'"5&'&'"&'09015670101675010167010167501016700"+&/&76767567675( X$/.4F/0 ($$5V>W , À"¦X$//F°"`  ˆˆ8PH­5$$35673!&'&'=67673567!!67/&7676€(þÀ(þ @Gp@/_À(((0ÿ0(Àÿip@/_ÿà@ "'/'&56?6767'?6 ¨ ·  ¨¸  ýúxx80xxœ þ°@== P@>=eþä-.þâ0þâ0-.þäÿÁÀ:7176;67&'!31'&=1=+&'&'6767!#  I ‹þ€`0 00€‹eP 6  þà|  0 þàLÿÀÀ3>I%4'1&'&#"3276765!67167632#"'&'&'7&'5673&'567Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!àpÀ9////99////9F::$""$::FF::$""$::FHÿÀÀ3H%4'1&'&#"3276765!67167632#"'&'&'732+"'&=4763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!À€ € À9////99////9F::$""$::FF::$""$::F` € € ÿàÀ b&'677679676767101276701'&'#&'"763012767676?55"1'&'#&'#50 $1 #2$1 $2(ˆþpL  í      "    ÿþ€€mˆ‘š+17676763276567676/#"'&'4?67;+&'#'''&/&'+"'&=67;2?67325#"/&#?6#3&'6767&'3 $   L$F+:8*'((   U# $   ((+: 0 %&'FHKKþ 3€$     L!B'$Ð   $ Ð%ÿ!B  C KÿÀÀ"8210301#"/54?32?!&'5"!67675&/&#ÿ̬¬ÌÏŽ$$ŽþpÐ ÌÌ ’ Ž Ž ’äuu´´ ’ÿÿ’  ÿÀÀ "/?JU`!&'67!%1!6767&'&'!676'&'1367&'&'#%&'675675&'&'675€þà þà þà$$$$ "À"@0þ€€0þ€€ÿ   ""Ð@@p@@@@ÿà@  "/?JU!&'67!%1!6767&'&'!676'&'1367&'&'#7367&'#367&'#þ@Àþ@Àþ@$$$$ "À"@ÈPPPPpþÀ@0þÀ@à   ""`ÿÀÀ$>KX%&'1&'#&'6767&'6767367167654'&'&'&'&767'767&'&— )@) 8;;XX;;7)0>>0@oF::$""$::FF::$""$::F  X*,,**,,*0$$:VX;;;;XV: P!"<=CC=<"!!"<=CC=<"!(2222ÿÀ€À.=J+"'&=#!67&'#67167!!&'&'3#&'6767'676'&' @ @@ÿÿ @"À"    þ€€þ€€ÿ""`$$$$ÿà@ (5@K#&'&'##&'!%1!6767&'&'!&'&76?367&'#367&'#À"@" àþ0Àþ@Ð  hPPPP ÿ""€þÀ@à$$$$0`ÿà %!6767=&'&'!"#!!&'5€þ€ 0 þ€f€ÀÀ€  †ÀÀÿà 7!67&'!Ðþ0ÿÀÀ"+@#"#567673#53276=4'&#!675!!!&'&'6767°à 0"à"" þ€þàÿ ""à"0 à þpÀÀ@ÿÿÀ¾Àx76?676/76///&'5'&?5'&?'&?'&767''&?'&76'&765'&76567à9B% % NBBN% %B99B% %NBBN% %B9À.9M'M  &&  N&L9..9L&N  &&  N&L9.ÿÀÀÀ+8CNY3'&+"7;##&'&'#&'67;7673;2765!&'5673&'5673&'567«‘^”$0"à"0%^í à þàPPPŒ7þÐ""07gþÐ 0@ÐÐÐÐÐÐÿà@ .CU!#'&#"'&#"#&'567!67675&'&'!&'!67&'!&'&'54'1&#"32765 `g 4  E@`þ 0'&:@þÀ%Ð   pà P ^àààà:&'%à  ÿÀ€À5>3!&'&'6767;67673!67&'#+&'5#767&'(ÿ(  ØXX€€þÀ@0þÀ@ÿÀÀ3O"'1&'&54767632#16767654'&'&'65&'#54'&+"#32?9////99////9F::$""$::FF::$""$::Fy:   :kk117711117711Ð!"<=CC=<"!!"<=CC=<"!þÙ ` ` ccÿÀÀ3O747167632#"'&'&5!&'1&'&#"327676736753276=4'&+5&'"0117711117711Ð!"<=CC=<"!!"<=CC=<"!þÙ ` ` ccÀ9////99////9F::$""$::FF::$""$::Fy:   :kkÿÀÀ3O%1#"'&'&54767632!13276767&'&'&#"%&##";2?654/Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!' ` ` ccÀ9////99////9F::$""$::FF::$""$::Fy:   :kkÿÀÀ3O21#"'&'&547676367167654'&'&'3;276=3674/&#"9////99////9F::$""$::FF::$""$::Fy:   :kk117711117711þ0!"<=CC=<"!!"<=CC=<"!' ` ` ccÿàÿ¨ "7#3'+7%3'#"'&?6;2©WX¯×H92²²²²þ–I8²è è p ð p x]]MM}ÄÄ0MM(ÿ˜ ˜@€+E[1!67675&'&'!67167!!&'&'47167632#"'&'&57#;67&'#5&'#p`þ pÀþ@°PP  ÿ€0@Pÿà  ";!67&'!67167!!&'&'676/'&?'&7@€þ€@€þ€¯////////pþÀ@þÀ@O////////ÿÀ@ÀJOd354'&'&'6767676767?356767&'&'&'67&'+73#7#;27654/&'h 0  B:  0 883¶ÖÐÉ  î  À  -.6!  *%% B:'-  !6.-  þ0 P4   4ÿÀÀÀ27L&'#3#3'&567;3765&'&'#5367&'#53!7%&'!3!27654/ø  Œ64> ¤¤ >46Œ  “öþê þ÷  . ¨ ( }  } ( þh 4   4ÿÀ°À:?T]#?6#67&/&'547#&5476;#765&'&'!'!%#!"'&54?67!&'67ãn  2 26 2  vP651'(<Ž6þê< þ²  ) å   [  $ $' "([ 56PŠ <('þ€ 4   4ÿÀ@  +0E&'&767##'+#7#&'67&'67673'#7+"'&54?673è#$$##$$# 0 ## 0 ""33""ËֶР î  É())))xPPPP)3""""3)À P4   4ÿÀÿÀ ?DY676'&''#"'&3'676767376'&#"'&'&'&'&'3!7%&'!3!27654/  _  ^7S#::# S7^   ** öþê þ÷  . `  £**£ ##þ¨ 4   4 ÿÀ  27L\#7'&'54763!2#'&?6=#&'5#&'5#!'#%#!"'&54?67!'&'547632#P3  1 ) 0 ) 0  3@@@ö  þÒ   •   pp']Ux xU]'pþ€ P4   4`0 0ÿÀÀ!!%#3!355#!Ðþ` þ`00 00þ`þ` 00þ`00 0ÿà M_qƒ7&676'&56767"'132327167230167673676767&'&'&'7271654'&#"374'1&#"32765271654'&#"3¨   $88__8888_0(Ž #08H:9"""":9HH9:""/v     P  ? (1>0//0>>0/'  //::////:E4%˜        ÿÀÀ3M_p%4'1&'&#"3276765!67167632#"'&'&'167676&'&'&76'671632#"'&''&7632'&#"Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!²   (( "   ¦    À9////99////9F::$""$::FF::$""$::F>  n    ÿÀÀ3Hay21#"'&'&547676367167654'&'&'76'&'&'7677'271654576/&374'76'&?327679////99////9F::$""$::FF::$""$::FH    ™ `   À `   117711117711þ0!"<=CC=<"!!"<=CC=<"!v    z          ÿÀÀ3@Yr%4'1&'&#"3276765!67167632#"'&'&'&'&767'676/'&?'&73676/'&?'&7Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!$$$$™ÀÀ9////99////9F::$""$::FF::$""$::F   ™ ÿÀÀ3<EP]jw„%1#"'&'&5476763216767654'&'&'67&'7&'67367&'#'&'&767676'&'7676'&'3&'&767Ð117711117711ÐF::$""$::FF::$""$::F`ظ€€   ----€'((''(('À9////99////9!"<=CC=<"!!"<=CC=<"!øp €'((''(('P  ----ÿÀÀ3I[m%4'1&'&#"3276765!67167632#"'&'&''1&767632'&#"'671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!¶     "(("&   À   À9////99////9F::$""$::FF::$""$::F  ¯     ÿÀÀ3;@EM`r„"132767654'&'&#1#"'&'&'676763235#35#35#;67&'#'3#&'&'6767'671632#"'&'721#"'&'67639////99////9!"<=CC=<"!!"<=CC=<"!þ¨( ` ¨°°   À   117711117711ÐF::$""$::FF::$""$::F@0000000PP     ÿÀÀ3I[m%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327'671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,Î   À   À9////99////9F::$""$::FF::$""$::F4   d     ÿÀÀ3I[m%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327'1&'&54767&'1&54767Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,~   `  À9////99////9F::$""$::FF::$""$::F4   t@ÿÀÀ3Iw¥%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327'9#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,„ À9////99////9F::$""$::FF::$""$::F4   O    ÿÀÀLb¾67165&'&'&01327'&'6767674'#"'&'&'6767&567676'1&#"'&32767'9765&'&'79341016767670103139765&'&'793410167676701039Ý    R=NH9:"""":9HH9:""  ;;XX;;;;XJ7 ,22, && B    U("":9HH9:"""":9H6/-7X;;;;XX;;, þØ   l    ÿÀÀ3Iax%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327'1/&'&7676767676/&7676Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,‡A  { A À9////99////9F::$""$::FF::$""$::F4   « A  A ÿÀÀ3I^s%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327''&54?'&5476/&54?6Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,ØYY$$$$ZZÀ9////99////9F::$""$::FF::$""$::F4   ¡0 0++ ++0 0ÿÀÀ-F\q†š6312"567676716&&76767'6767767676'676312'&5&7676776'&5/"'&76?2'&?676&514767672#"'«   þ ASTK?HH75)) >†) >ASTK?HG85)i  """ &#$þõa 8Á8a þò   ²   => ))67HH?KTSA;KTSA> )(67HH?] """  #$&& a8²9 bþf   ÿÀÀ3Rq†21#"'&'&547676367167654'&'&'&#"?765'76'&/3&#"?765'76'&/#"'&327676'&9////99////9F::$""$::FF::$""$::FI&""& &""&,22, && 117711117711þ0!"<=CC=<"!!"<=CC=<"!{"%&""%&"¯   ÿÀ€À6Pp†´â%&'&'67676767671&6767&'&&'&''1&'&54767676721!#0105&'&'432/1#"'&'&763276'1#4101&'&'&'010#9'&56767'939#4101&'&'&'010#9'&56767'9 !<11 4     4 11>F::$""$::FF::$""$::FP     Ð% %ÿÀÀ'AWm†%&'1&'&=&'&766766767!67167632#"'&'&'74716'&54?'&5%61/&54?5&'##"'&'#6767Ð;;XX;;5% 11 *  * 11>F::$""$::FF::$""$::Fc0 0++ ++0 0þó% %ÿÀÀ&@QZgtŽ%6=676'&#"'&&'&'676767167654'&'&'276'&#"76767&'5&'&767676'&'1&'&'5673327673\  ,22,  5;;XX;;5\F::$""$::FF::$""$::F`    °  ----  4     4 11>X;;;;X>11F!"<=CC=<"!!"<=CC=<"!$   H€'((''(('€% %ÿÀÀ3I[l%4'1&'&#"3276765!67167632#"'&'&'61#"'&'&76327'671632#"'&''&7632'&#"Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!^ && ,22,Î   ¦    À9////99////9F::$""$::FF::$""$::F4   d    ÿÀÀ3¡³Å%4'1&'&#"3276765!67167632#"'&'&'"'&79030521676767654'&'&'&'0#'9&5479034121676767654'&'&'&'0'01"9&7632'671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!1    ¡   À   À9////99////9F::$""$::FF::$""$::F    J     ÿÀÀ3£Ñÿ%4'1&'&#"3276765!67167632#"'&'&'"'&79030521676767654'&'&'&'0#41"9&5479030521676767654'&'&'&'0#41"9&763'9#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!1    W À9////99////9F::$""$::FF::$""$::F*    E    ÿÀÀ-¯ÀØ%#&'&'6767665&'&'&'27&/&'&'&'"9030210#1"99030210#1"93676767&'&'&'676767'271654'&#"37276'&#"767&'1&?676'&'&'S&-X;;;;XX;; "":9HH9:"""":9H5/+    x        b U ;;XX;;;;X"(,H9:"""":9HH9:"" ƒ     L     „ Y ÿÀÀ3FXj%4'1&'&#"3276765!67167632#"'&'&'&716;2&'&'7671632#"'&'721#"'&'6763Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!ƒ Õ ""..""    À   À9////99////9F::$""$::FF::$""$::F:  **z     ÿÀÀ3Ft¢%4'1&'&#"3276765!67167632#"'&'&'&716;2&'&'79#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!ƒ Õ "".."" W À9////99////9F::$""$::FF::$""$::F:  **U    ÿÀÀ3F[p%4'1&'&#"3276765!67167632#"'&'&'&716;2&'&'7'&54?'&5476/&54?6Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!ƒ Õ "".."" YY$$$$ZZÀ9////99////9F::$""$::FF::$""$::F:  **·0 0++ ++0 0ÿÀÀ3FXi%4'1&'&#"3276765!67167632#"'&'&'&716;2&'&'7671632#"'&''&7632'&#"Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!ƒ Õ ""..""    ¦    À9////99////9F::$""$::FF::$""$::F:  **z    ÿÀÀ3EW"132767654'&'&#1#"'&'&'6767632%671632#"'&'721#"'&'67639////99////9!"<=CC=<"!!"<=CC=<"!þ   À   117711117711ÐF::$""$::FF::$""$::F0     ÿÀÀ3>\i…’21#"'&'&547676367167654'&'&''367&'#'&'1&'6701327654501676'&'7&'1&'67327654501676'&'9////99////9F::$""$::FF::$""$::FX€€    ----À    ----117711117711þ0!"<=CC=<"!!"<=CC=<"!ˆh    '((''(('     '((''(('ÿÀÀ :K\o%5&'#&'5&'&'&5676767167654'&'&'276'&#"76763276'&#"767675&'&',44,;;XX;;F::$""$::FF::$""$::F`    ¦    v    *v™™v&&-X;;;;X-&&j!"<=CC=<"!!"<=CC=<"!$    Z      ÿÀÀ/CPbt7"'1&'&'6767"/13276767&'&'&#"132767&'&'&776'&'7132767&'&#"27167&'&#"3°2;;XX;;;;X+%°!"<=CC=<"!!"<=CC=<"!€    €/! .B0    €   8QX;;;;XX;;ÀF::$""$::FF::$""$::Fq  A *`     ÿÀÀ3M{©%4'1&'&#"3276765!67167632#"'&'&'167676&'&'&7679#4101&'&'&'010#9'&56767'931#4101&'&'&'010#9'&56767'9Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!²   (( ( À9////99////9F::$""$::FF::$""$::F>  Y    7ÿÀHÀ+&'?76/76'&/'&#VD™ o ‰‰ o ™D5 vVi²   nœ II œn þ2l U x8ÿÀÀ3EWd%4'1&'&#"3276765!67167632#"'&'&'721#"'&'6763671632#"'&'&'&767Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!°   €   0$$$$À9////99////9F::$""$::FF::$""$::FP     P  ÿÀÀ3J_t%4'1&'&#"3276765!67167632#"'&'&'67/&#"'&567''&54?'&5476/&54?6Ð117711117711þ0!"<=CC=<"!!"<=CC=<"!±11"&&"*YY$$$$ZZÀ9////99////9F::$""$::FF::$""$::F@##­0 0++ ++0 0Ûö!uÛ2– ,2 ^Èö 4ý 6³ é Bç 6³ d) 01 Xa .¹ & éCopyright (c) Font AwesomeFontAwesome6Free-RegularThe web's most popular icon set and toolkit.https://fontawesome.comFont Awesome 6 Free Regular-6.4.2Version 772.01953125 (Font Awesome version: 6.4.2)Font Awesome 6 FreeFont Awesome 6 Free RegularRegularCopyright (c) Font AwesomeFontAwesome6Free-RegularThe web's most popular icon set and toolkit.https://fontawesome.comFont Awesome 6 Free Regular-6.4.2Version 772.01953125 (Font Awesome version: 6.4.2)Font Awesome 6 FreeFont Awesome 6 Free RegularRegularÿÛÔ      "# !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ exclamationhashtag dollar-sign0123456789 less-thanequals greater-thanabcdefghijklmnopqrstuvwxyz folder-closednotdefheartstaruserclockrectangle-listflagbookmarkimage pen-to-square circle-xmark circle-checkcircle-questioneye eye-slash calendar-dayscommentfolder folder-open chart-barcomments star-halflemon credit-card hard-drivehand-point-righthand-point-left hand-point-uphand-point-downcopy floppy-disksquareenvelopepaste lightbulbbellhospital square-pluscircle face-smile face-frownface-mehkeyboardcalendar circle-play square-minus square-checkshare-from-squarecompasssquare-caret-downsquare-caret-upsquare-caret-rightfile file-lines thumbs-up thumbs-downsunmoonsquare-caret-left circle-dotbuildingfile-pdf file-word file-excelfile-powerpoint file-image file-zipper file-audio file-video file-code life-ring paper-planefutbol newspaper bell-slash copyrightclosed-captioning object-groupobject-ungroup note-stickyclonehourglass-half hourglasshand-back-fisthand hand-scissors hand-lizard hand-spock hand-pointer hand-peace registered calendar-pluscalendar-minuscalendar-xmarkcalendar-checkmapmessage circle-pause circle-stop font-awesome handshake envelope-open address-book address-card circle-userid-badgeid-cardwindow-maximizewindow-minimizewindow-restore snowflake trash-canimages clipboard circle-down circle-left circle-right circle-upgem money-bill-1rectangle-xmark chess-bishop chess-king chess-knight chess-pawn chess-queen chess-rook square-full comment-dotsface-smile-wink face-angry face-dizzy face-flushedface-frown-open face-grimace face-grinface-grin-wideface-grin-beamface-grin-beam-sweatface-grin-heartsface-grin-squintface-grin-squint-tearsface-grin-starsface-grin-tearsface-grin-tongueface-grin-tongue-squintface-grin-tongue-winkface-grin-wink face-kissface-kiss-beamface-kiss-wink-heart face-laughface-laugh-beamface-laugh-squintface-laugh-winkface-meh-blankface-rolling-eyes face-sad-cry face-sad-tearface-smile-beamstar-half-stroke face-surprise face-tiredassets/css/font-awesome/index.php000064400000000020147600374260013063 0ustar00n~‘hhÒHý…IDATxœí]bÛ¶ÉHªå„’-{iìZK:gó’lk×n­š-©ÓtI×õÞÿq€q? E²$ÛødK>$î>Á;”•ÊÈÈØPìZ…¢ØsÖV¯€h!˜Sy»„0E·0}H¹)-ðàæt k€íoÿܪKp”\RÎÏ  €ï.•E‹7¡¿ š)— *V;~ôPeÞâ Bx°*ò,=$z†¥Dؾ„í¢¬ úÅJ±½ÛïÒ¸Ù»¿„¶Ø9î{ ”‘‘‘‘‘‘±Ç¸ñHpÇqW@Äò"2'ðŸÛBúè[¥$ € @TàÕiºHÕ/äábÙ¥9ú6“!¡XãHq`DE¤Ç*RΖ€­ HV!Ÿ%ÙÚã…¢;ÐòÔðÁîÓá"¢ñúãò ÙiÆ]¿ ddddddddìëþÉÐ4yüµ5 ôô ‰Rb¹@(”8šÜÛCd‡öŪÐÝ¡¯,Ü@T@i¼ýÐb‰rq0alX!ô¶”ú° ¯p‰öeº, ëß=4bW ¼{¤ 5°­ÍƬhu~À(ÁQŠ^@ãó3Ú=î¢é"…bÿä5XC@J‘Ž¸C‡ª¤ú€Té®ï7¼ú6™‘‘‘‘‘‘q_±þ²Ô5à ©@,r Å¡É©ªDó«)°Tñ|žOœ…@å ON-Õ™ÊýÉ §÷¥’âýíò[n@ìØR¼¡™XôIm‹Ý‹(‰µá¡F Ê@”?±ð=0Þ puL‘˜;g$Òá@6η„ô „K`Êý>п» @h Õ£åüKV€nÅ"a¦"« ù%l‚@.v‰$/ðU^ôÖ GÈ:#`` ’ €u‚¬TtK©Þ~àÅ‹ÃZ Ýù5T¼¿‰%ÖkìõxÀ®ŸÉÈÈÈÈÈØkÜì]\*ìQÙÀ› ,Ò‡‹ÒëB†ª44 ÚOXKÍ|Šy‚Îgƒ¹Á+_M¤(ûlоEžO„ú V$ûT1BXõõ’b¢-Š|?@ ÔfóÕBßXràö%'@Ò¹A\ºI´á¹J,}†€BBcáó\V ñÊrÁ§£h(Ò]tIÈì^ªó¡}ÜÇÅoÎצo ¾S3ƒ ";£Ï÷Ê™ºìÑÁb}Ü"ß° —Ù){b$‘½¦¥ÆâãGwwݾŒŒŒŒŒ»ò–ßÈa‡œÞb"Þð)öïÓT@pš…F_er6JvШ¨áöÁ"mèÞ­¬M-ÁŸd7óê6”Ðx€¯¯„Ë°6Ó¥;Èì…/¯×ö“ìŒ`>KrP\Äö°_¸Ùë^uŒ1%“ÛOúT‚M²­è.±}¹–ðQ3æêñ€¶.Nسäã}«¡)½—ð>€÷ûäþ-âw`—ê—aƒø—ÿ+sy$ã€äÊt‡ø—)ÜN¬bFFFFÆýBeâ„jùúnNŠ¡Vn4ŒÕø,¹ÁA*õ™Xñâ*ÎÇ5«¤>ÙãP‹‡ªGæ…êa ¶ƒ3 Õõ{öoBˆ ‹&<ô”L[ §ÄÞNc.‹™­Ã¶Üi=Ã`ãQ@‰d‚¯µ ͆I¨Å.I«ëºlÀ`\tà[< èCit¡48Àù4É-rÀ Ž+ÀÌf³Ø쑱‚B€CB ÓÑMH i¤„Ÿôy }˜†Û>ÀÉÍrx¤ñ‰ÝýÄp|zø;BÀãÇ;áb±u¯‹rŒýŸc¨K¶Ÿú4t ôzÀ‘1†G~ ²þß`Ž†ØšÃùêKàÉ| Ì”>ú½Û¡²¯O$ÀØÿðìó~ ¶Ao)Š£¥0pzz ½}i´ý˜ûÓ`;ADÀ¹ÙûüÜm8n:ÁcfÚA@s7ºÁðŸ˜Lê÷ºÞ Z /..À»¨ð€êh8Ôoþ°r? Ú ÅNÇã9Œñ3BèÒ~o_ØÞ'`Àâo„€îpO-˜Ë :¸TGî L;ôÇ7ÇÝ]`ìÚ°B’€Ô%€Ë›>°î*wT´½îpMŸ©0HÝ}&t ¦ò·îÎ^1ˆÖ'Oqór'À2P«Í¡ª¦+Äz,tIW''|enÔþŒŒŒŒŒ=dzgñòRÌm˜[Nò¶Sùt÷K{›úÒ‰m²ÝåØ“Vžtû6¡ÉáÒ²R`úÔÑûšÎ¶NØ&}ÛöB Uå™(òr<ôqÈVyrÐrA**¿Ýدzg6ÓD#›± —–›óÑYP›`®ìîí¥áv‚Ïés€çÌ~(zûMlÞe¿|u¸ÌüQ¿a…*}ž+TŸÌ ²€ú“ºRÆùíX c"+*Ÿ NlôŸNûhc¿Ft‡ÀÛ—&àÅù‡ú¶¿Ô1%ØQ''ßê×?œlÚÃ׸•+&£r{ýj¸N‘಻® æ4ü) ÚËÃ`¨Nç‹Œ€.½ Ûß­ˆ  ùüëÇ£Çÿü®•Üá—“§ôì)q ´2Ÿ?÷²ñýn¼3H€bÐÌø`ï}Ø ÷—­Âþ.`–ñõú§ìpqY1ûe_bûÕËïu÷7ùþe+NÍõ_Fö†¶Ý(êDTƒü,àÃÞL}LLžrûùmP5‹º|±x芥1Œc…ûŠx DAb ŒŒŒŒŒ`ˆ¦M(±ê7¼´ÐNEDï~žÏMzé Ðö+4ÆçÉBXd.ŽÃMzþËv͈ë¾µÓÏð¶«P×d8‰p¬ÿ<6?®Ø8ØN‘ý*xõêèÕ.»¾6Ú6G÷€­ìFåZû½ã…Å)ÝݦOéÉÉ ! ùlÅSsýÓÐh³èíæssàNðõp8Ú`'´0ö/<Æþš¤£s£ï©ß}ñ.æ@ǨÛsƒ7ξ§OÛŸVîDúú€a5ŸÏaŽvÜô]๘õúðÔm1™ø+ÝêŸÒ3äÃýyè6ðÛ õ‹ž>@ßu50ëÀPÚsÿÜÅ5‚¤1=Æë=§pý¢ *ÂKV•Ò«Ü‚Õã€ÝãøÝ»c$N®4(úX¹r2###c- ñê賟LóÓÙδÙ>޼]¯ûó5Ú.žsŸ´ÂYsÇ1ïÞf0Ã;ü'̨¦˜Yþg銛Â{“@9øà øÐÕ`aC(Ž¨=%bêoà2ÌÌ=­†Þnœò¤1ø jœ‡BŸ’o¨½S$nùãà#Ím“ݘú=iœê0ÁcÊÚï§ÝÈþÐÒÝi9Åö}ÔoI…Ù ¨Ýù®qãT‡š]òW%.Ãö‡(‰ËØ…æ]zÛ\ðx f³Ùö"]o°×'uÐ䫵tŠk{Àv;AëÍC3Ö†wž€w¨R_#÷±X» Þ(x§÷Ò‹/q%¶èùW¸ ¨þÅ›ÇÌÜhpíÄk_IöXŠùÇ'b§Éú/fXÞþ²Köi´"#####ã†QCL¼iÀˆ2téè àà€Ê5¬¶L0 ¶¬ÄêQiÞH“2;yÒTêOok;×¢ì Ù¶`õÃRš²Ng{z´y¼!—Kx²¢²·çmì?A(vø£UÒ~Œ°ÎmLÀ(`o/!nòÿ¤°mXŠ€-{ÀvûŽ÷[¾ € dÇw=Àn「ŒŒŒŒûøsdwåüzŽÖnê(åò}O®yŽ~­Ñó ãúmà ›ðï?XUÞ;,àš…V'+û €VŸ&ïJ¸Rê×Z]᧭§:£¥Ï×zC'ýÓ-߆ºžÝÈ@åy ö4¼­Úuó—þ §`VÛ“wö«ÑŠ#÷ýzP@Q˜ N>2/ÿý{¦\o)Žö”ëWøŒ›~a3xLÀw :_QÞ;Œì=pŠÖ¼èdt§Ãî\'8¸º¼ÂÝ~3áSRPÛ¡Ú6Æïõùy+ŸšÏÈÈÈÈXüù€”ÌQ­*¯ÚÞºr üù€”Ì—Ñ­*¯ÚÞºr gÐál™/¤\U^µ½uå$øóüœ|mbÃëVn–ÒÚòw \V½å|ù‡ÞöDËÍŠNVNåæþy‡À7ì¢ÚÙàëk<;œª/ËE}?E*dzgáO ú¨ß~ûègþœ/9¿®6˜Êæê½f c…D}% Š×g$õQî·Gž7öoŽ€)úº¡ÏU J¶ð˜˜o™,O@ú0ß¾Q(íòÀä;žbõ¹¬˜wõ“àÏ:5× úNŒwRÀåþN5ØIòöy'KË?}²¹:9‰mßÆÖ½®*§±í@fÝ@jU9m‡²ë†Ò«Ê´ÃÉ{öÿÓò$âØ——}öídF€âÿôp¿Ñ|%!DdF¸·>™ýû»}Gö€{ßÜ÷»@FFFFFFƦQÜžH ¹ ªÕºìÿí3 •Ðu øù¾Möo¸½·Ê~êvy»}¡mûwz<Ø7õ•ïnP9ørÆWkÿíñu= ©¯°|«ì_×n½ýëÞz쿳}@ÞþÛãIXÆn÷›‘±çø?Éæsn~‘hhÒHý…IDATxœí]bÛ¶ÉHªå„’-{iìZK:gó’lk×n­š-©ÓtI×õÞÿq€q? E²$ÛødK>$î>Á;”•ÊÈÈØPìZ…¢ØsÖV¯€h!˜Sy»„0E·0}H¹)-ðàæt k€íoÿܪKp”\RÎÏ  €ï.•E‹7¡¿ š)— *V;~ôPeÞâ Bx°*ò,=$z†¥Dؾ„í¢¬ úÅJ±½ÛïÒ¸Ù»¿„¶Ø9î{ ”‘‘‘‘‘‘±Ç¸ñHpÇqW@Äò"2'ðŸÛBúè[¥$ € @TàÕiºHÕ/äábÙ¥9ú6“!¡XãHq`DE¤Ç*RΖ€­ HV!Ÿ%ÙÚã…¢;ÐòÔðÁîÓá"¢ñúãò ÙiÆ]¿ ddddddddìëþÉÐ4yüµ5 ôô ‰Rb¹@(”8šÜÛCd‡öŪÐÝ¡¯,Ü@T@i¼ýÐb‰rq0alX!ô¶”ú° ¯p‰öeº, ëß=4bW ¼{¤ 5°­ÍƬhu~À(ÁQŠ^@ãó3Ú=î¢é"…bÿä5XC@J‘Ž¸C‡ª¤ú€Té®ï7¼ú6™‘‘‘‘‘‘q_±þ²Ô5à ©@,r Å¡É©ªDó«)°Tñ|žOœ…@å ON-Õ™ÊýÉ §÷¥’âýíò[n@ìØR¼¡™XôIm‹Ý‹(‰µá¡F Ê@”?±ð=0Þ puL‘˜;g$Òá@6η„ô „K`Êý>п» @h Õ£åüKV€nÅ"a¦"« ù%l‚@.v‰$/ðU^ôÖ GÈ:#`` ’ €u‚¬TtK©Þ~àÅ‹ÃZ Ýù5T¼¿‰%ÖkìõxÀ®ŸÉÈÈÈÈÈØkÜì]\*ìQÙÀ› ,Ò‡‹ÒëB†ª44 ÚOXKÍ|Šy‚Îgƒ¹Á+_M¤(ûlоEžO„ú V$ûT1BXõõ’b¢-Š|?@ ÔfóÕBßXràö%'@Ò¹A\ºI´á¹J,}†€BBcáó\V ñÊrÁ§£h(Ò]tIÈì^ªó¡}ÜÇÅoÎצo ¾S3ƒ ";£Ï÷Ê™ºìÑÁb}Ü"ß° —Ù){b$‘½¦¥ÆâãGwwݾŒŒŒŒŒ»ò–ßÈa‡œÞb"Þð)öïÓT@pš…F_er6JvШ¨áöÁ"mèÞ­¬M-ÁŸd7óê6”Ðx€¯¯„Ë°6Ó¥;Èì…/¯×ö“ìŒ`>KrP\Äö°_¸Ùë^uŒ1%“ÛOúT‚M²­è.±}¹–ðQ3æêñ€¶.Nسäã}«¡)½—ð>€÷ûäþ-âw`—ê—aƒø—ÿ+sy$ã€äÊt‡ø—)ÜN¬bFFFFÆýBeâ„jùúnNŠ¡Vn4ŒÕø,¹ÁA*õ™Xñâ*ÎÇ5«¤>ÙãP‹‡ªGæ…êa ¶ƒ3 Õõ{öoBˆ ‹&<ô”L[ §ÄÞNc.‹™­Ã¶Üi=Ã`ãQ@‰d‚¯µ ͆I¨Å.I«ëºlÀ`\tà[< èCit¡48Àù4É-rÀ Ž+ÀÌf³Ø쑱‚B€CB ÓÑMH i¤„Ÿôy }˜†Û>ÀÉÍrx¤ñ‰ÝýÄp|zø;BÀãÇ;áb±u¯‹rŒýŸc¨K¶Ÿú4t ôzÀ‘1†G~ ²þß`Ž†ØšÃùêKàÉ| Ì”>ú½Û¡²¯O$ÀØÿðìó~ ¶Ao)Š£¥0pzz ½}i´ý˜ûÓ`;ADÀ¹ÙûüÜm8n:ÁcfÚA@s7ºÁðŸ˜Lê÷ºÞ Z /..À»¨ð€êh8Ôoþ°r? Ú ÅNÇã9Œñ3BèÒ~o_ØÞ'`Àâo„€îpO-˜Ë :¸TGî L;ôÇ7ÇÝ]`ìÚ°B’€Ô%€Ë›>°î*wT´½îpMŸ©0HÝ}&t ¦ò·îÎ^1ˆÖ'Oqór'À2P«Í¡ª¦+Äz,tIW''|enÔþŒŒŒŒŒ=dzgñòRÌm˜[Nò¶Sùt÷K{›úÒ‰m²ÝåØ“Vžtû6¡ÉáÒ²R`úÔÑûšÎ¶NØ&}ÛöB Uå™(òr<ôqÈVyrÐrA**¿Ýدzg6ÓD#›± —–›óÑYP›`®ìîí¥áv‚Ïés€çÌ~(zûMlÞe¿|u¸ÌüQ¿a…*}ž+TŸÌ ²€ú“ºRÆùíX c"+*Ÿ NlôŸNûhc¿Ft‡ÀÛ—&àÅù‡ú¶¿Ô1%ØQ''ßê×?œlÚÃ׸•+&£r{ýj¸N‘಻® æ4ü) ÚËÃ`¨Nç‹Œ€.½ Ûß­ˆ  ùüëÇ£Çÿü®•Üá—“§ôì)q ´2Ÿ?÷²ñýn¼3H€bÐÌø`ï}Ø ÷—­Âþ.`–ñõú§ìpqY1ûe_bûÕËïu÷7ùþe+NÍõ_Fö†¶Ý(êDTƒü,àÃÞL}LLžrûùmP5‹º|±x芥1Œc…ûŠx DAb ŒŒŒŒŒ`ˆ¦M(±ê7¼´ÐNEDï~žÏMzé Ðö+4ÆçÉBXd.ŽÃMzþËv͈ë¾µÓÏð¶«P×d8‰p¬ÿ<6?®Ø8ØN‘ý*xõêèÕ.»¾6Ú6G÷€­ìFåZû½ã…Å)ÝݦOéÉÉ ! ùlÅSsýÓÐh³èíæssàNðõp8Ú`'´0ö/<Æþš¤£s£ï©ß}ñ.æ@ǨÛsƒ7ξ§OÛŸVîDúú€a5ŸÏaŽvÜô]๘õúðÔm1™ø+ÝêŸÒ3äÃýyè6ðÛ õ‹ž>@ßu50ëÀPÚsÿÜÅ5‚¤1=Æë=§pý¢ *ÂKV•Ò«Ü‚Õã€ÝãøÝ»c$N®4(úX¹r2###c- ñê賟LóÓÙδÙ>޼]¯ûó5Ú.žsŸ´ÂYsÇ1ïÞf0Ã;ü'̨¦˜Yþg銛Â{“@9øà øÐÕ`aC(Ž¨=%bêoà2ÌÌ=­†Þnœò¤1ø jœ‡BŸ’o¨½S$nùãà#Ím“ݘú=iœê0ÁcÊÚï§ÝÈþÐÒÝi9Åö}ÔoI…Ù ¨Ýù®qãT‡š]òW%.Ãö‡(‰ËØ…æ]zÛ\ðx f³Ùö"]o°×'uÐ䫵tŠk{Àv;AëÍC3Ö†wž€w¨R_#÷±X» Þ(x§÷Ò‹/q%¶èùW¸ ¨þÅ›ÇÌÜhpíÄk_IöXŠùÇ'b§Éú/fXÞþ²Köi´"#####ã†QCL¼iÀˆ2téè àà€Ê5¬¶L0 ¶¬ÄêQiÞH“2;yÒTêOok;×¢ì Ù¶`õÃRš²Ng{z´y¼!—Kx²¢²·çmì?A(vø£UÒ~Œ°ÎmLÀ(`o/!nòÿ¤°mXŠ€-{ÀvûŽ÷[¾ € dÇw=Àn「ŒŒŒŒûøsdwåüzŽÖnê(åò}O®yŽ~­Ñó ãúmà ›ðï?XUÞ;,àš…V'+û €VŸ&ïJ¸Rê×Z]᧭§:£¥Ï×zC'ýÓ-߆ºžÝÈ@åy ö4¼­Úuó—þ §`VÛ“wö«ÑŠ#÷ýzP@Q˜ N>2/ÿý{¦\o)Žö”ëWøŒ›~a3xLÀw :_QÞ;Œì=pŠÖ¼èdt§Ãî\'8¸º¼ÂÝ~3áSRPÛ¡Ú6Æïõùy+ŸšÏÈÈÈÈXüù€”ÌQ­*¯ÚÞºr üù€”Ì—Ñ­*¯ÚÞºr gÐál™/¤\U^µ½uå$øóüœ|mbÃëVn–ÒÚòw \V½å|ù‡ÞöDËÍŠNVNåæþy‡À7ì¢ÚÙàëk<;œª/ËE}?E*dzgáO ú¨ß~ûègþœ/9¿®6˜Êæê½f c…D}% Š×g$õQî·Gž7öoŽ€)úº¡ÏU J¶ð˜˜o™,O@ú0ß¾Q(íòÀä;žbõ¹¬˜wõ“àÏ:5× úNŒwRÀåþN5ØIòöy'KË?}²¹:9‰mßÆÖ½®*§±í@fÝ@jU9m‡²ë†Ò«Ê´ÃÉ{öÿÓò$âØ——}öídF€âÿôp¿Ñ|%!DdF¸·>™ýû»}Gö€{ßÜ÷»@FFFFFFƦQÜžH ¹ ªÕºìÿí3 •Ðu øù¾Möo¸½·Ê~êvy»}¡mûwz<Ø7õ•ïnP9ørÆWkÿíñu= ©¯°|«ì_×n½ýëÞz쿳}@ÞþÛãIXÆn÷›‘±çø?Éæsn~‘hhÒHý…IDATxœí]bÛ¶ÉHªå„’-{iìZK:gó’lk×n­š-©ÓtI×õÞÿq€q? E²$ÛødK>$î>Á;”•ÊÈÈØPìZ…¢ØsÖV¯€h!˜Sy»„0E·0}H¹)-ðàæt k€íoÿܪKp”\RÎÏ  €ï.•E‹7¡¿ š)— *V;~ôPeÞâ Bx°*ò,=$z†¥Dؾ„í¢¬ úÅJ±½ÛïÒ¸Ù»¿„¶Ø9î{ ”‘‘‘‘‘‘±Ç¸ñHpÇqW@Äò"2'ðŸÛBúè[¥$ € @TàÕiºHÕ/äábÙ¥9ú6“!¡XãHq`DE¤Ç*RΖ€­ HV!Ÿ%ÙÚã…¢;ÐòÔðÁîÓá"¢ñúãò ÙiÆ]¿ ddddddddìëþÉÐ4yüµ5 ôô ‰Rb¹@(”8šÜÛCd‡öŪÐÝ¡¯,Ü@T@i¼ýÐb‰rq0alX!ô¶”ú° ¯p‰öeº, ëß=4bW ¼{¤ 5°­ÍƬhu~À(ÁQŠ^@ãó3Ú=î¢é"…bÿä5XC@J‘Ž¸C‡ª¤ú€Té®ï7¼ú6™‘‘‘‘‘‘q_±þ²Ô5à ©@,r Å¡É©ªDó«)°Tñ|žOœ…@å ON-Õ™ÊýÉ §÷¥’âýíò[n@ìØR¼¡™XôIm‹Ý‹(‰µá¡F Ê@”?±ð=0Þ puL‘˜;g$Òá@6η„ô „K`Êý>п» @h Õ£åüKV€nÅ"a¦"« ù%l‚@.v‰$/ðU^ôÖ GÈ:#`` ’ €u‚¬TtK©Þ~àÅ‹ÃZ Ýù5T¼¿‰%ÖkìõxÀ®ŸÉÈÈÈÈÈØkÜì]\*ìQÙÀ› ,Ò‡‹ÒëB†ª44 ÚOXKÍ|Šy‚Îgƒ¹Á+_M¤(ûlоEžO„ú V$ûT1BXõõ’b¢-Š|?@ ÔfóÕBßXràö%'@Ò¹A\ºI´á¹J,}†€BBcáó\V ñÊrÁ§£h(Ò]tIÈì^ªó¡}ÜÇÅoÎצo ¾S3ƒ ";£Ï÷Ê™ºìÑÁb}Ü"ß° —Ù){b$‘½¦¥ÆâãGwwݾŒŒŒŒŒ»ò–ßÈa‡œÞb"Þð)öïÓT@pš…F_er6JvШ¨áöÁ"mèÞ­¬M-ÁŸd7óê6”Ðx€¯¯„Ë°6Ó¥;Èì…/¯×ö“ìŒ`>KrP\Äö°_¸Ùë^uŒ1%“ÛOúT‚M²­è.±}¹–ðQ3æêñ€¶.Nسäã}«¡)½—ð>€÷ûäþ-âw`—ê—aƒø—ÿ+sy$ã€äÊt‡ø—)ÜN¬bFFFFÆýBeâ„jùúnNŠ¡Vn4ŒÕø,¹ÁA*õ™Xñâ*ÎÇ5«¤>ÙãP‹‡ªGæ…êa ¶ƒ3 Õõ{öoBˆ ‹&<ô”L[ §ÄÞNc.‹™­Ã¶Üi=Ã`ãQ@‰d‚¯µ ͆I¨Å.I«ëºlÀ`\tà[< èCit¡48Àù4É-rÀ Ž+ÀÌf³Ø쑱‚B€CB ÓÑMH i¤„Ÿôy }˜†Û>ÀÉÍrx¤ñ‰ÝýÄp|zø;BÀãÇ;áb±u¯‹rŒýŸc¨K¶Ÿú4t ôzÀ‘1†G~ ²þß`Ž†ØšÃùêKàÉ| Ì”>ú½Û¡²¯O$ÀØÿðìó~ ¶Ao)Š£¥0pzz ½}i´ý˜ûÓ`;ADÀ¹ÙûüÜm8n:ÁcfÚA@s7ºÁðŸ˜Lê÷ºÞ Z /..À»¨ð€êh8Ôoþ°r? Ú ÅNÇã9Œñ3BèÒ~o_ØÞ'`Àâo„€îpO-˜Ë :¸TGî L;ôÇ7ÇÝ]`ìÚ°B’€Ô%€Ë›>°î*wT´½îpMŸ©0HÝ}&t ¦ò·îÎ^1ˆÖ'Oqór'À2P«Í¡ª¦+Äz,tIW''|enÔþŒŒŒŒŒ=dzgñòRÌm˜[Nò¶Sùt÷K{›úÒ‰m²ÝåØ“Vžtû6¡ÉáÒ²R`úÔÑûšÎ¶NØ&}ÛöB Uå™(òr<ôqÈVyrÐrA**¿Ýدzg6ÓD#›± —–›óÑYP›`®ìîí¥áv‚Ïés€çÌ~(zûMlÞe¿|u¸ÌüQ¿a…*}ž+TŸÌ ²€ú“ºRÆùíX c"+*Ÿ NlôŸNûhc¿Ft‡ÀÛ—&àÅù‡ú¶¿Ô1%ØQ''ßê×?œlÚÃ׸•+&£r{ýj¸N‘಻® æ4ü) ÚËÃ`¨Nç‹Œ€.½ Ûß­ˆ  ùüëÇ£Çÿü®•Üá—“§ôì)q ´2Ÿ?÷²ñýn¼3H€bÐÌø`ï}Ø ÷—­Âþ.`–ñõú§ìpqY1ûe_bûÕËïu÷7ùþe+NÍõ_Fö†¶Ý(êDTƒü,àÃÞL}LLžrûùmP5‹º|±x芥1Œc…ûŠx DAb ŒŒŒŒŒ`ˆ¦M(±ê7¼´ÐNEDï~žÏMzé Ðö+4ÆçÉBXd.ŽÃMzþËv͈ë¾µÓÏð¶«P×d8‰p¬ÿ<6?®Ø8ØN‘ý*xõêèÕ.»¾6Ú6G÷€­ìFåZû½ã…Å)ÝݦOéÉÉ ! ùlÅSsýÓÐh³èíæssàNðõp8Ú`'´0ö/<Æþš¤£s£ï©ß}ñ.æ@ǨÛsƒ7ξ§OÛŸVîDúú€a5ŸÏaŽvÜô]๘õúðÔm1™ø+ÝêŸÒ3äÃýyè6ðÛ õ‹ž>@ßu50ëÀPÚsÿÜÅ5‚¤1=Æë=§pý¢ *ÂKV•Ò«Ü‚Õã€ÝãøÝ»c$N®4(úX¹r2###c- ñê賟LóÓÙδÙ>޼]¯ûó5Ú.žsŸ´ÂYsÇ1ïÞf0Ã;ü'̨¦˜Yþg銛Â{“@9øà øÐÕ`aC(Ž¨=%bêoà2ÌÌ=­†Þnœò¤1ø jœ‡BŸ’o¨½S$nùãà#Ím“ݘú=iœê0ÁcÊÚï§ÝÈþÐÒÝi9Åö}ÔoI…Ù ¨Ýù®qãT‡š]òW%.Ãö‡(‰ËØ…æ]zÛ\ðx f³Ùö"]o°×'uÐ䫵tŠk{Àv;AëÍC3Ö†wž€w¨R_#÷±X» Þ(x§÷Ò‹/q%¶èùW¸ ¨þÅ›ÇÌÜhpíÄk_IöXŠùÇ'b§Éú/fXÞþ²Köi´"#####ã†QCL¼iÀˆ2téè àà€Ê5¬¶L0 ¶¬ÄêQiÞH“2;yÒTêOok;×¢ì Ù¶`õÃRš²Ng{z´y¼!—Kx²¢²·çmì?A(vø£UÒ~Œ°ÎmLÀ(`o/!nòÿ¤°mXŠ€-{ÀvûŽ÷[¾ € dÇw=Àn「ŒŒŒŒûøsdwåüzŽÖnê(åò}O®yŽ~­Ñó ãúmà ›ðï?XUÞ;,àš…V'+û €VŸ&ïJ¸Rê×Z]᧭§:£¥Ï×zC'ýÓ-߆ºžÝÈ@åy ö4¼­Úuó—þ §`VÛ“wö«ÑŠ#÷ýzP@Q˜ N>2/ÿý{¦\o)Žö”ëWøŒ›~a3xLÀw :_QÞ;Œì=pŠÖ¼èdt§Ãî\'8¸º¼ÂÝ~3áSRPÛ¡Ú6Æïõùy+ŸšÏÈÈÈÈXüù€”ÌQ­*¯ÚÞºr üù€”Ì—Ñ­*¯ÚÞºr gÐál™/¤\U^µ½uå$øóüœ|mbÃëVn–ÒÚòw \V½å|ù‡ÞöDËÍŠNVNåæþy‡À7ì¢ÚÙàëk<;œª/ËE}?E*dzgáO ú¨ß~ûègþœ/9¿®6˜Êæê½f c…D}% Š×g$õQî·Gž7öoŽ€)úº¡ÏU J¶ð˜˜o™,O@ú0ß¾Q(íòÀä;žbõ¹¬˜wõ“àÏ:5× úNŒwRÀåþN5ØIòöy'KË?}²¹:9‰mßÆÖ½®*§±í@fÝ@jU9m‡²ë†Ò«Ê´ÃÉ{öÿÓò$âØ——}öídF€âÿôp¿Ñ|%!DdF¸·>™ýû»}Gö€{ßÜ÷»@FFFFFFƦQÜžH ¹ ªÕºìÿí3 •Ðu øù¾Möo¸½·Ê~êvy»}¡mûwz<Ø7õ•ïnP9ørÆWkÿíñu= ©¯°|«ì_×n½ýëÞz쿳}@ÞþÛãIXÆn÷›‘±çø?Éæsn~‘hhÒHý_IDATxœí] cÛ¶ÉJZ¨˜¢ü˜gvÓ,Ù²&{?:-[3»éÒ®ëýÿŸ3âqÀáÔÓJŒO–¡Ãópî…tŸBý» €}6x9‰µs Sm–CÈÕXȸåñã”âÒÖäR<QήFæ ?SõûÊïœHf+&¹y÷tßSE-Gñàø8ë>ëA¦›mÙªdŠ¥ùì ~Z#îæ½sÝÕ¯6Ï'ìаfN›©„ Ô( ± 0%¸Ä#r(DXXK¦QƒL³^J›*´K•ÀÄʱzT˜²AÁ´°¶é~ÿyd-TLieóS«S(K€êň”< ëëbüÛœÖÌãE%NºÎÝÉS~×._¸òcØ$¿ÍQUb=+C±5¯®ì>W-»¬Z¨8BHÐÚŒŠØ—+$~ïªÇ«º+e¤ð¬ù9*9ÆÿJ*åVDúŸáoó•ÎãÇÈq—@º.ƒÖøiÿÎÌ ÀªÙo«Ãâv¦R~S˜ŠH¥6wß_vÁ cUË‚5–y—@~÷RתÍ#ÑJ9ìì"þ!ꎾùJË:Îd•$‡. Ä3@nVewä%™wã>#—ÐvÀåçÎSÆçvó ᤵ§ Ê»#,eõ¶]T qý/Éà–|¿cßÛä÷˜€Õ©bžfppëß‹bH1F—ÀS Ês¬” L…Õ(?"ƒ£ºªÛ#Y¯‹‹ÐP£)óüC6C\$V-šA´Î$ÒÖÒbœ ö߀3ÀR4˜×mô˜ñ¸`G\›°¸“¾~¯ c:C.Ðå—Uèaž¤çsýuC]7<e7,¼¼4 §ÚÒÉßʯÖUÕÄWœ§-™úÍC¿ôÈv7¢ÃuT{%*¿´9ùÒ"Ïå¿V„ìÓzþáOÄFœ‡U¹8áÑŒ)Y~¼+à%âX­4ïSTaWDÝSWÓÈeju•^ÓÑ“IïÍMg/_M½oe"Ù&ª~m ƒ'â súO“ˆÓW’7ô-…³à×;…3áxõfö’7y£rˆÔ#C¹ä+9ckM].õ8qYŒd#R½ñ`ý¿¯Ù÷ªçkaU^k¦„ö#ü/P?*u®$Æ~²Ïã÷HY‚å¶ê‹52ƒÖŸ·æà€ß^|æÚ‚ùÐðbÛ{|aÁ,?k¾€E/vÅÀƒ…kL¶Ì?Ù£o=;d×xlØÀEÎ{¿øA:?aM2¿$Gq†B+•h‡C>te_O8Á±ðÀdø¨0wPl¶E`À õAAÉ‚ÇÃ[é.ŸÀš‘zdµaVÄ€Ó#Oä4&óêÓkô?ÓèüÆV¶€ýâ Œòø`]€Ù’Pª#N†J7YbeÇ7Ž,H[èF¨2¶4eYª»éS¹Û‰|¡B&µ]KîRë‹Ë¥Ŷ ATôSãÍ6?šîh{ëýÁ´9³Ç ÷"Á\®ïv¸¾ÊÀr9U{„qívªk±¾¨ï‹/¾0‚WàÂ+?£ëçÚq°"GW˨ššå`wͤûëW¿Aãá»ççFæ-Í`aÓë«e«]n"ЙbMB]¼p+5¥Þ¿œý 3œG]SÃŽ.1Yax©Ë)ñÞÈÕ[üå»<¢¾¤+è>òÇ sm¿ßèTÖ؆*³sÉ´òÄ,KÛ¶°\ªˆõÛij`eàßrY¾ÂÊ9yaÚЩ ¨L£|Ïž)L[° T7G£¦êÿÀ·÷RüÀõP¾PºŽ$ä­/0Ý£ù*vSûÜtWF¦¼CEÃÛæ»/2:Ñ•htðL”Ð?Õ8;>l ôfYd„Þüà6É©ØÜ}{Zi÷ìŒuk ÑÞDŸ›òJÓŸüÑñ£S\^z L,uFºüt¼ËKyh‚õ}jãÙdrf$åÍ3ÜŸëˆ×:Cd š.—ÆUÁ•Ù½{ÝA¥¯ojRN„ ¥ç°„”ÑŸQ ìSŒ¿€±/]¾ÍVT—Ÿq _×G•Êã9ÀsE$Zw¸Ïóa×ÎÍÛFUŠH#¿úÕ e GÔæ1üZw¢ÝV7>–naÓO[ÛÍ+Ê€ÁÉï¿4ŠHFª›^® ׆–ôûÆO¯Nf½°½ÃTpzaúð Æ€V@O//¿òÐSíÏ]SÝÏ«wx¿TnÛÚªZGã#Nþ"ÙÀ¿Ía]sµŠÕœè¶öX7 Ë`Æý£ÖñúG{vìø´…é?¾V®é´W_ÁÎFYÍ©i+ÊU'‘óÞ4 V³â ¤Ð7âÐ%yT`뇪rãí¡Xùf©OŸÝÎoå¤@Ao>Wû ãn2¥K*ÝfǦM÷æÉh:«7 5ÅMú+иy„Nöì<ÊP LonØÉ> h:Ç™vÞI~…9é畺K 5fº d˜çÄ·cÎöß=ž8£¥983«¹K4jðv°îÿ¦yÀi¥|@v0cN…ƒÌöûïÙ›µ©Æv+Ì©1†WšÒå»rJÛÍ<=Qm´ã[=áÑî(–A3LÀ¦ÝJÕàLá…X ÌÈH˦ÉÁ6:Õ­¡ziJýc¦'”ÿf&‰éLÛÝt™œÍÌv}1Ãî5Ó Ì|…ÃÆ%›Û¶%à2ÐñïoCÀ–m ãÞñ_xª\€íÞc´)VÿaF³3p[›‘<ºo'ý av}fµPKœ‡“ @täâxfjÄ8 ~?|hØpPŒÀ'Þ222:¶^vß2ƒ`vÜ{'`ƒÛý ð ‚^}9@#pŠÇïÏ=ò,'°@Hš C~XHÆʃU0|ËbO∀|cÉû¯Ðp =‘ôkcÛ ö›¾w*##ã¡£à“7ÑK>‰ÜoǽÐ$\ÐùØ…ÆÏFåF‹OÎ"v™—½ „Ãÿp”30ì€F§z8L€&2pG‡>½ã0V~XƒQÁÁƒO²ø¬~‚¯!Eð ´°› 0t$ÚÈ{Š ‚Ãüü F0Ž{FÎ「Œ{íÁ™bZ),\¦(<»`€ãÀ0óéo°ŒÞ¾%Œ•JÞÀVA=÷ÿ#J֟߆ ÷™L 4‚ˆ»”žlO /Ü«bĪ‡ õ‰(X€‰´&€°…ìÜ®ù™`žÝXÇZòwô›222Žá»Ö>*Dg¾â)ƒ Ÿÿñç0‡ݱÜ…Ø*²ouJ(=³äÙMé–^ 8IV },­f„‚øþ…>­+!¾>•?š †º@´½“øeüjBä—D8òþpOÏagd|PÇT®qòÎgò$ÑÏöÇ8iš)Ñsö0,C~\ :UÖVš6‡çU¸ \Åé`ò77áæ`V1©å„õÄc@f„N/ƒÉªÇ¿fž—ˆPʃV]*hš¢ÔÀ ºëá—w.‘è—¢ƒ{7ºiHëu}Âñ¹Jn3œÀéÅüç@ veõåõì±b¾dõ?wáPú…‚yÈWáË‚¬ÁÅÅEºÀrÙµ¢©yI¼*¸RV2~EðT¦~ú=Nåéµ8eÕ! *{è,Fð-¹ï¡ð :.Y´Ág (øÄ^!.€j©€4È^6ïŠÔµí5–o úB}|~ú[ ×]®;CUµ [¼RÚ)€‘Ña«ÑT>ó7ã¡áË/{ƒKy&©ÍϤÍ{QOÎyÔ)‘Å#«Ã¢½¯rþÏ~Žéa!Á&W¾«ëz ZÏÔ졽Tä¥í×¥çºRôÊÒ¥_»s›ü]4"À‰€oEäÀDçAwUºTÝ8ŒHª¾¹‘vÕÒo%sn\Hœy$È´þ­h‹•zàå4q½R¸ð“;yu5:??÷@§V'.žvlc•l77Ýìœ^ÏÚçWì¾ ¼”£Qg÷¹ÍZ-&…5Ý_éDžƒ?çè1Eù›‘©ˆB¢ÀT¢ç ÞNïîN ÙžÈqJ‰/ { ^Ùbý!#ÃÇ{ çÌ~‡Mî»{äè°x/-Jàƒînòÿƒ)Á˜Qlœjk=%ñà4¨¸×6ôÝ} »þÒt¾÷ ÷yX°“»è3KÈŠ7D·:««mÙÒõï»ß{쇀«0-¼Ÿ2ÛTU÷LÛÖPĆïñX@ é׎|M#±D„ð«/vÐzäXÞýpŸ<Ñ %#ãÓÌØìÄ_%Ý=òéÆ/­9ä(@C@…à À„YM¯¸kfÀ#Ø-rÌ@ÃC›Ê­d8äaG‡@ªÆŒ< Üø@éÞ»@Fƃǃ~?lÙÍládžÜ/¬›wl‘TõÒÂL•ÒdžR¾nñÇF¼¢·“WbæßA%‹ª“óI÷gשáÎ齤Á§'ò39RÍ^ê÷MRèV±òÖ¡‰¾ÖÀUÙué£C ðêÅ+ÚæÕ0 iÈ=§ÈYSŸø}€!úéÛÍèuËÛ–¿ð,V/B»5ôŠ¯Âï, œÉð.üC²|½árù”…û´ÎÂÝ×軶 Z^;ûÒ0p&ã“h"âñÁ?ÈÀo‚–7~olÂap,l¹r_UšáaÚÏÏFH\¬´€zhýŽ»±à÷†è+G_mB¯[Þ¶ôðûCôÕ·’þöjSzÝò¶¥322`tÆÞ裇œ«Óé:øûò„žÏ{ýô¹ÀãGÀCïû@ÿ{EŽ …:­\ÓåÕý¨^œâ ü?*;Û¢9€/€B½Ao_üîÛ @Ç”þˆ[@ ý] Qýµl u§ùf;þúŠs èåIEND®B`‚assets/css/images/ui-icons_cd0a0a_256x240.png000064400000010421147600374260014470 0ustar00‰PNG  IHDRðØIJùíPLTEÌ Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì Ì ëFcNtRNS2P¿ƒ™."Tp@f`Í <BHJZ&0R,…4‡ÃjÉÏÇ8D½¹|«µ¥©­³(ýŸ$ï £b•¡¯lßF>n~‘hhÒHý…IDATxœí]bÛ¶ÉHªå„’-{iìZK:gó’lk×n­š-©ÓtI×õÞÿq€q? E²$ÛødK>$î>Á;”•ÊÈÈØPìZ…¢ØsÖV¯€h!˜Sy»„0E·0}H¹)-ðàæt k€íoÿܪKp”\RÎÏ  €ï.•E‹7¡¿ š)— *V;~ôPeÞâ Bx°*ò,=$z†¥Dؾ„í¢¬ úÅJ±½ÛïÒ¸Ù»¿„¶Ø9î{ ”‘‘‘‘‘‘±Ç¸ñHpÇqW@Äò"2'ðŸÛBúè[¥$ € @TàÕiºHÕ/äábÙ¥9ú6“!¡XãHq`DE¤Ç*RΖ€­ HV!Ÿ%ÙÚã…¢;ÐòÔðÁîÓá"¢ñúãò ÙiÆ]¿ ddddddddìëþÉÐ4yüµ5 ôô ‰Rb¹@(”8šÜÛCd‡öŪÐÝ¡¯,Ü@T@i¼ýÐb‰rq0alX!ô¶”ú° ¯p‰öeº, ëß=4bW ¼{¤ 5°­ÍƬhu~À(ÁQŠ^@ãó3Ú=î¢é"…bÿä5XC@J‘Ž¸C‡ª¤ú€Té®ï7¼ú6™‘‘‘‘‘‘q_±þ²Ô5à ©@,r Å¡É©ªDó«)°Tñ|žOœ…@å ON-Õ™ÊýÉ §÷¥’âýíò[n@ìØR¼¡™XôIm‹Ý‹(‰µá¡F Ê@”?±ð=0Þ puL‘˜;g$Òá@6η„ô „K`Êý>п» @h Õ£åüKV€nÅ"a¦"« ù%l‚@.v‰$/ðU^ôÖ GÈ:#`` ’ €u‚¬TtK©Þ~àÅ‹ÃZ Ýù5T¼¿‰%ÖkìõxÀ®ŸÉÈÈÈÈÈØkÜì]\*ìQÙÀ› ,Ò‡‹ÒëB†ª44 ÚOXKÍ|Šy‚Îgƒ¹Á+_M¤(ûlоEžO„ú V$ûT1BXõõ’b¢-Š|?@ ÔfóÕBßXràö%'@Ò¹A\ºI´á¹J,}†€BBcáó\V ñÊrÁ§£h(Ò]tIÈì^ªó¡}ÜÇÅoÎצo ¾S3ƒ ";£Ï÷Ê™ºìÑÁb}Ü"ß° —Ù){b$‘½¦¥ÆâãGwwݾŒŒŒŒŒ»ò–ßÈa‡œÞb"Þð)öïÓT@pš…F_er6JvШ¨áöÁ"mèÞ­¬M-ÁŸd7óê6”Ðx€¯¯„Ë°6Ó¥;Èì…/¯×ö“ìŒ`>KrP\Äö°_¸Ùë^uŒ1%“ÛOúT‚M²­è.±}¹–ðQ3æêñ€¶.Nسäã}«¡)½—ð>€÷ûäþ-âw`—ê—aƒø—ÿ+sy$ã€äÊt‡ø—)ÜN¬bFFFFÆýBeâ„jùúnNŠ¡Vn4ŒÕø,¹ÁA*õ™Xñâ*ÎÇ5«¤>ÙãP‹‡ªGæ…êa ¶ƒ3 Õõ{öoBˆ ‹&<ô”L[ §ÄÞNc.‹™­Ã¶Üi=Ã`ãQ@‰d‚¯µ ͆I¨Å.I«ëºlÀ`\tà[< èCit¡48Àù4É-rÀ Ž+ÀÌf³Ø쑱‚B€CB ÓÑMH i¤„Ÿôy }˜†Û>ÀÉÍrx¤ñ‰ÝýÄp|zø;BÀãÇ;áb±u¯‹rŒýŸc¨K¶Ÿú4t ôzÀ‘1†G~ ²þß`Ž†ØšÃùêKàÉ| Ì”>ú½Û¡²¯O$ÀØÿðìó~ ¶Ao)Š£¥0pzz ½}i´ý˜ûÓ`;ADÀ¹ÙûüÜm8n:ÁcfÚA@s7ºÁðŸ˜Lê÷ºÞ Z /..À»¨ð€êh8Ôoþ°r? Ú ÅNÇã9Œñ3BèÒ~o_ØÞ'`Àâo„€îpO-˜Ë :¸TGî L;ôÇ7ÇÝ]`ìÚ°B’€Ô%€Ë›>°î*wT´½îpMŸ©0HÝ}&t ¦ò·îÎ^1ˆÖ'Oqór'À2P«Í¡ª¦+Äz,tIW''|enÔþŒŒŒŒŒ=dzgñòRÌm˜[Nò¶Sùt÷K{›úÒ‰m²ÝåØ“Vžtû6¡ÉáÒ²R`úÔÑûšÎ¶NØ&}ÛöB Uå™(òr<ôqÈVyrÐrA**¿Ýدzg6ÓD#›± —–›óÑYP›`®ìîí¥áv‚Ïés€çÌ~(zûMlÞe¿|u¸ÌüQ¿a…*}ž+TŸÌ ²€ú“ºRÆùíX c"+*Ÿ NlôŸNûhc¿Ft‡ÀÛ—&àÅù‡ú¶¿Ô1%ØQ''ßê×?œlÚÃ׸•+&£r{ýj¸N‘಻® æ4ü) ÚËÃ`¨Nç‹Œ€.½ Ûß­ˆ  ùüëÇ£Çÿü®•Üá—“§ôì)q ´2Ÿ?÷²ñýn¼3H€bÐÌø`ï}Ø ÷—­Âþ.`–ñõú§ìpqY1ûe_bûÕËïu÷7ùþe+NÍõ_Fö†¶Ý(êDTƒü,àÃÞL}LLžrûùmP5‹º|±x芥1Œc…ûŠx DAb ŒŒŒŒŒ`ˆ¦M(±ê7¼´ÐNEDï~žÏMzé Ðö+4ÆçÉBXd.ŽÃMzþËv͈ë¾µÓÏð¶«P×d8‰p¬ÿ<6?®Ø8ØN‘ý*xõêèÕ.»¾6Ú6G÷€­ìFåZû½ã…Å)ÝݦOéÉÉ ! ùlÅSsýÓÐh³èíæssàNðõp8Ú`'´0ö/<Æþš¤£s£ï©ß}ñ.æ@ǨÛsƒ7ξ§OÛŸVîDúú€a5ŸÏaŽvÜô]๘õúðÔm1™ø+ÝêŸÒ3äÃýyè6ðÛ õ‹ž>@ßu50ëÀPÚsÿÜÅ5‚¤1=Æë=§pý¢ *ÂKV•Ò«Ü‚Õã€ÝãøÝ»c$N®4(úX¹r2###c- ñê賟LóÓÙδÙ>޼]¯ûó5Ú.žsŸ´ÂYsÇ1ïÞf0Ã;ü'̨¦˜Yþg銛Â{“@9øà øÐÕ`aC(Ž¨=%bêoà2ÌÌ=­†Þnœò¤1ø jœ‡BŸ’o¨½S$nùãà#Ím“ݘú=iœê0ÁcÊÚï§ÝÈþÐÒÝi9Åö}ÔoI…Ù ¨Ýù®qãT‡š]òW%.Ãö‡(‰ËØ…æ]zÛ\ðx f³Ùö"]o°×'uÐ䫵tŠk{Àv;AëÍC3Ö†wž€w¨R_#÷±X» Þ(x§÷Ò‹/q%¶èùW¸ ¨þÅ›ÇÌÜhpíÄk_IöXŠùÇ'b§Éú/fXÞþ²Köi´"#####ã†QCL¼iÀˆ2téè àà€Ê5¬¶L0 ¶¬ÄêQiÞH“2;yÒTêOok;×¢ì Ù¶`õÃRš²Ng{z´y¼!—Kx²¢²·çmì?A(vø£UÒ~Œ°ÎmLÀ(`o/!nòÿ¤°mXŠ€-{ÀvûŽ÷[¾ € dÇw=Àn「ŒŒŒŒûøsdwåüzŽÖnê(åò}O®yŽ~­Ñó ãúmà ›ðï?XUÞ;,àš…V'+û €VŸ&ïJ¸Rê×Z]᧭§:£¥Ï×zC'ýÓ-߆ºžÝÈ@åy ö4¼­Úuó—þ §`VÛ“wö«ÑŠ#÷ýzP@Q˜ N>2/ÿý{¦\o)Žö”ëWøŒ›~a3xLÀw :_QÞ;Œì=pŠÖ¼èdt§Ãî\'8¸º¼ÂÝ~3áSRPÛ¡Ú6Æïõùy+ŸšÏÈÈÈÈXüù€”ÌQ­*¯ÚÞºr üù€”Ì—Ñ­*¯ÚÞºr gÐál™/¤\U^µ½uå$øóüœ|mbÃëVn–ÒÚòw \V½å|ù‡ÞöDËÍŠNVNåæþy‡À7ì¢ÚÙàëk<;œª/ËE}?E*dzgáO ú¨ß~ûègþœ/9¿®6˜Êæê½f c…D}% Š×g$õQî·Gž7öoŽ€)úº¡ÏU J¶ð˜˜o™,O@ú0ß¾Q(íòÀä;žbõ¹¬˜wõ“àÏ:5× úNŒwRÀåþN5ØIòöy'KË?}²¹:9‰mßÆÖ½®*§±í@fÝ@jU9m‡²ë†Ò«Ê´ÃÉ{öÿÓò$âØ——}öídF€âÿôp¿Ñ|%!DdF¸·>™ýû»}Gö€{ßÜ÷»@FFFFFFƦQÜžH ¹ ªÕºìÿí3 •Ðu øù¾Möo¸½·Ê~êvy»}¡mûwz<Ø7õ•ïnP9ørÆWkÿíñu= ©¯°|«ì_×n½ýëÞz쿳}@ÞþÛãIXÆn÷›‘±çø?Éæs td { padding: 0; } .dup-row-details .dup-package-row-details-wrapper { border-left: 3px solid #444444; padding: 20px; } .dup-row-details td:hover { background-color:#ffffff !important } /* -------------------- BAR INFO SECTION*/ div.dup-ovr-bar-flex-box > div { min-width:95px; padding:5px 5px 5px 15px; } div.dup-ovr-bar-flex-box label { font-weight:bold } div.dup-ovr-bar-flex-box { display:flex; background-color:#F6F7F7; height:50px; border:1px solid #e8e8e8; background:linear-gradient(180deg, hsla(180, 6%, 97%, 1) 60%, hsla(0, 0%, 100%, 1) 100%); } div.dup-ovr-bar-flex-box div.divider { border-right: 1px solid #e8e8e8; } /* -------------------- OVERVIEW CTRL-AREA */ .dup-ovr-ctrls-flex-box { display:flex; flex-wrap:wrap; flex-direction:row; justify-content: start; gap: 20px; margin-top: 20px; } .dup-ovr-ctrls-flex-box .flex-item .dup-ovr-ctrls-hdrs { border-bottom:1px solid #dfdfdf; padding:0 0 5px 0 } .dup-ovr-ctrls-flex-box .flex-item:first-child { flex: 5 0 auto; font-size:15px; } .dup-ovr-ctrls-flex-box .flex-item:last-child { flex: 0 0 350px; } .flex-item > div { padding:2px; font-size:15px; white-space:nowrap; } .flex-item > .dup-ovr-ctrls-hdrs { font-size:18px; margin:5px 0 10px 0; height:40px; } /* -------------------- INSTALL RESOURCES*/ .dup-ovr-copy-flex-box { display: flex; flex-wrap: wrap; flex-flow: row; padding:5px; } .dup-ovr-copy-flex-box .flex-item:nth-of-type(1) { flex:2 0 auto; padding: 0; } .dup-ovr-copy-flex-box .flex-item:nth-of-type(2) { flex:0 0 225px; padding:0; } input.dup-ovr-ref-links { width:100%; text-overflow:ellipsis; font-size:12px; border:1px solid silver; border-radius:0; padding-right:25px; } .dup-ovr-ref-links-icon { float: right; margin:-22px 6px 0 0 ; position: relative; z-index: 2; color: #b2b2b2; cursor:help; } .dup-ovr-ctrls-flex-box sup .fa-question-circle { padding-left:3px; } input.dup-ovr-ref-links.missing { color:maroon; } .dup-ovr-ref-links-more { font-size:13px; display:block; text-align:right; float:right; padding:5px 0 0 0 ; cursor: pointer; } .dup-ovr-ref-copy, .dup-ovr-ref-dwnld { padding:5px 10px 5px 10px; margin:-1px 0 0 7px; border:1px solid silver; display:inline-block; cursor:pointer; border-radius:2px; min-width:85px; text-align: center; font-size:13px; } span.dup-ovr-ref-dwnld:hover { background-color: #F0F0F0; } span.dup-ovr-ref-copy:hover { border:1px solid #dcdcdc; background-color:#f0f0f0 } span.dup-info-msg01 { font-size:11px; color:gray; font-weight:normal; font-style:italic; display:inline-block } /* -------------------- OPTIONS SECTION*/ div.dup-ovr-opts .button { font-size:14px; display: block; text-align: center; margin:10px 0 10px 0; padding:1px 20px 3px 20px; border:1px solid #dcdcdc; min-width:175px; height: 40px; line-height: 40px; border-radius:2px; width: 100%; max-width: 250px; } div.dup-ovr-opts .button:hover { background-color:#f0f0f0 } /* ================================================ * TUTORIAL DIALOG * ============================================= */ div.dup-dlg-links-subtxt { color:#777; padding:0; margin-top:-5px; font-size:12px; font-style: italic; } /* -------------------- SPINNER SECTION*/ div.dup-spin-hlp h3 { color:#333; font-size:24px; margin:0 0 2px 0; padding:5px 0 3px 0; border-bottom: 1px solid silver; } div.dup-spin-hlp { font-size:16px; user-select:none; } div.dup-spin-hlp b { font-weight: 700; } div.dup-spin-hlp i.fa-question-circle { vertical-align: top; color:#999; font-size:11px; } div.dup-spin-hlp small { color:#999; font-style: italic; font-weight: normal; } div.dup-spin-hlp > div.title { font-size:18px; font-weight: bold; } div.dup-spin-hlp div.sub-head { color:darkgreen; font-size:0.85em; font-style: italic; margin:0 0 15px 0; } div.dup-spin-hlp small.grey { color:#777; } div.dup-spin-hlp ul.sub-list { padding: 7px; } div.dup-ovr-continue { display: block; width: 100%; text-align: right; font-size:18px; } div.dup-tabvert-hlp > div.panel > div.title { font-size:18px; font-weight: bold; border-bottom: 1px solid silver; padding: 2px 0 2px 0; margin:0 0 5px 0; } /* ================================================ * RECOVERY POINT DIALOG * ============================================= */ div.dup-dlg-recover { margin:auto; margin:50px 0 0 0; padding:2px; width:100%; text-align:center } div.dup-dlg-recover button { width:300px; height:50px } div.dup-dlg-recover button small { display:block; padding:0; margin:-5px 0 0 0 } div.dup-dlg-recover-choose { padding:5px } div.dup-dlg-recover-or { margin:15px 15px 15px 0; font-size:18px; color:#999; font-weight:bold } span.dup-dlg-recover-msg-active { display:block; margin:0; padding:2px } div.dup-dlg-recover-link{ text-align: center; } assets/css/style.css000064400000165267147600374260010542 0ustar00/*! ================================================ * DUPLICATOR STYLE * Common elements shared across the duplicator plugin * Copyright:Snap Creek LLC 2015-2021 * ================================================ */ /*Global Elements*/ .duplicator-page #wpcontent { position: relative; } .clearfix:before, .clearfix:after { content: " "; /* 1 */ display: table; /* 2 */ } .clearfix:after { clear: both; } input[type=button] { cursor: pointer; padding: 5px; cursor: pointer; } input[type=submit] { cursor: pointer; padding: 5px; cursor: pointer; } input[type=text].small { width: 200px; } input[type=text].medium { width: 400px; } input[type=text].large { width: 800px; } .no-select { user-select: none; -o-user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; } hr { border: 0; border-top: 1px solid #ddd; border-bottom: 1px solid #fafafa; margin: 10px 0 2px 0; } i[data-tooltip].fa-question-circle { cursor: pointer; color: #888888 } span.btn-separator { content: ''; display: inline-block; background: silver; margin: 2px 10px; height: 25px; width: 1px; vertical-align: top; } .badge { float: right; border-radius: 2px; color: #fff; min-width: 40px; text-align: center; position: relative; right: 10px; font-size: 12px; padding: 0 3px 0 3px; font-weight: normal; } .badge.badge-pass { background: green; } .badge.badge-warn { background: #636363; } .dup-badge-01 { font-weight: bold; color: #000; text-align: center; vertical-align: text-top; font: 0.7em Verdana, sans-serif; } a.upgrade-link { color: maroon; font-style: italic } .pointer { cursor: pointer } .fa-small { font-size: 12px !important; } /* UTILS CLASSES */ .no_display, .no-display { display: none !important; } .display-block { display: block !important; } .link-style { color: #0074ab; cursor: pointer; text-decoration: underline; } .link-style:hover { color: #00a0d2; } .cursor-pointer { cursor: pointer; } .widefat .link-style { text-decoration: none; } .no-decoration { text-decoration: none; } .underline { text-decoration: underline; } .italic { font-style: italic } .bold { font-weight: bold } a.disabled { display: inline-block; /* For IE11/ MS Edge bug */ pointer-events: none; cursor: not-allowed; text-decoration: none; } button:disabled, button.disabled, .button:disabled, .button.disabled { pointer-events: none; cursor: not-allowed; } hr.separator { border: 0 none; border-bottom: 1px solid #dfdfdf; margin: 20px 0; padding: 0; } hr.separator.dotted { border-bottom: 1px dotted #dfdfdf; } .button-cancel { color: orangered !important; } .float-left { display: block; float: left; } .float-right { display: block; float: right; } .text-center { text-align: center; } .text-left { text-align: left; } .text-right { text-align: right; } .color_red, .red { color: #DB4B38; } .background-red { background: #DB4B38; } .white { color: white !important; } .orangered { color: orangered; } .green { color: #008000; } .gray { color: gray; } .backgroun-green { background: #008000; } .maroon { color: maroon; } .darkgreen { color: darkgreen; } .silver { color: silver; } .button.maroon { border-color: maroon; color: maroon; } .margin-top-0 { margin-top: 0; } .margin-top-1 { margin-top: 20px; } .margin-top-2 { margin-top: 40px; } .margin-bottom-0 { margin-bottom: 0; } .margin-bottom-1 { margin-bottom: 20px; } .margin-bottom-2 { margin-bottom: 40px; } .margin-left-0 { margin-left: 0; } .margin-left-1 { margin-left: 20px; } .margin-left-2 { margin-left: 40px; } .margin-right-0 { margin-right: 0; } .margin-right-1 { margin-right: 20px; } .margin-right-2 { margin-right: 40px; } .font-size-14 { font-size: 14px } .font-size-15 { font-size: 15px } .font-size-16 { font-size: 16px } .width-large { max-width: 800px; } .dup-btn-borderless { padding: 1px 4px 1px 4px; outline: none; border: 1px solid transparent; color: #777; cursor: pointer; background-color: transparent; text-decoration: none; } .dup-btn-borderless:hover { outline: none; outline-style: none; border-color: transparent; color: #000; font-weight: bold; border-radius: 2px; border: 1px solid black; } /* TYPOGRAPHY */ h2.dup-title { font-size: 22px; font-weight: bold; margin-bottom: 20px; } h3.dup-title { font-size: 18px; font-weight: bold; margin-bottom: 20px; } .dup-radio-button-group-wrapper { width: 100%; display: flex } .dup-radio-button-group-wrapper input[type="radio"] { position: absolute; left: -9999em; } .dup-radio-button-group-wrapper input[type="radio"]+label { flex: 1 1 25%; padding: .5em 1em; cursor: pointer; text-align: center; color: #2271b1; background: #f6f7f7; border-right: 1px solid #2271b1; box-sizing: border-box; } .dup-radio-button-group-wrapper input[type="radio"]+label:last-child { border-right: none; } .dup-radio-button-group-wrapper input[type="radio"]+label:hover, .dup-radio-button-group-wrapper input[type="radio"]:focus+label, .dup-radio-button-group-wrapper input[type="radio"]:checked+label { background: #2271b1; border-color: #2271b1; color: #fff; } /*TABS*/ .dup-pro-tab-content-wrapper { position: relative; } ul.category-tabs li { cursor: pointer; font-size: 16px; } ul.category-tabs li button { color: inherit; cursor: pointer; font-size: 16px; border: none; background: transparent; } .dup-sub-tabs { padding: 10px 0 10px 0; font-size: 14px } .dup-sub-tabs .dup-sub-tab-item:after { content: "|"; margin: 0 7px; } .dup-sub-tabs .dup-sub-tab-item:last-child:after { content: none; margin: 0; } .dup-tabs-opts-notice { color: maroon; line-height: 22px; } .dup-tabs-opts-notice ul.dup-tabs-opts-help { color: maroon; line-height: 22px; margin: 5px 0 0 40px; list-style: disc; } .dup-tabs-opts-help { font-style: italic; font-size: 12px; margin: 5px 0; color: #666 } .dup-tabs-opts-help-secure-pass { font-style: italic; font-size: 12px; color: #666; } /*PROGRESS BAR*/ .dup-pro-meter-wrapper { position: relative; flex-grow: 1; } .dup-pro-meter-wrapper .text { position: absolute; top: 50%; left: 50%; color: #fff; transform: translate(-50%, -50%); font-weight: bold; } .dup-pro-meter { height: 30px; /* Can be anything */ position: relative; background: #bbb8b8; -moz-border-radius: 25px; -webkit-border-radius: 25px; border-radius: 25px; box-sizing: border-box; -webkit-box-shadow: inset 0 -1px 1px rgba(255, 255, 255, 0.3); -moz-box-shadow: inset 0 -1px 1px rgba(255, 255, 255, 0.3); box-shadow: inset 0 -1px 1px rgba(255, 255, 255, 0.3); } #dup-pro-ajax-loader { display: none; opacity: 0; position: fixed; top: 0; left: 0; z-index: 100000000; width: 100%; height: 100%; width: 100vw; height: 100vh; background-color: rgba(200, 200, 200, 0.3); } #dup-ajax-loader-img-wrapper { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); opacity: 0.6; } #dup-ajax-loader-img-wrapper img { animation-name: ajax-loader-spin; animation-duration: 2s; animation-iteration-count: infinite; animation-timing-function: linear; width: 100px; } @keyframes ajax-loader-spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .dup-pro-meter>span { display: block; height: 100%; -webkit-border-top-right-radius: 20px; -webkit-border-bottom-right-radius: 20px; -moz-border-radius-topright: 20px; -moz-border-radius-bottomright: 20px; border-top-right-radius: 20px; border-bottom-right-radius: 20px; -webkit-border-top-left-radius: 20px; -webkit-border-bottom-left-radius: 20px; -moz-border-radius-topleft: 20px; -moz-border-radius-bottomleft: 20px; border-top-left-radius: 20px; border-bottom-left-radius: 20px; background-color: rgb(43, 194, 83); background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, rgb(43, 194, 83)), color-stop(1, rgb(84, 240, 84))); background-image: -moz-linear-gradient(center bottom, rgb(43, 194, 83) 37%, rgb(84, 240, 84) 69%); -webkit-box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4); -moz-box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4); box-shadow: inset 0 2px 9px rgba(255, 255, 255, 0.3), inset 0 -2px 6px rgba(0, 0, 0, 0.4); position: relative; overflow: hidden; } .dup-pro-meter>span:after, .animate>span>span { content: ""; position: absolute; top: 0; left: 0; bottom: 0; right: 0; background-image: -webkit-gradient(linear, 0 0, 100% 100%, color-stop(.25, rgba(255, 255, 255, .2)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255, 255, 255, .2)), color-stop(.75, rgba(255, 255, 255, .2)), color-stop(.75, transparent), to(transparent)); background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, .2) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .2) 50%, rgba(255, 255, 255, .2) 75%, transparent 75%, transparent); z-index: 1; -webkit-background-size: 50px 50px; -moz-background-size: 50px 50px; -webkit-animation: move 2s linear infinite; -webkit-border-top-right-radius: 20px; -webkit-border-bottom-right-radius: 20px; -moz-border-radius-topright: 20px; -moz-border-radius-bottomright: 20px; border-top-right-radius: 20px; border-bottom-right-radius: 20px; -webkit-border-top-left-radius: 20px; -webkit-border-bottom-left-radius: 20px; -moz-border-radius-topleft: 20px; -moz-border-radius-bottomleft: 20px; border-top-left-radius: 20px; border-bottom-left-radius: 20px; overflow: hidden; } .dup-pro-meter .animate>span:after { display: none; } .dup-pro-meter.dup-pro-fullsize>span { width: 100%; } @-webkit-keyframes move { 0% { background-position: 0 0; } 100% { background-position: 50px 50px; } } .dup-pro-meter.orange>span { background-color: #f1a165; background-image: -moz-linear-gradient(top, #f1a165, #f36d0a); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f1a165), color-stop(1, #f36d0a)); background-image: -webkit-linear-gradient(#f1a165, #f36d0a); } .dup-pro-meter.red>span { background-color: #f0a3a3; background-image: -moz-linear-gradient(top, #f0a3a3, #f42323); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f0a3a3), color-stop(1, #f42323)); background-image: -webkit-linear-gradient(#f0a3a3, #f42323); } .dup-pro-meter.blue>span { background-color: #6088FF; background-image: -moz-linear-gradient(top, #6088FF, #1A1AFF); background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #6088FF), color-stop(1, #1A1AFF)); background-image: -webkit-linear-gradient(#6088FF, #1A1AFF); } .nostripes>span>span, .nostripes>span:after { -webkit-animation: none; background-image: none; } .center-xy { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } /*PROGRESS BAR END*/ /*BOXES: Expandable sections */ div.dup-box { padding: 0px; display: block; background-color: #fff; border: 1px solid #e5e5e5; box-shadow: 0 1px 1px rgba(0, 0, 0, .04); } div.dup-box-title { font-size: 20px; padding: 12px 0 3px 12px; font-weight: bold; cursor: pointer; height: 30px; margin: 0; color: #000 } div.dup-box-title:hover { background-color: #FCFCFC; } button.dup-box-arrow { display: block; box-sizing: border-box; background: transparent; border: none; text-decoration: none !important; float: right; width: 40px; height: 23px; font-size: 16px; cursor: pointer; padding: 1px 0 0 0; white-space: nowrap } div.dup-box-panel { padding: 10px 15px 10px 15px; border-top: 1px solid #EEEEEE; margin: -1px 0 0 0; } sup.dup-box-title-badge { display: inline-block; font-weight: normal; margin-top: -3px; font-size: 12px; font-style: italic } /*PANELS: Boxes that do not exapand */ div.dpro-panel-optional-txt { text-align: center; font-style: italic; font-size: 12px; color: #777 } .disabled .dpro-panel-optional-txt { color: #777; } div.dpro-panel-optional-txt { color: maroon } /*EDIT SCREENS: Common edit settings */ .dpro-edit-toolbar { width: 100%; margin: 0; border-spacing: 0; margin-bottom: 10px; } .dpro-edit-toolbar input, .dpro-edit-toolbar select { margin: 0; } .dpro-edit-toolbar td { white-space: nowrap !important; padding: 10px 0 0 0 } .dpro-edit-toolbar td:last-child { width: 100%; text-align: right; padding-right: 0px } .dpro-edit-toolbar td:last-child a { top: 0; } .dpro-edit-toolbar .button { box-shadow: none !important } .dpro-edit-toolbar .btnnav { font-weight: normal } .dpro-edit-toolbar .btnnav a { margin: 5px 0 2px 0; } .dpro-edit-toolbar .tablenav-pages a { margin-top: 5px } .dpro-edit-toolbar .tablenav-pages span { font-weight: normal !important; } .dpro-edit-toolbar .dup-new-package-wrapper { margin: 0 0 0 10px; display: inline-block; } hr.dpro-edit-toolbar-divider { margin: 8px 0 8px 0 } i.dpro-edit-info { font-size: 12px; color: #777; line-height: 25px; } /*INFO-BOX: Simple box with no title */ div.dup-info-box { padding: 8px; border: 1px solid #ccc; border-radius: 4px; background-color: #F7FCFE; margin: 0 0 5px 20px; line-height: 16px } div.dup-info-box small { margin-top: 10px; display: block } /* =========================================================== * PACKAGES: All Packages, Details, Create Wizard, Templates */ .dup-progress-bar-area { width: 500px; margin: 40px auto 0 auto; padding: 25px 50px 35px 50px; border: 1px solid #ccc; box-shadow: 0 8px 6px -6px #999; text-align: center; border-radius: 4px; } .dup-progress-bar-area .dup-pro-title { font-size: 1.7em; } .dup-progress-bar-area .dup-pro-meter-wrapper { margin: 10px 0; } /* Package Header Titles: */ div.dup-package-hdr-1, div.dup-package-hdr-2 { font-weight: bold; border-bottom: 1px solid #dfdfdf; padding-bottom: 2px; width: 100%; margin-bottom: 8px; font-size: 16px; width: 100%; } div.dup-package-hdr-2 { font-size: 14px; } div.dup-package-hdr-usecurrent { float: right; font-weight: normal; font-size: 13px; } /*HEADER MESSAGES*/ div.dup-hdr-success { color: green; font-size: 20px; font-weight: bold } div.dup-hdr-error { color: #A62426; font-size: 20px; font-weight: bold } .dup-narrow-input { width: 80px; } .dup-wide-input { width: 400px; } .dup-details-packages-list { float: right; margin: -25px 10px 0 0; } /*FOOTER MESSAGES*/ div#dpro-monitor-trace-area { position: fixed; bottom: 5px; padding: 5px; border: 0px solid red; text-align: center; border: 0 solid red; right: 5px; line-height: 26px } div#dpro-monitor-trace-area a { font-style: italic } /*SCREEN TABS*/ div.dpro-screen-hlp-info { line-height: 26px; padding: 10px 0 10px 0 } /*DIALOGS: THICKBOX */ #TB_title { padding-bottom: 3px !important; margin-bottom: 5px !important; font-size: 16px !important; } div.dpro-dlg-textarea-caption { padding-top: 10px 0; padding-bottom: 0px; font-size: 16px; line-height: 22px } textarea.dpro-dlg-textarea { resize: none; overflow-y: scroll; } div.dpro-dlg-alert-txt { padding: 10px 0; font-size: 16px; line-height: 22px } div.dpro-dlg-alert-btns { float: right; } div.dpro-dlg-confirm-txt { font-size: 16px; box-sizing: border-box; overflow: auto; height: calc(100% - 95px); min-height: 100px; } .dpro-dlg-confirm-txt>div>*:first-child { margin-top: 0; } .dpro-dlg-confirm-txt>div>*:last-child { margin-bottom: 0; } .dpro-dlg-confirm-btns { position: absolute; bottom: 20px; right: 20px; } .dpro-dlg-confirm-btns .button { margin-left: 5px; } .dpro-dlg-confirm-progress { display: none } /*ADMIN: NOTICES */ div#dpro-global-error-reserved-files p { font-size: 14px } div#dpro-global-error-reserved-files .pass-msg { color: green; font-size: 20px; } div#dpro-global-error-reserved-files p.pass-lnks { line-height: 24px; margin: -7px 0 0 5px } div#dpro-global-error-reserved-files div.pass-msg { padding: 5px 0 0 10px; font-size: 12px; color: #656565; font-style: italic } div.cleanup-notice b.title { color: green; font-size: 20px; } div.dpro-wpnotice-box { display: none; } div.error-txt { color: maroon; font-style: italic } .dup-migration-pass-wrapper p { font-size: 14px; } .dup-migration-pass-title { color: green; font-size: 20px; margin: 10px 0; font-weight: bold; } .dup-stored-minstallation-files { margin-left: 20px; line-height: 1; font-style: italic; margin-top: 0; font-size: 12px; } .dup-migration-pass-wrapper .sub-note { font-size: 12px; } label.dup-store-lbl:hover { color: #000; font-weight: 500; } #dup-store-err-details { display: none } /*** TEMPLATE LIST ***/ .dup-template-list-tbl td { height: 45px } .dup-template-list-tbl a.name { font-weight: bold } .dup-template-list-tbl input[type='checkbox'] { margin-left: 5px } .dup-template-list-tbl div.sub-menu { margin: 5px 0 0 2px; display: none } .dup-template-list-tbl tr.package-detail { display: none; } .dup-template-list-tbl tr.package-detail td { padding: 2px 2px 2px 15px; margin: -5px 0 2px 0; height: 22px } .dup-template-list-tbl .col-check { width: 10px; } .dup-template-list-tbl .col-name { width: 425px; overflow-wrap: break-word; word-break: break-all; } .dup-template-list-tbl .col-empty { width: 25px; } .dup-package-details-wrapper .tabs-panel { padding: 10px !important } .dup-package-details-wrapper .toggle-box { float: right; margin: 5px 5px 5px 0 } .dup-package-details-wrapper .dup-box { margin-top: 15px; font-size: 14px; clear: both } .dup-package-details-wrapper .dup-box-panel { padding-bottom: 40px } .dup-package-details-wrapper .dup-dtl-data { width: 100% } .dup-package-details-wrapper .dup-dtl-data tr { vertical-align: top } .dup-package-details-wrapper .dup-dtl-data tr:first-child td { margin: 0; padding-top: 0 } .dup-package-details-wrapper .dup-dtl-data td { padding: 5px 0 5px 0; } .dup-package-details-wrapper .dup-dtl-data td:first-child { font-weight: bold; width: 130px !important; } .dup-package-details-wrapper .dup-pack-dtls-sublist { margin-top: 10px; } .dup-package-details-wrapper .dup-pack-dtls-sublist td:first-child { white-space: nowrap; vertical-align: middle; width: 70px !important; } .dup-package-details-wrapper .dup-pack-dtls-sublist td { white-space: nowrap; vertical-align: top; padding: 2px; font-size: 13px } .dup-package-details-wrapper .section-hdr { font-size: 16px; display: block; border-bottom: 1px solid #dedede; margin: 5px 0 10px 0; font-weight: bold; padding: 0 0 3px 0 } .dup-package-details-wrapper .sub-item td { line-height: 22px; font-size: 13px } .dup-package-details-wrapper .dup-dtl-data i.fa-filter { display: inline-block; margin-right: 3px; width: 15px } .dup-package-details-wrapper .sub-item-disabled td { color: silver } .dup-package-details-wrapper .sub-section { border-bottom: 1px solid #efefef } .dup-package-details-wrapper .sub-notes { font-weight: normal !important; font-style: italic; color: #999; padding-top: 10px; } .dup-package-details-wrapper .sub-filter-hdr { padding: 5px 0 3px 0; font-weight: bold; } .dup-package-details-wrapper .sub-filter-data { padding: 0 0 5px 15px } .dup-package-details-wrapper .filter-info { width: 95%; height: 250px; overflow-y: scroll; background-color: #FFFFF3; font-size: 13px; display: none; padding: 5px 10px; border: 1px solid silver; border-radius: 2px; line-height: 22px; margin: 5px 0 5px 0 } .dup-package-details-wrapper .sub-filter-data a { outline: none; box-shadow: none; display: inline-block; padding: 7px 1px 7px 7px } /*GENERAL*/ .dup-package-details-wrapper .dup-link-data { display: none; line-height: 24px; margin: 5px 0 0 10px } .dup-package-details-wrapper .dup-link-data b { display: inline-block; min-width: 75px } .dup-package-details-wrapper #dpro-downloads-area { padding: 5px 0 5px 0; } .dup-package-details-wrapper #dpro-downloads-msg { margin-bottom: -5px; font-style: italic } .dup-package-details-wrapper .file-info { width: 95%; height: 200px; font-size: 12px; margin: 7px 0 5px 0 } /*ARCHIVE*/ .dup-package-details-wrapper #dup-package-dtl-archive-panel { padding-bottom: 40px } /*INSTALLER*/ .dup-package-details-wrapper #dpro-pass-toggle { position: relative; margin: 0; width: 273px } .dup-package-details-wrapper #secure-pass { border-radius: 4px 0 0 4px; width: 217px; height: 23px; min-height: auto; margin: 0; padding: 0 4px; } .dup-package-details-wrapper #dpro-install-secure-lock { color: #A62426; font-size: 14px } .dup-package-details-wrapper #dpro-install-secure-unlock { color: #A62426; font-size: 14px } .transfer-panel h3 { margin: 10px 0 5px 5px } .transfer-panel h2.title { font-size: 18px } .transfer-panel { padding: 5px 5px 10px 10px; } .transfer-panel .transfer-hdr { margin: 0 0 20px 0 } .transfer-panel .transfer-hdr hr { margin: -10px 0 0 0 } /*Overview section */ .transfer-panel #step1-ovr { margin: 5px 0 40px 0; width: 100%; display: none } .transfer-panel #step1-ovr label { margin: 10px 0 5px 2px; display: block; } .transfer-panel #step1-ovr b { font-size: 14px } .transfer-panel #step1-ovr input { max-width: 800px; width: 100%; margin-top: 2px; font-weight: normal; border: 1px solid silver } .transfer-panel #step1-ovr h3 { margin: 0 0 10px 0; font-size: 16px; } .transfer-panel #step1-ovr small { font-style: italic; color: #777; display: block; margin: -5px 0 5px 0 } .transfer-panel #step2-section { margin: 5px 0 40px 0 } .transfer-panel #location-quick-opts { display: none } .transfer-panel #location-quick-opts input[type=text] { width: 300px } .transfer-panel .dup-box-title { font-size: 15px } .transfer-panel .dpro-progress-bar-container { margin: 0 auto 10px auto; text-align: center; } .transfer-panel #step3-section { margin: 65px 0 0 0 } .transfer-panel #dpro-progress-bar-area { width: 300px; margin: 5px auto 0 auto; text-align: center } .transfer-panel .dpro-active-status-area { display: none; } .transfer-panel tr.dup-choose-loc-new-pack td { text-align: right; padding: 5px 15px 5px 5px; border-top: 1px solid #c3c4c7 } .transfer-panel #dup-pro-transfer-btn { float: right; margin: -20px 15px 0 0; font-size: 14px; padding: 2px 20px 2px 20px; font-size: 14px } .transfer-panel #dup-pro-stop-transfer-btn { margin-top: 10px; } .transfer-panel .dpro-btn-stop { width: 150px !important } .transfer-panel .status-pending td { font-style: italic; color: #999 } .transfer-panel .status-running td { font-style: italic; color: green } .transfer-panel .status-failed td { color: maroon } .transfer-panel .status-normal td { color: #000 } .transfer-panel .package-tbl tfoot td { font-size: 12px; text-align: right } .transfer-panel #dup-trans-ovr { display: block; float: right; font-size: 13px; padding: 2px 10px 2px 10px; border: 1px solid transparent; font-weight: bold } .transfer-panel .copy-button { border: 1px solid silver; padding: 5px 10px 5px 10px; cursor: pointer } .transfer-panel .copy-button:hover { background-color: #e4e4e4 } /*** TEMPLATE: EDIT ***/ #dpro-template-form table.dpro-edit-toolbar select { float: left } #dpro-template-form table.form-table td { padding: 2px; } #dpro-template-form table.form-table th { padding: 10px; } #dpro-template-form #dpro-notes-add { float: right; margin: -4px 2px 4px 0; } #dpro-template-form div.dpro-template-general { margin: 8px 0 10px 0; font-size: 14px; } #dpro-template-form div.dpro-template-general label { font-weight: bold } #dpro-template-form div.dpro-template-general input, textarea { width: 100% } #dpro-template-form b.dpro-hdr { display: block; font-size: 16px; margin: 3px 0 10px 0; padding: 3px 0 3px 0; border-bottom: 1px solid #dfdfdf } #dpro-template-form textarea, #dpro-template-form input[type="text"], #dpro-template-form input[type="password"] { width: 100% } .dup-archive-filters-icons { font-size: 13px; } .dup-archive-filters-icons>span { font-weight: normal; } /* TEMPLATE ARCHIVE*/ /*ARCHIVE: Area*/ .dup-archive-filters-wrapper div.tabs-panel { max-height: 800px; padding: 20px 15px 15px 15px; min-height: 300px } .dup-archive-filters-wrapper ul li.tabs { font-weight: bold } .dup-archive-filters-wrapper #archive-format { min-width: 100px; margin: 1px 0px 4px 0px } .dup-archive-filters-wrapper #dup-archive-filter-file { color: #A62426; display: none; } .dup-archive-filters-wrapper #dup-archive-filter-db { color: #A62426; display: none; } .dup-archive-filters-wrapper #dup-archive-db-only { color: #A62426; display: none; } .dup-archive-filters-wrapper #dup-archive-media-only { color: #a62426; display: none; } .dup-archive-filters-wrapper #dpro-install-secure-lock { color: #A62426; display: none; } /* Tab: Multisite */ .dup-archive-filters-wrapper .mu-mode td { padding: 10px } .dup-archive-filters-wrapper .mu-opts td { padding: 10px } .dup-archive-filters-wrapper .mu-selector { height: 175px !important; width: 450px; max-width: 450px } .dup-archive-filters-wrapper .mu-selector option { padding: 2px 0; } .dup-archive-filters-wrapper .mu-push-btn { padding: 5px; width: 40px; font-size: 14px } .dup-archive-filters-wrapper .filter-files-tab-content.tabs-panel { padding: 0; } .dup-archive-filters-wrapper .filter-links { font-weight: normal; } .dup-archive-filters-wrapper .filter-links a { margin-left: 5px; display: inline-block; } .dup-archive-filters-wrapper #filter-exts { resize: none; } div.dpro-template-general label.lbl-larger { padding-bottom: 5px; display: inline-block } label.lbl-larger { font-size: 15px !important; font-weight: bold; } div.dup-template-basic-tab { height: 200px; max-height: 600px !important } div.dup-template-cpanel-tab { height: 400px; max-height: 600px !important } div#dup-exportdb-items-checked, div#dup-exportdb-items-off { min-height: 550px; } div#dup-exportdb-items-checked { padding: 15px 5px 5px 0; max-width: 98% } textarea#_archive_filter_dirs { width: 100%; height: 165px; padding: 7px; } textarea#_archive_filter_files { width: 100%; height: 165px; padding: 7px; } input#_archive_filter_exts { width: 100% } div.dup-quick-links { font-size: 11px; display: inline-block; } table#dup-dbtables td { padding: 2px; vertical-align: top } ul#parsley-id-multiple-_database_filter_tables { display: none } /* TEMPLATE MULTISITE */ table.mu-mode td { padding: 10px } table.mu-opts td { padding: 10px } select.mu-selector { height: 175px !important; width: 450px; max-width: 450px } select.mu-selector option { padding: 2px 0; } button.mu-push-btn { padding: 5px; width: 40px; font-size: 14px } .filter-mu-tab-content.tabs-panel.disabled { position: relative; padding-top: 60px !important; } .filter-mu-tab-content.tabs-panel.disabled::after { content: " "; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(255, 255, 255, .6); z-index: 10; } .filter-mu-tab-content.tabs-panel .alert-disabled { position: absolute; top: 20px; left: 0; width: 100%; z-index: 20; color: maroon !important; } /* TEMPLATE INSTALLER */ table.dpro-install-setup { width: 100% } table.dpro-install-setup tr { vertical-align: top } ul.add-menu-item-tabs li, ul.category-tabs li { padding: 5px 30px; } div#dup-template-install-panel div.tabs-panel { min-height: 150px } div#dpro-pass-toggle { position: relative; margin: 8px 0 0 0; width: 243px } button.pass-toggle { height: 30px; width: 27px; position: absolute; top: 0px; right: 0px; border: 1px solid silver; border-radius: 0 4px 4px 0; cursor: pointer } /* ============================= RECOVERY POINT: Status Dialog */ div.dup-recover-dlg-title { font-size: 18px; padding: 0 0 5px 0; border-bottom: 1px solid #ddd; margin: -7px 0 0 0; } div.dup-recover-dlg-title i.fa-house-fire { display: inline-block; padding-right: 2px; vertical-align: middle; } div.dup-recover-dlg-subinfo { padding: 5px; } div.dup-recover-dlg-subinfo table td { padding: 1px 5px 1px 1px; font-size: 14px; } /*-------------------- Yellow Notice Area*/ .dup-recover-dlg-notice-box { overflow-y: scroll; border: 1px solid #ddd; border-radius: 2px; padding: 10px; margin: 5px 0 0 0; height: 294px; font-size: 14px; background-color: #FFFFF3; } .dup-recover-dlg-notice-box .title-area { margin: 0 0 5px 0; } .dup-recover-dlg-notice-box .title { border-bottom: 1px solid #ddd; padding: 0; margin: 0 0 5px 0; color: #000; font-weight: bold; } .dup-recover-dlg-notice-box .sub-title { font-weight: bold; } .dup-recover-dlg-notice-box .ovr-info { padding-bottom: 20px; font-size: 16px; } .dup-recover-dlg-notice-box a.whatsthis { font-size: 12px; font-weight: normal; font-style: italic; } .dup-recover-dlg-notice-box a { outline: none; box-shadow: none; } .dup-recover-dlg-notice-box div.req-data { font-size: 16px; } .dup-recover-dlg-notice-box div.req-data a.req-title { font-size: 16px; display: inline-block; padding: 5px 0 5px 10px; font-weight: bold; } .dup-recover-dlg-notice-box .req-info { display: none; font-size: 14px; border: 1px dashed #ddd; padding: 10px; border-radius: 3px; background: #fff; margin: 5px 0 10px 10px; } ul.req-info-list { margin: 5px 0 0 10px; } ul.req-info-list li { padding: 0; margin: 0; } .dup-recover-dlg-notice-box .req-status { padding: 10px 0 0 0; } .dup-recover-dlg-notice-box .req-notes { font-size: 14px; } .dup-recover-dlg-notice-box i.far.pass { color: darkgreen; font-size: 18px; } .dup-recover-dlg-notice-box i.far.fail { color: maroon; font-size: 18px; } .dup-template-recoveable-info.disabled { cursor: pointer; } .dup-recover-dlg-notice-box small.req-paths-data { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 510px; font-style: italic; } /*================================================ PARSLEY:Overrides*/ input.parsley-error, textarea.parsley-error, select.parsley-error { color: #B94A48 !important; background-color: #F2DEDE !important; border: 1px solid #EED3D7 !important; } ul.parsley-error-list { margin: 1px 0 -7px 0 } [data-dup-copy-value] { cursor: pointer; cursor: copy; } .duplicator-error-container { margin-top: 6px; color: #dd3d36; } .hidden, .js .closed .inside, .js .hide-if-js, .js .wp-core-ui .hide-if-js, .js.wp-core-ui .hide-if-js, .no-js .hide-if-no-js, .no-js .wp-core-ui .hide-if-no-js, .no-js.wp-core-ui .hide-if-no-js { display: none; } /* TESTS CHECKS */ .tests_result .test-check { display: inline-block; width: 60px; text-align: center; padding: 5px 0; border-radius: 5px; } .tests_result .test-check.fail { background: rgba(255, 0, 0, 0.3); } .tests_result .test-check.pass, .tests_result .test-check.info { background: rgba(0, 255, 0, 0.3); } .tests_result .test-check.warning, .tests_result .test-check.wait { background: rgba(255, 255, 0, 0.3); } .tests_result fieldset { border: 1px solid black; padding: 10px; margin-bottom: 10px; } #secure-on-parsely-error .parsley-errors-list { color: maroon; margin-top: 7px; } .parsley-custom-error-message, .parsley-required { margin: 4px; padding: 3px; border: 1px solid #B94A48; display: inline-block; border-radius: 2px; } /** Settings **/ #installer-name-mode-option { line-height: 25px; } #dup-pro-inst-mode-details { display: none; max-width: 825px; padding-left: 20px; line-height: 18px; } #dup-pro-inst-mode-details p { margin: 1em 0; } .dup-pro-recovery-widget-wrapper { font-size: 14px; } .dup-pro-recovery-widget-wrapper .button { margin-right: 10px; min-width: 190px; text-align: center; line-height: 35px; } #TB_ajaxContent .dup-pro-recovery-buttons { display: flex; } #TB_ajaxContent .dup-pro-recovery-buttons>* { flex: 1 1 100%; } .dup-pro-recovery-widget-wrapper .button:last-child { margin-right: 0; } .dup-pro-recovery-widget-wrapper .button:disabled, .dup-pro-recovery-widget-wrapper .button.disabled { pointer-events: none; cursor: not-allowed; } .dup-pro-recovery-details-max-width-wrapper { max-width: 900px; } .dup-pro-recovery-point-selector .recovery-select { width: 100%; max-width: 100%; box-sizing: border-box; margin: 0 0 10px 0; } .dup-pro-recovery-point-selector-area-wrapper { margin-bottom: 20px; } .dup-pro-recovery-widget-wrapper label { margin-bottom: 5px; display: block; } .dup-pro-recovery-point-selector-area-wrapper .dup-pro-opening-packages-windows { float: right; } .dup-pro-recovery-point-selector-area { text-align: right; } .dup-pro-recovery-package-detail-content { margin-top: 30px; } .dup-pro-recovery-package-small-icon i { font-size: 14px; position: relative; } .dup-pro-recovery-package-info table { border-collapse: collapse; } .dup-pro-recovery-package-info table td { padding: 0 5px 5px 0; } .dup-pro-recovery-active-link-header>.main-icon { display: block; width: 30px; height: 36px; color: #000; text-align: center; line-height: 36px; font-size: 23px; margin-right: 10px; float: left; } .dup-pro-recovery-active-link-header>.main-title { font-size: 16px; line-height: 1; font-weight: bold; } .dup-pro-recovery-active-link-header>.main-subtitle { font-style: italic; font-size: 12px; margin-top: 2px; } .dup-pro-recovery-point-actions>.copy-link { position: relative; white-space: nowrap; box-sizing: border-box; border: 1px solid silver; height: 30px; line-height: 30px; background: #fff; color: #000; padding: 0 35px 0 5px; border-radius: 2px; } .dup-pro-recovery-point-actions>.copy-link .content { width: 100%; overflow: hidden; text-overflow: ellipsis; } .dup-pro-recovery-point-actions>.copy-link .copy-icon { position: absolute; right: -1px; top: -1px; width: 30px; line-height: 30px; text-align: center; color: white; border-top-right-radius: 2px; border-bottom-right-radius: 2px; background-color: silver; } .dup-pro-recovery-point-actions>.copy-link.disabled { cursor: not-allowed; border: 1px solid silver !important; pointer-events: none; } .dup-pro-recovery-point-actions>.copy-link.disabled .copy-icon { background-color: silver !important; } .dup-pro-recovery-point-actions>.dup-pro-recovery-buttons { margin-top: 10px; text-align: right; } .notice .dup-pro-recovery-point-actions>.dup-pro-recovery-buttons { text-align: left; } .dup-pro-recovery-details-max-width-wrapper .dup-pro-recovery-buttons { text-align: right; } .toplevel_page_duplicator-pro .dup-pro-opening-packages-windows { display: none; } .dup-pro-recovery-not-required { margin-top: 10px; border: 1px solid #dedede; border-radius: 3px; padding: 15px; background: #edf5ed; } .dup-pro-new-feathures { border-collapse: collapse; margin-top: 20px; margin-bottom: 30px; } .dup-pro-new-feathures td { vertical-align: top; padding-bottom: 20px; } .dup-pro-new-feathures tbody tr:last-child td { padding-bottom: 0; } .dup-pro-new-feathures .icon i { font-size: 30px; margin: 2px 10px 0 10px; } .dup-pro-new-feathures ul { margin: 5px 0 0 10px; list-style: circle inside; } .dpro-admin-notice.dup-pro-quick-fix-notice { padding-left: 10px; } .dpro-admin-notice.dup-pro-quick-fix-notice .title { text-transform: uppercase; font-size: 14px; } .dpro-admin-notice.dup-pro-quick-fix-notice button.dup-pro-quick-fix { margin: 10px 10px 0 0; } .dpro-trace-log-link-green { color: green; } .dup-capabilities-selector-wrapper select { width: 500px; max-width: 100%; } .dup-capabilities-selector-wrapper .form-table th { width: 250px; } .unlmtd-lic-text { display: none; max-width: 500px; margin-top: 10px; } input.dup-license-key-input { margin: 0; width: 350px; } div.dup-license-status-notes { padding: 5px 0 0 20px; font-style: italic; color: #646970; line-height: 20px; } td.dup-license-type { line-height: 25px; } div.dup-license-type-info { padding: 3px 0 0 20px; } td.dup-license-key-area { line-height: 30px; } td.dup-license-key-area p.description { padding-left: 2px; } th.dup-license-key-btns { vertical-align: top; padding: 0px 10px 20px 0px; } td.dup-license-key-btns { vertical-align: top; padding: 0px 10px 0px 10px; } div.dup-license-key-btns { display: flex; flex-direction: row; gap: 10px; } div.scan-system-divider { padding: 10px 0 0 0; font-weight: bold; margin-bottom: 10px; border-bottom: 1px solid silver; } div.scan-system-subnote { padding: 2px 0 5px 0; } /*WIZARD TABS */ div#dup-wiz { padding: 0px; margin: 0; } div#dup-wiz-steps { margin: 0; padding: 0; clear: both; font-size: 13px; min-width: 390px; } div#dup-wiz-title { padding: 2px 0px 0px 0px; font-size: 14px; clear: both; display: none } #dup-wiz a { position: relative; display: block; width: auto; min-width: 90px; min-height: 22px; margin-right: 6px; padding: 1px 8px 1px 8px; float: left; line-height: 22px; color: #000; background: #E4E4E4; border-radius: 2px; border: 1px solid #999; text-align: center } #dup-wiz .active-step a { color: #fff; background: #A8A8A8; font-weight: bold; border: 1px solid #666; box-shadow: 3px 3px 3px 0 #999; letter-spacing: 0.05em; } #dup-wiz .completed-step a { color: #E1E1E1; background: #BBBBBB; border: 1px solid #BEBEBE; } /*Footer */ div.dup-button-footer input { min-width: 105px } div.dup-button-footer { padding: 1px 10px 0px 0px; text-align: right } /* ============================== STOREAGE POP-UP CSS */ .dup-dlg-store-remote { height: 350px; overflow-y: scroll; border: 1px dotted silver; padding: 0 10px 0 10px; background-color: #ffffff; } .dup-dlg-store-remote .dup-dlg-store-endpoint { margin-bottom: 16px; } .dup-dlg-store-remote .dup-dlg-store-endpoint:not(:last-child) { padding-bottom: 5px; border-bottom: 1px solid #ddd; } .dup-dlg-store-names { font-size: 16px; font-weight: bold; margin: 5px 0 2px 0; } h4.dup-dlg-store-names span { font-weight: normal; } .dup-dlg-store-log-link { display: block; margin: 6px 0 -10px 0; font-size: 12px; } .dup-dlg-store-remote .dup-dlg-store-test { margin: 0 0 6px 0; } .dup-dlg-store-remote .dup-dlg-store-test a { margin: 0 4px 0 0; } .dup-dlg-store-links, .dup-dlg-store-test { font-size: 13px; } .dup-dlg-store-endpoint.dup-dlg-store-endpoint-failed .dup-dlg-store-names, .dup-dlg-store-endpoint.dup-dlg-store-endpoint-cancelled .dup-dlg-store-names, .dup-dlg-store-endpoint.dup-dlg-store-endpoint-failed .dup-dlg-store-server, .dup-dlg-store-endpoint.dup-dlg-store-endpoint-cancelled .dup-dlg-store-server, .dup-dlg-store-endpoint.dup-dlg-store-endpoint-failed .dup-dlg-store-links, .dup-dlg-store-endpoint.dup-dlg-store-endpoint-cancelled .dup-dlg-store-links, .dup-dlg-store-endpoint.dup-dlg-store-package-not-found .dup-dlg-store-names, .dup-dlg-store-endpoint.dup-dlg-store-package-not-found .dup-dlg-store-server, .dup-dlg-store-endpoint.dup-dlg-store-package-not-found .dup-dlg-store-links { color: #A62426; } #TB_title { background-color: #e4e4e4 !important } #dup-db-tables-exclude-wrapper { border: 1px solid silver; position: relative; } #dup-db-tables-exclude { display: flex; flex-wrap: wrap; flex-direction: row; max-height: 400px; overflow: auto; padding: 5px; font-size: 13px; } #dup-db-tables-exclude>* { padding: 5px; flex: 0 1 25%; box-sizing: border-box; max-width: 400px; } .dup-form-item { display: flex; } .dup-form-item>.title { font-size: 14px; min-width: 125px; display: inline-block; font-weight: 600; padding: 6px 0 6px 0 } .dup-form-item>.input { font-size: 14px; display: inline-block; padding: 6px 0 6px 0 } .dup-form-horiz-opts>span { display: inline-block; padding-right: 20px } /* Tab: Database */ #dup-db-tables-exclude label.core-table { color: #9A1E26; font-style: italic; font-weight: bold } #dup-db-tables-exclude label.core-table.subcore-table-0 { color: #c12171; } #dup-db-tables-exclude label.core-table.subcore-table-1 { color: #c14421; } #dup-db-tables-exclude>*:hover { color: black; background-color: #DEDEDE; } #dup-db-filter-items { position: relative; margin-top: 5px; } #dup-db-filter-items.disabled { color: #999; position: relative; } .dup-db-filter-buttons { font-size: 17px; position: absolute; top: -24px; right: 0; } .dup-db-filter-buttons span { color: #777; } #dup-db-filter-items.disabled .dup-db-filter-buttons { display: none; } #dup-db-filter-items.disabled::after { content: ' '; display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; cursor: not-allowed; } #dup-db-filter-items.disabled input { opacity: 0.3; } #dup-db-filter-items .checked+span { text-decoration: line-through maroon; color: #777; } div#dup-db-filter-items-no-filters { position: absolute; top: 0; left: 0; width: 100%; height: 100%; font-size: 18px; color: #555; font-weight: bold; text-align: center; line-height: 35px; background-color: #f0f6fc; } div#dup-db-filter-items-no-filters>div { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .dup-pseudo-checkbox { display: inline-block; width: 16px; height: 16px; border: 1px solid black; position: relative; top: 2px; } .dup-pseudo-checkbox.disabled { border-color: silver; } .dup-pseudo-checkbox.checked::after { content: ""; display: inline-block; height: 6px; width: 8px; border-left: 2px solid; border-bottom: 2px solid; transform: rotate(-45deg); position: absolute; top: 2px; left: 3px; } .dup-pseudo-checkbox.disabled.checked::after { border-color: silver; } .dup-password-toggle { border-radius: 4px; border: 1px solid silver; display: flex; overflow: hidden; position: relative; } .dup-password-toggle .parsley-errors-list { display: block; position: absolute; top: 7px; left: 10px; z-index: 10; } .dup-password-toggle input { border: 0 none; margin: 0; flex-grow: 1; } .dup-password-toggle button { border: 0 none; margin: 0; } .dup-group-option-wrapper { width: 400px; height: 60px; display: flex; flex-direction: column; flex-wrap: wrap; align-content: start; } .dup-group-option-item { width: 200px; height: 20px; } .dup-btn-copy-error-message { margin: 10px 0 !important; } .dup-error-message-textarea { display: block; width: 100%; max-width: 500px; min-height: 150px; background-color: #e7e7e7 !important; color: #555555 !important; } /** Package Components **/ .dup-package-components { display: flex; min-height: 330px; flex-direction: row; border-bottom: 1px solid #dcdcde; } .dup-package-components .section-title { margin: 0; height: 20px; padding: 10px; background: #F0F0F1; font-size: 16px; font-weight: bold; display: flex; flex-direction: row; justify-content: space-between; } .dup-package-components .dup-radio-button-group-wrapper { border-top: 1px solid #dcdcde; border-bottom: 1px solid #dcdcde; } .dup-package-components .dup-radio-button-group-wrapper input[type="radio"]+label { border-color: #dcdcde; } .dup-package-components .db-only-message { display: none; padding: 40px 20px 20px; } .dup-package-components .component-section { flex: 1 1 33.33%; max-width: 500px; } .dup-package-components .component-section>label { margin-left: 15px; } .dup-package-components .component-section label.secondary { margin-left: 40px; } .dup-package-components .component-section .components-select { display: flex; flex-direction: row; flex-wrap: wrap; padding: 0px 0px 10px 15px; border-bottom: 1px solid #dcdcde; gap: 10px; } .dup-package-components .component-section label.disabled, .dup-package-components .component-section label.disabled input { pointer-events: none; color: gray; opacity: 0.7; } .dup-package-components .component-section label.disabled i { pointer-events: all; color: #4e4e4e; } .dup-archive-filters-wrapper #dup-upgrade-license-info { color: maroon; font-style: italic; } .dup-package-components .custom-components-select { margin-left: 10px; } .dup-package-components .filter-section { flex: 1 3 66.66%; border-left: 1px solid #dcdcde; } .dup-package-components .filter-section .filters { display: flex; flex-direction: column; } .dup-package-components .component-section { padding-bottom: 20px; } .dup-package-components .filter-section .filters { height: 100%; } .dup-package-components .filter-section textarea { border: none; border-radius: 0; } .dup-package-components .filter-section textarea[readonly] { background-image: linear-gradient(45deg, #f0f0f0 41.67%, #e0e0e0 41.67%, #e0e0e0 50%, #f0f0f0 50%, #f0f0f0 91.67%, #e0e0e0 91.67%, #e0e0e0 100%); background-size: 12px 12px; opacity: 0.7; } .dup-package-components .filter-section textarea#filter-paths { flex: 4 1 auto; } .dup-package-components .filter-section .section-title .filter-links { font-size: 12px; } .filter-files-tab-content .dup-tabs-opts-help { font-style: italic; font-size: 12px; margin: 0; color: #666; padding: 10px; } .dup-recovery-package-components-required .label { min-width: 80px; display: inline-block; } @media only screen and (max-width: 1150px) { .dup-package-components { flex-direction: column; } .dup-package-components .section-title { font-size: 14px; } .dup-package-components .filter-section { border-left: 0 none !important; } .dup-package-components .component-section { max-width: 100% } .dup-package-components .section-title { height: auto !important; } } .dup-mock-blur { filter: blur(4px); pointer-events: none; user-select: none; -moz-user-select: none; -khtml-user-select: none; -webkit-user-select: none; -o-user-select: none; } .dpro-edit-toolbar .button+.button, .dpro-edit-toolbar select+.button { margin-left: 5px; } .schedule-tbl td { height: 45px } .schedule-tbl a.name { font-weight: bold } .schedule-tbl input[type='checkbox'] { margin-left: 5px } .schedule-tbl div.sub-menu { margin: 5px 0 0 2px; display: none } .schedule-tbl div.sub-menu a:hover { text-decoration: underline } .schedule-detail { display: none; } .schedule-detail td { padding: 2px 2px 2px 15px; margin: -5px 0 2px 0; height: 22px } .dup-schedules-no-schedule { text-align: center; background: #fff; padding: 40px; line-height: 30px } .dup-schedule-edit-toolbar select { float: left } .schedule-package-tbl thead th { padding: 8px } .schedule-package-tbl tbody td { padding: 8px } .schedule-package-tbl .package-row label:hover { font-weight: bold; } .ui-datepicker-trigger { border: none; background: none; } #repeat-daily-area { display: none } #repeat-weekly-area { display: none; width: 480px; height: 78px; padding-left: 5px; margin-left: -5px; } #repeat-monthly-area { display: none } #repeat-weekly-area table td { padding-left: 0px; } .repeater-area { margin: 3px 0 0 3px; line-height: 35px; min-height: 42px } .schedule-template td { vertical-align: top; padding: 0; } .schedule-template .dup-recovery-template { padding: 7px 20px; } #schedule-name, #schedule-template { width: 350px } #schedule-template { margin-left: -1px } .weekday-div { float: left; margin-right: 15px; width: 105px; } a.pack-temp-btns { margin-top: 2px !important; font-size: 12px !important; line-height: 24px !important; height: 26px !important; } #schedule-template-selector, .schedule-template .pack-temp-btns { margin-right: 5px; } /*Detail Tables */ .package-row.storage-missing td, .package-row.storage-missing td a { color: #A62426 !important } .storage-tbl td { height: 45px } .storage-tbl a.name { font-weight: bold } .dup-storage-icon { vertical-align: middle; width: 16px; } .storage-tbl input[type='checkbox'] { margin-left: 5px } .storage-tbl div.sub-menu { margin: 5px 0 0 2px; display: none } .storage-tbl tr.storage-detail { display: none; margin: 0; } .storage-tbl tr.storage-detail td { padding: 3px 0 5px 20px } .storage-tbl tr.storage-detail div { line-height: 20px; padding: 2px 2px 2px 15px } .storage-tbl tr.storage-detail td button { margin: 5px 0 5px 0 !important; display: block } .storage-tbl tr.storage-detail label { min-width: 150px; display: inline-block; font-weight: bold } div.dpro-dlg-confirm-txt div.store-items { margin-top: 10px !important } div.dpro-dlg-confirm-txt div.store-items div.item { font-size: 13px; margin-bottom: 10px; } div.dpro-dlg-confirm-txt div.store-items div.item:last-child { margin-bottom: 0; } div.dpro-dlg-confirm-txt div.store-items span.lbl { display: inline-block; width: 50px; font-weight: bold } div.dpro-dlg-confirm-txt div.store-items div.icon { float: left; padding: 5px 10px 0 0 } div.dpro-dlg-confirm-txt div.store-items, div.dpro-dlg-confirm-txt div.schedule-progress { padding: 10px; border: 1px dotted silver; overflow-y: scroll; height: 120px; margin: 5px 0 0 0; background: #FFFFF3 } div.dpro-dlg-confirm-txt div.schedule-area { padding: 15px 0 0 0 } div.dpro-dlg-confirm-txt div.schedule-item { padding: 5px } #dup-storage-form .dpro-edit-toolbar select { float: left } #dup-storage-form input[type="text"], #dup-storage-form input[type="password"] { width: 250px; } #dup-storage-form input#name { width: 100%; max-width: 500px } #dup-storage-form #ftp_timeout { width: 100px !important } #dup-storage-form input#_local_storage_folder, input#_ftp_storage_folder { width: 100% !important; max-width: 500px } #dup-storage-form .provider { display: none; } #dup-storage-form .stage { display: none; } #dup-storage-form .dpro-sub-title { padding: 0; margin: 0 } #dup-storage-form .dpro-sub-title b { padding: 20px 0; margin: 0; display: block; font-size: 1.25em; } #dup-storage-form .dpro-storeage-folder-path { width: 450px !important } #dup-storage-form .dpro-store-type-notice { font-size: 12px !important; line-height: 18px; color: maroon } /* --------------- Common */ #dup-storage-form .dup-form-sub-area select, #dup-storage-form .dup-form-sub-area input[type="text"], #dup-storage-form .dup-form-sub-area input[type="password"] { min-width: 300px } #dup-storage-form .s3_max_files, #dropbox_max_files, #ftp_max_files, #local_max_files, #gdrive_max_files, #onedrive_msgraph_max_files { width: 50px !important } #dup-storage-form .dup-form-sub-area td { padding: 2px } #dup-storage-form .dup-form-sub-area th { width: 150px; border: 0 solid red; padding: 10px } #dup-storage-form .form-table .dup-storage-icon { vertical-align: middle; margin: 0 2px 0 0; width: 30px; } #dup-storage-form .form-table #dup-storage-mode-fixed .dup-storage-icon { width: 25px; } #dup-storage-form .invisible_out_of_screen { visibility: hidden; position: absolute; left: -999em; } #dup-storage-form .account-heading-info { color: #777; font-weight: bold; font-size: 0.8em; } /* --------------- Amazon */ #dup-storage-form .dup-s3-auth-account { line-height: 25px; padding-top: 0px !important; } #dup-storage-form .dup-s3-auth-account select { min-width: 350px } #dup-storage-form .dup-s3-auth-provider select, #dup-storage-form .dup-s3-auth-provider input[type="text"] { min-width: 400px } /* --------------- Dropbox*/ #dup-storage-form .dropbox-authorize { line-height: 25px; padding-top: 0px !important; } #dup-storage-form #dropbox-account-info label { display: inline-block; width: 100px; font-weight: bold } #dup-storage-form #dpro-dropbox-connect-btn { margin: 10px 0 } #dup-storage-form .auth-code-popup-note { width: 525px; font-size: 11px; padding: 0; margin: -5px 0 10px 10px; line-height: 16px; font-style: italic } /* --------------- Google Drive */ #dup-storage-form .gdrive-authorize { line-height: 25px; margin-top: -10px; padding-top: 0; } #dup-storage-form #dpro-gdrive-steps { display: none } #dup-storage-form #dpro-gdrive-steps div { margin: 0 0 20px 0 } #dup-storage-form #dpro-gdrive-connect-progress { display: none } #dup-storage-form #gdrive-state-authorized label { display: inline-block; width: 100px; font-weight: bold } /* --------------- OneDrive */ #dup-storage-form .onedrive-authorize { line-height: 25px; margin-top: -10px; padding-top: 0; } #dup-storage-form #onedrive-account-info label { display: inline-block; width: 75px; font-weight: bold } /* For switch */ #dup-storage-form .switch { position: relative; display: inline-block; width: 44px; height: 20px; } #dup-storage-form .switch input { opacity: 0; width: 0; height: 0; } #dup-storage-form .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } #dup-storage-form .slider:before { position: absolute; content: ""; height: 16px; width: 16px; left: 4px; bottom: 2px; background-color: white; -webkit-transition: .4s; transition: .4s; } #dup-storage-form input:checked+.slider { background-color: #2196F3; } #dup-storage-form input:focus+.slider { box-shadow: 0 0 1px #2196F3; } #dup-storage-form input:checked+.slider:before { -webkit-transform: translateX(19px); -ms-transform: translateX(19px); transform: translateX(19px); } /* Rounded sliders */ #dup-storage-form .slider.round { border-radius: 20px; } #dup-storage-form .slider.round:before { border-radius: 50%; } .dup-header { display: flex; justify-content: space-between; align-items: center; width: calc(100% - 25px); border-top: 3px solid #fe4716; padding: 20px; padding-left: 25px; padding-bottom: 0px; position: relative; left: -20px; } .duplicator-pro-help-open { border-radius: 100%; width: 40px; height: 40px; border-color: transparent; background: #c8c8c8; cursor: pointer; } .duplicator-pro-help-open .fa-question-circle { color: #535252; font-size: 23px; } #dup-notice-bar+#dup-meta-screen { top: 34px } .duplicator-page #screen-meta { margin: 0 20px -1px 20px; } #dup-meta-screen { margin: 0; position: absolute; top: -1px; left: 20px; right: 20px; z-index: 99; } .duplicator-page #screen-meta-links { position: absolute; display: none; right: 50px; top: auto; margin: 0; float: none; } @media screen and (max-width: 782px) { .dup-header { padding: 20px 10px !important; } #dup-basic-auth-login-wrapper { flex-direction: column; } } @media only screen and (max-width: 600px) { .dup-header { top: 45px; } } .admin_page_duplicator-pro-import-installer .dup-header { display: none; } #dup-basic-auth-login-wrapper { display: flex; justify-content: space-between; width: 550px; gap: 10px; margin-top: 10px; } #dup-basic-auth-login-wrapper>* { flex-grow: 1; } #dup-basic-auth-login-wrapper input { border-color: silver; } #dup-basic-auth-login-wrapper input:disabled { background-color: #f0f0f0; } /** Remote Package Download **/ #dup-remote-package-download form p { font-size: 16px; margin: 0 0 20px 0; padding: 0; } #dup-remote-package-download .dup-buttons-container { float: right; } #dup-remote-package-download .dup-buttons-container button { margin-left: 10px; min-width: 100px; height: 30px; line-height: 30px; } .dup-remote-storage-options { display: flex; flex-direction: column; padding: 0 20px; margin-bottom: 20px; gap: 10px; max-height: 200px; overflow-y: auto; height: 75px; } .dup-download-progress { display: flex; width: 700px; height: 400px; margin: 0 auto; flex-direction: column; justify-content: center; } .dup-download-progress .dup-build-msg, .dup-download-progress .dup-progress-bar-area { border: none; box-shadow: none; } .dup-download-progress .dup-progress-bar-area{ padding: 0; margin: 30px auto 20px auto; } assets/css/index.php000064400000000020147600374260010457 0ustar00 * { padding-right: 5px; } .dup-dashboard-widget-content .dup-flex-content > *:last-child { padding-right: 0; }assets/css/style-ctrl.css000064400000007153147600374260011471 0ustar00/** * This sytle sheet is used in combination with the Duplicator.UI.Ctrl control namespace * */ /* ================================================ * UI-CTRL: Spinner * ============================================= */ div.dup-spinner { display: flex; align-items: center; flex-wrap: wrap; background-color: #fff; padding:0; } .dup-spinner > div.area-right, .dup-spinner > div.area-left { display:flex; justify-content: center; align-items: center; font-size: 30px; margin: auto; border-radius:5px; border:1px solid transparent; height:88%; width:50px; color:#999; } .dup-spinner > div.area-right:hover, .dup-spinner > div.area-left:hover { background-color: #f1f1f1; cursor: pointer; color:#000; border:1px solid silver; } .dup-spinner > div.area-data { height:88%; box-shadow: 0px 5px 10px 0px rgba(161,161,161,1); border-radius: 4px; border:1px solid silver; margin:0 10px 0 10px; padding:10px 15px 15px 15px; flex:70%; } .dup-spinner > div.area-data > div.item { display: none; border:1px solid transparent; width:100%; height: 100%; border:0 solid blue; border-radius: 2px; margin: auto; } .dup-spinner > div.area-nav { flex: 0 0 100%; min-height:10%; text-align: center; padding: 10px 0 0 0; width:100%; } .dup-spinner > div.area-nav .num { padding-right:10px; } .dup-spinner > div.area-data > div.item.active { display:block; } /*DEBUG LAYOUT: Do not remove used to see layout div.dup-spinner { border:1px dashed black;} div.dup-spinner div.area-right, div.dup-spinner div.area-left {border:1px solid green} div.dup-spinner div.area-data {border:1px solid blue} div.dup-spinner div.area-data .item {border:1px dashed purple} div.dup-spinner div.area-nav {border:1px solid red;} */ /* ================================================ * UI-CTRL: Vert tabs * ============================================= */ div.dup-tabs-vert { display:flex; border:0 dashed silver; } div.dup-tabs-vert > div.data-tabs { flex:0 0 35%; border:0 dashed red; } div.dup-tabs-vert > div.data-tabs > div.tab { padding:7px 0 7px 3px; background-color: #F5F5F5; cursor: pointer; } div.dup-tabs-vert > div.data-tabs > div.void { background: #444; color:#fff; padding: 4px 0 4px 3px; font-weight: bold; } div.dup-tabs-vert > div.data-tabs > div.void i { font-weight: normal; } div.dup-tabs-vert > div.data-tabs > div.tab:hover { background-color: #efefef; } div.dup-tabs-vert > div.data-tabs > div.tab.active { border-left:4px solid #91BCE3; background-color: #fff; color:#2271b1; font-weight: bold; } div.dup-tabs-vert > div.data-panels > div.panel { display:none; } div.dup-tabs-vert > div.data-panels { flex:0 0 62%; border-top:1px solid silver; padding:8px; border-radius: 2px } /* ================================================ * UI-CTRL: Flat tabs * ============================================= */ div.dup-tabs-flat { margin:5px 0 0 0; height:425px; } div.dup-tabs-flat > div.data-tabs { border-bottom: 1px solid #E0E0E0; } div.dup-tabs-flat > div.data-tabs > a { text-decoration: none; display:inline-block; min-width:200px; outline: none; box-shadow: none; margin:0 15px 0 0; } div.dup-tabs-flat > div.data-tabs > a.active { border-bottom:3px solid #91BCE3; font-weight: bold; } div.dup-tabs-flat > div.data-panels > div.panel { padding:20px 10px 10px 10px; clear:both; } div.dup-tabs-flat > div.data-panels > div.panel { display: none; }assets/css/admin-notifications.css000064400000011644147600374260013326 0ustar00#dup-notifications { position: relative; background: #ffffff 0 0 no-repeat padding-box; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); border-radius: 6px; opacity: 1; min-height: 48px; margin: 10px 0 20px 0; } #dup-notifications * { box-sizing: border-box; } #dup-notifications .dup-notifications-header { display: flex; align-items: center; padding: 10px 16px; border-bottom: 1px solid rgba(204, 208, 212, 0.5); } #dup-notifications .dup-notifications-header .dup-notifications-bell { position: relative; width: 16px; height: 20px; top: 3px; margin-right: 10px; } #dup-notifications .dup-notifications-header .dup-notifications-circle { position: absolute; width: 11px; height: 11px; border-radius: 50%; top: -4px; right: -1px; border: 2px solid #ffffff; } #dup-notifications .dup-notifications-header .dup-notifications-title { font-style: normal; font-weight: 500; font-size: 14px; line-height: 17px; color: #23282d; } #dup-notifications .dup-notifications-body { position: relative; } #dup-notifications .dup-notifications-messages { padding: 16px 100px 16px 16px; } #dup-notifications .dup-notifications-messages .dup-notifications-message { display: none; } #dup-notifications .dup-notifications-messages .dup-notifications-message.current { display: block; } #dup-notifications .dup-notifications-messages .dup-notifications-title { color: #444444; font-size: 17px; font-weight: 600; line-height: 17px; margin: 0 0 -2px 0; min-height: 19px; } #dup-notifications .dup-notifications-messages .dup-notifications-content { font-weight: normal; font-size: 14px; line-height: 18px; margin: 8px 0 20px 0; color: #777777; } #dup-notifications .dup-notifications-messages .dup-notifications-content p { font-size: inherit; line-height: inherit; margin: 0 0 5px; } #dup-notifications .dup-notifications-messages .dup-notifications-buttons { margin: -30px 80px 0 0; } #dup-notifications .dup-notifications-messages .dup-notifications-buttons a { margin: 0 10px 0 0; min-height: unset; } #dup-notifications .dup-notifications-badge { background-color: #f6f7f7; border-radius: 3px; color: #2c3338; cursor: pointer; font-size: 11px; margin-left: 10px; padding: 6px 8px; position: relative; text-decoration: none; text-transform: uppercase; top: -1px; white-space: nowrap; } #dup-notifications .dup-notifications-badge:focus, #dup-notifications .dup-notifications-badge:hover { background-color: #f0f0f1; box-shadow: none; color: initial; } #dup-notifications .dup-notifications-badge .fa { color: black; padding-right: 6px; position: relative; } #dup-notifications .dismiss { position: absolute; top: 15px; right: 16px; width: 16px; height: 16px; color: #a7aaad; font-size: 16px; cursor: pointer; text-align: center; vertical-align: middle; line-height: 16px; } #dup-notifications .dismiss:hover { color: #dc3232; } #dup-notifications .navigation { position: absolute; bottom: 20px; right: 16px; width: 63px; height: 30px; } #dup-notifications .navigation a { display: block; width: 30px; height: 30px; border: 1px solid #7e8993; border-radius: 3px; font-size: 16px; line-height: 1.625; text-align: center; cursor: pointer; background-color: #ffffff; color: #41454a; } #dup-notifications .navigation a:hover { background-color: #f1f1f1; } #dup-notifications .navigation .prev { float: left; } #dup-notifications .navigation .next { float: right; } #dup-notifications .navigation .disabled { border-color: #dddddd; color: #a0a5aa; cursor: default; } #dup-notifications .navigation .disabled:hover { background-color: #ffffff; } .dup-notifications-message .button { margin: 0 10px 0 0; } .lity-iframe .lity-content { margin: 0 auto; } @media screen and (max-width: 768px) { #dup-notifications .dup-notifications-messages { padding: 15px 50px 20px 16px; } #dup-notifications .dup-notifications-messages .dup-notifications-message .dup-notifications-title { line-height: 22px; margin: 0 30px -2px 0; min-height: 24px; } #dup-notifications .dup-notifications-messages .dup-notifications-message .dup-notifications-content { font-size: 16px; line-height: 22px; } #dup-notifications .dup-notifications-messages .dup-notifications-message .dup-notifications-buttons { margin: -30px 80px 0 0; } #dup-notifications .dup-notifications-messages .dup-notifications-message .dup-notifications-buttons a { margin: 0; display: table; } #dup-notifications .dup-notifications-messages .dup-notifications-message .dup-notifications-buttons .button-secondary { margin-top: 6px; } } assets/css/jquery-ui.css000064400000044275147600374260011327 0ustar00/*! jQuery UI - v1.11.2 - 2014-12-20 * http://jqueryui.com * Includes: core.css, progressbar.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Verdana%2CArial%2Csans-serif&fwDefault=normal&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=cccccc&bgTextureHeader=highlight_soft&bgImgOpacityHeader=75&borderColorHeader=aaaaaa&fcHeader=222222&iconColorHeader=222222&bgColorContent=ffffff&bgTextureContent=flat&bgImgOpacityContent=75&borderColorContent=aaaaaa&fcContent=222222&iconColorContent=222222&bgColorDefault=e6e6e6&bgTextureDefault=glass&bgImgOpacityDefault=75&borderColorDefault=d3d3d3&fcDefault=555555&iconColorDefault=888888&bgColorHover=dadada&bgTextureHover=glass&bgImgOpacityHover=75&borderColorHover=999999&fcHover=212121&iconColorHover=454545&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=aaaaaa&fcActive=212121&iconColorActive=454545&bgColorHighlight=fbf9ee&bgTextureHighlight=glass&bgImgOpacityHighlight=55&borderColorHighlight=fcefa1&fcHighlight=363636&iconColorHighlight=2e83ff&bgColorError=fef1ec&bgTextureError=glass&bgImgOpacityError=95&borderColorError=cd0a0a&fcError=cd0a0a&iconColorError=cd0a0a&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=aaaaaa&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=8px&offsetTopShadow=-8px&offsetLeftShadow=-8px&cornerRadiusShadow=8px * Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ .ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-widget{font-family:Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #aaa;background:#fff url("images/ui-bg_flat_75_ffffff_40x100.png") 50% 50% repeat-x;color:#222}.ui-widget-content a{color:#222}.ui-widget-header{border:1px solid #aaa;background:#ccc url("images/ui-bg_highlight-soft_75_cccccc_1x100.png") 50% 50% repeat-x;color:#222;font-weight:bold}.ui-widget-header a{color:#222}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #d3d3d3;background:#e6e6e6 url("images/ui-bg_glass_75_e6e6e6_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#555}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#555;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #999;background:#dadada url("images/ui-bg_glass_75_dadada_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#212121;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #aaa;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:normal;color:#212121}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#212121;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fcefa1;background:#fbf9ee url("images/ui-bg_glass_55_fbf9ee_1x400.png") 50% 50% repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#fef1ec url("images/ui-bg_glass_95_fef1ec_1x400.png") 50% 50% repeat-x;color:#cd0a0a}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#cd0a0a}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#cd0a0a}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_888888_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_454545_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_2e83ff_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_cd0a0a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30)}.ui-widget-shadow{margin:-8px 0 0 -8px;padding:8px;background:#aaa url("images/ui-bg_flat_0_aaaaaa_40x100.png") 50% 50% repeat-x;opacity:.3;filter:Alpha(Opacity=30);border-radius:8px}assets/css/import.css000064400000031531147600374260010676 0ustar00/*! ================================================ * DUPLICATOR IMPORT STYLE * Copyright:Snap Creek LLC 2015-2021 * ================================================ */ /* ====================================================================================================================== COMMON/SHARED DOM ELEMENTS ====================================================================================================================== */ .dup-pro-import-header { position: relative; margin-bottom: 20px; margin-top: 10px; } .dup-pro-import-header .title { margin: 0; line-height: 40px; font-size:20px; } .dup-pro-import-header .options { position: absolute; right: 0; top: 2px; z-index: 10000; } .dup-pro-import-header hr { margin: 0; } .dup-pro-import-header .options .button { width: 34px; height: 34px; box-sizing: border-box; line-height: 34px; text-align: center; padding: 0; } /* ====================================================================================================================== STEP 1 - DOM ELEMENTS ====================================================================================================================== */ /* ----------------------------- MENU - DROP-DOWN HAMBURGER ----------------------------- */ .dup-pro-import-view-list, .dup-pro-import-view-single { position: relative; } .dup-pro-import-view-list.active::before, .dup-pro-import-view-single.active::before { content: "\f147"; font-family: dashicons; display: inline-block; line-height: 1; font-weight: 400; font-style: normal; width: 20px; height: 20px; font-size: 20px; position: absolute; top: 50%; left: -30px; } .dup-pro-toggle-sub-menu, .dup-pro-toggle-sub-menu ul, .dup-pro-toggle-sub-menu li { margin: 0; } .dup-pro-toggle-sub-menu .title { color: #666666; font-weight: bold; } .dup-pro-toggle-sub-menu .separator { border-top: 1px solid #ccd0d4; } .dup-pro-toggle-sub-menu .dup-pro-toggle { display: inline-block; width: 100%; box-sizing: border-box; text-align: right; } .dup-pro-toggle-sub-menu ul { display: none; position: relative; opacity: 0; border: 1px solid #ccd0d4; z-index: -1; background: #FEFEFE; transition: opacity 0.3s; padding-bottom: 20px; } .dup-pro-toggle-sub-menu:hover ul { display: block; opacity: 1; z-index: 10001; } .dup-pro-toggle-sub-menu ul li { padding: 10px 10px 10px 40px; } .dup-pro-toggle-sub-menu ul li.title { padding: 10px 10px 0 10px; } #dup-pro-import-vews-and-opt-wrapper .description { display: block; color: #666666; font-style: italic; } #dup-pro-import-vews-and-opt-wrapper { width: 250px; } /* ----------------------------- DRAG-DROP UPLOAD AREA ----------------------------- */ .dup-pro-import-upload-box { background: #fff; border: 3px dashed #607d8b; border-radius: 2px; height: 220px; box-sizing: border-box; position: relative; text-align: center; font-size: 14px; } #dup-pro-import-upload-file .fs-upload-target { border: 0 none; border-radius: 0; height: 214px; box-sizing: border-box; } #dup-pro-import-upload-file .fs-upload-target { display: flex; align-items: center; justify-content: center; } #dup-pro-import-upload-file-footer { padding: 5px; text-align: right; } #dup-pro-import-upload-file-footer .dup-pro-open-help-link { letter-spacing: 2px; float: right; } /* ----------------------------- ARCHIVE DISPLAY RESULTS: Basic/Advanced ----------------------------- */ .dup-drag-drop-message { font-size: 18px; font-weight: bold; display: block; margin: 20px 0; } #dup-pro-import-mode-tab-header { border-bottom: 1px solid silver; } #dup-pro-import-mode-tab-header > div { float: left; padding:10px 0 15px 0; font-size: 16px; border-bottom: 2px solid transparent; min-width: 250px; text-align: center; cursor: pointer; } #dup-pro-import-mode-tab-header > div:hover { font-weight: bold; } #dup-pro-import-mode-tab-header > div.active { border-bottom: 3px solid #91BCE3; font-weight: bold; } #dup-pro-import-remote-url { box-sizing: border-box; height: 40px; width: 1000px; max-width: calc(100% - 150px); margin-right: 10px; } .dup-pro-import-upload-box > div { width: 100%; } .dup-pro-import-upload-box .dup-import-button { display: inline-block; padding: 0 30px !important; font-weight: normal; box-sizing: border-box; height: 40px; } #dup-pro-import-mode-remote-tab sup { font-size:10px; color:#999; } div.dup-pro-import-upload-box small { color:#999; font-style: italic; padding: 7px; } .dup-import-avail-packs .dup-pro-import-no-package-found td { padding: 20px; } div.dup-pro-import-no-package-found-msg { font-size: 15px; text-align: center; } table.dup-import-avail-packs th { background-color: #e2e2e2; } table.dup-import-avail-packs tbody tr:nth-child(even) { border: 1px solid #e2e2e2; } table.dup-import-avail-packs { width: 100%; min-height: inherit; border: 1px solid #ccd0d4; border-collapse: collapse; } table.dup-import-avail-packs thead { border-bottom: 1px solid #ccd0d4; } table.dup-import-avail-packs th { font-weight: bold; } table.dup-import-avail-packs th, table.dup-import-avail-packs td { padding: 10px; text-align: left; vertical-align: top; line-height: 30px; } table.dup-import-avail-packs .size { width: 100px; } table.dup-import-avail-packs .created { text-align: left; width: 125px; } table.dup-import-avail-packs .funcs { text-align: center; width: 400px; box-sizing: border-box; white-space: nowrap; } table.dup-import-avail-packs .funcs button, table.dup-import-avail-packs .funcs .button { min-width: 120px; } table.dup-import-avail-packs .funcs .separator { margin-left: 5px; } table.dup-import-avail-packs .funcs .separator-2x { margin-left: 10px; } table.dup-import-avail-packs .funcs .dup-pro-loader { display: flex; } table.dup-import-avail-packs .funcs div.actions { text-align: right; } table.dup-import-avail-packs .funcs .dup-pro-import-action-cancel-upload { margin-left: 10px; } .dup-pro-import-package-detail { padding: 10px; border-radius: 2px; margin: 10px 0; line-height: 1.6; } .dup-pro-import-package-detail-content *:first-child { margin-top: 0; } .dup-pro-import-package-detail-content *:last-child { margin-bottom: 0; } .dup-pro-import-package-detail ul { margin: 0; } .dup-pro-import-package-detail ul li { margin: 2px; padding: 0; } .dup-pro-import-package-detail .label.title { font-weight: bold; font-size: 16px; width: 100%; margin-top: 10px; } .dup-pro-import-package-detail .label { display: inline-block; min-width: 150px; } .dup-pro-import-package-detail .value { font-weight: bold; } div#dpro-pro-import-available-packages { background-color: #fff; } #dpro-pro-import-available-packages.view-single-item .packages-list tbody { display: block; padding: 20px; } #dpro-pro-import-available-packages.view-single-item .packages-list thead, #dpro-pro-import-available-packages.view-single-item .packages-list tbody tr { display: none; } #dpro-pro-import-available-packages.view-single-item .packages-list tbody tr:first-child { display: block; } #dpro-pro-import-available-packages.view-single-item .packages-list td { display: block; width: 100%; padding: 0; } #dpro-pro-import-available-packages.view-single-item .packages-list .dup-pro-import-package-detail { display: block !important; background: transparent; margin: 0; padding: 0; } #dpro-pro-import-available-packages.view-single-item .packages-list .name::before { content: "Package: "; font-weight: bold; margin: 0 5px 10px 0; display: inline-block; } #dpro-pro-import-available-packages.view-single-item .packages-list .size, #dpro-pro-import-available-packages.view-single-item .packages-list .created, #dpro-pro-import-available-packages.view-single-item .packages-list .dup-pro-import-action-package-detail-toggle { display: none; } @media only screen and (max-width: 1200px) { #dpro-pro-import-available-packages.view-list-item .size, #dpro-pro-import-available-packages.view-list-item .created, #dpro-pro-import-available-packages.view-list-item thead .funcs { display: none; } #dpro-pro-import-available-packages.view-list-item td { display: block; text-align: left !important; padding: 0 20px; } #dpro-pro-import-available-packages.view-list-item tbody tr { border-bottom: 1px solid #ccd0d4; padding-bottom: 10px; display: block; } } .dup-pro-import-confirm-buttons { padding: 10px; text-align: right; } .dup-pro-import-confirm-buttons input { margin-left: 5px !important; } /* ====================================================================================================================== STEP 2 - DOM ELEMENTS ======================================================================================================================*/ .dup-pro-import-box { background-color: #fff; border: 1px solid #e5e5e5; margin: 0; } .dup-pro-import-box .box-title { border-bottom: 1px solid #e5e5e5; padding: 10px 12px; font-weight: bold; font-size: 17px; font-weight: bold; color: #000; } .dup-pro-import-box .box-content { padding: 20px; } .dup-pro-import-box.closable .box-title { position: relative; } .dup-pro-import-box.closable .box-title::after { content: ""; position: absolute; top: 0; right: 0; line-height: 36px; display: inline-block; width: 36px; text-align: center; font-family: "Font Awesome 5 Free"; content: ""; font-weight: 900; } .dup-pro-import-box.closable.closed .box-title { border: 0 none; } .dup-pro-import-box.closable.closed .box-title::after { content: "\f0d7"; } .dup-pro-import-box.closable.opened .box-title::after { content: "\f0d8"; } .dup-pro-import-box.closable.closed .box-content { display: none; } .dup-pro-import-box.closable.opened .box-content { display: block; } #dup-pro-import-view-types { position: absolute; top: -5px; right: 0; } div.dup-pro-recovery-point-selector .dup-pro-notice { margin: 0; font-size: 16px; } div.dup-pro-recovery-point-selector div.dup-pro-notice-details { margin: 20px; font-size: 16px; font-style: italic; } /* ====================================================================================================================== STEP 3 - STAND-ALONE INSTALLER DOM ELEMENTS ======================================================================================================================*/ #dup-pro-import-installer-modal { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; z-index: 2; background-color: rgba(255, 255, 255, .6); z-index: 1000002; } #dpro-pro-import-installer-iframe { width: 100%; min-height: 300px; position: relative; z-index: 1000003; } /* Making sure the WP menu is not under the import screen */ #wpadminbar, #wpadminbar .ab-sub-wrapper, #wpadminbar ul, #wpadminbar ul li { z-index: 1000004; } .dup-pro-import-installer-launch-confirm-content, .dup-pro-import-installer-launch-confirm-content p { font-size: 13px; } .dup-pro-import-installer-launch-confirm-content .dup-pro-notice { font-color: #666; font-style: italic; } .dup-pro-import-installer-launch-confirm-content .dup-pro-recovery-info-set { border: 1px solid lightgray; padding: 5px; border-radius: 5px; background: #FAFAFA; } .dup-pro-import-installer-launch-confirm-content .dup-pro-recovery-info-set .dup-pro-selector-wrapper { text-align: right; } .dup-pro-import-installer-launch-confirm-content .dup-pro-recovery-info-set select { margin: 0 0 5px 0; } .admin_page_duplicator-pro-import-installer .wpcontent { position: relative; } .admin_page_duplicator-pro-import-installer #wpfooter { display: none; } .admin_page_duplicator-pro-import-installer:not(.dup-actions-error) #wpbody-content>* { display: none; } #dpro-pro-import-installer-wrapper { position: absolute; top: 0; left: 0; width: 100%; display: flex !important; flex-flow: column; z-index: 1000000; } .admin_page_duplicator-pro-import-installer #adminmenuwrap, #dpro-pro-import-installer-wrapper { height: calc(100vh - 32px); overflow: hidden; } @media only screen and (max-width: 782px) { .admin_page_duplicator-pro-import-installer #adminmenuwrap, #dpro-pro-import-installer-wrapper { height: calc(100vh - 46px); } } #dpro-pro-import-installer-iframe { flex: 1 1 auto; } #dpro-pro-import-installer-top-bar { padding: 20px 0; } assets/img/onedrive.svg000064400000002131147600374260011164 0ustar00OfficeCore10_32x_24x_20x_16x_01-22-2019assets/img/logo-black.svg000064400000012334147600374260011371 0ustar00 assets/img/backblaze.svg000064400000006742147600374260011303 0ustar00 assets/img/logo256x256.png000064400000072335147600374260011175 0ustar00‰PNG  IHDR\r¨fgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<bKGDÿÿÿ ½§“tIMEã%Îs¦ÖsYIDATxÚí}y|g}þó꥕d]–lËgrl Ž$–)@ípJá‡ÝBâÄ8¶s‡„ØÎELBìÄ5MK[m ”–qÊUJ‹G¯sǧlK¾$Yc»ÚkÞßïûμ3;³»²¥Ùµ¼?kíœ;ïÌ<ßëý¾ß(¢ˆ"Š(¢ˆ"Š(¢ˆ"Š(¢ˆ"Š(¢ˆ"¦5H¾/ ƒm –X  ƒ¯¾¤¾wšïk;…¶l x@w}ïžž|_Sé( €R§»Áãm Ö7˜+ÀMÿ±üüȆSÉœŽiöé–PµÇ‹kꛋ‚À%äú.1PJ;@)@)(¥ €é“+€žñ1ìŽòsQJ×kÌw¤xfú‡GOžòù†SIÄ5M^Èw§3Š` @hüä4ÿuŸ@LÓtË‚2s»P ›þ2šþ§ˆ`¾8QS †0’J¦Yý$4 Ïž@ðHëüõùnçé˜þEŠ` [“!€ƒãŽëçÕ€u}ytxÚ²nú÷'âx~xhRÎÝŸˆå«YgŠ` @‹åe;B+Y>vÇüN°úÇùtL¦ÿÿN¢éoê%)bJQS ôžjOæl°;f,•ÄÎQÕä ô¶Î_ãvûøø…¥bùù‘!=i pñ韢'À@£TÿÄ©B`ú(„äô±GðVdGbQù7Öœ9¯Ý­¶ 0Ó_·<&Óôw@À­¶( €)€¤¡¡&iQý\áÔ+ðüð ĨÞ+p³W€]tŠLád1èŠ`  s7àÄüÿl±€H*‰×FOÊ‚¦£gæ¼5SÝ®ãm –R`©øÝ©2ýGŠ= ®¡(¦AñåTüN½{"#8ÉB`Ýþ)tŽ¶ÎPJ»@)(˜éÿÂȃI¦¬MEÀ” c"aŸÜb$£ûðâð â.¹Âô§(¥øÝÉ&ŒD|bêngûÔºˆ¢˜hFÚ.1øã8›ö¶®‚t¬5€8®¥ðæè°ÉØ;®@_ë|Ýô×¼:6ŒÃñqóõ’S³pŠÈ/Šƒ¦ò` ‰ý²Á8“1Þp_t³JËQíõ‰íëö´Ì]B€v"iPâp>‡¿ÝüÐ.Ú4–JâåQUo5ÎKØ>„šGDN½±è¤Ý³"2£(&»ZævÈ/?ãÐé‹*ýPéGvŒ áŠÚFF>¡ïƒ(Ad¾ŸÁ8•–¥¿ú9@Œëÿ-OF2ÚC@ù™dA N|:‚@`°mA XdjPt&BSŠÀÄ:þœA`Ž%È®ÀH*‰Ý‘Óï‹k 0ò(àÉÛd!àôÇ¿16ŒcñqÝ…×¥H­4;'Ï-Nų*¢hL:ä$Ö¨–²}ù%Ó:#(uÖŸ&+ÀîÈJ=Œ§R€ád ªé–Â`b<íX±Mhð 対=àõÁÏËwÕz}xeTµmaY˜Ý€N’[PÄÔ (&òKM%¡äDvbs´½  Ö#$!ñÚˆêH2B ·“]“»c©$Ƥ>øþø¸é7)(;FJo¶ÿ½t·€’‰ þD¼XÄÀ$C£4(¾[NÖ€¾Šûe‚eÐSS„¢˜|äAºS¤µR†ŒÊKfCåYº2«€è™L¶ü¶™ÙL&£§ 6©H“Œ¢˜dÈAµ¥iÄŸ¨ÈÖÈ+‘œšãó¦JM×'Î+Î!Ž%œ°ÔbÈW@åk"tÂÖÀ]‚Àé>—"ìqÆõôµÎïêk¿¿·uþ²|_‹äû¨T Ä”Ý7~œÓŠ­½ÆèAcO‘…hdš +k#%ùH]"IÉôûRF óÇÒS!ƒp8•È÷£<+pF%nõµÎï¢À2€uMè¡À†9‡÷…ò}máæö €Õà×PôŽGÐ;‘ö:ÕÛMm¾I[i–í0|vë9©t<µÙJ©u_‹Å‘ö—J½ Æ_ówóñÔÆ“¸´º—VÕŠEÀã`ó$ª§x‹°Á#ùå¾l@¹ºl˜{x_·Û×nžÓc vMüâúbQôŽGc¯_VØ÷ Ú7ƒ@HÙq¾Ì‚€:üEB€k-@Fl–¤žÉ¹«g7ÎÐÛ:¿ ùãTƒ—0ïÅ*(¥Ùß=Õ×´£iNl¢Ô ¾¸Ž¥8DZx© }ù§{ };‹0p4m?q,µü¦“5`oPó:.ª=^\Z]‹óÊ«œnEÀÚ¢Epz(x ÈÏM~œHƱýÄq|~¼£¢3ü% M%[‹¦@ìhšÓ¦ñ—Y Ó4‰E0ˆMê;X{Ì„wÞÓ‰Üæãr¹[¹ºv–@µÇ‹ó*ª¬¨±›SPEÑ58-´èmßE)]&^Œ!Nþ5rÑü¥8¯¢u>Cˆ¿è¦À†ó&A¼Ü4'` ,óÞS°>ë#±(mªÙfËú³‹œgƒS† ­oî &Sd³&âØ (Q+k2 ‚µõ½{B9ܾ"$¬È…üzô@½¯‹*ªQï+±{Áº)¥Þq´§ûT®åå¦9ËÀf½ @:oLKáhlœù=½î¾‰"Íœçìªô²žÝ2Åw“J%ÄLóåÑù“ɸþ#©’TCR£I%Ò[0k`¢B@´%ƒ ƒ ‚î)¾ýÓ)œÈŸ”ÊEËä×»¬A¯ Ê«Pëó›ÜŽn l¸0GAð23÷»tÈ/qŠRôÇc8—®ÇîæfÑþ›³… | A©âA™ÇƒRÅ!¨ô˜S:d!iwé‰C6ƒy,ÇÄ´ƵF’IDµ$F’IœHÄl­N˜ ¸¢¦Þ)F°,P¨¢ˆŒ(8ÐÛ:¿K£tàL~‘_¯“Ÿ¤¿èuþÌ-«DÀkä“K/\763‚—šæ¬7÷å—rˆOí­YXš–ðãpg'  (÷xQáñ „xPáñÂC2ÿ–ó¸’¶ýT±ä%Œ$N&p"Ã`"†H*™f L…€ŸWÔÌ°›f\°¼¾w϶ Ýð³ %͜ǺúøòP2Žnnö³‹%–ä’– "/µ>?ÚË*PÍñ²Qè¦.9v [ñRÓœ ˜ÖÊ/âX*‰ÃãQDµ”üëÆwéNæBòL¡?QPîñ¢ÒãE¹Çc>Îî\é§@ßÿY뱤[ZZÁ€´s‚Ò‡Ò“ƒÄ'šJa0Ñxñq=¯ª„Ì+­ÀzT{Ò’[· 5ëC9 Q0`bä7L~¹!Æ IÒrð^?f•U Úë™î¦À0Òo’Öë]zñ˜é|ÙoGðL‚Á¯(¨öúPáñÀG2'hò³¨`>o˜Ø_Òséñƒ=Sñ|^in&:Ì«4Ô![cNVÃÑXGâQ"Nea0¹B DQpiU-‚•5ÖM* ØزõÉ €Õ«V®Xîöo„ÉO¨ÙÈOÒÍYcØ­ýv!ª½~´–”¡Êë`ß-0šJ¢w<‚„Fù9ô_H¿‘´ÀKj|>Tx¼YIFôn0~ÿñC=®>$¼ÖÜTép1:/A&·ÆHý%8‹âp,‚>. &[@[I.¯©·N¼àäß`ê•+6»ýûy§K~Yë°Ý.mÕ‰ZëõcVi|Še8-€$¥8a0s$v®„7Û åª=F± ô‚nÏè¾ìx¯šçG•Þl™Ûέ„% û÷A~^Iª¡o<Šžñ1‹G']À5õvÖ@Ìçû^I䘻j劷¯!ïà Åôßv¼W'z°ÏÉßO7ù·› [ï/A“¿~Eó_GLH¿YÙÌ~iG«¿ì!U^*=(–c©±_ŒðÛ.ïï çûÙLvµÌ] ` €¥DÄ,ƒ‘N&ãx;2‚}‘Qý~d9 €Yªm°ÆTäÙ%°¿gÕÊsóqyfÎk§À~€=Ô‡q :–F~%‹¿ŸMë§EÂMûµ¾xÁ‰„Ù×gû"m|¬5!£Dñ Ââ÷¢ôØF€Ç¯èïíÉ÷ó˜Jìj™»”K°Ì*„UðÖØÞŽ #¦i“&JWÕ6`^i…uÓæúÞ=kݾò@(þ?Pz$+`,•Äÿ 1Eò­äÏäïgÓúVâ[ƒzNËÖf=õ{‰âA•×‹EDñÓ^×mžZÜß·-ß÷ßmìn™PY `5‘{ ø'A5¼=6‚7-‚Àna®Bpt –»™AhC~¸vÕÊÛܺ!ös+@$î¼Æ®±aÈä7ûœýýlZÿtˆŸô—|>=KÍò‚ª`¹ë¡Žþ¾ž|ß÷BÀ¾™ó:|‘ðaÔrOB’R¼Æc² 8µx@ƒÏO̘iÍ Õ÷îqMó:jW­\¡ºu2 BÀÞ™óôì¿8ÕðëÇô‘tVòË$5GùeÁYëçB|Â7X»µÌy웇Ty¼(óxœÌü ¶uö÷©ù¾×…>¯á:,ÓŸ7سKh£*^>%!Pàäï^µrE§[×aEÁT¢”nÔGÌ+«üzõ¡õmÈohi?X1׶•sDåE>‡^±‡­«ôz1Ã_‚RÇToŸ²‚%Ë;ûûævö÷…ŠäwÆÜÃûzæÞ·œµ<'C¡OQðžê:|º± -þR³Õ—å¼N~@JÔÊ F,8²¿‡²1Þ f—Uè}ã2ùåi2 r‰øÎ&¿Lv¶=ø†@±&¶˜IOÀ‚K3ü%æc¾ ŠåWö÷ͽ²¿/”ï{{&aîá}jûá}ë)p •„ËŒóÁ`ægf/Îò,”7ŒàЭ/Q0§¬"ü@v_&±±Î^ë ‹Æ7õ[Â&ç„°X—^Àçg]zü¢yPjæ^9P$þé€먘lÈõ/OÅP"n€E*ùwïÞ%Z¹"ìÖõØ¡ À"nˆ‡>«´^¢äD~ÓôÛ0ÖéE23h}%øÄÑ(QÔùý(S<ºï©BÝFAç~p oýŠ¦þé`ßÌy]’ÃâTÃÿpò›Ÿ‡½+P¨äÿîwžÂ‰ÁAy·n÷îª= Jº¥B0«´"'òô-»Ö—ýüt4â+„ ÒëC×"H ÚàÚ ¾öC‡{ò}ÿÎtìi™kJ ‹S ÿwâ8Ôdºæ·s ™üÏÿñX¸p‘¼ë3n]“ Nœwd¥4$^€ÖÒrxIOül›ƒ¯Y{Øk|B|Š‚¯¥Š"H/.w3€K>4px[¾ïÛtÀ.A~©öc7'zœ‡AÖü3|~,1Óšb]0äok›…ºúzy÷n7ï¯ rb^FÁº×f––³êºN•üÖÑké CÐÏ °„žr¦¬´˯8Üï{5]ðVË\Ý쀄¦á¹¡ã8™Œë÷žÀ2Ë´¾ÎçÃ_Ô·è)Ý@ ˆü°À¬ý{ò‘ûoEÁYpÁÑS, ¥„Y§C~ÝäG:ùm»ùTòBâüüz¶¸¤HþÉÛòÇ©†ß©Çq2É&1 f¤­«÷ùñ±ºø‰"—S*(ò°šÿÛܺ¶L(HH±^„Àé?»¯ÏˆÂnJµ456 ôX{ÕÀák¯8¬æûþL¼ÖÜn §þ `8™°Ö-Yl#ÿÕuͺæçŸÐŒ#?\tñÅòb^ûÿ V\Ä­Q¼£É_ÊcY~$3ùe__Öú¢ÉGª½>x1ˆOi¥ô’?8¼9ß÷e:áÕæö.ð’ïl À '1’JB?®ªk‚O²Ò(jêÛ[p䀋.Ê‹ÝùÊý·¢ @ðèSv`ƒ¿^EqÖüR¤_ÉÁä1¾—(½¤6«jK) }xðH燨ù¾Ó áæ9]šdö')ÅËÃ'0Æ'SÒÇdÈ]­×+ëšà#ŠùõFÙ‘ß²,“߯(ú N|P`ù‡¸öB-ØÑ4G×üÌì§ a4•`¶îô,P®@ÀëGG]##? Íßê"ùßò­ ¥t;¥4 Öe"]}=ÚÚÚäUÝn]k6¼xç±=F^@½¯Ä”h-¾©˜L~‡àìÉ/M-¶ü#ƒGBùnûtÃKMsx??P$¨†WG†˜æ—M~éy}ÀçÇù9Bm.’ó[uòS®,þí{ßÁ‹/<ïxŒÅÿÏ{ú¯Œ‚€ž –‡_ï÷[LÄt³H'»iðD~Ië«.)’òñbÓì. c²—¤FñÆèIŒ ͯ óôq+æzY ^‰üÍ>¼Ï5ò?¶yKRº€Nþÿø÷ÃKzŠ¢@QÛ©à ±ûOàŒï>våð'_ëõÃcÉñÏF~Ùä'`e¸KùAþ΃}“Žšf›~IJñæØ0"©”-Ù³+Pãóã}Œü’Ïßî&ù7=„Eóÿè‡?ÀŽ—_‚¢(ðxÍçŸë"ù}ìñ ¶S NþmOÿá;tͯ( ¼^I@[Û,”••É§ëÎßÓHGA¦;à‹" _DŽôA;ÙÈïQH‘ü.ᳺ(è2Aç¥ØE4ÅfW" T$ø2°gFA)ËÇxWMnös¡šï"ùyt“nö‹‹þémë¯ì„Ç£@ÓØÛE©&Y'šÆ\™…‹Læ¸ÒeœàùÆÙÖò¥’R1É™ü !(SŠäw¿oœÕEu³Ÿ"¥=ÑQŒkÌì׫§!@H¹Vz½¸¤ªÎäó ´ðÈ~×È¿ñ‘Ç‚ØN¸ÙBð‹Ÿÿ¯½ú*Åû–5ÂOE)yBA i]”OÙÇGb‹‚Ï7ÎxZ¼IJq,³Íð3ÁB~B Ï³'‘Ö~´HþIÇsm]Tªí—¢Ç#×4Ó~ìÉPC»3“‚UµðJ©pñB‹Ü$ÿ7¾É|~ ºš~õË_àÍ7^皟Y),h©é„ÖkÅü ä6”ÿœ@Õ+ËC£Ôô³$ù˜¢ýì½*³Ôå§Àò£ý“Žß6´uQŠe ŒÖ¥84ALÓ¸–çcû8¹Ã(*<^\XU«Ï€,|þó\$ÿ×7>ª›ýb$â¯ÿ÷WxëÍ7õ !4>e»v³æ€óÎ;_Z⦯ܰ-¯Ç-žoœÝAA—Ó†%M¥¤¨1û?ùAØ^&òo(’òñlƒ¡ù)e•’ŽÄŒ Aeb +(W¼8¿²F‡!|þó]$ÿC_ÿ#?!€5äÙí¿Æ®]oÃãñ8˜úBë`Þü²èvõa䈂ÜôïËIJqB”„²DM~¿~¢0S’/S ôÑÁ#ëóݾé†î†Ö.€.£õ)(ŽÆÆ™æç=Pã/3‹AÊ=^œW^­?+.Bíqü<´1H)ÝNx??ÁsÏý{öìæäç3ÓtS_ÄäõsçÎÓÏM)-˜ô_+¬¡ í™Lÿ\"þrJi˜kóÝ°é†_7´ê? @<†¥º¦cþÂï/Slh~.”þøûßaßÞ½:ùEHñ]DúÙ2Õ³R)%hjn–ÜÒߧd‚Ï7În°`/ÏH2©›þ ú•*Yó«¸öêGÕ|·o:áÿf´vb/?€x MÓ N)•º÷ Ç((Ê”Wê>??Kèâ£\#ÿ}÷?„Èðã×üâ Ä=œüÂħ&!ÀÖ™µ>À\‚ö¹óä^žµ«¿ÎËÊ‚‚`?}pNˆú dóûKõ9ùôa½Ë¯>q´'ß ›Nøß3»(è2€€P@#ÀP<®çhØY ¥Äƒy啦¹)ºÄEòo¸ïÁ ¶ƒì!^úÓ‹8xà€žÌc˜øšdöÛ ±ÿ¢Eç0W†Ý‹n÷žÊÄPp€÷ùwÓÿD"nõGf¿_’8ù7_}âè¶|·m:á—õ-FÀWêŽÇ‘¢†æ×ËsÙX¥ŠsJ+tòóÎÀлŽ¹Gþuëï7|~~;w¼ŒC‡AQ<:Ù™æ7Gø%Ó޴̾kh›5 T7w ¯ûO à¸ö€˜¦Aå ?,#m’}|¿ÿêG‹~ÿ$â¿ë[L5ü`$Géy}TêñÚ ³JËMf?Bæ"ùï]¿IóÀ믾‚Çë>?KPš_Þñë5)Ç¡~F#Jü%²ØæV»&Š‚Ï7Î^@ü $b¬Ù~–Š>0›þr=xJ©  8¦ñóºfƒü\ÃE’Ih”“œúð,?˜b%Š‚Ö’2ðƒè@è=Ǻöœ¾vïÃçç–Ê›o¾£GêýüŠÂˆoì‹8@*eí º50þÝü§@øÖ›W«ù~nN((`ÐQ-eêóg° ¶Xÿ~¢H&%ëï¿úÄÑp¾5]ð3‰üB£GSI¤`ŽöË~ ˜pžÉÉ/ÁUòßóµu¦Ü~`×®]è?~L÷ùÙh?9ËÏñ/++Ãè設K­­m†ùOi·«i‚(¦ý㙵¿]ÔßgÖþÝWŸ8º9ßíš.øImSšækš®áå¤=ÙЭ¿¢ Ñ_"ºøBï=îùï¾g]Rl'„_÷í݃þþã<·_K3ù™`¤ú¾ó]†±±1¼ñúkÒ]¿¿---z!¤ ûÿ F@ÒþÃÉO ‘aÑþ–M%–¨?Š¦ÿ¤á¿tòS]Ÿ'5V(]×üºé/&ï0l¯âAƒŸO¤j ô¾ã‡\{Fw}õk’æg×v g?áá£C™– J²0`ªæâàEhk›…CBáï›`m›Ù:BH·ßvsw^ZŽ( ´?`Dþܵ¿‡=ƒŒGý7»ü&Ûƨ>æØJso0"™M~#Ê*-Ëœ(;GèÇ{]#ÿwÝ­—ñ~úÁ088hêZVE÷ñ¡ ¿ÿ‚ .ÄÌÖVPeåKŸ?€µÅl¿ÓÇjŒê½\¡‰n;yŽ>9ü'½„ Æë ˆOAABWô»GþÛn¿Ëbö‡ûz1¤ªzÔ^&»ÈÖÀÂE‹ÐØÔ¬›õPVV®»"KPÓ4TVU ¢¢B´€€² €¾ÖùË(ЮQ:Ç ³>cN‡X¦“9ëK†1‰•4¶qLDK•~lŠ+¦À”ë »˜ðsúøÏš¦b~>åÕƒ[H³D,À ‚ ¯W·Õ„æ_ì"ùo½íS´ŸRŠ£GŽ@U‡¸‹b›P®ƒ‚ö¹sÑÐШ¿¤¢Ë°´´TÊ4úÿ›Œw‘Òž»ïº=ìt}<ºéi"\’0!ä¤è.%„ôBzÄuBÔ›¾rƒã¹NY6‰úçR^½é¯õ»¼Žß:Ñ‘vöM÷ýÅC°üoí÷÷E×:Â÷ŸŠ›t6á53Œžœ¹%Åðáù~vVB€ ×è`ç-îïsü7ßr{šÙüØQ ŸÔ5»Lj« „`öœ9˜1c†l„ BÀè24Žž9³U!dÒþy¬K‰ÑSБ­M[¶>i]«h%Ðà€XXµrÅú\îUFÐ×:?H…Í°Ÿ‰Ô”"I)FS P½˜b8™4ÕRHñôPBØ)Ù÷Ò†$¥­ýþ–9á®>qÔñ¦‘ÿ^]ßE)]&T:ad6i~"uqÁd”Ê]±ì¡NÉ¿öæÛ¤ÒÝìzûûaddÄÞª¤4͘5k6êêê¹ëCA)Â: ëÁï÷#›Ü†úúzys÷e5.@ˆHb°,[ÝËõ3݇-[ŸÜ–ËüÙ,€À¨Ã·| ê)‡âFRFàNÌæ"’=ÌL;¤Õç'æ¿N°ÿ|Š¡ý9ŠÚÿ4ðýêz“æ'„Õå³ÄWÒ~Œð 1̟ͦVèÊ÷È¿fí-AÀ ?  `ltÔ1৷‰ ‚Ym³¨­• |† ¡Ü¿A½çkëõý«««14tBÔÕÕÁëóéþ?2 ÿ¥”.÷±¯¯½½A)<Ðï ¨­Emm]&! `VBFdKÄ—¾X¯žÔih&¶%þB¿Qâ[®×m5ÿ‰eøU¿IÓ ôÑÁ#=¹Þ™"Ìø^U¤ùÅôè~Nþô ™ù; S /ÂȺjà°kä¿iõÍæ ?œ8q£c£L³"]£Z1sæLj\Ö0€Î¸Oe{ÐJYw5KöHPP'´?³Â÷Þs—êô;èy;Ã;°wïnhš†ßÿî9ž~œ‚¦iH¥Ø÷TŠ-—”” ¹e&¨”¨$W^°p‘< ÉbäЖÕ?t<>n»ƒÙ'b¢:ô‡%ŸÛzÚ¢öŸ<|·ªÎíWAÀÏȯ›÷|_#ãO¶˜e'ƒ¡?w‘ü«nZËÉŎ††‰DtŸ_¶`ìÐÜÜ‚š½¡aJÑùõ‡îWõvQôBÛ)|>Ÿ4444Ñÿ Ù=üH¥4 FK9r„Ou§(¼¿„ÊËÆd(±X ûöîÕ¥»wïÒÏ}ÑÅAYtärï'ék¿Tz èEõmÄ¢§a»”y†Wv“ÍÎagþKè.jÿSÿVÖviÔ˜®K!@½ß1ÙnÒw;PýΛ“ª~eÕê 3û{Nª'1ê]}ò„€è…=Ù§©©UÕÕz¥ŒüýÕÔR*,ŠŠŠ }B¿ßŠÊJ#‡ Sþ?¥âëàà ‰„ir§¸VE!\`¤?Ý»vÉ‹-[Ÿì@dšh±šÇy^¾ Cd¦½ÜHn‚ÍqvâÄjþ{ÑýRŽ¢ö?â"ùo\y“i¢N€btd±ØxÚ|Š…ô¼» M¨¬ª3ûùiçƇT­¿G)U !@ôójkõà¥T]wïÝÝN×L)]"f:p ÇBpE"¹¼¬è³ ±½ˆF#èíí•Wud»‡™@À¤úñĸñYýyc€ŽìÁçkòé‡Á#ÿÆ[×ó‘Á#Ý8}º*jøt]†Oßä/_&?‡ÝwJ)r vžÐÕ'ŽºFþn\ÅÉ«ÑO1:2‚X,&iK%}âéS?c†ž¸Ã5{˜RÚùÈ7¾®Úý&¥tgz¦ á=Tn§k¾ÿÁ‡,ñí{ìØQmï±h~%MóËÛ­xõ•°¼¸Y`+úZç u3ôŽG³›÷–`.°óÿ3ïŸfþµÿñ/å5Ÿ˜YRŠW±¾Ï…‚j‘²=ŠÐ5.’Å +ƒV³?‰ žHpÍAlÍYÔÕÕ¡¢¢fÍÎGyXuþe}_TVUê窪ªb[±Ó)í÷-£ÿøq[3Ÿ¦åÙGÉ(¬BÀâ·l}2é^:YKÅ—8Õ &ã¶;M$xºþ¿˜Î[²8UØTË…Ž*¯fStS¦µ=„ µ¤Ü4’R@¶¾ÄwRDRIkNHècCÇ\#ÿu×ß`2û)Õ‹#™Lš´¾,L>4!¨©  ¬¬LÊûgšÿ›nT³ü¼j&LJJKQRâ—†g¤›ÿÇŽ³:“ïo^^oç ìÞ½ ÑhTþÍŽL r‹nþ[¢ÿNÀ\Éÿ·ìiúñWîg°í#ƒG²=°"8¾]Veôóƒ ê™UZ.iþôÔX«¿?–LBŒã` ¡¿p™ü¶SJ" ÇuòË;A@AUu5JKKÁ”µáóozì5ÛïSŠ°‚Ïkˆž JiÏý÷­ëq>Þ²ÎÁ>AlÇYóËûË°X‹3µÉItˆËÑÿtdÖýÄéþEáÒ[òÿÏá´EøDzJ6žŸ›Ÿ ÚË*Pª˜Gè›-:ãÿ$¥I&ØX#¥;´dè¸käÿÒ—¯×5¿X—L$Lõú3}@*«ªPRRI‹‡)EçæMßTs¹£—¨¨¨!••r ¡ÛéX^}¸]øÿG¶õíÙôâΚßÌ”…ƒ€Ü5Éš·Cšèkß>6°ïÿÏDl]“œRLŽÇø;NOqFßÜðdie…ðó‚y啦²éNä?™Œ§™ýתî‘ÿo¿tÉìgI2)hRö©]¤_^W^^¿ßŸfö?ñøcj®×!uòºåz‘‚Rçô_Ji‡è)C4:nëÛÛ¹V«ÀjX‚{Ì }ËÖ'Û®ËÎX 0A?šJb4•Ä©cân‚üf©°mÒN<ñ÷¥]à>?ÀÈ?¿¬eŠÇHÁæûÚ=©¥ŠÇ™¹l¬}BíwüËÿæK:ù…Ù/>&Î]~¥¥¥ðù|c€„Ù¿å‰MêD®å‘o|½0AeE<E¾¦n§c)¥‹uíôhF Ÿ4Çìc†+ÐÛ{'åŸïpº®4@$Ÿáx|<Ý7´ySœS€aí°KlÛ<Âü76=5‘w6bkIyåI>»‡‹Ê«ô)ÒeÈÑ~Ñýš âqhÒàm úäI÷È¿lùßAévªi™ô}}˜»üü~?¼^/»zªéÑþ¿Ûò¸z*×$§Ïhh”ýÿÏñœT2҆mü’f¤÷ Ø“^‚G7À1`gtˆ/Ç2$¹ ‘œÂQ4ÿ³àïJÊL?!8§¼åžÜê¿Ä©†xL öBŸ>9àù¿¸ìo˜æ“vPjòí}a³ éºr†@;¿µõ õԯ̰@ÊËËåõŽÝ÷®»¯ƒ5§©É>ö½æ,@YPØ  ÷8€‰YGZç£:Ï»ªkqAeMŽ7&»hÈÔhÝK6M-}ÿÛNíÁØâ/Õ“|(ί¬F'Zw¬å¹Å5 Çâ1hæ,¿Ð_ºHþ/ü¿e–®> ×+ápöé‚ Àíÿûoýz:×F)ºe! â”:¿—zöØ¥T*•c7_ºÏoV«Á¸}æŒÀÀ–­Oí®ÍjôÈ™L>¢à‚Š|¸¾^ÞÉŠ‰˜û§˜¦÷F¦qÖg9÷•˜4¿—¼£* “_ Mó带áHŒÍÂ,} }fxÐ5òþ _L øù|>x½^sT™¥¼w˜RÚùO~K=Ýë“ÇHB@Ýøðƒá ÇtÿÿäIÕÁ¬Oïæ³ ƒô$ô²0Y¸p¾|Ý ëetØ]›éÍhéÛ«èìk¿lvÞ¼~|¨¾oŒÄ[cÃüæOÝK Ǽ–L§Sm±™“_ŒÖ󂋪jQîñZMy[Ä5 }±¨># ýÕð ×Èÿ¹¿þ‚iH/”––ÁçãÖ IΫ9äšþaßþÇ'ÕɸF©NˆQ!¹Ûiÿ»ïYhP¼Õ'M–‰¢°IHXqQ…¯#|â÷`#Ù±” æ’|ðª?ÇâÅÖËPáPÀ6 µoïf—Xv^E :j›Pí` ä‚ÌE?Òañÿ·òOclòùuòŒüÁª:Têš?³´×4@3'ô¹Éÿ¹Ï³€Ÿ¤ùËÊÊà÷ûAˆ}8˜S??-•‚–JYFõÑI#?GØÔÈ,LVéR€ŸH$øes¾5À>6`¶ ¬aÞ¼ù¸iÍ-¸üòÅV¸ ÀÜU+WtÛ]œcT¨­oo€Î3ç­¡Ü j¼>\QÛˆ]‘쉌ä|×2U2ÉôzzÍÇ=‹"LxÌëë¢ËÄmò‚Kªù³ë}`\Káàø˜4³ ô×.’ÿ³Ÿýœ¡ù¹Æ«¨¬DII‰I㊿†Ö7Z˜H$J¥)˜ Ðù/ÿümur¯–žLc3wÿ kaxxX×ê†æWPhš¡ÉÀ¥±lMxV@YY .¿b1Þû¾÷[9¦X¾jåŠm™Z“i4 `Îá}›\B-ÚwQy>h@•×—ñøÓñ˜)kû§›vø¦×gòù}DÁ»ªëQeí·ë¢×R艎A3jd@èó.’ÿ3Ÿù«´€_Ee%JKK->0~Ië3­‹ÅL& Í„Aig׿ü“:Ù×+†KV@Ï£lìÉ°‡°Ô¡!­nÕì™{9ä}gÏ™ƒ/]w=.}ïûL×G) QJçf#?ã¼sïëpíÞ™ó–è÷Ѫ¼>¼/ЀÑ1ìŽ"•“ÎÉòãχ'õÎ`<âñòI;¼„àÝ5õ¨ôúÌ5ä`_Ð5ª¥°/2 BšP•†¾8ªºFþ¿üÌ_±)º¹æ€ššJËÊØõÈeÇL0¬‚h4‚D"!k¿0€ÎPè_Ô©¸fÖ•È®‰_Þ6§}ï¼ëž ¤¬ÚÑÑ éÜ¡ÑeŸ_¬³Z%%¥¸bqÞqÁ…‹´è!„,_½êÆî\Û“Õ1ÿð¾m˜kmôì² ¼»¦Þ¶§àtD‚¯¨ýmñˆÇkÖüŠ‚KkfØZcÔf9šJaodT¯ÂÌá*ù?õéϘ£ý”¢&@YyYš¦1«vŒFÆ‹ÅÒ|þ§¦ˆüª”N šiø/„öçÕãñ43Þªù³YóæÍDz¿ùÎ?ÿ²Å°ú—¬¹ie÷D3á™Ù¯¸vWËÜ¥¬RŃ`U-zcŒŽ!5sÊuçLgýáÓyjÓßÈOÀ„äû8ùµ Ç ®GS)쎌@ƒTà4´|ì¤käÿä§þ2-ÚoŒÏ7k~k @,ŽŽŽ ‹ñëgš™ÒùÝï<¥Nåµ2SCtgØw‰è)åeÉÍQ}¦Ý­ßÎ ()ñá²Ë¯@{û\€w‹óç×`ùÍkVuã0! @Æ¢#û·ÁƘYRŽ`uj,Ú(S5Vã–Z.NØyª×:]°Ñªù‰‚÷PíõådiERIìŠ óùt¸JþO|âSAPº”¨¦jêêêQQQ #ÒoéVÁÈ0«ù§wùQ¥ßûS}ý”Í=)¾wozìÑL¿Ù!¾ŒŽ€m»²Y³gÏÆ'?ýÌžÓn½˜Í”ÒKnY{S÷©¶ç´æ<—[oHÖ›ªûüʉãp,M®§Ï&›á&ƒ"§Â§s­g:¬ä÷Å1K-VÈãíÈ°éYýMÄ=ò_{í'Ó4CC#¯ÉgVFu^sCU‡š*T…t~ÿûßSÝhÖ'6õ¬ºi-xtűûï¶ÛïZÊÚÃzF†‡õ8E®V€ßïÇŸ½û=lÂQùX–°·|2¦?e @Æù†5°ÙXKÐì/ÅùTz'.g,é¿øÐY|Øãéø ³ÿ²ÚFTsòË„×+ÓHë"©$Þ6ͼ ô·‘a×È¿té'tò ßµ¡¡UÕUºÏ/g¹™‹]°ÏÐÐÆÆÆärdaJ©kä7 ÷t;îÁGÿQJ166fÚ–Ý `s|äêafk›Qo=¿ ”ÒKî˜ò“8;ðG{Tk_inÌh€EÁ¢òj¨É8¦'›ØÞ\y *—ÿ=“ugöxºÈ2±ì# ®¨kDµÇìó;ÝÕ±ToŒCƒÙìw“üK–\k"?4·´ ºš31Ï|#·ÆHùè?ŽQ‰HÂçÿÁþ]u«zžxü±p†}:Ä—ááá´ŠÊNV@yy9ÞqÁ…¨¯¯7Å À,åwÞqk¦ßœ0&uzp¸èhOw¸¹ý€®°F¬¯ñúP¦x0–JòzjÐÿÚÁgžm¢g²¯óL€L~fö_Q׈j¯ßl.KÇÈßGSI¼1ª"e¾Ï¡/¹Hþ¿ø‹¥ifËÌVÔԃ̬)¾†ùÏZtüøqŒŽŒûr³ÿ‡ÿùª[íA)í!Äù¼åÖ;Ú툌EÄ„!zã¬ã…`fëlÌ›7ŸÕ.€¤Å†»ïº}ýT´eÒ¹5°£iÎ3¶ /.•Aû[{,q‚ðT\g!Éü5^¿u°Ž<;²¾n4•Äk#*Ræ˜KèËÑ×Èÿ±/I#kkŸ~Ë”|dò÷£Gšüg°Yz;ô£ÿTÝj‡üڞͰ½Cøþ©+Z*·S>ì ,X¸Èø¦”† °üž»ï OU[¦DH0]xTKÉ]O FPÐbxM=ää_gAa£¥«ÏJ~i6FSI¼22¤wõñ[º.:êù?öAÛ©”äÓÆ'Þ0›û‚øÆ÷Ã}}úè9Ž0€Îÿø‡ª[íp€š©ú¤£òĤÔ<,Ël„€›ï½÷îµSÝ©A¡ýs,["ôÃoXxªoD¡`£ÇÛE,ýüVò;i¡ù_b]}z ¡ë]$ÿ5×|<€uõñkž5{6jkëlö&¶1€¾Þ>¨ê¾^øüÛ¶ýXu«N O}kë=ÎÛéRѶñhÄÒ\ƒ Ö Fbãã(--{º2ì}J€äò ®i9G©Ô @B¡ºq3ò ‘ä#^Lä×`OþùùyòB~MÓbÝì9í¨«cä·Òk]wèÐ!¨CC†EÈÒo;ÿ뿶©nµ#¾µõ‰mNÛÖÞ|k ¡Ê¢ããif¿Ün±N€’ÒRAš\À¤tæ‚8Õ$5Ýpµö]»va‚G¸æ—Éy-ö˳ðÀ ¿ Aþ¤‰\$´bÜ=ò_}õÇ‚”ÒíšTÃoÎœv̘Q¯Ït#ºûÒ [°n°CâÄà jšP¦@çO~òŒš·‡3ˆD!ÑþTÒ\T—ú<ú:ûHxÐëjžu¤Ý ýF™ÿÚïÅpå@_·7#_xÔãë" Ëï^¢xùy†Ÿ,5Ë2¥#©$ÂœüzALÀUòô£×¤êkoŸ‹ú3 Íøhú€)ûz088–ÛÿÓ3„ü°yÓ7UY˧MJ*ÁZÝHÔ>d&w`òªh¥j³¦F‹Hh> ºÇ¼¾.…`™BØ„~¢àý<ÃÏJþ´Dþ”D~¡ãc®‘ÿ#¹:­t÷ܹó0£¡!cÉ.¹|ÿ¾}èïO#ÿÏ~ö5ßÏèÔÀÚá/)1­•\3ó:B02<ÌtS4Ê&¥hn1 1 ˜…§³xÌë·äö=·_¾iB€ J™üB7¸L~ðéºyç/Xˆ†ÆFóŽV3WºæÝ»w¡ÿøqY(„tþ÷ÿ\u«“ ¹L™$”ÍZ ·4½¦º@¿ ‘Töñé¹îJC7±Ù¦€§Òk%½é¯ð“ÉÏ_4WÉÿá4Íì_°p!M„·/þÌÖ¾õÖ›8~ì¨Þc¡(J˜Òù«_ýRu«S&¬MNÖu<ן% ¹×]€LÀ³éÕ{¼G"¿)ÂCëÛ‘_š#/ä×4- ¦êZ°p!›šu3—À˜¶Ëîóæ¯ãp_R)>Õ—– §RÉ3žü0Õ®pðý-—o… €¡Çä¾–  ¬¯H}ÂFþÀô©^ɇRÊÊxÕÔÛŽç·K÷5uõÁðùÝ$ÿUW}8¨i×ü4MÃ9眇&N~L/õ«¯¾‚Ã}}r,¬(Jço~³]u«SQ,”5Ì|/2º$½ÊñTcjóøm8õöq1=°Å_&õóSøÞÉ xÚ ’²æø‹$ŸdžÉÞϯ“ÿÜóÐÜÒ@"½UëIßÃáèë=ˆ©È ¢t>÷ÜoT·Úá*lÆXÝóX÷b_®€‰Àœî2}°µ¤¼‹‚.Ë^¢ XU‡Š Õ{­{D†ŸÔKâj´ÿª«>,EûSÐ4ŠsÏ;--3ÓˆoŠåHÂàå—^¡Cåma/¾ø{Õ­vL5Œ:æ{‰ôvn˜r@:¹u³€™ÿº€ÔÝÓH¨3ß*)ç>?k•˜´£"KénÙìMäöë/Š»I>ù…ϯá¼óÏÇÌ™­lé&æ7_ÿú§_ÀÁ=Ò&¦ù_zéEÕ­v¸„ á·jëÁ|¼ë®ôdóä3W :³£O–VtQð£^¢à‚ªŸ±Çé~K%ñÚ¨Š”~'D?ߦ» †_¯Ÿã…çÿˆžýûôe¡ùwî|Iu«." µ3'ío,›ædœrL¹ ÀšÄ ƒdÿ/C”?Ó»ÿ¡¬’MÚÁ—½ Áù•5:ù³µ-’JâõѓШ! q7·_øü"É'•ÒpÞyùMZßB|±íø=öíÛ'Ÿ6¬(¤óÕW_QÝj‡» ü]·XBY„€ß_2‘™¸d0Àn ÿ?ƒ×4£`ˆë·drðí²ª. ºŒÖT!8·¼åŠ7C½{cI£Œ—ô"¹Jþø£AMÓxW_*Mó[µ>±q~ÿ»ç°wïºéÐùúëoªnµ#_ HIù/Ù,¿ÿÔ§Ü;ULy€> 57À ¿ihkwõ®œ&þ©¼šGûÙ?Qù%ÍO}Fù£Q`4™Ä[‘a¤@¡ýºN~#ÉGƒ¦Q{òó‘Ö‰õ¿{î·Ø½{R©ïçך¦u¾õÖô'¿@Ê’G2ôŽäS*OˆCÚú72ù.QÞEÄÛó{›rÇ?—Ww`™H€ñ Ë«Pêñ¤%÷À², xŠÒÝ „!®óÓ{5uõ{ÞyöäLäá¹ßþ»v½­“?•J…5Mëܵëm5ßÏh*ñ•U«;œ‚N˲)h ’ËXpdÒàZ&`‰¢X^zÓ¬&Lò%¿’vYa§óþínµ!º*jôQ}‹ö/¨¨Ôɯ±Vëÿ4þäK%±+2Âjøå©Œ—<°‡e²~þ––™¶û[ÉOÁs¿y»Þ~+ü{öìVóøx\ÌÓ¤Ù„‹øõcÝÂT €€pJOΫðxÅ€Q‚ðý½j†Ý×¹q£²!T`äçJÐKÌ-«D©âɨñ…`Ó’Ø5ºúØÇUòô£×ÁçêStŸsŽÔÏoCvëòožíÆÛœüÜzSJ;÷ïߧæû¹„vñ%™H˜·dÓ*ðFËÜ5„•g…<à!}p åîE¹.,d˜ð×3Zƒ¤Ýõ»fÁ¿VÖv¦è&`fÿœ² ½çCöïí€1Q§”ÛïrõÞ«¯þXù)¥XxÎ9hjnÖ÷ÉNþíxû­7Ó4ÿ=j¾Ÿ‘‹h—²åü;¥ý>pÿún7.vÒ{vµÌm×€. t’°dÀœßo×ÿ¯€ Âã‘æ®#εÑ–’<÷~§²–çö³«õ(@kI¹äòHQ_´ˆ1°Gò÷¶Øhþ·ÞZ_Ì¢ÛyèÐAÕÍç‘oPŠ9âVÅqv¯lÊ YQQQipÏ×Öï'„,¿ÿ¾uÝSy½“jìj™»ÀðJ@¢1=Ñ1¼<|BËN­€ >·= QŠ?”é,K¥“ì𽪺.BÈ2¡ BLä·Žì³ÆƵŒ±I;Œø™«ä¿æš !Û)¥±nþN~˾2áe0ò¿)‘_ kZê¬#?G»<´×v=‰DÜÚcÐ`û½ëîÛtïúûSu±“"ö͜׾§eîvl‚ä÷%âxqxû££æH¿t¬µû¯ÊëÕçò²Íé7Ÿmh  âNñD+þ­ª^¯á§ð-%¥ð)ÄØíµ „qMã3%Áˆõƒ¸:Q§^º["ÿ¼yóÙx~NÃWy´÷®·!bŒüZg__Ÿêæó( Å—¤T0Û¿x<Ž·Þ|ªªš7²†;Öox c*.ö´Àþ™óÖØAÑ/0I5¼5v:9€‘d°%¿¹KPXÂàx6ÃOw9îâß«ë¹Ïohþ¦’ø‰äóK‘~k×߸¦¡7Ñs¡„æ_6¦ºGþ/ ‚ûüb];/ã%àXÇŽÿ'¿Ùì'g-ùo¸qUü~RJ¡e(‚c'R©öïÛ‹½{ö Å]fN’vÛ7Ü÷ঠ÷?˜Ìk>ep`æ¼`ÏÌy;l"¼ÑÀ`"†ßGOtÌ<[ÔÍgêþƒÔýG”( D0X¦·ÜÂ%BlohmŸÌ›’ ?¨ž¡k~f¥(hð—ÀK³Ö—|,f_,ªÏÒ+4ÿGÝ#ÿÇ?¾$H¬äooÇŒ3Œ»k½Û–8Àï÷öìÙ­*Ïð;KÍ~ ¼ YJág´¤mªªâ•;1tâ„u¯5vÜwÿC“uÁ§$z[ç¯'ÀÂ'þ˜ÖuTÅÔ~DR)G“ß¼lŽT›§ºîyïñC=Ž÷ èa3âR¢ÐÖÌ肬ùAPç÷óYŒÅÍ~?`‚˜¦á(Ÿ&J1"é¡ÿ7:äù—,¹6H1‘öœv^½WÜÜÌÙjüÃï±wïSOÉH aíœ R©víz¯½ú ÆÇÇåMí„í÷?øð¦Ú8Ý žèkìk¿À:ù¥èÇð¿ƒG±'2bÔþM°þÒ­~ª¼Fçî¿ß6´µ ]¤»áü¨¦'ù¥®>?<¼œ³Q®Û°iäõqªáx<¦÷‚ðØAè .’éÒOaÑü³fÏF}}}Îçxáù?bß¾}&ÍO9Ûºú@/ßÄ|™´~.•NžTñÒŸ^À¡ƒ­›ÖØÿàC—žÎç,Ž¶Î_¯°Pt%¨†#CØ>t ÑÍ'ûõiV€yÙÚ#PåñÉSƒ9vÿK£§6àǦùÁÄ‚j¯>ÒÇ.È'{þqª¡?ホt«%ô×#'\#ÿµ×~2 ùÛÚf9L×e¾ÙzñÓ^pòŸEI>ÙÐ!¾¤r(‚›+’É$víz/¾ø¢æ©Æ„§zø‘§zø‘À©œ;«8Þ¶ xŒk}À0Gð‹#x;b®eN oc˜còqU¼„èA† ‹Å8©+°-Ðhh~Âj÷Wz½\óó çºdBhâ”b0Îúƒ=àGBŸs‘üŸøħ‚°ŸÍÒ[›¶¯“Vzù¥?™Šy€“ÿlHïÍ+nX€œh™h20tâžûͳػw¯uÓRBÈþ‡7>ºt¢çtLl[ À ¬“Ç2Ç4 ¿=9€CãyæYäqÿr²3)¨þ«ï Ýüç¿û˜³?I@:„™Jóÿ™Ú¦.€.c?Å~©ÔãÑgq‘šx(Iè%Aq2‡e~ƒÐg‡]#ÿ'?õ—Að)º…n™ÙªOÑm…]QÊðŽ8h6AæýÀž ¢C|¡”Nª Ÿ7™LáµW_Ááýø³?{*++Å性7~ã›Û@Èò;n»YÍ圶À`Û‚0sß”gß3Áú{q`<’6ˆÇÜïÙ ûȨóùåI£Íÿß7Îê @@Œ;¦f²oöOj›ø,½|î:”*ŠžÒ¬Qš6GŸ<À'I5 '⼫Oüˆ«äÿÔ§?„Eó77· ¦&÷ÛõêÎèë;$ …°¢³jHoŽX,¾$†öŸª‰?úûñ?¿üÞ~ëMóB–Bö?ò覥¹œÇ$ÛÛl{iÚ!㚆_Ãÿ CLêÚÈXÏÎ&` j˜ûÿIóŸˆ,CC†1ÉÙ€?«kfýü0Ü /Qt³F÷î-‚@49E)F’I€Ç „Ïÿ—î‘ÿÓùÙ ,äojjFµ ùÓ^R¾üúë¯áðá^yK˜é\Éç´Ð!¾$“¹õdöÛÌu¤‰^zéOøéOžÁ‰ÁAyÇ€§ùæ槿¹é‰öL×`µÖðŽ}ãcøαƒØ?á—`%sîV€h˜µiÕ^?ôÑ€úÎcº.˜K¤@¡,&?¯kÖ‹y(\ó{¤bŽ¶~\PIJ1Æ¢’EúôI÷Èÿ™ÏüU²ëQU]-=ó1Öå·ÞzG‘Z°¢x:wî «nµãLÁõ+nlNádùÿ¹ZC'Nà™m?ÆË/ýÉ´ž²ÀŽÇ6=±ÆéX«è–~5ÔŸ šµ>^¯Þq•4¾,8,Ý‚õþ½jP¦î¿çgHPÎä LÆ ÿïú–Û/ÔLxÍèûN)MC”û~zÞ AèS'û]#ÿg?û¹ $ÍOAýŒTVV!óÓ2–wïÞ…cGBϪ÷’éX½w²Ð!¾dòÿ3Úa›Ó!vçzé¥?áÿñ}ô÷÷Ë«6=¶yËR»ó˜@}ïžnyYŸÂ2„×bÛÍ}ÖJ?vÝ‚”¯O×3ãšæ˜þ+ºÿ¤®4 N¿¬oášß˜8%Ì{JÓ®]¬šŸEü5=AHdø}RuüŸûÜçÓ4]](J{q¬Ë{÷îAÿñãPc¢NEQ:_|ñyÕ­vœX"¾È @7ñöµßŸ)"³À¿ÿÛw°cÇKÖÝÃvç¶ n_ÚJJ/*ÓKÛMV€% HTz¼(S<:¡ËÏ6§óÞý óØùÓ¯fÌLÓüIJMN£\û[sÀÖ'56€YŸï]«wüý… dÍ ¶¶YI/–÷ïßÁýn‹ÒÝ¿ÿýsª[í8ÓpýŠ`ÝpœýÿŒÂ Ç}ôòtËͺn˜O5ξyͪ»sÚ ]·–”™.Òj˜,¤ky}?§€ ¥øXN¾ž‹öØ^(G‡èzìÇì, ãgÌd5ü`hþ˜–BJÏts’0°ò -u‘üŸÿÂYz¯¤ùkj(//7î» éåUzzô@’¢(\ó“é;]×äa©Üm*,€ÉÐþâý³sÕœ-¶¾­m–¼©Ûé7쀾sƒÏjóè`{C+ØÃ|v€•ãNRCHcøÌA´É#×Áç>ÿÇ]$ÿ—ýMšÏ_YY‰ÒRÃu³{qä—¦¯·êÐ<ô7L™StO9®»þ†`¤¥'Ét2ZŽÉU8±Zn¦ôz{íLвÄ2‘=›+ :³öÏx¡‹n¿ád¬œ–‘ ”»x¶¡µK‘†ôRÃÉ’T³Þšd¬r±4¢]sâ¨kä_¶üoƒ°hþŠŠ øKØì2ö/ŽyÝá¾>kŠ0!¤ó—¿ü…Š"rÁRñ…RVÕG†S~…ãvÈ>¿uMK/³O)E[[›¼ªûæµ7©Nçwº&žWZaþý?±l?¥‡“+ £Lûë~3!ÝuQF z€ÑdÂ4Á"Yï&€ß4´udKÒaצ&âHhš­æ‡EbÌr$~_!$tµ‹ä_þ7_ À¤ùKKËàóù-ZŽnÀÑ£Gpò$¿ÝRWß/~ñ35ë!°Z|±ÿr ¼:-³uæ\S“šAÀÏ›¿@Þ”©¨Ž£è_J >s¹b«É?1WÀˆÔûJäà™ã…†›Û;¤IB0¬ûÿÐÿæ’ ô\c›©˜‡àD<Ž8Õ â›¢ÿ†æe®B¹ÇË„ Íÿ‘Á#®‘ÿoþöËAX4ii)|>£–‚ýËe¬;~ì8F†‡¥e„AHçÏ~öÕ­vœé¸îú‚àÝÏ„Äã†öŸ0ÙÈlN ³&žú[*‘ßï/A¯êÄ]ºîLí°õ½{zôˆe9 ÿ¶­æ—?¶®[ï% ª¥þÿL@,™‚#ÉM&MB ~×8˨ÛÏnâ1ĵ”¤á¥D%Ó: …Tx½PøMšÿÃ.’ÿK_¾Þðù¹Äóù|ðxWŸÆÛ‹`\K×bòöu~?<úo }p Ï5ò¯¸aešæ×ï±CF˜uðÕIUE45uõè|úé©nµcº€kÿÕ3³“I©ë/bÛùÿNÝÔVh°uÖJ)ªªªP- øBÆ¢º Ž ¾w IœW^™–ÈË™]xýÆüLtijfÚ?f &š2ð‚òq/6ÍfšŸËÇ#OiiÉÈì3ªùø‚~¿>œ—ûý¡+ûÝ#ÿ 7~ÅD~1ÃL.]|bÝÈÈ°µ¨d„tþøÇ?TÝjÇ4ÃRpK €ü³3ÿOÇÿ7||š¦é­‚¼$;Z[MÚ¿ç–µ7õdkL¶©Ážï^;¯¼ ç•W™6Æ4 ¼è… Óáø¸©q£É¤><TCƒŸõU󤞞s3¤ÿB–‚“Såæ¿î8PÉÝ¡††|©iN]&öL¢':ŠqMÓKŽS ˆò=,.Àn,àWew.É&º‘aöÝEA+ !0³¤,Ý· ôÑsâS¢(ÛœÎÿVËÜ â­JÄt⌦1}Áƒ—›ætWò(’”b_dT7ûA Œº]"‹È~EAsI)A$¶Gè Éÿ•U«9ùI@<àD"MÓ‘õ}©$da‰D‹ÇÍÑ~J;ðƒWÝjÇtÃu×ß° ¬,wZ×&`™ÙíSV^¢€Í°Dá/ñ³Ù‚E]£æÒíjëêPRRÂ2i¥I\øõeõÿ, ¾wO÷`Û‚nä˜d#`õÆiæmÓÅ÷ÑTQ-Å}yFâ$Oæaš:Ü<çiJ±T×üØA4•Òã ÔD|yÂÎAkIQó4tÙq÷È¿ê¦5œü¢!ˆÇcH&“¦ Ÿ~,Âb±q$ ½v!xÝþÿøï«nµcºáË×­€M}ºïïý·®SMÍÍÌ¡$••0F¦ rMäiÙÙ -ÃuVŸ,Êa[.íÊ:;p}ïžNëºÁ¶A˜ƒRÙ§„€PºXo<Eòum.Ð~xŸã…Šê?€ ÖÕÂnÕ…€|(ÈRBX@"I)ÞŽ #šJr’›ý~¡zv_©âÁ¬’rƒülÐ\$ÿM«oRJ·}¾CŠh4Šd2i˜ýìÞåÉ$W€RŠD"a-H&„t~ÿûßSÝjÇ4ÅH±˜D"‘“Æ–A @YY¹iiÚE !7­³üxZµæÌÓŒ‡oÉþ+㔦熬Ø6‘sœ9/@²—óî˜@‹K%Mõ)RÐðæØIDRb¬€ ¼qótk@)ñbNi…^ê›#ô¾ã‡\#ÿšµ·¤™ý‘±1Ĺ&g—®íDD:¥W$2¢ýßûÞwT·Ú1ñåëV´BL‘‘ø#ºøì||±NQÔÄO[§òXXa—%†4`€zû­kÃ8œ’˜ Ì>¼O…C•ØÓ2w©?8êÁ:Y$y¥x}DEÄä.ˆ­T·˜‰OP¦x0¯¼‚i~*ºiè½.’íÍ·¦™ýc£#ˆÅb R¢þ’ÙÌÖ›J&A5--Ãï»ßyJu«Óë Y¼Ž‰?4½ŒRŠŠÊJ(ŠG^}-@Tþ½çÁ6ôä«ayÙ@Y,úþ-Á?]Èûƒ™ý¯Œ a,•”ü!ÑG)ð+U,(¯4†#³?¡K¹Gþ›o¹=Íì>9ŒXlÜí—î ßÍ:µd÷  ó_ŸêRÝjÇtÅ—¯[ÑA«‘ÖïèÚß6ØÇ×ÕÕ±Ù—¸Æm|øÁmùn—@Á è `Å6ŽÆ¢€Éï'z/LÐ4„GNpò[„„ä2ˆà^¹ÇƒEåÕifÿ»tü·ÞvGR–á'F驪Šqž´À6꯷‰R=0$½€aO…þEuù‘MWlÌ1»àŸÞóeY_UU¯×'[fòÝ )zfÎk§ÒÌÃýú¤š‚ÄT×Úã©RTÃŽáAŒ¦X-~½›fm)•)^œÃÉ/íú³c\$ÿAÛ놆†‰DôH¯€“àñz­]€a t†þåŸT·Ú1ñåëV¬'„Ųø“}'íOAmiîÅÐƇìÉw»d¤ÝlÚq5)æÖÓu;4j)¼xr£É„>,˜ê&¿ä2¥(÷úp~e ¼„È^Dè.’ÿö;¾¤”n§”Ï/ÀXdL'·©«H³|>Ÿu P@ç¿üó·U·Ú1ñåëV !ëè#þä®?NÚ¿&е?ÿ”ö Wè]ˆ}ãQ}½F Í/¬Þñ1} P®A kAdÿUx¼¸°2`œƒY ¡KŽºGþ;ïº[7û&¬úûaltÔܵ“Á ())…×ëÑ_8Q½÷Ÿ¾ýª[í8 Ð%/È)¿¹jËl§ý Lî&ˆ4¨?1nÊ&Ô¤{à£5Ùƒ¥ú>.ªª…}×ÐÅG{\#ÿWï¾×ÔÕGÁ‘#‡1|ò¤É”7½dRÒ”¨ù'—ýšÿžü–êV;¦;ìLÿ´À_¦´_Jáñx­ÚC!j ¸ö!JÄ“ðð„ƒ^˜µÀ{ `äÄSU/ÞUS/QŒþ t¡‹ä¿çkëÒÌþÃ}½8yRMëêã—i "••())áûPŠ0!è|òï·ªyxFÓ<Ý÷iy],`oúËÚ_FCc¤4_Àæ|·Í '°X¤â# ­90r{!„5 †'ÔxýxwM=›Ù5ôÉÿµ{7ð~~OBêë=„!U͘î)w÷UW×ðRßú°ª0@:¿µu‹êV;ÎtBڣΟmz/‡lú áP^^Ž²2SíŒ ßØøšï†9¡ ÀÑÖùÊËi`ã÷…0‡ï Ã_Ä „5 «<~\ZSQäBè|Éïºû,~À¡ƒ14t‚i~‡@Ÿ°6½WYY™>ü“æóoý»ÇU÷žÌô÷û—Œü©T*}ÀEû[A ´øÚœï¶eBA yôŸàH|ܬ%uþÛ[lŠ.‚ŸïÌÐ5¿Øsî‘ý®‘ÝúûƒØN$³ÿ@Ï> :ûüæ{ºúzTTT'yÀïï¶É?™øòu+–Ê~?¥±X,#ùí´mm>؇[skóݶl(,@ÈbôêH¯š"[¦>~¾­ÆëÃeµLóµBç¸Hþ ÷=È4?¥¡å÷í݃ÁÁAs1°‘“r O ~F***`Ä4˜ÙÿÄã›T×ÈYôëŒû?>>>aò—”–¢&PiàÉæol|¨;ßíˆÂÀRù>:•´u Vjlq]cšÏ¿ÐEòßwÿCÍO±{×. ô§Uðµú„`hllBeU•^ùE˜ýoþ¦êV;Îðú~Û![F£²Å•”BQ46˜LÿXʯ F ¶-h§|x0%‡ããRŽ>1ùÅ:$— ÖëGg]£îós„æ»HþûøzšÏÿö›o ¿ÿ8Å“VµGtUÊV@ss ªª«yãxz/EçæMªnµãl€ùc±˜i˜oNÚÌUóú•øó]^È?# ×þFRI $âF¤Ÿ“ÁN0ÍÿÁº&øˆä[¡y‡÷¹FþÚÈ¢ý<‡‚×_}GÇÃRìF÷‰6PB0sæLÔÔ$ÍÏÌþǾù Õ­vœ ÈäO$Yƒ~NQÿªª*ˆç‹3Äô($°`d8‹²¨7±Dú‘^þ»ÖçÇŸ×5ï>?€P»‹äèëß`šŸ€ÐÛ;w¼ŒÃ‡Ããñ@Ó(Ñ iìÚí\¶Ö6Ôi£ú¾ùèFÕÝÇpV  ù“ɤ©Ë/Wò{¼^kÔ¿gˆé/PH C|éC¸øzù>¾Mµ>?>ÂÉÏvb>ÿlÉÿõêš_÷å—^Boï!x< 4MLÅ„¥é<ÛÚf!P[ ÙìÐùÈ7Vóñ ¦3®»þ†.KùS©”^6}"䧔¢¦ºÆ”î‹3Èô(ˆ±ÖƒûÆÇ@ŸxDäþëi0`S‹_S׌R©0"B³\$ÿà Bž¨ÀŸ^|==û ª»RªésDZ|rÍô2Íž3uõõü" „Õð{ä_Wó÷D¦'8ù— ÂRJ'N~ ª:dZ&„tä»EAHó¬÷óô_A|YÔûüøx]3J8ùù'ÔÚ·×5òo|ä16Q§˜$‚üñÀþ}{9ùé—GÓ¨I´Ï‹3fÈFÂéÜøðƒj¾ÈtÂu×߸îú¶BLäD"ú Ÿlä×!mO$‘fY&X}ç]÷òÝÞ‰ PÀñEh+„5PïõcIýL”x<ú¨>„fºHþGÝÄfì!$ Æ"üî¹ßbÏîÝá5I¤LB€R óç/@ƒÞu€Wï}øë¨y{ Ó"àGé8òÛîC)úû¥ª¾$@Y“ï6Oyƒm JŠ÷ÅÆ÷áóãÚ3 ³Ÿ‘/Ôì"ù}ìñ ¸æëž}v;vïzÛdî›…€Yó/\t›šäÓ† !=xŸêV;Î\¿âÆŸN=èD~œù)¥ˆÇã8©ª«ï¾g] ßmÏy‚1MCo,j»SƒÏOHäš¿ÑEòsÓAÈ>?!øõ¯ÿo½ù¦ôRhi„—ýÿóΚ›[ô™\„ÙÿàÔ|=€éˆëWÜ°_&2™ÄØؘ‰üô4È/ö?~ü˜ìÆ1Ï\È( ›ÿ}ñÌä/‘ºÏjèÝãùÛ¼%H˜)©ûü¿úŸÿÆ›o¼añù5]X] .¼­­­FÍ?>E÷÷¯Wóv÷§!®_qã2®ùy’‚D"™¦ù3‘ßÑ5°ì>n@ ðâX}Ï×Öò}rA!€ñ¥×Æü·#?€P½‹äßüÄVÃçÓüÿý‹Ÿáõ×^Õ_(ÙŸ´ÓüÁK.A[Û,“æ'@ç}îUówë§VÜ°r=!¤KÔ`Ãz£Ñˆ³ÉïíÏüG€3.@Nÿ§ŽÁ¶íö‹åÐу–f.ò?¾å[zz/¥TÓð“Ÿ<ƒ×_{ EQ ((ŠÇÇÃ×±õ‚÷\ú>Ìio—_¨0€Îu÷Þ­æóþO'¬¸aeÀÓFW{µ£Ñ(âqVÔÓ^JKÓúÖuiä—Î'>ííí¨ŸÑ`!dî}뿦æûÞdB¾-€¥âËp*Ypäâïþ>Éç€gžy;Ã;,]|š­æ×4 ïyÏ{Ñ>w®|Ú0)’qÃ_é „ìgä"`tt”‘²Lþ 䧔¢¯¯OžÜ3@Pø±€| £ú¯ü+òoÙúdPö#àÇ?úOìxùe)Øçü¡”âýøæÍŸ¯×&>ÿº¯}UÍó}Ÿ6¸áƯ¬° ‰×4 ÃÃ'‘J&l‰ªù3ìFÑßܘ͗Õî{0ï{” ùNî_öFÙøÿB!?¤‘bðƒÿø>v¼üOýdû±—€a}4ÙâŽN,X¸bÄ( ƒÎ{î¾SÍ×ÍžN¸áÆUAH9ýó¿cããˆDx- ‹)˜§îÎäïËÛ­>¿ù…à?p MMÍz˜°>ß÷Ë y³Ût@2­ûâÑ‚#¿X÷ýû.^|áyS7ŸüÐS)sšoGçqÎ9ç¦iþ{¾z‡š¯û=pëÖØatñÅèè("‘ˆ£övÔúš–“æwÚ.{#c=  dõ}÷?È÷=sB>-€ñ¥?GµÇ[äÿîwžÂ‹/<Ï5?ÓîöšŸ ö¹êÏ?‚óÎ?_&… !wÝy›šÇ{=-pãÊ›:À´~»\K%‘H`ltÔ†VYA’ÿù?þ„STß(¸æcÇ;ÞqafR¦”vÞyÇ­j¾îótÀʯÜÔ6IçR±NÎêF͉;@NÄ·®OÒ¾vûØ‘_|.¼è"´µÍ J™[ˆ`^,kúï¼Ò ë.C~úÃyûìåÓ iÆ÷k>¶\xóù)é¡@ç·ß¢æãO¬üÊM0z<|š‚x,†‘‘‘t­Ï÷I6Ý{Nß"ýò>NäÁá·Þz ³fÍy¢G`}¾ï©y±Û,ƒeî5 E~隟-¿ó]ïÂ’%ךÓH)E$í.++[~û­k{Ü»»g>¾²juŒ0«!b •Ò022Œ/à˜«De#¾øëø}1m³î“¹÷Çï|×»0§}®ˆ© dîW ÌÌW `±Ãú‚%?É þ?‹ìxùeœTU,îèÄì9íØKY^VÖAýy,JŸºãö[ºÝjÛ™ˆU7­ @">[kÌ–‰Œ±IT92j{ö%m=uXgÕú¦m¶~Êq̇Øþúk¯¡½}®‘P€±€|YûÁ €J(hò ˆx€]ÆŸ¢(߉ˮXŒšš#Ê ]uSJ7ÜyÇ­ÝnµóLÀª›Ö¶ƒ‘~¤ç!44ÅÈÈ°©Z¯NräF|ñשkÐNë[—e?•Ò2X)=ä=—¾óæ/íQ 0·bB® ^ýg‡euÞÉÿ‹Ÿÿ?ÿÙOs:ž tW@ ^|q¸ìrTWW›5{™z(ð8€Ð]ô2¸›VßÜà‹`Ä7 ‰btt©TÊ–ð¦ï‚£æ7ÈØ ÷°&{ ²Ö€AþTJCyy®ýä§9, ÙpÇí·¬Ï÷½×ï³Û?8ض` XDWÀUòºè‚ˆŒF£øîwžÂ+;Ã9Ã)`]¾ð¢‹ðþ÷_†ªêêôî'”Ò(}æ«wݾÍÍ{/¬^ss;X45Ò­@B066†‘F|v»Ì¥¸r%½ü×ëõ!•J2ab¤ï“Éì—5¿lö§[)I@Ë—]~.\dê¸ýÖµj¾Ÿð4Œî×É/°eë“0!°T^ß½ý×øùÏ~Š(ÏLÌ„ìBÀp.¸ðBœÿŽ ÐÚÚƶ䣃ÒJé6OÝýÕ;Âù¸'S…µ7ßÚ ƒRº’ЕA)ÅÈÈ"‘’ÉdÚ6i!m=Í"jž bp`@·*2¹vÄwŠ˜SÃÍ ¢¢õ¹Ï#A ·Ýºv}¾Ÿ  žVÞÈ/cËÖ'×Àl‘ ··ßûÎSèí=”ñX9?@QHF! –›¼ä˜;o>Jü~«Ë=º)¥Ïüø‡?èÞ±ãe5ß÷i¢X{ómA°d¯/ÚLë1TwddØ~F'Í줘€žÙÚŠêêjý÷ÌèÇÑ#G²j~³¹ïHeìX¸èt^ùA¹DÏm·¬™‹€«€§ÿnG_à¦57w,\¸¨ “4—¸€}’õc„((++üyóqî¹ç¡eæÌ4!À<ð,¥´ûÞ¯}µ;ß÷Ë·ÜzG@RºŒøíNûjZ ‘H#ÃÈÇã¶ûÐ ä——AEEfÍž Çñšcˆ>ý÷‘Ã}°h}jÒðNÑ! Ä69%Ü ÿ"t^ù!™ü*€ÎÛnYÎ÷3Ü› ‰üN.A.Ö€}PÐj¤ ±_uu5æΛE‹ÎAm]Ù7…M ›7 JwRV[ ¼~Ý=ª[÷êÖÛî ‚<ÐÅì¯P¥6Ê^Ó4Œ!26†Hd,ãùs%¿ü]×úZu­o"~˜°1ËØ:ýé!£÷Ð!;vÔ’äcÂXoo :ù÷ÀÒúÞ=ÛòÝèLزõÉ¥`‚ ¯Ï˜ˆ`bZ&„Àãñ ºº³ç´£¥¥³fÍ6 À;—¨”Ò0w€R@Xwÿ}ëºsiÿwÝÓÐv¾ØN)ÚÔPJƒüž³T ™H`tlãÑ(ÆÆ2“Þé<¹`ÖRmm-š›[àñxLÚÀfzð>õî{Öµ‚u+.íƒñX {ö£¯¯/- ›üVÍo©T ‹Î9×jö«(0òy®T¨p²¢Ñ(~ôÃ8æ Í>1! è³ËعÍÍ-hjnFcS›ì¬ûh¶¸(›.0±•*SPMÞfn«1‰¢‘"‘¢Ñ‰DÚ Èvp É/­/--EKËLTTTX‰ß`ùCÞ×m=÷×îÝЖb¼LŒßÇcïž=èí=h Z‰Om€sNÁk~¢È'k`÷î]øÅÏ~ŠÝ»w¥cpD²ì³ †ÚÚZ446! ¢¢õõ32wkYÖËeA`¿ÝJBã{<ž@<Gdl ãããˆÅÆ‘H$&íÞ§‘?}x<´Ìœ‰ÚÚ:°’€ÍÙª-ß»þþv"8V$ E"ØõöÛ8p`šKÀ,k …sÎ9W~è*vì„* ”üú5á n ¬ƒMy§WvîÄ~ôœ4­wfÀÌþt`g Û‰¾]ü­¨¨DyEjjjà÷ùP]]櫦àsNL@,ãå´˜å“J¥BK¥ sÞF»Ÿî ek X„¢(˜ÑЀ† ðxlvNünk|`Cx"¿»~Ãí„u d™l €D"¼ñúkØ¿o¯mÏ€¡ùÏÅÏ òë×YDvðä¡Mê<ÿÇ?àç?ÿ©Iä&ÌÄvr ›÷Ñl±Í8ŽèûJõêAAYYÊÊÊøXu}FŒŽŽHÓ¢¿Û-K&vƒsp<#~C£ÉÏç?§XûÀýB§óœï»ÿ!&€e¢ßžÝ! 26†¯ìĞݻÒ5ÿ¹çáƒºÊ Køé¼õæÕáÓ¹ž©FQLÜ-Ø›n.« ÈDøtÍŸîä"dkÀ|I[gýÈû0m˧$²lwòý­Û=ÑØØÄ»õLòEK«ÞüÀý“7¹Êý>ÜNYGød¢âG aÂrÇK/á­·Þ„¦ifò³}ÏòEpÊزõÉe`‚ `ÝöÊÎèÞþؽ{—m`Pô˜µ¹,(HVAàd d™…€±[AI8­;âûKJP__ÆÆ&x½ù—Ä—€ Ü¿¾gªžóC_ÿF;æX‚…###Ø¿.^bLUÇÍþ3ü@Qœx|` LÃW üè‡ÿ‰îíÿ—¦ù3ûøfR; ‚tÍo瘉ŸMˆb'²@ÌÂ@,Ë­8A È?cÆ ^NÝVЄl¸ÿ¾u=n=ë¯o|Ô,”Òz!-«8ƒÈÀ¤€ ‚e° p‘3 í´~6ÀÎÈ,”4­®(le«• (D_/®ÏIH_êmv 2rv®ÀÌÖV6“’!¸L|+6>òXÀ&BH‡dòŸ‘äŠ`Ò±eë“]àÃ[_Ù¹ßþǿ׷Ùk~gk@Uv¬=Næ¿Ù´·×üéû¤k|'`ÝOn£Ý÷l°v=Κ5³fÏ«¶X{߆{{òý|ytSYÇg"R !·¬½)œïëš(ò=/ÀtÄñ¥¬¼Ì´ÁèGÖç—àšXôݳ¿ŠBP¢€RbÚ­£PE?ŸY°c)5ošO)#<; DKÓøvq£7¤}Ùw}m÷sÙ%±õú7PPC»;7¬ÿZO¾¬ŒÛn]Û  û››žè ž‰äŠ`*Гi##z Ð+ÕZ—mWL‚@he&Ä:¢ ñRª[â;#´JÁ…¹o˜ýƹ2›ÿЯC\k¶˜€Y8Yö€RŠ‰1¯Bã–µ7uçûNE0ùèÉe'£š-,^hp…¯··Ä~BË Ë‚Á¨]ȦQ(ŠLx*‘W±Õú†@0¬¶Í,Äþò߉BvJËÊtAUÄÔ¡(¦õuõ·kšf"< “È°ì¬AdaÈ‚@¸æ ¡r<&Aa€5ø—nþkiæ¿UógŒôcŒcÕ|?Ë銢˜BÔÕ×gÝGV^ŽÊ¦½a Pªq3_±h|ŠÆÆ&”––b``ñxÜd¤Gû5‹Öw@-@€“êɬæn¦Ú]NêsçûYNWÀäCèærTÌ|Ã`û(ÍÏÜM£˜3gþò³Ÿ3òýù¹ûz{õß!|ýèèF¥òÚÍÍ-iûTTT ¢¢Âä¥?Ûýkô?n2ñ³küÜÏy`NSƒ¢˜d¬Z¹"¼e듧t¬°Ø|ƒŠEk®‚Õü/-+ÇG¯þÓøü\„ ‚Ö6VƒÐ±d¶ôûvµ÷ˆ´þÝï¾ÿóË_èÖ…¸6Sí´þ6¥TÄTÄÔ¢(¦eeå9H/IMõ~}AzÑÅ'ÌÿË/»@’ëÀÏ'ФúzBJM—øyä}+++qþ;.ÀKú“¤ñs`]—­øGQﻃ¢˜b´µµÙÖ Èf ó_áëÌ™3ïyïûèdß|ËÍ«×>úØãAN©a} A@Mýìú:Â\˜°&`åÇÖ5”Rœ{Þù8xðŽ= ÀZ{ÌÈDgû ,0¾z×íÝ.>²³ EPÀ0‚€væ¿‚²²R\ûÉOé}ÿ¼Ø°IIÝvª×ñðÆG7€Š P¸ìr<³íi$¤‚žrL`b@‡ª?drâ EdF±£ujžÌ“‰:sš–B*•B*ÅÆ ðCW¡–ûÊ<Ò¿üæ5«ÔÉnÌwܪB–B ‚ªÊ*ƒ—ðkÒô1ñæk4–34Óþ©T MPø@›¢˜ZÀÔ@Š“ÊsÏÍ;—_±XŽÈ‡ÖÜ´²{ªtÇí·l!Û@ˆ¢à‹.F ¶Éd2Àò'™Lfý˜kŸ5)©ˆ©AQL1.Z4©ç£”¢¤¤ŸûüçåD•²vªÛ­UóÊ+?”FÞL צQ‘jÒ3Õí:›Qg :¯¼uR–!!dùêU7ªSý»·ßºV%Àraš744à=ï¹T"oRŸÏyÚlç8‡¦iP¸»¡À”¢(¦=SuⶶYøèÕ“Wm[µrÅ6·vÛ­kuW„àÒ÷½õõõ&ߟ}OZBúǼOR?GUU¥l¸Õ´³E058pú§°Ç_á‹ò¢ ÀõY–¬®À‡?z5Ljz€Òøh<þIß—­«¬ª.Æ\BQL1êê²ÈW_ó1´ñÌ>Žå«V®PÝnÓ­7¯VB– 3½©©ïÿ¤8€“0HÙÞº¿ex²ëí;›PSŒ\å‚|›þVܼö&£W€\¾¸ i&}.9~ i)–¡h€ùjãÙ€¢˜¨“}ÂB0ý­ „¬•]¿Xz­I³Û™ýö®€ùSRZZt\BQL “y²B1ý­X»ú+=„ ‚¨--3±¸ãÊ,]|™\ö½¹¹¥(\BQL1ÊÊÊOëxÓ¿;Ÿ¦¿knZ¹l:.Àû?pªkj2šû™]ÄP¦¢˜zÀ£­­ _¾îtt~ЮÌuV¢éo…è`ãÊðéOÖdÞgî÷7\ææ|ðCŽÖÖ6¹¬Yw¾Û7Q ä.ºøb\tñÅØD›¯ì c÷î]ؽ{WÚÄ¢2˜Ð0™þV­\Ñ“ïöX±zÕ=[¶>¹¬^>,\ˆË.¿ÏvoÏØ_WW â‚‹.‚ NÛZ*bâ( €©AÌ,î°n(++Ã¥ï}.åCxO â•Wv2°k—^; ®¾W_“fúoÎwÃœ°jåŠÍ[¶>¹D´ù#½;wî0 ¸²²r,\´]t1,\˜k©šï¶Mg¬)Ÿ1¨Àbþ7˜í˜Ý»waÏî]X°p.ÔǨ.)Díoio;€àÓ¤íÞ½ ¿øÙOqÑÅA,X¸ÈjÍ8! &<Ÿ-¤XÇtEQ¸N¡=ÇCײö·´q ؤ©¹¢œð`¹ j¾Ûp6¡(òˆ-[Ÿ ÂKvë^µrEg¾¯u‚íÚ÷‡C…™ð=ù¾Þ³Å@±jåŠ0˜É»¶l}²Œ8KÀÜõÏkÁ\n„çûâŠ(¢à±eë“n!œ‘زõÉ¥[¶>¹4ß×QDEQDEQDEQDEQðÿ‚¦G-®Øe%tEXtdate:create2019-05-04T23:15:37+02:00¤‹‘3%tEXtdate:modify2019-05-04T23:15:37+02:00ÕÖ)tEXtSoftwareAdobe ImageReadyqÉe<WzTXtRaw profile type iptcxœãò qV((ÊOËÌIåR# .c #K“ D€4Ãd#³T ËØÔÈÄÌÄÄË€H J.êtòB5•IEND®B`‚assets/img/dpro-brand.png000064400000056436147600374260011407 0ustar00‰PNG  IHDR\åGÈöä pHYsÄÄ•+tIMEâ 2ŽJ×{tEXtAuthor©®ÌH tEXtDescription !# tEXtCopyright¬Ì:tEXtCreation time5÷ tEXtSoftware]pÿ: tEXtDisclaimer·À´tEXtWarningÀæ‡tEXtSourceõÿƒëtEXtCommentöÌ–¿tEXtTitle¨îÒ' IDATxœìÝyXT÷¡ÿñ7Ã6  ˆ".uиkÔ¸%šDm"Þ$jÛš¶1½û³IÓäÞ&´¹mºæÖ61IkåIšÛf©ÉM"¶WlÆ-jÜ%ȨWgÙ„–ßÃ,€¸ J>¯çñy|—ãW__ˆˆˆˆˆˆ\{†Žn€ˆˆˆˆˆHg¥À%"""""ÒN¸DDDDDDÚ‰—ˆˆˆˆˆH;Qài'¥¥¥Z¦PDDDDD¤¨‡KDDDDD¤(p‰ˆˆˆˆˆ´.‘vrîê²2ª;º""""""Wᆠ\Õ»—3ýž{¹óŸRÖѹBÞXÓŸfÆ/wx|Öo ÿö½…,ž1ðëШ ðXzB¿(¯ÃùZ”ÿ!ó^†…@æþñüdLPG¶FDDDDDn2>«Qìí÷3Óe'ÈÚ¸™÷žßÌÇŸ¥°þ¿îhÿÐe~ˆU›jï³\Rî¦w°`'mã^žs;Š\"""""ÒV-)ŒŸ¾'þßžxöEÖüý5¾ åëÿ̆üëغ•Íº7ÎÂÀû™{;°ö#²4¾QDDDDD.CÛæpbêGÉ/°ññ““=þi>>S@æ/¾ËíãŸfƒÍY¼:ÿŸ,{ò߸}üdFOù7¾óÓøÜPFæO'3zü<Þ²xž"÷/ó=þ.~½»-gôøÉŒþ}¶G™–ë…¿¿Ë§Þêí¿eôøÉÜþ·z,ï0küdæ¯9Þê%Wïþ;«í0lνóV`3o²y•ÊfÙøÉŒ¿œÕGxwÉ×=eöZwÀ³ ¿æ¼–»¿É~ÿOòÜV©Îÿ'Ëþã»LŸ2ÙÙÎ{ñëôã®ÅBÊ6ýš;ÆßÅü¿dk‘›PÍ(ÃVè3§êà_ÆÓëbªêCËùÆÃ?çcûÝ$¿ò¯ÿønØô*‹–¬à@u8·M¿8ËêíGÜj9¶µg!ð^fm~Ð^ëõBâ„{³l³¸ŽÉÝþìÛ×ð™5/ôdæÐ~­\o5»7~„)|sz,½¦?ÄT`ûšÍœi¶¼u//æw{ÊÁnàLúÓ$}ÿOä÷ZÈ‹|ÿ½ùïÿœoüç?±6¶oM Ÿbñó¯‘úË'˜u”´_>ʲ݊W"""""A‹s¸š”‘›þ*+?ú-dæP÷};HÛóuRÿ™ÊmáÇywÉÿ’{2Ëï#€Q <ËÏ¿Ë{Ÿ-à7·ßË\þEÚÆlò¾3€ül6@ì÷à¶fóÖqVÿâõŽÏ >"ã³#”%ÅÎvj'¾__òì%¿ì«±ìÙ_gŒ¹µKÞÌêµÀw31`<³§CÖÆÙ–ÿóâ½øˆuɤ}z A@Ù§üì¥D=¼’¿ühˆsÞטQÄWÏãüë,÷ð¨ÿý#V…7ΈÅmñv>ò'Ö}v”ŸŒBø?áÓ?¹ô—HDDDDDnH-®í¿¼ŸÑ¿tû l /¾²€D¯rsŸz¼!lù{Yw8žÂŒñ)>u–•Ù!hÓ„´µg÷™Hèy{>ÄBO~0a`óiK½áC˜x;dlÚKw0²˜ÿ9Ƙïgæ·À~„×~ø*»[l›ˆˆˆˆˆÜLZ \ñÓòD’oXhUX?Ì€%¨'‰cFµ¸||ÐÐ{˜øi›öR6ÁNf6 ûñÝ-÷:µ±Þ„¡÷ËŸÈ´ÐkÏ¿ˆ¾€úrÛ,øŸ=GÈßÁnÆóó¡­,lŸ¿ƒÕÙÀ»ù»l»ÿ—uÙfõúN®ð(çqeQý¸mLó½ve›>àŽÃ„çßå÷9ÿ¸^ô,""""Ò‰´qÑŒ6ŠÈmÀÆw¼–¯&o{¶k±‚neæ¬@øt3oüÛ¹•Ù·Ç^}½æQL „í{Þ!s} ÓÆ ‚6ánø,›ÕÛ7ÃÀ) k%G6¾{kî¿';—Åwû“üï÷vÖmü¢ÕQAæ!L ÞømmlÛí\±º¬ÜY6°i’¼=ÇkñF¹‰]ÛÀžûüxù‚”G¾Ë³ø;Û2>ä×Kîgî*÷e؃¸-é~ÙÌkØ·?ÀÔ^×¢ÞLœ¬ýˆ4û½Llè\ ï7 3‘¶ÖNìô!Î…:šÕ°Z"w3±™ÕƒFOa.`_û!ÛZ늊º›Åßî öXzßøõš²-}Ï.ø:K79ƒV´y±@ÖKÉ,Kÿ'ÿþ,J÷Q•Z^DDDDäævDÏøé|œ©±gÉøk KŸÿ»ÃîåÅÿ7¥auÁCïa^ »¦ÎòÚwÅõ6ôfLÏ°ÆÌ?„™±½^Í«Þý!+ €;¦4-â.h§ü‹uÛ[K\A ÿ+ùÛó÷3,0›´—~ÎÒ—þAAüã¤~gˆ³ˆùë¼þ㻉g/ïýriöûù˯à2qŠˆˆˆˆÈ ÌïÂ… õÝ‘Îèš÷p‰ˆˆˆˆˆˆ“—ˆˆˆˆˆH;Qài' \""""""íDKDDDDD¤(p‰ˆˆˆˆˆ´.‘v¢À%"""""ÒN¸DDDDDDÚ‰—ˆˆˆˆˆH;Qài' \""""""íDKDDDDD¤(p‰ˆˆˆˆˆ´.‘v¢À%"""""ÒN¸DDDDDDÚ‰—ˆˆˆˆˆH; pß8zôh«…Gí±½gÏžNQÎb±P^^îSÎl6vÉr·Þz+ÁÁÁ®íœœ.^¼èSnðàÁ„„„¸¶>Lee¥O¹AƒêÚÎÍÍ¥¢¢â’í;räeee>åHxx¸kûèÑ£”––ú”0`]ºtqm;vŒ .ø”ëß¿?]»vumùå—”””ø”KHH 22Òµ——Gqq±O¹øøxºuëæÚ>~ü86›Í§\¿~ýˆŠŠrmŸ8q«ÕêS®oß¾DGG»¶Ož<ɹsç|ÊõéÓ‡îÝ»»¶O:EQQ‘O¹¸¸8zôèáÚ>}ú4………>åzõêEÏž=]Ûø”‹%66Öµ}öìYÎœ9ãS®gÏžôêÕ˵]XXÈéÓ§}ÊÅÄÄлwo×vQQ§Nò)×½{wúôéãÚ¶Z­œ8q§\tt4}ûöumÛl6Ž?îS.**Š~ýú¹¶ÏŸ?O~~¾O¹nݺïÚ...&//ϧ\DD·Ür‹k»¤¤„/¿üÒ§\×®]éß¿¿k»´´´Ùÿ»ºté€\Ûeee9rħ\xx8tm———c±X|Ê………a6›]Ûäææú” eРA®í‹/’““ãS.$$„Áƒ»¶«ªªøâ‹/|Êsë­·º¶«««ÉÎÎö)Ä!C\Ûv»C‡ù”3 6̵íp88xð O¹€€†îÚ®­­eÿþý>åüýý1b„k»®®Ž}ûöù”3 Œ9Òµ]__ÏÞ½{}Êùùù1jÔ(Ï®öÿüQ£FáçççÚÞ·ouuu>åFŽ‰ÁÐô{Èýû÷S[[ëSnĈøûû»¶8@MMO¹áÇÐôcöàÁƒ8ŸrC‡%00е}èÐ!ìv»O¹!C†äÚþâ‹/¨ªªò)§ŸIú™ú™ÔÙ&™L&]Ûú™ät­&AÛÖ4rÿ:»Î×ê""""""rÅü.\¸P߸јȽ“œˆˆˆˆˆˆ4¯±çK=\""""""ב—ˆˆˆˆˆH;Qài' \""""""íDKDDDDD¤x¬Rèþ¾ i»æÞ+¨.‘v¢À%"""""ÒN¸DDDDDDÚI€ûFã’GÝ!¹ÖJKK9}ú4v»ÚÚÚŽnŽˆˆˆˆÈWž¿¿?ÄÅÅuš5$sÔ€|öø|ÒI4NX‹‹‹ëà–ˆˆˆˆˆHsJKK;MèjI§RXVVÖÑM‘6èìÏî2pvtDDDDD¤ :û³{§ \•••ÝiƒÎþìÞ)WMMMG7ADDDDDÚ ³?»{,šÑYV'¼ÔÖÕâo𧮾Ž#gSW_‡¹× 5ößCÿžf¢Ã»PW_‡Á¯Sf_‘N¯1G5.Üç®Ó®RØ‘Ê«Êø,w3 =`¯©fÅÿ½ À½£ï§èÂY2m`RâTžòÎœ?Åù2ãÍ“ð7øwpËEDDDDäZRàjŸ~ñ/þwÛ;„w!ÀßHEu9ÁƲePi¯¤¾¶å~Šµìŧ±×ÚéÛ=žÞQ};ºé"""""r uÊÀU__ÝÏùiö?É9u^Ýúò=l &¡GFß2žÞÝú`Äß` ¾¾ž‹ö‹|Yx„Ïn§¢ªœ‹öJ6ìMç¶ã))/f¼yÁ!×ýDDDDD®·Žxv¿ž<Wã’5—ëòÔÕÕràø^¶ÞDßîñL:¸¨¾”_,'çäA2ö¥S^UF]]-þþF"M‘ôN`â ©L|ÇÎZ8¿›ÌCÿG`@}»Ç“ÐÃ÷-Õ"""""rãiÌQø>ÃwÊ®ë¥ÚQEQi!%åÅœ²àŽ!w3ú–ñäœ:ȇ;> ðBvGµÏqg‹Osøt6!¡ôŽêËè[Æ3òwø¿}ë8Zp˜œS‡ˆîChIóºDDDDDnb \W!çÔ!~÷ñ/©­­åþñ1iÐTþðeä½ä±õõõTVW`9“ƒåLã'óý¯ýˆ¿d¦òÁ¶·Ù¸=ýbúóý¯ýˆÀ€Àëp5"""""r­)p]…‹öJüÜ;ê~úFÇóßkŽ¿ÁÀmo'çä!bºö¤Êq‘ššLÁ& ŠÏpkŸ¡ìÏÛCˆž t rIÌßCåÅrfÝ6‡ºzçvm] Ž»—ˆˆˆˆÈMJë Ô××Stá,‡Oe3Á|#nãÏÿú#EÎÒ%´+ÃãGq¼( •% é;œm9›ÔgUtïÚƒz ¦®†€ ÂCºÐ½k ¶2Oì#ÀßÈ㦢ªœóåVÊ.–b ëèKwÖm¬Lƒ¹‹'ÝžçÉ]MJš¥iÛ<—äy‰m+ DM]Äâ‰-´Ð½|ÔTµx-V¶­L%ËÖ†:Ň×ÈØ—Îÿn—®!,ùÚxýÿÍÙâ3”V^`÷Ñ$ö¾•=Gwâo𧶮Gˆ°Hjêj€zjjk¨­«¡gd,åË9Wr€}ùŸÓ-<š9¾ÁëëËKkÆÝÃïeÆÈ$õt‰ˆˆˆÜ(¢'²xqûŸ&÷ ÌMNƱrYr\i.rYm¶6‡!붕¤Æ¢äy— Œ¹«S98lÉ£A35‹Ü‰óšmƒøò\Z°mêë먫«á¡Iðù±í®°Õèè™\Æ'N¢Ê~ƒÁ€ÁÏ???ΗYéÓ½Fÿ@üðÃ`0Ppþ ýbèjŠà|¹úúz>ýâ_ î=”Û§ðÉÁÿããÿËÄAwÒ-,êªÚ]”þ,KÞ:âù¡q$O­xžÉ‘Ícùóc<·¾Äë§XñüdZ8ä+ÂN‘e+[Ò3É°äQr®GÃcDwââ‡0iòL&O2£œ,""rÝå®Náà°d\A¹«IIƒ¹ÉóHl±ÇÆhzMµ‘•esöúÌ…´Ô,ŠºÊæ®N!«—ûqi4ö-™ç6ž×Yf ‹÷¹pÇ\·vzIœ7Ïí¢b1c^³%­X°¹mèy²n#íà°Vz´<ËfÙ¦2w^CÉè(¢8Óú1_A9ª´´ÔgŸz¸®@t—ŒŒK¯nqümó[>û Ö²sÔÕ×ñeÁº…wã”íÅåçÉ/17Q_VgŠkßa“œ×e:iÍç{>fúˆûø̲… >eÊ.–r(ƒ?gΟ?(­,Åß?€“ÖãÔÖÕQWWKeUø‚zÀϳŽ#gr¸h¯dì€ X r¨¨® kèÕ†.3 žšAæÏ2¨tû´2#•ôY¯2Ç#Ø9ôÁŸÉöª!î[K™s•Í¸‰mx–'RÐ|ÔjŽƒÓû,” À%""r=EGEa;h¢±nËÂ6u.ó¢Áº- nÁ3Ãlg°™ç:‡Î¹XH[¹Í+¼Ø8c‹bXC}u7œ¸©¨¡¾ÅîI&*ª©žè‰,NžxÉkIœ—LrC¯ÜêÜ–zÙ—œìÚÊ]BÚ6s3à aqê¢Å4î²n[IêêÜfÂ\3½f­ö²Is<Wyy9aaZ¤¡9¶²sü%s%•ör¢»vçЉ}Œ8‘ÀP‚ƒ1Œøûàï¿!ƒÁ€PçöölƒŸºú:5jj8j8jTÙ/Ra¯Àn¯¢º¦šjG5GÎfDühvÝÊëÿo¾3m1½£ú^Õ5]ÀÒI™ü÷V÷ÈpšÞÚÂ4÷a‚§ÒIͨô<8bKç|ucCÅŽß_fØ‘Õ‹(› «uiYQLuvga;csòç)÷ ó0÷(Ñb¬ÛX™’‚­±'È-täž±5Ì-XmØ¢zÕL}V›¨^W:E$š¨(Ú<˜ïrÎ}ûÞ#¦ÕÀei\ª¹\ž K 8aͧ¤ò<Ý#zÐ7(Ãgѳ{Oâü{SGþƒÿüýs¶ ~~¸w_Õ××;ÿPO}]µuµÔÔÔ:ç…Õ×SSã\ ¾Ú^Mum§‹OqkŸáÔÖÖpâ\]C#0‡að3\áÕ˜¿àQnMÅ}6—cßJ>84ŽÅCb¶¼õ§=Ž eêÒ‡1·RsqÞ2×f‘má\IC,1†Ò=Î̸I̘<ŠÞ¦æŽ,bóKHuoÐÀE¬øÍL<:ÓŠ6ðìÏv\´‚߸w¹ZÉÜŸexÔ>ã…4­àÔ–µ¼µ6“ìüÌà…´Å måz<Øw°òå­Í„-#ñ³–²4i “µìEäíÌàÒÙwºõxvMïÙŒH[<ŠöòÎÊwÈÌΧÄÆÐ8†Ì|”Å F¹ÝφûñÁ²OWâÀHÄI,xt!Óš9a ÷u)“÷ßIg§å4ç*€‘ˆø!L[°˜£šë µSth+[¶"Û’Íé’’¦ën¼öˆâÆÍ iÆdF5{ñ­|¿bÃûðÁÖlJ€1‚ø!ÓX°xÞͱüùž[ïþK…8]þ*IÍüN¡8ó¿øÞëÙm*+""7ˆè(¢lY¤¥ÙˆšÛ4$0ªW–ƒ¹Øð‰u«-fæM›-ŠfsJôD'G9çc᜚†.ZÙ––EÔÔd¢±bñ¨Ï»·èó·¬ÛX™Åâƹ«I³˜™;¯q3…4‡æ²z5Ì›×tMî!Ó³l4QQ6:ÿœmβ`ž:¯™²àìÍk(›»š4ÛTiµ 9jÀ€>û4¤° ¾8u‹”Ãä^w€ÁàÁÏ??uµuÔØk01®°UWWÇÅÊ‹„šB]ŸÕ××sñbþÆ×çv{5v{ Á!AÔÕ×Q__Gm]«*‰ˆŠ ´¢˜£¶ÃdŸÙOX`Wšð-üý¯ðË3“¥ßZÏ“ïºGªJ2RÓ™õêz[Ö²rŸgP0Ž\Ì‚QÍ>ùCEé/=Ç[ÙÍ„ G%çò÷±>uëßêθÅ?åÇÓ®ïSªýÜ^{üe²Î]yßTñÖõlõ9<‚/¼Êâ¡^÷%0†„É x~òŠöþ™—^jæ¼íqÏì%zçi~µ6ß#:*O³oí¯xâÐ"^ýÍLbNeòÒ¯V²Óã~8(ÉÎâõgöaiîšš±óõÇÉ9MƾS$õö¾×EìÜà5¸vȃLRعÁEÑ+ʆ%ÊsH_ôĹL]™JJJã'fæ&Or]Ã<Ö€¨†9`ž½Z‰óær0%•”¬†Ú\ÊæUŸ×ö¥æoEGeIójgã<++6D¹Ž¢—ÍûšZ*ÛØæ‹7µÙ»l4§šIIk,ë¼WšÏuyü.\¸àïvôèQàæïáÚ½{7¼&uÕ×׳/5vzFõj¶Ì…â ¤¿ÿwþíI„w w¾§«à_Z¾¤WŸ^>˸;ÆÒ5² 9ûc ÅàïÏ™g3i4ùGŽSu±ŠPS(çΞcÌÄÑÍžëbu%;~Æ‚Éß»º ³bå’Ÿ‘á±&†‘‘Oý‚qéÏyö0E+~ÓüÜ­ŠC¬|úWd´9̸èUÏ^©vîájÞåôp³áÙïy݈ûÖr^½’!–íuÏÚ nÈHì–}´zêÐY¼øöBÏÞÌ6ßWwFF>µ‚ç=–À¼üvûÞç+»vâeù«InséN‘þÄ“¼uºµ24ó}gdÒþ•×ò“"""ב#G3fLG7ãªìÙ³h¾‡ëJÇ¥uj…%>•Íž/w²%'“Šê 5-?¡†šB  &¼k8àìÙÚóÙ^†ŒBß[ú?0žÝÛ÷p®Ðʉ¼Sôíß—Þýâ(±•°õ“í ÜŸ[¨(¯äô‰–ÑÖÖÕÑ-,šjG5õnsÃ.[àP,š„g¬s°ïeï°ÕúB–÷_ö Fâg½Àii¤¥¥ñ·åO1)ÂóGRφ¢+oúõ—Åçá~^aO]GÞ³ÓÙ—[•™l±\¢ 1îQ^Xþ7ÒÒÒHKû+žš„G³q°oåZ|« %nä,ýt+þ–Öp|iû+Ë_x”qž•pzmF3u\Óéì<åþAoÆÍx‰2pjçzq“F)l‰ˆˆHÛhHa36}ñOŒ!tëEYm)Å•téÞò~€_Ó<­ÚšZ.—Þ% ???nIŒgïgû°²j ÁÏÏ?ƒ£'ŒâhÎ1»†ŒŸŸ‘Ñ‘œÌ;Eü€~ÍžÊî¨ÆhàÝÍoÜ…naÑÄuëÃàÞmžäb¿€Gî$õH+Oà­-”aßAz†×²ñq xjáP×â½'ó£[ØûÜz·•ðNº…™ [›ví œõS'™‰‹1ù.}ßEE^óÙ€Ðxâ®dmüö¼gÆxf-]ʃ“ˆì§Òù¯gÞÂóËk$~êb/˜„92ìElyýi^Þê±n%–¼b0·~ãf%1Ôõ­HÌäñÓ| Ϭm¤GåNZˆÙU.†™¿y›™ÍUh¢÷Ð$–>º—o¿¼Ï­ —lŽ1žK—òи"b k^ú/Þõ¸øsœ>îÝW1ãf2$õˆÛjœçX›aaŽë>Ÿb_†×lÆI¨sKDDDÚÊ£‡+,,L+£oGXH8 ½úÓ§G?ʫʨq´møW}}=uuuÔÕÕ¹>3øÀìÕüýýøÒ’ÇßÓ6P^ZŽÁ`ð,KË=WvG5Ž¦ð0Ìý!¸– û?¾² %†™K"®Åý—X(#{§Ï¼¦øã|—?7c²×Éʇ8å]®$ŒE•†­–ÄÅyõæ´Q{Þ³i²°!löNbÁ4ï¡©ñÌxxš3lÆ0ù¡ñýu•ÍwK7ŽPOΑ_Ñ|aû),[6ðÎÊ×øåÓóøãóÈü¹ža«­Í‰Ÿá š_äH3IŽó)vºÈ«›0r3Fz~T™¹¥©GíÔ><óVϸ>¿(‘›Gk9Ê#p™ÍfÌf=LôŠìCÉ…ªìU„…PSçàbÕÅ6[]UÍ…â QYáì58sª€èÑ$ Œ§¢ÜùðÞ%Œì}_Û'–sgÏa¯¶PVVFïø–‡ªU\¬ ¼ªŒžQ±Du&,$œ æ;¯üb{Ïaé¬æ£C« eEE>ý>˜ã›{J¾‹* IDATC|¼×GçÎáýJå›ÊéÓWÔþë}Ïb|*iF éÊÂcs"â||E…Wà*ÞËŸŸ}„ùßx’ç^NemFûòÏqîÜ9Zx—ô Œ‹o&Hz31n†×ÐZ·!•§v¦{önj± iFk9Js¸šJÿîf¾È?D`@~~~TTµð[zÀ^e§ª²Šb[ Çr¿ÄzÖʈۆ±kËn Š8’}„‘c‡Ó÷–>Dt‹ ðLUUÕÜ:|1±Ý6z9r9{º£ÑH¯¾Í/ÎÎE3Ê.–I]]' Ž3 çÕ­Íi~x)SC½?È£‹ÝÞËuÍUPao·Ê¯­˜ß^ÀÊ|N_ï†ÜD÷¬%E™ü×’_±þHeû¿Ï¬A2pü <;+ÉÜbN±3ãœGÙ‘3Ƶ㿠é\ŠÙµn«V­bÕ'yítŠ]¬[·‹Ë}$ÉûdWÒ¤šòÓظ–µkײvãNŽ[k.¿’¯ ÍájÁ°~£Ø¿y7ÕŽj‚ƒ‚q8ÔÔÖàµ{}}=3¸Gƒî±Ý 7DÏ>=©¬¨dÒô‰®¡„£'ŒàBI!¦îûú×0¸}ê8ÊJ+¨qÔ0nÊmC ½ÏU\ZLu„…„Sx¾€@¿`"MÝ®îbMq˜ã Ëce€â.¹÷UÓM3&ó@ïû“ÍÚÌSL»®/‚¾™îYsììxg%Ù^sʺLâá¤q 4Çi4Q‘ù,K.{ «1”i3BÉp{'Weæ,“Á}:ÆIÌwéåòED¤sËûdy ó¹+¡õrÅ»¶p¶çLæm¿_Õ= =/÷äyäÅp×åSÅéïðή"j]Ÿå³ëŸtö0ÍîOðeµá«Å#=4¾!Yó¸Àèo$4ÈD}}]Ã#(..¦´â!A¡8jìTÙ/b¯qP[[Km{Ã5w«àB-uuµMó¹Î9çdùù9çh ††÷xp¾$Ù`$ ÀÈE[9Æ ‚ŒA1ñ78ËÔÕÕQU}‘ À@ü8r2—»ÝÛb@ko11qà¹~–ü"êÔJ8í=’®{÷Ö{òó)‚K¿麈aÈä88ây§?x5£žgNs/ nP‘—ÎKÏæ¡UÎ%èÛõžÝìyÙ^Wg$Á•Ü-ìÛéÕ¯5n)¿ûñdwuµÜ—Ü~Ì“§ºÞm‘’Ê ^zɈûR"Z,CDDîšÏ%²PŒ3 µï¸ˆ’² L —yŽb+¦ðËz¦¨:ð!ÙUA·ôØ<†G@M!™ÿó&Û¾Ï;Q‹øÞįöÛ¹sTs<Wã’oö÷p] Ž•Ž ŒÆ@ÂBé,¿ÈžÃ»1†º™ºQ\~žŠªrì;5u5 Zر×:^\\‹~+ÖÕÕ6…-ÿüh $( ˆ  þþÎc àg0`4 #80„ÚšZ¢ºF;_˜\AÆü}ÂqL2fy,‘¿e/EI^ïϲl!³ÒóÐÐqCÝŠ0aòÎ,ŽLÞY3Ï1;WÜ+¶°õý ò¯í´YïI1ò—ñx´ãï>ó[g-eiÒ8bžÆíEäeï%ý·ÈÊw3šŽ¹f÷ìFTÌÖõ[=?2Žc¤ûpfïq„Ü}Fæ<·Þí\JJÜ«Å2DD:-ë6V[ÌÌ›ÛV[0ÏkåžŻX·¡Œ¡óï"¡x붔a¢ˆ¢†ßÆŒwö|å}²cÀ†U3õgæì]×ð`ê?“ÙÍö|å²z5Ì›—H®ó/´À@•½m‹y´‹Àñ$͈`ëz·¥Ž¼ÅK+cøñ££ˆ {Ñ^i=žÙa ’Ü^MÄÄ…Â>÷RŽ¼ûß{·]¯ í"'³øÑtžH=â•ä¯™gÖ·±žkvÏ:^E‰×~,Î#ó—X™íY&£W(c(x\ØÎ ¶wE6„—¼óòødÕv p O‰Líµ’”Õ<µ+SVCr A¦ØJET0“ùó#!ïV:J1c‰Ìû„U‡Â™9¾3<å}ª½yŒ½+’² b.§Â-¤9Û¹7o¬çpÉ’c¿àüë…]oò»=þÇMa^`«Â9‹«3VHüjwrµH«çË­t1uq.ÁlâóÂŒí?jG5*KØ}ì3fŒœÍ'Rv±Ôu\°1˜;†ÞÍÖ/61~Ð$ŸÌfÄ-c8˜·ƒÁ@„©ÖÒ"‚C()/æ–Ø–œ¥¬ò%ÅÔÕ×Q^UFXp8Qá1¼·ùM¾8u;o½‡‡&›w}@tÌ LÁ&*ªÊ:ê`^ð³vþŠõ®·é:ÈÏøK2Z:ÂÈÀE?òy‘²yò4"Ö¯¿¡W.Œ™ùs¹ÜØ›è8z¹mWg{f&éÿÜ‹Í•Äz×£™F  ® í7sÜ`"L‘ý=gÊ›{ ÁîøîXEÒmsØûå..Úã¤ê©ÇH|[éB]}Fú÷Èî£;0 î3„¢ …8jôŒìE÷.1XÎvÕÓµ'·'N!uÃrÆ ¸oÞ±ƒŸšZ÷¿ŸÜ3ÙìËÙCYu)£ã}_îzÝ™HúÅ*&åm!smÙÎ5Î1†Ò=Î̸’4m(1-.:`bèâ7Y1îV¾µìÓÎeÃC˜´` ¦™‰,Ú@æuº¤ÖÄŒZÈïV=HÞÞlÍÜÊ÷ëŒ݉‹ÇŒ¤iŒ•ÐüÊA×äžu¬©O-gTþ[¬ÍÌ&¿Ä ínf܃ñðÌ¡-ôÅ0ó7+ˆK‹·Öîl8ç±qãXðÔbFY~yW)lɤY“x=Ûs˜°ËéÌr±0—ädçü­¹ÉÉ-ÏßjJÎ5*Üÿž+ÿù®XQV OyŸì ¢ÿÌfÞ°²Í6Œädçü­¨ääVæDy‡#ÏE:ÂME4ŒntîÝõ GÜÅXï!‘¦¦ç”¼O68{â|\ú1aB ³Šœ›af&L›ˆÍ¶‹ÍùQа ܪTÑ"¿ .Ô7nœ={à¦ùñîÝ»8°ýúB*ªÊIIû)gΟ⑩ßÃàgàMoR^UF€¿‘Ÿ¹”?o\Á‚i ùûçñÐä¼ùÁÆúÇäó#;˜Y•GÂü»‚›×¶Ç‚@Ìxæß•@ñ®ula2³ÇF’÷É*v¹UÙP¦yUä®]IZNàÉLMUÕµÔ÷k|gÁèV‚ê¥9r„1cÆ\E ¯qÑŒž={úìó\]ºt¹~­jGí¸µvý KA'¬ùÜ?ö!ŽfÍŽUðcÂà;Ø‘»•ÛŽ'÷TÃâG²/o7Ý¢ð7r¼èKútÔJl·^œ-.À¨¨®àá‰ß?ø¿=ÓÅÔ•;n½‡©C§cðÓèOé@_…ÀeßÁï¿ýß+H÷(Ë_MºÁW‡¹\Åìr¦ÂfîhYyá¶gîä‹Â ‚»öeØ„iŒKŒ¸ê!s!p5*--õùLWÀèod¼y2#oË_3W²2ã–Þ÷|3(”ÿÝú6ŸúuõulýbõõõdÈ ¾¾žó ó­êë뱜ÊÀVvê¡KhW»g)PÏ›ÿüßö8cL 0 PaKä:(ÞºÞ3lCœ¤°%""üãÿàÂ… ׬¾Þ½{3yòä+:öСC:tèê±aǼ>2™LÌž=»Ùâa=†3}þp¦_ý™¿R¸®ŸŸt ¦´²„¿d®äëði‹Ù¸o=§ÏŸàbÃ’íõõ ˆõMÇ×7l˜‚Âè×=»‡ßGyUiÛÞ¥ÊQEB†\ïËùŠ:ÅÖµ^ëj± qsï½÷vt\†ÊСi˜Içæ¸ßÖ!¹Ùü ŒLKP@0íüÏ'bì€ y€¼¢c\¨,¦¦¶Æuœ1ÀH¤)Š„ý¹µÏLA&öåíÂZvŽ¡}Gb $¤=‘ëÆ’Áû^¯àÒb"""ÒV9ª9s¸Ž= ÀèÑ£Û¿Uí¨½çp¹«¯¯§¾¾{­ƒ”´ŸòåY ¦HFÄᶠ¥ìbÖÒB.:.6¼_+šc(Ör+;l%÷T6ŽZ;O&=Gb¯[ñóóSï–ˆˆˆˆ|%t†9\{öì`À€>û4¤ð*ùùùáççO°ÁŸ#fñi@0ñ=úsøÔ!²m$¦kOâ¢úŽÁÏŸ¢ …ì°l¥ðŠËÏ32a,}câñÃ@ÿfB‚:èD"""""rÍ)p]CãNbÔ-ã0™Øsl'ø¿eôêÖ‡[z c_:*K;`=#{qÊvœ‘ñ·±xÆøù¨¬®Ä¢¡œ"""""‰×5H`€sÒÇ°~#ùÁ}?&!¦?¦à0º„våh…‡&- 4ÐÄÄÄ;ˆ ïNxHW½KKDDDD¤Ràj'Æ€@F&4E½gø}Ü3ü>×ö­}†wD³DDDDDä:ò\ZPDDDDDäò´–£<—Ùln÷Æ\/¡¡¡\¼x«ÕJaa!6›ÊÊJjkk;ºi"""""_9þþþ„††E=ˆŽŽ&$¤s¬Ìݘ£JKK}öuÚ!…~~~øûûB—.]gò¬««ëà–‰ˆˆˆˆ|õ ‚‚‚èÒ¥ !!!øûûãçç×ÑÍjw2p9—j÷# €ÐPç2ë!!!ÔÔÔP__‰£EDDDDäZk|> !44”€€×s{gæ¸ßÜær5~Aƒƒƒ Àd2©wKDDDD¤ üýý p®Î 1G5Ç#pY,Fݾ-º¿xøûû«gKDDDDäÐØ«Õ™z·sÔ€|öuÊ!…¿ˆ ["""""7ŽÎ´Ú¢S®F_¥/¨ˆˆˆˆˆÜ8 Ý‘ÎJKDDDDD¤x )ì «Šˆˆˆˆˆ\O­å(ÀÕø†di›ÆUZZê³OC EDDDDDÚ‰—ˆˆˆˆˆH;ñRXPP@lll‡4FDDDDDäfÓ˜£L&“Ï>ƒwÁÆÂ""""""ri­å( )i' \""""ÒA¬l~ï=6[;º×Ê5¾ëfÞ{o37ÞíñºÎÜu¤®ËíÐÝÈ.]DDDDD¾êr×¥²© –;Í&Ñõ©•Íï­!§Üûó6²æp’>̈¾ví´n~59åŸÅÞ¹ˆÙ‰¹¬Kµ`¾’¶¶éä×öz¬9'¡Ï š­Îº™÷ÖäÐx¥M×x%.ó¾x]g®¥€Xóì+=y§§À%""""—‹¥ Œ°°2Š¬Ø˜r·“SÄš¯,ÀØJ(77(®¤•ëRÙT6˜9‹¦4Õ™»Ž÷m-¢,,‚¨kt>×øzl%å„›[¨-z ß¼³„ÔÝÌù攫;çåÞë´RTFD»ÝÔ›ŸGàÒê„""""âÃZDYXú„çp2Ç S¢\Öm‚ØX(s{Úöìaòêùòꕈ½svódž öÎ}á­ô¤9Cáà9^á#q6ßLô<÷šÔWÛX—Ê&·µÂÏá›S»nÖ‘jØ‚‹xô$µv=¹ëHõ¬¸éz¬›y/Æô9ɦœr×>|zçb¹³•Ž#kQ¸¼K´×»÷/öÎEÌŽºüû’k) ,bBC¥9œ,gÌ5쥼µ–£¸DDDD¤UÖœ“”‡aŠ¹„T‹ ˆ&wÝ&¸s»3ˆ˜Ðð îÕÃdÝükÖå’8;±!œœ¤ÏœE솕ÍïeÐØ­’».•MÜÉ¢E‰®íŒÍƒ]ù¶’rˆs‰ž´rr¶ç2¥¹±uÑS›ƒÅì5ônö"¯@¸Ü)ÎPg-*ƒ‚pÌ‹1ÛÙ(RwoÆš8…èK\‰³YÔT1›ß[ÃöÜ)ÎsÛJ(//`7sX´¨¡Ÿhó{¬9Ù§©w®!”µÖqd+)'Ì=ì¶ÖÞÜužõç®cÝÝgVŸ†¯9¶ʯ´‡³iÌQ¥¥¥>û4¤PDDDDZe+)'ÖœQE„•a͵8ÃQ¢u›Â1;Ó»½z˜¢÷!,£+‰Ø¶çÀà9Lqõ„Ø()o86w]Ãü°¦ÇöDs,›Â@¢{hV"³ÁºÔM¤¦njø,ŒÁs¾é DmúæZg%ç$ žãÕ£C4ÛÚõ4_±ëܹ–¯9W¹8«së»äðDgž+ø\¢½Ö¢2 ¢éóÄÙÎPvÙ÷Åó:­Ee¡O|)p‰ˆˆˆH+ÜÈ£c/ßÄšM á(w±f烻­„ò°> vO®ÐËvpäZ\Ç:Ã@9›RSÙävxØà —ÙÖDf»…¶Üu©lZ³Ž˜E³Il.yûˆ½³!äø–o ÞaÇózœ‹Pl³æXîl)øåZ(ëƒgu—XˆÂZDîík­½=e ±©›† º¼ÌûâqÎ×çZ®zÒ y®Æ—uih¡ˆˆˆˆ^+Ò%bŽÝæ¦!wô>ó‰Ü÷[s¼Â籶’rϹS×H¢9¶i’GPÀ9LnSƒ]CÍbNl¾¼{¸hõz¬l~oeƒç°Èc.Xð»fV2ô½w—îu²æœ¤Ü}ˆekíuÞ¦0ê>Dð2ï‹gÖ¥zõ¾:s”ÉdòÙgð.ØÒ’EDDDä+ÈVByð4pís…³’s²œðçžè˜p(°àzSÃœ¡S¢=c`iÜiÝLFôiè‹Š£üdŽÛû¦¬l~o«®Üu©¤¶ú>ª\Ö¥6•wÕ±»€°ÁZŠNLÓªì.h 9¾Cåœá"&šK^àº/®v4Öåu?Á÷ÞY7gƒWo¡—ææoµØ^ëfÖ¹¿ÌVBy««¶t_<¿æΞ¹v\õñ&ÒZŽÒBi‘ÇŠtl””ÇÒØ!Dâlî´¤6 ôXe0‘ ƒw³fS*®éUĺ꣧|“;×¥º†»9ŸÃÀÙÛƒk.Róœ=oÞCcï\ä\¡ *‚°‚†ù]aƒ™óÍÁô [ãÖÞ0ÂÜ‚†Ï’ìÖ"Ê\‹C´v=Ñ îæ¶/Œ°°¦Öìœ§Ä Þ½Æ³ý±-]¯ÛpÅ‚5¼‡³g°õöBYÎ\·×ýksY÷Åókn-*#¬Ï„k¶ ~gåwáÂ…úÆ£G0zôèkе°gÏž›þDDDDD¾ :óûž={0`€Ï>ƒÏ'""""""rM(p‰ˆˆˆˆˆ´½øXDDDDDä*´–£¸DDDDDD®BcŽ*--õÙ§!…""""""íDKDDDDD¤x )l|Y—†Šˆˆˆˆˆ´McŽ2™L>û Þ[zC²ˆˆˆˆˆˆøj-GiH¡ˆˆˆˆˆH;Qài' \""""""íDKDDDDD¤èÅÇ""""""W¡µ¥À%"""""rsTii©Ï> )i' \""""""íÄcHaã˺4´PDDDDD¤ms”ÉdòÙgð.ØÒ’EDDDDDÄWk9JC EDDDDDÚIÀ¥‹ˆÜxÎïOçÍ¿þ•ÌÅ8>3FNäÉ?½ÀÌnÚ´Îoÿ+Lf½ksГoóZRÏlˆˆˆÈK«-Î%3ã}ÒÓs8v¾Š†'|£©ÝzöaÄÔ©$MœÆà¾ÛÎöT•!Óš¶_ÜÏÞÞ!M9›þ.?ì ZÅçqدe½³X¶ñ‡Œ¸ò*[<Ï#Ë·¸ßÙƒn}“4cS§ ¦g'þ¶éì¸ZUNÎÏðôûÇ|î…+$ãØçd¼¹ ã¬eüý‡ çgÓùÁ#Ëq=Vz’·_Kâæ먂ü}ð›g;º!Nö­¼ùGß°uµÊ÷¿ÂÍ„¸Žà(.¤°¸7dñæòL|2…föíèfIØÿÊtÜ:™µl#?¼Ö¿‘v¥·ÈÎþWòÌúâ6q#<¬_;gáXø¨£Ûá%g[Ýn´iÆÏùóLâªFžMç¹çÖÓö¯ôuä(dÛ²ÇYó"úáÂ:º=""""⣵¥ÀÕ’³¼á¶Œý™õB2ßÑ—°†!^öòäd½Ïodr¸¢sÅ­™ûž4õ*ÃVù~^yb9‡€1’ÈÀbŠ+®®}—mÖ26ºº-ìœ=º•5Ë~ËÚcWê pýs,û?™¤È%"""r£iÌQ¥¥¥>û4¤°%…Gñ˜e3öa¾7¶¯GC`X_F$ý¯%-áhúoI>êüÜ{‡—óÈôå®Mß¡AgÙŸ¾†UéÛÈ9Ñ8OÌHdÁŒÿmIá3Ñó<ƒxòÍŸÐcÛ›¬JßENaŒ˜z fÆ“ÿÁ÷ÇÞxƒËOd’þv:éûs(,v† £©}O$iþ’F¸·y?¯LïÛš‘<Œ†¿_þp«³¤?÷Î\ɬSðÆZ™^å<ÊkÖµ]4"ž¦ñý?e’G«ƒ¬åeΤï3¸™ë¸¼ï³¤ÿà·ëœEÊÚ$ÎÿõMÖfíçX±Ãy|ÿI|û™'Ipe!ïìþtÖ¬Jg[Î ~!aŒìÁàI$=’Ä´¾nõžßÀÓ/ã@ã¶éA^ýÐûZO°fác¬8Ù¸=œgÞÿ3»5óoáíטjÏä¯Ëß$#§ ‡SŸI|/ÙízÎîâå+Hß²aÿæ?ùæhézË9‘™ÎÛééìÏ)¤¸á>›zôeðÔ‡Y2}½m©]«V¼Ýp^0FögÒ·ŸáɤMÿ¿xIn°þ™éMÿnÚaÊ"""_-Z¾­¶­àgodrôl9¾ë2„1 é>¸ÂÉåG×ðô}ðÌòµ|~¬iQpP\x€ŒåÏðÈC¿fëùÖj9Æ„ä7³8PXÑÐ ä ¢ðk“²à•ý”_V«z‡õPßðço÷_É¥µà<[»€‡Káͬ®°ÎyqÇ>_ËògᾧÓ9q Ïê©œý¯<Árg׃ž|•¶ø ÝÂñÃxÐýÝyÅdæx–º6ß;üì¡%,[ûyCØj8þXË—<ÄÓég/¯éåGYóô}<òÌrÖ~~̶À9?í@Ö›¤<ö ^ÙÕô=Ùm,3†»ÕQá{­œøœô“M›Æ©s˜Öl÷f1[W<ÎC¥°ö@ã=qPq2‹åKòÊ®³ìãqî{$™÷??é¶ÿsÞ|f!¯ìofå•ó[ù킇x,åM²4†­†ã ñùû)<öÐXu´µeMíj:/8Š‘µ| _ÙßÌÿ-"""r³ó\‹‹ÅÒQm¹±ôÌpŠ9ð~ KyYÓïãóÜÓÉÌ9{uIgÓyԈÄâ,~ý³tZ~ôuàh±…ëÍ_½`;HÎçç…—œóæ8°œ™²ÃÑIDAT'~»ë2ƒbÛœMŽçz"g½È‹7ä²æƒ™4Õè¶]AÎ1·ï€ëô½sàËÉl5°¹;O毟`Å%å p}2Ï­ilU7¦Í™JÓÕV¾a¿Ç'¶­¡)o™Hš3‰æp,äómÍ/tŬO~„gZXŠY¿j«ç÷\ù~^yüçd^⚇y3ù šËk—n¯ƒŒË̶"""rch-Gy®òòrÊËÛãñö&Ôm&ÿñä ŒÍîlø­öÚå¤<ñ³î{œ?îjzRñÃl|ûI¹2èIÞÞ¸‘ œav¶¾ùGçü!"™ø䫼ßPfýû)ÌŠt;ëáUdµØåcbê3+x}óÇB1>]àüÞXë¾î»?ßÏ1·ÍËišÎi¤ÿ¬×±ׯ`‰ûÍ*^Oú®–—ó¼o6ëóoô09‰²g¯m܈׷;³–5ý²Qà åÿ·w±mU‡À¿&@“ v»9Àl:X ¥ô£/‰T7Òlôƒ¼4/éÃVM*ªçH #ô÷PxXP* 4•=, ,LdF9ÖƼ2V\§äÓÜÕZ©h€»s!1Ãg0~µ‚±w$láõ×Ëo´ºÃ'ŠÞdrMú«çLEëŽ{­úhQƒ¯/tI!Æ•Œùc&FÏAÜs¤1ÅK-V-hëÀKbïgéÆõûmèÜ/ö¸Æ0¦u^&FqN8qûØo”ïÁÞŽ€þü²†ÖçÐå·¿)а×xÍ$.œæ16†íÛS|6ZƒÝ/„˜[mó*]ýq}-{ÐÝ-çód¶ÖßP"""ª4nš±÷ž—ðö{‡p#­àÂØÎ+ÂÆ¢%¤þp J¸ŒåÞ˜‘;@Wq 8èø‘ù…y Äñ˜o~ŒÞgÒÈ5½+ž‘kO›i—Áü¨Nq»€Ìdåb­ŽG…fèѸ ‡(þ`þýZ=ÿ(›–ï^_¡^åºÓÚ¶·(ÉLá+(oñ¸'`ìɸᑋ·ÐÉÈ—o[ø Ès¯ž/÷ñDDD´œúQÒWSS­›ãëÐÒRç†ðÚ¹•6#Ý_l·xà­Gq½ÐÒ8{ƒÐVÙä×µ ëå(â¿*„[BöÂ[è¿ð–íUB¶ïdðÖ¯‚°ýdó‹8ÔUÎø– ¼°ø?›·÷_Àï´ƒÿ¦ÿZÚ2«–.zñüFß©p…Íò£Æý/£ÇWF´7¢D?‚ŽÃ¤ÚsÂÄ^|%ëÎ^ ŽÙ_}w=¥*µõ º;Ž×´ —28Óv«žü‡£Óø³Ó°ÝáFŒY0¼QŽîÎ5¥m;ø?õë;.eÎàµÃöë¸ü]•»¶Ç°žqêL?^Ô.Í­Z?jnnÎôw)´ÑPß`³%¼…z/ þÉðàܺzl?¢s‡ñú›‡Ñ^òÅnC};¢o¾„µœˆå¤í¥·qt¿kÅü­oâí—÷Ô|T®¦ê=Øô]ë× îÔ»Bx} œNN :ÞÄá#UWh¯w[wÚÂ=0M$m £»sùšè{û(ö»ªù%µÖÒÑ#öÑÆÃ5\6ZºÞÀ{{ÒP.ŽãÜØ”Ì$²3Å…ûõ.´¶бÿEìïôY6H[{ÞÄ[ÍÆ;gÆ df Ó¢êÑèj…[˜¥ÔäëÆïu =z‰Ç1‘¹¬¾ b=š]­ð:Ðî€ýÌ./¼ò"fâÃ8?‘ßE±¾Ñƒ@¸‡{:Ѻ®z--Øûò»øߣˆÇ¿8¡§7Ÿ¯Ï!ÜÓðúÙ}dMÕ7»Ðêu®[šÊÔD_sáü;çôzZß܎΃Ñ”?‚ÒäC÷ïá9%ŽÓ§âS2о:õÍ.´Â÷†ÑéT)[ŸCØõÞ‘½®ÝMƒ–½xùÝ¿¢W9‡Ó§â¸ ýÔ£ÑÕo[:÷wà¹=¬·M{1ðîkð¾uJúž ¾®Ö5ÚÈ„ˆˆˆV¥nvv6§¨j~íÁF_ÇuùòeìÚµ«ÖѨ:%D¿>Íèð ¬á#¡hÃRôbHŸ©Â`²ŒÇ¬…Åó8öÂQ7ilGÿ_Þ@Y³b‰ˆˆhC¸Úîׯ_¸ÝæƸ4Âe÷td"¢µ¤ž;qGüúŽnTøÑ[DDDDãÔâ."Zg&pú¤ðdd4"ܽ·¤m鉈ˆˆÖv¸ˆh]Y<q»çm0Ò®t: ~å0”ˆˆˆˆè‡àNh»_¾|àó™ŸgÄ."""""¢*‘6ÍØè»Vʵk×j""""¢ 㩧žªujJëG-//›Þ“:\Ú’è~膈ˆˆˆˆJ§õ£æææLïqJ!Q•°ÃEDDDDDT%Ò”Bí É\ËEDDDDDT­åv»MïI.§'$‘™S?ŠS ‰ˆˆˆˆˆª„."""""¢*a‡‹ˆˆˆˆˆ¨JØá""""""ªiÓ îNHDDDDDT­µ¼¼lzOêpiOH&"""""¢Òhý¨¹¹9Ó{wä”ÂM›6áÖ­[µŽ9¸uë6mÚ´rÀ ìŽìpmÞ¼7oÞ¬u4ˆˆˆˆˆÈÁÍ›7±yóæZG£ª¤×õë×õ§$od.— Ùl¶ÖÑ """""Ùl.—«ÖÑX5§~”Ô᚟Ÿw|JòF±eËÔÕÕáý÷ßÇââb­£CDDDDD‚ååe¼ÿþû¨««Ã–-[jUsêGݱ&{ì1<ðÀ˜››Ã¶mÛpöìYLOOÂá0vìر&¯ýñÔãôë_ÿø_ãk«|íË/¿D<lß¾Ï?ÿ<_ãk|­J¯]ºt —.]<ûì³xöÙgù_ãkUz­VíÕµ~í…^ÀÃ?ŒŸÿüçwDgk%u³³³9í NvíÚU³m$—/_ø|>Ó{wä¦DDDDDDë;\DDDDDDU"M)¼ë®|ÿ‹@&"""""*¶aÆòò²é=iÓ v´ˆˆˆˆˆˆÊ£õ£æææLïqJ!Q•°ÃEDDDDDT%Ò”Bm;Cn ODDDDDTn OD´.©ˆG"ˆ«¥#‰£” •§ ŒA©ÔéÔ8"Á ‚Á b;) Æ#ˆ””™ÕTF™®1%VÙü^krùV¸N:ªôµTÄ#ùú4ÈZ¦‹ˆÖ ;\DÖ@5üq.¹¥Ä,þ°W"Z‘|£Aø·ñt5l «ãAv»µxØçŸ:>tí†{Å“®¶Áfñyu ¿®Û>§áü½#èN"™L¢/àœîÒ©ÈgÑÊ9TUR™®®,”Xð6;VuZÅTÆ_E ±eVî÷ÎP¾Ê(¡NV…’/]Éú(±^Œt #™L"ÙËy-ÓEDk†.¢ @B!ø£BãMÁh¢´”:•¿2--ñ¬I!4˜o8'“I GýHœ¬Õ(ÌíÊ"òÂS‹vz6”×SèD¹>‘DŸMK+›NÁ[J$WÛ8´ø|é½(£H„!¬ŸÌ9Ý¥«a9JÑÊt•eèKâDøvd‘RGpµ*Qfå–—¾:¿iÖ*Zÿ¡`4Â!¡\År^ËtÑÚa‡‹hȦSðvö ËŸÀ¨ÖãR§ñ (aš–8Ò¤Æ#èJ!5Ôk˜Â¢ f;2•ÏùîzéÔJ>§kÈŒ£eÅhGçäQƒü(_ñ:ù Â”Çt(ˆû‘@ýÁ ‚Áâw%&ŒÜ9L峚ƦĴ|–ãaÌe4Ql\ÒiÌþD‹¸‰éSãˆô!•Bo0ˆ žO%æ‡Íç³é¼ê—qÔ¦´rVãû@¢¿NL·G$CÌ.®JLQËEE¶sSMQ´ïˆVÎùbø>Éqëƒ{$·ïø•ÂËÇåÿÂär¹\núlîȾã¹+úçµÿ‹ïÛ…·xß2ZÇsûŽœÍƒ\Éß·/§EiÅk8ëÊñ\1iÂ9µóèa§sgìËí“Îkˆ‡V¦ÏÉ‘Þ,œS¸è•ãû a q#hÊ»tNçÎ)ÆKŒÇôÙ#ò9¤4› å«)¿ÊÌóç ù!\_ÊrÊÙfcºë±Õ¹Šq5—£”ªÜñ}ûœë«”/Æ<º’;^h¾Žøý’ÓgÊK‡znŽ²X¯òq-^WN»‘U^LŸ="ç­—U|gVüí)5MWq(_1Ïânõû`1Œ|\Jý7þî•Q6¦r–¿Ë%ÿQÍiý(±o¥ý“F¸víÚÅ ‰Öa$Ëíñ™)¨ÈßIu¨ˆŸLÀ(NÓrïF—?ƒ)Uû¼xç_EüØ`ÜaœHž€Ól&u*èwïƒû‘ðGÑ(ñÆs‰}…éJæu'Òôu#ˆb8Ù§¯yPbýH„…éNt†RHg­Óašª§œÂP*„Aa¾T 3„”Ý \>ø e¢•EèPØ~ú‘>…Pœ"%ÞÙVpjˆç¦Zîüó«¼ü°Xç£åñ 9Mù¸–WÎæidò}e4Р¡Þ9NÉ+ÆÕqÊ¥2ŠDhI! Žù¢NA®‘ôšë‹¸æF.SSݵ­çVQG?óñ—§Ú.›ó"¿þ):lÈÛB*·Ž”\fåä£%›ò~ÓœËÑüû`%›N!4X ãÞÝ¿ž\§úüwS¼¾{7ºü°eL·TÎâoµC¢Œß!"ª9§~Ô&ËW‰hýȦ‘òvæÿØ:JĸºÈøáë´©}]bs ßðëtP„Ïëï©T/‚Câ…B,c‘B6‚?:,5•X½1’}(ëîð!„†úÑ[¬Ÿ·°îDLZ~z¥ÐØ‘Ò¦b* Õ`B¼‚Ñ«TÅÂ{êT’hùu–'ÜxS£È@ü†¼ƒH>¬Mç”b¢E¤ÐPïË'éTaÊ 2Š„¿ ÃR›>Pg_á –Ÿ–' J¸Ný³åæ‡ñó°Éc±î•Q— ÓŠ—ÒmQòµµihV×ɯ‹Ñ²ÈÈ\~+ä‹;ŒC¡!ô÷1~­Ám¾ŽtnS™Êyi[ÏÍ1ÆTÆ®q]”1ær2|V®®æðÅsÞN)±ÌlóÑ*Ž¥—oþ¦ËÜP1îwSݵbQw²i¤´Žcý7|7õü±ë ÖÝêé6”³ž.­sžB¿œ°âïm(ìp­sòôüÝÛ“§N)/åÿ2#Cã«p§´Çôy-|ƒ+Üõ]!VMøÑ5,7e\>?¾kЗLæªj‘ÞSPÂ}ÜfcÇt'ߎM‡Î¸h]ê䙸àóg0¥*¢ÃúB+ôy1˜‚”iº‹xÝ®a¦¤ù…õN„RÅ)X¡PÈ´Jxr#|bé 8Å-/Kn¼úù #5áDGzõk"4ˆä û_»|@b¤ Ã}Bd q‡ß¿¿KhDw̦S…õx=ˆú{å¼ *tpv£Ë?T|Ïï‡_쀹|ð' Ó« ùXV~˜>ﱜŠ&Ž¸–^ÎÆéTrº-§ÍA pcw—CB÷û‹ t)ÿŒ,G¿œê‰ d†Šå&Õk9ÿý¡üRǨX¦¦¼p¨ç¦( #ñϦ¡OC3±¨Ó0ŽÐªSÈè#^å}gJ/38ä£9Ž%—¯4JäwÅzÚ¥á÷-›N!•0”K2lû#Õÿl©TÂƤíHa~½V1¿Ìå\Ì;wøÓAáÜ…ßo‹4Ñú õ£|>Ÿé½ºÙÙÙœvN§°ÃEDDDwºÂ4ߧS?à8íˆ8w¸8¥ˆˆˆ~xVõ0èÂ:¸Êý8•Já_ÿú—)œßïÇæÍ›õã>ú +Æïã?Æwß}g ÷øãcË–-úq:¶| ¶ÏçÃÖ­[õãL&ƒÙÙYS8¯×‹ûï¿_?þä“Oðí·ßšÂ=öØchnnÖ?ýôSÌÌ̘Â=úè£hiiÑ?ûì3|óÍ7¦p<ò|ðAýxrr_ýµ)\kk+¶mÛ¦OMMáŸÿü§)œÇãÁC=¤þùçøꫯLá~ô£ÁåréÇ_|ñ²Ù¬)ÜŽ;àv»õãééiLOO›Âmß¾Û·o×UUÅ—_~i çv»±cÇý8›Íâ‹/¾0…{øá‡ñãÿX?þꫯðù矛Â=ôÐCðx<úñ×_ÉÉIS¸mÛ¶¡µµU?þæ›oðÙgŸ™Â=øàƒxä‘Gôã7nàÿø‡)\KK }ôQýxffŸ~ú©)Ü<€Ÿüä'úñ·ß~‹O>ùÄîþûï‡×ëÕçææN§Má¶nÝ*íôÝwßáã?6…Û²e üqýx~~ׯ_7…kjjÂÎ;õã……|ôÑG¦p›7o†ßï׿ÿþ{LLL˜ÂÝwß}hkkÓoÞ¼‰?üÐîÞ{ïÅO<¡ÿûßÿÆßÿþwS¸{î¹O>ù¤~¼¸¸ˆk×®™ÂÕ××ãg?û™~¼´´„>øÀnÓ¦Mhoo×oݺEQLáî¾ûnýxyyW®\1…»ë®»ðôÓOëǹ\ûÛßLáêêêðÌ3ÏH¯­ö7ÿ™gžA]]~|åÊ,//›Â=ýôÓ¸ë®â}HEQpëÖ-S¸@ €»ï¾[?¾zõ*þóŸÿ˜Âµ··cÓ¦âŸÙ>øKKK¦pO=õôãk×®aqqÑîÉ'ŸÄ=÷Ü£øᇸyó¦)ÿ&ñoÀ¿IwúߤÆÆFüô§?Õù7)¯Ò“€ÒÿÖ8áQ•ÔÍÎÎæj """""¢;G¸ˆˆˆˆˆˆª„."""""¢*a‡‹ˆˆˆˆˆ¨JØá""""""ªv¸ˆˆˆˆˆˆª„."""""¢*ùðÁ¶’‡CDIEND®B`‚assets/img/lock.png000064400000002646147600374260010301 0ustar00‰PNG  IHDR;Ö•JtEXtSoftwareAdobe ImageReadyqÉe<"iTXtXML:com.adobe.xmp Ö@Ÿ-IDATxÚŒ‘ÏkAÇßl’B‰ cL@#Bh¤•èI#Øzh.Ä«‡ë?P¼´X(¦Š<'&½¹™‹B®Ån©Znj‘&i7š`kff§3“nº=øàí̾™Ïû~g1Æ!VÄb1ÏÈȵ›>¿oc¥bQËå^¤²Ùl l!¸ög'&'§.è…ÂZ±Tfza•}ùú­|úÌæÕ…Êøø+Ý0²”ãñ¸ï~"ñž«yß.,iK¾œ:ëï¸hÔúƒÙÄP:ÖÿQÎÌÍM”Ê?X2õìe4=h)D"W2™zþîà »7==cWV¬Ÿ`0xîÏæ&¼QçŸær¹†UWUçóùÇN‡¼Þ#çÃápç‚['7ÆšÍfº¢Z­¬›âxŠrÀét*ûÁ `ûZ&¥@ AîÔålbæÉí*î= ?»{æò°P¢<ÅØãrù–×0üê=ê\½1¦iÚÃìñ­Ã¡% Ÿ%”AëïaBq5š¼™;àu÷m\…B„Y c¾Ø"&Ó” ÏÕW^£¸tKª‹zÛ ìµ© -ž„îÂXéê`; A‚2M¶–6mÊ"5YgeÝ0‡Lmö¼CÃ\¤ ûå™Ýðú÷¯F 1hwÏ%öp¶6Êrn­µŒŸËº®Ëh¿wýßØ`ßpxù¾Ø}IEND®B`‚assets/img/duplicator-header-logo.svg000064400000033716147600374260013720 0ustar00 assets/img/spinner-2x.gif000064400000016560147600374260011337 0ustar00GIF89a((ò™™™ÓÓÓŠŠŠñññüüü±±±€€€ÿÿÿ!ÿ NETSCAPE2.0!ù ,((@ÔxºÜþ0`ªµÁ…Ëy'Ž$Y0[©®4Pì ÑÀ±dµ’ªÆ‹Å[䎣Æ™ ö„k÷y>@P šõ1Q£¸Ž8ò#U„Uq1`2×®ý(`¤÷2 €f!„"'O‡voc‘’“”’hS‘Œ€ce"3Bƒ¢5#šq%ŠK*s>2ª¤"™—S mˆ$s¶¾ Â, zÆ#} ¨Ê®uÏ"x½Ï²³ÔÚ °ÂN5 {¦‘RG;• XZz^`Öëó !ù ,$$»xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖæ3³MGW3pŠ@+È!ìjBÆÏ…\LiŽ²Uhl‹ÙÍ—ð“Ð !ù ,$$ºxº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖeÄšŽŽG.“‘qCØñÁEà‡c̈†Ç)Ò2¦XC€s%Íp–ÜàÀaAÕQ;s±·ã]y¨•I5†"‡‡>Šƒ“”,’•-˜<›5ž4¡-{ž p¤bh§•nR¬­V¤^ i›±C°Q¼¯jK)2y0RÁmgȸ+D&sÍ I¿ !ù ,$$¹xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„voj„¼€2ÞP`^9m(*lžÄ–*@.­æBIzZ€Ü–jð:\b2ÕÚ˜¾`617³=ô%v5F€†††‰€Œ>Ž‘=”>—=š65r  k b£—i §šb ƒ—t «®B”n ¼¾1}Œ8į¬60É·,˜(ÎA‹É !ù ,$$¼xº¬#(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢H€LF€ƒ¦á'`Ï O} !ù ,$$¾xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cД¯ÂsTh $A`!m„$ö롘rW¬‰35|ÅÐê&½¨G]ô¸Ž`f^mjG3-~#‚$‹J“–—"•˜%›6ž5¡.¤-p¡y{¤_a§EM®›d „—r ±›L]–F*Á~Ã1ˆ~81 ,P0Ì2Î='MÑf€ !ù ,$$½xº¬a(a´Í €!Ž¤D§‚e[žjCn]iL„vojÏçeCb1Ç )Ÿ…FàI5<ɪ¡0è(¦ÜT;Š2Æ¢ë!K0Nà0 æ´áa™¥$}o q[lU zr`ƒF_%ƒ$–—Z™š-= 6£5¦.‰ x¦j;©a ¯jp©‹ ²­…¬UF*B—Ã:‡Š¿,T01Áw(Ð1`G* !ù ,$$ºxº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#U ždu‰£nY… {Ð~Ž‰ï0øŽÀE[ôp‹¤›$ÄN!7žb|x I|Mo|wMBŽ-€’<˜<›5ž4¡-f¡ ^¤} H¬EM«¡~ –˜„YžL‘Žh½§U¼02v70 +P/É1Ëœ'Î)jq) !ù ,$$¼xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 Æ$Bz E ¢Ka¿ `§(r4E‚hg„osw,R H#Šh7YŽ‰bEOš4 5£4£et¦u ’®EM­£y Ÿ ‘©cL‡½UFAÁDÃ)2•Œ*Å,/0ÍE'Ð9›r) !ù ,$$µxº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\OŸlÄ]:’:˜Ñ­Ð M# #n{ }tL B>mkp+"ƒ5›4bže}ž`H¦>M¥›‹”R1¡h’nFAµP»)2h70|½4/Ä1˜d'É)‰v) !ù ,$$¹xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\÷"n‘E\œÄoŽ¬Ý-e ã$@ ]{cg…tUM „q`N"qF#€a-e„€$`¨#Lš¬"” m¨}~Œc®B˜‚»¸J™)2hx0À¤²Ç É>'Ì)v¾ !ù ,$$·xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\÷"î¡$ޛИ6}t[GvhM€bUxIn` mnRIn@~#‡UF e]’`H{.M¥¬©°“ «{LnŸºP½2h}0 +ÀŽÆÈd'Ë)§™) !ù ,$$·xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î£ÐïnûCô"nR ]#kM mke†{“bPŠm‘“Z„ “`šP}‡M h€`Œx"¢§cLBqF*¼h¾13h81…¸50Ç2,K(Ì¿sÌ !ù ,$$ºxº¬#(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…<Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î›Ðïn;¾e‰c z$kFm#kG bhe€$bJR]& šU‘ “"`c`zL PGB#¦ ‡ž¡"˜ ¤w©¯n…A–ž‹3h81 ,P0É2Ëd(Î*vÄ !ù ,$$¾xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…<Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î£Ðïn;¾eÙ».nb$hGz$c‡ g-ƒCRbe]U` m"`“=•$L šJM%œ žQM¡„´UY§BUŠ?*¾hF13h8ƨ¢50Ë Í#'¬Ð vG* !ù ,$$¹xº¬a(a´Í €!Ž¤D§‚e[žjCn]iL„vojÏçeCb1Ç )Ÿ…FàI5<Éj›jŸ×Cökdê# v²}‘7Q"÷Qêø÷=ß²ð]-l{.d8 36cpn$f^jh-a;UL-\ —JG š$a “>ª«7` #¢™5/¦ BoF1ŠŸ1,T0Ä2Ê[(Í*†"¿ !ù ,$$¾xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#U ždu‰£n•ØƒöËdè# ~²{‘÷P"ïMêø÷=ϲð[,‚$_{4cpMB4f^DM5aH—REM–=a ‹,¦ n<Ÿ ®YC@ h.™¶¡.µŒEµ’Kq¸02i7Ç +P/Ì »#&¹Ñ¶tÌ !ù ,$$½xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\÷"î¡$Þ›Ðïn;žeÙ·.~,$^z=b<‰ ]CR ‘… HCM m,L ”5e™` K¥#– œ<@NŸ B¦Ÿ°>¶»4&¡%ÀGÆP70 +P/Í1Ïd'Ò)ÅsÒ !ù ,$$·xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\÷"î¡$Þ›Ðïn;žeÙ·.~,$„#b4&Š ]d@… H=` ’‹M-Mš m¡Q›$–˜4LB¯ ¶d° ¹%‰K»­©P70 +P/Æ1Èd'Ë)vÁ !ù ,$$¶xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î£Ðïn;¾eÙ».~-osc68 3cb"R mJe]%G gU`ŽMUL –#˜›‘$ ¤oª` ®dŸ™bPF*Bk½1‹c‰1£Žd³Æ,K(˾sË !ù ,$$¼xº¬#(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…<Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î›Ðïn;¾eÙ».6bZ.`fzZ.ˆŠia/mPe]#R™V Y› •DL GŸCŽ•¦Ÿ¤C¢X$¬[BqF*¾hÀ13h81 ,–®Éƒ-'MÎvª !ù ,$$ºxº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…<Éê2GÕ*¯‡¬·8 ÆÐúû\û"î¡$î£Ðïn;¾eq 0mh-8 Bh/Mk7bia#` Pe]"R‘D`<‹›cL œEG^– ˜pcž £x©‡nF*½¨G3ˆ¦+ 601É$'ÇÌ và !ù ,$$¸xº¬a(a´Í €!Ž¤D§‚e[žjCn]iL„vojÏçeCb1Ç )Ÿ…FàI5<Éj›jŸ×Cökdê# v²}‘7Q"÷Qêø÷”!å%a nd$Q2{_|cTŽ…ZC‰ ‹Uf^"ƒ •Ua;#~¤T\  yV ­l™Xy¯rF*¼i¾:µD81 ,®¢Ç /(Ì¿tÌ !ù ,$$¹xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#U ždu‰£n•ØƒöËdè# ~²{‘÷P"ïMHLá^2u|@ƒ_%nd"R^iŠŒ_#…‡[I…Blf’>—daH}.M§®a ªo ­}L£o¼c[»0d70 +P/È1Êe'Í)w› !ù ,$$¹xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúû\÷",€Ä]š”€2zeÄl´õ` zv@ †c"‚Š^"RSt#ŽBn6cb{ze]€$`H©|M¨­Žz”ƒ£h}šnFA¸P¾)yc70 +Á²ÇÀ|'Ì)vˆ) !ù ,$$´xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 ÆÐúûô>âq¤tĵ˜Ñ]ODMk- ƒ{ }h%Bƒ#o+ˆˆ=œ<wŸeŽŸz†¢”M¦ŸŒmŸR1ªx…vœFAµCº)2h70|¼.¯Ãp½'È)u) !ù ,$$·xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêGÕ*¯‡¬—8 lÈdM¨¡ˆŽ›w ¬›ŒBŠ‘»l½“c70 +P/Æ1Èd'Ë)kƒ) !ù ,$$»xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðÖ<h]ohøq;b€cÌ”ÄB#…<ÉêG]žZÒõÂp -Œƒ‰šòXoÀjˆHºéÎ#v xa#g rsŠ>g2s=Œ”4—Cš‘~- 5Y£> Ÿ§cH«>Mª o ƒš| ® Li—FA¦ZÀ)j70 +P/É1Ë<&MÎr‡ !ù ,$$ºxº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cДÄB#…IC†0xVGLutu~Iå¤TF94'û}È7Þ3„´fÚn%e yg%†g€‰n’“#”5—KŽš|c. 5t£b£ƒ ¦ša©ªZ œ“}®n° B—F*½’¿13’81 ,P0È2Ê='MÍÍ !ù ,$$¾xº¬#(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<¢cÐF–ˆ²UhHÆE`2Jb yf^u#8 \„R-kŒX‹’>”•˜™jš=œ6Ÿ5¢.¥-}¢wi¨p«šLZ°{†šl ³Ÿ¶B™YA´SÅ*3’ˆ1ZÇ50Î2,K(Ó*\QÓ !ù ,$$¿xº¬a(a´Í €!Ž¤D§‚e[žjCn]i<„vojohe<‘!’9mõL†B#@ Öð$³œ‚ØY=pIÚÍ{\>œ‹é±é0h ê }z".kz6wzMƒX‘X‰”—˜%–™~ŽœOWŸ-¢5¥.žŸ s¨d`«˜mn°±R¨q ³zµ B™F*”Ä13”81 ,’€ÍÏ='QÒb_ !ù ,$$ºxº¬a(a´Í €!Ž¤D§‚e[žjCn]iL„vojo„øH lX 0Ç Ç ‘ hÔ€}–ÊÅ`+r*v-ª‡l˜*´¥°ƒm03‰+p×pgzl=‚tFtlŠld“”5’•6˜=›6ž5¡.w¡|p¤ug§˜no¬­U¤] h›± B°r ½“I13€Äo¯60ɸ,>'jÎÀÉ !ù ,$$¼xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ðºQ=šŽŽ$†>CØÁ$ À1f.6YhZÝÍ7Y*š-€–L©*ƬblÊ6;YËó–­$tl„‡"‰Œ=‡‡ƒ“–—D˜wšx{6p $£-œ£j¢¦fh¦JV­f Ÿ˜a °šnH—yÀ¾)2“70 +‘¶ËÍ>&Vп’Ð !ù,$$»xº¬c(a´Í %Ž"] ’,i¦ Q´4Y ð²Ø³ÓMG× 0¿Vƒl6ƒ€cÌŠœ¤³¨7Z¬¢I{Æ&RUÑ­ „‹kÚ𠓧Ã@>èç€$ƒ†$‡Š‹‡Ž†h‘”•-“–4‚™5œ5Ÿ4¢-vœ~m¥_d¥kl­t |™fG¨‹² D–KC»€Á)2‘70 +†/Ê1ÌR&UÏPÏ ;assets/img/vultr.svg000064400000001716147600374260010535 0ustar00sygnet__on-whiteassets/img/dropbox.svg000064400000000671147600374260011035 0ustar00 assets/img/index.php000064400000000020147600374260010443 0ustar00 assets/img/email-logo.png000064400000013216147600374260011371 0ustar00‰PNG  IHDRú3¾ A pHYs±±;9~YtEXtSoftwarewww.inkscape.org›î<IDATxœí{t\U½Ç¿ß}¦Id&)óHËK @“”Šâ+i’ú`]X ø@᪨¨åq ”‹ à‹+Š¨/â•.yC›‚*¢"P¡“T,¯6“I›Ì„¾’œý½LÒN“9gN“‚žÏZ]«³÷ïwöïdæwöë·‡¨nsüj’§Øcèßf[Þa¢]Ÿár¸•j;$$dWX‰‹ª5ùIðl”<‘+»n¯DÛ!!!£1¹ªpP‰9i7$$¤$•qt"UFbVEÚ )IE]Ò[ýëí‘•h7$$¤4æèj/‚Å^¨®ºw¯ßâ+»¨¶VÕÓ^†_¯-l¥[µýÊƱ™2|{tt[âWI|PäÍêøÕÖúéØéUW¡ÜÐœ˜a#ý_‹¡jN½},ò!!!;ñtt´-ɼ°¨øͪšö[-Ž¿e”ü"DÜ–äe”Î Ò0O¨9q‘–•Ÿ>¨5y–hu[רB;!!ÿÌx:Û’ø:/øèþÄ=sV8€Ð‰öcû¯Òà\‘}ÒK@­‰¥®¶UÂWUÙ¯Œ±Šsø´ÚÔ–³D.0[BÔó™Ž?înËB<]­É%ýªÂm÷‘xWfï% æø¹"¿…vR:ž«ºï®°}!‰îÝ4›ƒz›v­¡Kꓽí7îËB†)9l¶ÀÑn·¼“·&/ùm”xYàß*j]Ș0ºt´“€ ×Åã‡Ìz«BŠ‰”*4p!˜³TW Í=yâ‹’¾æQ½Íÿ7ž†kS g+`°‰~Ál–ÕËŒ¨#·>õðÐàxÚ}=S[{X­>p„ƒ uð€5?Øܵ&S,#àXŸKLïw"‹ÜRQC§€h¢i.þLé‘Þ®ŽŸíN›‚RÒѹrãcjI|TÀ/'¹½>Z.áý]x ¨5q±„˽ê)~«²OŒ§qgxc Y i€KÄRÙд‚t¯ïí\ûðxÚ=P—jz¿+h¨ƒsП  u`ìà-2#Ô6û]Ó¯VÆÚ©Å8¸DÂißEF¼.ÝsÅ›mÙ[Ü3‰m•ur·5¹ÌÏÉÝÉU]wL¢Mc@1@§Jæ¡Xªé¡ºÔüCw•ÅBï%qºÀ#%‚èòaØP çדgáî!–\p ¤în;Æ‹ïÖïOR;å¼9q9¥K}í¡sí$Ù3AtŒ…y,–jøÄî¶äµ@o¦ãZ×°#ªž•1Çg2Oùöø¯{1Šõý&rPXHŒ¥Žè ýb)ýXêýIs„w <€<'à^Ó¿íºžžçs«o\ ám¥­`o.“> øû³®På!ÿ®XªñÖÅl®+ýÙR’{ÌYÐàX{„£ap „á…Î<€çüQäùδçt¹.Ñt´up”W½cx˦õk^*D)n=MÀG›±e¾§£EÇîU?tc;ÒAQι¢}À–Nþ=g¯¥Õ»yçz·%ù¡’ÍZª–Ô ¶eðµkœˆx5ÿâÓ=ß·ü.Zßôs « +ï¥!ñ)W°q²—luõ%»èºNL´žò‘û]PuU$ÏÃ@~þ@,µí’>>¢æŠx·q#—Ö&/ëíj¿˜xJ/¼Mð¾ßð%ŒÞ’bQ¤6Ùuöq€ºu æZb]\V[ßøéâH»Tjá¬í¼RÀg$L+VPà([5ý‚h}ÃGò÷QªXª‚€rß_‘üþ(û¦Ö2>Õ°À’߀µ-îlfÇýû8–Ò—c©Æ?‹ {²í¿Õš£ã x.X[ëþqÏ=¶ƒ‘-÷ \8\^»yfè¡»ÕÖª9q‘¤_¢Üë¬\•YCétBïòwòävur¥éà]¼¿{ýðíø´ìÝj‰Ÿ£ããS6TÎw¦ÿLâl)íU“\pÄÔXäM¬~ëw]¼5"¾K5-GS“GoUyjk«¥ºÚD|¥|$U²Øsøé…Émü€¥À®N>‚:Š·×$Li„ÚúÆ3,ø„V?Œu„5x8–j¼r :CD8‰ü ENp¸0¢æ=ç[˜óIDDÿajî.½WuÿÜKRË`죉*Þ’zŠró¾L׎kø­ ˜.ð;ØŽ¯ÚæÄà 6 ÈWð¾lg0»ÇNogúæXªñë(ô%qè¾€çÂc¥!p„„†à:!ÖÍërÀÔoΛW¾í÷“ózÐÔTåtÞY:ô¶$UíæÇjêxˆ&N“pÆwÚ’¾­o¬Îw¶žª ö£Žs :4"š;2cvºûŠœü§?ɪiͼ{ýˆ¹¢œ€›Y Þ¤åâ@ ð¹B¸ þñDoΫ`ûeÐ8­G“MËó]é¶É·È›X¾úrQcîaáß šÅ@Œi5ô÷('G˜¬ Ç‡F—‡ùˆv|a§žÝÑDÃA$¯ÇTS8¯&µàÁ¾Ìš`kBé‘œ¸0‚ñ:yáe]'ñÆo$v†‚ø µ½…wg7Ö0fä$& •>ˆXÓ úÚæ›”cŠÙ ‹ÂüÏ÷Gj€)sôXêý•™ _!ì g8€33’~pï¦ÙP€Ýº€^°vžÛðâz»ÖÜà¶Ù³çEÝiU9Ñ»r™ô(ç¢áWÌôÑ{ÐrÉl1T³à³À{€{Ì)¼îí°‰åŒ‹ø;ºN†cóñ oO"¿ÎÍØÒ”Ët|1ß•þ¯ÞLûÑ€®òÐM5Œ!»³¯–åë¸ó-çäflÞ7R¸Ö8‡vpdÈãN!bó‰› œRTüw Wä½çI·³OÄg• ªÑþÐïé?HÔiùÎŽ{‡ ^í|6 àÔX²±Ä/Eãðž™"#ûTÈå{sÙô³Å…ë×?¾Àï€à1¾Ý›ø­\Wú ;¿ŒÇr|=VßàB,É9!œAs´¼{ÖY~ëÖm+.ÌÅÍ%±:Bɇ-iŽ$ÇjT›csE;G€l!`fk€ xÀ’=˜N†c«“7pòß³Z­\±©ÜbH¹Å8oª»·[· µµ‡ÕôRöo•j?zºØÉ‹+@}»ŒòT®/Ì÷©[áä%ðÍd¤*”Ü‚ÌuμeNÚMùý¹¶ä½¥Óý½#+}¯Y,¦«F9ùBÉŠ@XŽêÑu2ª”K,'ô¡¢â)Ó,„UãìÑÙÏåèŸnylÕÀR@3|…Ç÷l@¥¸Î«Ž”¯óœÊ\û{øR2 ¦ ~ßCOþåtéi!€Pч±õû;R뽫ôŠW`}7†ÚàY'ò† )É4³Ë]'£Jùär°xŽ¢X5í}\• ø$å8{tÝ9>½òD“M-¤.*#öRnÚÇô_±“µ»<Ì$ÿ‡Û WÑHïžÒÂøn» ˜ÊsÞçÓm€¼ƒ„ß©nVrAéˆÌ›W r ÛcÇÐzX…ý¼5ésßß4N[×¥„³€0‹ }Àr]´pwöèZ2¯ZùÄm€Ž/’XÉèôãËå‚APGNÐÕ/ p £ÙI=]4wîá3£õMo­M5^Kênø-ô# ­ŒªL¢…Ȉ¡˜ù¾Â*sBáàXªá”5À—ýT)­-üÇÿ¡ÂˆSjgÁWÇŒJÿí3º ߸G}“ÿ6!¹Ö¯:B{Y©òh¾ú²£²1@pÔÅ’~#†ƒcsæ>²pîÜÃg‚z¿w;ò½ß D€mi顲[Ôºç[%s+€7øjkÀ-zÃtÙÜíZ‹jÄåÏ–œ7«yö>¢sKÙ–ÝîGߟ°•äyl뺾̽Š÷ÄR…ßØfwk‰hEOºœþí;ÎÊÓ±káz¯oŠZ63ÞðØ–îŽ ³’ R{±Ïzè`ÍsooˆÖ7ÅgÈùi&óÔæh¢á |òÝ~#æ!€eÞo ‘ÂcÉ°?²Ñ­h¿C¹B*¯‹Û f%œ_mlÜÂnø0„Q)ǤG¸;šjüP>Óþ§áÒèÞM³Í {hoçÚ‡iíý"?ãs?gÆR fÀÅ¥[º;6ÔÕSõôó$ù>ìF²iSlk,µÕs±Z@k,ÕôI—Ûï¨rfV Ø}#ýÛq§UmCé 3kþ§vNÿ÷nè(ì¿75U½šÝú}ûxÙAh‰;<¿·gƒó„‡Áe‹ƒQ[ý²ú¶ß¡¹HûF»Oñš39ùƒ(ì>ÅhöÍïQ¶Í‰Gý!&ò&ÖXªq5¦’âI¹®tqÖ\'–l\bo­~ˆÿµü#ÈeÚ@mýü7HæÁŒ¢ ¨ööµ*—éh€h}Óg)}/X€6Æt5›ÒÇH=iaþŠò»=C)J¢°¾9—ibÞ¼êX_õs€ö Ðä&Âkƒì,õä2í³‹ b©Æ,€x]¼·7“~_4ÙðS’óíñ„>GðIžÉGs™ô‘P[߸L>±î¤]ä•æÌ;•Ô;Üìc,,ñ9å·¯ÜÕÉñ+vw  “ÀBôÅw†`ÒgèNþæµöºe—prpExžF¢ Ô!(n,Sî:^Š99]ÑìÈ“o\x&)©-ÔHuÃG#Ñ“Yû4ƒ%‹Œ:À>(üVköH-LâÙg· ¸°Œî0³15!øßòpèÉ-CáTš5Cñï'—qr×ËÕPßE S˜›z›A,ðÎáÏ~ÉíÙSùxé9~ '/”‹—½êÉûá[.ðc*±.êíl_Vª2Ÿiÿ>€ ž²Ós]kVÇÀØ‚vH{e¾3½#sOo6½zè:ÁôÕ^Ò §™ÈBï¨jçóàØ÷í €|&} 0æ…äMÊmÝí‚3†6(Æ ·sí:Å¿‹QH_ìëJéÁëE™­,zlSŒFÒÍ&šý0*}s^N>DÂVW ÷*Þ=º…ÏÄ”²–äq¹Lû•>2î4×=PpG-BÒM¹Lê¬ò’E«¯ëíì5´àÒá\e›T!BÍJŸF 6{ñéc¸ÀšÀö…#¤Cäflþ _V–ê*/¹“žLú’î<ÆÜ›i¿Ó€'ã ¢ tN®«ý›ãÐ-‰¿£ËoÉ¿H ø©‰uŸ><ÏUß<{ç!”vrϹÍñ«áLAÊJZ!6”$a”\_Wú§ |šæmz :k%pÊlÓ‰ÚñÃïYŸ~q:"G pL5ÈΌȢ}êuë¶å2¦p~[ûIžžïj÷<]é×ætD>‚òaıËÛ{2黈³€äÿ"ØN–ÞOË·õf:þ{¶ú˜æƒmM´˜¶L¸Á™=“ËFe-Ôû÷äc¥Í´e[Ë‹•&šlú )¿²ˆƒ í¸ž2kÍÀ–? g)'¦.Ñt¤%Ž5Ÿ… *qÝ2„ÚEsÛP†‘’N`1î'¹LûÇBFcu&7š `;€+ª¹5HfÖYÉ):“´ÇBf(`V²ÏÇ]ÇÞÕ÷ÊÚ%t>EâXõ0"Ä ‚}±涞lºä‹;¢{7Íæ€=à"¢ô’…m‚¸F¶ƒº³¯{mÉá~Í܃ãŽë|Ø‚ïfAŸ_"õ¨30ø£áŒ>±ú† ‹GÅܒϤÏõú{Ô%šŽí©"ß‚Âw7`½ ¿¸/—éø FgÂÌŒ7Ì™fx<‰£‡î/Q°Q›þŸ­µwyÝPȹo¡÷yÕ[×~ËKß{Õ}qò(ý¾o\Õõ¦­û,zü0u\ݾŠD„à#KðÍlëúë$]ïuÅX=$¤˜’N¬Å‰ƒdt»W=ˆ¸vŠŒ€»Ôœë[[CBþ¥)íè?à9ù³2{ö;ùðÕ÷íëâ58!!¯$$Ä› ¥£-…Û’¸i(Î׿pÚº>TVn Ÿ;}ŒgÚCBBŠ˜ô¬©Fô=ñ¶CŽ $Çe°¡“‡„LŒÉO\y2`ËOH…„„LŒIwô¡7¯”;Œ!ÌÊf'»íÒTê…åÎü>®œ‡„Lqts Éö×è*îôˆG(ß4;!!!“Ìÿ%¸ÇžIEND®B`‚assets/img/digital-ocean.svg000064400000001127147600374260012055 0ustar00assets/img/cloudflare.svg000064400000001662147600374260011501 0ustar00assets/img/notification-bell.svg000064400000000602147600374260012754 0ustar00 assets/img/logo-menu.svg000064400000012334147600374260011261 0ustar00 assets/img/wasabi.svg000064400000005307147600374260010627 0ustar00 assets/img/google-drive.svg000064400000001363147600374260011742 0ustar00 assets/img/warning.png000064400000003452147600374260011012 0ustar00‰PNG  IHDR66ŒEjÝtEXtSoftwareAdobe ImageReadyqÉe<"iTXtXML:com.adobe.xmp Ía©ÚžIDATxÚìZÍKTQŸ7Ù„CŒ‹ Š–ŽBX Ic¨þu£2ÒÂ}â.Cœ(¤Ë¡M —~lBAEP&4„d¸É6QJà:NçÒÏœûÞ»÷Ý™^òüsçÜ{ÏïÝw÷Ü3c …Ði´pè”Z@,  ˆiY m°,Ëôç×WðógÀà‡ÉIÊŽ-ÑP ÃÖx Ø|Gla[‡ib'xTˆX08sJp„>‘ÿ…X`Ù†Å2öñ=±9REÌùX¯$ð5ÀĚħׯÄb€,ð#²"ØFý²8†ïˆM3Á>'ãkáwÔÚoÄnöI¿M6}šÐ§´Ï>Žå bâé¯2OÜEßq¦ßªd•«N,É· ¨wÑ·}iÿä¿&&ŒN…1:M‰ibœ`,0YÈàbŒÉ6¼ ‰Ib׌`ÄÉí!Í&7‹8#$8GU‰‰ V˜€'ˆ_›M¶ÑF|'Ÿ·W+SÄ8Áøh ~}6ÄúˆoŽ¡%$&ˆÉ£‹ñ½ È3¾yüŽZ—®˜ Æ Æ¢Ä÷,`ñ_Çï8[Ô¯Ä8ÁøIƒÚ è ÇT/ÄÂ’ #åð0.vKüw±ÍÎR’Œ$\ býÁˆºx}ÓDê,*’~ÓÄÄæÝv)œ%Lj„Ë>œlË„D—Ø3É’b™ï=B¥ä·ÄÌ;eŠ˜¸Fä˜ £Y1ýE¨X3“‘丫*1K’a¤BêV§Y´II2Ë ±¤Á0eQ7‰ ±FI†Ñ­QF¼AŒh”Ö»%I£±I‚Q´afœaq8!™T%v°ÇF‹Æje˜€2«ÖÂÉÆZÆ#,)O0çÅ ^ãuj"nÚœlc çë[&gV¬ðŠ<™5¿!fņ<Ô.wÈX"ÖV7¯bà é<ëAÕ,<¿2ˆQÍ+Ú,‰MÄÚCyÔ0/jIÛ/ÕgÀC„ £±ÔbÌe››šØ‡LࣱbÌŽ{¬ðŽQŸ„H%µ±¶»yßæI>ÃûÐÀsü¸JdÂxßÜcÒ²yŒÙqÅ„]”d~CcUÊ&ö×}À À×ýæ•‚˜óà%ÆsÚR%#ùŸÇ9\ö[€«ø^Ÿ©’xäñþxø7GìàÿŠ±€X@, VbÈy“ú×ëÕIEND®B`‚assets/img/google-cloud.svg000064400000004762147600374260011745 0ustar00 assets/img/dreamhost.svg000064400000003650147600374260011346 0ustar00 assets/js/duplicator/dup.ui.php000064400000012252147600374260012560 0ustar00 assets/js/duplicator/dup.ui.ctrl.php000064400000014221147600374260013521 0ustar00 assets/js/duplicator/dup.util.php000064400000010501147600374260013113 0ustar00 assets/js/formstone/index.php000064400000000020147600374260012317 0ustar00'),c.$body.on(u.gestureChange,o.killGesture).on(u.gestureStart,o.killGesture).on(u.gestureEnd,o.killGesture),h=!0)},unlockViewport:function(e){"undefined"!==w.type(p[e])&&delete p[e],w.isEmptyObject(p)&&h&&(t.length&&(n?t.attr("content",n):t.remove()),c.$body.off(u.gestureChange).off(u.gestureStart).off(u.gestureEnd),h=!1)},startTimer:function(e,t,n,s){return o.clearTimer(e),s?setInterval(n,t):setTimeout(n,t)},clearTimer:function(e,t){e&&(t?clearInterval(e):clearTimeout(e),e=null)},sortAsc:function(e,t){return parseInt(e,10)-parseInt(t,10)},sortDesc:function(e,t){return parseInt(t,10)-parseInt(e,10)},decodeEntities:function(e){var t=c.document.createElement("textarea");return t.innerHTML=e,t.value},parseQueryString:function(e){for(var t={},n=e.slice(e.indexOf("?")+1).split("&"),s=0;sn&&(r=n)}if(0=e.maxConcurrent)return;r++}0===t&&(S.off($.beforeUnload),e.uploading=!1,e.$el.trigger($.complete))}}function m(n,i){if(i.size>=n.maxSize||!0===i.error)s(n,i,"size");else if(n.chunked)i.started=!0,i.chunkSize=1024*n.chunkSize,i.totalChunks=Math.ceil(i.size/i.chunkSize),i.currentChunk=0,n.$el.trigger($.fileStart,[i]),function n(l,o){var e=o.chunkSize*o.currentChunk,t=e+o.chunkSize;t>o.size&&(t=o.size);var a=o.file[q](e,t),r=new FormData;r.append(l.postKey,a,o.file.name);r.append("chunks",o.totalChunks);r.append("chunk",o.currentChunk);r=k(l,r,o);!1===r?s(l,o,"abort"):o.chunkTransfer=u.ajax({url:l.action,data:r,dataType:l.dataType,headers:l.headers,type:"POST",contentType:!1,processData:!1,cache:!1,beforeSend:function(e,t){l.$el.trigger($.chunkStart,[o,t,e])},success:function(e,t,a){o.currentChunk++,l.$el.trigger($.chunkComplete,[o]);var r=Math.ceil(o.currentChunk/o.totalChunks*100);l.$el.trigger($.fileProgress,[o,r,t,a]),o.currentChunk',t+=e.label,t+=""),t+='CÌ@–9N¦"BkJf¸”PE!ù ,kÐÉéƠإ&‘„%‡ ¢ˆ™°§ ÔЈ`G¥0’Ä1HLƒãÀ’8”`Ô®U À`` ®Ø @¡,¢Á€A6O 0(0&ªBÒÈfJPh #ilŽ~!ù ,[ðÉù„ X ÏÜÕxJH2>LƒYÉÓ °HÌ- t¶Lâ‚Y¸&‰$¨±X“ÊLƒq8NC#ŠÝ<1a¡x$n‡S €x\y ÄšHŒ; Ç1n8„)!ù ,VÐI!ÇMêZïXÛæ]Ëå$§&PNC8‚H‰€†Äñn÷†˜¡à€@Ì5ƒìH+k¬šÂ±Û c:cø …à˜…WJ q86 —ÀÚ¡ª4†c!ù ,]ðÉùR¢XÞ'„&\„Tâu âa›e „ ,xŽ/E€( '‚²öQ 0®!£PèM„ÆQ8x€Æ‚ñ(ÀÓv8ÔzÁ‰"Ñ~>Ç÷ !ç6J9!ù ,ZÐÉéR’‚jiåØZ÷m™&”ÀN 2\TI©ÎÜ ØìÃQü àJœ™°r¼&‰Å)QÔ FÃ08 IC00-Lsp˜„öf`u0‚5åE!ù ,XðÉI_ªx&QÇÂER‰Éð dñM‚ZEÓ‰’¢gÏà G @ÈøŸDƒ±U ’—±p>"Ãà,$€d 7 –`¢&H¾€&Š¼²!ù ,ZðÉ„¼øŽ¢²—FÑ|R÷Eá Éiã•°à Y+!à ž™@@P¹¡¥50xp2Â#ài  Nà‚0lN°Ó$0@H–‡N}X<Ìa}q¿¥/)ÃD;assets/js/jstree/themes/default/style.css000064400000100257147600374260014557 0ustar00/*! jsTree default theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf>.jstree-ocl { cursor: default; } .jstree .jstree-open>.jstree-children { display: block; } .jstree .jstree-closed>.jstree-children, .jstree .jstree-leaf>.jstree-children { display: none; } .jstree-anchor>.jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor>.jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor>.jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf>.jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .jstree-contextmenu .jstree-anchor { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li>a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li>a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li>a:focus { outline: 0; } .vakata-context .vakata-context-hover>a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator>a, .vakata-context .vakata-context-separator>a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context .vakata-contextmenu-disabled>a>i { filter: grayscale(100%); } .vakata-context li>a>i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li>a>i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li>a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator>a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li>a>i { margin: 0 -2em 0 0; } .vakata-context-rtl li>a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default .jstree-anchor, .jstree-default .jstree-animated, .jstree-default .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default .jstree-hovered { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-context { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-default .jstree-clicked { background: #beebff; border-radius: 2px; box-shadow: inset 0 0 1px #999999; } .jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon { display: none; } .jstree-default .jstree-disabled { background: transparent; color: #666666; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-disabled>.jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default .jstree-search { font-style: italic; color: #8b0000; font-weight: bold; } .jstree-default .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #e7f4f9; } .jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default>.jstree-striped { min-width: 100%; display: inline-block; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default>.jstree-wholerow-ul .jstree-hovered, .jstree-default>.jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-default .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default .jstree-wholerow-clicked { background: #beebff; background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); } .jstree-default .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-default .jstree-anchor { line-height: 24px; height: 24px; } .jstree-default .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-default .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-default.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default .jstree-wholerow { height: 24px; } .jstree-default .jstree-node, .jstree-default .jstree-icon { background-image: url("32px.png"); } .jstree-default .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default .jstree-last { background: transparent; } .jstree-default .jstree-open>.jstree-ocl { background-position: -132px -4px; } .jstree-default .jstree-closed>.jstree-ocl { background-position: -100px -4px; } .jstree-default .jstree-leaf>.jstree-ocl { background-position: -68px -4px; } .jstree-default .jstree-themeicon { background-position: -260px -4px; } .jstree-default>.jstree-no-dots .jstree-node, .jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -4px; } .jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -4px; } .jstree-default .jstree-disabled { background: transparent; } .jstree-default .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default .jstree-checkbox { background-position: -164px -4px; } .jstree-default .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default .jstree-checked>.jstree-checkbox { background-position: -228px -4px; } .jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default .jstree-checked>.jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default .jstree-anchor>.jstree-undetermined { background-position: -196px -4px; } .jstree-default .jstree-anchor>.jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default>.jstree-striped { background-size: auto 48px; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default.jstree-rtl .jstree-open>.jstree-ocl { background-position: -132px -36px; } .jstree-default.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -100px -36px; } .jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -68px -36px; } .jstree-default.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -36px; } .jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -36px; } .jstree-default .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-default .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-default>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-default .jstree-ok, #jstree-dnd.jstree-default .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-default .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default .jstree-er { background-position: -36px -68px; } .jstree-default .jstree-ellipsis { overflow: hidden; } .jstree-default .jstree-ellipsis .jstree-anchor { width: calc(100% - 29px); text-overflow: ellipsis; overflow: hidden; } .jstree-default.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-small .jstree-wholerow { height: 18px; } .jstree-default-small .jstree-node, .jstree-default-small .jstree-icon { background-image: url("32px.png"); } .jstree-default-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-small .jstree-last { background: transparent; } .jstree-default-small .jstree-open>.jstree-ocl { background-position: -135px -7px; } .jstree-default-small .jstree-closed>.jstree-ocl { background-position: -103px -7px; } .jstree-default-small .jstree-leaf>.jstree-ocl { background-position: -71px -7px; } .jstree-default-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-small>.jstree-no-dots .jstree-node, .jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -7px; } .jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -7px; } .jstree-default-small .jstree-disabled { background: transparent; } .jstree-default-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-small .jstree-checked>.jstree-checkbox { background-position: -231px -7px; } .jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-small .jstree-checked>.jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-small .jstree-anchor>.jstree-undetermined { background-position: -199px -7px; } .jstree-default-small .jstree-anchor>.jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-small>.jstree-striped { background-size: auto 36px; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl { background-position: -135px -39px; } .jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -103px -39px; } .jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -71px -39px; } .jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -39px; } .jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -39px; } .jstree-default-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-default-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-default-small>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-small .jstree-ok, #jstree-dnd.jstree-default-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-small .jstree-er { background-position: -39px -71px; } .jstree-default-small .jstree-ellipsis { overflow: hidden; } .jstree-default-small .jstree-ellipsis .jstree-anchor { width: calc(100% - 23px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-large .jstree-wholerow { height: 32px; } .jstree-default-large .jstree-node, .jstree-default-large .jstree-icon { background-image: url("32px.png"); } .jstree-default-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-large .jstree-last { background: transparent; } .jstree-default-large .jstree-open>.jstree-ocl { background-position: -128px 0px; } .jstree-default-large .jstree-closed>.jstree-ocl { background-position: -96px 0px; } .jstree-default-large .jstree-leaf>.jstree-ocl { background-position: -64px 0px; } .jstree-default-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-large>.jstree-no-dots .jstree-node, .jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px 0px; } .jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px 0px; } .jstree-default-large .jstree-disabled { background: transparent; } .jstree-default-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-large .jstree-checked>.jstree-checkbox { background-position: -224px 0px; } .jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-large .jstree-checked>.jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-large .jstree-anchor>.jstree-undetermined { background-position: -192px 0px; } .jstree-default-large .jstree-anchor>.jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-large>.jstree-striped { background-size: auto 64px; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } .jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl { background-position: -128px -32px; } .jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -96px -32px; } .jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -64px -32px; } .jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px -32px; } .jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px -32px; } .jstree-default-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-default-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-default-large>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-large .jstree-ok, #jstree-dnd.jstree-default-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-large .jstree-er { background-position: -32px -64px; } .jstree-default-large .jstree-ellipsis { overflow: hidden; } .jstree-default-large .jstree-ellipsis .jstree-anchor { width: calc(100% - 37px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-large.jstree-rtl .jstree-last { background: transparent; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive>i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive>.jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive>.jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; } .jstree-default-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-default-responsive .jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-responsive .jstree-leaf>.jstree-ocl, .jstree-default-responsive.jstree-rtl .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-responsive .jstree-open>.jstree-ocl { background-position: 0 0 !important; } .jstree-default-responsive .jstree-closed>.jstree-ocl { background-position: 0 -40px !important; } .jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -40px 0 !important; } .jstree-default-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-responsive .jstree-checkbox, .jstree-default-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-responsive .jstree-checked>.jstree-checkbox, .jstree-default-responsive .jstree-checked>.jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-responsive .jstree-anchor>.jstree-undetermined, .jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-responsive>.jstree-striped { background: transparent; } .jstree-default-responsive .jstree-wholerow { border-top: 1px solid rgba(255, 255, 255, 0.7); border-bottom: 1px solid rgba(64, 64, 64, 0.2); background: #ebebeb; height: 40px; } .jstree-default-responsive .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-default-responsive .jstree-wholerow-clicked { background: #beebff; } .jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #666666; } .jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow { box-shadow: inset 0 6px 3px -5px #666666; border-top: 0; } .jstree-default-responsive .jstree-children .jstree-open+.jstree-open { box-shadow: none; } .jstree-default-responsive .jstree-node, .jstree-default-responsive .jstree-icon, .jstree-default-responsive .jstree-node>.jstree-ocl, .jstree-default-responsive .jstree-themeicon, .jstree-default-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-default-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-responsive .jstree-last { background: transparent; } .jstree-default-responsive .jstree-leaf>.jstree-ocl { background-position: -40px -120px; } .jstree-default-responsive .jstree-last>.jstree-ocl { background-position: -40px -160px; } .jstree-default-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } }assets/js/jstree/themes/default/32px.png000064400000013043147600374260014203 0ustar00‰PNG  IHDR@`lK«(êIDATxÚí XTÕÚÇ7ˆ¢²ŽGñˆÙÅ[uÒ4IP?µ²²,¿û¾c&hyÍ2OxúJ;iež'ïG©¥‚•À*ró‚¢¢)¢â …MA`¸3ܯ3ÿo½{fÓˆØíìͼëy~Ïölfí½™ùñ_{­½G ýZ¸XJÝÁísáb¿÷ßoñ×M.cráÂå÷ZX€œÀ8ráÈäÂ… '@ '0N€\8²¹pá È Œ N€,@.\¸pdrû¶ïïïïÐØãæPšÛöhU’Ï~‡Æ8ô‹zNï^€Ü¶ÌæÈ…‹ eã¦0ët:³.`›IÔµÛtu:z¼Í,žC=§ÓA~, ßQ¹}jÏdÝ“ujéñ6X¦}û¿5Û·•Ÿ©ªà§©ÐËDlÕ$¢°‹ jüâöú@§¤¦ÂXlD‘±EE…($ ‹`4ŠåÅ(.K¨.†Á`% fûÅâµ+Ê+`,í‹6ó ó‘_”‡¼Â<óäm¢í+ëкjµOEi¿®¶ö'9–­——aÇÙrûZ °¦0M†ß.ZKÐn ašJ\y¹ù²èòó _P€"!›b‚ÄTZ!ˉ¨«­‘kõhĹ´ã¾¶ç2¾Çà \̈ABÖI\ÈŠFܸp#çÅ:Z PÞ÷(bÞ~ƾW"±ò ëðÁÆyÚКðH€·$BësM™í"@5ß\jзo_´¦¦ÿæ’µ<þtnMt+MY™™ÈËÏ—Ó‘—g¡H^”úHŠ ÔøÝs~^>|bOá ì/ü7ΕïD\y(.”…à\Ù.1~…KUṺy¹¿£ªÄÆgGçbw\¼ÿ¶Ôú_$¾‡ðœÕðK]ŒÀÔX›èŽs»VS6”îlW/Àâ«,ˆ‘i± þ ßmGs‘Ÿ½hÇDÔªŽ¿.@gÊÌÌ€!Ë€´´4¤§§#+‹$˜+$/‹°@`TX¬¶·›ssó°úìlÎx~9sn\‚ãJD¯Ä¾¢ØS´aùK±6öïÈÉËSíïCå³/?ÇÂØ 2~ˆ¢_Ç·‘õÜqF‡•æÀ7ÝËõS°ôÒT,‹ŸÏÀ Mq鯅InTË?ÛP_S Ю ¾½“ }ðÆOðBkL€­éøëtuB€×Ó®#5õ:®_OCZú !Á,ädg æËÇ£ÀšˆŒ%Eª›íB€$µyQ^Xœ4ëÓßÀ¦ŒðÉœŸ¬YØœù|3ÿ†&ŽÃ‡=‘›“K4«Ñ¶Óô®î¯E<ŽùñOÁûü,þáEÌ>2ßÿcýñ^ôËxëÜ@xïƒ7Ž ÄÌh¼ì?Ÿ¹\uùØ h˜1¶ŠH']éMG£MöüðÙS€öL€­éøÓkFF&® ùÑ`HrJª,´ô4d‰åÔ%Ì‚’»„ÅÅZ$@äˆø=± þ,H|Ÿ&ŽÁ'IcðqâóBN£ðv¬þ7êL #ÖUO€Òdס#¶Þ‡qGº`ì¡NÙ¯Dw†gø“˜vàŒ‰º ƒÃ$ ‘ðD°÷M÷#&éŒ&ƒ 4°a+8åçÆÒ±uÕø–›•‘'zó-Z¼öúð5‡ø[ëÿT€ Sµ»ã¯Uû"š)í‘ôô‰zÁ\KN‘ex]t‰‰,C²³-çÆŒF9šÕ vîÁñåŠ×OôÔ˜~xãÄ£˜ó“+žÜý ¹“BF‹usUí¸öS ÚÜ¡Bp!ÙÜÓÃÂá$Ám‡„A‚Áz!&1¶þ¨$±•^‹lT€´Ü­Ø* rΩ!œ[îñ'™e Ñ“ðâôHˆO€^É×’EL±t‹…é¡20 zç'?ƒ!ÁÎðn‡a¡„ðÚcXp{¸ïjƒ'îÁmá¹ëy°FMÒ¾ŸÚ‡¿¬ÿ”0`›„Çt‚ ýý%ôô_s/_ˆ¾iÿµ_NÒ×(º¸Oœm"T¤GÏ+´èØÎAµâi!­êøÓ~R‹OH@|¼…!B½¨/#%Ù"ÁTqn1MYQ[€t¼½üÆ›zùHèíã€Þ[$<´Å}|%в^¢îí눉»FÉëª-@’Ú¦ð­èµª3þZBŸÍVDÛ¬x‡Î•eÿÕ “$u šÎç)´E‘ òóõSÿª§E'Àæ2 ÙZØšŽ?í/}°ùÙBi0AŸ€TëyAB+znoêíCÒi#K°—¨ûø8ŠÇŽPÄHëh%@Úßõ¡[pÿÒ.èõ¥znpBŸÏïGèñ}õûnÙx‡£ A¤„g+8-·—y`+`kÛ_[&Xk}¼^¤ÂD¹ÖËéP“Ô¾Dw@' ÎS$ÁIrýª‰R!ÕòrAXôU'b+¤×Tö?àÐN¸­î!«=°7æàMò£ã¤´¯šœž&Ñ)‰O¹âƒ$§ÐV|->2Œ=ºüÊÕåe¢.+GY¹¥.//—¯¡ó¢µ-®Qº–]ÑðÊ 5/ÅS¨È ¡½±‡w¼~™-´®š]à†´Åžäk™Vr3êV6‚¹á2åfj·ÿÛpSÛZ¶ÿkn† ÖK¬çû’Ѓ Ã0Í’¦(·#ß †a˜/@{Þ’È0L«½w' aN€,@†a8²†áÈd '@ ð9²†È ¨ú=¹}†È a '@N€Ü>ÃäÈ0  '@nŸard†È  ·Ï°92 ÃäÈ Ûoþ¤î|˸ü¶Œò3  èNÊ–éø-¨Ù~Úηd×lSZÐœ:AMº…Ú´]ï˜ÓvÎ6+ëhÚþ/@i¿)ÊûóÈ_°hñrLš>W®‰ñ¼ø;A8rûj ôZ jKrn¥øÖe•YzUDB¡×5U壦 Õe™¨)ÉDUq:ªJn ¦Ô€Ú Ú–l˜* äuéwÔJpJûô¥O?ElRü//Aðù¹ý¦Jbôý#Šøè[ëH|-ãÈ0*°¦ðº í&,R*¸ Õê 0çÒŽ#ìÚf\Èø—²N Þp †ùqÜã8—~\^‡ÖÕB€ ÷ßöl?ãß« ‘Xyá†uðõ§º|Hh¡ÏV€¶Ï·ŠØÔßUÛ·o_pü±}{ÿ&J€æÊÌxù_iÐË ¯*+Õ$Å¢Æd˜¯¶ÍÕ…©ðIX€=…Ëa\ƒsA¸P†¸ŠpÄU†!²ø $ÖìÅ®«dY«-À(}Vœƒ£Qëåý·• îÔ7ø"ñ=„笆_êb¦®ÀÚDotœÛm´Úl¬Ð?úJP`HÈ Y€T´NÍ&*_ØÔÀæ"A{Ó’ªÏ ‡”¯g˜H€•Bz•™ „*³õ¨]RYE7l$¨²ƒÞ6W¤`Mì»Ø”9 ~9ï"Üø9"ŠWÊì“YÝÆåXqz¶ê õ€…±düE¿Ž“ßoª—_LÔf¬¼0¾éÞX®Ÿ‚¥—¦bYü4Ì|Ò—þZÐÑ=ô¨4µ›ET¾´Ú@:Àö– ½`K?þά©HÒK@yÊiT 3õr¬ÊNçåR,]ä¢4ëyÁl•8ÛT‘ÿˆòÂgIã°!c26fÍ€OÖ,øˆ·±#xî%xGþUlztšÞÕÝkÿÌ Þç‡`ñ/bö‘1ˆ9ºч7á½è—ñÖ¹ð:Þoˆ™Ñïï߉št›“ížéä'}ø(ÛëØ$h/ZÃñtLýæͪò´ó(ϼ„²äS(K9‰ŠQ™qI–bU¶H††$TçS*J×F€yW0ÿ°'þÿ<>NO/¿€O.Á'IÏã#ýs˜;c£ºÀk×(!À4õàdס£üºcÜ‘.{¨FE¶Á+Ñáþ$¦xc¢îÂà0 ƒC$<,aØFWœ¹r\“AN€6ÐÎ †ú({~Õø*ÿM~k­V’ü¥µÚÇÿ׶¯öñÿ ¶IùfVUÅõ³B~'Qœt¥W£4ùÊSEÌ°$C¹{,D(Ÿ´Ь֜¿ôB€¹WðþÁ×ð?Q=0%¦¦ê©§úá“â¿£\àÚO„´ç®gämP³ ¬ûò¯¼±‹hC‚{ˆEv#÷´Å°0G¸IpÛ!a`è†ûp.þ°| 5°Õ'ÀÆàزŽ?%À”of žSa¢Q¿Æ„(½"DxíʯŸI0Nˆ0AîS÷³¶Ø š-ƒ ÔNÆä°àÜ^H¨=†ˆÚ#¤܃…øvµéËQÐƒÔ ½ÖîØ<¶þ<(aÀ6 éúûKè'pûw7œŠ‹¬âØÂÏ2­ãøËüzfuÅ "ùBÑ¥]Œ€1~J®”—•%LjDxÊ20" i()[f¨:R•ŸŠI~Ì}|ÑÛG’éåûcÝËÇÂÄ Qš¤z`5ZuþZBŸÍVD›VöÀé³á6û¯­oWhB43­b¸ èºe†‰>,òÛ+SxqŸ¨B„¥?DɵòdiEjϤ)7^~¯šzËt€\ûZkŸè¹u¼I+Òþ/Cï¥D¯/Ðsƒ]r/Žõ“÷Ývÿµš}»¹€„"@ê Ø.ãy€L“$Á–;z†™>Ø”üRÎ ¶#ùüv%!^Ú/$¸ß*Ç}õWŒhq%ˆî€NîU“—ßx“'!d絕êWåÇDXôžúspj ^³ôZ¤Løp_ý<¹zNDo«O~ Z¤’šz ±•ñé§ûåô§œ¢á+AF…+Aè23Sež<ÏO®+ò,µ ®†ƒj4»¤áäãÛ¡\Š§¶•tGTˆyGÏîÆé‹‘·È u›òR8’I *i9õNøZ`†Qáf_ø?»Ñ4—›´†›!PêmØVÎÿQ äÈ0 ß‹ Ã0,@N€ ð92 ÃäÈ0  Ã0,@N€ ð92 ÃäÈ0  Ã0œ92 à È0 '@ Ã0œY€ Ãpd2  aX€œY€ Ãäø{`Ãò/Iêt»ƒñ©$µWóà0 `³ùFôìé¶hQƾ?ÿyRÃq¬{÷ÉK—êÜsÏX-è$IliÊcát‡£Ë'Ÿ|²¨1† âÉx† Êü5¥Óßïu_sinœÛ*·ªm µ„vèðnöAA(\¿¾fŸ‹‹—ò\T·n^Û¶Õ %;w–´JPù ‰—îKÐ㦔 Ur·”Šò  ùCÏp´ƒï˜Óe€ÏÕò+!Ü°.î=I-î¤9 mÚÀpÏ=(zî9Ô­\‰¢µkk"\\&F Ê×­«Ax8 œ>ÊíÛËŽtí:V ’øè«þ''§§e6‘ } mK||‚ü3Ká¨;½ÿ೯‡½â<Õ¥ç-ÉÏ»»Ç½wvxÎjø¥.F`ê ¬MôFǹÝF«ñüN’¾:/6õ† KPÔ¹3j§OGùªU¨\²X³X·زؾØ¿±=´T‹.(I„CßÛÔlL€fAqI1„©&!²N€* °ý›®CçŸg 2~ˆ÷¿Ÿ¨—¼:wS6âowlÅ…wr|Ó½±\?K/MŲøixeÇðdiŠKþ€"Þ·M’‚.‰Í5rFAÍðá0Ï›óüùÀÂ…Àòå0}õÎ D¿£¥Gÿí™&—àíºÀô¸$¿ø„9 ´M,†à(@§é]ÝÇèW:?þ)xŸ‚Å?¼ˆ7#Çè¥×þäz÷[÷?>7ú¥œ·Î „×ñ>xãØ@ÌŒöÀ0ß¾zɳË@ÏÊ ”¤ñ’dÎ/›/(T=ü0êfÎÞyÕóç›Oöë·“Ö¥ßÑZ€ %¨õ9A«Í·¤@±¤V|)¸QH¶…dȃ" '@5àdסî~] Æ邱‡:aTd¼Ýž»G^›zàéì1Qwap˜„Á!ž–Ðó‹vW%¯nƒÔ¡"R ë'§Kr,°J°²gOàÍ7‘0fL­£Õ(pc´• Ö)pèС^ 6 © L‰ÈpTëàd×gø¢M¦G¨÷‹ìFîi‹aaŽp ’à¶C Á½«œE2ìþ˜ªh+À¶m'¹óÎÒñ²é% Rw¸ê‘G?kV‰í™–'Àaž0™ëðsEØÈpTsØ«ûK=Ö8å<(aÀ6 éúûKè'趬í’ç}nªÚZtb Ž´kW­/™$H¶Šó…” BîôéջŴ˜¦`SvGŒáe6™k•Ä§`yps0d2œÕžãÕmt—%NÙ-¡Ïf+>:}æœ$yºÔd)ù9:NÜëàP{J¼ÜY †\!ÚµÃUÑβŽä9;£là@&N¬Ý۵넖62räH/“ÉT`ª«ƒItweÄãºÚ:¹û«d@ à P‹y€“]Çþñ³¶Ù½¾tBÏ N¸{¡óiâ½îššÒŸ³ó?÷‰©/Ç#^’¦Äœ²ÛÕ¡Ãn10²ç¢ø9Ús;v„ÁÃÝ»/ÒR€M-?‡#FxÕTWW“èhУ¦Æ󫣚Îÿ ÌœN€N„öt}ö‘½ ú|ÞëÚí’ŸŠ¤àî~ÎÎß :9Ñhèï þѼ÷Œ8áíþìGÞ{\ÜÂ{üOòÞ£â&Þ“àe_òÞcâ6ÞsàuoòÞ#âFÞSàmòÞýâVÞ3à¸Gyï^q3¯.8ä½ÁˆWõ’~² {5­'̲Wñ±ô¤™öê¥fÈ«ZzñjMÜx•¦‡j^à›¦×Á%ýBl'ˆÖÌiiz?–^ˆ-M„u³–š^Ã¡å ±­d–v^ZÓktzx+‹•Ò×–4½6S<Úi;ûI<íĬý4­vêÝ~"^{qÅþR‹öò™ýÅ4íRûË¥mÛÝö ÕZ<@ÉÃxE-ã•-W˜6^éáxÅ¥ã•KÓ 0`À€ 0`À€ 0`À€ ðÈàû},ð]ùóTÖÁwÕÏaÝÊë`Ý¢ÐR¬V-Óý´H°nq }°RùgØÕ:‚u |ïag»÷+•p»ké{ÛŽ@ô/iãbõA˺Xû±d^¬xûy,)‰}ÄÎÀçÅÞÀ§ÅîÀgÅþÀ'ÅÁçÄÁ§Ä.ÁgÄ€¹¤´x,xZ2y`zH€RÏX'iéxméXg†[ja1åR«ƒÖåÄ•J¼‡Ñœ†–Ç }NN,’ºœžYö˜ª¸t¼òa7 0`À€ 0`À€ 0`À€ 0`À€œëþ qýã邵7j°å&¸¢wA‡«B> ®ñîég³}¥”ÀuÞú~6ÜIK\ë­ígÓ½ÃÀõÞº~6Þ-í4x·¦ŸÍ÷‡ÓWvœà£?o ~·WE¬ÖòÖ o¶Á{ï:ëàÚ;n§7œý^àÝ£ªCðáç‘Sðò‹OMwàåWG¢oàå—‡¢"gà%ñXè|4êõzIŽòZÇg5>K'’Z.ܤøª¡å©$žËX:—ô¸îäáDÒÒél)}__yzx8Iëv>œ·GHvVOº¹ÏZ^¬–87ŸˆW_±¾Ô¢¾øe~1M}yÓúr©þ¶õqýë%úE(Ö‹ZôËŒ¬—-Ýô ÉŒ¦éäh+Ì7•Fq)`À€ 0`À€ 0`À€ 0`À€ ð0àvE(ÁMˌ쒙·.´n^ j ܾÜ×ø ݦÀï(Ù7 Îübà·|ìÆ ¸xø«‚swî¥À Xv¬²wM 0`À€< X;ÇÀ 0`À×—Ä6M;N"~¸¥–ñÓ†[.oA|¼’‡ñŠZÆ+[º W˜v+…–—ûi€ 0`À€ 0`À€7ï `À€ 0`À€{'JdÓ솇ß_Ç Oñ0àOñ8à‡x pøe4pø28ü:8|æ9üÙþ$ÒRû3öN&?}¶/¿1[ìü×ßËöÏŸ—ë~œÇøûhà<4ØÎ~ZïßF;À 0`À€ 0`ÀÁßF_l›Gw 0`À€ 0`À€ ¸öÙ 0`À€GÏo{‘gðx,ð Ø¸É 0`ÀÝÀ"2ÉàÏí®p†ED$|È¢o"2­OeÊ+"!ý„Åûc üÙ±‡È,"2=eÿ/~qûºÕσ-¾mBác~ütÞ¾n½'ÈòÝûü¶Qð£âòã ^ý|ýŸåm°Þeõî=¾m¼ÞÁ% Þ¾n»ïËúÝ{ÌXD6=üÑÉi{í>þÆ«íN7Ûw/ow陶ïãvÞ¼8ÞÛgŠŽfíKÌ$8±›ÑÍ 8.Ï„Rëï¦öošG3Nì<•‘®Ï{jǪ)}4`‘Üù‚Çç3y}g§lé£Y'w‹§ ÉqÍV%v­ýÞ8ÔªñÚÇ=œ_%ó Îy-€¥pÿnÁ%je½–À©ÎQÌ¥|DÑW/ð6àMß¿sUÆ`)ÛøúÝàoµ¯cº‡s4oH€¥<ÎofP}ÀÑf–™Λ›tWWÝë9rpÔ\çmJc’Äh÷jì[eAz€£Žd{8Ë6…%/ÓxRܵ8êJ¾‡s4$K.g÷ G]ÉFÛ¬eò®5G]ÉG5à×ÑxçQº*¯¿ŽÆ»?‡+½k°dÀ¯£ñþ‘–ÔyW`É€óÿ¡XúE·$Î,"•Ò–†fKåŽm­söÞûFö›/=©ËîÁ¡SÆ£4¸È pêhéŒ`°”î±E+õM^zmd-ó‚ìË‘¼t7°”âJ°Xyè–òø\–ýkKÁRŸëÀ¹¤e~õ°W">Õ•#àtÒ²°>Ü,åë¹ œJZ–*ú‚¥x=×9ÚÎ`)]Ï•àmÒ²\ÅÓ,ÛüK=8sÍH ,Ë7µÛÊÃü\ª§Û–׫ç—¶ÏÇš_ðdâ”û7¿b8ÃÆÁ3`?àáFé> 0`À€vþ:Q×OBÅ„µIEND®B`‚assets/js/jstree/themes/default/style.min.css000064400000065221147600374260015342 0ustar00.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:black;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default .jstree-anchor,.jstree-default .jstree-animated,.jstree-default .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default .jstree-hovered{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-context{background:#e7f4f9;border-radius:2px;box-shadow:inset 0 0 1px #cccccc}.jstree-default .jstree-clicked{background:#beebff;border-radius:2px;box-shadow:inset 0 0 1px #999999}.jstree-default .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default .jstree-disabled{background:transparent;color:#666666}.jstree-default .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default .jstree-search{font-style:italic;color:#8b0000;font-weight:bold}.jstree-default .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#e7f4f9}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#e7f4f9}.jstree-default>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default>.jstree-wholerow-ul .jstree-hovered,.jstree-default>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default .jstree-wholerow-clicked{background:#beebff;background:-webkit-linear-gradient(top, #beebff 0, #a8e4ff 100%);background:linear-gradient(to bottom, #beebff 0, #a8e4ff 100%)}.jstree-default .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default .jstree-anchor{line-height:24px;height:24px}.jstree-default .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default.jstree-rtl .jstree-node{margin-right:24px}.jstree-default .jstree-wholerow{height:24px}.jstree-default .jstree-node,.jstree-default .jstree-icon{background-image:url("32px.png")}.jstree-default .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default .jstree-last{background:transparent}.jstree-default .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default .jstree-themeicon{background-position:-260px -4px}.jstree-default>.jstree-no-dots .jstree-node,.jstree-default>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default .jstree-disabled{background:transparent}.jstree-default .jstree-disabled.jstree-hovered{background:transparent}.jstree-default .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default .jstree-checkbox{background-position:-164px -4px}.jstree-default .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default>.jstree-striped{background-size:auto 48px}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default.jstree-rtl .jstree-last{background:transparent}.jstree-default.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default .jstree-ok,#jstree-dnd.jstree-default .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default .jstree-er{background-position:-36px -68px}.jstree-default .jstree-ellipsis{overflow:hidden}.jstree-default .jstree-ellipsis .jstree-anchor{width:calc(100% - 29px);text-overflow:ellipsis;overflow:hidden}.jstree-default.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default.jstree-rtl .jstree-last{background:transparent}.jstree-default-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-small .jstree-wholerow{height:18px}.jstree-default-small .jstree-node,.jstree-default-small .jstree-icon{background-image:url("32px.png")}.jstree-default-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-small .jstree-last{background:transparent}.jstree-default-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-small>.jstree-no-dots .jstree-node,.jstree-default-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-small .jstree-disabled{background:transparent}.jstree-default-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-small>.jstree-striped{background-size:auto 36px}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-small.jstree-rtl .jstree-last{background:transparent}.jstree-default-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-small .jstree-ok,#jstree-dnd.jstree-default-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-small .jstree-er{background-position:-39px -71px}.jstree-default-small .jstree-ellipsis{overflow:hidden}.jstree-default-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 23px);text-overflow:ellipsis;overflow:hidden}.jstree-default-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-small.jstree-rtl .jstree-last{background:transparent}.jstree-default-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-large .jstree-wholerow{height:32px}.jstree-default-large .jstree-node,.jstree-default-large .jstree-icon{background-image:url("32px.png")}.jstree-default-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-large .jstree-last{background:transparent}.jstree-default-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-large .jstree-themeicon{background-position:-256px 0}.jstree-default-large>.jstree-no-dots .jstree-node,.jstree-default-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-large .jstree-disabled{background:transparent}.jstree-default-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-large .jstree-checkbox{background-position:-160px 0}.jstree-default-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-large>.jstree-striped{background-size:auto 64px}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-large.jstree-rtl .jstree-last{background:transparent}.jstree-default-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-large .jstree-ok,#jstree-dnd.jstree-default-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-large .jstree-er{background-position:-32px -64px}.jstree-default-large .jstree-ellipsis{overflow:hidden}.jstree-default-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 37px);text-overflow:ellipsis;overflow:hidden}.jstree-default-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-large.jstree-rtl .jstree-last{background:transparent}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-responsive .jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-responsive .jstree-leaf>.jstree-ocl,.jstree-default-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-responsive .jstree-checkbox,.jstree-default-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-responsive .jstree-checked>.jstree-checkbox,.jstree-default-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-responsive>.jstree-striped{background:transparent}.jstree-default-responsive .jstree-wholerow{border-top:1px solid rgba(255,255,255,0.7);border-bottom:1px solid rgba(64,64,64,0.2);background:#ebebeb;height:40px}.jstree-default-responsive .jstree-wholerow-hovered{background:#e7f4f9}.jstree-default-responsive .jstree-wholerow-clicked{background:#beebff}.jstree-default-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #666666}.jstree-default-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #666666;border-top:0}.jstree-default-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-responsive .jstree-node,.jstree-default-responsive .jstree-icon,.jstree-default-responsive .jstree-node>.jstree-ocl,.jstree-default-responsive .jstree-themeicon,.jstree-default-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-responsive .jstree-last{background:transparent}.jstree-default-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}assets/js/jstree/themes/default-dark/throbber.gif000064400000002670147600374260016122 0ustar00GIF89aó```   @@@PPPpppªªª€€€hhh999˜˜˜xxx‰‰‰XXX§§§333!ÿ NETSCAPE2.0!þCreated with ajaxload.info!ù ,@pðÉ—è2uJÄ:ÐS"ŠL$…cBÖJ‚ðÇÐ"SšP( G¡µ %‡¢$BÊ„` œd€ÏcÀœ­Âד!LÂXwVrP5Ò g¥*¢aýš :1 o!Y3 !ù ,]ðÉùÈ’‰N&•A£IG¢8‚R £(Pp“'ÁaE–I†ÂA0[´Ö£± XÊÀ°X@£Àè7i0 [ÁÁh$ ú(Ö,óUCÐÆ%s s•j#!ù ,ZðÉù¢X.ÉTJG&9FÒ%†˜TEÓ5“0HÄÑ€ ‚…€=M  ³É`±R.’ È|® ‚VÄ}Àº”¢Ù‰úª’ ð„€ŒÌà9÷‹ÏS"!ù ,\ðÉ)½’¤g˜4öç-Ø&C¢‰ !‹Ìà%V ¤‡ê1Pˆ%Š¬–Ø Ñ"p€rÙeQè(¡‹`,P –ãd}ŒÕBIbв&Ü-·Ãõ!ù ,Eɉ¡XY ÏÜÖ!(^˜ HqX^OF±aõJí˜ÃD€ø‚BÉrÉ”>CÌ@–9N¦"BkJf¸”PE!ù ,kÐÉéƠإ&‘„%‡ ¢ˆ™°§ ÔЈ`G¥0’Ä1HLƒãÀ’8”`Ô®U À`` ®Ø @¡,¢Á€A6O 0(0&ªBÒÈfJPh #ilŽ~!ù ,[ðÉù„ X ÏÜÕxJH2>LƒYÉÓ °HÌ- t¶Lâ‚Y¸&‰$¨±X“ÊLƒq8NC#ŠÝ<1a¡x$n‡S €x\y ÄšHŒ; Ç1n8„)!ù ,VÐI!ÇMêZïXÛæ]Ëå$§&PNC8‚H‰€†Äñn÷†˜¡à€@Ì5ƒìH+k¬šÂ±Û c:cø …à˜…WJ q86 —ÀÚ¡ª4†c!ù ,]ðÉùR¢XÞ'„&\„Tâu âa›e „ ,xŽ/E€( '‚²öQ 0®!£PèM„ÆQ8x€Æ‚ñ(ÀÓv8ÔzÁ‰"Ñ~>Ç÷ !ç6J9!ù ,ZÐÉéR’‚jiåØZ÷m™&”ÀN 2\TI©ÎÜ ØìÃQü àJœ™°r¼&‰Å)QÔ FÃ08 IC00-Lsp˜„öf`u0‚5åE!ù ,XðÉI_ªx&QÇÂER‰Éð dñM‚ZEÓ‰’¢gÏà G @ÈøŸDƒ±U ’—±p>"Ãà,$€d 7 –`¢&H¾€&Š¼²!ù ,ZðÉ„¼øŽ¢²—FÑ|R÷Eá Éiã•°à Y+!à ž™@@P¹¡¥50xp2Â#ài  Nà‚0lN°Ó$0@H–‡N}X<Ìa}q¿¥/)ÃD;assets/js/jstree/themes/default-dark/style.css000064400000105603147600374260015476 0ustar00/*! jsTree default dark theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf>.jstree-ocl { cursor: default; } .jstree .jstree-open>.jstree-children { display: block; } .jstree .jstree-closed>.jstree-children, .jstree .jstree-leaf>.jstree-children { display: none; } .jstree-anchor>.jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor>.jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor>.jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf>.jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .jstree-contextmenu .jstree-anchor { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li>a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li>a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li>a:focus { outline: 0; } .vakata-context .vakata-context-hover>a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator>a, .vakata-context .vakata-context-separator>a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context .vakata-contextmenu-disabled>a>i { filter: grayscale(100%); } .vakata-context li>a>i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li>a>i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li>a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator>a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li>a>i { margin: 0 -2em 0 0; } .vakata-context-rtl li>a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-default-dark .jstree-node, .jstree-default-dark .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-default-dark .jstree-anchor, .jstree-default-dark .jstree-animated, .jstree-default-dark .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-default-dark .jstree-hovered { background: #555; border-radius: 2px; box-shadow: inset 0 0 1px #555; } .jstree-default-dark .jstree-context { background: #555; border-radius: 2px; box-shadow: inset 0 0 1px #555; } .jstree-default-dark .jstree-clicked { background: #5fa2db; border-radius: 2px; box-shadow: inset 0 0 1px #666666; } .jstree-default-dark .jstree-no-icons .jstree-anchor>.jstree-themeicon { display: none; } .jstree-default-dark .jstree-disabled { background: transparent; color: #666666; } .jstree-default-dark .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-default-dark .jstree-disabled.jstree-clicked { background: #333333; } .jstree-default-dark .jstree-disabled>.jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark .jstree-search { font-style: italic; color: #ffffff; font-weight: bold; } .jstree-default-dark .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #555; } .jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #555; } .jstree-default-dark>.jstree-striped { min-width: 100%; display: inline-block; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-default-dark>.jstree-wholerow-ul .jstree-hovered, .jstree-default-dark>.jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-default-dark .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-default-dark .jstree-wholerow-hovered { background: #555; } .jstree-default-dark .jstree-wholerow-clicked { background: #5fa2db; background: -webkit-linear-gradient(top, #5fa2db 0%, #5fa2db 100%); background: linear-gradient(to bottom, #5fa2db 0%, #5fa2db 100%); } .jstree-default-dark .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-default-dark .jstree-anchor { line-height: 24px; height: 24px; } .jstree-default-dark .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-default-dark .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-default-dark.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-default-dark .jstree-wholerow { height: 24px; } .jstree-default-dark .jstree-node, .jstree-default-dark .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-default-dark .jstree-last { background: transparent; } .jstree-default-dark .jstree-open>.jstree-ocl { background-position: -132px -4px; } .jstree-default-dark .jstree-closed>.jstree-ocl { background-position: -100px -4px; } .jstree-default-dark .jstree-leaf>.jstree-ocl { background-position: -68px -4px; } .jstree-default-dark .jstree-themeicon { background-position: -260px -4px; } .jstree-default-dark>.jstree-no-dots .jstree-node, .jstree-default-dark>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -4px; } .jstree-default-dark>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -4px; } .jstree-default-dark .jstree-disabled { background: transparent; } .jstree-default-dark .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark .jstree-checkbox { background-position: -164px -4px; } .jstree-default-dark .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-dark .jstree-checked>.jstree-checkbox { background-position: -228px -4px; } .jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-dark .jstree-checked>.jstree-checkbox:hover { background-position: -228px -36px; } .jstree-default-dark .jstree-anchor>.jstree-undetermined { background-position: -196px -4px; } .jstree-default-dark .jstree-anchor>.jstree-undetermined:hover { background-position: -196px -36px; } .jstree-default-dark .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark>.jstree-striped { background-size: auto 48px; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark.jstree-rtl .jstree-open>.jstree-ocl { background-position: -132px -36px; } .jstree-default-dark.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -100px -36px; } .jstree-default-dark.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -68px -36px; } .jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -36px; } .jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -36px; } .jstree-default-dark .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-default-dark .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-default-dark>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-default-dark .jstree-ok, #jstree-dnd.jstree-default-dark .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-default-dark .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-default-dark .jstree-er { background-position: -36px -68px; } .jstree-default-dark .jstree-ellipsis { overflow: hidden; } .jstree-default-dark .jstree-ellipsis .jstree-anchor { width: calc(100% - 29px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default-dark.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-default-dark-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-default-dark-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-default-dark-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-default-dark-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-default-dark-small .jstree-wholerow { height: 18px; } .jstree-default-dark-small .jstree-node, .jstree-default-dark-small .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-default-dark-small .jstree-last { background: transparent; } .jstree-default-dark-small .jstree-open>.jstree-ocl { background-position: -135px -7px; } .jstree-default-dark-small .jstree-closed>.jstree-ocl { background-position: -103px -7px; } .jstree-default-dark-small .jstree-leaf>.jstree-ocl { background-position: -71px -7px; } .jstree-default-dark-small .jstree-themeicon { background-position: -263px -7px; } .jstree-default-dark-small>.jstree-no-dots .jstree-node, .jstree-default-dark-small>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-small>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -7px; } .jstree-default-dark-small>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -7px; } .jstree-default-dark-small .jstree-disabled { background: transparent; } .jstree-default-dark-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark-small .jstree-checkbox { background-position: -167px -7px; } .jstree-default-dark-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-dark-small .jstree-checked>.jstree-checkbox { background-position: -231px -7px; } .jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-dark-small .jstree-checked>.jstree-checkbox:hover { background-position: -231px -39px; } .jstree-default-dark-small .jstree-anchor>.jstree-undetermined { background-position: -199px -7px; } .jstree-default-dark-small .jstree-anchor>.jstree-undetermined:hover { background-position: -199px -39px; } .jstree-default-dark-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark-small>.jstree-striped { background-size: auto 36px; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-small.jstree-rtl .jstree-open>.jstree-ocl { background-position: -135px -39px; } .jstree-default-dark-small.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -103px -39px; } .jstree-default-dark-small.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -71px -39px; } .jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -39px; } .jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -39px; } .jstree-default-dark-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-small>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-default-dark-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-default-dark-small>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-default-dark-small .jstree-ok, #jstree-dnd.jstree-default-dark-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-default-dark-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-default-dark-small .jstree-er { background-position: -39px -71px; } .jstree-default-dark-small .jstree-ellipsis { overflow: hidden; } .jstree-default-dark-small .jstree-ellipsis .jstree-anchor { width: calc(100% - 23px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-dark-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-default-dark-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-default-dark-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-default-dark-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-default-dark-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-default-dark-large .jstree-wholerow { height: 32px; } .jstree-default-dark-large .jstree-node, .jstree-default-dark-large .jstree-icon { background-image: url("32px.png"); } .jstree-default-dark-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-default-dark-large .jstree-last { background: transparent; } .jstree-default-dark-large .jstree-open>.jstree-ocl { background-position: -128px 0px; } .jstree-default-dark-large .jstree-closed>.jstree-ocl { background-position: -96px 0px; } .jstree-default-dark-large .jstree-leaf>.jstree-ocl { background-position: -64px 0px; } .jstree-default-dark-large .jstree-themeicon { background-position: -256px 0px; } .jstree-default-dark-large>.jstree-no-dots .jstree-node, .jstree-default-dark-large>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-large>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px 0px; } .jstree-default-dark-large>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px 0px; } .jstree-default-dark-large .jstree-disabled { background: transparent; } .jstree-default-dark-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-default-dark-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-default-dark-large .jstree-checkbox { background-position: -160px 0px; } .jstree-default-dark-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-dark-large .jstree-checked>.jstree-checkbox { background-position: -224px 0px; } .jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-dark-large .jstree-checked>.jstree-checkbox:hover { background-position: -224px -32px; } .jstree-default-dark-large .jstree-anchor>.jstree-undetermined { background-position: -192px 0px; } .jstree-default-dark-large .jstree-anchor>.jstree-undetermined:hover { background-position: -192px -32px; } .jstree-default-dark-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-default-dark-large>.jstree-striped { background-size: auto 64px; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-default-dark-large.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-large.jstree-rtl .jstree-open>.jstree-ocl { background-position: -128px -32px; } .jstree-default-dark-large.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -96px -32px; } .jstree-default-dark-large.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -64px -32px; } .jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px -32px; } .jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px -32px; } .jstree-default-dark-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-large>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-default-dark-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-default-dark-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-default-dark-large>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-default-dark-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-default-dark-large .jstree-ok, #jstree-dnd.jstree-default-dark-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-default-dark-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-default-dark-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-default-dark-large .jstree-er { background-position: -32px -64px; } .jstree-default-dark-large .jstree-ellipsis { overflow: hidden; } .jstree-default-dark-large .jstree-ellipsis .jstree-anchor { width: calc(100% - 37px); text-overflow: ellipsis; overflow: hidden; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-dark-large.jstree-rtl .jstree-last { background: transparent; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive>i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive>.jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive>.jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-default-dark-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-default-dark-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-default-dark-responsive .jstree-node, .jstree-default-dark-responsive .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-default-dark-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-default-dark-responsive .jstree-icon, .jstree-default-dark-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-default-dark-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; } .jstree-default-dark-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-default-dark-responsive.jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-default-dark-responsive .jstree-ocl, .jstree-default-dark-responsive .jstree-themeicon, .jstree-default-dark-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-leaf>.jstree-ocl, .jstree-default-dark-responsive.jstree-rtl .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-default-dark-responsive .jstree-open>.jstree-ocl { background-position: 0 0 !important; } .jstree-default-dark-responsive .jstree-closed>.jstree-ocl { background-position: 0 -40px !important; } .jstree-default-dark-responsive.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -40px 0 !important; } .jstree-default-dark-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-default-dark-responsive .jstree-checkbox, .jstree-default-dark-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-default-dark-responsive .jstree-checked>.jstree-checkbox, .jstree-default-dark-responsive .jstree-checked>.jstree-checkbox:hover { background-position: 0 -80px; } .jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined, .jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined:hover { background-position: 0 -120px; } .jstree-default-dark-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-default-dark-responsive>.jstree-striped { background: transparent; } .jstree-default-dark-responsive .jstree-wholerow { border-top: 1px solid #666; border-bottom: 1px solid #000; background: #333333; height: 40px; } .jstree-default-dark-responsive .jstree-wholerow-hovered { background: #555; } .jstree-default-dark-responsive .jstree-wholerow-clicked { background: #5fa2db; } .jstree-default-dark-responsive .jstree-children .jstree-last>.jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #111111; } .jstree-default-dark-responsive .jstree-children .jstree-open>.jstree-wholerow { box-shadow: inset 0 6px 3px -5px #111111; border-top: 0; } .jstree-default-dark-responsive .jstree-children .jstree-open+.jstree-open { box-shadow: none; } .jstree-default-dark-responsive .jstree-node, .jstree-default-dark-responsive .jstree-icon, .jstree-default-dark-responsive .jstree-node>.jstree-ocl, .jstree-default-dark-responsive .jstree-themeicon, .jstree-default-dark-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-default-dark-responsive .jstree-last { background: transparent; } .jstree-default-dark-responsive .jstree-leaf>.jstree-ocl { background-position: -40px -120px; } .jstree-default-dark-responsive .jstree-last>.jstree-ocl { background-position: -40px -160px; } .jstree-default-dark-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-default-dark-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-default-dark-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-default-dark-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } } .jstree-default-dark { background: #333; } .jstree-default-dark .jstree-anchor { color: #999; text-shadow: 1px 1px 0 rgba(0, 0, 0, 0.5); } .jstree-default-dark .jstree-clicked, .jstree-default-dark .jstree-checked { color: white; } .jstree-default-dark .jstree-hovered { color: white; } #jstree-marker.jstree-default-dark { border-left-color: #999; background: transparent; } .jstree-default-dark .jstree-anchor>.jstree-icon { opacity: 0.75; } .jstree-default-dark .jstree-clicked>.jstree-icon, .jstree-default-dark .jstree-hovered>.jstree-icon, .jstree-default-dark .jstree-checked>.jstree-icon { opacity: 1; } .jstree-default-dark.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-default-dark.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-default-dark-small.jstree-rtl .jstree-last { background: transparent; } .jstree-default-dark-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-default-dark-large.jstree-rtl .jstree-last { background: transparent; }assets/js/jstree/themes/default-dark/32px.png000064400000002765147600374260015133 0ustar00‰PNG  IHDR@`[•[œPLTEÇÇǵµµ§§§¾¾¾ßßßÕÕÕ°°°’’’???ÆÆÆ‹‹‹ hhh†††ÃÃÃÿÿÿèèè™™™òòòûûûêêêþþþîîîöööìììøøøôôôõõõßßßÛÛÛãããØØØÐÐÐÌÌÌÈÈÈxxxt{FtRNS1 =%+Oa;¥¤“¹yÞÛµ„DÌ9Fi™ø"éúêIDATxÚí› Sâ0…IÒ´,ÂÂ"(ênBZJ[êêÿÿo{ Û&}Ø@fÚz?zì‘OÅÆkïÆ,¯Ö›MÓ‚ Dê Äv l`Sñ—œpï¦:@98íÕ¤- tîÄ9wÎMu€wÔѺ¢ONô…k®Øô‚yï ¨C¯ý¤eÅ¡• ,ò'‚\îé:å䧹zö(˜`M§¤ÿè³Ì¤\0Z™3ø&øÈE/ ¾€}M?|E‰Zy~‚˜6ü?+ü?RÃ‰È ¹ú)?ÑÏÑ/!& $‡ŽTäWàõþö¤ýŸ¨£›0Z~~ 4ð·à€ æó£ÄVËϲUJY€Öü¯°Ö?V<b¯€Sx~ñF©$.màåK®ÿÇIÏõÿÌÓ äªí]~„øëM¢’ÍÚ'yzß÷ãxûŒæŸŠqì›5ÐOa´(?¥")#U 5â“Ë=]'I$÷Û½Œ’§X’(•0šüZ…AF¨Öf Œ7›¸ð s@Â×5ûþdM.÷t„r»{ÝmeHruÊÂ0d´àøôà °0k Rªä'×~ÇÔ±æO¹ÜÓu.%„°…÷ þ¶æí@¢Ø›ˆê—þŸþ=Àþ| ­‚½_z‚4ó·?hƒ£=1žï–üí̱¬Ê¯üW)4ð·?hGTœ`œ(•ÍWUŽêúGæ_ jþöæ-5ÐO)ð8¿§ :hào{>Д¥|…Þü0À8¶ýíÏZ{VJ ‚þ¶çí@Yy7ÇßÂ| ­;É{V8ù7q>°×ˆ!¾/ú7q>°ó«1ßf=°ã´·H7À"µÀ"ˆÔˆt l R l Ò1°-†òü?ó—8N‡£žŽ7zéÆ\œÁ{Ýe䌣ߎž Çï®×£d6µ>DœAzídù•ü|‘< õüÆBLøðù^ø øëÇ_í ðKù­ !÷Žö#l,€y&€)6PgD©—æ'€ûGª5ðe"€@cç»XúÔñò‡S¸~só¨;Vã©÷]/á’ÒÇ­˜ VY~:9$è?A~Ø@iàûþ"„w÷Ï4?b²ðSæ®Y€«3Ú`IE¼Qa¨’‚þèól(¥6ë‰Q‚ijK8öÛ` ž;¥”Áì± ¿g›0Ú/¢P­'FO"k‡¶¸,KÏ)gÏ4_Þ)FOl *n  ä~/Ó·@µ5@ 4A ý+lè8Šž¦”ÏacÔÀPf—° Ûà²"Áñ -QŽ§l&ã©Ñ­\ì÷ÛÃk´5À <êiÑè‹ éÆ.ÏhëbBíõ@\ÎB:Ó@Á"5Á"xkþ)Ï‹D-÷îIEND®B`‚assets/js/jstree/themes/default-dark/40px.png000064400000014576147600374260015135 0ustar00‰PNG  IHDRðà¬*PLTE333™™™åååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿåååÿÿÿssstttuuuvvvwwwxxxyyyzzz{{{|||}}}~~~€€€ XXX$$$dddhhhooo000UUUVVVWWWXXXYYYZZZ[[[\\\]]]^^^TTTNNNOOOPPPQQQRRRSSSTTTUUUVVV[[[KKKLLL©©©¢¢¢¡¡¡¢¢¢ÚÚÚÜÜÜÝÝÝßßßáááâââãããåååæææçççéééëëëíííïïïñññóóóôôôööö÷÷÷ùùùúúúûûûýýý™™™¨¨¨©©©ªªª«««¬¬¬­­­®®®¯¯¯°°°±±±²²²³³³´´´µµµ¶¶¶···¸¸¸¹¹¹ººº»»»¼¼¼½½½¾¾¾¿¿¿ÀÀÀÁÁÁÂÂÂÃÃÃÄÄÄÅÅÅÆÆÆÇÇÇÈÈÈÉÉÉÊÊÊËËËÌÌÌÍÍÍÎÎÎÏÏÏÐÐÐÑÑÑÒÒÒÓÓÓÔÔÔÕÕÕÖÖÖ×××ØØØÙÙÙÚÚÚÛÛÛÜÜÜÝÝÝÞÞÞßßßàààáááâââãããäääåååæææçççèèèéééêêêëëëìììíííîîîïïïðððñññòòòóóóôôôõõõööö÷÷÷øøøùùùúúúûûûüüüýýýþþþÿÿÿUÎõž†tRNS %&(01369:=>>CEGGGGIKTTTTTTTTTTUX\\\\\\\\\\ahhy‘’’¡þþþþþþþþþþþþþþþþþþþþþþþ­ö?– IDATxÚíÝk“Õ™ðÿsº5#ËØEËdB<›­lÂ-ª®ÍÇØo5ÙÊfå»ÇãqŒÌ`“ÁåñÝJHŠâÝ~’}§*.6ÇYcˆ<ДË¡QŸË¾Ð]jIÝ’¦»Õ:ý†qK}NÿôœÓçôíÁ\À¨—¶/ ·¹Çåì oß31a‹k°k°k°kp¼Àžg‹ :Â1/>Šù˜ƒ›[­9ÿ8’ÈOL„Íùg—qÁŠÍ½XXl†ì \l†í Zl:d9|6¼‹Í°ã´¸;ØJ¡˜à3ÿÞ@Å]ÁV:‹Œ•sm®sé,2ÖæÀ} Ý¤ØìáE6cåºx‘Í`sDñ€å#¥P#l¥³­Å±Ã;„ØÍö°Tõºªæz|6¸÷ÜWB×½.ª¹Ÿ á½Yñ ÕäíPÍõøÌÓùQÈ^7p‹·M5×ñÙÆxy]ÀmÞñ\çgVn¬¼.àT¶}M]Üá²{ÆËëmjY»xǬ=»‚‹™¬»ØÕ›)Ž—ל³ÜÅpõÚ¹ñòº5iwñÖݼ›cæuíîbî8zÝZ®âíñòhÌ¥=‰}xñèãËPí+Ïß ÞÛmXÊY™Juîcu!íµïû©HA)ÕZ†B× ‚‡sÖÞkJº“ Ä°Ï.ø¨æAòÜ Ùú ]S…rTÀÈYû¯H)U§˜ˆ1:`駚<ðæq¥šƒLÄŽ¯¡0rÖÁKJŠ¶†"2ˆÚ_ø«'¬½Ôò1öÒ[ßwè9µÌY‡×…â­A&b&ØaÛ÷¥¬<°v JÊZ³&0&_<Ý[ÊYKç¡„Mí¶dFÆ&ðöowde°3Á óò×"æÕÑéÄp·À[~ÀûÀŸþS !„™,1º~§•ƒVm<U…þüù×Bp%ÁØTjæí¿"3,z©tÖ/w^B–‘˜N;ó—B|j©¾ÞÙ£À0=³ë»!Þ[ZŒ{À»{Œ’¼{·0 ¦áðîoKHþñn!Ö6Ü àdïâýpiÓ ãsàìBÌ-g¥ø? Þ~îô¢ßyÐà, :¬Á¬Áð†Ž°k°k°k°k°k°kðd‚·ã*冎°ŽRþ+ám•ñjàÍBhàÅùÇ‘߆£e4#¼XÉx5šȬTse¼˜‹x±–ñjq½u¶¿~ì–"$€döõ+îâ&ÕË6›3^ -N —> ðbkÆ«AÅsÕžûDçGÿÔY9/†Ö¤Û3^ $^|üºçnÝeÝÞ_~•¼Ø™ñjñ£óýmpãˆJ„Ý2^ ¦¿[ÌP(àGïÌx5ˆX}ëw‹oUH}¸sDü ñ‚ákQz øAòÜò(Äù¼ßiqHGé<ÐE׳¥®bÏG.>žôÙ¤Ò°4"±ïa ! K£Í°4ÂV=Fçñ÷‡ã(î=ñˆ¡¸ÏL+~â~SË؉û¿]Zˆ—¸ÿÉ/Ð[Ç:ÆWïÙ‚ýýPè`@ÉÖÝ&»%•2E<5ÿôÑ–D"ö¦ÇlÁJ¹e¨ê &¦ÂOÍ?s¼%­Þ¼åõ :÷œ\]½¡÷áÅùg^âíi°Øšg/”>ÀFØMzqþéÑš ´ö‘w¯ÞS8CÈMzqþé£eÞ’ ŒÎäãP)¸ð 6`„áÅù§—Êõ,2#f\ðãUBpî¬H„áÅù§—ÞœþŠ1ãÂǾÞø•œséñ» d†áÅù§}_æM©  0ó¢?¯’ÂñVL†áÅù'Ëox‰ŒÄ¥Û>ßè–‚;Þ#lÊÐ"¼8ÿäþï¶Ê¢žøÊ 2¦®øõ*ÁGxü²3´>¼8ÿä¾oK[¼‘öŠæôµÛ¾ßØ—‚{KaExqþgÿ^,9¢îeF"yý“‚í³|%¹SöaâaõáGÿñÐV©TªÖOdÆÔŽì'…¯}W ¹<¼>¬¤àÕ#‘ašÉÔî¾ò]¾‚s¯÷gaõáÉËû É«éÍäηïy&C îx›¡õṫõ}ï-Ÿñ*T0b…õjY˜4ðØDxaÒÀÐ` Öà‰oèk°k°k°k°k°k°×eØ«&:¬Á¬Á¬Á±8Þ/Œpþ° #¸5Ve&Ö¨Ë-ØJ™³ë.ë[amøѺ–·4¤Ùì¾{­»’ýUõ¹diÓ·[yëÀR*0r7°•ÎvÛ$S}Ír.í#Xò¬#cåB÷òÚ›5/²Mº·@6(±9Œ×ó~öõ'6‡òzÜOÞÀÄæp^OûéÉ”Ø œòám:hw]RYoûHV@°õX}„|Ø>GèôÖÚÝܵ¼êR Ä.àÔz=ž9×™m«×î·“½ËÛ¬Lµ¼õ=¡D¸¶j© ŧ·oyÈYKëÍì;«°f«<·_yrµ¯Ìn›6»·@xñöŸiõ)¯uƵ'„w®™K¡¸9¨×_35ÃèÃn1­Mšý{ÇïÏ\:[O<þÞþàª1›Áf¼}Áõia6ÄÀÛܘf—°>þ^?‡ÅuÄÀÛ\Ìd{œDÄ\y7ŒªÓ¾L¶ý]1ªŸ4y»¨Õ\Þ0ßÙ.°TPÌV÷‘¹¡9±D»ò&ñÒ7^ððâ\kyÊÃw+©T#Ó“*`ïuU%ˆh¯]ÉÈ;Ÿ¾®Là¶ò<|'p°T¨¿ô«ð7ì»ZMFÄhŸ]ysú‡ékÊS¸öòú'è&-¤Sü® ƒØ•7§ŸH_D^ÀåõýNÐ`É%X-IŒð^"©FíÊ›Ó?J_ržÀåõûNàæFKŸ»‡Ã•c‡íʛĻÓ˼E¸£¼>ß º . ÈhÞÁ ¹$`¶+×ÝÒë[Ž$Å<õa—ò:Àœ (f†aÁ•bÕæUýÏg8¼ŽÃögµ“úò–# R^"ìR^g„9A„Ó¤!…m}îSdPü´¶•(o9P†·œ•®åu‚Ax]Àœ …R†hÛÁ–7‰­²ÃÈCö·nåµ,‚;‚$ˆ‡.¾rB !jýÉýWßÚÚ†‰WŠýƒâ©¼r¹, ‰WŠ!€s³ ’3+—Ý"ò“Ù­rYØûýkðPž5[.;ŠÀ†r!ž› R*zqÕʹî࿦_ü¶Ä˜é)Ÿaßò¬Fy¡´Šg^2 $ÔòÅY×mfü½TV̘:Sôr˜ñS^(à\*Y*—¹àåÿN˜ÌeÈt”i˜ÓÉon{©ÂGy!Ý=,ž\);¼\.™&cn³@.`$¦S'‹Þ²ªx//¤ 9kå”àÂÙ"¢ŽTÒJ)¥X"±cfÅþÈ[žË ë†8rÖêï”’‚KÕ>µ 1Øž™]µoy­Äcyá=ò€œõÆ)bTæ\ª–dÉDÄ s*5³kÕ¾é½Oå…ùP rÖêÊÔTi˲õ@̘‘˜NÎ<²bè§å…ûØrÖË+–¶œÖ¤mÄXb:™:ÿMñõô-/ìÓƒuÒœ=Væm;hNÈ‹ïû®¨wyxôÈÖÉ> :êòF®ìãH—pþ‡´>À1\&<êçït„5Xƒ5Xƒ5Xƒ5XƒG½lèk°k°k°k°k°k°k°k°‡Ž\þ+ámG ÿU€àhä¿ •üWA#“ÿ* ptò_ŽPþ«@ÀQÊ8Rù¯‚G*ÿUàhå¿ ­üW€›ò_¹L-‹æ¿Ú~pSþ+÷£WÆ 2ÿÕöƒ›ò_¹½šŽUcئ{æÓ2ûncÆ¡Oòù°k°k°GÜ”ÛÊíajûÎ؃›r[ÉÎDMPLÀM¹­ªY¥ZÀÉX*T,R¶‹©ñÁpù¯ÎzûÚšt%·UíÏ6pãƒáò_݈P®ä¶¢êŸíàúÁä¿ \ÉmEÕ?ÛÀ†Ëµ¡>\ÉŪ®¶WØc2ÿU ®ç¿RR¶I… ó_1ñ¨ä¿:ónT׈Àò_m?¸–ÿÊ83eÛäÂ0Mƃ̵ýàZþ+(¾øV¢íÀd˜ìÅ"à–ÿjûÁµüWƬ•³¸>dþ«úp5ÿ–ÎZ9 =#ÔCÀJ/}Xþ«ÀÕüW /_î’ÿêÐwß;Aå¿ \Ë%Ê¿M0Ö‘,HJça€ù¯‚–"•ÿ*p¤ò_r‰'Jù¯G)ÿU0àå¿ üWA#“ÿ*0pTò_F$ò_ †Ç¼ #¬Á¬Á¬Á¬Á¬Á¬Á¬Á¼}ËÙá/t“Ö` Ö` Ö` ÖàI{Ÿô-è)Øå]ø1¿Þœz·sÝžÍ}¬Àfl[¿îÃ=—¹dic¢À©w÷þò«üMÜ8MâóIêÃêÌQ‰Ï' LŽbœÅ¥Ç[<È°4ÖâÆá & Œ«ûÿíþç“ƵƒãÚªZ^9jùI×_r¹ðæ{æMïšžø hÒÅ=‰ÚŸŒ¶&¼ÙhÓDÜÁS?jù§3ž'>À?ͯå‘x/î>Òöï_OÔ8 (š0ðÿÄlj©Ï¥Ø%“VÛŒKÅ ì’I«Ìâî-¦á#¼êé[AäÓª4éŽLZí|#j¢7؈Y“–Rˆ^`ƒ†oD ,D¯äQ · Î{UüÀNopì†%!z 1lÒ=Îð%Ìø^à8F¸'˜ÅÌ9ï‘Lã˜ñ°_„{‚¹š,°Ã÷jÒÄe ‡%§×v"~'=#,D gZ&Ö+?xïOÇ<5•”F÷ÍÉi3^`sFõÊKjîØiÄ ÌÕÎéR©¥9mþûÿÆ \<Ñ·ÅòbœÀ1L•Ö§kp¬Á :¬Á¬Á¬Á¬Á¬Á¬Á#_t„5Xƒ5Xƒ58Âà«\ÐÖàh€ á¿¡6¶Ù˜Œ‹"<ÜÏ» ûð Ë?:aà]FØo»Ü舆ˆy“Þ…±Zô8¬Á<¹à¹Š›þ·J–6½¯Žx.EÆ÷äl.Í`Óëê(çÒY ›±:P¼`w—­¬t.´9÷ÕQÏ¥³Í|ãg++:isî«£®zì>+çÓÛA›s_%pÝ \Ïx[õ­ZhsÍ«£y>Üä²íâÝ÷úy[Äs-«­\Á-^Ïb«e«ºx®mõ6‹Íá½ÅVÛVUñ\Çêí›#ðÙ_µ­p•Rí[e3Øt),»'bvñ"SjŠw{()›\ ‹XvõڹΩGûRÌt6Œ%¬wVŒx`/rV§¸“ÛYX¸`¯ÞÝÅ{ýfwñîó¼‹ÄÛîõvï7Þw±¯8c‡9µì8ÝuoÏÜGm}Äx{€+§»›}ûïó•8owpõt·!v÷úÝÅâ@¼]ÁõÓÝšx4^`]ÄÁx»§»U±/ïîÄy;Á ~¾QɉG¸±÷›VÔöÚ÷ëx_î'¼}#Zûî~ûNžO_—JA@t} •Ý "Úg©Pa~ç1Ñ–oèØþV“žO_ªâ#"ºz ¹ójmEe÷€^ÞÞ'óé«Bu€éêBK<‘¾*„”•vEÄèâ¥ÃNSN@"ÆŒýö—ƒ5¿ùô.e˜±+ñe8M:yEÉzF<#Úç(Uý@` ì ýÅ`;g¥/;õ_³éˆÀ˜¼|¨þ?p \:xY QëfD @¡þOF`‡ì{ƒUg¥/n Ñ™A’ˆââÜ ¾I+làÐ:IY¤j?:‘Ad±7;¢Zé [Žh²Ù1‰ C^8Z½h©íÃø KçII—<Ä FÆQû³Á†+}þ{‡×{ šš38?¬2ê=,}Šck’«11‚‘8f:h{^û~‹×²øc(%ëÿ6¹\;øeZy“sÕÚÙ¨â=nç;7ðæý}±äpYïcBŠÚÇäâ÷/[¹À›4€¿âÄYÁo±™Ó'ì¿b °•~ë»bÉ©{d&Öpܪñ$$ÞzÉÊÞ¤ÜÅÉUÁÑ8ÀŒ%’'í»Ö”Z+—¾ßª4èja§m¼vFŠZ-Ä„b‰µƒAO<*ËŸž:#¸S;X†1µã”}§Ë/Ô‘RîHU+,uÚ¾ƒŸž>#kµƒ)¤ á øäg§Ww$W 2 s:uÚþƒ‚‹'Î1HÁ•j.¬©"Ó3OCãö“+§EåÐEÌ DrçŠ}{ðšrÖòJ¹ì(¡¨¹°z-Š 2§w,}™¶)ÕÝGOŸ9UùõÉ4;fÎعžþx¯œâÜQ’QsaÕZ*«w®Ø¹°š4€[ϬžœC›J=²jßÂ0`ä¬Õ“B(aL·vë™æÕ9„ÆÍgÏ.+EÂH>²ë¬}sØÊrÖÙeÜLµvóY×Õa€ñáÏÏ-“)Œ»ÎÙv;£÷#>wjš›;W[ ûðçm«C‹0ðÁsç^Irsçëö£¨.g­®+í…}ðœëê0Àxÿù×_^³ßï~ÍÆŸxåU—ÂÞ¾euˆÞûʼn©rqdÿë÷~q¼ôžçÕÁ\Ójß—¡~)bb_«·¼Û5¹ß{ñ/Äg“¥<üžb¬ÀÛ³üؘ0p£Ýô“‹Z/op¿e÷½p"çdxÛáAŽY÷†/"ªMZøëòqíñ;Jkp¬Á :¬ÁÛ¶ü?9#2=-wNIEND®B`‚assets/js/jstree/themes/default-dark/style.min.css000064400000072277147600374260016272 0ustar00.jstree-node,.jstree-children,.jstree-container-ul{display:block;margin:0;padding:0;list-style-type:none;list-style-image:none}.jstree-node{white-space:nowrap}.jstree-anchor{display:inline-block;color:black;white-space:nowrap;padding:0 4px 0 1px;margin:0;vertical-align:top}.jstree-anchor:focus{outline:0}.jstree-anchor,.jstree-anchor:link,.jstree-anchor:visited,.jstree-anchor:hover,.jstree-anchor:active{text-decoration:none;color:inherit}.jstree-icon{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-icon:empty{display:inline-block;text-decoration:none;margin:0;padding:0;vertical-align:top;text-align:center}.jstree-ocl{cursor:pointer}.jstree-leaf>.jstree-ocl{cursor:default}.jstree .jstree-open>.jstree-children{display:block}.jstree .jstree-closed>.jstree-children,.jstree .jstree-leaf>.jstree-children{display:none}.jstree-anchor>.jstree-themeicon{margin-right:2px}.jstree-no-icons .jstree-themeicon,.jstree-anchor>.jstree-themeicon-hidden{display:none}.jstree-hidden,.jstree-node.jstree-hidden{display:none}.jstree-rtl .jstree-anchor{padding:0 1px 0 4px}.jstree-rtl .jstree-anchor>.jstree-themeicon{margin-left:2px;margin-right:0}.jstree-rtl .jstree-node{margin-left:0}.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-wholerow-ul{position:relative;display:inline-block;min-width:100%}.jstree-wholerow-ul .jstree-leaf>.jstree-ocl{cursor:pointer}.jstree-wholerow-ul .jstree-anchor,.jstree-wholerow-ul .jstree-icon{position:relative}.jstree-wholerow-ul .jstree-wholerow{width:100%;cursor:pointer;position:absolute;left:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.jstree-contextmenu .jstree-anchor{-webkit-user-select:none;-webkit-touch-callout:none}.vakata-context{display:none}.vakata-context,.vakata-context ul{margin:0;padding:2px;position:absolute;background:#f5f5f5;border:1px solid #979797;box-shadow:2px 2px 2px #999999}.vakata-context ul{list-style:none;left:100%;margin-top:-2.7em;margin-left:-4px}.vakata-context .vakata-context-right ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context li{list-style:none}.vakata-context li>a{display:block;padding:0 2em 0 2em;text-decoration:none;width:auto;color:black;white-space:nowrap;line-height:2.4em;text-shadow:1px 1px 0 white;border-radius:1px}.vakata-context li>a:hover{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");background-position:right center;background-repeat:no-repeat}.vakata-context li>a:focus{outline:0}.vakata-context .vakata-context-hover>a{position:relative;background-color:#e8eff7;box-shadow:0 0 2px #0a6aa1}.vakata-context .vakata-context-separator>a,.vakata-context .vakata-context-separator>a:hover{background:white;border:0;border-top:1px solid #e2e3e3;height:1px;min-height:1px;max-height:1px;padding:0;margin:0 0 0 2.4em;border-left:1px solid #e0e0e0;text-shadow:0 0 0 transparent;box-shadow:0 0 0 transparent;border-radius:0}.vakata-context .vakata-contextmenu-disabled a,.vakata-context .vakata-contextmenu-disabled a:hover{color:silver;background-color:transparent;border:0;box-shadow:0 0 0}.vakata-context .vakata-contextmenu-disabled>a>i{filter:grayscale(100%)}.vakata-context li>a>i{text-decoration:none;display:inline-block;width:2.4em;height:2.4em;background:transparent;margin:0 0 0 -2em;vertical-align:top;text-align:center;line-height:2.4em}.vakata-context li>a>i:empty{width:2.4em;line-height:2.4em}.vakata-context li>a .vakata-contextmenu-sep{display:inline-block;width:1px;height:2.4em;background:white;margin:0 .5em 0 0;border-left:1px solid #e2e3e3}.vakata-context .vakata-contextmenu-shortcut{font-size:.8em;color:silver;opacity:.5;display:none}.vakata-context-rtl ul{left:auto;right:100%;margin-left:auto;margin-right:-4px}.vakata-context-rtl li>a.vakata-context-parent{background-image:url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");background-position:left center;background-repeat:no-repeat}.vakata-context-rtl .vakata-context-separator>a{margin:0 2.4em 0 0;border-left:0;border-right:1px solid #e2e3e3}.vakata-context-rtl .vakata-context-left ul{right:auto;left:100%;margin-left:-4px;margin-right:auto}.vakata-context-rtl li>a>i{margin:0 -2em 0 0}.vakata-context-rtl li>a .vakata-contextmenu-sep{margin:0 0 0 .5em;border-left-color:white;background:#e2e3e3}#jstree-marker{position:absolute;top:0;left:0;margin:-5px 0 0 0;padding:0;border-right:0;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid;width:0;height:0;font-size:0;line-height:0}#jstree-dnd{line-height:16px;margin:0;padding:4px}#jstree-dnd .jstree-icon,#jstree-dnd .jstree-copy{display:inline-block;text-decoration:none;margin:0 2px 0 0;padding:0;width:16px;height:16px}#jstree-dnd .jstree-ok{background:green}#jstree-dnd .jstree-er{background:red}#jstree-dnd .jstree-copy{margin:0 2px 0 2px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-repeat:no-repeat;background-color:transparent}.jstree-default-dark .jstree-anchor,.jstree-default-dark .jstree-animated,.jstree-default-dark .jstree-wholerow{transition:background-color .15s,box-shadow .15s}.jstree-default-dark .jstree-hovered{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-context{background:#555;border-radius:2px;box-shadow:inset 0 0 1px #555}.jstree-default-dark .jstree-clicked{background:#5fa2db;border-radius:2px;box-shadow:inset 0 0 1px #666666}.jstree-default-dark .jstree-no-icons .jstree-anchor>.jstree-themeicon{display:none}.jstree-default-dark .jstree-disabled{background:transparent;color:#666666}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent;box-shadow:none}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#333333}.jstree-default-dark .jstree-disabled>.jstree-icon{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark .jstree-search{font-style:italic;color:#ffffff;font-weight:bold}.jstree-default-dark .jstree-no-checkboxes .jstree-checkbox{display:none !important}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked{background:transparent;box-shadow:none}.jstree-default-dark.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered{background:#555}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked{background:transparent}.jstree-default-dark.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered{background:#555}.jstree-default-dark>.jstree-striped{min-width:100%;display:inline-block;background:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat}.jstree-default-dark>.jstree-wholerow-ul .jstree-hovered,.jstree-default-dark>.jstree-wholerow-ul .jstree-clicked{background:transparent;box-shadow:none;border-radius:0}.jstree-default-dark .jstree-wholerow{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.jstree-default-dark .jstree-wholerow-hovered{background:#555}.jstree-default-dark .jstree-wholerow-clicked{background:#5fa2db;background:-webkit-linear-gradient(top, #5fa2db 0, #5fa2db 100%);background:linear-gradient(to bottom, #5fa2db 0, #5fa2db 100%)}.jstree-default-dark .jstree-node{min-height:24px;line-height:24px;margin-left:24px;min-width:24px}.jstree-default-dark .jstree-anchor{line-height:24px;height:24px}.jstree-default-dark .jstree-icon{width:24px;height:24px;line-height:24px}.jstree-default-dark .jstree-icon:empty{width:24px;height:24px;line-height:24px}.jstree-default-dark.jstree-rtl .jstree-node{margin-right:24px}.jstree-default-dark .jstree-wholerow{height:24px}.jstree-default-dark .jstree-node,.jstree-default-dark .jstree-icon{background-image:url("32px.png")}.jstree-default-dark .jstree-node{background-position:-292px -4px;background-repeat:repeat-y}.jstree-default-dark .jstree-last{background:transparent}.jstree-default-dark .jstree-open>.jstree-ocl{background-position:-132px -4px}.jstree-default-dark .jstree-closed>.jstree-ocl{background-position:-100px -4px}.jstree-default-dark .jstree-leaf>.jstree-ocl{background-position:-68px -4px}.jstree-default-dark .jstree-themeicon{background-position:-260px -4px}.jstree-default-dark>.jstree-no-dots .jstree-node,.jstree-default-dark>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -4px}.jstree-default-dark>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -4px}.jstree-default-dark .jstree-disabled{background:transparent}.jstree-default-dark .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark .jstree-checkbox{background-position:-164px -4px}.jstree-default-dark .jstree-checkbox:hover{background-position:-164px -36px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark .jstree-checked>.jstree-checkbox{background-position:-228px -4px}.jstree-default-dark.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark .jstree-checked>.jstree-checkbox:hover{background-position:-228px -36px}.jstree-default-dark .jstree-anchor>.jstree-undetermined{background-position:-196px -4px}.jstree-default-dark .jstree-anchor>.jstree-undetermined:hover{background-position:-196px -36px}.jstree-default-dark .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark>.jstree-striped{background-size:auto 48px}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark.jstree-rtl .jstree-open>.jstree-ocl{background-position:-132px -36px}.jstree-default-dark.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-100px -36px}.jstree-default-dark.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-68px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-36px -36px}.jstree-default-dark.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-4px -36px}.jstree-default-dark .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark .jstree-file{background:url("32px.png") -100px -68px no-repeat}.jstree-default-dark .jstree-folder{background:url("32px.png") -260px -4px no-repeat}.jstree-default-dark>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark{line-height:24px;padding:0 4px}#jstree-dnd.jstree-default-dark .jstree-ok,#jstree-dnd.jstree-default-dark .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark i{background:transparent;width:24px;height:24px;line-height:24px}#jstree-dnd.jstree-default-dark .jstree-ok{background-position:-4px -68px}#jstree-dnd.jstree-default-dark .jstree-er{background-position:-36px -68px}.jstree-default-dark .jstree-ellipsis{overflow:hidden}.jstree-default-dark .jstree-ellipsis .jstree-anchor{width:calc(100% - 29px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-small .jstree-node{min-height:18px;line-height:18px;margin-left:18px;min-width:18px}.jstree-default-dark-small .jstree-anchor{line-height:18px;height:18px}.jstree-default-dark-small .jstree-icon{width:18px;height:18px;line-height:18px}.jstree-default-dark-small .jstree-icon:empty{width:18px;height:18px;line-height:18px}.jstree-default-dark-small.jstree-rtl .jstree-node{margin-right:18px}.jstree-default-dark-small .jstree-wholerow{height:18px}.jstree-default-dark-small .jstree-node,.jstree-default-dark-small .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-small .jstree-node{background-position:-295px -7px;background-repeat:repeat-y}.jstree-default-dark-small .jstree-last{background:transparent}.jstree-default-dark-small .jstree-open>.jstree-ocl{background-position:-135px -7px}.jstree-default-dark-small .jstree-closed>.jstree-ocl{background-position:-103px -7px}.jstree-default-dark-small .jstree-leaf>.jstree-ocl{background-position:-71px -7px}.jstree-default-dark-small .jstree-themeicon{background-position:-263px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-node,.jstree-default-dark-small>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -7px}.jstree-default-dark-small>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -7px}.jstree-default-dark-small .jstree-disabled{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-small .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-small .jstree-checkbox{background-position:-167px -7px}.jstree-default-dark-small .jstree-checkbox:hover{background-position:-167px -39px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-small .jstree-checked>.jstree-checkbox{background-position:-231px -7px}.jstree-default-dark-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-small .jstree-checked>.jstree-checkbox:hover{background-position:-231px -39px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined{background-position:-199px -7px}.jstree-default-dark-small .jstree-anchor>.jstree-undetermined:hover{background-position:-199px -39px}.jstree-default-dark-small .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-small>.jstree-striped{background-size:auto 36px}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-small.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-small.jstree-rtl .jstree-open>.jstree-ocl{background-position:-135px -39px}.jstree-default-dark-small.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-103px -39px}.jstree-default-dark-small.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-71px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-39px -39px}.jstree-default-dark-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:-7px -39px}.jstree-default-dark-small .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-small>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-small .jstree-file{background:url("32px.png") -103px -71px no-repeat}.jstree-default-dark-small .jstree-folder{background:url("32px.png") -263px -7px no-repeat}.jstree-default-dark-small>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-small{line-height:18px;padding:0 4px}#jstree-dnd.jstree-default-dark-small .jstree-ok,#jstree-dnd.jstree-default-dark-small .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-small i{background:transparent;width:18px;height:18px;line-height:18px}#jstree-dnd.jstree-default-dark-small .jstree-ok{background-position:-7px -71px}#jstree-dnd.jstree-default-dark-small .jstree-er{background-position:-39px -71px}.jstree-default-dark-small .jstree-ellipsis{overflow:hidden}.jstree-default-dark-small .jstree-ellipsis .jstree-anchor{width:calc(100% - 23px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-large .jstree-node{min-height:32px;line-height:32px;margin-left:32px;min-width:32px}.jstree-default-dark-large .jstree-anchor{line-height:32px;height:32px}.jstree-default-dark-large .jstree-icon{width:32px;height:32px;line-height:32px}.jstree-default-dark-large .jstree-icon:empty{width:32px;height:32px;line-height:32px}.jstree-default-dark-large.jstree-rtl .jstree-node{margin-right:32px}.jstree-default-dark-large .jstree-wholerow{height:32px}.jstree-default-dark-large .jstree-node,.jstree-default-dark-large .jstree-icon{background-image:url("32px.png")}.jstree-default-dark-large .jstree-node{background-position:-288px 0;background-repeat:repeat-y}.jstree-default-dark-large .jstree-last{background:transparent}.jstree-default-dark-large .jstree-open>.jstree-ocl{background-position:-128px 0}.jstree-default-dark-large .jstree-closed>.jstree-ocl{background-position:-96px 0}.jstree-default-dark-large .jstree-leaf>.jstree-ocl{background-position:-64px 0}.jstree-default-dark-large .jstree-themeicon{background-position:-256px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-node,.jstree-default-dark-large>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px 0}.jstree-default-dark-large>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 0}.jstree-default-dark-large .jstree-disabled{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-hovered{background:transparent}.jstree-default-dark-large .jstree-disabled.jstree-clicked{background:#efefef}.jstree-default-dark-large .jstree-checkbox{background-position:-160px 0}.jstree-default-dark-large .jstree-checkbox:hover{background-position:-160px -32px}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-large .jstree-checked>.jstree-checkbox{background-position:-224px 0}.jstree-default-dark-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-large .jstree-checked>.jstree-checkbox:hover{background-position:-224px -32px}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined{background-position:-192px 0}.jstree-default-dark-large .jstree-anchor>.jstree-undetermined:hover{background-position:-192px -32px}.jstree-default-dark-large .jstree-checkbox-disabled{opacity:.8;filter:url("data:image/svg+xml;utf8,#jstree-grayscale");filter:gray;-webkit-filter:grayscale(100%)}.jstree-default-dark-large>.jstree-striped{background-size:auto 64px}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");background-position:100% 1px;background-repeat:repeat-y}.jstree-default-dark-large.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-large.jstree-rtl .jstree-open>.jstree-ocl{background-position:-128px -32px}.jstree-default-dark-large.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-96px -32px}.jstree-default-dark-large.jstree-rtl .jstree-leaf>.jstree-ocl{background-position:-64px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-node,.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl{background-position:-32px -32px}.jstree-default-dark-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl{background-position:0 -32px}.jstree-default-dark-large .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-large>.jstree-container-ul .jstree-loading>.jstree-ocl{background:url("throbber.gif") center center no-repeat}.jstree-default-dark-large .jstree-file{background:url("32px.png") -96px -64px no-repeat}.jstree-default-dark-large .jstree-folder{background:url("32px.png") -256px 0 no-repeat}.jstree-default-dark-large>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}#jstree-dnd.jstree-default-dark-large{line-height:32px;padding:0 4px}#jstree-dnd.jstree-default-dark-large .jstree-ok,#jstree-dnd.jstree-default-dark-large .jstree-er{background-image:url("32px.png");background-repeat:no-repeat;background-color:transparent}#jstree-dnd.jstree-default-dark-large i{background:transparent;width:32px;height:32px;line-height:32px}#jstree-dnd.jstree-default-dark-large .jstree-ok{background-position:0 -64px}#jstree-dnd.jstree-default-dark-large .jstree-er{background-position:-32px -64px}.jstree-default-dark-large .jstree-ellipsis{overflow:hidden}.jstree-default-dark-large .jstree-ellipsis .jstree-anchor{width:calc(100% - 37px);text-overflow:ellipsis;overflow:hidden}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background:transparent}@media (max-width:768px){#jstree-dnd.jstree-dnd-responsive{line-height:40px;font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}#jstree-dnd.jstree-dnd-responsive>i{background:transparent;width:40px;height:40px}#jstree-dnd.jstree-dnd-responsive>.jstree-ok{background-image:url("40px.png");background-position:0 -200px;background-size:120px 240px}#jstree-dnd.jstree-dnd-responsive>.jstree-er{background-image:url("40px.png");background-position:-40px -200px;background-size:120px 240px}#jstree-marker.jstree-dnd-responsive{border-left-width:10px;border-top-width:10px;border-bottom-width:10px;margin-top:-10px}}@media (max-width:768px){.jstree-default-dark-responsive .jstree-icon{background-image:url("40px.png")}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-node{min-height:40px;line-height:40px;margin-left:40px;min-width:40px;white-space:nowrap}.jstree-default-dark-responsive .jstree-anchor{line-height:40px;height:40px}.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-icon:empty{width:40px;height:40px;line-height:40px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0}.jstree-default-dark-responsive.jstree-rtl .jstree-node{margin-left:0;margin-right:40px;background:transparent}.jstree-default-dark-responsive.jstree-rtl .jstree-container-ul>.jstree-node{margin-right:0}.jstree-default-dark-responsive .jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-size:120px 240px}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl,.jstree-default-dark-responsive.jstree-rtl .jstree-leaf>.jstree-ocl{background:transparent}.jstree-default-dark-responsive .jstree-open>.jstree-ocl{background-position:0 0 !important}.jstree-default-dark-responsive .jstree-closed>.jstree-ocl{background-position:0 -40px !important}.jstree-default-dark-responsive.jstree-rtl .jstree-closed>.jstree-ocl{background-position:-40px 0 !important}.jstree-default-dark-responsive .jstree-themeicon{background-position:-40px -40px}.jstree-default-dark-responsive .jstree-checkbox,.jstree-default-dark-responsive .jstree-checkbox:hover{background-position:-40px -80px}.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox,.jstree-default-dark-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox,.jstree-default-dark-responsive .jstree-checked>.jstree-checkbox:hover{background-position:0 -80px}.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined,.jstree-default-dark-responsive .jstree-anchor>.jstree-undetermined:hover{background-position:0 -120px}.jstree-default-dark-responsive .jstree-anchor{font-weight:bold;font-size:1.1em;text-shadow:1px 1px white}.jstree-default-dark-responsive>.jstree-striped{background:transparent}.jstree-default-dark-responsive .jstree-wholerow{border-top:1px solid #666;border-bottom:1px solid #000;background:#333333;height:40px}.jstree-default-dark-responsive .jstree-wholerow-hovered{background:#555}.jstree-default-dark-responsive .jstree-wholerow-clicked{background:#5fa2db}.jstree-default-dark-responsive .jstree-children .jstree-last>.jstree-wholerow{box-shadow:inset 0 -6px 3px -5px #111111}.jstree-default-dark-responsive .jstree-children .jstree-open>.jstree-wholerow{box-shadow:inset 0 6px 3px -5px #111111;border-top:0}.jstree-default-dark-responsive .jstree-children .jstree-open+.jstree-open{box-shadow:none}.jstree-default-dark-responsive .jstree-node,.jstree-default-dark-responsive .jstree-icon,.jstree-default-dark-responsive .jstree-node>.jstree-ocl,.jstree-default-dark-responsive .jstree-themeicon,.jstree-default-dark-responsive .jstree-checkbox{background-image:url("40px.png");background-size:120px 240px}.jstree-default-dark-responsive .jstree-node{background-position:-80px 0;background-repeat:repeat-y}.jstree-default-dark-responsive .jstree-last{background:transparent}.jstree-default-dark-responsive .jstree-leaf>.jstree-ocl{background-position:-40px -120px}.jstree-default-dark-responsive .jstree-last>.jstree-ocl{background-position:-40px -160px}.jstree-default-dark-responsive .jstree-themeicon-custom{background-color:transparent;background-image:none;background-position:0 0}.jstree-default-dark-responsive .jstree-file{background:url("40px.png") 0 -160px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive .jstree-folder{background:url("40px.png") -40px -40px no-repeat;background-size:120px 240px}.jstree-default-dark-responsive>.jstree-container-ul>.jstree-node{margin-left:0;margin-right:0}}.jstree-default-dark{background:#333}.jstree-default-dark .jstree-anchor{color:#999;text-shadow:1px 1px 0 rgba(0,0,0,0.5)}.jstree-default-dark .jstree-clicked,.jstree-default-dark .jstree-checked{color:white}.jstree-default-dark .jstree-hovered{color:white}#jstree-marker.jstree-default-dark{border-left-color:#999;background:transparent}.jstree-default-dark .jstree-anchor>.jstree-icon{opacity:.75}.jstree-default-dark .jstree-clicked>.jstree-icon,.jstree-default-dark .jstree-hovered>.jstree-icon,.jstree-default-dark .jstree-checked>.jstree-icon{opacity:1}.jstree-default-dark.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==")}.jstree-default-dark.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-small.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==")}.jstree-default-dark-small.jstree-rtl .jstree-last{background:transparent}.jstree-default-dark-large.jstree-rtl .jstree-node{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAACZmZl+9SADAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==")}.jstree-default-dark-large.jstree-rtl .jstree-last{background:transparent}assets/js/jstree/themes/snap/throbber.gif000064400000002670147600374260014520 0ustar00GIF89a󜜜àà྾¾zzzXXX666ŠŠŠððð$$$hhhFFF¬¬¬ÿÿÿ!ÿ NETSCAPE2.0!þCreated with ajaxload.info!ù ,@pðÉ—è2uJÄ:ÐS"ŠL$…cBÖJ‚ðÇÐ"SšP( G¡µ %‡¢$BÊ„` œd€ÏcÀœ­Âד!LÂXwVrP5Ò g¥*¢aýš :1 o!Y3 !ù ,]ðÉùÈ’‰N&•A£IG¢8‚R £(Pp“'ÁaE–I†ÂA0[´Ö£± XÊÀ°X@£Àè7i0 [ÁÁh$ ú(Ö,óUCÐÆ%s s•j#!ù ,ZðÉù¢X.ÉTJG&9FÒ%†˜TEÓ5“0HÄÑ€ ‚…€=M  ³É`±R.’ È|® ‚VÄ}Àº”¢Ù‰úª’ ð„€ŒÌà9÷‹ÏS"!ù ,\ðÉ)½’¤g˜4öç-Ø&C¢‰ !‹Ìà%V ¤‡ê1Pˆ%Š¬–Ø Ñ"p€rÙeQè(¡‹`,P –ãd}ŒÕBIbв&Ü-·Ãõ!ù ,Eɉ¡XY ÏÜÖ!(^˜ HqX^OF±aõJí˜ÃD€ø‚BÉrÉ”>CÌ@–9N¦"BkJf¸”PE!ù ,kÐÉéƠإ&‘„%‡ ¢ˆ™°§ ÔЈ`G¥0’Ä1HLƒãÀ’8”`Ô®U À`` ®Ø @¡,¢Á€A6O 0(0&ªBÒÈfJPh #ilŽ~!ù ,[ðÉù„ X ÏÜÕxJH2>LƒYÉÓ °HÌ- t¶Lâ‚Y¸&‰$¨±X“ÊLƒq8NC#ŠÝ<1a¡x$n‡S €x\y ÄšHŒ; Ç1n8„)!ù ,VÐI!ÇMêZïXÛæ]Ëå$§&PNC8‚H‰€†Äñn÷†˜¡à€@Ì5ƒìH+k¬šÂ±Û c:cø …à˜…WJ q86 —ÀÚ¡ª4†c!ù ,]ðÉùR¢XÞ'„&\„Tâu âa›e „ ,xŽ/E€( '‚²öQ 0®!£PèM„ÆQ8x€Æ‚ñ(ÀÓv8ÔzÁ‰"Ñ~>Ç÷ !ç6J9!ù ,ZÐÉéR’‚jiåØZ÷m™&”ÀN 2\TI©ÎÜ ØìÃQü àJœ™°r¼&‰Å)QÔ FÃ08 IC00-Lsp˜„öf`u0‚5åE!ù ,XðÉI_ªx&QÇÂER‰Éð dñM‚ZEÓ‰’¢gÏà G @ÈøŸDƒ±U ’—±p>"Ãà,$€d 7 –`¢&H¾€&Š¼²!ù ,ZðÉ„¼øŽ¢²—FÑ|R÷Eá Éiã•°à Y+!à ž™@@P¹¡¥50xp2Â#ài  Nà‚0lN°Ó$0@H–‡N}X<Ìa}q¿¥/)ÃD;assets/js/jstree/themes/snap/style.css000064400000076636147600374260014111 0ustar00/*! jsTree default theme */ .jstree-node, .jstree-children, .jstree-container-ul { display: block; margin: 0; padding: 0; list-style-type: none; list-style-image: none; } .jstree-node { white-space: nowrap; } .jstree-anchor { display: inline-block; color: black; white-space: nowrap; padding: 0 4px 0 1px; margin: 0; vertical-align: top; } .jstree-anchor:focus { outline: 0; } .jstree-anchor, .jstree-anchor:link, .jstree-anchor:visited, .jstree-anchor:hover, .jstree-anchor:active { text-decoration: none; color: inherit; } .jstree-icon { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-icon:empty { display: inline-block; text-decoration: none; margin: 0; padding: 0; vertical-align: top; text-align: center; } .jstree-ocl { cursor: pointer; } .jstree-leaf>.jstree-ocl { cursor: default; } .jstree .jstree-open>.jstree-children { display: block; } .jstree .jstree-closed>.jstree-children, .jstree .jstree-leaf>.jstree-children { display: none; } .jstree-anchor>.jstree-themeicon { margin-right: 2px; } .jstree-no-icons .jstree-themeicon, .jstree-anchor>.jstree-themeicon-hidden { display: none; } .jstree-hidden, .jstree-node.jstree-hidden { display: none; } .jstree-rtl .jstree-anchor { padding: 0 1px 0 4px; } .jstree-rtl .jstree-anchor>.jstree-themeicon { margin-left: 2px; margin-right: 0; } .jstree-rtl .jstree-node { margin-left: 0; } .jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-wholerow-ul { position: relative; display: inline-block; min-width: 100%; } .jstree-wholerow-ul .jstree-leaf>.jstree-ocl { cursor: pointer; } .jstree-wholerow-ul .jstree-anchor, .jstree-wholerow-ul .jstree-icon { position: relative; } .jstree-wholerow-ul .jstree-wholerow { width: 100%; cursor: pointer; position: absolute; left: 0; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .jstree-contextmenu .jstree-anchor { -webkit-user-select: none; /* disable selection/Copy of UIWebView */ -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */ } .vakata-context { display: none; } .vakata-context, .vakata-context ul { margin: 0; padding: 2px; position: absolute; background: #f5f5f5; border: 1px solid #979797; box-shadow: 2px 2px 2px #999999; } .vakata-context ul { list-style: none; left: 100%; margin-top: -2.7em; margin-left: -4px; } .vakata-context .vakata-context-right ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context li { list-style: none; } .vakata-context li>a { display: block; padding: 0 2em 0 2em; text-decoration: none; width: auto; color: black; white-space: nowrap; line-height: 2.4em; text-shadow: 1px 1px 0 white; border-radius: 1px; } .vakata-context li>a:hover { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw=="); background-position: right center; background-repeat: no-repeat; } .vakata-context li>a:focus { outline: 0; } .vakata-context .vakata-context-hover>a { position: relative; background-color: #e8eff7; box-shadow: 0 0 2px #0a6aa1; } .vakata-context .vakata-context-separator>a, .vakata-context .vakata-context-separator>a:hover { background: white; border: 0; border-top: 1px solid #e2e3e3; height: 1px; min-height: 1px; max-height: 1px; padding: 0; margin: 0 0 0 2.4em; border-left: 1px solid #e0e0e0; text-shadow: 0 0 0 transparent; box-shadow: 0 0 0 transparent; border-radius: 0; } .vakata-context .vakata-contextmenu-disabled a, .vakata-context .vakata-contextmenu-disabled a:hover { color: silver; background-color: transparent; border: 0; box-shadow: 0 0 0; } .vakata-context .vakata-contextmenu-disabled>a>i { filter: grayscale(100%); } .vakata-context li>a>i { text-decoration: none; display: inline-block; width: 2.4em; height: 2.4em; background: transparent; margin: 0 0 0 -2em; vertical-align: top; text-align: center; line-height: 2.4em; } .vakata-context li>a>i:empty { width: 2.4em; line-height: 2.4em; } .vakata-context li>a .vakata-contextmenu-sep { display: inline-block; width: 1px; height: 2.4em; background: white; margin: 0 0.5em 0 0; border-left: 1px solid #e2e3e3; } .vakata-context .vakata-contextmenu-shortcut { font-size: 0.8em; color: silver; opacity: 0.5; display: none; } .vakata-context-rtl ul { left: auto; right: 100%; margin-left: auto; margin-right: -4px; } .vakata-context-rtl li>a.vakata-context-parent { background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7"); background-position: left center; background-repeat: no-repeat; } .vakata-context-rtl .vakata-context-separator>a { margin: 0 2.4em 0 0; border-left: 0; border-right: 1px solid #e2e3e3; } .vakata-context-rtl .vakata-context-left ul { right: auto; left: 100%; margin-left: -4px; margin-right: auto; } .vakata-context-rtl li>a>i { margin: 0 -2em 0 0; } .vakata-context-rtl li>a .vakata-contextmenu-sep { margin: 0 0 0 0.5em; border-left-color: white; background: #e2e3e3; } #jstree-marker { position: absolute; top: 0; left: 0; margin: -5px 0 0 0; padding: 0; border-right: 0; border-top: 5px solid transparent; border-bottom: 5px solid transparent; border-left: 5px solid; width: 0; height: 0; font-size: 0; line-height: 0; } #jstree-dnd { line-height: 16px; margin: 0; padding: 4px; } #jstree-dnd .jstree-icon, #jstree-dnd .jstree-copy { display: inline-block; text-decoration: none; margin: 0 2px 0 0; padding: 0; width: 16px; height: 16px; } #jstree-dnd .jstree-ok { background: green; } #jstree-dnd .jstree-er { background: red; } #jstree-dnd .jstree-copy { margin: 0 2px 0 2px; } .jstree-snap .jstree-node, .jstree-snap .jstree-icon { background-repeat: no-repeat; background-color: transparent; } .jstree-snap .jstree-anchor, .jstree-snap .jstree-animated, .jstree-snap .jstree-wholerow { transition: background-color 0.15s, box-shadow 0.15s; } .jstree-snap .jstree-hovered { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-snap .jstree-context { background: #e7f4f9; border-radius: 2px; box-shadow: inset 0 0 1px #cccccc; } .jstree-snap .jstree-clicked { background: #beebff; border-radius: 2px; box-shadow: inset 0 0 1px #999999; } .jstree-snap .jstree-no-icons .jstree-anchor>.jstree-themeicon { display: none; } .jstree-snap .jstree-disabled { background: transparent; color: #666666; } .jstree-snap .jstree-disabled.jstree-hovered { background: transparent; box-shadow: none; } .jstree-snap .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-snap .jstree-disabled>.jstree-icon { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-snap .jstree-search { font-style: italic; color: #8b0000; font-weight: bold; } .jstree-snap .jstree-no-checkboxes .jstree-checkbox { display: none !important; } .jstree-snap.jstree-checkbox-no-clicked .jstree-clicked { background: transparent; box-shadow: none; } .jstree-snap.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered { background: #e7f4f9; } .jstree-snap.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked { background: transparent; } .jstree-snap.jstree-checkbox-no-clicked>.jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered { background: #e7f4f9; } .jstree-snap>.jstree-striped { min-width: 100%; display: inline-block; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat; } .jstree-snap>.jstree-wholerow-ul .jstree-hovered, .jstree-snap>.jstree-wholerow-ul .jstree-clicked { background: transparent; box-shadow: none; border-radius: 0; } .jstree-snap .jstree-wholerow { -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; } .jstree-snap .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-snap .jstree-wholerow-clicked { background: #beebff; background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%); background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%); } .jstree-snap .jstree-node { min-height: 24px; line-height: 24px; margin-left: 24px; min-width: 24px; } .jstree-snap .jstree-anchor { line-height: 24px; height: 24px; } .jstree-snap .jstree-icon { width: 24px; height: 24px; line-height: 24px; } .jstree-snap .jstree-icon:empty { width: 24px; height: 24px; line-height: 24px; } .jstree-snap.jstree-rtl .jstree-node { margin-right: 24px; } .jstree-snap .jstree-wholerow { height: 24px; } .jstree-snap .jstree-node, .jstree-snap .jstree-icon { background-image: url("32px.png"); } .jstree-snap .jstree-node { background-position: -292px -4px; background-repeat: repeat-y; } .jstree-snap .jstree-last { background: transparent; } .jstree-snap .jstree-open>.jstree-ocl { background-position: -132px -4px; } .jstree-snap .jstree-closed>.jstree-ocl { background-position: -100px -4px; } .jstree-snap .jstree-leaf>.jstree-ocl { background-position: -68px -4px; } .jstree-snap .jstree-themeicon { background-position: -260px -4px; } .jstree-snap>.jstree-no-dots .jstree-node, .jstree-snap>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -4px; } .jstree-snap>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -4px; } .jstree-snap .jstree-disabled { background: transparent; } .jstree-snap .jstree-disabled.jstree-hovered { background: transparent; } .jstree-snap .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-snap .jstree-checkbox { background-position: -164px -4px; } .jstree-snap .jstree-checkbox:hover { background-position: -164px -36px; } .jstree-snap.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-snap .jstree-checked>.jstree-checkbox { background-position: -228px -4px; } .jstree-snap.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-snap .jstree-checked>.jstree-checkbox:hover { background-position: -228px -36px; } .jstree-snap .jstree-anchor>.jstree-undetermined { background-position: -196px -4px; } .jstree-snap .jstree-anchor>.jstree-undetermined:hover { background-position: -196px -36px; } .jstree-snap .jstree-checkbox-disabled { background-position: -164px -69px !important; filter: none; } .jstree-snap .core-node .jstree-checkbox-disabled { cursor: help; } .jstree-snap .filtered-node .jstree-checkbox-disabled { background-position: -197px -4px !important; opacity: 1; cursor: help; } .jstree-snap .filtered-node ul .jstree-checkbox { display: none; } .jstree-snap>.jstree-striped { background-size: auto 48px; } .jstree-snap.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-snap.jstree-rtl .jstree-last { background: transparent; } .jstree-snap.jstree-rtl .jstree-open>.jstree-ocl { background-position: -132px -36px; } .jstree-snap.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -100px -36px; } .jstree-snap.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -68px -36px; } .jstree-snap.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-snap.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -36px -36px; } .jstree-snap.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -4px -36px; } .jstree-snap .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-snap>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-snap .jstree-file { background: url("32px.png") -100px -68px no-repeat; } .jstree-snap .jstree-folder { background: url("32px.png") -260px -4px no-repeat; } .jstree-snap>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-snap { line-height: 24px; padding: 0 4px; } #jstree-dnd.jstree-snap .jstree-ok, #jstree-dnd.jstree-snap .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-snap i { background: transparent; width: 24px; height: 24px; line-height: 24px; } #jstree-dnd.jstree-snap .jstree-ok { background-position: -4px -68px; } #jstree-dnd.jstree-snap .jstree-er { background-position: -36px -68px; } .jstree-snap .jstree-ellipsis { overflow: hidden; } .jstree-snap .jstree-ellipsis .jstree-anchor { width: calc(100% - 29px); text-overflow: ellipsis; overflow: hidden; } .jstree-snap.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); } .jstree-snap.jstree-rtl .jstree-last { background: transparent; } .jstree-snap-small .jstree-node { min-height: 18px; line-height: 18px; margin-left: 18px; min-width: 18px; } .jstree-snap-small .jstree-anchor { line-height: 18px; height: 18px; } .jstree-snap-small .jstree-icon { width: 18px; height: 18px; line-height: 18px; } .jstree-snap-small .jstree-icon:empty { width: 18px; height: 18px; line-height: 18px; } .jstree-snap-small.jstree-rtl .jstree-node { margin-right: 18px; } .jstree-snap-small .jstree-wholerow { height: 18px; } .jstree-snap-small .jstree-node, .jstree-snap-small .jstree-icon { background-image: url("32px.png"); } .jstree-snap-small .jstree-node { background-position: -295px -7px; background-repeat: repeat-y; } .jstree-snap-small .jstree-last { background: transparent; } .jstree-snap-small .jstree-open>.jstree-ocl { background-position: -135px -7px; } .jstree-snap-small .jstree-closed>.jstree-ocl { background-position: -103px -7px; } .jstree-snap-small .jstree-leaf>.jstree-ocl { background-position: -71px -7px; } .jstree-snap-small .jstree-themeicon { background-position: -263px -7px; } .jstree-snap-small>.jstree-no-dots .jstree-node, .jstree-snap-small>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-small>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -7px; } .jstree-snap-small>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -7px; } .jstree-snap-small .jstree-disabled { background: transparent; } .jstree-snap-small .jstree-disabled.jstree-hovered { background: transparent; } .jstree-snap-small .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-snap-small .jstree-checkbox { background-position: -167px -7px; } .jstree-snap-small .jstree-checkbox:hover { background-position: -167px -39px; } .jstree-snap-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-snap-small .jstree-checked>.jstree-checkbox { background-position: -231px -7px; } .jstree-snap-small.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-snap-small .jstree-checked>.jstree-checkbox:hover { background-position: -231px -39px; } .jstree-snap-small .jstree-anchor>.jstree-undetermined { background-position: -199px -7px; } .jstree-snap-small .jstree-anchor>.jstree-undetermined:hover { background-position: -199px -39px; } .jstree-snap-small .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-snap-small>.jstree-striped { background-size: auto 36px; } .jstree-snap-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-snap-small.jstree-rtl .jstree-last { background: transparent; } .jstree-snap-small.jstree-rtl .jstree-open>.jstree-ocl { background-position: -135px -39px; } .jstree-snap-small.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -103px -39px; } .jstree-snap-small.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -71px -39px; } .jstree-snap-small.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-snap-small.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-small.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -39px -39px; } .jstree-snap-small.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: -7px -39px; } .jstree-snap-small .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-snap-small>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-snap-small .jstree-file { background: url("32px.png") -103px -71px no-repeat; } .jstree-snap-small .jstree-folder { background: url("32px.png") -263px -7px no-repeat; } .jstree-snap-small>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-snap-small { line-height: 18px; padding: 0 4px; } #jstree-dnd.jstree-snap-small .jstree-ok, #jstree-dnd.jstree-snap-small .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-snap-small i { background: transparent; width: 18px; height: 18px; line-height: 18px; } #jstree-dnd.jstree-snap-small .jstree-ok { background-position: -7px -71px; } #jstree-dnd.jstree-snap-small .jstree-er { background-position: -39px -71px; } .jstree-snap-small .jstree-ellipsis { overflow: hidden; } .jstree-snap-small .jstree-ellipsis .jstree-anchor { width: calc(100% - 23px); text-overflow: ellipsis; overflow: hidden; } .jstree-snap-small.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg=="); } .jstree-snap-small.jstree-rtl .jstree-last { background: transparent; } .jstree-snap-large .jstree-node { min-height: 32px; line-height: 32px; margin-left: 32px; min-width: 32px; } .jstree-snap-large .jstree-anchor { line-height: 32px; height: 32px; } .jstree-snap-large .jstree-icon { width: 32px; height: 32px; line-height: 32px; } .jstree-snap-large .jstree-icon:empty { width: 32px; height: 32px; line-height: 32px; } .jstree-snap-large.jstree-rtl .jstree-node { margin-right: 32px; } .jstree-snap-large .jstree-wholerow { height: 32px; } .jstree-snap-large .jstree-node, .jstree-snap-large .jstree-icon { background-image: url("32px.png"); } .jstree-snap-large .jstree-node { background-position: -288px 0px; background-repeat: repeat-y; } .jstree-snap-large .jstree-last { background: transparent; } .jstree-snap-large .jstree-open>.jstree-ocl { background-position: -128px 0px; } .jstree-snap-large .jstree-closed>.jstree-ocl { background-position: -96px 0px; } .jstree-snap-large .jstree-leaf>.jstree-ocl { background-position: -64px 0px; } .jstree-snap-large .jstree-themeicon { background-position: -256px 0px; } .jstree-snap-large>.jstree-no-dots .jstree-node, .jstree-snap-large>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-large>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px 0px; } .jstree-snap-large>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px 0px; } .jstree-snap-large .jstree-disabled { background: transparent; } .jstree-snap-large .jstree-disabled.jstree-hovered { background: transparent; } .jstree-snap-large .jstree-disabled.jstree-clicked { background: #efefef; } .jstree-snap-large .jstree-checkbox { background-position: -160px 0px; } .jstree-snap-large .jstree-checkbox:hover { background-position: -160px -32px; } .jstree-snap-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-snap-large .jstree-checked>.jstree-checkbox { background-position: -224px 0px; } .jstree-snap-large.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-snap-large .jstree-checked>.jstree-checkbox:hover { background-position: -224px -32px; } .jstree-snap-large .jstree-anchor>.jstree-undetermined { background-position: -192px 0px; } .jstree-snap-large .jstree-anchor>.jstree-undetermined:hover { background-position: -192px -32px; } .jstree-snap-large .jstree-checkbox-disabled { opacity: 0.8; filter: url("data:image/svg+xml;utf8,#jstree-grayscale"); /* Firefox 10+ */ filter: gray; /* IE6-9 */ -webkit-filter: grayscale(100%); /* Chrome 19+ & Safari 6+ */ } .jstree-snap-large>.jstree-striped { background-size: auto 64px; } .jstree-snap-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg=="); background-position: 100% 1px; background-repeat: repeat-y; } .jstree-snap-large.jstree-rtl .jstree-last { background: transparent; } .jstree-snap-large.jstree-rtl .jstree-open>.jstree-ocl { background-position: -128px -32px; } .jstree-snap-large.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -96px -32px; } .jstree-snap-large.jstree-rtl .jstree-leaf>.jstree-ocl { background-position: -64px -32px; } .jstree-snap-large.jstree-rtl>.jstree-no-dots .jstree-node, .jstree-snap-large.jstree-rtl>.jstree-no-dots .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-large.jstree-rtl>.jstree-no-dots .jstree-open>.jstree-ocl { background-position: -32px -32px; } .jstree-snap-large.jstree-rtl>.jstree-no-dots .jstree-closed>.jstree-ocl { background-position: 0px -32px; } .jstree-snap-large .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-snap-large>.jstree-container-ul .jstree-loading>.jstree-ocl { background: url("throbber.gif") center center no-repeat; } .jstree-snap-large .jstree-file { background: url("32px.png") -96px -64px no-repeat; } .jstree-snap-large .jstree-folder { background: url("32px.png") -256px 0px no-repeat; } .jstree-snap-large>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } #jstree-dnd.jstree-snap-large { line-height: 32px; padding: 0 4px; } #jstree-dnd.jstree-snap-large .jstree-ok, #jstree-dnd.jstree-snap-large .jstree-er { background-image: url("32px.png"); background-repeat: no-repeat; background-color: transparent; } #jstree-dnd.jstree-snap-large i { background: transparent; width: 32px; height: 32px; line-height: 32px; } #jstree-dnd.jstree-snap-large .jstree-ok { background-position: 0px -64px; } #jstree-dnd.jstree-snap-large .jstree-er { background-position: -32px -64px; } .jstree-snap-large .jstree-ellipsis { overflow: hidden; } .jstree-snap-large .jstree-ellipsis .jstree-anchor { width: calc(100% - 37px); text-overflow: ellipsis; overflow: hidden; } .jstree-snap-large.jstree-rtl .jstree-node { background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg=="); } .jstree-snap-large.jstree-rtl .jstree-last { background: transparent; } @media (max-width: 768px) { #jstree-dnd.jstree-dnd-responsive { line-height: 40px; font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } #jstree-dnd.jstree-dnd-responsive>i { background: transparent; width: 40px; height: 40px; } #jstree-dnd.jstree-dnd-responsive>.jstree-ok { background-image: url("40px.png"); background-position: 0 -200px; background-size: 120px 240px; } #jstree-dnd.jstree-dnd-responsive>.jstree-er { background-image: url("40px.png"); background-position: -40px -200px; background-size: 120px 240px; } #jstree-marker.jstree-dnd-responsive { border-left-width: 10px; border-top-width: 10px; border-bottom-width: 10px; margin-top: -10px; } } @media (max-width: 768px) { .jstree-snap-responsive { /* .jstree-open > .jstree-ocl, .jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; } */ } .jstree-snap-responsive .jstree-icon { background-image: url("40px.png"); } .jstree-snap-responsive .jstree-node, .jstree-snap-responsive .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-responsive .jstree-node { min-height: 40px; line-height: 40px; margin-left: 40px; min-width: 40px; white-space: nowrap; } .jstree-snap-responsive .jstree-anchor { line-height: 40px; height: 40px; } .jstree-snap-responsive .jstree-icon, .jstree-snap-responsive .jstree-icon:empty { width: 40px; height: 40px; line-height: 40px; } .jstree-snap-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; } .jstree-snap-responsive.jstree-rtl .jstree-node { margin-left: 0; margin-right: 40px; background: transparent; } .jstree-snap-responsive.jstree-rtl .jstree-container-ul>.jstree-node { margin-right: 0; } .jstree-snap-responsive .jstree-ocl, .jstree-snap-responsive .jstree-themeicon, .jstree-snap-responsive .jstree-checkbox { background-size: 120px 240px; } .jstree-snap-responsive .jstree-leaf>.jstree-ocl, .jstree-snap-responsive.jstree-rtl .jstree-leaf>.jstree-ocl { background: transparent; } .jstree-snap-responsive .jstree-open>.jstree-ocl { background-position: 0 0 !important; } .jstree-snap-responsive .jstree-closed>.jstree-ocl { background-position: 0 -40px !important; } .jstree-snap-responsive.jstree-rtl .jstree-closed>.jstree-ocl { background-position: -40px 0 !important; } .jstree-snap-responsive .jstree-themeicon { background-position: -40px -40px; } .jstree-snap-responsive .jstree-checkbox, .jstree-snap-responsive .jstree-checkbox:hover { background-position: -40px -80px; } .jstree-snap-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox, .jstree-snap-responsive.jstree-checkbox-selection .jstree-clicked>.jstree-checkbox:hover, .jstree-snap-responsive .jstree-checked>.jstree-checkbox, .jstree-snap-responsive .jstree-checked>.jstree-checkbox:hover { background-position: 0 -80px; } .jstree-snap-responsive .jstree-anchor>.jstree-undetermined, .jstree-snap-responsive .jstree-anchor>.jstree-undetermined:hover { background-position: 0 -120px; } .jstree-snap-responsive .jstree-anchor { font-weight: bold; font-size: 1.1em; text-shadow: 1px 1px white; } .jstree-snap-responsive>.jstree-striped { background: transparent; } .jstree-snap-responsive .jstree-wholerow { border-top: 1px solid rgba(255, 255, 255, 0.7); border-bottom: 1px solid rgba(64, 64, 64, 0.2); background: #ebebeb; height: 40px; } .jstree-snap-responsive .jstree-wholerow-hovered { background: #e7f4f9; } .jstree-snap-responsive .jstree-wholerow-clicked { background: #beebff; } .jstree-snap-responsive .jstree-children .jstree-last>.jstree-wholerow { box-shadow: inset 0 -6px 3px -5px #666666; } .jstree-snap-responsive .jstree-children .jstree-open>.jstree-wholerow { box-shadow: inset 0 6px 3px -5px #666666; border-top: 0; } .jstree-snap-responsive .jstree-children .jstree-open+.jstree-open { box-shadow: none; } .jstree-snap-responsive .jstree-node, .jstree-snap-responsive .jstree-icon, .jstree-snap-responsive .jstree-node>.jstree-ocl, .jstree-snap-responsive .jstree-themeicon, .jstree-snap-responsive .jstree-checkbox { background-image: url("40px.png"); background-size: 120px 240px; } .jstree-snap-responsive .jstree-node { background-position: -80px 0; background-repeat: repeat-y; } .jstree-snap-responsive .jstree-last { background: transparent; } .jstree-snap-responsive .jstree-leaf>.jstree-ocl { background-position: -40px -120px; } .jstree-snap-responsive .jstree-last>.jstree-ocl { background-position: -40px -160px; } .jstree-snap-responsive .jstree-themeicon-custom { background-color: transparent; background-image: none; background-position: 0 0; } .jstree-snap-responsive .jstree-file { background: url("40px.png") 0 -160px no-repeat; background-size: 120px 240px; } .jstree-snap-responsive .jstree-folder { background: url("40px.png") -40px -40px no-repeat; background-size: 120px 240px; } .jstree-snap-responsive>.jstree-container-ul>.jstree-node { margin-left: 0; margin-right: 0; } }assets/js/jstree/themes/snap/32px.png000064400000027036147600374260013527 0ustar00‰PNG  IHDR@`lK«(»zTXtRaw profile type exifxÚ­šWŽ$±•Eÿ¹ŠYÝ£Y-0;˜åϹ¬¬nµ‘ ªDufEF0Èg®a´;ÿ÷¿×ý?9×ì²ÕVz)žŸÜsƒÍý|½Ÿß¿ï' ¿wåsJ¼§¯?Ëùzƒãöó‚š?Çç¯Ç]]ŸqÚg ðcà÷“tg}þœ×>¥øu<|þvýsÝÈÿ°œÏo\?–ñ5öošž·1^Š.ž’çߦ»$fzï}¤”BÔ§Ègã¯wäï±sþŸ/¯¿ÇÎÏé×P8ÿíò[Œ>ǃývü{@Eèg¾?Æ_¿(éûÊ?cwïn÷ž¯Õ\ˆTqŸE}‡ð}âÄÉâÒ»¬ðªüŸë{u^%.2¶Éæäµ\è!írØa„Î{_a1ÅO¬¼Ç¸bzÇZª±Çõ’‘õ 7VÒ³]jäd‘µÄáøc.áÝ·¿û­Ð¸óœƒ)‹¼Üßþ'¯Ý«|‡ `æ¯Âc^Q5Í4”9ýËYj¶û‰©½ø¾—ó¿%ç“ØDí…¹±Àáç×ÓÂÏÚJ/ωóÌgç¿Z#Ôý€ qoc2!‘_B²P‚¯1Öˆc#?ƒ™Ç”ã$Á,îà.¹I©œuo®©á-~ZH„¥’*©¡HVÎFýÔܨ¡aɲ3³bÕšu%•\¬”R‹0jÔTsµZj­­ö:Zj¹Y+­¶Öz=ö„Y/½ºÞzïcpÓÁЃ«gŒ1ãL3O›eÖÙfŸcQ>+/[eÕÕV_cÇ6í¿Ë®n·Ý÷8áPJ';åÔÓN?ãRk7Ý|í–[o»ýŽYûdõ׬…ß2÷¯³>YSÆò;¯þ̇ký"NL9#c12^• :*g¾…œ£2§œùi ‹d-˜’³ƒ2Fó Ñnø‘»Ÿ™û—ys–ÿ­¼Å–9§Ôý72町OæþÌÛ_²¶Çc”ô¤.TL}º'œ6âÜ©×ï 6ûmé–4ö¾gÄ>j™±û½Z –wZc-­>Ÿqjßs6W·@Ž92£æÓZ…AÛÑ›Óõù¶zskcß|v)wÒZ±”~¬¯SÖa¬³›#O$}µÍ1Àoõ’.aýÂøsg’\#&<9µîI™8 ¦>Î ƒ0€«0mž›0pA|ay `,ëÎ*nk'ÔžV[&ÓqÎa×ÏÚ|¦@në>—\¿| ù®J$C-DàjÌ;tò²xf¡&QÉi²P}C¥&•IÕdM„ù²kºñì 0ìFè©R™~=ÕçݨˆylƒêÍ@n`NÞE ­Ã ª.³Õü†B‹†šõÎœ÷©3[8}ÝšG³{JY$¡–Ö©.lVX²/JÚ¤Izà‚:|éó.YéBZ»?Ï€õÒÅ{»¶Ê¾såsÜ:™´övë ˜¹´†2UA³ô›ý·G]‰F˜‡² Þy†“;²#KïäæÝû+¥®Ýz¬Þܲ *~,*åu};e…ƉôÛ&%*u 项¬AGóöR[·’LÊ…*­Z¯VÎdYZË–] Y®_§ïMîo›žz9È+4äç¹|t>'ìO¢±¾²™¦R4çéqSÍ ±ŽÀªdÍÒ]37ÒÕ¦3©´Iº+¹M…)&þhaÕ­b¼MpÓ´;ƒôÔ®š¶£ÆtÐ!=àjý¹­œLï„N9t =æ\â>¨¢LØ­ÙNª}l4)@´&2`"äÙÇ&íI§ûXú´é`½ßúH+Í®œæHƒ]”,MÃòë£Æà1Tê0K¿;›©F6½’ÏeŠ'.‹†pÞ(™5Q^Dþ@x¸M‹dd•KåÏ <Ö:K=sØ•¾‡¯. ˆµ Yâ…xZÍj’ésË~®ÑÀ6r˜Èݳ­AA‰0¨ê9|Eˆ®,„iƒÞÎFØ °Bñ“^¢vîèdŠè²KMÛøÛ]I(¸·@Á¨² Ò ¥ ÷kMêòGÚ‚kn¾@}gACYfÎ6¤SgÈìt‰c–C/þးÒ=ÁÁ§ô&¢"†çë¨Tè=fŒBÿgX.yaw°íaóN¹N¢]ê6ÞçÔÚv~ÁUûïßz {}-2º=Rst-שâm#2& ÅMÏÚŠµô¤B£á0A±ýñNŸù±O•»æÜdE‘çu 2¡°üsijÆÐxºD¢rø€ƒ-ó$ªÛoàzY`*êed‚T½e§ñìÙ[‹Þòg ­lL#²B@’‚X§J£YSKBÿRÂäÊn#ÂÆ¡9PHtD@Êóa1jßèÏjÅ7º;ÛÝÁ¿S„~—ȧ­á~„`"¶ž€¸™•‚50t;ybF~ôZÄo0 ×Ï¥Ù/̓Û~t¶,8 ‰ÓªûR¾¨ï>ÍïtèZ´pÏE‡# bÜà}g²êB¿ÍKÊHqùcÅÚÆhEÏ° Tng×®ú÷‡IS¢ßÒT†SÔ¸SG.GOÅEKk'%L ª¶"2ëè†,S=Au·¨'€R«/äq¸ùn˜ä3”á,x$Óí ÐàYæ·Ú´…dž‰BLÀƒÃ0?‚¤œ$¯αú‰äÀâ’ú'ÔáPý.k­ ³Êý{Y^=Ɉµ”:°èµÈƒÕ¨ $’]Å£ÿµh@Cœ†‘p·åt t×õNr·’É€”MYùC·à&\]Eð~¥.Á#R µŽhÂé¢ <àÚr´\SÍ­2H@gz*˜~“ïŸûE‚|‡°oS+”#weœ»Cã1>-ZAº“R‘œÏm!sÖ ‰WHÍÎ-[ⱌì0À21Äß Ä€BUWV=õøù^„þuÅÿuÊ× ˆ¢?×cþÇt÷!q:º{OZ\¥¹ATø(I4 a¨ßóФà¥Fd½‘"ÉÂNÕ¶Cgjd"-„ñb‚jˆÀ‰Z.93D– î’ÙÏ@„€ª=¿2ܵº†S¢¦ààœ6“âSd]LžYUAðV•"ÑMÈÃ%DòH{äÂûm:Á˜n›f¤,^E‡gω¾¡|úzùGË‹$ÀßÓ>ÎW.$œîŽô «kß3ø·úÈÝi¼tRƒCIb$€_\Ÿó¤»_Î!¶ ëÏÎíæ>‹¶êáí“#=ªÁc¡ºÊ@0Ôê[¡qhŒƒ¤páŒràhsí Sõš2÷¹‹ŒÚk ÅAòÝ¥i™ïjŒÉè@=‚È¥Œ^hHþÓ^Õ º 1Î7^X *EÉ0õ2‹çE²øY‰í®ESÆ8µLÓF§l=j´i@oŒÃ<$DÔ##*Ž¼Y„Ù"Ç©2Þ$L¨É ø¹%d‚×Rj”„¡rˆŽ4d¸!„µJ Û$÷¿ÀPK2§º"à ižÏIij+q*Qag–d‚l<=GD`ôÜ`$ Mã6s¢O@š®èâz•c8²£”z¤ÊûoÀ'„’!õ1HtiíÀW‹¦å õ`f)&¢KP7ç¡<ºö"õËãJ·)Ò«®Ca„¸[Š954Ië¢dXá¤XÉîã´œ(]U¿´=Ó[=hÑŽÔ,° :{j“@Q2¤@Ï2îuhw÷"ºâB:u¾Ã•àJ»ö6@ÈŽËc üˆÉ-&‰2ÔÍ€-™¨y˜ãà3 m Úå;É$úÛ!5©Uh—‚x(i¥Éð~âågRE·¬HyO …lƒ€EL0À®#ô¸ðQ0ç‰(³bÉqÀp²LHÅHJ ÐÙ’v]€>¼wÄ€÷s(D—”íºA:¡±õ·”M;“D,¥Ê¬©àl¹)½A”3}>7´¯¶}.¨P´A‹e%@ø~L²—ӉׄnAùógghä‚hwOÁûΘŸë (’~˜’?ç2ŸV+m¥½3 —Ön0Ú*‘-€§’2-fUÉÇo$×Õ|ZòDƒ†X*ðpÌ€à²;Gó˜/¿Jî ½€{bé»G=áþ @#õDV&Dî°’ @|óˆpü Ñ––%.…κp À£÷ô«½ïz+ó™õm]ø3iœgÚ'sǩȈ$”ʆ@ÀÍB 2`BÍ:Š Ó# âXf'’Ý Pæd ©šM)#‚yHÁsm¡Ú»ZŽZ‹Àà&Ch0©CînMs]oo;j…ÁPä1ÄI:íÂçà /H / …ÒÇ!CƒÆИ}Ÿ9…–¨QÈÅyàÂÐFèô!›½{ˬn/TàŸ»oh&Ü8ßzµ ²d€}ph·CT–a‰¶R{-d,j“ª]¢†­!ªMLìåÛ‚ûž ðÙ:ŒÚ¯.¢¥(wÈÂœF)²´·{iIÉ´Áöñvêp˜"Lž\l:ãYz–þõäü|éý÷×øµ_ÎxÊVé€n]R©Ð5:w’- ¢/À™ ¿B;hl\0TìYƒ¬‚Þen\úžQTÀj:ò.Cå‡s0è¦]KcN‚tÆF€›¥ '\¨j¾´[´«6eð£‹àùqÖe#qSÔÙ•ëµ9£ÝÇÂR{ØZæm+9h ¼=õ Æð×Y„j’á ÔçÈêZ¤ßia`¤hÒ¬) –³fR‚궸MX8È¿Oƒ44'UW2D,áÁ#I`DÄî¿ àËkê4;IÜ¢_<œÔpJµä*³´uh׎ÚÂ„Ó Gu”ßÌÀ#àš)dQÙOzMü†›­o?ifêæ6ödh¿è–‹§šÐùFŒ¨§#ëG‰™ÖŠjC‚bkXh X@i, 4œÈäc ´çY~h”©lÉ é=7Õ,¡{vBËa×°à' ©YG%Â'9*Xo¨H\5Ý_=àŠ82u¶õKË‚1ô…aÜ30¬q ´¼h=6ăâÂjhŸœ"5'—pЕ1í’¯ósCûçÆ6 >H*½‰Æ@AË—JSŸ& [åÌ8ÈénQîuym iãm/m] EÒ!øØ/j   Úêg©Ðv±Èµºiè…(þaiÁJ8zOh}¤jÖžH{Ñu8Ž­×/ ñöÝÆô!Ï—åÇK.!ôh+Ç?—ø×w²B¥×hG‰¦]!Œg^P¸Ñ¯ïÿúó%ÀåOn·DéÜ ;YçBrTíö®,ƒ8f¥i[àœÜk‰F?¤_=C&9Õ…v`Ç”`»T ä¡Øë÷“JJy¨èòQe*Pàà(•@E©…†¬‰´!"]´Í…­¤á‘&ŠÀÉãèQ¤£|¡æG×,ðÚ²@«ÃeԾѾô£=9š–$l³ƒ Ç«¦‚°×30Ú’À±hD5I?½§î˜¬ôµ;“è<„ÀÕ¦/JÓÃ|’!e–ê¦##…ÚKŠŸ˜ÝL¿ï‹_ÆÑiÃ;<÷Ò¶ûpšˆÚ2ß'ùÒ[nëÈ7elF—E/ÅSÓƒ^,«Êƒ!H C9-”f â„^¨-ƒÉ[ ÍV°¥SšYi¡Hprp…ái *†fŽ^vyi³©‚Þô^LõƒþÞ’ûêÙ ©ffGX,piÕV ”ª­ðAõ7陾3ÐûÀà‚×&Î%?ƒýžr½wç;ðÞ¹ ÅÞyÁ#¨Ø^‰)èÅâWbþÐ/7N€JºÓ3-R|¦ïÃöåO¶ÇÐ*Ù--‹ Éx÷LËî°SÌÚ‡Lh<à‹¢¸t,¦Èý?ÊðEƈRÓ¬bKGDÿÿÿ ½§“ pHYs.#.#x¥?vtIMEã 5!‹üäIDATxÚíytÕï?·ºº[ÝZ-Û’÷ÌNÂŽH00çLŒm˜a^Þ‹3!$' [ÈrÈã’afgl9€ÉdXm †÷pÀàãÈ‹,0¶åEûÒR·ºÕµýÞ- yÁ!VµZH÷sN–ºÛ¾U¿¾õÕçÞª®BDøGM†‰Ç‹n_£É]ÿ;’ü껨# 4¥”®¾F£É9ý2C—P˜6@ÍpÝÿ´j4m€m`Ú5Úµj4m€m`Ú5Úµj4š!i€¦.aÿþíÙ³Oéö†%K–¨… Ê?Ûúd‹×ÿñÛØžhêýÙŽ70uæ´ÿYvôõ€ö«ÿiÔ zZüäˆR D Jý9Ñ™à;7}GùØ~¯tt/J)%‚Bb(D‰ $»í&ül¿oøM9á+‡“WÀªå¿ç«×-ÎzPäÄõ·A2Lš4AvïÞ«tûÙ¥¢¢‚Y眣JKG " CDa*€ÂS¢ ”@2™dõêÕ¾õÓŠŠ .»ü2‚ –•V¢D¹žJ”†!”a4C8®Í‹/¼èKûJ) ò ¸ìòËÈDûÞw¶¿ÇNõ"‰il+ÈÚçá&¢ìÚ¼êXZ:ŠOÝ$Ù A? PûA.Ãg˜µïæ pÌ@æž2ª`ïá¼PÈ$h³áT5¿O]Åä¼™ÃU …‹r‚ ž0}ÄIY)B¬½ã ç‚!“` È‹[ÿD¼¤šYÎg{¬Š¿®ß“¥O¢ž@¸]™ðÛÏ»í¯‡UËŸÕNáÇôË®¨¨T 8sæÌœ¬Ï¤IrÒnOýsÕþÛŸÍú/]ºT)À¶Óضm[Ø–…c¹ØŽ‹çºØžífËr°]Û×u0!±Ót¾J¨4FSô¼¢ZdD#vQ=^Qm…•F·RcUau9˜¯ëðnÍzþcóݬÝû&¶mí÷ÚŸ7=CCþ”•²¾þ’])&ÌNS´hìWü\‡¾–ÈKì|}ÂÏJµc¥Ú³Þÿü8 |ħÁ<óô³ƒ"s~¹6°gž~Vƒf»þ ,ÈØ•cÙX–Õ„⹸®‡í88¶ƒ|"k¾ÛŸ'BG2Fmr;ö.öÙQgD½»ûc:¥ƒ‰-ìn«ÂSž¯+ñqG kRsüòX›xW7­î}íÕê—¨ ¿O´À¥ª¹’}ñìJlã½Êj:bn]6>“žpëˆ|~à/ú§‹¨¨¨ùóççl'œ9s¦œüÅÓùÛÒs`þþ݇6Òvñ@)°†0A)\ËÁ(ÏßæQPßÑFA~'¥ùŤì† €…Aºö=tÄ£(O|‹aóúò3ª¦>ÇäH1kvÔ0²¬”uû*÷!2BXg-'iì&^Ó‰)ù„Œ0 ;CœŸO®Ü”­¤7èö†"Å‚9,).â’K¾Êâ‡ËM7Þ¤rµó ×9¸áU¥îc­ž'"Øx`˜x"LC  |>¿¿[Aq]!ítQ—èÂ$³J"–kÓ‘j§1ÑBaüXÄÇOñ}-tåíÅq]65·SÁkñ$ym&uÁu4·Ä3µ0š&sÿìçØñ~µïŸ‚oøÔß{B¯oø56µz4ú»^qùÜu÷od¸…_ß9°#}ô#ûÖ Úÿ´úg¯}Q†¡ •JÒÕeáz®ëa¹iËÂqlǶD<ßÂJ‹Í–¦Jö´í¥&¶‡šÖÝìŠí¢ºy[¶Q×Þˆ#.Ýg‰ùƒKjמû&»?2hJ´’ètÙÛÔÌ^ã¶u½Ick/ ® ªn:÷Ÿ·œãǵ>o¥ÚqÚ‡ë¶Ä~Ëça°_Gcí<ÿÂóÜqÛ­j ÃÈÙ°÷Px¤ýåÀúDû‡«¶Úé–@„ÌÙ'6é.!/ÄÁP–ef<(Ãð/€z#XÑo¥žêh&`2+&àˆÊÀ¥ü5ÐFÅ3žàgëÕ‚çA:iƒô®ªyÿçü§8ºlzVúú{/þTNšu)ÛYc€Ä!C1iïs€±öV®\Á@¿ª««õYØïþ „ÎÎÎÌN .])0É ‡ƒ.ËÁPÀ÷ D©×”N †E…'‚×=¥dD÷©Ñ>óåãΡ©ñ·üæÃ,mÆu>©ŒÙ6…¿ðI¦•LÀ¶-‚!ÿÎn3!â@ªµµù“À ÕcÙ0eÆtÖ¯^Æi_¾†ŽÆm¤ÚÛ¬Sø1xĪ^íur9?ÜnõW™ ìc…‚x®C²+Ù­BBWW:kë ’ÙÛx Ç3@ŒÌï’yƒJŒô²Õþ¬©§òý÷j瘸¶ “ùõÙ2}äÿ·?jšQ£¬gˆ›joë]úã@“S¼úsuøåá\E&o žRžLv≢  ßïÑ/Žk ™\:æŸ êñP`xJuŸ £ºÇépõôëŒh$‚ãó¹ˆÁ@æäî/M?“’‚¹¯òç‰rۿัGõ¾///Üû^ß°Œã{†· M­ Ë(åÛHóóÓ(µùå–áXÿ`0ÄôiÓú˜˜dÂOQé>X‹mÙ¾·ŸìL2çì9\l]rØQS0dÒÞáÿi Œ5€ GžÃˆ¢ûˆ„Â[>ãïõoý8æþ›Üsô·!žÛ>‘SÔhŠDg‚•+W`Úl²ÇµIt&|mõêÌÉÇæß±«óó«}añËyûí¿ôZP»¹æS×YDú}áR¦ã¼ûÕëÏ|êÞÖêÁÔ/rv5Fó9™.€+7=uïU‡ ‘ënY>诣P£Ñø¹dâÄñýþ&–@Fàç}OF3,ÉÙ=A46@m€F£ P£ÑhÔ¨Ñh4Ú56@m€CœÁr_ŽáÚ¾F 6@F£ P 60m€m€Ú56@m€ÚÀ´j´jÔh´jÔ¨ L F 6@Fà07@}Eh (—7Hîíç‚]ÏݬÌ@f³7³N¹òÚ&Þõõ5C›ßpDtê·U~µ( }ò„¡<ÄÀS=û‘’@æþ˜¢Ü+{ízÚ¼åÖŸÊi_<‰míb{M3&`Ë–J–?S‘ÕШ pX´?úKדw¨›~ÂœD3u+~ë[Û¢ã.¾#ÀíŒ#á¡<ðÄ  †2QlÁñl‡ÚWïôm[³üfÆ]|'*RzØ÷nؾ†jõ.ùÉIœúñÛ6ü1}"/½¾–“Çò£E7ðó_ü€pÁèAo€:ûI®‡Ã¥ýpé8ÄéÚ?Ì<Œðþ]XE„BÙèÖÂƆ*öÚULÊ›IÀ0QÊÈÜNÏõp%È'8*+5ðⵤ™‡2ynÓ+ÄKª™5á|¶ÇªxmCïí/¸~Ñ!ukõkºûÉçÕ~ ®_$K»?+}dPÝ®¢¢Bòv3gΔêêêœÏ= ËUýhûÅMÅU R„›N€dn”®òq37Lï åv°ßÔ}jßsRjC|%cÇQol ,4C‚ËRB£UÄÈtªjvq¢3Ñ÷¬Ù³÷k_æôÀ1œyÌò 2+ætñôÖ7h)ÚÄ”¢ ¬¯‡ytΚLÑ¢±_鸿n•Ÿë±äÑûn;±öxðQ¶o/î}ßÜo,Ȫ|æégs2‘8Bp0X.ëŸííßõè·%€r»:{o@. ÄêÄFQÊ@\ Ï#ö§À!‘Œ³/ÕLÄ c“$¨B½£p>NnæãÖy©¯ÍÐÞÊúÎ'ùÂéSYµyá‚œzâ%¬ßø*µ#*Q ª¹ÏU(¥Ø¾e'1·.ŸIàÌçÁ÷®ðþ7( °¢¢B.¹ä«¬\¹bÀ pòOÏyæÚ‡Gý•+®k(Sá¥;Qá(J2æ'v*q»ð¬¼Þô±}qUc¢…¼ŽNF’t“tû‡Aq°”ª¦´¶G|Póúò3–OØÆ„ÈÖì¨adY)Köý7R)x®â¿Â/“ôv¯éÄ”|BF˜ØNøVz>ù榡<ý”s\üðb¹òëWQR\”³"ä:s~äþJ)å‰xdAÒ‰Œù‰B Á³»QÁ(Hù¿âá‰Ð夨'1” @<Ï£¥³…}‰=ÇOìï>¹ŽÔ56Ó®Åq]65·SÁ­IòÂ&ujÍ-qð2¹jÇï.x†²Êe uü0À#þ&È]wÿF®¸üŠœî|î„ý5¹þ<úa’ÿÈ£ßõïÏöúQÿÃê %ÒÕ‰kÅ7‰k%ðìâ9ˆ—Ùû=§³ïüŸ/ë³ë¹›•ê>¸ázÕM[ÙÓVËžØ>öÄöPÛ˦†¿±±v3õí­™PôóOÁ’Úµ×'Îf_54%ZItºìmjf¯ñÛºÞ¤±5Ž—׆`Ý$þýœ%œ2ù8†~|äˆðŽÛnUÏ¿ð<±öŽœàoüµw陓ê¯Éé£_&ùYý®ÿ‘l¯Ÿõ?œ{ˆ¸à¸¸iœ$ž›Îᯫ1åÊ?dÔ†IC2ƾX[¶³µö#¶Ö}LUÝGÔµµàzNfHž… œ;z4·Ÿò0©½%Øi°Rk·IÄ=¬¤Ó jÇrß9râøx–3,0çs€7Ýx“ꙃhÃà\3lê/( ì.<ðW\Œ<ðl q=3Rˆ›îÄ æ>ž§DH{±´¦-%x™ÕÊÎœúÜ|#²#—3 ·ív~´éç¨ÒnOÆ)ˆÆ&òàÿÁIeãq»˜yYý8>í€G"1°24(ŽÏŸ??gG!5âþ¢DL 'eƒdÂÇó’´Á3,ˆÅI¶cF‹»÷ K"(e($ó½ƒî1®BuŸ…­ÄëmMuŽôÈÒEF¾4æîêü1?«¾)Ž#‘ö1ünÖ/9®dTŸíÏÝçó}jaÇŒÌï,¼áû„ F÷>7$ °‡«¿1WUTTèÌC¹þSnxDv>þm¥”mvPˆ¥¡"ðNÚé蚣|_ÃŒðµò+ ©ÇSJ2) =QûI.\=ý:#-ð¿ý‰™oréI§Íÿ5¿Øò{"äñ«Ù·pÊ´“zo¶¸ûg‹zî¶_ÜϘ‘ùœsöw˜7ï÷lݶ„/_xW~ý*îýÍ/‡®ö5E¹5Á¡,¼|ŠŽ>ƒ"¼ÌèVd¿¯ÁI $3EuŸ í/N¢™«N?—«8÷°v§Ì<¬ÖzßÛOî­ÆŒŽà¢ÆQ4r<‘`˜“F?ä{³ÅÔ©SêgW]=_ò'\ÂÆ[èL­!?rdzÕo,¡¤hÄÐ7@&ÛìýóÝú‚ÊÜË׶Ý‹Æ·ø‡ÿ/Ñ/ÂÎÇo õƒ%ûQ÷c㇟޾ˆ È÷ü¯y,beŸ¡ðjjv.M¬£-kíê«Áh4šÃïàúz€‡ŸZÐ]D£Ñ|ÑW„Öh4Úµj4m€Ú56@m€F 6@F 6@m€F 6@F 6@m€F ®¤F£ P F£ÑhÔh4Úµj46@F£ P F£ÑhÔh4Úµfÿì»üV©ÒŸëYîT*¯ïïš¡ÅÒ¥KÕ¡~Öh²Ø7ÈVL›ö½ã®½ö‡[zèÇ_«¯_Ú÷}o¿ðøï~÷Ç•÷Üó£ b±—üøëp(‚JEúþn‹¤ªÁü@ÙOnùÙ¿êµU«V}¸víÚeC±£/~x±äˆR D Jùž½öå‹šsòóÿå‘©?Ÿ±À¯ÿûYøî Ëú<ò±Å‹)J¥‚gÿô§O¬(+›·ª¬lÞ™?ùÉ‘‚‚ ••D&M*8wñâ§ß,/Ÿ“¢;I¯¤¹¹¥º¹¹¥Ë8Þ‰Zá@â:ÉTŠææîºë®;î¸ãŽ;‡`_÷ ó qÓ‰Êͤ×ý»µ£û.p´µCÕ‡°¯–HФ¸¨ÍÐÇ»Â}æ,½eêE×>ÿµ?‡¿Y6í ×¾7þÌ_Þ|Í«åE£F­¯‡dWŠEW^º¤hÑدø²“Ãñ–ëâÄb¤^{ø=÷PPYœ}ë­ËÎ[´hYÔq‚ÔÔ@K ìÚE^qq~~IÉ9¾Wþãƒ$ëH74À¶­ˆG^c#;v‘îJêtÐs€Ÿ‰Ït[̼Çýí«N~îô™Ç—•}¯õÚET4×äß<þ¤ÿË?¿PXHYUs%ž›9ñ^Õ‡;:bnÓøõ6mÂ×Gvs3=FôÜs1gÍBÚÛQÁ âY~õ«?íª®þÃéY,þS/=@}}ÃcÆ”_è8A¥ö äœ ÿ!?/ÊÄÉÙ½{\uÕÜ;‚Áàÿ³mûÍÏ{'_°`,«XFªµ…䊄Ÿžô±Ç’â‰tut`˜&é4ü|Œâbk©HžNm€þ y}ù—}½tÑXÁšÿ—‘cK»ñºÓ_Ø]÷OÅ%åßœÂÊÞÛe«éÄ”|BF˜-ÛÚ¶¾óFÛ|–5mâ‰þÏsÎ…=Ï¿m9>‚ÊRù áæfÌóÎ# aÙ¶lX²äO{6oþÁ\Ø“íC *•í#Ý Õ0M¢‘'Mı‚!“ÓN;mìééJ$XT„}ê)Ä«¶a®}µ{7Ñš‚S§bD£HAéd’ÄÔ)óu#ìWþÝt¬@ ¦¡Á²C 8®Ë¦ævŠ£#Ž»fþño…C‚jë­²æ–8x ­{CÛw¼7r!Ëš6ú¹ÓÏ…ÝËà{5¦9s„ëž("™-߶ ±,]ÄG•••;7oþÞ5P;PBß5jäLâYËO9¤§Ì Å…A\Ç9ð>áC!U0’OñigÐ$wßE57CS¡£Ž¢«¼œ–G=æX‚yù:´ú4^R»v㮞rzÃSå“Üq"ïl&\;ÝérIǽLø»Ã[÷®5§÷Ufe‹ƒÁ ËÃá©V"ÙýÈŽ¨5k3{ö´ÝcÆ\È§È ¡ <ñ0TàPCa€€iÁe Ìü|Ôøñt••c‰ ZZ`Ãp]’#Fàƒ„ÂH¦ú m€>`&_ßå¿Ñu5Ö)óQ–Úð¶Öê‘óX¶{c66t™aÌ+y2bYf ‘9|í„B¶M¾ànÙBÔóB§þ“/¿ñ†<3Páç8Î>Ó!žÍù?…BQžBÄÍ$ Juÿ(zö£Òí1^z‰Ðòg±wìÀP û„1=—è–-„Ö¯'Ïu‰Ö—étÐèsTÔ­jZ8îÇnz´t´”‹@K]àÃöG_Ç÷nÌÖ†J0xœ*,4­ÖV<Ïìp˜Ãxɶ,u,\:pÒidLJMÃ4Ððƒ¬>묳T(ÂuÃ@žüÃèc€®ã`˜æгOpE°i¥°fÏƹtˆPôÊË¿õFC]ñyž§ÓA`03~©íšq ÆD"Ï86mí;RWg3üL§j†‰RZz]q["Ô»îsF:}«l†Ô1påh ÕóøpÛ¶§ºÚÛñ}M’^ÜÁÛ hø¼ûî»2{öllËQÊPûÿ 4ç¿ÂÅÅž{]iìÍ› Ï™Cñ)§â)E<%É'=÷\BÅ%:´f)–Õ®®bìå(R,«Û˜å픹PûÇtú¶VPéÂÂkS±Ø=ïsa7À³ðƒ­`L€ÿÑÖÙùŸi‘ÛæAm6RÀŒ±Q£FÎìù9ÛÃÞýçÂDlÏ6ŒÏ_W ™É@¬¡7ÿ΋p¬Y´OžL¢±‘Q3f*)Á!5y"‰S¾@~Y9E&àzúø‡6@ŸðS¾O(ÀÛ ÌñV™{ŸM§ïL¥Ó«ƒðÎ\ØÓób÷y‚?ª…çƒ"kæÁ^²`A¶H*¨½§º$½½‚ëºD#åy â!ž‡RJ)AŒÌŸÃ€R=Ñ™`åʘ>ÛUWß·/fv„Ýû`ý×&љР¡ ðï/?OWƒ9`c\ñƒ^j_ƒ,ú·½Þ]“î«£J¥2'€(€û{Ï…Cá› _÷Ÿ!G÷ñ# Àl5Á5:‚ ¢FaÐ4±Ó43“’‰=Çq>)\Ò‹;Ҡʸ{÷Þ7@€f( ¾'ˆF£ùÜ`¿Åh0 F£ÑhÔh4m€F£ P£Ñhrk€F3øÿ· Då|Æf{IEND®B`‚assets/js/jstree/themes/snap/40px.png000064400000004252147600374260013521 0ustar00‰PNG  IHDRðà¬*EPLTE333ÿÿÿÿÿÿ333333ííí333333333333333ÒÒÒ333333333333333333333333333<<<–ŒôtRNS !PY\]üýþØcþ7ÿIDATxÚíÝ[›£6 €áºm·M»žÿÿS{±™ð!äXŸovç¿Œ,+žÛµ›Ë¦ºv 0`À€ 0`àû},ð=„ûHà{jbà{zbà‡WIlüôêˆÍƒ^±uðÊ«!V‡P8|Põ*ˆÏƒCÈ«J?;ä=/> þѼ÷Œ8áíþìGÞ{\ÜÂ{üOòÞ£â&Þ“àe_òÞcâ6ÞsàuoòÞ#âFÞSàmòÞýâVÞ3à¸Gyï^q3¯.8ä½ÁˆWõ’~² {5­'̲Wñ±ô¤™öê¥fÈ«ZzñjMÜx•¦‡j^à›¦×Á%ýBl'ˆÖÌiiz?–^ˆ-M„u³–š^Ã¡å ±­d–v^ZÓktzx+‹•Ò×–4½6S<Úi;ûI<íĬý4­vêÝ~"^{qÅþR‹öò™ýÅ4íRûË¥mÛÝö ÕZ<@ÉÃxE-ã•-W˜6^éáxÅ¥ã•KÓ 0`À€ 0`À€ 0`À€ ðÈàû},ð]ùóTÖÁwÕÏaÝÊë`Ý¢ÐR¬V-Óý´H°nq }°RùgØÕ:‚u |ïag»÷+•p»ké{ÛŽ@ô/iãbõA˺Xû±d^¬xûy,)‰}ÄÎÀçÅÞÀ§ÅîÀgÅþÀ'ÅÁçÄÁ§Ä.ÁgÄ€¹¤´x,xZ2y`zH€RÏX'iéxméXg†[ja1åR«ƒÖåÄ•J¼‡Ñœ†–Ç }NN,’ºœžYö˜ª¸t¼òa7 0`À€ 0`À€ 0`À€ 0`À€œëþ qýã邵7j°å&¸¢wA‡«B> ®ñîég³}¥”ÀuÞú~6ÜIK\ë­ígÓ½ÃÀõÞº~6Þ-í4x·¦ŸÍ÷‡ÓWvœà£?o ~·WE¬ÖòÖ o¶Á{ï:ëàÚ;n§7œý^àÝ£ªCðáç‘Sðò‹OMwàåWG¢oàå—‡¢"gà%ñXè|4êõzIŽòZÇg5>K'’Z.ܤøª¡å©$žËX:—ô¸îäáDÒÒél)}__yzx8Iëv>œ·GHvVOº¹ÏZ^¬–87ŸˆW_±¾Ô¢¾øe~1M}yÓúr©þ¶õqýë%úE(Ö‹ZôËŒ¬—-Ýô ÉŒ¦éäh+Ì7•Fq)`À€ 0`À€ 0`À€ 0`À€ ð0àvE(ÁMˌ쒙·.´n^ j ܾÜ×ø ݦÀï(Ù7 Îübà·|ìÆ ¸xø«‚swî¥À Xv¬²wM 0`À€< X;ÇÀ 0`À×—Ä6M;N"~¸¥–ñÓ†[.oA|¼’‡ñŠZÆ+[º W˜v+…–—ûi€ 0`À€ 0`À€7ï `À€ 0`À€{'JdÓ솇ß_Ç Oñ0àOñ8à‡x pøe4pø28ü:8|æ9üÙþ$ÒRû3öN&?}¶/¿1[ìü×ßËöÏŸ—ë~œÇøûhà<4ØÎ~ZïßF;À 0`À€ 0`ÀÁßF_l›Gw 0`À€ 0`À€ ¸öÙ 0`À€GÏo{‘gðx,ð Ø¸É 0`ÀÝÀ"2ÉàÏí®p†ED$|È¢o"2­OeÊ+"!ý„Åûc üÙ±‡È,"2=eÿ/~qûºÕσ-¾mBác~ütÞ¾n½'ÈòÝûü¶Qð£âòã ^ý|ýŸåm°Þeõî=¾m¼ÞÁ% Þ¾n»ïËúÝ{ÌXD6=üÑÉi{í>þÆ«íN7Ûw/ow陶ïãvÞ¼8ÞÛgŠŽfíKÌ$8±›ÑÍ 8.Ï„Rëï¦öošG3Nì<•‘®Ï{jǪ)}4`‘Üù‚Çç3y}g§lé£Y'w‹§ ÉqÍV%v­ýÞ8ÔªñÚÇ=œ_%ó Îy-€¥pÿnÁ%je½–À©ÎQÌ¥|DÑW/ð6àMß¿sUÆ`)ÛøúÝàoµ¯cº‡s4oH€¥<ÎofP}ÀÑf–™Λ›tWWÝë9rpÔ\çmJc’Äh÷jì[eAz€£Žd{8Ë6…%/ÓxRܵ8êJ¾‡s4$K.g÷ G]ÉFÛ¬eò®5G]ÉG5à×ÑxçQº*¯¿ŽÆ»?‡+½k°dÀ¯£ñþ‘–ÔyW`É€óÿ¡XúE·$Î,"•Ò–†fKåŽm­söÞûFö›/=©ËîÁ¡SÆ£4¸È pêhéŒ`°”î±E+õM^zmd-ó‚ìË‘¼t7°”âJ°Xyè–òø\–ýkKÁRŸëÀ¹¤e~õ°W">Õ•#àtÒ²°>Ü,åë¹ œJZ–*ú‚¥x=×9ÚÎ`)]Ï•àmÒ²\ÅÓ,ÛüK=8sÍH ,Ë7µÛÊÃü\ª§Û–׫ç—¶ÏÇš_ðdâ”û7¿b8ÃÆÁ3`?àáFé> 0`À€vþ:Q×OBÅ„µIEND®B`‚assets/js/jstree/jstree.js000064400001454172147600374260011637 0ustar00;;;/*! * globals jQuery, define, module, exports, require, window, document, postMessage */ (function (factory) { "use strict"; if (typeof define === 'function' && define.amd) { define(['jquery'], factory); } else if (typeof module !== 'undefined' && module.exports) { module.exports = factory(require('jquery')); } else { factory(jQuery); } }(function ($, undefined) { "use strict"; /*! * jsTree 3.3.7 * http://jstree.com/ * * Copyright (c) 2014 Ivan Bozhanov (http://vakata.com) * * Licensed same as jquery - under the terms of the MIT License * http://www.opensource.org/licenses/mit-license.php */ /*! * if using jslint please allow for the jQuery global and use following options: * jslint: loopfunc: true, browser: true, ass: true, bitwise: true, continue: true, nomen: true, plusplus: true, regexp: true, unparam: true, todo: true, white: true */ /*jshint -W083 */ // prevent another load? maybe there is a better way? if ($.jstree) { return; } /** * ### jsTree core functionality */ // internal variables var instance_counter = 0, ccp_node = false, ccp_mode = false, ccp_inst = false, themes_loaded = [], src = $('script:last').attr('src'), document = window.document; // local variable is always faster to access then a global /** * holds all jstree related functions and variables, including the actual class and methods to create, access and manipulate instances. * @name $.jstree */ $.jstree = { /** * specifies the jstree version in use * @name $.jstree.version */ version: '3.3.7', /** * holds all the default options used when creating new instances * @name $.jstree.defaults */ defaults: { /** * configure which plugins will be active on an instance. Should be an array of strings, where each element is a plugin name. The default is `[]` * @name $.jstree.defaults.plugins */ plugins: [] }, /** * stores all loaded jstree plugins (used internally) * @name $.jstree.plugins */ plugins: {}, path: src && src.indexOf('/') !== -1 ? src.replace(/\/[^\/]+$/, '') : '', idregex: /[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g, root: '#' }; /** * creates a jstree instance * @name $.jstree.create(el [, options]) * @param {DOMElement|jQuery|String} el the element to create the instance on, can be jQuery extended or a selector * @param {Object} options options for this instance (extends `$.jstree.defaults`) * @return {jsTree} the new instance */ $.jstree.create = function (el, options) { var tmp = new $.jstree.core(++instance_counter), opt = options; options = $.extend(true, {}, $.jstree.defaults, options); if (opt && opt.plugins) { options.plugins = opt.plugins; } $.each(options.plugins, function (i, k) { if (i !== 'core') { tmp = tmp.plugin(k, options[k]); } }); $(el).data('jstree', tmp); tmp.init(el, options); return tmp; }; /** * remove all traces of jstree from the DOM and destroy all instances * @name $.jstree.destroy() */ $.jstree.destroy = function () { $('.jstree:jstree').jstree('destroy'); $(document).off('.jstree'); }; /** * the jstree class constructor, used only internally * @private * @name $.jstree.core(id) * @param {Number} id this instance's index */ $.jstree.core = function (id) { this._id = id; this._cnt = 0; this._wrk = null; this._data = { core: { themes: { name: false, dots: false, icons: false, ellipsis: false }, selected: [], last_error: {}, working: false, worker_queue: [], focused: null } }; }; /** * get a reference to an existing instance * * __Examples__ * * // provided a container with an ID of "tree", and a nested node with an ID of "branch" * // all of there will return the same instance * $.jstree.reference('tree'); * $.jstree.reference('#tree'); * $.jstree.reference($('#tree')); * $.jstree.reference(document.getElementByID('tree')); * $.jstree.reference('branch'); * $.jstree.reference('#branch'); * $.jstree.reference($('#branch')); * $.jstree.reference(document.getElementByID('branch')); * * @name $.jstree.reference(needle) * @param {DOMElement|jQuery|String} needle * @return {jsTree|null} the instance or `null` if not found */ $.jstree.reference = function (needle) { var tmp = null, obj = null; if (needle && needle.id && (!needle.tagName || !needle.nodeType)) { needle = needle.id; } if (!obj || !obj.length) { try { obj = $(needle); } catch (ignore) { } } if (!obj || !obj.length) { try { obj = $('#' + needle.replace($.jstree.idregex, '\\$&')); } catch (ignore) { } } if (obj && obj.length && (obj = obj.closest('.jstree')).length && (obj = obj.data('jstree'))) { tmp = obj; } else { $('.jstree').each(function () { var inst = $(this).data('jstree'); if (inst && inst._model.data[needle]) { tmp = inst; return false; } }); } return tmp; }; /** * Create an instance, get an instance or invoke a command on a instance. * * If there is no instance associated with the current node a new one is created and `arg` is used to extend `$.jstree.defaults` for this new instance. There would be no return value (chaining is not broken). * * If there is an existing instance and `arg` is a string the command specified by `arg` is executed on the instance, with any additional arguments passed to the function. If the function returns a value it will be returned (chaining could break depending on function). * * If there is an existing instance and `arg` is not a string the instance itself is returned (similar to `$.jstree.reference`). * * In any other case - nothing is returned and chaining is not broken. * * __Examples__ * * $('#tree1').jstree(); // creates an instance * $('#tree2').jstree({ plugins : [] }); // create an instance with some options * $('#tree1').jstree('open_node', '#branch_1'); // call a method on an existing instance, passing additional arguments * $('#tree2').jstree(); // get an existing instance (or create an instance) * $('#tree2').jstree(true); // get an existing instance (will not create new instance) * $('#branch_1').jstree().select_node('#branch_1'); // get an instance (using a nested element and call a method) * * @name $().jstree([arg]) * @param {String|Object} arg * @return {Mixed} */ $.fn.jstree = function (arg) { // check for string argument var is_method = (typeof arg === 'string'), args = Array.prototype.slice.call(arguments, 1), result = null; if (arg === true && !this.length) { return false; } this.each(function () { // get the instance (if there is one) and method (if it exists) var instance = $.jstree.reference(this), method = is_method && instance ? instance[arg] : null; // if calling a method, and method is available - execute on the instance result = is_method && method ? method.apply(instance, args) : null; // if there is no instance and no method is being called - create one if (!instance && !is_method && (arg === undefined || $.isPlainObject(arg))) { $.jstree.create(this, arg); } // if there is an instance and no method is called - return the instance if ((instance && !is_method) || arg === true) { result = instance || false; } // if there was a method call which returned a result - break and return the value if (result !== null && result !== undefined) { return false; } }); // if there was a method call with a valid return value - return that, otherwise continue the chain return result !== null && result !== undefined ? result : this; }; /** * used to find elements containing an instance * * __Examples__ * * $('div:jstree').each(function () { * $(this).jstree('destroy'); * }); * * @name $(':jstree') * @return {jQuery} */ $.expr.pseudos.jstree = $.expr.createPseudo(function (search) { return function (a) { return $(a).hasClass('jstree') && $(a).data('jstree') !== undefined; }; }); /** * stores all defaults for the core * @name $.jstree.defaults.core */ $.jstree.defaults.core = { /** * data configuration * * If left as `false` the HTML inside the jstree container element is used to populate the tree (that should be an unordered list with list items). * * You can also pass in a HTML string or a JSON array here. * * It is possible to pass in a standard jQuery-like AJAX config and jstree will automatically determine if the response is JSON or HTML and use that to populate the tree. * In addition to the standard jQuery ajax options here you can suppy functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node is being loaded, the return value of those functions will be used. * * The last option is to specify a function, that function will receive the node being loaded as argument and a second param which is a function which should be called with the result. * * __Examples__ * * // AJAX * $('#tree').jstree({ * 'core' : { * 'data' : { * 'url' : '/get/children/', * 'data' : function (node) { * return { 'id' : node.id }; * } * } * }); * * // direct data * $('#tree').jstree({ * 'core' : { * 'data' : [ * 'Simple root node', * { * 'id' : 'node_2', * 'text' : 'Root node with options', * 'state' : { 'opened' : true, 'selected' : true }, * 'children' : [ { 'text' : 'Child 1' }, 'Child 2'] * } * ] * } * }); * * // function * $('#tree').jstree({ * 'core' : { * 'data' : function (obj, callback) { * callback.call(this, ['Root 1', 'Root 2']); * } * }); * * @name $.jstree.defaults.core.data */ data: false, /** * configure the various strings used throughout the tree * * You can use an object where the key is the string you need to replace and the value is your replacement. * Another option is to specify a function which will be called with an argument of the needed string and should return the replacement. * If left as `false` no replacement is made. * * __Examples__ * * $('#tree').jstree({ * 'core' : { * 'strings' : { * 'Loading ...' : 'Please wait ...' * } * } * }); * * @name $.jstree.defaults.core.strings */ strings: false, /** * determines what happens when a user tries to modify the structure of the tree * If left as `false` all operations like create, rename, delete, move or copy are prevented. * You can set this to `true` to allow all interactions or use a function to have better control. * * __Examples__ * * $('#tree').jstree({ * 'core' : { * 'check_callback' : function (operation, node, node_parent, node_position, more) { * // operation can be 'create_node', 'rename_node', 'delete_node', 'move_node', 'copy_node' or 'edit' * // in case of 'rename_node' node_position is filled with the new node name * return operation === 'rename_node' ? true : false; * } * } * }); * * @name $.jstree.defaults.core.check_callback */ check_callback: false, /** * a callback called with a single object parameter in the instance's scope when something goes wrong (operation prevented, ajax failed, etc) * @name $.jstree.defaults.core.error */ error: $.noop, /** * the open / close animation duration in milliseconds - set this to `false` to disable the animation (default is `200`) * @name $.jstree.defaults.core.animation */ animation: 200, /** * a boolean indicating if multiple nodes can be selected * @name $.jstree.defaults.core.multiple */ multiple: true, /** * theme configuration object * @name $.jstree.defaults.core.themes */ themes: { /** * the name of the theme to use (if left as `false` the default theme is used) * @name $.jstree.defaults.core.themes.name */ name: false, /** * the URL of the theme's CSS file, leave this as `false` if you have manually included the theme CSS (recommended). You can set this to `true` too which will try to autoload the theme. * @name $.jstree.defaults.core.themes.url */ url: false, /** * the location of all jstree themes - only used if `url` is set to `true` * @name $.jstree.defaults.core.themes.dir */ dir: false, /** * a boolean indicating if connecting dots are shown * @name $.jstree.defaults.core.themes.dots */ dots: true, /** * a boolean indicating if node icons are shown * @name $.jstree.defaults.core.themes.icons */ icons: true, /** * a boolean indicating if node ellipsis should be shown - this only works with a fixed with on the container * @name $.jstree.defaults.core.themes.ellipsis */ ellipsis: false, /** * a boolean indicating if the tree background is striped * @name $.jstree.defaults.core.themes.stripes */ stripes: false, /** * a string (or boolean `false`) specifying the theme variant to use (if the theme supports variants) * @name $.jstree.defaults.core.themes.variant */ variant: false, /** * a boolean specifying if a reponsive version of the theme should kick in on smaller screens (if the theme supports it). Defaults to `false`. * @name $.jstree.defaults.core.themes.responsive */ responsive: false }, /** * if left as `true` all parents of all selected nodes will be opened once the tree loads (so that all selected nodes are visible to the user) * @name $.jstree.defaults.core.expand_selected_onload */ expand_selected_onload: true, /** * if left as `true` web workers will be used to parse incoming JSON data where possible, so that the UI will not be blocked by large requests. Workers are however about 30% slower. Defaults to `true` * @name $.jstree.defaults.core.worker */ worker: true, /** * Force node text to plain text (and escape HTML). Defaults to `false` * @name $.jstree.defaults.core.force_text */ force_text: false, /** * Should the node be toggled if the text is double clicked. Defaults to `true` * @name $.jstree.defaults.core.dblclick_toggle */ dblclick_toggle: true, /** * Should the loaded nodes be part of the state. Defaults to `false` * @name $.jstree.defaults.core.loaded_state */ loaded_state: false, /** * Should the last active node be focused when the tree container is blurred and the focused again. This helps working with screen readers. Defaults to `true` * @name $.jstree.defaults.core.restore_focus */ restore_focus: true, /** * Default keyboard shortcuts (an object where each key is the button name or combo - like 'enter', 'ctrl-space', 'p', etc and the value is the function to execute in the instance's scope) * @name $.jstree.defaults.core.keyboard */ keyboard: { 'ctrl-space': function (e) { // aria defines space only with Ctrl e.type = "click"; $(e.currentTarget).trigger(e); }, 'enter': function (e) { // enter e.type = "click"; $(e.currentTarget).trigger(e); }, 'left': function (e) { // left e.preventDefault(); if (this.is_open(e.currentTarget)) { this.close_node(e.currentTarget); } else { var o = this.get_parent(e.currentTarget); if (o && o.id !== $.jstree.root) { this.get_node(o, true).children('.jstree-anchor').focus(); } } }, 'up': function (e) { // up e.preventDefault(); var o = this.get_prev_dom(e.currentTarget); if (o && o.length) { o.children('.jstree-anchor').focus(); } }, 'right': function (e) { // right e.preventDefault(); if (this.is_closed(e.currentTarget)) { this.open_node(e.currentTarget, function (o) { this.get_node(o, true).children('.jstree-anchor').focus(); }); } else if (this.is_open(e.currentTarget)) { var o = this.get_node(e.currentTarget, true).children('.jstree-children')[0]; if (o) { $(this._firstChild(o)).children('.jstree-anchor').focus(); } } }, 'down': function (e) { // down e.preventDefault(); var o = this.get_next_dom(e.currentTarget); if (o && o.length) { o.children('.jstree-anchor').focus(); } }, '*': function (e) { // aria defines * on numpad as open_all - not very common this.open_all(); }, 'home': function (e) { // home e.preventDefault(); var o = this._firstChild(this.get_container_ul()[0]); if (o) { $(o).children('.jstree-anchor').filter(':visible').focus(); } }, 'end': function (e) { // end e.preventDefault(); this.element.find('.jstree-anchor').filter(':visible').last().focus(); }, 'f2': function (e) { // f2 - safe to include - if check_callback is false it will fail e.preventDefault(); this.edit(e.currentTarget); } } }; $.jstree.core.prototype = { /** * used to decorate an instance with a plugin. Used internally. * @private * @name plugin(deco [, opts]) * @param {String} deco the plugin to decorate with * @param {Object} opts options for the plugin * @return {jsTree} */ plugin: function (deco, opts) { var Child = $.jstree.plugins[deco]; if (Child) { this._data[deco] = {}; Child.prototype = this; return new Child(opts, this); } return this; }, /** * initialize the instance. Used internally. * @private * @name init(el, optons) * @param {DOMElement|jQuery|String} el the element we are transforming * @param {Object} options options for this instance * @trigger init.jstree, loading.jstree, loaded.jstree, ready.jstree, changed.jstree */ init: function (el, options) { this._model = { data: {}, changed: [], force_full_redraw: false, redraw_timeout: false, default_state: { loaded: true, opened: false, selected: false, disabled: false } }; this._model.data[$.jstree.root] = { id: $.jstree.root, parent: null, parents: [], children: [], children_d: [], state: { loaded: false } }; this.element = $(el).addClass('jstree jstree-' + this._id); this.settings = options; this._data.core.ready = false; this._data.core.loaded = false; this._data.core.rtl = (this.element.css("direction") === "rtl"); this.element[this._data.core.rtl ? 'addClass' : 'removeClass']("jstree-rtl"); this.element.attr('role', 'tree'); if (this.settings.core.multiple) { this.element.attr('aria-multiselectable', true); } if (!this.element.attr('tabindex')) { this.element.attr('tabindex', '0'); } this.bind(); /** * triggered after all events are bound * @event * @name init.jstree */ this.trigger("init"); this._data.core.original_container_html = this.element.find(" > ul > li").clone(true); this._data.core.original_container_html .find("li").addBack() .contents().filter(function () { return this.nodeType === 3 && (!this.nodeValue || /^\s+$/.test(this.nodeValue)); }) .remove(); this.element.html("<" + "ul class='jstree-container-ul jstree-children' role='group'><" + "li id='j" + this._id + "_loading' class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='tree-item'><" + "a class='jstree-anchor' href='#'>" + this.get_string("Loading ...") + ""); this.element.attr('aria-activedescendant', 'j' + this._id + '_loading'); this._data.core.li_height = this.get_container_ul().children("li").first().outerHeight() || 24; this._data.core.node = this._create_prototype_node(); /** * triggered after the loading text is shown and before loading starts * @event * @name loading.jstree */ this.trigger("loading"); this.load_node($.jstree.root); }, /** * destroy an instance * @name destroy() * @param {Boolean} keep_html if not set to `true` the container will be emptied, otherwise the current DOM elements will be kept intact */ destroy: function (keep_html) { /** * triggered before the tree is destroyed * @event * @name destroy.jstree */ this.trigger("destroy"); if (this._wrk) { try { window.URL.revokeObjectURL(this._wrk); this._wrk = null; } catch (ignore) { } } if (!keep_html) { this.element.empty(); } this.teardown(); }, /** * Create a prototype node * @name _create_prototype_node() * @return {DOMElement} */ _create_prototype_node: function () { var _node = document.createElement('LI'), _temp1, _temp2; _node.setAttribute('role', 'treeitem'); _temp1 = document.createElement('I'); _temp1.className = 'jstree-icon jstree-ocl'; _temp1.setAttribute('role', 'presentation'); _node.appendChild(_temp1); _temp1 = document.createElement('A'); _temp1.className = 'jstree-anchor'; _temp1.setAttribute('href', '#'); _temp1.setAttribute('tabindex', '-1'); _temp2 = document.createElement('I'); _temp2.className = 'jstree-icon jstree-themeicon'; _temp2.setAttribute('role', 'presentation'); _temp1.appendChild(_temp2); _node.appendChild(_temp1); _temp1 = _temp2 = null; return _node; }, _kbevent_to_func: function (e) { var keys = { 8: "Backspace", 9: "Tab", 13: "Return", 19: "Pause", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "Print", 45: "Insert", 46: "Delete", 96: "Numpad0", 97: "Numpad1", 98: "Numpad2", 99: "Numpad3", 100: "Numpad4", 101: "Numpad5", 102: "Numpad6", 103: "Numpad7", 104: "Numpad8", 105: "Numpad9", '-13': "NumpadEnter", 112: "F1", 113: "F2", 114: "F3", 115: "F4", 116: "F5", 117: "F6", 118: "F7", 119: "F8", 120: "F9", 121: "F10", 122: "F11", 123: "F12", 144: "Numlock", 145: "Scrolllock", 16: 'Shift', 17: 'Ctrl', 18: 'Alt', 48: '0', 49: '1', 50: '2', 51: '3', 52: '4', 53: '5', 54: '6', 55: '7', 56: '8', 57: '9', 59: ';', 61: '=', 65: 'a', 66: 'b', 67: 'c', 68: 'd', 69: 'e', 70: 'f', 71: 'g', 72: 'h', 73: 'i', 74: 'j', 75: 'k', 76: 'l', 77: 'm', 78: 'n', 79: 'o', 80: 'p', 81: 'q', 82: 'r', 83: 's', 84: 't', 85: 'u', 86: 'v', 87: 'w', 88: 'x', 89: 'y', 90: 'z', 107: '+', 109: '-', 110: '.', 186: ';', 187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\', 221: ']', 222: "'", 111: '/', 106: '*', 173: '-' }; var parts = []; if (e.ctrlKey) { parts.push('ctrl'); } if (e.altKey) { parts.push('alt'); } if (e.shiftKey) { parts.push('shift'); } parts.push(keys[e.which] || e.which); parts = parts.sort().join('-').toLowerCase(); var kb = this.settings.core.keyboard, i, tmp; for (i in kb) { if (kb.hasOwnProperty(i)) { tmp = i; if (tmp !== '-' && tmp !== '+') { tmp = tmp.replace('--', '-MINUS').replace('+-', '-MINUS').replace('++', '-PLUS').replace('-+', '-PLUS'); tmp = tmp.split(/-|\+/).sort().join('-').replace('MINUS', '-').replace('PLUS', '+').toLowerCase(); } if (tmp === parts) { return kb[i]; } } } return null; }, /** * part of the destroying of an instance. Used internally. * @private * @name teardown() */ teardown: function () { this.unbind(); this.element .removeClass('jstree') .removeData('jstree') .find("[class^='jstree']") .addBack() .attr("class", function () { return this.className.replace(/jstree[^ ]*|$/ig, ''); }); this.element = null; }, /** * bind all events. Used internally. * @private * @name bind() */ bind: function () { var word = '', tout = null, was_click = 0; this.element .on("dblclick.jstree", function (e) { if (e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if (document.selection && document.selection.empty) { document.selection.empty(); } else { if (window.getSelection) { var sel = window.getSelection(); try { sel.removeAllRanges(); sel.collapse(); } catch (ignore) { } } } }) .on("mousedown.jstree", $.proxy(function (e) { if (e.target === this.element[0]) { e.preventDefault(); // prevent losing focus when clicking scroll arrows (FF, Chrome) was_click = +(new Date()); // ie does not allow to prevent losing focus } }, this)) .on("mousedown.jstree", ".jstree-ocl", function (e) { e.preventDefault(); // prevent any node inside from losing focus when clicking the open/close icon }) .on("click.jstree", ".jstree-ocl", $.proxy(function (e) { this.toggle_node(e.target); }, this)) .on("dblclick.jstree", ".jstree-anchor", $.proxy(function (e) { if (e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if (this.settings.core.dblclick_toggle) { this.toggle_node(e.target); } }, this)) .on("click.jstree", ".jstree-anchor", $.proxy(function (e) { e.preventDefault(); if (e.currentTarget !== document.activeElement) { $(e.currentTarget).focus(); } this.activate_node(e.currentTarget, e); }, this)) .on('keydown.jstree', '.jstree-anchor', $.proxy(function (e) { if (e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if (this._data.core.rtl) { if (e.which === 37) { e.which = 39; } else if (e.which === 39) { e.which = 37; } } var f = this._kbevent_to_func(e); if (f) { var r = f.call(this, e); if (r === false || r === true) { return r; } } }, this)) .on("load_node.jstree", $.proxy(function (e, data) { if (data.status) { if (data.node.id === $.jstree.root && !this._data.core.loaded) { this._data.core.loaded = true; if (this._firstChild(this.get_container_ul()[0])) { this.element.attr('aria-activedescendant', this._firstChild(this.get_container_ul()[0]).id); } /** * triggered after the root node is loaded for the first time * @event * @name loaded.jstree */ this.trigger("loaded"); } if (!this._data.core.ready) { setTimeout($.proxy(function () { if (this.element && !this.get_container_ul().find('.jstree-loading').length) { this._data.core.ready = true; if (this._data.core.selected.length) { if (this.settings.core.expand_selected_onload) { var tmp = [], i, j; for (i = 0, j = this._data.core.selected.length; i < j; i++) { tmp = tmp.concat(this._model.data[this._data.core.selected[i]].parents); } tmp = $.vakata.array_unique(tmp); for (i = 0, j = tmp.length; i < j; i++) { this.open_node(tmp[i], false, 0); } } this.trigger('changed', { 'action': 'ready', 'selected': this._data.core.selected }); } /** * triggered after all nodes are finished loading * @event * @name ready.jstree */ this.trigger("ready"); } }, this), 0); } } }, this)) // quick searching when the tree is focused .on('keypress.jstree', $.proxy(function (e) { if (e.target.tagName && e.target.tagName.toLowerCase() === "input") { return true; } if (tout) { clearTimeout(tout); } tout = setTimeout(function () { word = ''; }, 500); var chr = String.fromCharCode(e.which).toLowerCase(), col = this.element.find('.jstree-anchor').filter(':visible'), ind = col.index(document.activeElement) || 0, end = false; word += chr; // match for whole word from current node down (including the current node) if (word.length > 1) { col.slice(ind).each($.proxy(function (i, v) { if ($(v).text().toLowerCase().indexOf(word) === 0) { $(v).focus(); end = true; return false; } }, this)); if (end) { return; } // match for whole word from the beginning of the tree col.slice(0, ind).each($.proxy(function (i, v) { if ($(v).text().toLowerCase().indexOf(word) === 0) { $(v).focus(); end = true; return false; } }, this)); if (end) { return; } } // list nodes that start with that letter (only if word consists of a single char) if (new RegExp('^' + chr.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '+$').test(word)) { // search for the next node starting with that letter col.slice(ind + 1).each($.proxy(function (i, v) { if ($(v).text().toLowerCase().charAt(0) === chr) { $(v).focus(); end = true; return false; } }, this)); if (end) { return; } // search from the beginning col.slice(0, ind + 1).each($.proxy(function (i, v) { if ($(v).text().toLowerCase().charAt(0) === chr) { $(v).focus(); end = true; return false; } }, this)); if (end) { return; } } }, this)) // THEME RELATED .on("init.jstree", $.proxy(function () { var s = this.settings.core.themes; this._data.core.themes.dots = s.dots; this._data.core.themes.stripes = s.stripes; this._data.core.themes.icons = s.icons; this._data.core.themes.ellipsis = s.ellipsis; this.set_theme(s.name || "default", s.url); this.set_theme_variant(s.variant); }, this)) .on("loading.jstree", $.proxy(function () { this[this._data.core.themes.dots ? "show_dots" : "hide_dots"](); this[this._data.core.themes.icons ? "show_icons" : "hide_icons"](); this[this._data.core.themes.stripes ? "show_stripes" : "hide_stripes"](); this[this._data.core.themes.ellipsis ? "show_ellipsis" : "hide_ellipsis"](); }, this)) .on('blur.jstree', '.jstree-anchor', $.proxy(function (e) { this._data.core.focused = null; $(e.currentTarget).filter('.jstree-hovered').mouseleave(); this.element.attr('tabindex', '0'); }, this)) .on('focus.jstree', '.jstree-anchor', $.proxy(function (e) { var tmp = this.get_node(e.currentTarget); if (tmp && tmp.id) { this._data.core.focused = tmp.id; } this.element.find('.jstree-hovered').not(e.currentTarget).mouseleave(); $(e.currentTarget).mouseenter(); this.element.attr('tabindex', '-1'); }, this)) .on('focus.jstree', $.proxy(function () { if (+(new Date()) - was_click > 500 && !this._data.core.focused && this.settings.core.restore_focus) { was_click = 0; var act = this.get_node(this.element.attr('aria-activedescendant'), true); if (act) { act.find('> .jstree-anchor').focus(); } } }, this)) .on('mouseenter.jstree', '.jstree-anchor', $.proxy(function (e) { this.hover_node(e.currentTarget); }, this)) .on('mouseleave.jstree', '.jstree-anchor', $.proxy(function (e) { this.dehover_node(e.currentTarget); }, this)); }, /** * part of the destroying of an instance. Used internally. * @private * @name unbind() */ unbind: function () { this.element.off('.jstree'); $(document).off('.jstree-' + this._id); }, /** * trigger an event. Used internally. * @private * @name trigger(ev [, data]) * @param {String} ev the name of the event to trigger * @param {Object} data additional data to pass with the event */ trigger: function (ev, data) { if (!data) { data = {}; } data.instance = this; this.element.triggerHandler(ev.replace('.jstree', '') + '.jstree', data); }, /** * returns the jQuery extended instance container * @name get_container() * @return {jQuery} */ get_container: function () { return this.element; }, /** * returns the jQuery extended main UL node inside the instance container. Used internally. * @private * @name get_container_ul() * @return {jQuery} */ get_container_ul: function () { return this.element.children(".jstree-children").first(); }, /** * gets string replacements (localization). Used internally. * @private * @name get_string(key) * @param {String} key * @return {String} */ get_string: function (key) { var a = this.settings.core.strings; if ($.isFunction(a)) { return a.call(this, key); } if (a && a[key]) { return a[key]; } return key; }, /** * gets the first child of a DOM node. Used internally. * @private * @name _firstChild(dom) * @param {DOMElement} dom * @return {DOMElement} */ _firstChild: function (dom) { dom = dom ? dom.firstChild : null; while (dom !== null && dom.nodeType !== 1) { dom = dom.nextSibling; } return dom; }, /** * gets the next sibling of a DOM node. Used internally. * @private * @name _nextSibling(dom) * @param {DOMElement} dom * @return {DOMElement} */ _nextSibling: function (dom) { dom = dom ? dom.nextSibling : null; while (dom !== null && dom.nodeType !== 1) { dom = dom.nextSibling; } return dom; }, /** * gets the previous sibling of a DOM node. Used internally. * @private * @name _previousSibling(dom) * @param {DOMElement} dom * @return {DOMElement} */ _previousSibling: function (dom) { dom = dom ? dom.previousSibling : null; while (dom !== null && dom.nodeType !== 1) { dom = dom.previousSibling; } return dom; }, /** * get the JSON representation of a node (or the actual jQuery extended DOM node) by using any input (child DOM element, ID string, selector, etc) * @name get_node(obj [, as_dom]) * @param {mixed} obj * @param {Boolean} as_dom * @return {Object|jQuery} */ get_node: function (obj, as_dom) { if (obj && obj.id) { obj = obj.id; } if (obj instanceof jQuery && obj.length && obj[0].id) { obj = obj[0].id; } var dom; try { if (this._model.data[obj]) { obj = this._model.data[obj]; } else if (typeof obj === "string" && this._model.data[obj.replace(/^#/, '')]) { obj = this._model.data[obj.replace(/^#/, '')]; } else if (typeof obj === "string" && (dom = $('#' + obj.replace($.jstree.idregex, '\\$&'), this.element)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { obj = this._model.data[dom.closest('.jstree-node').attr('id')]; } else if ((dom = this.element.find(obj)).length && this._model.data[dom.closest('.jstree-node').attr('id')]) { obj = this._model.data[dom.closest('.jstree-node').attr('id')]; } else if ((dom = this.element.find(obj)).length && dom.hasClass('jstree')) { obj = this._model.data[$.jstree.root]; } else { return false; } if (as_dom) { obj = obj.id === $.jstree.root ? this.element : $('#' + obj.id.replace($.jstree.idregex, '\\$&'), this.element); } return obj; } catch (ex) { return false; } }, /** * get the path to a node, either consisting of node texts, or of node IDs, optionally glued together (otherwise an array) * @name get_path(obj [, glue, ids]) * @param {mixed} obj the node * @param {String} glue if you want the path as a string - pass the glue here (for example '/'), if a falsy value is supplied here, an array is returned * @param {Boolean} ids if set to true build the path using ID, otherwise node text is used * @return {mixed} */ get_path: function (obj, glue, ids) { obj = obj.parents ? obj : this.get_node(obj); if (!obj || obj.id === $.jstree.root || !obj.parents) { return false; } var i, j, p = []; p.push(ids ? obj.id : obj.text); for (i = 0, j = obj.parents.length; i < j; i++) { p.push(ids ? obj.parents[i] : this.get_text(obj.parents[i])); } p = p.reverse().slice(1); return glue ? p.join(glue) : p; }, /** * get the next visible node that is below the `obj` node. If `strict` is set to `true` only sibling nodes are returned. * @name get_next_dom(obj [, strict]) * @param {mixed} obj * @param {Boolean} strict * @return {jQuery} */ get_next_dom: function (obj, strict) { var tmp; obj = this.get_node(obj, true); if (obj[0] === this.element[0]) { tmp = this._firstChild(this.get_container_ul()[0]); while (tmp && tmp.offsetHeight === 0) { tmp = this._nextSibling(tmp); } return tmp ? $(tmp) : false; } if (!obj || !obj.length) { return false; } if (strict) { tmp = obj[0]; do { tmp = this._nextSibling(tmp); } while (tmp && tmp.offsetHeight === 0); return tmp ? $(tmp) : false; } if (obj.hasClass("jstree-open")) { tmp = this._firstChild(obj.children('.jstree-children')[0]); while (tmp && tmp.offsetHeight === 0) { tmp = this._nextSibling(tmp); } if (tmp !== null) { return $(tmp); } } tmp = obj[0]; do { tmp = this._nextSibling(tmp); } while (tmp && tmp.offsetHeight === 0); if (tmp !== null) { return $(tmp); } return obj.parentsUntil(".jstree", ".jstree-node").nextAll(".jstree-node:visible").first(); }, /** * get the previous visible node that is above the `obj` node. If `strict` is set to `true` only sibling nodes are returned. * @name get_prev_dom(obj [, strict]) * @param {mixed} obj * @param {Boolean} strict * @return {jQuery} */ get_prev_dom: function (obj, strict) { var tmp; obj = this.get_node(obj, true); if (obj[0] === this.element[0]) { tmp = this.get_container_ul()[0].lastChild; while (tmp && tmp.offsetHeight === 0) { tmp = this._previousSibling(tmp); } return tmp ? $(tmp) : false; } if (!obj || !obj.length) { return false; } if (strict) { tmp = obj[0]; do { tmp = this._previousSibling(tmp); } while (tmp && tmp.offsetHeight === 0); return tmp ? $(tmp) : false; } tmp = obj[0]; do { tmp = this._previousSibling(tmp); } while (tmp && tmp.offsetHeight === 0); if (tmp !== null) { obj = $(tmp); while (obj.hasClass("jstree-open")) { obj = obj.children(".jstree-children").first().children(".jstree-node:visible:last"); } return obj; } tmp = obj[0].parentNode.parentNode; return tmp && tmp.className && tmp.className.indexOf('jstree-node') !== -1 ? $(tmp) : false; }, /** * get the parent ID of a node * @name get_parent(obj) * @param {mixed} obj * @return {String} */ get_parent: function (obj) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } return obj.parent; }, /** * get a jQuery collection of all the children of a node (node must be rendered), returns false on error * @name get_children_dom(obj) * @param {mixed} obj * @return {jQuery} */ get_children_dom: function (obj) { obj = this.get_node(obj, true); if (obj[0] === this.element[0]) { return this.get_container_ul().children(".jstree-node"); } if (!obj || !obj.length) { return false; } return obj.children(".jstree-children").children(".jstree-node"); }, /** * checks if a node has children * @name is_parent(obj) * @param {mixed} obj * @return {Boolean} */ is_parent: function (obj) { obj = this.get_node(obj); return obj && (obj.state.loaded === false || obj.children.length > 0); }, /** * checks if a node is loaded (its children are available) * @name is_loaded(obj) * @param {mixed} obj * @return {Boolean} */ is_loaded: function (obj) { obj = this.get_node(obj); return obj && obj.state.loaded; }, /** * check if a node is currently loading (fetching children) * @name is_loading(obj) * @param {mixed} obj * @return {Boolean} */ is_loading: function (obj) { obj = this.get_node(obj); return obj && obj.state && obj.state.loading; }, /** * check if a node is opened * @name is_open(obj) * @param {mixed} obj * @return {Boolean} */ is_open: function (obj) { obj = this.get_node(obj); return obj && obj.state.opened; }, /** * check if a node is in a closed state * @name is_closed(obj) * @param {mixed} obj * @return {Boolean} */ is_closed: function (obj) { obj = this.get_node(obj); return obj && this.is_parent(obj) && !obj.state.opened; }, /** * check if a node has no children * @name is_leaf(obj) * @param {mixed} obj * @return {Boolean} */ is_leaf: function (obj) { return !this.is_parent(obj); }, /** * loads a node (fetches its children using the `core.data` setting). Multiple nodes can be passed to by using an array. * @name load_node(obj [, callback]) * @param {mixed} obj * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives two arguments - the node and a boolean status * @return {Boolean} * @trigger load_node.jstree */ load_node: function (obj, callback) { var k, l, i, j, c; if ($.isArray(obj)) { this._load_nodes(obj.slice(), callback); return true; } obj = this.get_node(obj); if (!obj) { if (callback) { callback.call(this, obj, false); } return false; } // if(obj.state.loading) { } // the node is already loading - just wait for it to load and invoke callback? but if called implicitly it should be loaded again? if (obj.state.loaded) { obj.state.loaded = false; for (i = 0, j = obj.parents.length; i < j; i++) { this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { return $.inArray(v, obj.children_d) === -1; }); } for (k = 0, l = obj.children_d.length; k < l; k++) { if (this._model.data[obj.children_d[k]].state.selected) { c = true; } delete this._model.data[obj.children_d[k]]; } if (c) { this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { return $.inArray(v, obj.children_d) === -1; }); } obj.children = []; obj.children_d = []; if (c) { this.trigger('changed', { 'action': 'load_node', 'node': obj, 'selected': this._data.core.selected }); } } obj.state.failed = false; obj.state.loading = true; this.get_node(obj, true).addClass("jstree-loading").attr('aria-busy', true); this._load_node(obj, $.proxy(function (status) { obj = this._model.data[obj.id]; obj.state.loading = false; obj.state.loaded = status; obj.state.failed = !obj.state.loaded; var dom = this.get_node(obj, true), i = 0, j = 0, m = this._model.data, has_children = false; for (i = 0, j = obj.children.length; i < j; i++) { if (m[obj.children[i]] && !m[obj.children[i]].state.hidden) { has_children = true; break; } } if (obj.state.loaded && dom && dom.length) { dom.removeClass('jstree-closed jstree-open jstree-leaf'); if (!has_children) { dom.addClass('jstree-leaf'); } else { if (obj.id !== '#') { dom.addClass(obj.state.opened ? 'jstree-open' : 'jstree-closed'); } } } dom.removeClass("jstree-loading").attr('aria-busy', false); /** * triggered after a node is loaded * @event * @name load_node.jstree * @param {Object} node the node that was loading * @param {Boolean} status was the node loaded successfully */ this.trigger('load_node', { "node": obj, "status": status }); if (callback) { callback.call(this, obj, status); } }, this)); return true; }, /** * load an array of nodes (will also load unavailable nodes as soon as they appear in the structure). Used internally. * @private * @name _load_nodes(nodes [, callback]) * @param {array} nodes * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - the array passed to _load_nodes */ _load_nodes: function (nodes, callback, is_callback, force_reload) { var r = true, c = function () { this._load_nodes(nodes, callback, true); }, m = this._model.data, i, j, tmp = []; for (i = 0, j = nodes.length; i < j; i++) { if (m[nodes[i]] && ((!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || (!is_callback && force_reload))) { if (!this.is_loading(nodes[i])) { this.load_node(nodes[i], c); } r = false; } } if (r) { for (i = 0, j = nodes.length; i < j; i++) { if (m[nodes[i]] && m[nodes[i]].state.loaded) { tmp.push(nodes[i]); } } if (callback && !callback.done) { callback.call(this, tmp); callback.done = true; } } }, /** * loads all unloaded nodes * @name load_all([obj, callback]) * @param {mixed} obj the node to load recursively, omit to load all nodes in the tree * @param {function} callback a function to be executed once loading all the nodes is complete, * @trigger load_all.jstree */ load_all: function (obj, callback) { if (!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if (!obj) { return false; } var to_load = [], m = this._model.data, c = m[obj.id].children_d, i, j; if (obj.state && !obj.state.loaded) { to_load.push(obj.id); } for (i = 0, j = c.length; i < j; i++) { if (m[c[i]] && m[c[i]].state && !m[c[i]].state.loaded) { to_load.push(c[i]); } } if (to_load.length) { this._load_nodes(to_load, function () { this.load_all(obj, callback); }); } else { /** * triggered after a load_all call completes * @event * @name load_all.jstree * @param {Object} node the recursively loaded node */ if (callback) { callback.call(this, obj); } this.trigger('load_all', { "node": obj }); } }, /** * handles the actual loading of a node. Used only internally. * @private * @name _load_node(obj [, callback]) * @param {mixed} obj * @param {function} callback a function to be executed once loading is complete, the function is executed in the instance's scope and receives one argument - a boolean status * @return {Boolean} */ _load_node: function (obj, callback) { var s = this.settings.core.data, t; var notTextOrCommentNode = function notTextOrCommentNode() { return this.nodeType !== 3 && this.nodeType !== 8; }; // use original HTML if (!s) { if (obj.id === $.jstree.root) { return this._append_html_data(obj, this._data.core.original_container_html.clone(true), function (status) { callback.call(this, status); }); } else { return callback.call(this, false); } // return callback.call(this, obj.id === $.jstree.root ? this._append_html_data(obj, this._data.core.original_container_html.clone(true)) : false); } if ($.isFunction(s)) { return s.call(this, obj, $.proxy(function (d) { if (d === false) { callback.call(this, false); } else { this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $($.parseHTML(d)).filter(notTextOrCommentNode) : d, function (status) { callback.call(this, status); }); } // return d === false ? callback.call(this, false) : callback.call(this, this[typeof d === 'string' ? '_append_html_data' : '_append_json_data'](obj, typeof d === 'string' ? $(d) : d)); }, this)); } if (typeof s === 'object') { if (s.url) { s = $.extend(true, {}, s); if ($.isFunction(s.url)) { s.url = s.url.call(this, obj); } if ($.isFunction(s.data)) { s.data = s.data.call(this, obj); } return $.ajax(s) .done($.proxy(function (d, t, x) { var type = x.getResponseHeader('Content-Type'); if ((type && type.indexOf('json') !== -1) || typeof d === "object") { return this._append_json_data(obj, d, function (status) { callback.call(this, status); }); //return callback.call(this, this._append_json_data(obj, d)); } if ((type && type.indexOf('html') !== -1) || typeof d === "string") { return this._append_html_data(obj, $($.parseHTML(d)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); }); // return callback.call(this, this._append_html_data(obj, $(d))); } this._data.core.last_error = { 'error': 'ajax', 'plugin': 'core', 'id': 'core_04', 'reason': 'Could not load node', 'data': JSON.stringify({ 'id': obj.id, 'xhr': x }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); }, this)) .fail($.proxy(function (f) { this._data.core.last_error = { 'error': 'ajax', 'plugin': 'core', 'id': 'core_04', 'reason': 'Could not load node', 'data': JSON.stringify({ 'id': obj.id, 'xhr': f }) }; callback.call(this, false); this.settings.core.error.call(this, this._data.core.last_error); }, this)); } if ($.isArray(s)) { t = $.extend(true, [], s); } else if ($.isPlainObject(s)) { t = $.extend(true, {}, s); } else { t = s; } if (obj.id === $.jstree.root) { return this._append_json_data(obj, t, function (status) { callback.call(this, status); }); } else { this._data.core.last_error = { 'error': 'nodata', 'plugin': 'core', 'id': 'core_05', 'reason': 'Could not load node', 'data': JSON.stringify({ 'id': obj.id }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); } //return callback.call(this, (obj.id === $.jstree.root ? this._append_json_data(obj, t) : false) ); } if (typeof s === 'string') { if (obj.id === $.jstree.root) { return this._append_html_data(obj, $($.parseHTML(s)).filter(notTextOrCommentNode), function (status) { callback.call(this, status); }); } else { this._data.core.last_error = { 'error': 'nodata', 'plugin': 'core', 'id': 'core_06', 'reason': 'Could not load node', 'data': JSON.stringify({ 'id': obj.id }) }; this.settings.core.error.call(this, this._data.core.last_error); return callback.call(this, false); } //return callback.call(this, (obj.id === $.jstree.root ? this._append_html_data(obj, $(s)) : false) ); } return callback.call(this, false); }, /** * adds a node to the list of nodes to redraw. Used only internally. * @private * @name _node_changed(obj [, callback]) * @param {mixed} obj */ _node_changed: function (obj) { obj = this.get_node(obj); if (obj && $.inArray(obj.id, this._model.changed) === -1) { this._model.changed.push(obj.id); } }, /** * appends HTML content to the tree. Used internally. * @private * @name _append_html_data(obj, data) * @param {mixed} obj the node to append to * @param {String} data the HTML string to parse and append * @trigger model.jstree, changed.jstree */ _append_html_data: function (dom, data, cb) { dom = this.get_node(dom); dom.children = []; dom.children_d = []; var dat = data.is('ul') ? data.children() : data, par = dom.id, chd = [], dpc = [], m = this._model.data, p = m[par], s = this._data.core.selected.length, tmp, i, j; dat.each($.proxy(function (i, v) { tmp = this._parse_model_from_html($(v), par, p.parents.concat()); if (tmp) { chd.push(tmp); dpc.push(tmp); if (m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } }, this)); p.children = chd; p.children_d = dpc; for (i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } /** * triggered when new data is inserted to the tree model * @event * @name model.jstree * @param {Array} nodes an array of node IDs * @param {String} parent the parent ID of the nodes */ this.trigger('model', { "nodes": dpc, 'parent': par }); if (par !== $.jstree.root) { this._node_changed(par); this.redraw(); } else { this.get_container_ul().children('.jstree-initial-node').remove(); this.redraw(true); } if (this._data.core.selected.length !== s) { this.trigger('changed', { 'action': 'model', 'selected': this._data.core.selected }); } cb.call(this, true); }, /** * appends JSON content to the tree. Used internally. * @private * @name _append_json_data(obj, data) * @param {mixed} obj the node to append to * @param {String} data the JSON object to parse and append * @param {Boolean} force_processing internal param - do not set * @trigger model.jstree, changed.jstree */ _append_json_data: function (dom, data, cb, force_processing) { if (this.element === null) { return; } dom = this.get_node(dom); dom.children = []; dom.children_d = []; // *%$@!!! if (data.d) { data = data.d; if (typeof data === "string") { data = JSON.parse(data); } } if (!$.isArray(data)) { data = [data]; } var w = null, args = { 'df': this._model.default_state, 'dat': data, 'par': dom.id, 'm': this._model.data, 't_id': this._id, 't_cnt': this._cnt, 'sel': this._data.core.selected }, func = function (data, undefined) { if (data.data) { data = data.data; } var dat = data.dat, par = data.par, chd = [], dpc = [], add = [], df = data.df, t_id = data.t_id, t_cnt = data.t_cnt, m = data.m, p = m[par], sel = data.sel, tmp, i, j, rslt, parse_flat = function (d, p, ps) { if (!ps) { ps = []; } else { ps = ps.concat(); } if (p) { ps.unshift(p); } var tid = d.id.toString(), i, j, c, e, tmp = { id: tid, text: d.text || '', icon: d.icon !== undefined ? d.icon : true, parent: p, parents: ps, children: d.children || [], children_d: d.children_d || [], data: d.data, state: {}, li_attr: { id: false }, a_attr: { href: '#' }, original: false }; for (i in df) { if (df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if (d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if (tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if (d && d.data) { tmp.data = d.data; if (d.data.jstree) { for (i in d.data.jstree) { if (d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if (d && typeof d.state === 'object') { for (i in d.state) { if (d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if (d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if (d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if (!tmp.li_attr.id) { tmp.li_attr.id = tid; } if (d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if (d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if (d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } m[tmp.id] = tmp; for (i = 0, j = tmp.children.length; i < j; i++) { c = parse_flat(m[tmp.children[i]], tmp.id, ps); e = m[c]; tmp.children_d.push(c); if (e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } delete d.data; delete d.children; m[tmp.id].original = d; if (tmp.state.selected) { add.push(tmp.id); } return tmp.id; }, parse_nest = function (d, p, ps) { if (!ps) { ps = []; } else { ps = ps.concat(); } if (p) { ps.unshift(p); } var tid = false, i, j, c, e, tmp; do { tid = 'j' + t_id + '_' + (++t_cnt); } while (m[tid]); tmp = { id: false, text: typeof d === 'string' ? d : '', icon: typeof d === 'object' && d.icon !== undefined ? d.icon : true, parent: p, parents: ps, children: [], children_d: [], data: null, state: {}, li_attr: { id: false }, a_attr: { href: '#' }, original: false }; for (i in df) { if (df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if (d && d.id) { tmp.id = d.id.toString(); } if (d && d.text) { tmp.text = d.text; } if (d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if (tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if (d && d.data) { tmp.data = d.data; if (d.data.jstree) { for (i in d.data.jstree) { if (d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if (d && typeof d.state === 'object') { for (i in d.state) { if (d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if (d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if (d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if (tmp.li_attr.id && !tmp.id) { tmp.id = tmp.li_attr.id.toString(); } if (!tmp.id) { tmp.id = tid; } if (!tmp.li_attr.id) { tmp.li_attr.id = tmp.id; } if (d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if (d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if (d && d.children && d.children.length) { for (i = 0, j = d.children.length; i < j; i++) { c = parse_nest(d.children[i], tmp.id, ps); e = m[c]; tmp.children.push(c); if (e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } tmp.children_d = tmp.children_d.concat(tmp.children); } if (d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } delete d.data; delete d.children; tmp.original = d; m[tmp.id] = tmp; if (tmp.state.selected) { add.push(tmp.id); } return tmp.id; }; if (dat.length && dat[0].id !== undefined && dat[0].parent !== undefined) { // Flat JSON support (for easy import from DB): // 1) convert to object (foreach) for (i = 0, j = dat.length; i < j; i++) { if (!dat[i].children) { dat[i].children = []; } if (!dat[i].state) { dat[i].state = {}; } m[dat[i].id.toString()] = dat[i]; } // 2) populate children (foreach) for (i = 0, j = dat.length; i < j; i++) { if (!m[dat[i].parent.toString()]) { this._data.core.last_error = { 'error': 'parse', 'plugin': 'core', 'id': 'core_07', 'reason': 'Node with invalid parent', 'data': JSON.stringify({ 'id': dat[i].id.toString(), 'parent': dat[i].parent.toString() }) }; this.settings.core.error.call(this, this._data.core.last_error); continue; } m[dat[i].parent.toString()].children.push(dat[i].id.toString()); // populate parent.children_d p.children_d.push(dat[i].id.toString()); } // 3) normalize && populate parents and children_d with recursion for (i = 0, j = p.children.length; i < j; i++) { tmp = parse_flat(m[p.children[i]], par, p.parents.concat()); dpc.push(tmp); if (m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } for (i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } // ?) three_state selection - p.state.selected && t - (if three_state foreach(dat => ch) -> foreach(parents) if(parent.selected) child.selected = true; rslt = { 'cnt': t_cnt, 'mod': m, 'sel': sel, 'par': par, 'dpc': dpc, 'add': add }; } else { for (i = 0, j = dat.length; i < j; i++) { tmp = parse_nest(dat[i], par, p.parents.concat()); if (tmp) { chd.push(tmp); dpc.push(tmp); if (m[tmp].children_d.length) { dpc = dpc.concat(m[tmp].children_d); } } } p.children = chd; p.children_d = dpc; for (i = 0, j = p.parents.length; i < j; i++) { m[p.parents[i]].children_d = m[p.parents[i]].children_d.concat(dpc); } rslt = { 'cnt': t_cnt, 'mod': m, 'sel': sel, 'par': par, 'dpc': dpc, 'add': add }; } if (typeof window === 'undefined' || typeof window.document === 'undefined') { postMessage(rslt); } else { return rslt; } }, rslt = function (rslt, worker) { if (this.element === null) { return; } this._cnt = rslt.cnt; var i, m = this._model.data; for (i in m) { if (m.hasOwnProperty(i) && m[i].state && m[i].state.loading && rslt.mod[i]) { rslt.mod[i].state.loading = true; } } this._model.data = rslt.mod; // breaks the reference in load_node - careful if (worker) { var j, a = rslt.add, r = rslt.sel, s = this._data.core.selected.slice(); m = this._model.data; // if selection was changed while calculating in worker if (r.length !== s.length || $.vakata.array_unique(r.concat(s)).length !== r.length) { // deselect nodes that are no longer selected for (i = 0, j = r.length; i < j; i++) { if ($.inArray(r[i], a) === -1 && $.inArray(r[i], s) === -1) { m[r[i]].state.selected = false; } } // select nodes that were selected in the mean time for (i = 0, j = s.length; i < j; i++) { if ($.inArray(s[i], r) === -1) { m[s[i]].state.selected = true; } } } } if (rslt.add.length) { this._data.core.selected = this._data.core.selected.concat(rslt.add); } this.trigger('model', { "nodes": rslt.dpc, 'parent': rslt.par }); if (rslt.par !== $.jstree.root) { this._node_changed(rslt.par); this.redraw(); } else { // this.get_container_ul().children('.jstree-initial-node').remove(); this.redraw(true); } if (rslt.add.length) { this.trigger('changed', { 'action': 'model', 'selected': this._data.core.selected }); } cb.call(this, true); }; if (this.settings.core.worker && window.Blob && window.URL && window.Worker) { try { if (this._wrk === null) { this._wrk = window.URL.createObjectURL( new window.Blob( ['self.onmessage = ' + func.toString()], { type: "text/javascript" } ) ); } if (!this._data.core.working || force_processing) { this._data.core.working = true; w = new window.Worker(this._wrk); w.onmessage = $.proxy(function (e) { rslt.call(this, e.data, true); try { w.terminate(); w = null; } catch (ignore) { } if (this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } }, this); if (!args.par) { if (this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } } else { w.postMessage(args); } } else { this._data.core.worker_queue.push([dom, data, cb, true]); } } catch (e) { rslt.call(this, func(args), false); if (this._data.core.worker_queue.length) { this._append_json_data.apply(this, this._data.core.worker_queue.shift()); } else { this._data.core.working = false; } } } else { rslt.call(this, func(args), false); } }, /** * parses a node from a jQuery object and appends them to the in memory tree model. Used internally. * @private * @name _parse_model_from_html(d [, p, ps]) * @param {jQuery} d the jQuery object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_html: function (d, p, ps) { if (!ps) { ps = []; } else { ps = [].concat(ps); } if (p) { ps.unshift(p); } var c, e, m = this._model.data, data = { id: false, text: false, icon: true, parent: p, parents: ps, children: [], children_d: [], data: null, state: {}, li_attr: { id: false }, a_attr: { href: '#' }, original: false }, i, tmp, tid; for (i in this._model.default_state) { if (this._model.default_state.hasOwnProperty(i)) { data.state[i] = this._model.default_state[i]; } } tmp = $.vakata.attributes(d, true); $.each(tmp, function (i, v) { v = $.trim(v); if (!v.length) { return true; } data.li_attr[i] = v; if (i === 'id') { data.id = v.toString(); } }); tmp = d.children('a').first(); if (tmp.length) { tmp = $.vakata.attributes(tmp, true); $.each(tmp, function (i, v) { v = $.trim(v); if (v.length) { data.a_attr[i] = v; } }); } tmp = d.children("a").first().length ? d.children("a").first().clone() : d.clone(); tmp.children("ins, i, ul").remove(); tmp = tmp.html(); tmp = $('
').html(tmp); data.text = this.settings.core.force_text ? tmp.text() : tmp.html(); tmp = d.data(); data.data = tmp ? $.extend(true, {}, tmp) : null; data.state.opened = d.hasClass('jstree-open'); data.state.selected = d.children('a').hasClass('jstree-clicked'); data.state.disabled = d.children('a').hasClass('jstree-disabled'); if (data.data && data.data.jstree) { for (i in data.data.jstree) { if (data.data.jstree.hasOwnProperty(i)) { data.state[i] = data.data.jstree[i]; } } } tmp = d.children("a").children(".jstree-themeicon"); if (tmp.length) { data.icon = tmp.hasClass('jstree-themeicon-hidden') ? false : tmp.attr('rel'); } if (data.state.icon !== undefined) { data.icon = data.state.icon; } if (data.icon === undefined || data.icon === null || data.icon === "") { data.icon = true; } tmp = d.children("ul").children("li"); do { tid = 'j' + this._id + '_' + (++this._cnt); } while (m[tid]); data.id = data.li_attr.id ? data.li_attr.id.toString() : tid; if (tmp.length) { tmp.each($.proxy(function (i, v) { c = this._parse_model_from_html($(v), data.id, ps); e = this._model.data[c]; data.children.push(c); if (e.children_d.length) { data.children_d = data.children_d.concat(e.children_d); } }, this)); data.children_d = data.children_d.concat(data.children); } else { if (d.hasClass('jstree-closed')) { data.state.loaded = false; } } if (data.li_attr['class']) { data.li_attr['class'] = data.li_attr['class'].replace('jstree-closed', '').replace('jstree-open', ''); } if (data.a_attr['class']) { data.a_attr['class'] = data.a_attr['class'].replace('jstree-clicked', '').replace('jstree-disabled', ''); } m[data.id] = data; if (data.state.selected) { this._data.core.selected.push(data.id); } return data.id; }, /** * parses a node from a JSON object (used when dealing with flat data, which has no nesting of children, but has id and parent properties) and appends it to the in memory tree model. Used internally. * @private * @name _parse_model_from_flat_json(d [, p, ps]) * @param {Object} d the JSON object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_flat_json: function (d, p, ps) { if (!ps) { ps = []; } else { ps = ps.concat(); } if (p) { ps.unshift(p); } var tid = d.id.toString(), m = this._model.data, df = this._model.default_state, i, j, c, e, tmp = { id: tid, text: d.text || '', icon: d.icon !== undefined ? d.icon : true, parent: p, parents: ps, children: d.children || [], children_d: d.children_d || [], data: d.data, state: {}, li_attr: { id: false }, a_attr: { href: '#' }, original: false }; for (i in df) { if (df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if (d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if (tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if (d && d.data) { tmp.data = d.data; if (d.data.jstree) { for (i in d.data.jstree) { if (d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if (d && typeof d.state === 'object') { for (i in d.state) { if (d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if (d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if (d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if (!tmp.li_attr.id) { tmp.li_attr.id = tid; } if (d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if (d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if (d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } m[tmp.id] = tmp; for (i = 0, j = tmp.children.length; i < j; i++) { c = this._parse_model_from_flat_json(m[tmp.children[i]], tmp.id, ps); e = m[c]; tmp.children_d.push(c); if (e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } delete d.data; delete d.children; m[tmp.id].original = d; if (tmp.state.selected) { this._data.core.selected.push(tmp.id); } return tmp.id; }, /** * parses a node from a JSON object and appends it to the in memory tree model. Used internally. * @private * @name _parse_model_from_json(d [, p, ps]) * @param {Object} d the JSON object to parse * @param {String} p the parent ID * @param {Array} ps list of all parents * @return {String} the ID of the object added to the model */ _parse_model_from_json: function (d, p, ps) { if (!ps) { ps = []; } else { ps = ps.concat(); } if (p) { ps.unshift(p); } var tid = false, i, j, c, e, m = this._model.data, df = this._model.default_state, tmp; do { tid = 'j' + this._id + '_' + (++this._cnt); } while (m[tid]); tmp = { id: false, text: typeof d === 'string' ? d : '', icon: typeof d === 'object' && d.icon !== undefined ? d.icon : true, parent: p, parents: ps, children: [], children_d: [], data: null, state: {}, li_attr: { id: false }, a_attr: { href: '#' }, original: false }; for (i in df) { if (df.hasOwnProperty(i)) { tmp.state[i] = df[i]; } } if (d && d.id) { tmp.id = d.id.toString(); } if (d && d.text) { tmp.text = d.text; } if (d && d.data && d.data.jstree && d.data.jstree.icon) { tmp.icon = d.data.jstree.icon; } if (tmp.icon === undefined || tmp.icon === null || tmp.icon === "") { tmp.icon = true; } if (d && d.data) { tmp.data = d.data; if (d.data.jstree) { for (i in d.data.jstree) { if (d.data.jstree.hasOwnProperty(i)) { tmp.state[i] = d.data.jstree[i]; } } } } if (d && typeof d.state === 'object') { for (i in d.state) { if (d.state.hasOwnProperty(i)) { tmp.state[i] = d.state[i]; } } } if (d && typeof d.li_attr === 'object') { for (i in d.li_attr) { if (d.li_attr.hasOwnProperty(i)) { tmp.li_attr[i] = d.li_attr[i]; } } } if (tmp.li_attr.id && !tmp.id) { tmp.id = tmp.li_attr.id.toString(); } if (!tmp.id) { tmp.id = tid; } if (!tmp.li_attr.id) { tmp.li_attr.id = tmp.id; } if (d && typeof d.a_attr === 'object') { for (i in d.a_attr) { if (d.a_attr.hasOwnProperty(i)) { tmp.a_attr[i] = d.a_attr[i]; } } } if (d && d.children && d.children.length) { for (i = 0, j = d.children.length; i < j; i++) { c = this._parse_model_from_json(d.children[i], tmp.id, ps); e = m[c]; tmp.children.push(c); if (e.children_d.length) { tmp.children_d = tmp.children_d.concat(e.children_d); } } tmp.children_d = tmp.children_d.concat(tmp.children); } if (d && d.children && d.children === true) { tmp.state.loaded = false; tmp.children = []; tmp.children_d = []; } delete d.data; delete d.children; tmp.original = d; m[tmp.id] = tmp; if (tmp.state.selected) { this._data.core.selected.push(tmp.id); } return tmp.id; }, /** * redraws all nodes that need to be redrawn. Used internally. * @private * @name _redraw() * @trigger redraw.jstree */ _redraw: function () { var nodes = this._model.force_full_redraw ? this._model.data[$.jstree.root].children.concat([]) : this._model.changed.concat([]), f = document.createElement('UL'), tmp, i, j, fe = this._data.core.focused; for (i = 0, j = nodes.length; i < j; i++) { tmp = this.redraw_node(nodes[i], true, this._model.force_full_redraw); if (tmp && this._model.force_full_redraw) { f.appendChild(tmp); } } if (this._model.force_full_redraw) { f.className = this.get_container_ul()[0].className; f.setAttribute('role', 'group'); this.element.empty().append(f); //this.get_container_ul()[0].appendChild(f); } if (fe !== null && this.settings.core.restore_focus) { tmp = this.get_node(fe, true); if (tmp && tmp.length && tmp.children('.jstree-anchor')[0] !== document.activeElement) { tmp.children('.jstree-anchor').focus(); } else { this._data.core.focused = null; } } this._model.force_full_redraw = false; this._model.changed = []; /** * triggered after nodes are redrawn * @event * @name redraw.jstree * @param {array} nodes the redrawn nodes */ this.trigger('redraw', { "nodes": nodes }); }, /** * redraws all nodes that need to be redrawn or optionally - the whole tree * @name redraw([full]) * @param {Boolean} full if set to `true` all nodes are redrawn. */ redraw: function (full) { if (full) { this._model.force_full_redraw = true; } //if(this._model.redraw_timeout) { // clearTimeout(this._model.redraw_timeout); //} //this._model.redraw_timeout = setTimeout($.proxy(this._redraw, this),0); this._redraw(); }, /** * redraws a single node's children. Used internally. * @private * @name draw_children(node) * @param {mixed} node the node whose children will be redrawn */ draw_children: function (node) { var obj = this.get_node(node), i = false, j = false, k = false, d = document; if (!obj) { return false; } if (obj.id === $.jstree.root) { return this.redraw(true); } node = this.get_node(node, true); if (!node || !node.length) { return false; } // TODO: quick toggle node.children('.jstree-children').remove(); node = node[0]; if (obj.children.length && obj.state.loaded) { k = d.createElement('UL'); k.setAttribute('role', 'group'); k.className = 'jstree-children'; for (i = 0, j = obj.children.length; i < j; i++) { k.appendChild(this.redraw_node(obj.children[i], true, true)); } node.appendChild(k); } }, /** * redraws a single node. Used internally. * @private * @name redraw_node(node, deep, is_callback, force_render) * @param {mixed} node the node to redraw * @param {Boolean} deep should child nodes be redrawn too * @param {Boolean} is_callback is this a recursion call * @param {Boolean} force_render should children of closed parents be drawn anyway */ redraw_node: function (node, deep, is_callback, force_render) { var obj = this.get_node(node), par = false, ind = false, old = false, i = false, j = false, k = false, c = '', d = document, m = this._model.data, f = false, s = false, tmp = null, t = 0, l = 0, has_children = false, last_sibling = false; if (!obj) { return false; } if (obj.id === $.jstree.root) { return this.redraw(true); } deep = deep || obj.children.length === 0; node = !document.querySelector ? document.getElementById(obj.id) : this.element[0].querySelector('#' + ("0123456789".indexOf(obj.id[0]) !== -1 ? '\\3' + obj.id[0] + ' ' + obj.id.substr(1).replace($.jstree.idregex, '\\$&') : obj.id.replace($.jstree.idregex, '\\$&'))); //, this.element); if (!node) { deep = true; //node = d.createElement('LI'); if (!is_callback) { par = obj.parent !== $.jstree.root ? $('#' + obj.parent.replace($.jstree.idregex, '\\$&'), this.element)[0] : null; if (par !== null && (!par || !m[obj.parent].state.opened)) { return false; } ind = $.inArray(obj.id, par === null ? m[$.jstree.root].children : m[obj.parent].children); } } else { node = $(node); if (!is_callback) { par = node.parent().parent()[0]; if (par === this.element[0]) { par = null; } ind = node.index(); } // m[obj.id].data = node.data(); // use only node's data, no need to touch jquery storage if (!deep && obj.children.length && !node.children('.jstree-children').length) { deep = true; } if (!deep) { old = node.children('.jstree-children')[0]; } f = node.children('.jstree-anchor')[0] === document.activeElement; node.remove(); //node = d.createElement('LI'); //node = node[0]; } node = this._data.core.node.cloneNode(true); // node is DOM, deep is boolean c = 'jstree-node '; for (i in obj.li_attr) { if (obj.li_attr.hasOwnProperty(i)) { if (i === 'id') { continue; } if (i !== 'class') { node.setAttribute(i, obj.li_attr[i]); } else { c += obj.li_attr[i]; } } } if (!obj.a_attr.id) { obj.a_attr.id = obj.id + '_anchor'; } node.setAttribute('aria-selected', !!obj.state.selected); node.setAttribute('aria-level', obj.parents.length); node.setAttribute('aria-labelledby', obj.a_attr.id); if (obj.state.disabled) { node.setAttribute('aria-disabled', true); } for (i = 0, j = obj.children.length; i < j; i++) { if (!m[obj.children[i]].state.hidden) { has_children = true; break; } } if (obj.parent !== null && m[obj.parent] && !obj.state.hidden) { i = $.inArray(obj.id, m[obj.parent].children); last_sibling = obj.id; if (i !== -1) { i++; for (j = m[obj.parent].children.length; i < j; i++) { if (!m[m[obj.parent].children[i]].state.hidden) { last_sibling = m[obj.parent].children[i]; } if (last_sibling !== obj.id) { break; } } } } if (obj.state.hidden) { c += ' jstree-hidden'; } if (obj.state.loading) { c += ' jstree-loading'; } if (obj.state.loaded && !has_children) { c += ' jstree-leaf'; } else { c += obj.state.opened && obj.state.loaded ? ' jstree-open' : ' jstree-closed'; node.setAttribute('aria-expanded', (obj.state.opened && obj.state.loaded)); } if (last_sibling === obj.id) { c += ' jstree-last'; } node.id = obj.id; node.className = c; c = (obj.state.selected ? ' jstree-clicked' : '') + (obj.state.disabled ? ' jstree-disabled' : ''); for (j in obj.a_attr) { if (obj.a_attr.hasOwnProperty(j)) { if (j === 'href' && obj.a_attr[j] === '#') { continue; } if (j !== 'class') { node.childNodes[1].setAttribute(j, obj.a_attr[j]); } else { c += ' ' + obj.a_attr[j]; } } } if (c.length) { node.childNodes[1].className = 'jstree-anchor ' + c; } if ((obj.icon && obj.icon !== true) || obj.icon === false) { if (obj.icon === false) { node.childNodes[1].childNodes[0].className += ' jstree-themeicon-hidden'; } else if (obj.icon.indexOf('/') === -1 && obj.icon.indexOf('.') === -1) { node.childNodes[1].childNodes[0].className += ' ' + obj.icon + ' jstree-themeicon-custom'; } else { node.childNodes[1].childNodes[0].style.backgroundImage = 'url("' + obj.icon + '")'; node.childNodes[1].childNodes[0].style.backgroundPosition = 'center center'; node.childNodes[1].childNodes[0].style.backgroundSize = 'auto'; node.childNodes[1].childNodes[0].className += ' jstree-themeicon-custom'; } } if (this.settings.core.force_text) { node.childNodes[1].appendChild(d.createTextNode(obj.text)); } else { node.childNodes[1].innerHTML += obj.text; } if (deep && obj.children.length && (obj.state.opened || force_render) && obj.state.loaded) { k = d.createElement('UL'); k.setAttribute('role', 'group'); k.className = 'jstree-children'; for (i = 0, j = obj.children.length; i < j; i++) { k.appendChild(this.redraw_node(obj.children[i], deep, true)); } node.appendChild(k); } if (old) { node.appendChild(old); } if (!is_callback) { // append back using par / ind if (!par) { par = this.element[0]; } for (i = 0, j = par.childNodes.length; i < j; i++) { if (par.childNodes[i] && par.childNodes[i].className && par.childNodes[i].className.indexOf('jstree-children') !== -1) { tmp = par.childNodes[i]; break; } } if (!tmp) { tmp = d.createElement('UL'); tmp.setAttribute('role', 'group'); tmp.className = 'jstree-children'; par.appendChild(tmp); } par = tmp; if (ind < par.childNodes.length) { par.insertBefore(node, par.childNodes[ind]); } else { par.appendChild(node); } if (f) { t = this.element[0].scrollTop; l = this.element[0].scrollLeft; node.childNodes[1].focus(); this.element[0].scrollTop = t; this.element[0].scrollLeft = l; } } if (obj.state.opened && !obj.state.loaded) { obj.state.opened = false; setTimeout($.proxy(function () { this.open_node(obj.id, false, 0); }, this), 0); } return node; }, /** * opens a node, revealing its children. If the node is not loaded it will be loaded and opened once ready. * @name open_node(obj [, callback, animation]) * @param {mixed} obj the node to open * @param {Function} callback a function to execute once the node is opened * @param {Number} animation the animation duration in milliseconds when opening the node (overrides the `core.animation` setting). Use `false` for no animation. * @trigger open_node.jstree, after_open.jstree, before_open.jstree */ open_node: function (obj, callback, animation) { var t1, t2, d, t; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.open_node(obj[t1], callback, animation); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } animation = animation === undefined ? this.settings.core.animation : animation; if (!this.is_closed(obj)) { if (callback) { callback.call(this, obj, false); } return false; } if (!this.is_loaded(obj)) { if (this.is_loading(obj)) { return setTimeout($.proxy(function () { this.open_node(obj, callback, animation); }, this), 500); } this.load_node(obj, function (o, ok) { return ok ? this.open_node(o, callback, animation) : (callback ? callback.call(this, o, false) : false); }); } else { d = this.get_node(obj, true); t = this; if (d.length) { if (animation && d.children(".jstree-children").length) { d.children(".jstree-children").stop(true, true); } if (obj.children.length && !this._firstChild(d.children('.jstree-children')[0])) { this.draw_children(obj); //d = this.get_node(obj, true); } if (!animation) { this.trigger('before_open', { "node": obj }); d[0].className = d[0].className.replace('jstree-closed', 'jstree-open'); d[0].setAttribute("aria-expanded", true); } else { this.trigger('before_open', { "node": obj }); d .children(".jstree-children").css("display", "none").end() .removeClass("jstree-closed").addClass("jstree-open").attr("aria-expanded", true) .children(".jstree-children").stop(true, true) .slideDown(animation, function () { this.style.display = ""; if (t.element) { t.trigger("after_open", { "node": obj }); } }); } } obj.state.opened = true; if (callback) { callback.call(this, obj, true); } if (!d.length) { /** * triggered when a node is about to be opened (if the node is supposed to be in the DOM, it will be, but it won't be visible yet) * @event * @name before_open.jstree * @param {Object} node the opened node */ this.trigger('before_open', { "node": obj }); } /** * triggered when a node is opened (if there is an animation it will not be completed yet) * @event * @name open_node.jstree * @param {Object} node the opened node */ this.trigger('open_node', { "node": obj }); if (!animation || !d.length) { /** * triggered when a node is opened and the animation is complete * @event * @name after_open.jstree * @param {Object} node the opened node */ this.trigger("after_open", { "node": obj }); } return true; } }, /** * opens every parent of a node (node should be loaded) * @name _open_to(obj) * @param {mixed} obj the node to reveal * @private */ _open_to: function (obj) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } var i, j, p = obj.parents; for (i = 0, j = p.length; i < j; i += 1) { if (i !== $.jstree.root) { this.open_node(p[i], false, 0); } } return $('#' + obj.id.replace($.jstree.idregex, '\\$&'), this.element); }, /** * closes a node, hiding its children * @name close_node(obj [, animation]) * @param {mixed} obj the node to close * @param {Number} animation the animation duration in milliseconds when closing the node (overrides the `core.animation` setting). Use `false` for no animation. * @trigger close_node.jstree, after_close.jstree */ close_node: function (obj, animation) { var t1, t2, t, d; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.close_node(obj[t1], animation); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } if (this.is_closed(obj)) { return false; } animation = animation === undefined ? this.settings.core.animation : animation; t = this; d = this.get_node(obj, true); obj.state.opened = false; /** * triggered when a node is closed (if there is an animation it will not be complete yet) * @event * @name close_node.jstree * @param {Object} node the closed node */ this.trigger('close_node', { "node": obj }); if (!d.length) { /** * triggered when a node is closed and the animation is complete * @event * @name after_close.jstree * @param {Object} node the closed node */ this.trigger("after_close", { "node": obj }); } else { if (!animation) { d[0].className = d[0].className.replace('jstree-open', 'jstree-closed'); d.attr("aria-expanded", false).children('.jstree-children').remove(); this.trigger("after_close", { "node": obj }); } else { d .children(".jstree-children").attr("style", "display:block !important").end() .removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded", false) .children(".jstree-children").stop(true, true).slideUp(animation, function () { this.style.display = ""; d.children('.jstree-children').remove(); if (t.element) { t.trigger("after_close", { "node": obj }); } }); } } }, /** * toggles a node - closing it if it is open, opening it if it is closed * @name toggle_node(obj) * @param {mixed} obj the node to toggle */ toggle_node: function (obj) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.toggle_node(obj[t1]); } return true; } if (this.is_closed(obj)) { return this.open_node(obj); } if (this.is_open(obj)) { return this.close_node(obj); } }, /** * opens all nodes within a node (or the tree), revealing their children. If the node is not loaded it will be loaded and opened once ready. * @name open_all([obj, animation, original_obj]) * @param {mixed} obj the node to open recursively, omit to open all nodes in the tree * @param {Number} animation the animation duration in milliseconds when opening the nodes, the default is no animation * @param {jQuery} reference to the node that started the process (internal use) * @trigger open_all.jstree */ open_all: function (obj, animation, original_obj) { if (!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if (!obj) { return false; } var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), i, j, _this; if (!dom.length) { for (i = 0, j = obj.children_d.length; i < j; i++) { if (this.is_closed(this._model.data[obj.children_d[i]])) { this._model.data[obj.children_d[i]].state.opened = true; } } return this.trigger('open_all', { "node": obj }); } original_obj = original_obj || dom; _this = this; dom = this.is_closed(obj) ? dom.find('.jstree-closed').addBack() : dom.find('.jstree-closed'); dom.each(function () { _this.open_node( this, function (node, status) { if (status && this.is_parent(node)) { this.open_all(node, animation, original_obj); } }, animation || 0 ); }); if (original_obj.find('.jstree-closed').length === 0) { /** * triggered when an `open_all` call completes * @event * @name open_all.jstree * @param {Object} node the opened node */ this.trigger('open_all', { "node": this.get_node(original_obj) }); } }, /** * closes all nodes within a node (or the tree), revealing their children * @name close_all([obj, animation]) * @param {mixed} obj the node to close recursively, omit to close all nodes in the tree * @param {Number} animation the animation duration in milliseconds when closing the nodes, the default is no animation * @trigger close_all.jstree */ close_all: function (obj, animation) { if (!obj) { obj = $.jstree.root; } obj = this.get_node(obj); if (!obj) { return false; } var dom = obj.id === $.jstree.root ? this.get_container_ul() : this.get_node(obj, true), _this = this, i, j; if (dom.length) { dom = this.is_open(obj) ? dom.find('.jstree-open').addBack() : dom.find('.jstree-open'); $(dom.get().reverse()).each(function () { _this.close_node(this, animation || 0); }); } for (i = 0, j = obj.children_d.length; i < j; i++) { this._model.data[obj.children_d[i]].state.opened = false; } /** * triggered when an `close_all` call completes * @event * @name close_all.jstree * @param {Object} node the closed node */ this.trigger('close_all', { "node": obj }); }, /** * checks if a node is disabled (not selectable) * @name is_disabled(obj) * @param {mixed} obj * @return {Boolean} */ is_disabled: function (obj) { obj = this.get_node(obj); return obj && obj.state && obj.state.disabled; }, /** * enables a node - so that it can be selected * @name enable_node(obj) * @param {mixed} obj the node to enable * @trigger enable_node.jstree */ enable_node: function (obj) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.enable_node(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } obj.state.disabled = false; this.get_node(obj, true).children('.jstree-anchor').removeClass('jstree-disabled').attr('aria-disabled', false); /** * triggered when an node is enabled * @event * @name enable_node.jstree * @param {Object} node the enabled node */ this.trigger('enable_node', { 'node': obj }); }, /** * disables a node - so that it can not be selected * @name disable_node(obj) * @param {mixed} obj the node to disable * @trigger disable_node.jstree */ disable_node: function (obj) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.disable_node(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } obj.state.disabled = true; this.get_node(obj, true).children('.jstree-anchor').addClass('jstree-disabled').attr('aria-disabled', true); /** * triggered when an node is disabled * @event * @name disable_node.jstree * @param {Object} node the disabled node */ this.trigger('disable_node', { 'node': obj }); }, /** * determines if a node is hidden * @name is_hidden(obj) * @param {mixed} obj the node */ is_hidden: function (obj) { obj = this.get_node(obj); return obj.state.hidden === true; }, /** * hides a node - it is still in the structure but will not be visible * @name hide_node(obj) * @param {mixed} obj the node to hide * @param {Boolean} skip_redraw internal parameter controlling if redraw is called * @trigger hide_node.jstree */ hide_node: function (obj, skip_redraw) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.hide_node(obj[t1], true); } if (!skip_redraw) { this.redraw(); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } if (!obj.state.hidden) { obj.state.hidden = true; this._node_changed(obj.parent); if (!skip_redraw) { this.redraw(); } /** * triggered when an node is hidden * @event * @name hide_node.jstree * @param {Object} node the hidden node */ this.trigger('hide_node', { 'node': obj }); } }, /** * shows a node * @name show_node(obj) * @param {mixed} obj the node to show * @param {Boolean} skip_redraw internal parameter controlling if redraw is called * @trigger show_node.jstree */ show_node: function (obj, skip_redraw) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.show_node(obj[t1], true); } if (!skip_redraw) { this.redraw(); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } if (obj.state.hidden) { obj.state.hidden = false; this._node_changed(obj.parent); if (!skip_redraw) { this.redraw(); } /** * triggered when an node is shown * @event * @name show_node.jstree * @param {Object} node the shown node */ this.trigger('show_node', { 'node': obj }); } }, /** * hides all nodes * @name hide_all() * @trigger hide_all.jstree */ hide_all: function (skip_redraw) { var i, m = this._model.data, ids = []; for (i in m) { if (m.hasOwnProperty(i) && i !== $.jstree.root && !m[i].state.hidden) { m[i].state.hidden = true; ids.push(i); } } this._model.force_full_redraw = true; if (!skip_redraw) { this.redraw(); } /** * triggered when all nodes are hidden * @event * @name hide_all.jstree * @param {Array} nodes the IDs of all hidden nodes */ this.trigger('hide_all', { 'nodes': ids }); return ids; }, /** * shows all nodes * @name show_all() * @trigger show_all.jstree */ show_all: function (skip_redraw) { var i, m = this._model.data, ids = []; for (i in m) { if (m.hasOwnProperty(i) && i !== $.jstree.root && m[i].state.hidden) { m[i].state.hidden = false; ids.push(i); } } this._model.force_full_redraw = true; if (!skip_redraw) { this.redraw(); } /** * triggered when all nodes are shown * @event * @name show_all.jstree * @param {Array} nodes the IDs of all shown nodes */ this.trigger('show_all', { 'nodes': ids }); return ids; }, /** * called when a node is selected by the user. Used internally. * @private * @name activate_node(obj, e) * @param {mixed} obj the node * @param {Object} e the related event * @trigger activate_node.jstree, changed.jstree */ activate_node: function (obj, e) { if (this.is_disabled(obj)) { return false; } if (!e || typeof e !== 'object') { e = {}; } // ensure last_clicked is still in the DOM, make it fresh (maybe it was moved?) and make sure it is still selected, if not - make last_clicked the last selected node this._data.core.last_clicked = this._data.core.last_clicked && this._data.core.last_clicked.id !== undefined ? this.get_node(this._data.core.last_clicked.id) : null; if (this._data.core.last_clicked && !this._data.core.last_clicked.state.selected) { this._data.core.last_clicked = null; } if (!this._data.core.last_clicked && this._data.core.selected.length) { this._data.core.last_clicked = this.get_node(this._data.core.selected[this._data.core.selected.length - 1]); } if (!this.settings.core.multiple || (!e.metaKey && !e.ctrlKey && !e.shiftKey) || (e.shiftKey && (!this._data.core.last_clicked || !this.get_parent(obj) || this.get_parent(obj) !== this._data.core.last_clicked.parent))) { if (!this.settings.core.multiple && (e.metaKey || e.ctrlKey || e.shiftKey) && this.is_selected(obj)) { this.deselect_node(obj, false, e); } else { this.deselect_all(true); this.select_node(obj, false, false, e); this._data.core.last_clicked = this.get_node(obj); } } else { if (e.shiftKey) { var o = this.get_node(obj).id, l = this._data.core.last_clicked.id, p = this.get_node(this._data.core.last_clicked.parent).children, c = false, i, j; for (i = 0, j = p.length; i < j; i += 1) { // separate IFs work whem o and l are the same if (p[i] === o) { c = !c; } if (p[i] === l) { c = !c; } if (!this.is_disabled(p[i]) && (c || p[i] === o || p[i] === l)) { if (!this.is_hidden(p[i])) { this.select_node(p[i], true, false, e); } } else { this.deselect_node(p[i], true, e); } } this.trigger('changed', { 'action': 'select_node', 'node': this.get_node(obj), 'selected': this._data.core.selected, 'event': e }); } else { if (!this.is_selected(obj)) { this.select_node(obj, false, false, e); } else { this.deselect_node(obj, false, e); } } } /** * triggered when an node is clicked or intercated with by the user * @event * @name activate_node.jstree * @param {Object} node * @param {Object} event the ooriginal event (if any) which triggered the call (may be an empty object) */ this.trigger('activate_node', { 'node': this.get_node(obj), 'event': e }); }, /** * applies the hover state on a node, called when a node is hovered by the user. Used internally. * @private * @name hover_node(obj) * @param {mixed} obj * @trigger hover_node.jstree */ hover_node: function (obj) { obj = this.get_node(obj, true); if (!obj || !obj.length || obj.children('.jstree-hovered').length) { return false; } var o = this.element.find('.jstree-hovered'), t = this.element; if (o && o.length) { this.dehover_node(o); } obj.children('.jstree-anchor').addClass('jstree-hovered'); /** * triggered when an node is hovered * @event * @name hover_node.jstree * @param {Object} node */ this.trigger('hover_node', { 'node': this.get_node(obj) }); setTimeout(function () { t.attr('aria-activedescendant', obj[0].id); }, 0); }, /** * removes the hover state from a nodecalled when a node is no longer hovered by the user. Used internally. * @private * @name dehover_node(obj) * @param {mixed} obj * @trigger dehover_node.jstree */ dehover_node: function (obj) { obj = this.get_node(obj, true); if (!obj || !obj.length || !obj.children('.jstree-hovered').length) { return false; } obj.children('.jstree-anchor').removeClass('jstree-hovered'); /** * triggered when an node is no longer hovered * @event * @name dehover_node.jstree * @param {Object} node */ this.trigger('dehover_node', { 'node': this.get_node(obj) }); }, /** * select a node * @name select_node(obj [, supress_event, prevent_open]) * @param {mixed} obj an array can be used to select multiple nodes * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @param {Boolean} prevent_open if set to `true` parents of the selected node won't be opened * @trigger select_node.jstree, changed.jstree */ select_node: function (obj, supress_event, prevent_open, e) { var dom, t1, t2, th; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.select_node(obj[t1], supress_event, prevent_open, e); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (!obj.state.selected) { obj.state.selected = true; this._data.core.selected.push(obj.id); if (!prevent_open) { dom = this._open_to(obj); } if (dom && dom.length) { dom.attr('aria-selected', true).children('.jstree-anchor').addClass('jstree-clicked'); } /** * triggered when an node is selected * @event * @name select_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this select_node */ this.trigger('select_node', { 'node': obj, 'selected': this._data.core.selected, 'event': e }); if (!supress_event) { /** * triggered when selection changes * @event * @name changed.jstree * @param {Object} node * @param {Object} action the action that caused the selection to change * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this changed event */ this.trigger('changed', { 'action': 'select_node', 'node': obj, 'selected': this._data.core.selected, 'event': e }); } } }, /** * deselect a node * @name deselect_node(obj [, supress_event]) * @param {mixed} obj an array can be used to deselect multiple nodes * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger deselect_node.jstree, changed.jstree */ deselect_node: function (obj, supress_event, e) { var t1, t2, dom; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.deselect_node(obj[t1], supress_event, e); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (obj.state.selected) { obj.state.selected = false; this._data.core.selected = $.vakata.array_remove_item(this._data.core.selected, obj.id); if (dom.length) { dom.attr('aria-selected', false).children('.jstree-anchor').removeClass('jstree-clicked'); } /** * triggered when an node is deselected * @event * @name deselect_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this deselect_node */ this.trigger('deselect_node', { 'node': obj, 'selected': this._data.core.selected, 'event': e }); if (!supress_event) { this.trigger('changed', { 'action': 'deselect_node', 'node': obj, 'selected': this._data.core.selected, 'event': e }); } } }, /** * select all nodes in the tree * @name select_all([supress_event]) * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger select_all.jstree, changed.jstree */ select_all: function (supress_event) { var tmp = this._data.core.selected.concat([]), i, j; this._data.core.selected = this._model.data[$.jstree.root].children_d.concat(); for (i = 0, j = this._data.core.selected.length; i < j; i++) { if (this._model.data[this._data.core.selected[i]]) { this._model.data[this._data.core.selected[i]].state.selected = true; } } this.redraw(true); /** * triggered when all nodes are selected * @event * @name select_all.jstree * @param {Array} selected the current selection */ this.trigger('select_all', { 'selected': this._data.core.selected }); if (!supress_event) { this.trigger('changed', { 'action': 'select_all', 'selected': this._data.core.selected, 'old_selection': tmp }); } }, /** * deselect all selected nodes * @name deselect_all([supress_event]) * @param {Boolean} supress_event if set to `true` the `changed.jstree` event won't be triggered * @trigger deselect_all.jstree, changed.jstree */ deselect_all: function (supress_event) { var tmp = this._data.core.selected.concat([]), i, j; for (i = 0, j = this._data.core.selected.length; i < j; i++) { if (this._model.data[this._data.core.selected[i]]) { this._model.data[this._data.core.selected[i]].state.selected = false; } } this._data.core.selected = []; this.element.find('.jstree-clicked').removeClass('jstree-clicked').parent().attr('aria-selected', false); /** * triggered when all nodes are deselected * @event * @name deselect_all.jstree * @param {Object} node the previous selection * @param {Array} selected the current selection */ this.trigger('deselect_all', { 'selected': this._data.core.selected, 'node': tmp }); if (!supress_event) { this.trigger('changed', { 'action': 'deselect_all', 'selected': this._data.core.selected, 'old_selection': tmp }); } }, /** * checks if a node is selected * @name is_selected(obj) * @param {mixed} obj * @return {Boolean} */ is_selected: function (obj) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } return obj.state.selected; }, /** * get an array of all selected nodes * @name get_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_selected: function (full) { return full ? $.map(this._data.core.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.core.selected.slice(); }, /** * get an array of all top level selected nodes (ignoring children of selected nodes) * @name get_top_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_top_selected: function (full) { var tmp = this.get_selected(true), obj = {}, i, j, k, l; for (i = 0, j = tmp.length; i < j; i++) { obj[tmp[i].id] = tmp[i]; } for (i = 0, j = tmp.length; i < j; i++) { for (k = 0, l = tmp[i].children_d.length; k < l; k++) { if (obj[tmp[i].children_d[k]]) { delete obj[tmp[i].children_d[k]]; } } } tmp = []; for (i in obj) { if (obj.hasOwnProperty(i)) { tmp.push(i); } } return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp; }, /** * get an array of all bottom level selected nodes (ignoring selected parents) * @name get_bottom_selected([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} */ get_bottom_selected: function (full) { var tmp = this.get_selected(true), obj = [], i, j; for (i = 0, j = tmp.length; i < j; i++) { if (!tmp[i].children.length) { obj.push(tmp[i].id); } } return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj; }, /** * gets the current state of the tree so that it can be restored later with `set_state(state)`. Used internally. * @name get_state() * @private * @return {Object} */ get_state: function () { var state = { 'core': { 'open': [], 'loaded': [], 'scroll': { 'left': this.element.scrollLeft(), 'top': this.element.scrollTop() }, /*! 'themes' : { 'name' : this.get_theme(), 'icons' : this._data.core.themes.icons, 'dots' : this._data.core.themes.dots }, */ 'selected': [] } }, i; for (i in this._model.data) { if (this._model.data.hasOwnProperty(i)) { if (i !== $.jstree.root) { if (this._model.data[i].state.loaded && this.settings.core.loaded_state) { state.core.loaded.push(i); } if (this._model.data[i].state.opened) { state.core.open.push(i); } if (this._model.data[i].state.selected) { state.core.selected.push(i); } } } } return state; }, /** * sets the state of the tree. Used internally. * @name set_state(state [, callback]) * @private * @param {Object} state the state to restore. Keep in mind this object is passed by reference and jstree will modify it. * @param {Function} callback an optional function to execute once the state is restored. * @trigger set_state.jstree */ set_state: function (state, callback) { if (state) { if (state.core && state.core.selected && state.core.initial_selection === undefined) { state.core.initial_selection = this._data.core.selected.concat([]).sort().join(','); } if (state.core) { var res, n, t, _this, i; if (state.core.loaded) { if (!this.settings.core.loaded_state || !$.isArray(state.core.loaded) || !state.core.loaded.length) { delete state.core.loaded; this.set_state(state, callback); } else { this._load_nodes(state.core.loaded, function (nodes) { delete state.core.loaded; this.set_state(state, callback); }); } return false; } if (state.core.open) { if (!$.isArray(state.core.open) || !state.core.open.length) { delete state.core.open; this.set_state(state, callback); } else { this._load_nodes(state.core.open, function (nodes) { this.open_node(nodes, false, 0); delete state.core.open; this.set_state(state, callback); }); } return false; } if (state.core.scroll) { if (state.core.scroll && state.core.scroll.left !== undefined) { this.element.scrollLeft(state.core.scroll.left); } if (state.core.scroll && state.core.scroll.top !== undefined) { this.element.scrollTop(state.core.scroll.top); } delete state.core.scroll; this.set_state(state, callback); return false; } if (state.core.selected) { _this = this; if (state.core.initial_selection === undefined || state.core.initial_selection === this._data.core.selected.concat([]).sort().join(',') ) { this.deselect_all(); $.each(state.core.selected, function (i, v) { _this.select_node(v, false, true); }); } delete state.core.initial_selection; delete state.core.selected; this.set_state(state, callback); return false; } for (i in state) { if (state.hasOwnProperty(i) && i !== "core" && $.inArray(i, this.settings.plugins) === -1) { delete state[i]; } } if ($.isEmptyObject(state.core)) { delete state.core; this.set_state(state, callback); return false; } } if ($.isEmptyObject(state)) { state = null; if (callback) { callback.call(this); } /** * triggered when a `set_state` call completes * @event * @name set_state.jstree */ this.trigger('set_state'); return false; } return true; } return false; }, /** * refreshes the tree - all nodes are reloaded with calls to `load_node`. * @name refresh() * @param {Boolean} skip_loading an option to skip showing the loading indicator * @param {Mixed} forget_state if set to `true` state will not be reapplied, if set to a function (receiving the current state as argument) the result of that function will be used as state * @trigger refresh.jstree */ refresh: function (skip_loading, forget_state) { this._data.core.state = forget_state === true ? {} : this.get_state(); if (forget_state && $.isFunction(forget_state)) { this._data.core.state = forget_state.call(this, this._data.core.state); } this._cnt = 0; this._model.data = {}; this._model.data[$.jstree.root] = { id: $.jstree.root, parent: null, parents: [], children: [], children_d: [], state: { loaded: false } }; this._data.core.selected = []; this._data.core.last_clicked = null; this._data.core.focused = null; var c = this.get_container_ul()[0].className; if (!skip_loading) { this.element.html("<" + "ul class='" + c + "' role='group'><" + "li class='jstree-initial-node jstree-loading jstree-leaf jstree-last' role='treeitem' id='j" + this._id + "_loading'><" + "a class='jstree-anchor' href='#'>" + this.get_string("Loading ...") + ""); this.element.attr('aria-activedescendant', 'j' + this._id + '_loading'); } this.load_node($.jstree.root, function (o, s) { if (s) { this.get_container_ul()[0].className = c; if (this._firstChild(this.get_container_ul()[0])) { this.element.attr('aria-activedescendant', this._firstChild(this.get_container_ul()[0]).id); } this.set_state($.extend(true, {}, this._data.core.state), function () { /** * triggered when a `refresh` call completes * @event * @name refresh.jstree */ this.trigger('refresh'); }); } this._data.core.state = null; }); }, /** * refreshes a node in the tree (reload its children) all opened nodes inside that node are reloaded with calls to `load_node`. * @name refresh_node(obj) * @param {mixed} obj the node * @trigger refresh_node.jstree */ refresh_node: function (obj) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } var opened = [], to_load = [], s = this._data.core.selected.concat([]); to_load.push(obj.id); if (obj.state.opened === true) { opened.push(obj.id); } this.get_node(obj, true).find('.jstree-open').each(function () { to_load.push(this.id); opened.push(this.id); }); this._load_nodes(to_load, $.proxy(function (nodes) { this.open_node(opened, false, 0); this.select_node(s); /** * triggered when a node is refreshed * @event * @name refresh_node.jstree * @param {Object} node - the refreshed node * @param {Array} nodes - an array of the IDs of the nodes that were reloaded */ this.trigger('refresh_node', { 'node': obj, 'nodes': nodes }); }, this), false, true); }, /** * set (change) the ID of a node * @name set_id(obj, id) * @param {mixed} obj the node * @param {String} id the new ID * @return {Boolean} * @trigger set_id.jstree */ set_id: function (obj, id) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } var i, j, m = this._model.data, old = obj.id; id = id.toString(); // update parents (replace current ID with new one in children and children_d) m[obj.parent].children[$.inArray(obj.id, m[obj.parent].children)] = id; for (i = 0, j = obj.parents.length; i < j; i++) { m[obj.parents[i]].children_d[$.inArray(obj.id, m[obj.parents[i]].children_d)] = id; } // update children (replace current ID with new one in parent and parents) for (i = 0, j = obj.children.length; i < j; i++) { m[obj.children[i]].parent = id; } for (i = 0, j = obj.children_d.length; i < j; i++) { m[obj.children_d[i]].parents[$.inArray(obj.id, m[obj.children_d[i]].parents)] = id; } i = $.inArray(obj.id, this._data.core.selected); if (i !== -1) { this._data.core.selected[i] = id; } // update model and obj itself (obj.id, this._model.data[KEY]) i = this.get_node(obj.id, true); if (i) { i.attr('id', id); //.children('.jstree-anchor').attr('id', id + '_anchor').end().attr('aria-labelledby', id + '_anchor'); if (this.element.attr('aria-activedescendant') === obj.id) { this.element.attr('aria-activedescendant', id); } } delete m[obj.id]; obj.id = id; obj.li_attr.id = id; m[id] = obj; /** * triggered when a node id value is changed * @event * @name set_id.jstree * @param {Object} node * @param {String} old the old id */ this.trigger('set_id', { "node": obj, "new": obj.id, "old": old }); return true; }, /** * get the text value of a node * @name get_text(obj) * @param {mixed} obj the node * @return {String} */ get_text: function (obj) { obj = this.get_node(obj); return (!obj || obj.id === $.jstree.root) ? false : obj.text; }, /** * set the text value of a node. Used internally, please use `rename_node(obj, val)`. * @private * @name set_text(obj, val) * @param {mixed} obj the node, you can pass an array to set the text on multiple nodes * @param {String} val the new text value * @return {Boolean} * @trigger set_text.jstree */ set_text: function (obj, val) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_text(obj[t1], val); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } obj.text = val; if (this.get_node(obj, true).length) { this.redraw_node(obj.id); } /** * triggered when a node text value is changed * @event * @name set_text.jstree * @param {Object} obj * @param {String} text the new value */ this.trigger('set_text', { "obj": obj, "text": val }); return true; }, /** * gets a JSON representation of a node (or the whole tree) * @name get_json([obj, options]) * @param {mixed} obj * @param {Object} options * @param {Boolean} options.no_state do not return state information * @param {Boolean} options.no_id do not return ID * @param {Boolean} options.no_children do not include children * @param {Boolean} options.no_data do not include node data * @param {Boolean} options.no_li_attr do not include LI attributes * @param {Boolean} options.no_a_attr do not include A attributes * @param {Boolean} options.flat return flat JSON instead of nested * @return {Object} */ get_json: function (obj, options, flat) { obj = this.get_node(obj || $.jstree.root); if (!obj) { return false; } if (options && options.flat && !flat) { flat = []; } var tmp = { 'id': obj.id, 'text': obj.text, 'icon': this.get_icon(obj), 'li_attr': $.extend(true, {}, obj.li_attr), 'a_attr': $.extend(true, {}, obj.a_attr), 'state': {}, 'data': options && options.no_data ? false : $.extend(true, $.isArray(obj.data) ? [] : {}, obj.data) //( this.get_node(obj, true).length ? this.get_node(obj, true).data() : obj.data ), }, i, j; if (options && options.flat) { tmp.parent = obj.parent; } else { tmp.children = []; } if (!options || !options.no_state) { for (i in obj.state) { if (obj.state.hasOwnProperty(i)) { tmp.state[i] = obj.state[i]; } } } else { delete tmp.state; } if (options && options.no_li_attr) { delete tmp.li_attr; } if (options && options.no_a_attr) { delete tmp.a_attr; } if (options && options.no_id) { delete tmp.id; if (tmp.li_attr && tmp.li_attr.id) { delete tmp.li_attr.id; } if (tmp.a_attr && tmp.a_attr.id) { delete tmp.a_attr.id; } } if (options && options.flat && obj.id !== $.jstree.root) { flat.push(tmp); } if (!options || !options.no_children) { for (i = 0, j = obj.children.length; i < j; i++) { if (options && options.flat) { this.get_json(obj.children[i], options, flat); } else { tmp.children.push(this.get_json(obj.children[i], options)); } } } return options && options.flat ? flat : (obj.id === $.jstree.root ? tmp.children : tmp); }, /** * create a new node (do not confuse with load_node) * @name create_node([par, node, pos, callback, is_loaded]) * @param {mixed} par the parent node (to create a root node use either "#" (string) or `null`) * @param {mixed} node the data for the new node (a valid JSON object, or a simple string with the name) * @param {mixed} pos the index at which to insert the node, "first" and "last" are also supported, default is "last" * @param {Function} callback a function to be called once the node is created * @param {Boolean} is_loaded internal argument indicating if the parent node was succesfully loaded * @return {String} the ID of the newly create node * @trigger model.jstree, create_node.jstree */ create_node: function (par, node, pos, callback, is_loaded) { if (par === null) { par = $.jstree.root; } par = this.get_node(par); if (!par) { return false; } pos = pos === undefined ? "last" : pos; if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.create_node(par, node, pos, callback, true); }); } if (!node) { node = { "text": this.get_string('New node') }; } if (typeof node === "string") { node = { "text": node }; } else { node = $.extend(true, {}, node); } if (node.text === undefined) { node.text = this.get_string('New node'); } var tmp, dpc, i, j; if (par.id === $.jstree.root) { if (pos === "before") { pos = "first"; } if (pos === "after") { pos = "last"; } } switch (pos) { case "before": tmp = this.get_node(par.parent); pos = $.inArray(par.id, tmp.children); par = tmp; break; case "after": tmp = this.get_node(par.parent); pos = $.inArray(par.id, tmp.children) + 1; par = tmp; break; case "inside": case "first": pos = 0; break; case "last": pos = par.children.length; break; default: if (!pos) { pos = 0; } break; } if (pos > par.children.length) { pos = par.children.length; } if (!node.id) { node.id = true; } if (!this.check("create_node", node, par, pos)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if (node.id === true) { delete node.id; } node = this._parse_model_from_json(node, par.id, par.parents.concat()); if (!node) { return false; } tmp = this.get_node(node); dpc = []; dpc.push(node); dpc = dpc.concat(tmp.children_d); this.trigger('model', { "nodes": dpc, "parent": par.id }); par.children_d = par.children_d.concat(dpc); for (i = 0, j = par.parents.length; i < j; i++) { this._model.data[par.parents[i]].children_d = this._model.data[par.parents[i]].children_d.concat(dpc); } node = tmp; tmp = []; for (i = 0, j = par.children.length; i < j; i++) { tmp[i >= pos ? i + 1 : i] = par.children[i]; } tmp[pos] = node.id; par.children = tmp; this.redraw_node(par, true); /** * triggered when a node is created * @event * @name create_node.jstree * @param {Object} node * @param {String} parent the parent's ID * @param {Number} position the position of the new node among the parent's children */ this.trigger('create_node', { "node": this.get_node(node), "parent": par.id, "position": pos }); if (callback) { callback.call(this, this.get_node(node)); } return node.id; }, /** * set the text value of a node * @name rename_node(obj, val) * @param {mixed} obj the node, you can pass an array to rename multiple nodes to the same name * @param {String} val the new text value * @return {Boolean} * @trigger rename_node.jstree */ rename_node: function (obj, val) { var t1, t2, old; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.rename_node(obj[t1], val); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } old = obj.text; if (!this.check("rename_node", obj, this.get_parent(obj), val)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } this.set_text(obj, val); // .apply(this, Array.prototype.slice.call(arguments)) /** * triggered when a node is renamed * @event * @name rename_node.jstree * @param {Object} node * @param {String} text the new value * @param {String} old the old value */ this.trigger('rename_node', { "node": obj, "text": val, "old": old }); return true; }, /** * remove a node * @name delete_node(obj) * @param {mixed} obj the node, you can pass an array to delete multiple nodes * @return {Boolean} * @trigger delete_node.jstree, changed.jstree */ delete_node: function (obj) { var t1, t2, par, pos, tmp, i, j, k, l, c, top, lft; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.delete_node(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } par = this.get_node(obj.parent); pos = $.inArray(obj.id, par.children); c = false; if (!this.check("delete_node", obj, par, pos)) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if (pos !== -1) { par.children = $.vakata.array_remove(par.children, pos); } tmp = obj.children_d.concat([]); tmp.push(obj.id); for (i = 0, j = obj.parents.length; i < j; i++) { this._model.data[obj.parents[i]].children_d = $.vakata.array_filter(this._model.data[obj.parents[i]].children_d, function (v) { return $.inArray(v, tmp) === -1; }); } for (k = 0, l = tmp.length; k < l; k++) { if (this._model.data[tmp[k]].state.selected) { c = true; break; } } if (c) { this._data.core.selected = $.vakata.array_filter(this._data.core.selected, function (v) { return $.inArray(v, tmp) === -1; }); } /** * triggered when a node is deleted * @event * @name delete_node.jstree * @param {Object} node * @param {String} parent the parent's ID */ this.trigger('delete_node', { "node": obj, "parent": par.id }); if (c) { this.trigger('changed', { 'action': 'delete_node', 'node': obj, 'selected': this._data.core.selected, 'parent': par.id }); } for (k = 0, l = tmp.length; k < l; k++) { delete this._model.data[tmp[k]]; } if ($.inArray(this._data.core.focused, tmp) !== -1) { this._data.core.focused = null; top = this.element[0].scrollTop; lft = this.element[0].scrollLeft; if (par.id === $.jstree.root) { if (this._model.data[$.jstree.root].children[0]) { this.get_node(this._model.data[$.jstree.root].children[0], true).children('.jstree-anchor').focus(); } } else { this.get_node(par, true).children('.jstree-anchor').focus(); } this.element[0].scrollTop = top; this.element[0].scrollLeft = lft; } this.redraw_node(par, true); return true; }, /** * check if an operation is premitted on the tree. Used internally. * @private * @name check(chk, obj, par, pos) * @param {String} chk the operation to check, can be "create_node", "rename_node", "delete_node", "copy_node" or "move_node" * @param {mixed} obj the node * @param {mixed} par the parent * @param {mixed} pos the position to insert at, or if "rename_node" - the new name * @param {mixed} more some various additional information, for example if a "move_node" operations is triggered by DND this will be the hovered node * @return {Boolean} */ check: function (chk, obj, par, pos, more) { obj = obj && obj.id ? obj : this.get_node(obj); par = par && par.id ? par : this.get_node(par); var tmp = chk.match(/^move_node|copy_node|create_node$/i) ? par : obj, chc = this.settings.core.check_callback; if (chk === "move_node" || chk === "copy_node") { if ((!more || !more.is_multi) && (obj.id === par.id || (chk === "move_node" && $.inArray(obj.id, par.children) === pos) || $.inArray(par.id, obj.children_d) !== -1)) { this._data.core.last_error = { 'error': 'check', 'plugin': 'core', 'id': 'core_01', 'reason': 'Moving parent inside child', 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } } if (tmp && tmp.data) { tmp = tmp.data; } if (tmp && tmp.functions && (tmp.functions[chk] === false || tmp.functions[chk] === true)) { if (tmp.functions[chk] === false) { this._data.core.last_error = { 'error': 'check', 'plugin': 'core', 'id': 'core_02', 'reason': 'Node data prevents function: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return tmp.functions[chk]; } if (chc === false || ($.isFunction(chc) && chc.call(this, chk, obj, par, pos, more) === false) || (chc && chc[chk] === false)) { this._data.core.last_error = { 'error': 'check', 'plugin': 'core', 'id': 'core_03', 'reason': 'User config for core.check_callback prevents function: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } return true; }, /** * get the last error * @name last_error() * @return {Object} */ last_error: function () { return this._data.core.last_error; }, /** * move a node to a new parent * @name move_node(obj, par [, pos, callback, is_loaded]) * @param {mixed} obj the node to move, pass an array to move multiple nodes * @param {mixed} par the new parent * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn * @param {Boolean} instance internal parameter indicating if the node comes from another instance * @trigger move_node.jstree */ move_node: function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { var t1, t2, old_par, old_pos, new_par, old_ins, is_multi, dpc, tmp, i, j, k, l, p; par = this.get_node(par); pos = pos === undefined ? 0 : pos; if (!par) { return false; } if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.move_node(obj, par, pos, callback, true, false, origin); }); } if ($.isArray(obj)) { if (obj.length === 1) { obj = obj[0]; } else { //obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { if ((tmp = this.move_node(obj[t1], par, pos, callback, is_loaded, false, origin))) { par = tmp; pos = "after"; } } this.redraw(); return true; } } obj = obj && obj.id ? obj : this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } old_par = (obj.parent || $.jstree.root).toString(); new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); old_pos = old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1; if (old_ins && old_ins._id) { obj = old_ins._model.data[obj.id]; } if (is_multi) { if ((tmp = this.copy_node(obj, par, pos, callback, is_loaded, false, origin))) { if (old_ins) { old_ins.delete_node(obj); } return tmp; } return false; } //var m = this._model.data; if (par.id === $.jstree.root) { if (pos === "before") { pos = "first"; } if (pos === "after") { pos = "last"; } } switch (pos) { case "before": pos = $.inArray(par.id, new_par.children); break; case "after": pos = $.inArray(par.id, new_par.children) + 1; break; case "inside": case "first": pos = 0; break; case "last": pos = new_par.children.length; break; default: if (!pos) { pos = 0; } break; } if (pos > new_par.children.length) { pos = new_par.children.length; } if (!this.check("move_node", obj, new_par, pos, { 'core': true, 'origin': origin, 'is_multi': (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign': (!old_ins || !old_ins._id) })) { this.settings.core.error.call(this, this._data.core.last_error); return false; } if (obj.parent === new_par.id) { dpc = new_par.children.concat(); tmp = $.inArray(obj.id, dpc); if (tmp !== -1) { dpc = $.vakata.array_remove(dpc, tmp); if (pos > tmp) { pos--; } } tmp = []; for (i = 0, j = dpc.length; i < j; i++) { tmp[i >= pos ? i + 1 : i] = dpc[i]; } tmp[pos] = obj.id; new_par.children = tmp; this._node_changed(new_par.id); this.redraw(new_par.id === $.jstree.root); } else { // clean old parent and up tmp = obj.children_d.concat(); tmp.push(obj.id); for (i = 0, j = obj.parents.length; i < j; i++) { dpc = []; p = old_ins._model.data[obj.parents[i]].children_d; for (k = 0, l = p.length; k < l; k++) { if ($.inArray(p[k], tmp) === -1) { dpc.push(p[k]); } } old_ins._model.data[obj.parents[i]].children_d = dpc; } old_ins._model.data[old_par].children = $.vakata.array_remove_item(old_ins._model.data[old_par].children, obj.id); // insert into new parent and up for (i = 0, j = new_par.parents.length; i < j; i++) { this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(tmp); } dpc = []; for (i = 0, j = new_par.children.length; i < j; i++) { dpc[i >= pos ? i + 1 : i] = new_par.children[i]; } dpc[pos] = obj.id; new_par.children = dpc; new_par.children_d.push(obj.id); new_par.children_d = new_par.children_d.concat(obj.children_d); // update object obj.parent = new_par.id; tmp = new_par.parents.concat(); tmp.unshift(new_par.id); p = obj.parents.length; obj.parents = tmp; // update object children tmp = tmp.concat(); for (i = 0, j = obj.children_d.length; i < j; i++) { this._model.data[obj.children_d[i]].parents = this._model.data[obj.children_d[i]].parents.slice(0, p * -1); Array.prototype.push.apply(this._model.data[obj.children_d[i]].parents, tmp); } if (old_par === $.jstree.root || new_par.id === $.jstree.root) { this._model.force_full_redraw = true; } if (!this._model.force_full_redraw) { this._node_changed(old_par); this._node_changed(new_par.id); } if (!skip_redraw) { this.redraw(); } } if (callback) { callback.call(this, obj, new_par, pos); } /** * triggered when a node is moved * @event * @name move_node.jstree * @param {Object} node * @param {String} parent the parent's ID * @param {Number} position the position of the node among the parent's children * @param {String} old_parent the old parent of the node * @param {Number} old_position the old position of the node * @param {Boolean} is_multi do the node and new parent belong to different instances * @param {jsTree} old_instance the instance the node came from * @param {jsTree} new_instance the instance of the new parent */ this.trigger('move_node', { "node": obj, "parent": new_par.id, "position": pos, "old_parent": old_par, "old_position": old_pos, 'is_multi': (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign': (!old_ins || !old_ins._id), 'old_instance': old_ins, 'new_instance': this }); return obj.id; }, /** * copy a node to a new parent * @name copy_node(obj, par [, pos, callback, is_loaded]) * @param {mixed} obj the node to copy, pass an array to copy multiple nodes * @param {mixed} par the new parent * @param {mixed} pos the position to insert at (besides integer values, "first" and "last" are supported, as well as "before" and "after"), defaults to integer `0` * @param {function} callback a function to call once the move is completed, receives 3 arguments - the node, the new parent and the position * @param {Boolean} is_loaded internal parameter indicating if the parent node has been loaded * @param {Boolean} skip_redraw internal parameter indicating if the tree should be redrawn * @param {Boolean} instance internal parameter indicating if the node comes from another instance * @trigger model.jstree copy_node.jstree */ copy_node: function (obj, par, pos, callback, is_loaded, skip_redraw, origin) { var t1, t2, dpc, tmp, i, j, node, old_par, new_par, old_ins, is_multi; par = this.get_node(par); pos = pos === undefined ? 0 : pos; if (!par) { return false; } if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return this.load_node(par, function () { this.copy_node(obj, par, pos, callback, true, false, origin); }); } if ($.isArray(obj)) { if (obj.length === 1) { obj = obj[0]; } else { //obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { if ((tmp = this.copy_node(obj[t1], par, pos, callback, is_loaded, true, origin))) { par = tmp; pos = "after"; } } this.redraw(); return true; } } obj = obj && obj.id ? obj : this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } old_par = (obj.parent || $.jstree.root).toString(); new_par = (!pos.toString().match(/^(before|after)$/) || par.id === $.jstree.root) ? par : this.get_node(par.parent); old_ins = origin ? origin : (this._model.data[obj.id] ? this : $.jstree.reference(obj.id)); is_multi = !old_ins || !old_ins._id || (this._id !== old_ins._id); if (old_ins && old_ins._id) { obj = old_ins._model.data[obj.id]; } if (par.id === $.jstree.root) { if (pos === "before") { pos = "first"; } if (pos === "after") { pos = "last"; } } switch (pos) { case "before": pos = $.inArray(par.id, new_par.children); break; case "after": pos = $.inArray(par.id, new_par.children) + 1; break; case "inside": case "first": pos = 0; break; case "last": pos = new_par.children.length; break; default: if (!pos) { pos = 0; } break; } if (pos > new_par.children.length) { pos = new_par.children.length; } if (!this.check("copy_node", obj, new_par, pos, { 'core': true, 'origin': origin, 'is_multi': (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign': (!old_ins || !old_ins._id) })) { this.settings.core.error.call(this, this._data.core.last_error); return false; } node = old_ins ? old_ins.get_json(obj, { no_id : true, no_data : true, no_state : true }) : obj; if (!node) { return false; } if (node.id === true) { delete node.id; } node = this._parse_model_from_json(node, new_par.id, new_par.parents.concat()); if (!node) { return false; } tmp = this.get_node(node); if (obj && obj.state && obj.state.loaded === false) { tmp.state.loaded = false; } dpc = []; dpc.push(node); dpc = dpc.concat(tmp.children_d); this.trigger('model', { "nodes": dpc, "parent": new_par.id }); // insert into new parent and up for (i = 0, j = new_par.parents.length; i < j; i++) { this._model.data[new_par.parents[i]].children_d = this._model.data[new_par.parents[i]].children_d.concat(dpc); } dpc = []; for (i = 0, j = new_par.children.length; i < j; i++) { dpc[i >= pos ? i + 1 : i] = new_par.children[i]; } dpc[pos] = tmp.id; new_par.children = dpc; new_par.children_d.push(tmp.id); new_par.children_d = new_par.children_d.concat(tmp.children_d); if (new_par.id === $.jstree.root) { this._model.force_full_redraw = true; } if (!this._model.force_full_redraw) { this._node_changed(new_par.id); } if (!skip_redraw) { this.redraw(new_par.id === $.jstree.root); } if (callback) { callback.call(this, tmp, new_par, pos); } /** * triggered when a node is copied * @event * @name copy_node.jstree * @param {Object} node the copied node * @param {Object} original the original node * @param {String} parent the parent's ID * @param {Number} position the position of the node among the parent's children * @param {String} old_parent the old parent of the node * @param {Number} old_position the position of the original node * @param {Boolean} is_multi do the node and new parent belong to different instances * @param {jsTree} old_instance the instance the node came from * @param {jsTree} new_instance the instance of the new parent */ this.trigger('copy_node', { "node": tmp, "original": obj, "parent": new_par.id, "position": pos, "old_parent": old_par, "old_position": old_ins && old_ins._id && old_par && old_ins._model.data[old_par] && old_ins._model.data[old_par].children ? $.inArray(obj.id, old_ins._model.data[old_par].children) : -1, 'is_multi' : (old_ins && old_ins._id && old_ins._id !== this._id), 'is_foreign' : (!old_ins || !old_ins._id), 'old_instance' : old_ins, 'new_instance' : this }); return tmp.id; }, /** * cut a node (a later call to `paste(obj)` would move the node) * @name cut(obj) * @param {mixed} obj multiple objects can be passed using an array * @trigger cut.jstree */ cut: function (obj) { if (!obj) { obj = this._data.core.selected.concat(); } if (!$.isArray(obj)) { obj = [obj]; } if (!obj.length) { return false; } var tmp = [], o, t1, t2; for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { o = this.get_node(obj[t1]); if (o && o.id && o.id !== $.jstree.root) { tmp.push(o); } } if (!tmp.length) { return false; } ccp_node = tmp; ccp_inst = this; ccp_mode = 'move_node'; /** * triggered when nodes are added to the buffer for moving * @event * @name cut.jstree * @param {Array} node */ this.trigger('cut', { "node": obj }); }, /** * copy a node (a later call to `paste(obj)` would copy the node) * @name copy(obj) * @param {mixed} obj multiple objects can be passed using an array * @trigger copy.jstree */ copy: function (obj) { if (!obj) { obj = this._data.core.selected.concat(); } if (!$.isArray(obj)) { obj = [obj]; } if (!obj.length) { return false; } var tmp = [], o, t1, t2; for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { o = this.get_node(obj[t1]); if (o && o.id && o.id !== $.jstree.root) { tmp.push(o); } } if (!tmp.length) { return false; } ccp_node = tmp; ccp_inst = this; ccp_mode = 'copy_node'; /** * triggered when nodes are added to the buffer for copying * @event * @name copy.jstree * @param {Array} node */ this.trigger('copy', { "node": obj }); }, /** * get the current buffer (any nodes that are waiting for a paste operation) * @name get_buffer() * @return {Object} an object consisting of `mode` ("copy_node" or "move_node"), `node` (an array of objects) and `inst` (the instance) */ get_buffer: function () { return { 'mode': ccp_mode, 'node': ccp_node, 'inst': ccp_inst }; }, /** * check if there is something in the buffer to paste * @name can_paste() * @return {Boolean} */ can_paste: function () { return ccp_mode !== false && ccp_node !== false; // && ccp_inst._model.data[ccp_node]; }, /** * copy or move the previously cut or copied nodes to a new parent * @name paste(obj [, pos]) * @param {mixed} obj the new parent * @param {mixed} pos the position to insert at (besides integer, "first" and "last" are supported), defaults to integer `0` * @trigger paste.jstree */ paste: function (obj, pos) { obj = this.get_node(obj); if (!obj || !ccp_mode || !ccp_mode.match(/^(copy_node|move_node)$/) || !ccp_node) { return false; } if (this[ccp_mode](ccp_node, obj, pos, false, false, false, ccp_inst)) { /** * triggered when paste is invoked * @event * @name paste.jstree * @param {String} parent the ID of the receiving node * @param {Array} node the nodes in the buffer * @param {String} mode the performed operation - "copy_node" or "move_node" */ this.trigger('paste', { "parent": obj.id, "node": ccp_node, "mode": ccp_mode }); } ccp_node = false; ccp_mode = false; ccp_inst = false; }, /** * clear the buffer of previously copied or cut nodes * @name clear_buffer() * @trigger clear_buffer.jstree */ clear_buffer: function () { ccp_node = false; ccp_mode = false; ccp_inst = false; /** * triggered when the copy / cut buffer is cleared * @event * @name clear_buffer.jstree */ this.trigger('clear_buffer'); }, /** * put a node in edit mode (input field to rename the node) * @name edit(obj [, default_text, callback]) * @param {mixed} obj * @param {String} default_text the text to populate the input with (if omitted or set to a non-string value the node's text value is used) * @param {Function} callback a function to be called once the text box is blurred, it is called in the instance's scope and receives the node, a status parameter (true if the rename is successful, false otherwise) and a boolean indicating if the user cancelled the edit. You can access the node's title using .text */ edit: function (obj, default_text, callback) { var rtl, w, a, s, t, h1, h2, fn, tmp, cancel = false; obj = this.get_node(obj); if (!obj) { return false; } if (!this.check("edit", obj, this.get_parent(obj))) { this.settings.core.error.call(this, this._data.core.last_error); return false; } tmp = obj; default_text = typeof default_text === 'string' ? default_text : obj.text; this.set_text(obj, ""); obj = this._open_to(obj); tmp.text = default_text; rtl = this._data.core.rtl; w = this.element.width(); this._data.core.focused = tmp.id; a = obj.children('.jstree-anchor').focus(); s = $(''); /*! oi = obj.children("i:visible"), ai = a.children("i:visible"), w1 = oi.width() * oi.length, w2 = ai.width() * ai.length, */ t = default_text; h1 = $("<" + "div />", { css: { "position": "absolute", "top": "-200px", "left": (rtl ? "0px" : "-1000px"), "visibility" : "hidden" } }).appendTo(document.body); h2 = $("<" + "input />", { "value": t, "class": "jstree-rename-input", // "size" : t.length, "css": { "padding": "0", "border": "1px solid silver", "box-sizing": "border-box", "display": "inline-block", "height": (this._data.core.li_height) + "px", "lineHeight": (this._data.core.li_height) + "px", "width": "150px" // will be set a bit further down }, "blur": $.proxy(function (e) { e.stopImmediatePropagation(); e.preventDefault(); var i = s.children(".jstree-rename-input"), v = i.val(), f = this.settings.core.force_text, nv; if (v === "") { v = t; } h1.remove(); s.replaceWith(a); s.remove(); t = f ? t : $('
').append($.parseHTML(t)).html(); obj = this.get_node(obj); this.set_text(obj, t); nv = !!this.rename_node(obj, f ? $('
').text(v).text() : $('
').append($.parseHTML(v)).html()); if (!nv) { this.set_text(obj, t); // move this up? and fix #483 } this._data.core.focused = tmp.id; setTimeout($.proxy(function () { var node = this.get_node(tmp.id, true); if (node.length) { this._data.core.focused = tmp.id; node.children('.jstree-anchor').focus(); } }, this), 0); if (callback) { callback.call(this, tmp, nv, cancel); } h2 = null; }, this), "keydown": function (e) { var key = e.which; if (key === 27) { cancel = true; this.value = t; } if (key === 27 || key === 13 || key === 37 || key === 38 || key === 39 || key === 40 || key === 32) { e.stopImmediatePropagation(); } if (key === 27 || key === 13) { e.preventDefault(); this.blur(); } }, "click": function (e) { e.stopImmediatePropagation(); }, "mousedown": function (e) { e.stopImmediatePropagation(); }, "keyup": function (e) { h2.width(Math.min(h1.text("pW" + this.value).width(), w)); }, "keypress": function (e) { if (e.which === 13) { return false; } } }); fn = { fontFamily: a.css('fontFamily') || '', fontSize: a.css('fontSize') || '', fontWeight: a.css('fontWeight') || '', fontStyle: a.css('fontStyle') || '', fontStretch: a.css('fontStretch') || '', fontVariant: a.css('fontVariant') || '', letterSpacing: a.css('letterSpacing') || '', wordSpacing: a.css('wordSpacing') || '' }; s.attr('class', a.attr('class')).append(a.contents().clone()).append(h2); a.replaceWith(s); h1.css(fn); h2.css(fn).width(Math.min(h1.text("pW" + h2[0].value).width(), w))[0].select(); $(document).one('mousedown.jstree touchstart.jstree dnd_start.vakata', function (e) { if (h2 && e.target !== h2) { $(h2).blur(); } }); }, /** * changes the theme * @name set_theme(theme_name [, theme_url]) * @param {String} theme_name the name of the new theme to apply * @param {mixed} theme_url the location of the CSS file for this theme. Omit or set to `false` if you manually included the file. Set to `true` to autoload from the `core.themes.dir` directory. * @trigger set_theme.jstree */ set_theme: function (theme_name, theme_url) { if (!theme_name) { return false; } if (theme_url === true) { var dir = this.settings.core.themes.dir; if (!dir) { dir = $.jstree.path + '/themes'; } theme_url = dir + '/' + theme_name + '/style.css'; } if (theme_url && $.inArray(theme_url, themes_loaded) === -1) { $('head').append('<' + 'link rel="stylesheet" href="' + theme_url + '" type="text/css" />'); themes_loaded.push(theme_url); } if (this._data.core.themes.name) { this.element.removeClass('jstree-' + this._data.core.themes.name); } this._data.core.themes.name = theme_name; this.element.addClass('jstree-' + theme_name); this.element[this.settings.core.themes.responsive ? 'addClass' : 'removeClass']('jstree-' + theme_name + '-responsive'); /** * triggered when a theme is set * @event * @name set_theme.jstree * @param {String} theme the new theme */ this.trigger('set_theme', { 'theme': theme_name }); }, /** * gets the name of the currently applied theme name * @name get_theme() * @return {String} */ get_theme: function () { return this._data.core.themes.name; }, /** * changes the theme variant (if the theme has variants) * @name set_theme_variant(variant_name) * @param {String|Boolean} variant_name the variant to apply (if `false` is used the current variant is removed) */ set_theme_variant: function (variant_name) { if (this._data.core.themes.variant) { this.element.removeClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); } this._data.core.themes.variant = variant_name; if (variant_name) { this.element.addClass('jstree-' + this._data.core.themes.name + '-' + this._data.core.themes.variant); } }, /** * gets the name of the currently applied theme variant * @name get_theme() * @return {String} */ get_theme_variant: function () { return this._data.core.themes.variant; }, /** * shows a striped background on the container (if the theme supports it) * @name show_stripes() */ show_stripes: function () { this._data.core.themes.stripes = true; this.get_container_ul().addClass("jstree-striped"); /** * triggered when stripes are shown * @event * @name show_stripes.jstree */ this.trigger('show_stripes'); }, /** * hides the striped background on the container * @name hide_stripes() */ hide_stripes: function () { this._data.core.themes.stripes = false; this.get_container_ul().removeClass("jstree-striped"); /** * triggered when stripes are hidden * @event * @name hide_stripes.jstree */ this.trigger('hide_stripes'); }, /** * toggles the striped background on the container * @name toggle_stripes() */ toggle_stripes: function () { if (this._data.core.themes.stripes) { this.hide_stripes(); } else { this.show_stripes(); } }, /** * shows the connecting dots (if the theme supports it) * @name show_dots() */ show_dots: function () { this._data.core.themes.dots = true; this.get_container_ul().removeClass("jstree-no-dots"); /** * triggered when dots are shown * @event * @name show_dots.jstree */ this.trigger('show_dots'); }, /** * hides the connecting dots * @name hide_dots() */ hide_dots: function () { this._data.core.themes.dots = false; this.get_container_ul().addClass("jstree-no-dots"); /** * triggered when dots are hidden * @event * @name hide_dots.jstree */ this.trigger('hide_dots'); }, /** * toggles the connecting dots * @name toggle_dots() */ toggle_dots: function () { if (this._data.core.themes.dots) { this.hide_dots(); } else { this.show_dots(); } }, /** * show the node icons * @name show_icons() */ show_icons: function () { this._data.core.themes.icons = true; this.get_container_ul().removeClass("jstree-no-icons"); /** * triggered when icons are shown * @event * @name show_icons.jstree */ this.trigger('show_icons'); }, /** * hide the node icons * @name hide_icons() */ hide_icons: function () { this._data.core.themes.icons = false; this.get_container_ul().addClass("jstree-no-icons"); /** * triggered when icons are hidden * @event * @name hide_icons.jstree */ this.trigger('hide_icons'); }, /** * toggle the node icons * @name toggle_icons() */ toggle_icons: function () { if (this._data.core.themes.icons) { this.hide_icons(); } else { this.show_icons(); } }, /** * show the node ellipsis * @name show_icons() */ show_ellipsis: function () { this._data.core.themes.ellipsis = true; this.get_container_ul().addClass("jstree-ellipsis"); /** * triggered when ellisis is shown * @event * @name show_ellipsis.jstree */ this.trigger('show_ellipsis'); }, /** * hide the node ellipsis * @name hide_ellipsis() */ hide_ellipsis: function () { this._data.core.themes.ellipsis = false; this.get_container_ul().removeClass("jstree-ellipsis"); /** * triggered when ellisis is hidden * @event * @name hide_ellipsis.jstree */ this.trigger('hide_ellipsis'); }, /** * toggle the node ellipsis * @name toggle_icons() */ toggle_ellipsis: function () { if (this._data.core.themes.ellipsis) { this.hide_ellipsis(); } else { this.show_ellipsis(); } }, /** * set the node icon for a node * @name set_icon(obj, icon) * @param {mixed} obj * @param {String} icon the new icon - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class */ set_icon: function (obj, icon) { var t1, t2, dom, old; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_icon(obj[t1], icon); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } old = obj.icon; obj.icon = icon === true || icon === null || icon === undefined || icon === '' ? true : icon; dom = this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon"); if (icon === false) { dom.removeClass('jstree-themeicon-custom ' + old).css("background", "").removeAttr("rel"); this.hide_icon(obj); } else if (icon === true || icon === null || icon === undefined || icon === '') { dom.removeClass('jstree-themeicon-custom ' + old).css("background", "").removeAttr("rel"); if (old === false) { this.show_icon(obj); } } else if (icon.indexOf("/") === -1 && icon.indexOf(".") === -1) { dom.removeClass(old).css("background", ""); dom.addClass(icon + ' jstree-themeicon-custom').attr("rel", icon); if (old === false) { this.show_icon(obj); } } else { dom.removeClass(old).css("background", ""); dom.addClass('jstree-themeicon-custom').css("background", "url('" + icon + "') center center no-repeat").attr("rel", icon); if (old === false) { this.show_icon(obj); } } return true; }, /** * get the node icon for a node * @name get_icon(obj) * @param {mixed} obj * @return {String} */ get_icon: function (obj) { obj = this.get_node(obj); return (!obj || obj.id === $.jstree.root) ? false : obj.icon; }, /** * hide the icon on an individual node * @name hide_icon(obj) * @param {mixed} obj */ hide_icon: function (obj) { var t1, t2; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.hide_icon(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj === $.jstree.root) { return false; } obj.icon = false; this.get_node(obj, true).children(".jstree-anchor").children(".jstree-themeicon").addClass('jstree-themeicon-hidden'); return true; }, /** * show the icon on an individual node * @name show_icon(obj) * @param {mixed} obj */ show_icon: function (obj) { var t1, t2, dom; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.show_icon(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj === $.jstree.root) { return false; } dom = this.get_node(obj, true); obj.icon = dom.length ? dom.children(".jstree-anchor").children(".jstree-themeicon").attr('rel') : true; if (!obj.icon) { obj.icon = true; } dom.children(".jstree-anchor").children(".jstree-themeicon").removeClass('jstree-themeicon-hidden'); return true; } }; // helpers $.vakata = {}; // collect attributes $.vakata.attributes = function (node, with_values) { node = $(node)[0]; var attr = with_values ? {} : []; if (node && node.attributes) { $.each(node.attributes, function (i, v) { if ($.inArray(v.name.toLowerCase(), ['style', 'contenteditable', 'hasfocus', 'tabindex']) !== -1) { return; } if (v.value !== null && $.trim(v.value) !== '') { if (with_values) { attr[v.name] = v.value; } else { attr.push(v.name); } } }); } return attr; }; $.vakata.array_unique = function (array) { var a = [], i, j, l, o = {}; for (i = 0, l = array.length; i < l; i++) { if (o[array[i]] === undefined) { a.push(array[i]); o[array[i]] = true; } } return a; }; // remove item from array $.vakata.array_remove = function (array, from) { array.splice(from, 1); return array; //var rest = array.slice((to || from) + 1 || array.length); //array.length = from < 0 ? array.length + from : from; //array.push.apply(array, rest); //return array; }; // remove item from array $.vakata.array_remove_item = function (array, item) { var tmp = $.inArray(item, array); return tmp !== -1 ? $.vakata.array_remove(array, tmp) : array; }; $.vakata.array_filter = function (c, a, b, d, e) { if (c.filter) { return c.filter(a, b); } d = []; for (e in c) { if (~~e + '' === e + '' && e >= 0 && a.call(b, c[e], +e, c)) { d.push(c[e]); } } return d; }; /** * ### Changed plugin * * This plugin adds more information to the `changed.jstree` event. The new data is contained in the `changed` event data property, and contains a lists of `selected` and `deselected` nodes. */ $.jstree.plugins.changed = function (options, parent) { var last = []; this.trigger = function (ev, data) { var i, j; if (!data) { data = {}; } if (ev.replace('.jstree', '') === 'changed') { data.changed = { selected: [], deselected: [] }; var tmp = {}; for (i = 0, j = last.length; i < j; i++) { tmp[last[i]] = 1; } for (i = 0, j = data.selected.length; i < j; i++) { if (!tmp[data.selected[i]]) { data.changed.selected.push(data.selected[i]); } else { tmp[data.selected[i]] = 2; } } for (i = 0, j = last.length; i < j; i++) { if (tmp[last[i]] === 1) { data.changed.deselected.push(last[i]); } } last = data.selected.slice(); } /** * triggered when selection changes (the "changed" plugin enhances the original event with more data) * @event * @name changed.jstree * @param {Object} node * @param {Object} action the action that caused the selection to change * @param {Array} selected the current selection * @param {Object} changed an object containing two properties `selected` and `deselected` - both arrays of node IDs, which were selected or deselected since the last changed event * @param {Object} event the event (if any) that triggered this changed event * @plugin changed */ parent.trigger.call(this, ev, data); }; this.refresh = function (skip_loading, forget_state) { last = []; return parent.refresh.apply(this, arguments); }; }; /** * ### Checkbox plugin * * This plugin renders checkbox icons in front of each node, making multiple selection much easier. * It also supports tri-state behavior, meaning that if a node has a few of its children checked it will be rendered as undetermined, and state will be propagated up. */ var _i = document.createElement('I'); _i.className = 'jstree-icon jstree-checkbox'; _i.setAttribute('role', 'presentation'); /** * stores all defaults for the checkbox plugin * @name $.jstree.defaults.checkbox * @plugin checkbox */ $.jstree.defaults.checkbox = { /** * a boolean indicating if checkboxes should be visible (can be changed at a later time using `show_checkboxes()` and `hide_checkboxes`). Defaults to `true`. * @name $.jstree.defaults.checkbox.visible * @plugin checkbox */ visible: true, /** * a boolean indicating if checkboxes should cascade down and have an undetermined state. Defaults to `true`. * @name $.jstree.defaults.checkbox.three_state * @plugin checkbox */ three_state: true, /** * a boolean indicating if clicking anywhere on the node should act as clicking on the checkbox. Defaults to `true`. * @name $.jstree.defaults.checkbox.whole_node * @plugin checkbox */ whole_node: true, /** * a boolean indicating if the selected style of a node should be kept, or removed. Defaults to `true`. * @name $.jstree.defaults.checkbox.keep_selected_style * @plugin checkbox */ keep_selected_style: true, /** * This setting controls how cascading and undetermined nodes are applied. * If 'up' is in the string - cascading up is enabled, if 'down' is in the string - cascading down is enabled, if 'undetermined' is in the string - undetermined nodes will be used. * If `three_state` is set to `true` this setting is automatically set to 'up+down+undetermined'. Defaults to ''. * @name $.jstree.defaults.checkbox.cascade * @plugin checkbox */ cascade: '', /** * This setting controls if checkbox are bound to the general tree selection or to an internal array maintained by the checkbox plugin. Defaults to `true`, only set to `false` if you know exactly what you are doing. * @name $.jstree.defaults.checkbox.tie_selection * @plugin checkbox */ tie_selection: true, /** * This setting controls if cascading down affects disabled checkboxes * @name $.jstree.defaults.checkbox.cascade_to_disabled * @plugin checkbox */ cascade_to_disabled: true, /** * This setting controls if cascading down affects hidden checkboxes * @name $.jstree.defaults.checkbox.cascade_to_hidden * @plugin checkbox */ cascade_to_hidden: true }; $.jstree.plugins.checkbox = function (options, parent) { this.bind = function () { parent.bind.call(this); this._data.checkbox.uto = false; this._data.checkbox.selected = []; if (this.settings.checkbox.three_state) { this.settings.checkbox.cascade = 'up+down+undetermined'; } this.element .on("init.jstree", $.proxy(function () { this._data.checkbox.visible = this.settings.checkbox.visible; if (!this.settings.checkbox.keep_selected_style) { this.element.addClass('jstree-checkbox-no-clicked'); } if (this.settings.checkbox.tie_selection) { this.element.addClass('jstree-checkbox-selection'); } }, this)) .on("loading.jstree", $.proxy(function () { this[this._data.checkbox.visible ? 'show_checkboxes' : 'hide_checkboxes'](); }, this)); if (this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { this.element .on('changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree', $.proxy(function () { // only if undetermined is in setting if (this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50); }, this)); } if (!this.settings.checkbox.tie_selection) { this.element .on('model.jstree', $.proxy(function (e, data) { var m = this._model.data, p = m[data.parent], dpc = data.nodes, i, j; for (i = 0, j = dpc.length; i < j; i++) { m[dpc[i]].state.checked = m[dpc[i]].state.checked || (m[dpc[i]].original && m[dpc[i]].original.state && m[dpc[i]].original.state.checked); if (m[dpc[i]].state.checked) { this._data.checkbox.selected.push(dpc[i]); } } }, this)); } if (this.settings.checkbox.cascade.indexOf('up') !== -1 || this.settings.checkbox.cascade.indexOf('down') !== -1) { this.element .on('model.jstree', $.proxy(function (e, data) { var m = this._model.data, p = m[data.parent], dpc = data.nodes, chd = [], c, i, j, k, l, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection; if (s.indexOf('down') !== -1) { // apply down if (p.state[t ? 'selected' : 'checked']) { for (i = 0, j = dpc.length; i < j; i++) { m[dpc[i]].state[t ? 'selected' : 'checked'] = true; } this._data[t ? 'core' : 'checkbox'].selected = this._data[t ? 'core' : 'checkbox'].selected.concat(dpc); } else { for (i = 0, j = dpc.length; i < j; i++) { if (m[dpc[i]].state[t ? 'selected' : 'checked']) { for (k = 0, l = m[dpc[i]].children_d.length; k < l; k++) { m[m[dpc[i]].children_d[k]].state[t ? 'selected' : 'checked'] = true; } this._data[t ? 'core' : 'checkbox'].selected = this._data[t ? 'core' : 'checkbox'].selected.concat(m[dpc[i]].children_d); } } } } if (s.indexOf('up') !== -1) { // apply up for (i = 0, j = p.children_d.length; i < j; i++) { if (!m[p.children_d[i]].children.length) { chd.push(m[p.children_d[i]].parent); } } chd = $.vakata.array_unique(chd); for (k = 0, l = chd.length; k < l; k++) { p = m[chd[k]]; while (p && p.id !== $.jstree.root) { c = 0; for (i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[t ? 'selected' : 'checked']; } if (c === j) { p.state[t ? 'selected' : 'checked'] = true; this._data[t ? 'core' : 'checkbox'].selected.push(p.id); tmp = this.get_node(p, true); if (tmp && tmp.length) { tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } } } this._data[t ? 'core' : 'checkbox'].selected = $.vakata.array_unique(this._data[t ? 'core' : 'checkbox'].selected); }, this)) .on(this.settings.checkbox.tie_selection ? 'select_node.jstree' : 'check_node.jstree', $.proxy(function (e, data) { var self = this, obj = data.node, m = this._model.data, par = this.get_node(obj.parent), i, j, c, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, sel = {}, cur = this._data[t ? 'core' : 'checkbox'].selected; for (i = 0, j = cur.length; i < j; i++) { sel[cur[i]] = true; } // apply down if (s.indexOf('down') !== -1) { //this._data[ t ? 'core' : 'checkbox' ].selected = $.vakata.array_unique(this._data[ t ? 'core' : 'checkbox' ].selected.concat(obj.children_d)); var selectedIds = this._cascade_new_checked_state(obj.id, true); var temp = obj.children_d.concat(obj.id); for (i = 0, j = temp.length; i < j; i++) { if (selectedIds.indexOf(temp[i]) > -1) { sel[temp[i]] = true; } else { delete sel[temp[i]]; } } } // apply up if (s.indexOf('up') !== -1) { while (par && par.id !== $.jstree.root) { c = 0; for (i = 0, j = par.children.length; i < j; i++) { c += m[par.children[i]].state[t ? 'selected' : 'checked']; } if (c === j) { par.state[t ? 'selected' : 'checked'] = true; sel[par.id] = true; //this._data[ t ? 'core' : 'checkbox' ].selected.push(par.id); tmp = this.get_node(par, true); if (tmp && tmp.length) { tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } par = this.get_node(par.parent); } } cur = []; for (i in sel) { if (sel.hasOwnProperty(i)) { cur.push(i); } } this._data[t ? 'core' : 'checkbox'].selected = cur; }, this)) .on(this.settings.checkbox.tie_selection ? 'deselect_all.jstree' : 'uncheck_all.jstree', $.proxy(function (e, data) { var obj = this.get_node($.jstree.root), m = this._model.data, i, j, tmp; for (i = 0, j = obj.children_d.length; i < j; i++) { tmp = m[obj.children_d[i]]; if (tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { tmp.original.state.undetermined = false; } } }, this)) .on(this.settings.checkbox.tie_selection ? 'deselect_node.jstree' : 'uncheck_node.jstree', $.proxy(function (e, data) { var self = this, obj = data.node, dom = this.get_node(obj, true), i, j, tmp, s = this.settings.checkbox.cascade, t = this.settings.checkbox.tie_selection, cur = this._data[t ? 'core' : 'checkbox'].selected, sel = {}, stillSelectedIds = [], allIds = obj.children_d.concat(obj.id); // apply down if (s.indexOf('down') !== -1) { var selectedIds = this._cascade_new_checked_state(obj.id, false); cur = cur.filter(function (id) { return allIds.indexOf(id) === -1 || selectedIds.indexOf(id) > -1; }); } // only apply up if cascade up is enabled and if this node is not selected // (if all child nodes are disabled and cascade_to_disabled === false then this node will till be selected). if (s.indexOf('up') !== -1 && cur.indexOf(obj.id) === -1) { for (i = 0, j = obj.parents.length; i < j; i++) { tmp = this._model.data[obj.parents[i]]; tmp.state[t ? 'selected' : 'checked'] = false; if (tmp && tmp.original && tmp.original.state && tmp.original.state.undetermined) { tmp.original.state.undetermined = false; } tmp = this.get_node(obj.parents[i], true); if (tmp && tmp.length) { tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } cur = cur.filter(function (id) { return obj.parents.indexOf(id) === -1; }); } this._data[t ? 'core' : 'checkbox'].selected = cur; }, this)); } if (this.settings.checkbox.cascade.indexOf('up') !== -1) { this.element .on('delete_node.jstree', $.proxy(function (e, data) { // apply up (whole handler) var p = this.get_node(data.parent), m = this._model.data, i, j, c, tmp, t = this.settings.checkbox.tie_selection; while (p && p.id !== $.jstree.root && !p.state[t ? 'selected' : 'checked']) { c = 0; for (i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[t ? 'selected' : 'checked']; } if (j > 0 && c === j) { p.state[t ? 'selected' : 'checked'] = true; this._data[t ? 'core' : 'checkbox'].selected.push(p.id); tmp = this.get_node(p, true); if (tmp && tmp.length) { tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } }, this)) .on('move_node.jstree', $.proxy(function (e, data) { // apply up (whole handler) var is_multi = data.is_multi, old_par = data.old_parent, new_par = this.get_node(data.parent), m = this._model.data, p, c, i, j, tmp, t = this.settings.checkbox.tie_selection; if (!is_multi) { p = this.get_node(old_par); while (p && p.id !== $.jstree.root && !p.state[t ? 'selected' : 'checked']) { c = 0; for (i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[t ? 'selected' : 'checked']; } if (j > 0 && c === j) { p.state[t ? 'selected' : 'checked'] = true; this._data[t ? 'core' : 'checkbox'].selected.push(p.id); tmp = this.get_node(p, true); if (tmp && tmp.length) { tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } p = this.get_node(p.parent); } } p = new_par; while (p && p.id !== $.jstree.root) { c = 0; for (i = 0, j = p.children.length; i < j; i++) { c += m[p.children[i]].state[t ? 'selected' : 'checked']; } if (c === j) { if (!p.state[t ? 'selected' : 'checked']) { p.state[t ? 'selected' : 'checked'] = true; this._data[t ? 'core' : 'checkbox'].selected.push(p.id); tmp = this.get_node(p, true); if (tmp && tmp.length) { tmp.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } } } else { if (p.state[t ? 'selected' : 'checked']) { p.state[t ? 'selected' : 'checked'] = false; this._data[t ? 'core' : 'checkbox'].selected = $.vakata.array_remove_item(this._data[t ? 'core' : 'checkbox'].selected, p.id); tmp = this.get_node(p, true); if (tmp && tmp.length) { tmp.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { break; } } p = this.get_node(p.parent); } }, this)); } }; /** * get an array of all nodes whose state is "undetermined" * @name get_undetermined([full]) * @param {boolean} full: if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_undetermined = function (full) { if (this.settings.checkbox.cascade.indexOf('undetermined') === -1) { return []; } var i, j, k, l, o = {}, m = this._model.data, t = this.settings.checkbox.tie_selection, s = this._data[t ? 'core' : 'checkbox'].selected, p = [], tt = this, r = []; for (i = 0, j = s.length; i < j; i++) { if (m[s[i]] && m[s[i]].parents) { for (k = 0, l = m[s[i]].parents.length; k < l; k++) { if (o[m[s[i]].parents[k]] !== undefined) { break; } if (m[s[i]].parents[k] !== $.jstree.root) { o[m[s[i]].parents[k]] = true; p.push(m[s[i]].parents[k]); } } } } // attempt for server side undetermined state this.element.find('.jstree-closed').not(':has(.jstree-children)') .each(function () { var tmp = tt.get_node(this), tmp2; if (!tmp) { return; } if (!tmp.state.loaded) { if (tmp.original && tmp.original.state && tmp.original.state.undetermined && tmp.original.state.undetermined === true) { if (o[tmp.id] === undefined && tmp.id !== $.jstree.root) { o[tmp.id] = true; p.push(tmp.id); } for (k = 0, l = tmp.parents.length; k < l; k++) { if (o[tmp.parents[k]] === undefined && tmp.parents[k] !== $.jstree.root) { o[tmp.parents[k]] = true; p.push(tmp.parents[k]); } } } } else { for (i = 0, j = tmp.children_d.length; i < j; i++) { tmp2 = m[tmp.children_d[i]]; if (!tmp2.state.loaded && tmp2.original && tmp2.original.state && tmp2.original.state.undetermined && tmp2.original.state.undetermined === true) { if (o[tmp2.id] === undefined && tmp2.id !== $.jstree.root) { o[tmp2.id] = true; p.push(tmp2.id); } for (k = 0, l = tmp2.parents.length; k < l; k++) { if (o[tmp2.parents[k]] === undefined && tmp2.parents[k] !== $.jstree.root) { o[tmp2.parents[k]] = true; p.push(tmp2.parents[k]); } } } } } }); for (i = 0, j = p.length; i < j; i++) { if (!m[p[i]].state[t ? 'selected' : 'checked']) { r.push(full ? m[p[i]] : p[i]); } } return r; }; /** * set the undetermined state where and if necessary. Used internally. * @private * @name _undetermined() * @plugin checkbox */ this._undetermined = function () { if (this.element === null) { return; } var p = this.get_undetermined(false), i, j, s; this.element.find('.jstree-undetermined').removeClass('jstree-undetermined'); for (i = 0, j = p.length; i < j; i++) { s = this.get_node(p[i], true); if (s && s.length) { s.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-undetermined'); } } }; this.redraw_node = function (obj, deep, is_callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if (obj) { var i, j, tmp = null, icon = null; for (i = 0, j = obj.childNodes.length; i < j; i++) { if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if (tmp) { if (!this.settings.checkbox.tie_selection && this._model.data[obj.id].state.checked) { tmp.className += ' jstree-checked'; } icon = _i.cloneNode(false); if (this._model.data[obj.id].state.checkbox_disabled) { icon.className += ' jstree-checkbox-disabled'; } tmp.insertBefore(icon, tmp.childNodes[0]); } } if (!is_callback && this.settings.checkbox.cascade.indexOf('undetermined') !== -1) { if (this._data.checkbox.uto) { clearTimeout(this._data.checkbox.uto); } this._data.checkbox.uto = setTimeout($.proxy(this._undetermined, this), 50); } return obj; }; /** * show the node checkbox icons * @name show_checkboxes() * @plugin checkbox */ this.show_checkboxes = function () { this._data.core.themes.checkboxes = true; this.get_container_ul().removeClass("jstree-no-checkboxes"); }; /** * hide the node checkbox icons * @name hide_checkboxes() * @plugin checkbox */ this.hide_checkboxes = function () { this._data.core.themes.checkboxes = false; this.get_container_ul().addClass("jstree-no-checkboxes"); }; /** * toggle the node icons * @name toggle_checkboxes() * @plugin checkbox */ this.toggle_checkboxes = function () { if (this._data.core.themes.checkboxes) { this.hide_checkboxes(); } else { this.show_checkboxes(); } }; /** * checks if a node is in an undetermined state * @name is_undetermined(obj) * @param {mixed} obj * @return {Boolean} */ this.is_undetermined = function (obj) { obj = this.get_node(obj); var s = this.settings.checkbox.cascade, i, j, t = this.settings.checkbox.tie_selection, d = this._data[t ? 'core' : 'checkbox'].selected, m = this._model.data; if (!obj || obj.state[t ? 'selected' : 'checked'] === true || s.indexOf('undetermined') === -1 || (s.indexOf('down') === -1 && s.indexOf('up') === -1)) { return false; } if (!obj.state.loaded && obj.original.state.undetermined === true) { return true; } for (i = 0, j = obj.children_d.length; i < j; i++) { if ($.inArray(obj.children_d[i], d) !== -1 || (!m[obj.children_d[i]].state.loaded && m[obj.children_d[i]].original.state.undetermined)) { return true; } } return false; }; /** * disable a node's checkbox * @name disable_checkbox(obj) * @param {mixed} obj an array can be used too * @trigger disable_checkbox.jstree * @plugin checkbox */ this.disable_checkbox = function (obj) { var t1, t2, dom; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.disable_checkbox(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (!obj.state.checkbox_disabled) { obj.state.checkbox_disabled = true; if (dom && dom.length) { dom.children('.jstree-anchor').children('.jstree-checkbox').addClass('jstree-checkbox-disabled'); } /** * triggered when an node's checkbox is disabled * @event * @name disable_checkbox.jstree * @param {Object} node * @plugin checkbox */ this.trigger('disable_checkbox', { 'node': obj }); } }; /** * enable a node's checkbox * @name disable_checkbox(obj) * @param {mixed} obj an array can be used too * @trigger enable_checkbox.jstree * @plugin checkbox */ this.enable_checkbox = function (obj) { var t1, t2, dom; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.enable_checkbox(obj[t1]); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (obj.state.checkbox_disabled) { obj.state.checkbox_disabled = false; if (dom && dom.length) { dom.children('.jstree-anchor').children('.jstree-checkbox').removeClass('jstree-checkbox-disabled'); } /** * triggered when an node's checkbox is enabled * @event * @name enable_checkbox.jstree * @param {Object} node * @plugin checkbox */ this.trigger('enable_checkbox', { 'node': obj }); } }; this.activate_node = function (obj, e) { if ($(e.target).hasClass('jstree-checkbox-disabled')) { return false; } if (this.settings.checkbox.tie_selection && (this.settings.checkbox.whole_node || $(e.target).hasClass('jstree-checkbox'))) { e.ctrlKey = true; } if (this.settings.checkbox.tie_selection || (!this.settings.checkbox.whole_node && !$(e.target).hasClass('jstree-checkbox'))) { return parent.activate_node.call(this, obj, e); } if (this.is_disabled(obj)) { return false; } if (this.is_checked(obj)) { this.uncheck_node(obj, e); } else { this.check_node(obj, e); } this.trigger('activate_node', { 'node': this.get_node(obj) }); }; /** * Cascades checked state to a node and all its descendants. This function does NOT affect hidden and disabled nodes (or their descendants). * However if these unaffected nodes are already selected their ids will be included in the returned array. * @private * @param {string} id the node ID * @param {bool} checkedState should the nodes be checked or not * @returns {Array} Array of all node id's (in this tree branch) that are checked. */ this._cascade_new_checked_state = function (id, checkedState) { var self = this; var t = this.settings.checkbox.tie_selection; var node = this._model.data[id]; var selectedNodeIds = []; var selectedChildrenIds = [], i, j, selectedChildIds; if ( (this.settings.checkbox.cascade_to_disabled || !node.state.disabled) && (this.settings.checkbox.cascade_to_hidden || !node.state.hidden) ) { //First try and check/uncheck the children if (node.children) { for (i = 0, j = node.children.length; i < j; i++) { var childId = node.children[i]; selectedChildIds = self._cascade_new_checked_state(childId, checkedState); selectedNodeIds = selectedNodeIds.concat(selectedChildIds); if (selectedChildIds.indexOf(childId) > -1) { selectedChildrenIds.push(childId); } } } var dom = self.get_node(node, true); //A node's state is undetermined if some but not all of it's children are checked/selected . var undetermined = selectedChildrenIds.length > 0 && selectedChildrenIds.length < node.children.length; if (node.original && node.original.state && node.original.state.undetermined) { node.original.state.undetermined = undetermined; } //If a node is undetermined then remove selected class if (undetermined) { node.state[t ? 'selected' : 'checked'] = false; dom.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } //Otherwise, if the checkedState === true (i.e. the node is being checked now) and all of the node's children are checked (if it has any children), //check the node and style it correctly. else if (checkedState && selectedChildrenIds.length === node.children.length) { node.state[t ? 'selected' : 'checked'] = checkedState; selectedNodeIds.push(node.id); dom.attr('aria-selected', true).children('.jstree-anchor').addClass(t ? 'jstree-clicked' : 'jstree-checked'); } else { node.state[t ? 'selected' : 'checked'] = false; dom.attr('aria-selected', false).children('.jstree-anchor').removeClass(t ? 'jstree-clicked' : 'jstree-checked'); } } else { selectedChildIds = this.get_checked_descendants(id); if (node.state[t ? 'selected' : 'checked']) { selectedChildIds.push(node.id); } selectedNodeIds = selectedNodeIds.concat(selectedChildIds); } return selectedNodeIds; }; /** * Gets ids of nodes selected in branch (of tree) specified by id (does not include the node specified by id) * @name get_checked_descendants(obj) * @param {string} id the node ID * @return {Array} array of IDs * @plugin checkbox */ this.get_checked_descendants = function (id) { var self = this; var t = self.settings.checkbox.tie_selection; var node = self._model.data[id]; return node.children_d.filter(function (_id) { return self._model.data[_id].state[t ? 'selected' : 'checked']; }); }; /** * check a node (only if tie_selection in checkbox settings is false, otherwise select_node will be called internally) * @name check_node(obj) * @param {mixed} obj an array can be used to check multiple nodes * @trigger check_node.jstree * @plugin checkbox */ this.check_node = function (obj, e) { if (this.settings.checkbox.tie_selection) { return this.select_node(obj, false, true, e); } var dom, t1, t2, th; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.check_node(obj[t1], e); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (!obj.state.checked) { obj.state.checked = true; this._data.checkbox.selected.push(obj.id); if (dom && dom.length) { dom.children('.jstree-anchor').addClass('jstree-checked'); } /** * triggered when an node is checked (only if tie_selection in checkbox settings is false) * @event * @name check_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this check_node * @plugin checkbox */ this.trigger('check_node', { 'node': obj, 'selected': this._data.checkbox.selected, 'event': e }); } }; /** * uncheck a node (only if tie_selection in checkbox settings is false, otherwise deselect_node will be called internally) * @name uncheck_node(obj) * @param {mixed} obj an array can be used to uncheck multiple nodes * @trigger uncheck_node.jstree * @plugin checkbox */ this.uncheck_node = function (obj, e) { if (this.settings.checkbox.tie_selection) { return this.deselect_node(obj, false, e); } var t1, t2, dom; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.uncheck_node(obj[t1], e); } return true; } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } dom = this.get_node(obj, true); if (obj.state.checked) { obj.state.checked = false; this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, obj.id); if (dom.length) { dom.children('.jstree-anchor').removeClass('jstree-checked'); } /** * triggered when an node is unchecked (only if tie_selection in checkbox settings is false) * @event * @name uncheck_node.jstree * @param {Object} node * @param {Array} selected the current selection * @param {Object} event the event (if any) that triggered this uncheck_node * @plugin checkbox */ this.trigger('uncheck_node', { 'node': obj, 'selected': this._data.checkbox.selected, 'event': e }); } }; /** * checks all nodes in the tree (only if tie_selection in checkbox settings is false, otherwise select_all will be called internally) * @name check_all() * @trigger check_all.jstree, changed.jstree * @plugin checkbox */ this.check_all = function () { if (this.settings.checkbox.tie_selection) { return this.select_all(); } var tmp = this._data.checkbox.selected.concat([]), i, j; this._data.checkbox.selected = this._model.data[$.jstree.root].children_d.concat(); for (i = 0, j = this._data.checkbox.selected.length; i < j; i++) { if (this._model.data[this._data.checkbox.selected[i]]) { this._model.data[this._data.checkbox.selected[i]].state.checked = true; } } this.redraw(true); /** * triggered when all nodes are checked (only if tie_selection in checkbox settings is false) * @event * @name check_all.jstree * @param {Array} selected the current selection * @plugin checkbox */ this.trigger('check_all', { 'selected': this._data.checkbox.selected }); }; /** * uncheck all checked nodes (only if tie_selection in checkbox settings is false, otherwise deselect_all will be called internally) * @name uncheck_all() * @trigger uncheck_all.jstree * @plugin checkbox */ this.uncheck_all = function () { if (this.settings.checkbox.tie_selection) { return this.deselect_all(); } var tmp = this._data.checkbox.selected.concat([]), i, j; for (i = 0, j = this._data.checkbox.selected.length; i < j; i++) { if (this._model.data[this._data.checkbox.selected[i]]) { this._model.data[this._data.checkbox.selected[i]].state.checked = false; } } this._data.checkbox.selected = []; this.element.find('.jstree-checked').removeClass('jstree-checked'); /** * triggered when all nodes are unchecked (only if tie_selection in checkbox settings is false) * @event * @name uncheck_all.jstree * @param {Object} node the previous selection * @param {Array} selected the current selection * @plugin checkbox */ this.trigger('uncheck_all', { 'selected': this._data.checkbox.selected, 'node': tmp }); }; /** * checks if a node is checked (if tie_selection is on in the settings this function will return the same as is_selected) * @name is_checked(obj) * @param {mixed} obj * @return {Boolean} * @plugin checkbox */ this.is_checked = function (obj) { if (this.settings.checkbox.tie_selection) { return this.is_selected(obj); } obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } return obj.state.checked; }; /** * get an array of all checked nodes (if tie_selection is on in the settings this function will return the same as get_selected) * @name get_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_checked = function (full) { if (this.settings.checkbox.tie_selection) { return this.get_selected(full); } return full ? $.map(this._data.checkbox.selected, $.proxy(function (i) { return this.get_node(i); }, this)) : this._data.checkbox.selected; }; /** * get an array of all top level checked nodes (ignoring children of checked nodes) (if tie_selection is on in the settings this function will return the same as get_top_selected) * @name get_top_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_top_checked = function (full) { if (this.settings.checkbox.tie_selection) { return this.get_top_selected(full); } var tmp = this.get_checked(true), obj = {}, i, j, k, l; for (i = 0, j = tmp.length; i < j; i++) { obj[tmp[i].id] = tmp[i]; } for (i = 0, j = tmp.length; i < j; i++) { for (k = 0, l = tmp[i].children_d.length; k < l; k++) { if (obj[tmp[i].children_d[k]]) { delete obj[tmp[i].children_d[k]]; } } } tmp = []; for (i in obj) { if (obj.hasOwnProperty(i)) { tmp.push(i); } } return full ? $.map(tmp, $.proxy(function (i) { return this.get_node(i); }, this)) : tmp; }; /** * get an array of all bottom level checked nodes (ignoring selected parents) (if tie_selection is on in the settings this function will return the same as get_bottom_selected) * @name get_bottom_checked([full]) * @param {mixed} full if set to `true` the returned array will consist of the full node objects, otherwise - only IDs will be returned * @return {Array} * @plugin checkbox */ this.get_bottom_checked = function (full) { if (this.settings.checkbox.tie_selection) { return this.get_bottom_selected(full); } var tmp = this.get_checked(true), obj = [], i, j; for (i = 0, j = tmp.length; i < j; i++) { if (!tmp[i].children.length) { obj.push(tmp[i].id); } } return full ? $.map(obj, $.proxy(function (i) { return this.get_node(i); }, this)) : obj; }; this.load_node = function (obj, callback) { var k, l, i, j, c, tmp; if (!$.isArray(obj) && !this.settings.checkbox.tie_selection) { tmp = this.get_node(obj); if (tmp && tmp.state.loaded) { for (k = 0, l = tmp.children_d.length; k < l; k++) { if (this._model.data[tmp.children_d[k]].state.checked) { c = true; this._data.checkbox.selected = $.vakata.array_remove_item(this._data.checkbox.selected, tmp.children_d[k]); } } } } return parent.load_node.apply(this, arguments); }; this.get_state = function () { var state = parent.get_state.apply(this, arguments); if (this.settings.checkbox.tie_selection) { return state; } state.checkbox = this._data.checkbox.selected.slice(); return state; }; this.set_state = function (state, callback) { var res = parent.set_state.apply(this, arguments); if (res && state.checkbox) { if (!this.settings.checkbox.tie_selection) { this.uncheck_all(); var _this = this; $.each(state.checkbox, function (i, v) { _this.check_node(v); }); } delete state.checkbox; this.set_state(state, callback); return false; } return res; }; this.refresh = function (skip_loading, forget_state) { if (this.settings.checkbox.tie_selection) { this._data.checkbox.selected = []; } return parent.refresh.apply(this, arguments); }; }; // include the checkbox plugin by default // $.jstree.defaults.plugins.push("checkbox"); /** * ### Conditionalselect plugin * * This plugin allows defining a callback to allow or deny node selection by user input (activate node method). */ /** * a callback (function) which is invoked in the instance's scope and receives two arguments - the node and the event that triggered the `activate_node` call. Returning false prevents working with the node, returning true allows invoking activate_node. Defaults to returning `true`. * @name $.jstree.defaults.checkbox.visible * @plugin checkbox */ $.jstree.defaults.conditionalselect = function () { return true; }; $.jstree.plugins.conditionalselect = function (options, parent) { // own function this.activate_node = function (obj, e) { if (this.settings.conditionalselect.call(this, this.get_node(obj), e)) { return parent.activate_node.call(this, obj, e); } }; }; /** * ### Contextmenu plugin * * Shows a context menu when a node is right-clicked. */ /** * stores all defaults for the contextmenu plugin * @name $.jstree.defaults.contextmenu * @plugin contextmenu */ $.jstree.defaults.contextmenu = { /** * a boolean indicating if the node should be selected when the context menu is invoked on it. Defaults to `true`. * @name $.jstree.defaults.contextmenu.select_node * @plugin contextmenu */ select_node: true, /** * a boolean indicating if the menu should be shown aligned with the node. Defaults to `true`, otherwise the mouse coordinates are used. * @name $.jstree.defaults.contextmenu.show_at_node * @plugin contextmenu */ show_at_node: true, /** * an object of actions, or a function that accepts a node and a callback function and calls the callback function with an object of actions available for that node (you can also return the items too). * * Each action consists of a key (a unique name) and a value which is an object with the following properties (only label and action are required). Once a menu item is activated the `action` function will be invoked with an object containing the following keys: item - the contextmenu item definition as seen below, reference - the DOM node that was used (the tree node), element - the contextmenu DOM element, position - an object with x/y properties indicating the position of the menu. * * * `separator_before` - a boolean indicating if there should be a separator before this item * * `separator_after` - a boolean indicating if there should be a separator after this item * * `_disabled` - a boolean indicating if this action should be disabled * * `label` - a string - the name of the action (could be a function returning a string) * * `title` - a string - an optional tooltip for the item * * `action` - a function to be executed if this item is chosen, the function will receive * * `icon` - a string, can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class * * `shortcut` - keyCode which will trigger the action if the menu is open (for example `113` for rename, which equals F2) * * `shortcut_label` - shortcut label (like for example `F2` for rename) * * `submenu` - an object with the same structure as $.jstree.defaults.contextmenu.items which can be used to create a submenu - each key will be rendered as a separate option in a submenu that will appear once the current item is hovered * * @name $.jstree.defaults.contextmenu.items * @plugin contextmenu */ items: function (o, cb) { // Could be an object directly return { "create": { "separator_before": false, "separator_after": true, "_disabled": false, //(this.check("create_node", data.reference, {}, "last")), "label": "Create", "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.create_node(obj, {}, "last", function (new_node) { try { inst.edit(new_node); } catch (ex) { setTimeout(function () { inst.edit(new_node); }, 0); } }); } }, "rename": { "separator_before": false, "separator_after": false, "_disabled": false, //(this.check("rename_node", data.reference, this.get_parent(data.reference), "")), "label": "Rename", /*! "shortcut" : 113, "shortcut_label" : 'F2', "icon" : "glyphicon glyphicon-leaf", */ "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.edit(obj); } }, "remove": { "separator_before": false, "icon": false, "separator_after": false, "_disabled": false, //(this.check("delete_node", data.reference, this.get_parent(data.reference), "")), "label": "Delete", "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if (inst.is_selected(obj)) { inst.delete_node(inst.get_selected()); } else { inst.delete_node(obj); } } }, "ccp": { "separator_before": true, "icon": false, "separator_after": false, "label": "Edit", "action": false, "submenu": { "cut": { "separator_before": false, "separator_after": false, "label": "Cut", "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if (inst.is_selected(obj)) { inst.cut(inst.get_top_selected()); } else { inst.cut(obj); } } }, "copy": { "separator_before": false, "icon": false, "separator_after": false, "label": "Copy", "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); if (inst.is_selected(obj)) { inst.copy(inst.get_top_selected()); } else { inst.copy(obj); } } }, "paste": { "separator_before": false, "icon": false, "_disabled": function (data) { return !$.jstree.reference(data.reference).can_paste(); }, "separator_after": false, "label": "Paste", "action": function (data) { var inst = $.jstree.reference(data.reference), obj = inst.get_node(data.reference); inst.paste(obj); } } } } }; } }; $.jstree.plugins.contextmenu = function (options, parent) { this.bind = function () { parent.bind.call(this); var last_ts = 0, cto = null, ex, ey; this.element .on("init.jstree loading.jstree ready.jstree", $.proxy(function () { this.get_container_ul().addClass('jstree-contextmenu'); }, this)) .on("contextmenu.jstree", ".jstree-anchor", $.proxy(function (e, data) { if (e.target.tagName.toLowerCase() === 'input') { return; } e.preventDefault(); last_ts = e.ctrlKey ? +new Date() : 0; if (data || cto) { last_ts = (+new Date()) + 10000; } if (cto) { clearTimeout(cto); } if (!this.is_loading(e.currentTarget)) { this.show_contextmenu(e.currentTarget, e.pageX, e.pageY, e); } }, this)) .on("click.jstree", ".jstree-anchor", $.proxy(function (e) { if (this._data.contextmenu.visible && (!last_ts || (+new Date()) - last_ts > 250)) { // work around safari & macOS ctrl+click $.vakata.context.hide(); } last_ts = 0; }, this)) .on("touchstart.jstree", ".jstree-anchor", function (e) { if (!e.originalEvent || !e.originalEvent.changedTouches || !e.originalEvent.changedTouches[0]) { return; } ex = e.originalEvent.changedTouches[0].clientX; ey = e.originalEvent.changedTouches[0].clientY; cto = setTimeout(function () { $(e.currentTarget).trigger('contextmenu', true); }, 750); }) .on('touchmove.vakata.jstree', function (e) { if (cto && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0] && (Math.abs(ex - e.originalEvent.changedTouches[0].clientX) > 10 || Math.abs(ey - e.originalEvent.changedTouches[0].clientY) > 10)) { clearTimeout(cto); $.vakata.context.hide(); } }) .on('touchend.vakata.jstree', function (e) { if (cto) { clearTimeout(cto); } }); /*! if(!('oncontextmenu' in document.body) && ('ontouchstart' in document.body)) { var el = null, tm = null; this.element .on("touchstart", ".jstree-anchor", function (e) { el = e.currentTarget; tm = +new Date(); $(document).one("touchend", function (e) { e.target = document.elementFromPoint(e.originalEvent.targetTouches[0].pageX - window.pageXOffset, e.originalEvent.targetTouches[0].pageY - window.pageYOffset); e.currentTarget = e.target; tm = ((+(new Date())) - tm); if(e.target === el && tm > 600 && tm < 1000) { e.preventDefault(); $(el).trigger('contextmenu', e); } el = null; tm = null; }); }); } */ $(document).on("context_hide.vakata.jstree", $.proxy(function (e, data) { this._data.contextmenu.visible = false; $(data.reference).removeClass('jstree-context'); }, this)); }; this.teardown = function () { if (this._data.contextmenu.visible) { $.vakata.context.hide(); } parent.teardown.call(this); }; /** * prepare and show the context menu for a node * @name show_contextmenu(obj [, x, y]) * @param {mixed} obj the node * @param {Number} x the x-coordinate relative to the document to show the menu at * @param {Number} y the y-coordinate relative to the document to show the menu at * @param {Object} e the event if available that triggered the contextmenu * @plugin contextmenu * @trigger show_contextmenu.jstree */ this.show_contextmenu = function (obj, x, y, e) { obj = this.get_node(obj); if (!obj || obj.id === $.jstree.root) { return false; } var s = this.settings.contextmenu, d = this.get_node(obj, true), a = d.children(".jstree-anchor"), o = false, i = false; if (s.show_at_node || x === undefined || y === undefined) { o = a.offset(); x = o.left; y = o.top + this._data.core.li_height; } if (this.settings.contextmenu.select_node && !this.is_selected(obj)) { this.activate_node(obj, e); } i = s.items; if ($.isFunction(i)) { i = i.call(this, obj, $.proxy(function (i) { this._show_contextmenu(obj, x, y, i); }, this)); } if ($.isPlainObject(i)) { this._show_contextmenu(obj, x, y, i); } }; /** * show the prepared context menu for a node * @name _show_contextmenu(obj, x, y, i) * @param {mixed} obj the node * @param {Number} x the x-coordinate relative to the document to show the menu at * @param {Number} y the y-coordinate relative to the document to show the menu at * @param {Number} i the object of items to show * @plugin contextmenu * @trigger show_contextmenu.jstree * @private */ this._show_contextmenu = function (obj, x, y, i) { var d = this.get_node(obj, true), a = d.children(".jstree-anchor"); $(document).one("context_show.vakata.jstree", $.proxy(function (e, data) { var cls = 'jstree-contextmenu jstree-' + this.get_theme() + '-contextmenu'; $(data.element).addClass(cls); a.addClass('jstree-context'); }, this)); this._data.contextmenu.visible = true; $.vakata.context.show(a, { 'x': x, 'y': y }, i); /** * triggered when the contextmenu is shown for a node * @event * @name show_contextmenu.jstree * @param {Object} node the node * @param {Number} x the x-coordinate of the menu relative to the document * @param {Number} y the y-coordinate of the menu relative to the document * @plugin contextmenu */ this.trigger('show_contextmenu', { "node": obj, "x": x, "y": y }); }; }; // contextmenu helper (function ($) { var right_to_left = false, vakata_context = { element: false, reference: false, position_x: 0, position_y: 0, items: [], html: "", is_visible: false }; $.vakata.context = { settings: { hide_onmouseleave: 0, icons: true }, _trigger: function (event_name) { $(document).triggerHandler("context_" + event_name + ".vakata", { "reference": vakata_context.reference, "element": vakata_context.element, "position": { "x": vakata_context.position_x, "y": vakata_context.position_y } }); }, _execute: function (i) { i = vakata_context.items[i]; return i && (!i._disabled || ($.isFunction(i._disabled) && !i._disabled({ "item": i, "reference": vakata_context.reference, "element": vakata_context.element }))) && i.action ? i.action.call(null, { "item": i, "reference": vakata_context.reference, "element": vakata_context.element, "position": { "x": vakata_context.position_x, "y": vakata_context.position_y } }) : false; }, _parse: function (o, is_callback) { if (!o) { return false; } if (!is_callback) { vakata_context.html = ""; vakata_context.items = []; } var str = "", sep = false, tmp; if (is_callback) { str += "<" + "ul>"; } $.each(o, function (i, val) { if (!val) { return true; } vakata_context.items.push(val); if (!sep && val.separator_before) { str += "<" + "li class='vakata-context-separator'><" + "a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + "> <" + "/a><" + "/li>"; } sep = false; str += "<" + "li class='" + (val._class || "") + (val._disabled === true || ($.isFunction(val._disabled) && val._disabled({ "item": val, "reference": vakata_context.reference, "element": vakata_context.element })) ? " vakata-contextmenu-disabled " : "") + "' " + (val.shortcut ? " data-shortcut='" + val.shortcut + "' " : '') + ">"; str += "<" + "a href='#' rel='" + (vakata_context.items.length - 1) + "' " + (val.title ? "title='" + val.title + "'" : "") + ">"; if ($.vakata.context.settings.icons) { str += "<" + "i "; if (val.icon) { if (val.icon.indexOf("/") !== -1 || val.icon.indexOf(".") !== -1) { str += " style='background:url(\"" + val.icon + "\") center center no-repeat' "; } else { str += " class='" + val.icon + "' "; } } str += "><" + "/i><" + "span class='vakata-contextmenu-sep'> <" + "/span>"; } str += ($.isFunction(val.label) ? val.label({ "item" : i, "reference" : vakata_context.reference, "element" : vakata_context.element }) : val.label) + (val.shortcut ? ' ' + (val.shortcut_label || '') + '' : '') + "<" + "/a>"; if (val.submenu) { tmp = $.vakata.context._parse(val.submenu, true); if (tmp) { str += tmp; } } str += "<" + "/li>"; if (val.separator_after) { str += "<" + "li class='vakata-context-separator'><" + "a href='#' " + ($.vakata.context.settings.icons ? '' : 'style="margin-left:0px;"') + "> <" + "/a><" + "/li>"; sep = true; } }); str = str.replace(/
  • <\/li\>$/, ""); if (is_callback) { str += ""; } /** * triggered on the document when the contextmenu is parsed (HTML is built) * @event * @plugin contextmenu * @name context_parse.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ if (!is_callback) { vakata_context.html = str; $.vakata.context._trigger("parse"); } return str.length > 10 ? str : false; }, _show_submenu: function (o) { o = $(o); if (!o.length || !o.children("ul").length) { return; } var e = o.children("ul"), xl = o.offset().left, x = xl + o.outerWidth(), y = o.offset().top, w = e.width(), h = e.height(), dw = $(window).width() + $(window).scrollLeft(), dh = $(window).height() + $(window).scrollTop(); // може да Ñе ÑпеÑти е една проверка - дали нÑма нÑкой от клаÑовете вече нагоре if (right_to_left) { o[x - (w + 10 + o.outerWidth()) < 0 ? "addClass" : "removeClass"]("vakata-context-left"); } else { o[x + w > dw && xl > dw - x ? "addClass" : "removeClass"]("vakata-context-right"); } if (y + h + 10 > dh) { e.css("bottom", "-1px"); } //if does not fit - stick it to the side if (o.hasClass('vakata-context-right')) { if (xl < w) { e.css("margin-right", xl - w); } } else { if (dw - x < w) { e.css("margin-left", dw - x - w); } } e.show(); }, show: function (reference, position, data) { var o, e, x, y, w, h, dw, dh, cond = true; if (vakata_context.element && vakata_context.element.length) { vakata_context.element.width(''); } switch (cond) { case (!position && !reference): return false; case (!!position && !!reference): vakata_context.reference = reference; vakata_context.position_x = position.x; vakata_context.position_y = position.y; break; case (!position && !!reference): vakata_context.reference = reference; o = reference.offset(); vakata_context.position_x = o.left + reference.outerHeight(); vakata_context.position_y = o.top; break; case (!!position && !reference): vakata_context.position_x = position.x; vakata_context.position_y = position.y; break; } if (!!reference && !data && $(reference).data('vakata_contextmenu')) { data = $(reference).data('vakata_contextmenu'); } if ($.vakata.context._parse(data)) { vakata_context.element.html(vakata_context.html); } if (vakata_context.items.length) { vakata_context.element.appendTo(document.body); e = vakata_context.element; x = vakata_context.position_x; y = vakata_context.position_y; w = e.width(); h = e.height(); dw = $(window).width() + $(window).scrollLeft(); dh = $(window).height() + $(window).scrollTop(); if (right_to_left) { x -= (e.outerWidth() - $(reference).outerWidth()); if (x < $(window).scrollLeft() + 20) { x = $(window).scrollLeft() + 20; } } if (x + w + 20 > dw) { x = dw - (w + 20); } if (y + h + 20 > dh) { y = dh - (h + 20); } vakata_context.element .css({ "left": x, "top": y }) .show() .find('a').first().focus().parent().addClass("vakata-context-hover"); vakata_context.is_visible = true; /** * triggered on the document when the contextmenu is shown * @event * @plugin contextmenu * @name context_show.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ $.vakata.context._trigger("show"); } }, hide: function () { if (vakata_context.is_visible) { vakata_context.element.hide().find("ul").hide().end().find(':focus').blur().end().detach(); vakata_context.is_visible = false; /** * triggered on the document when the contextmenu is hidden * @event * @plugin contextmenu * @name context_hide.vakata * @param {jQuery} reference the element that was right clicked * @param {jQuery} element the DOM element of the menu itself * @param {Object} position the x & y coordinates of the menu */ $.vakata.context._trigger("hide"); } } }; $(function () { right_to_left = $(document.body).css("direction") === "rtl"; var to = false; vakata_context.element = $("
      "); vakata_context.element .on("mouseenter", "li", function (e) { e.stopImmediatePropagation(); if ($.contains(this, e.relatedTarget)) { // премахнато заради delegate mouseleave по-долу // $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); return; } if (to) { clearTimeout(to); } vakata_context.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(); $(this) .siblings().find("ul").hide().end().end() .parentsUntil(".vakata-context", "li").addBack().addClass("vakata-context-hover"); $.vakata.context._show_submenu(this); }) // теÑтово - дали не натоварва? .on("mouseleave", "li", function (e) { if ($.contains(this, e.relatedTarget)) { return; } $(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover"); }) .on("mouseleave", function (e) { $(this).find(".vakata-context-hover").removeClass("vakata-context-hover"); if ($.vakata.context.settings.hide_onmouseleave) { to = setTimeout( (function (t) { return function () { $.vakata.context.hide(); }; }(this)), $.vakata.context.settings.hide_onmouseleave ); } }) .on("click", "a", function (e) { e.preventDefault(); //}) //.on("mouseup", "a", function (e) { if (!$(this).blur().parent().hasClass("vakata-context-disabled") && $.vakata.context._execute($(this).attr("rel")) !== false) { $.vakata.context.hide(); } }) .on('keydown', 'a', function (e) { var o = null; switch (e.which) { case 13: case 32: e.type = "click"; e.preventDefault(); $(e.currentTarget).trigger(e); break; case 37: if (vakata_context.is_visible) { vakata_context.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children('a').focus(); e.stopImmediatePropagation(); e.preventDefault(); } break; case 38: if (vakata_context.is_visible) { o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first(); if (!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last(); } o.addClass("vakata-context-hover").children('a').focus(); e.stopImmediatePropagation(); e.preventDefault(); } break; case 39: if (vakata_context.is_visible) { vakata_context.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children('a').focus(); e.stopImmediatePropagation(); e.preventDefault(); } break; case 40: if (vakata_context.is_visible) { o = vakata_context.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first(); if (!o.length) { o = vakata_context.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first(); } o.addClass("vakata-context-hover").children('a').focus(); e.stopImmediatePropagation(); e.preventDefault(); } break; case 27: $.vakata.context.hide(); e.preventDefault(); break; default: //console.log(e.which); break; } }) .on('keydown', function (e) { e.preventDefault(); var a = vakata_context.element.find('.vakata-contextmenu-shortcut-' + e.which).parent(); if (a.parent().not('.vakata-context-disabled')) { a.click(); } }); $(document) .on("mousedown.vakata.jstree", function (e) { if (vakata_context.is_visible && vakata_context.element[0] !== e.target && !$.contains(vakata_context.element[0], e.target)) { $.vakata.context.hide(); } }) .on("context_show.vakata.jstree", function (e, data) { vakata_context.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"); if (right_to_left) { vakata_context.element.addClass("vakata-context-rtl").css("direction", "rtl"); } // also apply a RTL class? vakata_context.element.find("ul").hide().end(); }); }); }($)); // $.jstree.defaults.plugins.push("contextmenu"); /** * ### Drag'n'drop plugin * * Enables dragging and dropping of nodes in the tree, resulting in a move or copy operations. */ /** * stores all defaults for the drag'n'drop plugin * @name $.jstree.defaults.dnd * @plugin dnd */ $.jstree.defaults.dnd = { /** * a boolean indicating if a copy should be possible while dragging (by pressint the meta key or Ctrl). Defaults to `true`. * @name $.jstree.defaults.dnd.copy * @plugin dnd */ copy: true, /** * a number indicating how long a node should remain hovered while dragging to be opened. Defaults to `500`. * @name $.jstree.defaults.dnd.open_timeout * @plugin dnd */ open_timeout: 500, /** * a function invoked each time a node is about to be dragged, invoked in the tree's scope and receives the nodes about to be dragged as an argument (array) and the event that started the drag - return `false` to prevent dragging * @name $.jstree.defaults.dnd.is_draggable * @plugin dnd */ is_draggable: true, /** * a boolean indicating if checks should constantly be made while the user is dragging the node (as opposed to checking only on drop), default is `true` * @name $.jstree.defaults.dnd.check_while_dragging * @plugin dnd */ check_while_dragging: true, /** * a boolean indicating if nodes from this tree should only be copied with dnd (as opposed to moved), default is `false` * @name $.jstree.defaults.dnd.always_copy * @plugin dnd */ always_copy: false, /** * when dropping a node "inside", this setting indicates the position the node should go to - it can be an integer or a string: "first" (same as 0) or "last", default is `0` * @name $.jstree.defaults.dnd.inside_pos * @plugin dnd */ inside_pos: 0, /** * when starting the drag on a node that is selected this setting controls if all selected nodes are dragged or only the single node, default is `true`, which means all selected nodes are dragged when the drag is started on a selected node * @name $.jstree.defaults.dnd.drag_selection * @plugin dnd */ drag_selection: true, /** * controls whether dnd works on touch devices. If left as boolean true dnd will work the same as in desktop browsers, which in some cases may impair scrolling. If set to boolean false dnd will not work on touch devices. There is a special third option - string "selected" which means only selected nodes can be dragged on touch devices. * @name $.jstree.defaults.dnd.touch * @plugin dnd */ touch: true, /** * controls whether items can be dropped anywhere on the node, not just on the anchor, by default only the node anchor is a valid drop target. Works best with the wholerow plugin. If enabled on mobile depending on the interface it might be hard for the user to cancel the drop, since the whole tree container will be a valid drop target. * @name $.jstree.defaults.dnd.large_drop_target * @plugin dnd */ large_drop_target: false, /** * controls whether a drag can be initiated from any part of the node and not just the text/icon part, works best with the wholerow plugin. Keep in mind it can cause problems with tree scrolling on mobile depending on the interface - in that case set the touch option to "selected". * @name $.jstree.defaults.dnd.large_drag_target * @plugin dnd */ large_drag_target: false, /** * controls whether use HTML5 dnd api instead of classical. That will allow better integration of dnd events with other HTML5 controls. * @reference http://caniuse.com/#feat=dragndrop * @name $.jstree.defaults.dnd.use_html5 * @plugin dnd */ use_html5: false }; var drg, elm; // TODO: now check works by checking for each node individually, how about max_children, unique, etc? $.jstree.plugins.dnd = function (options, parent) { this.init = function (el, options) { parent.init.call(this, el, options); this.settings.dnd.use_html5 = this.settings.dnd.use_html5 && ('draggable' in document.createElement('span')); }; this.bind = function () { parent.bind.call(this); this.element .on(this.settings.dnd.use_html5 ? 'dragstart.jstree' : 'mousedown.jstree touchstart.jstree', this.settings.dnd.large_drag_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) { if (this.settings.dnd.large_drag_target && $(e.target).closest('.jstree-node')[0] !== e.currentTarget) { return true; } if (e.type === "touchstart" && (!this.settings.dnd.touch || (this.settings.dnd.touch === 'selected' && !$(e.currentTarget).closest('.jstree-node').children('.jstree-anchor').hasClass('jstree-clicked')))) { return true; } var obj = this.get_node(e.target), mlt = this.is_selected(obj) && this.settings.dnd.drag_selection ? this.get_top_selected().length : 1, txt = (mlt > 1 ? mlt + ' ' + this.get_string('nodes') : this.get_text(e.currentTarget)); if (this.settings.core.force_text) { txt = $.vakata.html.escape(txt); } if (obj && obj.id && obj.id !== $.jstree.root && (e.which === 1 || e.type === "touchstart" || e.type === "dragstart") && (this.settings.dnd.is_draggable === true || ($.isFunction(this.settings.dnd.is_draggable) && this.settings.dnd.is_draggable.call(this, (mlt > 1 ? this.get_top_selected(true) : [obj]), e))) ) { drg = { 'jstree': true, 'origin': this, 'obj': this.get_node(obj, true), 'nodes': mlt > 1 ? this.get_top_selected() : [obj.id] }; elm = e.currentTarget; if (this.settings.dnd.use_html5) { $.vakata.dnd._trigger('start', e, { 'helper': $(), 'element': elm, 'data': drg }); } else { this.element.trigger('mousedown.jstree'); return $.vakata.dnd.start(e, drg, '
      ' + txt + '
      '); } } }, this)); if (this.settings.dnd.use_html5) { this.element .on('dragover.jstree', function (e) { e.preventDefault(); $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); return false; }) //.on('dragenter.jstree', this.settings.dnd.large_drop_target ? '.jstree-node' : '.jstree-anchor', $.proxy(function (e) { // e.preventDefault(); // $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); // return false; // }, this)) .on('drop.jstree', $.proxy(function (e) { e.preventDefault(); $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); return false; }, this)); } }; this.redraw_node = function (obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if (obj && this.settings.dnd.use_html5) { if (this.settings.dnd.large_drag_target) { obj.setAttribute('draggable', true); } else { var i, j, tmp = null; for (i = 0, j = obj.childNodes.length; i < j; i++) { if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if (tmp) { tmp.setAttribute('draggable', true); } } } return obj; }; }; $(function () { // bind only once for all instances var lastmv = false, laster = false, lastev = false, opento = false, marker = $('
       
      ').hide(); //.appendTo('body'); $(document) .on('dragover.vakata.jstree', function (e) { if (elm) { $.vakata.dnd._trigger('move', e, { 'helper': $(), 'element': elm, 'data': drg }); } }) .on('drop.vakata.jstree', function (e) { if (elm) { $.vakata.dnd._trigger('stop', e, { 'helper': $(), 'element': elm, 'data': drg }); elm = null; drg = null; } }) .on('dnd_start.vakata.jstree', function (e, data) { lastmv = false; lastev = false; if (!data || !data.data || !data.data.jstree) { return; } marker.appendTo(document.body); //.show(); }) .on('dnd_move.vakata.jstree', function (e, data) { var isDifferentNode = data.event.target !== lastev.target; if (opento) { if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { clearTimeout(opento); } } if (!data || !data.data || !data.data.jstree) { return; } // if we are hovering the marker image do nothing (can happen on "inside" drags) if (data.event.target.id && data.event.target.id === 'jstree-marker') { return; } lastev = data.event; var ins = $.jstree.reference(data.event.target), ref = false, off = false, rel = false, tmp, l, t, h, p, i, o, ok, t1, t2, op, ps, pr, ip, tm, is_copy, pn; // if we are over an instance if (ins && ins._data && ins._data.dnd) { marker.attr('class', 'jstree-' + ins.get_theme() + (ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '')); is_copy = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))); data.helper .children().attr('class', 'jstree-' + ins.get_theme() + ' jstree-' + ins.get_theme() + '-' + ins.get_theme_variant() + ' ' + (ins.settings.core.themes.responsive ? ' jstree-dnd-responsive' : '')) .find('.jstree-copy').first()[is_copy ? 'show' : 'hide'](); // if are hovering the container itself add a new root node //console.log(data.event); if ((data.event.target === ins.element[0] || data.event.target === ins.get_container_ul()[0]) && ins.get_container_ul().children().length === 0) { ok = true; for (t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { ok = ok && ins.check((data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node"), (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), $.jstree.root, 'last', { 'dnd' : true, 'ref' : ins.get_node($.jstree.root), 'pos' : 'i', 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) }); if (!ok) { break; } } if (ok) { lastmv = { 'ins': ins, 'par': $.jstree.root, 'pos': 'last' }; marker.hide(); data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; } return; } } else { // if we are hovering a tree node ref = ins.settings.dnd.large_drop_target ? $(data.event.target).closest('.jstree-node').children('.jstree-anchor') : $(data.event.target).closest('.jstree-anchor'); if (ref && ref.length && ref.parent().is('.jstree-closed, .jstree-open, .jstree-leaf')) { off = ref.offset(); rel = (data.event.pageY !== undefined ? data.event.pageY : data.event.originalEvent.pageY) - off.top; h = ref.outerHeight(); if (rel < h / 3) { o = ['b', 'i', 'a']; } else if (rel > h - h / 3) { o = ['a', 'i', 'b']; } else { o = rel > h / 2 ? ['i', 'a', 'b'] : ['i', 'b', 'a']; } $.each(o, function (j, v) { switch (v) { case 'b': l = off.left - 6; t = off.top; p = ins.get_parent(ref); i = ref.parent().index(); break; case 'i': ip = ins.settings.dnd.inside_pos; tm = ins.get_node(ref.parent()); l = off.left - 2; t = off.top + h / 2 + 1; p = tm.id; i = ip === 'first' ? 0 : (ip === 'last' ? tm.children.length : Math.min(ip, tm.children.length)); break; case 'a': l = off.left - 6; t = off.top + h; p = ins.get_parent(ref); i = ref.parent().index() + 1; break; } ok = true; for (t1 = 0, t2 = data.data.nodes.length; t1 < t2; t1++) { op = data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? "copy_node" : "move_node"; ps = i; if (op === "move_node" && v === 'a' && (data.data.origin && data.data.origin === ins) && p === ins.get_parent(data.data.nodes[t1])) { pr = ins.get_node(p); if (ps > $.inArray(data.data.nodes[t1], pr.children)) { ps -= 1; } } ok = ok && ((ins && ins.settings && ins.settings.dnd && ins.settings.dnd.check_while_dragging === false) || ins.check(op, (data.data.origin && data.data.origin !== ins ? data.data.origin.get_node(data.data.nodes[t1]) : data.data.nodes[t1]), p, ps, { 'dnd' : true, 'ref' : ins.get_node(ref.parent()), 'pos' : v, 'origin' : data.data.origin, 'is_multi' : (data.data.origin && data.data.origin !== ins), 'is_foreign' : (!data.data.origin) })); if (!ok) { if (ins && ins.last_error) { laster = ins.last_error(); } break; } } if (v === 'i' && ref.parent().is('.jstree-closed') && ins.settings.dnd.open_timeout) { if (!data.event || data.event.type !== 'dragover' || isDifferentNode) { if (opento) { clearTimeout(opento); } opento = setTimeout((function (x, z) { return function () { x.open_node(z); }; }(ins, ref)), ins.settings.dnd.open_timeout); } } if (ok) { pn = ins.get_node(p, true); if (!pn.hasClass('.jstree-dnd-parent')) { $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); pn.addClass('jstree-dnd-parent'); } lastmv = { 'ins': ins, 'par': p, 'pos': v === 'i' && ip === 'last' && i === 0 && !ins.is_loaded(tm) ? 'last' : i }; marker.css({ 'left': l + 'px', 'top': t + 'px' }).show(); data.helper.find('.jstree-icon').first().removeClass('jstree-er').addClass('jstree-ok'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { data.event.originalEvent.dataTransfer.dropEffect = is_copy ? 'copy' : 'move'; } laster = {}; o = true; return false; } }); if (o === true) { return; } } } } $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); lastmv = false; data.helper.find('.jstree-icon').removeClass('jstree-ok').addClass('jstree-er'); if (data.event.originalEvent && data.event.originalEvent.dataTransfer) { //data.event.originalEvent.dataTransfer.dropEffect = 'none'; } marker.hide(); }) .on('dnd_scroll.vakata.jstree', function (e, data) { if (!data || !data.data || !data.data.jstree) { return; } marker.hide(); lastmv = false; lastev = false; data.helper.find('.jstree-icon').first().removeClass('jstree-ok').addClass('jstree-er'); }) .on('dnd_stop.vakata.jstree', function (e, data) { $('.jstree-dnd-parent').removeClass('jstree-dnd-parent'); if (opento) { clearTimeout(opento); } if (!data || !data.data || !data.data.jstree) { return; } marker.hide().detach(); var i, j, nodes = []; if (lastmv) { for (i = 0, j = data.data.nodes.length; i < j; i++) { nodes[i] = data.data.origin ? data.data.origin.get_node(data.data.nodes[i]) : data.data.nodes[i]; } lastmv.ins[data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (data.event.metaKey || data.event.ctrlKey))) ? 'copy_node' : 'move_node'](nodes, lastmv.par, lastmv.pos, false, false, false, data.data.origin); } else { i = $(data.event.target).closest('.jstree'); if (i.length && laster && laster.error && laster.error === 'check') { i = i.jstree(true); if (i) { i.settings.core.error.call(this, laster); } } } lastev = false; lastmv = false; }) .on('keyup.jstree keydown.jstree', function (e, data) { data = $.vakata.dnd._get(); if (data && data.data && data.data.jstree) { if (e.type === "keyup" && e.which === 27) { if (opento) { clearTimeout(opento); } lastmv = false; laster = false; lastev = false; opento = false; marker.hide().detach(); $.vakata.dnd._clean(); } else { data.helper.find('.jstree-copy').first()[data.data.origin && (data.data.origin.settings.dnd.always_copy || (data.data.origin.settings.dnd.copy && (e.metaKey || e.ctrlKey))) ? 'show' : 'hide'](); if (lastev) { lastev.metaKey = e.metaKey; lastev.ctrlKey = e.ctrlKey; $.vakata.dnd._trigger('move', lastev); } } } }); }); // helpers (function ($) { $.vakata.html = { div: $('
      '), escape: function (str) { return $.vakata.html.div.text(str).html(); }, strip: function (str) { return $.vakata.html.div.empty().append($.parseHTML(str)).text(); } }; // private variable var vakata_dnd = { element: false, target: false, is_down: false, is_drag: false, helper: false, helper_w: 0, data: false, init_x: 0, init_y: 0, scroll_l: 0, scroll_t: 0, scroll_e: false, scroll_i: false, is_touch: false }; $.vakata.dnd = { settings: { scroll_speed: 10, scroll_proximity: 20, helper_left: 5, helper_top: 10, threshold: 5, threshold_touch: 10 }, _trigger: function (event_name, e, data) { if (data === undefined) { data = $.vakata.dnd._get(); } data.event = e; $(document).triggerHandler("dnd_" + event_name + ".vakata", data); }, _get: function () { return { "data": vakata_dnd.data, "element": vakata_dnd.element, "helper": vakata_dnd.helper }; }, _clean: function () { if (vakata_dnd.helper) { vakata_dnd.helper.remove(); } if (vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } vakata_dnd = { element: false, target: false, is_down: false, is_drag: false, helper: false, helper_w: 0, data: false, init_x: 0, init_y: 0, scroll_l: 0, scroll_t: 0, scroll_e: false, scroll_i: false, is_touch: false }; $(document).off("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); $(document).off("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); }, _scroll: function (init_only) { if (!vakata_dnd.scroll_e || (!vakata_dnd.scroll_l && !vakata_dnd.scroll_t)) { if (vakata_dnd.scroll_i) { clearInterval(vakata_dnd.scroll_i); vakata_dnd.scroll_i = false; } return false; } if (!vakata_dnd.scroll_i) { vakata_dnd.scroll_i = setInterval($.vakata.dnd._scroll, 100); return false; } if (init_only === true) { return false; } var i = vakata_dnd.scroll_e.scrollTop(), j = vakata_dnd.scroll_e.scrollLeft(); vakata_dnd.scroll_e.scrollTop(i + vakata_dnd.scroll_t * $.vakata.dnd.settings.scroll_speed); vakata_dnd.scroll_e.scrollLeft(j + vakata_dnd.scroll_l * $.vakata.dnd.settings.scroll_speed); if (i !== vakata_dnd.scroll_e.scrollTop() || j !== vakata_dnd.scroll_e.scrollLeft()) { /** * triggered on the document when a drag causes an element to scroll * @event * @plugin dnd * @name dnd_scroll.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {jQuery} event the element that is scrolling */ $.vakata.dnd._trigger("scroll", vakata_dnd.scroll_e); } }, start: function (e, data, html) { if (e.type === "touchstart" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if (vakata_dnd.is_drag) { $.vakata.dnd.stop({}); } try { e.currentTarget.unselectable = "on"; e.currentTarget.onselectstart = function () { return false; }; if (e.currentTarget.style) { e.currentTarget.style.touchAction = "none"; e.currentTarget.style.msTouchAction = "none"; e.currentTarget.style.MozUserSelect = "none"; } } catch (ignore) { } vakata_dnd.init_x = e.pageX; vakata_dnd.init_y = e.pageY; vakata_dnd.data = data; vakata_dnd.is_down = true; vakata_dnd.element = e.currentTarget; vakata_dnd.target = e.target; vakata_dnd.is_touch = e.type === "touchstart"; if (html !== false) { vakata_dnd.helper = $("
      ").html(html).css({ "display": "block", "margin": "0", "padding": "0", "position": "absolute", "top": "-2000px", "lineHeight": "16px", "zIndex": "10000" }); } $(document).on("mousemove.vakata.jstree touchmove.vakata.jstree", $.vakata.dnd.drag); $(document).on("mouseup.vakata.jstree touchend.vakata.jstree", $.vakata.dnd.stop); return false; }, drag: function (e) { if (e.type === "touchmove" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if (!vakata_dnd.is_down) { return; } if (!vakata_dnd.is_drag) { if ( Math.abs(e.pageX - vakata_dnd.init_x) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) || Math.abs(e.pageY - vakata_dnd.init_y) > (vakata_dnd.is_touch ? $.vakata.dnd.settings.threshold_touch : $.vakata.dnd.settings.threshold) ) { if (vakata_dnd.helper) { vakata_dnd.helper.appendTo(document.body); vakata_dnd.helper_w = vakata_dnd.helper.outerWidth(); } vakata_dnd.is_drag = true; $(vakata_dnd.target).one('click.vakata', false); /** * triggered on the document when a drag starts * @event * @plugin dnd * @name dnd_start.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused the start (probably mousemove) */ $.vakata.dnd._trigger("start", e); } else { return; } } var d = false, w = false, dh = false, wh = false, dw = false, ww = false, dt = false, dl = false, ht = false, hl = false; vakata_dnd.scroll_t = 0; vakata_dnd.scroll_l = 0; vakata_dnd.scroll_e = false; $($(e.target).parentsUntil("body").addBack().get().reverse()) .filter(function () { return (/^auto|scroll$/).test($(this).css("overflow")) && (this.scrollHeight > this.offsetHeight || this.scrollWidth > this.offsetWidth); }) .each(function () { var t = $(this), o = t.offset(); if (this.scrollHeight > this.offsetHeight) { if (o.top + t.height() - e.pageY < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } if (e.pageY - o.top < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } } if (this.scrollWidth > this.offsetWidth) { if (o.left + t.width() - e.pageX < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } if (e.pageX - o.left < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } } if (vakata_dnd.scroll_t || vakata_dnd.scroll_l) { vakata_dnd.scroll_e = $(this); return false; } }); if (!vakata_dnd.scroll_e) { d = $(document); w = $(window); dh = d.height(); wh = w.height(); dw = d.width(); ww = w.width(); dt = d.scrollTop(); dl = d.scrollLeft(); if (dh > wh && e.pageY - dt < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = -1; } if (dh > wh && wh - (e.pageY - dt) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_t = 1; } if (dw > ww && e.pageX - dl < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = -1; } if (dw > ww && ww - (e.pageX - dl) < $.vakata.dnd.settings.scroll_proximity) { vakata_dnd.scroll_l = 1; } if (vakata_dnd.scroll_t || vakata_dnd.scroll_l) { vakata_dnd.scroll_e = d; } } if (vakata_dnd.scroll_e) { $.vakata.dnd._scroll(true); } if (vakata_dnd.helper) { ht = parseInt(e.pageY + $.vakata.dnd.settings.helper_top, 10); hl = parseInt(e.pageX + $.vakata.dnd.settings.helper_left, 10); if (dh && ht + 25 > dh) { ht = dh - 50; } if (dw && hl + vakata_dnd.helper_w > dw) { hl = dw - (vakata_dnd.helper_w + 2); } vakata_dnd.helper.css({ left: hl + "px", top: ht + "px" }); } /** * triggered on the document when a drag is in progress * @event * @plugin dnd * @name dnd_move.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused this to trigger (most likely mousemove) */ $.vakata.dnd._trigger("move", e); return false; }, stop: function (e) { if (e.type === "touchend" && e.originalEvent && e.originalEvent.changedTouches && e.originalEvent.changedTouches[0]) { e.pageX = e.originalEvent.changedTouches[0].pageX; e.pageY = e.originalEvent.changedTouches[0].pageY; e.target = document.elementFromPoint(e.originalEvent.changedTouches[0].pageX - window.pageXOffset, e.originalEvent.changedTouches[0].pageY - window.pageYOffset); } if (vakata_dnd.is_drag) { /** * triggered on the document when a drag stops (the dragged element is dropped) * @event * @plugin dnd * @name dnd_stop.vakata * @param {Mixed} data any data supplied with the call to $.vakata.dnd.start * @param {DOM} element the DOM element being dragged * @param {jQuery} helper the helper shown next to the mouse * @param {Object} event the event that caused the stop */ if (e.target !== vakata_dnd.target) { $(vakata_dnd.target).off('click.vakata'); } $.vakata.dnd._trigger("stop", e); } else { if (e.type === "touchend" && e.target === vakata_dnd.target) { var to = setTimeout(function () { $(e.target).click(); }, 100); $(e.target).one('click', function () { if (to) { clearTimeout(to); } }); } } $.vakata.dnd._clean(); return false; } }; }($)); // include the dnd plugin by default // $.jstree.defaults.plugins.push("dnd"); /** * ### Massload plugin * * Adds massload functionality to jsTree, so that multiple nodes can be loaded in a single request (only useful with lazy loading). */ /** * massload configuration * * It is possible to set this to a standard jQuery-like AJAX config. * In addition to the standard jQuery ajax options here you can supply functions for `data` and `url`, the functions will be run in the current instance's scope and a param will be passed indicating which node IDs need to be loaded, the return value of those functions will be used. * * You can also set this to a function, that function will receive the node IDs being loaded as argument and a second param which is a function (callback) which should be called with the result. * * Both the AJAX and the function approach rely on the same return value - an object where the keys are the node IDs, and the value is the children of that node as an array. * * { * "id1" : [{ "text" : "Child of ID1", "id" : "c1" }, { "text" : "Another child of ID1", "id" : "c2" }], * "id2" : [{ "text" : "Child of ID2", "id" : "c3" }] * } * * @name $.jstree.defaults.massload * @plugin massload */ $.jstree.defaults.massload = null; $.jstree.plugins.massload = function (options, parent) { this.init = function (el, options) { this._data.massload = {}; parent.init.call(this, el, options); }; this._load_nodes = function (nodes, callback, is_callback, force_reload) { var s = this.settings.massload, nodesString = JSON.stringify(nodes), toLoad = [], m = this._model.data, i, j, dom; if (!is_callback) { for (i = 0, j = nodes.length; i < j; i++) { if (!m[nodes[i]] || ((!m[nodes[i]].state.loaded && !m[nodes[i]].state.failed) || force_reload)) { toLoad.push(nodes[i]); dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.addClass("jstree-loading").attr('aria-busy', true); } } } this._data.massload = {}; if (toLoad.length) { if ($.isFunction(s)) { return s.call(this, toLoad, $.proxy(function (data) { var i, j; if (data) { for (i in data) { if (data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for (i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy', false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)); } if (typeof s === 'object' && s && s.url) { s = $.extend(true, {}, s); if ($.isFunction(s.url)) { s.url = s.url.call(this, toLoad); } if ($.isFunction(s.data)) { s.data = s.data.call(this, toLoad); } return $.ajax(s) .done($.proxy(function (data, t, x) { var i, j; if (data) { for (i in data) { if (data.hasOwnProperty(i)) { this._data.massload[i] = data[i]; } } } for (i = 0, j = nodes.length; i < j; i++) { dom = this.get_node(nodes[i], true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy', false); } } parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)) .fail($.proxy(function (f) { parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }, this)); } } } return parent._load_nodes.call(this, nodes, callback, is_callback, force_reload); }; this._load_node = function (obj, callback) { var data = this._data.massload[obj.id], rslt = null, dom; if (data) { rslt = this[typeof data === 'string' ? '_append_html_data' : '_append_json_data']( obj, typeof data === 'string' ? $($.parseHTML(data)).filter(function () { return this.nodeType !== 3; }) : data, function (status) { callback.call(this, status); } ); dom = this.get_node(obj.id, true); if (dom && dom.length) { dom.removeClass("jstree-loading").attr('aria-busy', false); } delete this._data.massload[obj.id]; return rslt; } return parent._load_node.call(this, obj, callback); }; }; /** * ### Search plugin * * Adds search functionality to jsTree. */ /** * stores all defaults for the search plugin * @name $.jstree.defaults.search * @plugin search */ $.jstree.defaults.search = { /** * a jQuery-like AJAX config, which jstree uses if a server should be queried for results. * * A `str` (which is the search string) parameter will be added with the request, an optional `inside` parameter will be added if the search is limited to a node id. The expected result is a JSON array with nodes that need to be opened so that matching nodes will be revealed. * Leave this setting as `false` to not query the server. You can also set this to a function, which will be invoked in the instance's scope and receive 3 parameters - the search string, the callback to call with the array of nodes to load, and the optional node ID to limit the search to * @name $.jstree.defaults.search.ajax * @plugin search */ ajax: false, /** * Indicates if the search should be fuzzy or not (should `chnd3` match `child node 3`). Default is `false`. * @name $.jstree.defaults.search.fuzzy * @plugin search */ fuzzy: false, /** * Indicates if the search should be case sensitive. Default is `false`. * @name $.jstree.defaults.search.case_sensitive * @plugin search */ case_sensitive: false, /** * Indicates if the tree should be filtered (by default) to show only matching nodes (keep in mind this can be a heavy on large trees in old browsers). * This setting can be changed at runtime when calling the search method. Default is `false`. * @name $.jstree.defaults.search.show_only_matches * @plugin search */ show_only_matches: false, /** * Indicates if the children of matched element are shown (when show_only_matches is true) * This setting can be changed at runtime when calling the search method. Default is `false`. * @name $.jstree.defaults.search.show_only_matches_children * @plugin search */ show_only_matches_children: false, /** * Indicates if all nodes opened to reveal the search result, should be closed when the search is cleared or a new search is performed. Default is `true`. * @name $.jstree.defaults.search.close_opened_onclear * @plugin search */ close_opened_onclear: true, /** * Indicates if only leaf nodes should be included in search results. Default is `false`. * @name $.jstree.defaults.search.search_leaves_only * @plugin search */ search_leaves_only: false, /** * If set to a function it wil be called in the instance's scope with two arguments - search string and node (where node will be every node in the structure, so use with caution). * If the function returns a truthy value the node will be considered a match (it might not be displayed if search_only_leaves is set to true and the node is not a leaf). Default is `false`. * @name $.jstree.defaults.search.search_callback * @plugin search */ search_callback: false }; $.jstree.plugins.search = function (options, parent) { this.bind = function () { parent.bind.call(this); this._data.search.str = ""; this._data.search.dom = $(); this._data.search.res = []; this._data.search.opn = []; this._data.search.som = false; this._data.search.smc = false; this._data.search.hdn = []; this.element .on("search.jstree", $.proxy(function (e, data) { if (this._data.search.som && data.res.length) { var m = this._model.data, i, j, p = [], k, l; for (i = 0, j = data.res.length; i < j; i++) { if (m[data.res[i]] && !m[data.res[i]].state.hidden) { p.push(data.res[i]); p = p.concat(m[data.res[i]].parents); if (this._data.search.smc) { for (k = 0, l = m[data.res[i]].children_d.length; k < l; k++) { if (m[m[data.res[i]].children_d[k]] && !m[m[data.res[i]].children_d[k]].state.hidden) { p.push(m[data.res[i]].children_d[k]); } } } } } p = $.vakata.array_remove_item($.vakata.array_unique(p), $.jstree.root); this._data.search.hdn = this.hide_all(true); this.show_node(p, true); this.redraw(true); } }, this)) .on("clear_search.jstree", $.proxy(function (e, data) { if (this._data.search.som && data.res.length) { this.show_node(this._data.search.hdn, true); this.redraw(true); } }, this)); }; /** * used to search the tree nodes for a given string * @name search(str [, skip_async]) * @param {String} str the search string * @param {Boolean} skip_async if set to true server will not be queried even if configured * @param {Boolean} show_only_matches if set to true only matching nodes will be shown (keep in mind this can be very slow on large trees or old browsers) * @param {mixed} inside an optional node to whose children to limit the search * @param {Boolean} append if set to true the results of this search are appended to the previous search * @plugin search * @trigger search.jstree */ this.search = function (str, skip_async, show_only_matches, inside, append, show_only_matches_children) { if (str === false || $.trim(str.toString()) === "") { return this.clear_search(); } inside = this.get_node(inside); inside = inside && inside.id ? inside.id : null; str = str.toString(); var s = this.settings.search, a = s.ajax ? s.ajax : false, m = this._model.data, f = null, r = [], p = [], i, j; if (this._data.search.res.length && !append) { this.clear_search(); } if (show_only_matches === undefined) { show_only_matches = s.show_only_matches; } if (show_only_matches_children === undefined) { show_only_matches_children = s.show_only_matches_children; } if (!skip_async && a !== false) { if ($.isFunction(a)) { return a.call(this, str, $.proxy(function (d) { if (d && d.d) { d = d.d; } this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () { this.search(str, true, show_only_matches, inside, append, show_only_matches_children); }); }, this), inside); } else { a = $.extend({}, a); if (!a.data) { a.data = {}; } a.data.str = str; if (inside) { a.data.inside = inside; } if (this._data.search.lastRequest) { this._data.search.lastRequest.abort(); } this._data.search.lastRequest = $.ajax(a) .fail($.proxy(function () { this._data.core.last_error = { 'error': 'ajax', 'plugin': 'search', 'id': 'search_01', 'reason': 'Could not load search parents', 'data': JSON.stringify(a) }; this.settings.core.error.call(this, this._data.core.last_error); }, this)) .done($.proxy(function (d) { if (d && d.d) { d = d.d; } this._load_nodes(!$.isArray(d) ? [] : $.vakata.array_unique(d), function () { this.search(str, true, show_only_matches, inside, append, show_only_matches_children); }); }, this)); return this._data.search.lastRequest; } } if (!append) { this._data.search.str = str; this._data.search.dom = $(); this._data.search.res = []; this._data.search.opn = []; this._data.search.som = show_only_matches; this._data.search.smc = show_only_matches_children; } f = new $.vakata.search(str, true, { caseSensitive: s.case_sensitive, fuzzy: s.fuzzy }); $.each(m[inside ? inside : $.jstree.root].children_d, function (ii, i) { var v = m[i]; if (v.text && !v.state.hidden && (!s.search_leaves_only || (v.state.loaded && v.children.length === 0)) && ((s.search_callback && s.search_callback.call(this, str, v)) || (!s.search_callback && f.search(v.text).isMatch))) { r.push(i); p = p.concat(v.parents); } }); if (r.length) { p = $.vakata.array_unique(p); for (i = 0, j = p.length; i < j; i++) { if (p[i] !== $.jstree.root && m[p[i]] && this.open_node(p[i], null, 0) === true) { this._data.search.opn.push(p[i]); } } if (!append) { this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\$&') : v.replace($.jstree.idregex, '\\$&'); }).join(', #'))); this._data.search.res = r; } else { this._data.search.dom = this._data.search.dom.add($(this.element[0].querySelectorAll('#' + $.map(r, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\$&') : v.replace($.jstree.idregex, '\\$&'); }).join(', #')))); this._data.search.res = $.vakata.array_unique(this._data.search.res.concat(r)); } this._data.search.dom.children(".jstree-anchor").addClass('jstree-search'); } /** * triggered after search is complete * @event * @name search.jstree * @param {jQuery} nodes a jQuery collection of matching nodes * @param {String} str the search string * @param {Array} res a collection of objects represeing the matching nodes * @plugin search */ this.trigger('search', { nodes: this._data.search.dom, str: str, res: this._data.search.res, show_only_matches: show_only_matches }); }; /** * used to clear the last search (removes classes and shows all nodes if filtering is on) * @name clear_search() * @plugin search * @trigger clear_search.jstree */ this.clear_search = function () { if (this.settings.search.close_opened_onclear) { this.close_node(this._data.search.opn, 0); } /** * triggered after search is complete * @event * @name clear_search.jstree * @param {jQuery} nodes a jQuery collection of matching nodes (the result from the last search) * @param {String} str the search string (the last search string) * @param {Array} res a collection of objects represeing the matching nodes (the result from the last search) * @plugin search */ this.trigger('clear_search', { 'nodes': this._data.search.dom, str: this._data.search.str, res: this._data.search.res }); if (this._data.search.res.length) { this._data.search.dom = $(this.element[0].querySelectorAll('#' + $.map(this._data.search.res, function (v) { return "0123456789".indexOf(v[0]) !== -1 ? '\\3' + v[0] + ' ' + v.substr(1).replace($.jstree.idregex, '\\$&') : v.replace($.jstree.idregex, '\\$&'); }).join(', #'))); this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search"); } this._data.search.str = ""; this._data.search.res = []; this._data.search.opn = []; this._data.search.dom = $(); }; this.redraw_node = function (obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if (obj) { if ($.inArray(obj.id, this._data.search.res) !== -1) { var i, j, tmp = null; for (i = 0, j = obj.childNodes.length; i < j; i++) { if (obj.childNodes[i] && obj.childNodes[i].className && obj.childNodes[i].className.indexOf("jstree-anchor") !== -1) { tmp = obj.childNodes[i]; break; } } if (tmp) { tmp.className += ' jstree-search'; } } } return obj; }; }; // helpers (function ($) { // from http://kiro.me/projects/fuse.html $.vakata.search = function (pattern, txt, options) { options = options || {}; options = $.extend({}, $.vakata.search.defaults, options); if (options.fuzzy !== false) { options.fuzzy = true; } pattern = options.caseSensitive ? pattern : pattern.toLowerCase(); var MATCH_LOCATION = options.location, MATCH_DISTANCE = options.distance, MATCH_THRESHOLD = options.threshold, patternLen = pattern.length, matchmask, pattern_alphabet, match_bitapScore, search; if (patternLen > 32) { options.fuzzy = false; } if (options.fuzzy) { matchmask = 1 << (patternLen - 1); pattern_alphabet = (function () { var mask = {}, i = 0; for (i = 0; i < patternLen; i++) { mask[pattern.charAt(i)] = 0; } for (i = 0; i < patternLen; i++) { mask[pattern.charAt(i)] | = 1 << (patternLen - i - 1); } return mask; }()); match_bitapScore = function (e, x) { var accuracy = e / patternLen, proximity = Math.abs(MATCH_LOCATION - x); if (!MATCH_DISTANCE) { return proximity ? 1.0 : accuracy; } return accuracy + (proximity / MATCH_DISTANCE); }; } search = function (text) { text = options.caseSensitive ? text : text.toLowerCase(); if (pattern === text || text.indexOf(pattern) !== -1) { return { isMatch: true, score: 0 }; } if (!options.fuzzy) { return { isMatch: false, score: 1 }; } var i, j, textLen = text.length, scoreThreshold = MATCH_THRESHOLD, bestLoc = text.indexOf(pattern, MATCH_LOCATION), binMin, binMid, binMax = patternLen + textLen, lastRd, start, finish, rd, charMatch, score = 1, locations = []; if (bestLoc !== -1) { scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); bestLoc = text.lastIndexOf(pattern, MATCH_LOCATION + patternLen); if (bestLoc !== -1) { scoreThreshold = Math.min(match_bitapScore(0, bestLoc), scoreThreshold); } } bestLoc = -1; for (i = 0; i < patternLen; i++) { binMin = 0; binMid = binMax; while (binMin < binMid) { if (match_bitapScore(i, MATCH_LOCATION + binMid) <= scoreThreshold) { binMin = binMid; } else { binMax = binMid; } binMid = Math.floor((binMax - binMin) / 2 + binMin); } binMax = binMid; start = Math.max(1, MATCH_LOCATION - binMid + 1); finish = Math.min(MATCH_LOCATION + binMid, textLen) + patternLen; rd = new Array(finish + 2); rd[finish + 1] = (1 << i) - 1; for (j = finish; j >= start; j--) { charMatch = pattern_alphabet[text.charAt(j - 1)]; if (i === 0) { rd[j] = ((rd[j + 1] << 1) | 1) & charMatch; } else { rd[j] = ((rd[j + 1] << 1) | 1) & charMatch | (((lastRd[j + 1] | lastRd[j]) << 1) | 1) | lastRd[j + 1]; } if (rd[j] & matchmask) { score = match_bitapScore(i, j - 1); if (score <= scoreThreshold) { scoreThreshold = score; bestLoc = j - 1; locations.push(bestLoc); if (bestLoc > MATCH_LOCATION) { start = Math.max(1, 2 * MATCH_LOCATION - bestLoc); } else { break; } } } } if (match_bitapScore(i + 1, MATCH_LOCATION) > scoreThreshold) { break; } lastRd = rd; } return { isMatch: bestLoc >= 0, score: score }; }; return txt === true ? { 'search' : search } : search(txt); }; $.vakata.search.defaults = { location: 0, distance: 100, threshold: 0.6, fuzzy: false, caseSensitive: false }; }($)); // include the search plugin by default // $.jstree.defaults.plugins.push("search"); /** * ### Sort plugin * * Automatically sorts all siblings in the tree according to a sorting function. */ /** * the settings function used to sort the nodes. * It is executed in the tree's context, accepts two nodes as arguments and should return `1` or `-1`. * @name $.jstree.defaults.sort * @plugin sort */ $.jstree.defaults.sort = function (a, b) { //return this.get_type(a) === this.get_type(b) ? (this.get_text(a) > this.get_text(b) ? 1 : -1) : this.get_type(a) >= this.get_type(b); return this.get_text(a) > this.get_text(b) ? 1 : -1; }; $.jstree.plugins.sort = function (options, parent) { this.bind = function () { parent.bind.call(this); this.element .on("model.jstree", $.proxy(function (e, data) { this.sort(data.parent, true); }, this)) .on("rename_node.jstree create_node.jstree", $.proxy(function (e, data) { this.sort(data.parent || data.node.parent, false); this.redraw_node(data.parent || data.node.parent, true); }, this)) .on("move_node.jstree copy_node.jstree", $.proxy(function (e, data) { this.sort(data.parent, false); this.redraw_node(data.parent, true); }, this)); }; /** * used to sort a node's children * @private * @name sort(obj [, deep]) * @param {mixed} obj the node * @param {Boolean} deep if set to `true` nodes are sorted recursively. * @plugin sort * @trigger search.jstree */ this.sort = function (obj, deep) { var i, j; obj = this.get_node(obj); if (obj && obj.children && obj.children.length) { obj.children.sort($.proxy(this.settings.sort, this)); if (deep) { for (i = 0, j = obj.children_d.length; i < j; i++) { this.sort(obj.children_d[i], false); } } } }; }; // include the sort plugin by default // $.jstree.defaults.plugins.push("sort"); /** * ### State plugin * * Saves the state of the tree (selected nodes, opened nodes) on the user's computer using available options (localStorage, cookies, etc) */ var to = false; /** * stores all defaults for the state plugin * @name $.jstree.defaults.state * @plugin state */ $.jstree.defaults.state = { /** * A string for the key to use when saving the current tree (change if using multiple trees in your project). Defaults to `jstree`. * @name $.jstree.defaults.state.key * @plugin state */ key: 'jstree', /** * A space separated list of events that trigger a state save. Defaults to `changed.jstree open_node.jstree close_node.jstree`. * @name $.jstree.defaults.state.events * @plugin state */ events: 'changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree', /** * Time in milliseconds after which the state will expire. Defaults to 'false' meaning - no expire. * @name $.jstree.defaults.state.ttl * @plugin state */ ttl: false, /** * A function that will be executed prior to restoring state with one argument - the state object. Can be used to clear unwanted parts of the state. * @name $.jstree.defaults.state.filter * @plugin state */ filter: false, /** * Should loaded nodes be restored (setting this to true means that it is possible that the whole tree will be loaded for some users - use with caution). Defaults to `false` * @name $.jstree.defaults.state.preserve_loaded * @plugin state */ preserve_loaded: false }; $.jstree.plugins.state = function (options, parent) { this.bind = function () { parent.bind.call(this); var bind = $.proxy(function () { this.element.on(this.settings.state.events, $.proxy(function () { if (to) { clearTimeout(to); } to = setTimeout($.proxy(function () { this.save_state(); }, this), 100); }, this)); /** * triggered when the state plugin is finished restoring the state (and immediately after ready if there is no state to restore). * @event * @name state_ready.jstree * @plugin state */ this.trigger('state_ready'); }, this); this.element .on("ready.jstree", $.proxy(function (e, data) { this.element.one("restore_state.jstree", bind); if (!this.restore_state()) { bind(); } }, this)); }; /** * save the state * @name save_state() * @plugin state */ this.save_state = function () { var tm = this.get_state(); if (!this.settings.state.preserve_loaded) { delete tm.core.loaded; } var st = { 'state': tm, 'ttl': this.settings.state.ttl, 'sec': +(new Date()) }; $.vakata.storage.set(this.settings.state.key, JSON.stringify(st)); }; /** * restore the state from the user's computer * @name restore_state() * @plugin state */ this.restore_state = function () { var k = $.vakata.storage.get(this.settings.state.key); if (!!k) { try { k = JSON.parse(k); } catch (ex) { return false; } } if (!!k && k.ttl && k.sec && +(new Date()) - k.sec > k.ttl) { return false; } if (!!k && k.state) { k = k.state; } if (!!k && $.isFunction(this.settings.state.filter)) { k = this.settings.state.filter.call(this, k); } if (!!k) { if (!this.settings.state.preserve_loaded) { delete k.core.loaded; } this.element.one("set_state.jstree", function (e, data) { data.instance.trigger('restore_state', { 'state': $.extend(true, {}, k) }); }); this.set_state(k); return true; } return false; }; /** * clear the state on the user's computer * @name clear_state() * @plugin state */ this.clear_state = function () { return $.vakata.storage.del(this.settings.state.key); }; }; (function ($, undefined) { $.vakata.storage = { // simply specifying the functions in FF throws an error set: function (key, val) { return window.localStorage.setItem(key, val); }, get: function (key) { return window.localStorage.getItem(key); }, del: function (key) { return window.localStorage.removeItem(key); } }; }($)); // include the state plugin by default // $.jstree.defaults.plugins.push("state"); /** * ### Types plugin * * Makes it possible to add predefined types for groups of nodes, which make it possible to easily control nesting rules and icon for each group. */ /** * An object storing all types as key value pairs, where the key is the type name and the value is an object that could contain following keys (all optional). * * * `max_children` the maximum number of immediate children this node type can have. Do not specify or set to `-1` for unlimited. * * `max_depth` the maximum number of nesting this node type can have. A value of `1` would mean that the node can have children, but no grandchildren. Do not specify or set to `-1` for unlimited. * * `valid_children` an array of node type strings, that nodes of this type can have as children. Do not specify or set to `-1` for no limits. * * `icon` a string - can be a path to an icon or a className, if using an image that is in the current directory use a `./` prefix, otherwise it will be detected as a class. Omit to use the default icon from your theme. * * `li_attr` an object of values which will be used to add HTML attributes on the resulting LI DOM node (merged with the node's own data) * * `a_attr` an object of values which will be used to add HTML attributes on the resulting A DOM node (merged with the node's own data) * * There are two predefined types: * * * `#` represents the root of the tree, for example `max_children` would control the maximum number of root nodes. * * `default` represents the default node - any settings here will be applied to all nodes that do not have a type specified. * * @name $.jstree.defaults.types * @plugin types */ $.jstree.defaults.types = { 'default': {} }; $.jstree.defaults.types[$.jstree.root] = {}; $.jstree.plugins.types = function (options, parent) { this.init = function (el, options) { var i, j; if (options && options.types && options.types['default']) { for (i in options.types) { if (i !== "default" && i !== $.jstree.root && options.types.hasOwnProperty(i)) { for (j in options.types['default']) { if (options.types['default'].hasOwnProperty(j) && options.types[i][j] === undefined) { options.types[i][j] = options.types['default'][j]; } } } } } parent.init.call(this, el, options); this._model.data[$.jstree.root].type = $.jstree.root; }; this.refresh = function (skip_loading, forget_state) { parent.refresh.call(this, skip_loading, forget_state); this._model.data[$.jstree.root].type = $.jstree.root; }; this.bind = function () { this.element .on('model.jstree', $.proxy(function (e, data) { var m = this._model.data, dpc = data.nodes, t = this.settings.types, i, j, c = 'default', k; for (i = 0, j = dpc.length; i < j; i++) { c = 'default'; if (m[dpc[i]].original && m[dpc[i]].original.type && t[m[dpc[i]].original.type]) { c = m[dpc[i]].original.type; } if (m[dpc[i]].data && m[dpc[i]].data.jstree && m[dpc[i]].data.jstree.type && t[m[dpc[i]].data.jstree.type]) { c = m[dpc[i]].data.jstree.type; } m[dpc[i]].type = c; if (m[dpc[i]].icon === true && t[c].icon !== undefined) { m[dpc[i]].icon = t[c].icon; } if (t[c].li_attr !== undefined && typeof t[c].li_attr === 'object') { for (k in t[c].li_attr) { if (t[c].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[dpc[i]].li_attr[k] === undefined) { m[dpc[i]].li_attr[k] = t[c].li_attr[k]; } else if (k === 'class') { m[dpc[i]].li_attr['class'] = t[c].li_attr['class'] + ' ' + m[dpc[i]].li_attr['class']; } } } } if (t[c].a_attr !== undefined && typeof t[c].a_attr === 'object') { for (k in t[c].a_attr) { if (t[c].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[dpc[i]].a_attr[k] === undefined) { m[dpc[i]].a_attr[k] = t[c].a_attr[k]; } else if (k === 'href' && m[dpc[i]].a_attr[k] === '#') { m[dpc[i]].a_attr['href'] = t[c].a_attr['href']; } else if (k === 'class') { m[dpc[i]].a_attr['class'] = t[c].a_attr['class'] + ' ' + m[dpc[i]].a_attr['class']; } } } } } m[$.jstree.root].type = $.jstree.root; }, this)); parent.bind.call(this); }; this.get_json = function (obj, options, flat) { var i, j, m = this._model.data, opt = options ? $.extend(true, {}, options, { no_id : false }) : {}, tmp = parent.get_json.call(this, obj, opt, flat); if (tmp === false) { return false; } if ($.isArray(tmp)) { for (i = 0, j = tmp.length; i < j; i++) { tmp[i].type = tmp[i].id && m[tmp[i].id] && m[tmp[i].id].type ? m[tmp[i].id].type : "default"; if (options && options.no_id) { delete tmp[i].id; if (tmp[i].li_attr && tmp[i].li_attr.id) { delete tmp[i].li_attr.id; } if (tmp[i].a_attr && tmp[i].a_attr.id) { delete tmp[i].a_attr.id; } } } } else { tmp.type = tmp.id && m[tmp.id] && m[tmp.id].type ? m[tmp.id].type : "default"; if (options && options.no_id) { tmp = this._delete_ids(tmp); } } return tmp; }; this._delete_ids = function (tmp) { if ($.isArray(tmp)) { for (var i = 0, j = tmp.length; i < j; i++) { tmp[i] = this._delete_ids(tmp[i]); } return tmp; } delete tmp.id; if (tmp.li_attr && tmp.li_attr.id) { delete tmp.li_attr.id; } if (tmp.a_attr && tmp.a_attr.id) { delete tmp.a_attr.id; } if (tmp.children && $.isArray(tmp.children)) { tmp.children = this._delete_ids(tmp.children); } return tmp; }; this.check = function (chk, obj, par, pos, more) { if (parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } obj = obj && obj.id ? obj : this.get_node(obj); par = par && par.id ? par : this.get_node(par); var m = obj && obj.id ? (more && more.origin ? more.origin : $.jstree.reference(obj.id)) : null, tmp, d, i, j; m = m && m._model && m._model.data ? m._model.data : null; switch (chk) { case "create_node": case "move_node": case "copy_node": if (chk !== 'move_node' || $.inArray(obj.id, par.children) === -1) { tmp = this.get_rules(par); if (tmp.max_children !== undefined && tmp.max_children !== -1 && tmp.max_children === par.children.length) { this._data.core.last_error = { 'error': 'check', 'plugin': 'types', 'id': 'types_01', 'reason': 'max_children prevents function: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } if (tmp.valid_children !== undefined && tmp.valid_children !== -1 && $.inArray((obj.type || 'default'), tmp.valid_children) === -1) { this._data.core.last_error = { 'error': 'check', 'plugin': 'types', 'id': 'types_02', 'reason': 'valid_children prevents function: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } if (m && obj.children_d && obj.parents) { d = 0; for (i = 0, j = obj.children_d.length; i < j; i++) { d = Math.max(d, m[obj.children_d[i]].parents.length); } d = d - obj.parents.length + 1; } if (d <= 0 || d === undefined) { d = 1; } do { if (tmp.max_depth !== undefined && tmp.max_depth !== -1 && tmp.max_depth < d) { this._data.core.last_error = { 'error': 'check', 'plugin': 'types', 'id': 'types_03', 'reason': 'max_depth prevents function: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; return false; } par = this.get_node(par.parent); tmp = this.get_rules(par); d++; } while (par); } break; } return true; }; /** * used to retrieve the type settings object for a node * @name get_rules(obj) * @param {mixed} obj the node to find the rules for * @return {Object} * @plugin types */ this.get_rules = function (obj) { obj = this.get_node(obj); if (!obj) { return false; } var tmp = this.get_type(obj, true); if (tmp.max_depth === undefined) { tmp.max_depth = -1; } if (tmp.max_children === undefined) { tmp.max_children = -1; } if (tmp.valid_children === undefined) { tmp.valid_children = -1; } return tmp; }; /** * used to retrieve the type string or settings object for a node * @name get_type(obj [, rules]) * @param {mixed} obj the node to find the rules for * @param {Boolean} rules if set to `true` instead of a string the settings object will be returned * @return {String|Object} * @plugin types */ this.get_type = function (obj, rules) { obj = this.get_node(obj); return (!obj) ? false : (rules ? $.extend({ 'type' : obj.type }, this.settings.types[obj.type]) : obj.type); }; /** * used to change a node's type * @name set_type(obj, type) * @param {mixed} obj the node to change * @param {String} type the new type * @plugin types */ this.set_type = function (obj, type) { var m = this._model.data, t, t1, t2, old_type, old_icon, k, d, a; if ($.isArray(obj)) { obj = obj.slice(); for (t1 = 0, t2 = obj.length; t1 < t2; t1++) { this.set_type(obj[t1], type); } return true; } t = this.settings.types; obj = this.get_node(obj); if (!t[type] || !obj) { return false; } d = this.get_node(obj, true); if (d && d.length) { a = d.children('.jstree-anchor'); } old_type = obj.type; old_icon = this.get_icon(obj); obj.type = type; if (old_icon === true || !t[old_type] || (t[old_type].icon !== undefined && old_icon === t[old_type].icon)) { this.set_icon(obj, t[type].icon !== undefined ? t[type].icon : true); } // remove old type props if (t[old_type] && t[old_type].li_attr !== undefined && typeof t[old_type].li_attr === 'object') { for (k in t[old_type].li_attr) { if (t[old_type].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (k === 'class') { m[obj.id].li_attr['class'] = (m[obj.id].li_attr['class'] || '').replace(t[old_type].li_attr[k], ''); if (d) { d.removeClass(t[old_type].li_attr[k]); } } else if (m[obj.id].li_attr[k] === t[old_type].li_attr[k]) { m[obj.id].li_attr[k] = null; if (d) { d.removeAttr(k); } } } } } if (t[old_type] && t[old_type].a_attr !== undefined && typeof t[old_type].a_attr === 'object') { for (k in t[old_type].a_attr) { if (t[old_type].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (k === 'class') { m[obj.id].a_attr['class'] = (m[obj.id].a_attr['class'] || '').replace(t[old_type].a_attr[k], ''); if (a) { a.removeClass(t[old_type].a_attr[k]); } } else if (m[obj.id].a_attr[k] === t[old_type].a_attr[k]) { if (k === 'href') { m[obj.id].a_attr[k] = '#'; if (a) { a.attr('href', '#'); } } else { delete m[obj.id].a_attr[k]; if (a) { a.removeAttr(k); } } } } } } // add new props if (t[type].li_attr !== undefined && typeof t[type].li_attr === 'object') { for (k in t[type].li_attr) { if (t[type].li_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[obj.id].li_attr[k] === undefined) { m[obj.id].li_attr[k] = t[type].li_attr[k]; if (d) { if (k === 'class') { d.addClass(t[type].li_attr[k]); } else { d.attr(k, t[type].li_attr[k]); } } } else if (k === 'class') { m[obj.id].li_attr['class'] = t[type].li_attr[k] + ' ' + m[obj.id].li_attr['class']; if (d) { d.addClass(t[type].li_attr[k]); } } } } } if (t[type].a_attr !== undefined && typeof t[type].a_attr === 'object') { for (k in t[type].a_attr) { if (t[type].a_attr.hasOwnProperty(k)) { if (k === 'id') { continue; } else if (m[obj.id].a_attr[k] === undefined) { m[obj.id].a_attr[k] = t[type].a_attr[k]; if (a) { if (k === 'class') { a.addClass(t[type].a_attr[k]); } else { a.attr(k, t[type].a_attr[k]); } } } else if (k === 'href' && m[obj.id].a_attr[k] === '#') { m[obj.id].a_attr['href'] = t[type].a_attr['href']; if (a) { a.attr('href', t[type].a_attr['href']); } } else if (k === 'class') { m[obj.id].a_attr['class'] = t[type].a_attr['class'] + ' ' + m[obj.id].a_attr['class']; if (a) { a.addClass(t[type].a_attr[k]); } } } } } return true; }; }; // include the types plugin by default // $.jstree.defaults.plugins.push("types"); /** * ### Unique plugin * * Enforces that no nodes with the same name can coexist as siblings. */ /** * stores all defaults for the unique plugin * @name $.jstree.defaults.unique * @plugin unique */ $.jstree.defaults.unique = { /** * Indicates if the comparison should be case sensitive. Default is `false`. * @name $.jstree.defaults.unique.case_sensitive * @plugin unique */ case_sensitive: false, /** * Indicates if white space should be trimmed before the comparison. Default is `false`. * @name $.jstree.defaults.unique.trim_whitespace * @plugin unique */ trim_whitespace: false, /** * A callback executed in the instance's scope when a new node is created and the name is already taken, the two arguments are the conflicting name and the counter. The default will produce results like `New node (2)`. * @name $.jstree.defaults.unique.duplicate * @plugin unique */ duplicate: function (name, counter) { return name + ' (' + counter + ')'; } }; $.jstree.plugins.unique = function (options, parent) { this.check = function (chk, obj, par, pos, more) { if (parent.check.call(this, chk, obj, par, pos, more) === false) { return false; } obj = obj && obj.id ? obj : this.get_node(obj); par = par && par.id ? par : this.get_node(par); if (!par || !par.children) { return true; } var n = chk === "rename_node" ? pos : obj.text, c = [], s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, m = this._model.data, i, j, t; for (i = 0, j = par.children.length; i < j; i++) { t = m[par.children[i]].text; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } c.push(t); } if (!s) { n = n.toLowerCase(); } if (w) { n = n.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } switch (chk) { case "delete_node": return true; case "rename_node": t = obj.text || ''; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } i = ($.inArray(n, c) === -1 || (obj.text && t === n)); if (!i) { this._data.core.last_error = { 'error': 'check', 'plugin': 'unique', 'id': 'unique_01', 'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return i; case "create_node": i = ($.inArray(n, c) === -1); if (!i) { this._data.core.last_error = { 'error': 'check', 'plugin': 'unique', 'id': 'unique_04', 'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return i; case "copy_node": i = ($.inArray(n, c) === -1); if (!i) { this._data.core.last_error = { 'error': 'check', 'plugin': 'unique', 'id': 'unique_02', 'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return i; case "move_node": i = ((obj.parent === par.id && (!more || !more.is_multi)) || $.inArray(n, c) === -1); if (!i) { this._data.core.last_error = { 'error': 'check', 'plugin': 'unique', 'id': 'unique_03', 'reason': 'Child with name ' + n + ' already exists. Preventing: ' + chk, 'data': JSON.stringify({ 'chk': chk, 'pos': pos, 'obj': obj && obj.id ? obj.id : false, 'par' : par && par.id ? par.id : false }) }; } return i; } return true; }; this.create_node = function (par, node, pos, callback, is_loaded) { if (!node || node.text === undefined) { if (par === null) { par = $.jstree.root; } par = this.get_node(par); if (!par) { return parent.create_node.call(this, par, node, pos, callback, is_loaded); } pos = pos === undefined ? "last" : pos; if (!pos.toString().match(/^(before|after)$/) && !is_loaded && !this.is_loaded(par)) { return parent.create_node.call(this, par, node, pos, callback, is_loaded); } if (!node) { node = {}; } var tmp, n, dpc, i, j, m = this._model.data, s = this.settings.unique.case_sensitive, w = this.settings.unique.trim_whitespace, cb = this.settings.unique.duplicate, t; n = tmp = this.get_string('New node'); dpc = []; for (i = 0, j = par.children.length; i < j; i++) { t = m[par.children[i]].text; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } dpc.push(t); } i = 1; t = n; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } while ($.inArray(t, dpc) !== -1) { n = cb.call(this, tmp, (++i)).toString(); t = n; if (!s) { t = t.toLowerCase(); } if (w) { t = t.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); } } node.text = n; } return parent.create_node.call(this, par, node, pos, callback, is_loaded); }; }; // include the unique plugin by default // $.jstree.defaults.plugins.push("unique"); /** * ### Wholerow plugin * * Makes each node appear block level. Making selection easier. May cause slow down for large trees in old browsers. */ var div = document.createElement('DIV'); div.setAttribute('unselectable', 'on'); div.setAttribute('role', 'presentation'); div.className = 'jstree-wholerow'; div.innerHTML = ' '; $.jstree.plugins.wholerow = function (options, parent) { this.bind = function () { parent.bind.call(this); this.element .on('ready.jstree set_state.jstree', $.proxy(function () { this.hide_dots(); }, this)) .on("init.jstree loading.jstree ready.jstree", $.proxy(function () { //div.style.height = this._data.core.li_height + 'px'; this.get_container_ul().addClass('jstree-wholerow-ul'); }, this)) .on("deselect_all.jstree", $.proxy(function (e, data) { this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); }, this)) .on("changed.jstree", $.proxy(function (e, data) { this.element.find('.jstree-wholerow-clicked').removeClass('jstree-wholerow-clicked'); var tmp = false, i, j; for (i = 0, j = data.selected.length; i < j; i++) { tmp = this.get_node(data.selected[i], true); if (tmp && tmp.length) { tmp.children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); } } }, this)) .on("open_node.jstree", $.proxy(function (e, data) { this.get_node(data.node, true).find('.jstree-clicked').parent().children('.jstree-wholerow').addClass('jstree-wholerow-clicked'); }, this)) .on("hover_node.jstree dehover_node.jstree", $.proxy(function (e, data) { if (e.type === "hover_node" && this.is_disabled(data.node)) { return; } this.get_node(data.node, true).children('.jstree-wholerow')[e.type === "hover_node" ? "addClass" : "removeClass"]('jstree-wholerow-hovered'); }, this)) .on("contextmenu.jstree", ".jstree-wholerow", $.proxy(function (e) { if (this._data.contextmenu) { e.preventDefault(); var tmp = $.Event('contextmenu', { metaKey: e.metaKey, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey, pageX: e.pageX, pageY: e.pageY }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp); } }, this)) /*! .on("mousedown.jstree touchstart.jstree", ".jstree-wholerow", function (e) { if(e.target === e.currentTarget) { var a = $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor"); e.target = a[0]; a.trigger(e); } }) */ .on("click.jstree", ".jstree-wholerow", function (e) { e.stopImmediatePropagation(); var tmp = $.Event('click', { metaKey: e.metaKey, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).focus(); }) .on("dblclick.jstree", ".jstree-wholerow", function (e) { e.stopImmediatePropagation(); var tmp = $.Event('dblclick', { metaKey: e.metaKey, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).focus(); }) .on("click.jstree", ".jstree-leaf > .jstree-ocl", $.proxy(function (e) { e.stopImmediatePropagation(); var tmp = $.Event('click', { metaKey: e.metaKey, ctrlKey: e.ctrlKey, altKey: e.altKey, shiftKey: e.shiftKey }); $(e.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(tmp).focus(); }, this)) .on("mouseover.jstree", ".jstree-wholerow, .jstree-icon", $.proxy(function (e) { e.stopImmediatePropagation(); if (!this.is_disabled(e.currentTarget)) { this.hover_node(e.currentTarget); } return false; }, this)) .on("mouseleave.jstree", ".jstree-node", $.proxy(function (e) { this.dehover_node(e.currentTarget); }, this)); }; this.teardown = function () { if (this.settings.wholerow) { this.element.find(".jstree-wholerow").remove(); } parent.teardown.call(this); }; this.redraw_node = function (obj, deep, callback, force_render) { obj = parent.redraw_node.apply(this, arguments); if (obj) { var tmp = div.cloneNode(true); //tmp.style.height = this._data.core.li_height + 'px'; if ($.inArray(obj.id, this._data.core.selected) !== -1) { tmp.className += ' jstree-wholerow-clicked'; } if (this._data.core.focused && this._data.core.focused === obj.id) { tmp.className += ' jstree-wholerow-hovered'; } obj.insertBefore(tmp, obj.childNodes[0]); } return obj; }; }; // include the wholerow plugin by default // $.jstree.defaults.plugins.push("wholerow"); if (window.customElements && Object && Object.create) { var proto = Object.create(HTMLElement.prototype); proto.createdCallback = function () { var c = { core: {}, plugins: [] }, i; for (i in $.jstree.plugins) { if ($.jstree.plugins.hasOwnProperty(i) && this.attributes[i]) { c.plugins.push(i); if (this.getAttribute(i) && JSON.parse(this.getAttribute(i))) { c[i] = JSON.parse(this.getAttribute(i)); } } } for (i in $.jstree.defaults.core) { if ($.jstree.defaults.core.hasOwnProperty(i) && this.attributes[i]) { c.core[i] = JSON.parse(this.getAttribute(i)) || this.getAttribute(i); } } $(this).jstree(c); }; // proto.attributeChangedCallback = function (name, previous, value) { }; try { window.customElements.define("vakata-jstree", function () {}, { prototype: proto }); } catch (ignore) { } } }));assets/js/jstree/jstree.min.js000064400000417277147600374260012425 0ustar00;;;/*! jsTree - v3.3.7 - 2018-11-06 - (MIT) */ !function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a,b){"use strict";if(!a.jstree){var c=0,d=!1,e=!1,f=!1,g=[],h=a("script:last").attr("src"),i=window.document;a.jstree={version:"3.3.7",defaults:{plugins:[]},plugins:{},path:h&&-1!==h.indexOf("/")?h.replace(/\/[^\/]+$/,""):"",idregex:/[\\:&!^|()\[\]<>@*'+~#";.,=\- \/${}%?`]/g,root:"#"},a.jstree.create=function(b,d){var e=new a.jstree.core(++c),f=d;return d=a.extend(!0,{},a.jstree.defaults,d),f&&f.plugins&&(d.plugins=f.plugins),a.each(d.plugins,function(a,b){"core"!==a&&(e=e.plugin(b,d[b]))}),a(b).data("jstree",e),e.init(b,d),e},a.jstree.destroy=function(){a(".jstree:jstree").jstree("destroy"),a(i).off(".jstree")},a.jstree.core=function(a){this._id=a,this._cnt=0,this._wrk=null,this._data={core:{themes:{name:!1,dots:!1,icons:!1,ellipsis:!1},selected:[],last_error:{},working:!1,worker_queue:[],focused:null}}},a.jstree.reference=function(b){var c=null,d=null;if(!b||!b.id||b.tagName&&b.nodeType||(b=b.id),!d||!d.length)try{d=a(b)}catch(e){}if(!d||!d.length)try{d=a("#"+b.replace(a.jstree.idregex,"\\$&"))}catch(e){}return d&&d.length&&(d=d.closest(".jstree")).length&&(d=d.data("jstree"))?c=d:a(".jstree").each(function(){var d=a(this).data("jstree");return d&&d._model.data[b]?(c=d,!1):void 0}),c},a.fn.jstree=function(c){var d="string"==typeof c,e=Array.prototype.slice.call(arguments,1),f=null;return c!==!0||this.length?(this.each(function(){var g=a.jstree.reference(this),h=d&&g?g[c]:null;return f=d&&h?h.apply(g,e):null,g||d||c!==b&&!a.isPlainObject(c)||a.jstree.create(this,c),(g&&!d||c===!0)&&(f=g||!1),null!==f&&f!==b?!1:void 0}),null!==f&&f!==b?f:this):!1},a.expr.pseudos.jstree=a.expr.createPseudo(function(c){return function(c){return a(c).hasClass("jstree")&&a(c).data("jstree")!==b}}),a.jstree.defaults.core={data:!1,strings:!1,check_callback:!1,error:a.noop,animation:200,multiple:!0,themes:{name:!1,url:!1,dir:!1,dots:!0,icons:!0,ellipsis:!1,stripes:!1,variant:!1,responsive:!1},expand_selected_onload:!0,worker:!0,force_text:!1,dblclick_toggle:!0,loaded_state:!1,restore_focus:!0,keyboard:{"ctrl-space":function(b){b.type="click",a(b.currentTarget).trigger(b)},enter:function(b){b.type="click",a(b.currentTarget).trigger(b)},left:function(b){if(b.preventDefault(),this.is_open(b.currentTarget))this.close_node(b.currentTarget);else{var c=this.get_parent(b.currentTarget);c&&c.id!==a.jstree.root&&this.get_node(c,!0).children(".jstree-anchor").focus()}},up:function(a){a.preventDefault();var b=this.get_prev_dom(a.currentTarget);b&&b.length&&b.children(".jstree-anchor").focus()},right:function(b){if(b.preventDefault(),this.is_closed(b.currentTarget))this.open_node(b.currentTarget,function(a){this.get_node(a,!0).children(".jstree-anchor").focus()});else if(this.is_open(b.currentTarget)){var c=this.get_node(b.currentTarget,!0).children(".jstree-children")[0];c&&a(this._firstChild(c)).children(".jstree-anchor").focus()}},down:function(a){a.preventDefault();var b=this.get_next_dom(a.currentTarget);b&&b.length&&b.children(".jstree-anchor").focus()},"*":function(a){this.open_all()},home:function(b){b.preventDefault();var c=this._firstChild(this.get_container_ul()[0]);c&&a(c).children(".jstree-anchor").filter(":visible").focus()},end:function(a){a.preventDefault(),this.element.find(".jstree-anchor").filter(":visible").last().focus()},f2:function(a){a.preventDefault(),this.edit(a.currentTarget)}}},a.jstree.core.prototype={plugin:function(b,c){var d=a.jstree.plugins[b];return d?(this._data[b]={},d.prototype=this,new d(c,this)):this},init:function(b,c){this._model={data:{},changed:[],force_full_redraw:!1,redraw_timeout:!1,default_state:{loaded:!0,opened:!1,selected:!1,disabled:!1}},this._model.data[a.jstree.root]={id:a.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this.element=a(b).addClass("jstree jstree-"+this._id),this.settings=c,this._data.core.ready=!1,this._data.core.loaded=!1,this._data.core.rtl="rtl"===this.element.css("direction"),this.element[this._data.core.rtl?"addClass":"removeClass"]("jstree-rtl"),this.element.attr("role","tree"),this.settings.core.multiple&&this.element.attr("aria-multiselectable",!0),this.element.attr("tabindex")||this.element.attr("tabindex","0"),this.bind(),this.trigger("init"),this._data.core.original_container_html=this.element.find(" > ul > li").clone(!0),this._data.core.original_container_html.find("li").addBack().contents().filter(function(){return 3===this.nodeType&&(!this.nodeValue||/^\s+$/.test(this.nodeValue))}).remove(),this.element.html(""),this.element.attr("aria-activedescendant","j"+this._id+"_loading"),this._data.core.li_height=this.get_container_ul().children("li").first().outerHeight()||24,this._data.core.node=this._create_prototype_node(),this.trigger("loading"),this.load_node(a.jstree.root)},destroy:function(a){if(this.trigger("destroy"),this._wrk)try{window.URL.revokeObjectURL(this._wrk),this._wrk=null}catch(b){}a||this.element.empty(),this.teardown()},_create_prototype_node:function(){var a=i.createElement("LI"),b,c;return a.setAttribute("role","treeitem"),b=i.createElement("I"),b.className="jstree-icon jstree-ocl",b.setAttribute("role","presentation"),a.appendChild(b),b=i.createElement("A"),b.className="jstree-anchor",b.setAttribute("href","#"),b.setAttribute("tabindex","-1"),c=i.createElement("I"),c.className="jstree-icon jstree-themeicon",c.setAttribute("role","presentation"),b.appendChild(c),a.appendChild(b),b=c=null,a},_kbevent_to_func:function(a){var b={8:"Backspace",9:"Tab",13:"Return",19:"Pause",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"Print",45:"Insert",46:"Delete",96:"Numpad0",97:"Numpad1",98:"Numpad2",99:"Numpad3",100:"Numpad4",101:"Numpad5",102:"Numpad6",103:"Numpad7",104:"Numpad8",105:"Numpad9","-13":"NumpadEnter",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"Numlock",145:"Scrolllock",16:"Shift",17:"Ctrl",18:"Alt",48:"0",49:"1",50:"2",51:"3",52:"4",53:"5",54:"6",55:"7",56:"8",57:"9",59:";",61:"=",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",71:"g",72:"h",73:"i",74:"j",75:"k",76:"l",77:"m",78:"n",79:"o",80:"p",81:"q",82:"r",83:"s",84:"t",85:"u",86:"v",87:"w",88:"x",89:"y",90:"z",107:"+",109:"-",110:".",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",111:"/",106:"*",173:"-"},c=[];a.ctrlKey&&c.push("ctrl"),a.altKey&&c.push("alt"),a.shiftKey&&c.push("shift"),c.push(b[a.which]||a.which),c=c.sort().join("-").toLowerCase();var d=this.settings.core.keyboard,e,f;for(e in d)if(d.hasOwnProperty(e)&&(f=e,"-"!==f&&"+"!==f&&(f=f.replace("--","-MINUS").replace("+-","-MINUS").replace("++","-PLUS").replace("-+","-PLUS"),f=f.split(/-|\+/).sort().join("-").replace("MINUS","-").replace("PLUS","+").toLowerCase()),f===c))return d[e];return null},teardown:function(){this.unbind(),this.element.removeClass("jstree").removeData("jstree").find("[class^='jstree']").addBack().attr("class",function(){return this.className.replace(/jstree[^ ]*|$/gi,"")}),this.element=null},bind:function(){var b="",c=null,d=0;this.element.on("dblclick.jstree",function(a){if(a.target.tagName&&"input"===a.target.tagName.toLowerCase())return!0;if(i.selection&&i.selection.empty)i.selection.empty();else if(window.getSelection){var b=window.getSelection();try{b.removeAllRanges(),b.collapse()}catch(c){}}}).on("mousedown.jstree",a.proxy(function(a){a.target===this.element[0]&&(a.preventDefault(),d=+new Date)},this)).on("mousedown.jstree",".jstree-ocl",function(a){a.preventDefault()}).on("click.jstree",".jstree-ocl",a.proxy(function(a){this.toggle_node(a.target)},this)).on("dblclick.jstree",".jstree-anchor",a.proxy(function(a){return a.target.tagName&&"input"===a.target.tagName.toLowerCase()?!0:void(this.settings.core.dblclick_toggle&&this.toggle_node(a.target))},this)).on("click.jstree",".jstree-anchor",a.proxy(function(b){b.preventDefault(),b.currentTarget!==i.activeElement&&a(b.currentTarget).focus(),this.activate_node(b.currentTarget,b)},this)).on("keydown.jstree",".jstree-anchor",a.proxy(function(a){if(a.target.tagName&&"input"===a.target.tagName.toLowerCase())return!0;this._data.core.rtl&&(37===a.which?a.which=39:39===a.which&&(a.which=37));var b=this._kbevent_to_func(a);if(b){var c=b.call(this,a);if(c===!1||c===!0)return c}},this)).on("load_node.jstree",a.proxy(function(b,c){c.status&&(c.node.id!==a.jstree.root||this._data.core.loaded||(this._data.core.loaded=!0,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.trigger("loaded")),this._data.core.ready||setTimeout(a.proxy(function(){if(this.element&&!this.get_container_ul().find(".jstree-loading").length){if(this._data.core.ready=!0,this._data.core.selected.length){if(this.settings.core.expand_selected_onload){var b=[],c,d;for(c=0,d=this._data.core.selected.length;d>c;c++)b=b.concat(this._model.data[this._data.core.selected[c]].parents);for(b=a.vakata.array_unique(b),c=0,d=b.length;d>c;c++)this.open_node(b[c],!1,0)}this.trigger("changed",{action:"ready",selected:this._data.core.selected})}this.trigger("ready")}},this),0))},this)).on("keypress.jstree",a.proxy(function(d){if(d.target.tagName&&"input"===d.target.tagName.toLowerCase())return!0;c&&clearTimeout(c),c=setTimeout(function(){b=""},500);var e=String.fromCharCode(d.which).toLowerCase(),f=this.element.find(".jstree-anchor").filter(":visible"),g=f.index(i.activeElement)||0,h=!1;if(b+=e,b.length>1){if(f.slice(g).each(a.proxy(function(c,d){return 0===a(d).text().toLowerCase().indexOf(b)?(a(d).focus(),h=!0,!1):void 0},this)),h)return;if(f.slice(0,g).each(a.proxy(function(c,d){return 0===a(d).text().toLowerCase().indexOf(b)?(a(d).focus(),h=!0,!1):void 0},this)),h)return}if(new RegExp("^"+e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")+"+$").test(b)){if(f.slice(g+1).each(a.proxy(function(b,c){return a(c).text().toLowerCase().charAt(0)===e?(a(c).focus(),h=!0,!1):void 0},this)),h)return;if(f.slice(0,g+1).each(a.proxy(function(b,c){return a(c).text().toLowerCase().charAt(0)===e?(a(c).focus(),h=!0,!1):void 0},this)),h)return}},this)).on("init.jstree",a.proxy(function(){var a=this.settings.core.themes;this._data.core.themes.dots=a.dots,this._data.core.themes.stripes=a.stripes,this._data.core.themes.icons=a.icons,this._data.core.themes.ellipsis=a.ellipsis,this.set_theme(a.name||"default",a.url),this.set_theme_variant(a.variant)},this)).on("loading.jstree",a.proxy(function(){this[this._data.core.themes.dots?"show_dots":"hide_dots"](),this[this._data.core.themes.icons?"show_icons":"hide_icons"](),this[this._data.core.themes.stripes?"show_stripes":"hide_stripes"](),this[this._data.core.themes.ellipsis?"show_ellipsis":"hide_ellipsis"]()},this)).on("blur.jstree",".jstree-anchor",a.proxy(function(b){this._data.core.focused=null,a(b.currentTarget).filter(".jstree-hovered").mouseleave(),this.element.attr("tabindex","0")},this)).on("focus.jstree",".jstree-anchor",a.proxy(function(b){var c=this.get_node(b.currentTarget);c&&c.id&&(this._data.core.focused=c.id),this.element.find(".jstree-hovered").not(b.currentTarget).mouseleave(),a(b.currentTarget).mouseenter(),this.element.attr("tabindex","-1")},this)).on("focus.jstree",a.proxy(function(){if(+new Date-d>500&&!this._data.core.focused&&this.settings.core.restore_focus){d=0;var a=this.get_node(this.element.attr("aria-activedescendant"),!0);a&&a.find("> .jstree-anchor").focus()}},this)).on("mouseenter.jstree",".jstree-anchor",a.proxy(function(a){this.hover_node(a.currentTarget)},this)).on("mouseleave.jstree",".jstree-anchor",a.proxy(function(a){this.dehover_node(a.currentTarget)},this))},unbind:function(){this.element.off(".jstree"),a(i).off(".jstree-"+this._id)},trigger:function(a,b){b||(b={}),b.instance=this,this.element.triggerHandler(a.replace(".jstree","")+".jstree",b)},get_container:function(){return this.element},get_container_ul:function(){return this.element.children(".jstree-children").first()},get_string:function(b){var c=this.settings.core.strings;return a.isFunction(c)?c.call(this,b):c&&c[b]?c[b]:b},_firstChild:function(a){a=a?a.firstChild:null;while(null!==a&&1!==a.nodeType)a=a.nextSibling;return a},_nextSibling:function(a){a=a?a.nextSibling:null;while(null!==a&&1!==a.nodeType)a=a.nextSibling;return a},_previousSibling:function(a){a=a?a.previousSibling:null;while(null!==a&&1!==a.nodeType)a=a.previousSibling;return a},get_node:function(b,c){b&&b.id&&(b=b.id),b instanceof jQuery&&b.length&&b[0].id&&(b=b[0].id);var d;try{if(this._model.data[b])b=this._model.data[b];else if("string"==typeof b&&this._model.data[b.replace(/^#/,"")])b=this._model.data[b.replace(/^#/,"")];else if("string"==typeof b&&(d=a("#"+b.replace(a.jstree.idregex,"\\$&"),this.element)).length&&this._model.data[d.closest(".jstree-node").attr("id")])b=this._model.data[d.closest(".jstree-node").attr("id")];else if((d=this.element.find(b)).length&&this._model.data[d.closest(".jstree-node").attr("id")])b=this._model.data[d.closest(".jstree-node").attr("id")];else{if(!(d=this.element.find(b)).length||!d.hasClass("jstree"))return!1;b=this._model.data[a.jstree.root]}return c&&(b=b.id===a.jstree.root?this.element:a("#"+b.id.replace(a.jstree.idregex,"\\$&"),this.element)),b}catch(e){return!1}},get_path:function(b,c,d){if(b=b.parents?b:this.get_node(b),!b||b.id===a.jstree.root||!b.parents)return!1;var e,f,g=[];for(g.push(d?b.id:b.text),e=0,f=b.parents.length;f>e;e++)g.push(d?b.parents[e]:this.get_text(b.parents[e]));return g=g.reverse().slice(1),c?g.join(c):g},get_next_dom:function(b,c){var d;if(b=this.get_node(b,!0),b[0]===this.element[0]){d=this._firstChild(this.get_container_ul()[0]);while(d&&0===d.offsetHeight)d=this._nextSibling(d);return d?a(d):!1}if(!b||!b.length)return!1;if(c){d=b[0];do d=this._nextSibling(d);while(d&&0===d.offsetHeight);return d?a(d):!1}if(b.hasClass("jstree-open")){d=this._firstChild(b.children(".jstree-children")[0]);while(d&&0===d.offsetHeight)d=this._nextSibling(d);if(null!==d)return a(d)}d=b[0];do d=this._nextSibling(d);while(d&&0===d.offsetHeight);return null!==d?a(d):b.parentsUntil(".jstree",".jstree-node").nextAll(".jstree-node:visible").first()},get_prev_dom:function(b,c){var d;if(b=this.get_node(b,!0),b[0]===this.element[0]){d=this.get_container_ul()[0].lastChild;while(d&&0===d.offsetHeight)d=this._previousSibling(d);return d?a(d):!1}if(!b||!b.length)return!1;if(c){d=b[0];do d=this._previousSibling(d);while(d&&0===d.offsetHeight);return d?a(d):!1}d=b[0];do d=this._previousSibling(d);while(d&&0===d.offsetHeight);if(null!==d){b=a(d);while(b.hasClass("jstree-open"))b=b.children(".jstree-children").first().children(".jstree-node:visible:last");return b}return d=b[0].parentNode.parentNode,d&&d.className&&-1!==d.className.indexOf("jstree-node")?a(d):!1},get_parent:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.parent:!1},get_children_dom:function(a){return a=this.get_node(a,!0),a[0]===this.element[0]?this.get_container_ul().children(".jstree-node"):a&&a.length?a.children(".jstree-children").children(".jstree-node"):!1},is_parent:function(a){return a=this.get_node(a),a&&(a.state.loaded===!1||a.children.length>0)},is_loaded:function(a){return a=this.get_node(a),a&&a.state.loaded},is_loading:function(a){return a=this.get_node(a),a&&a.state&&a.state.loading},is_open:function(a){return a=this.get_node(a),a&&a.state.opened},is_closed:function(a){return a=this.get_node(a),a&&this.is_parent(a)&&!a.state.opened},is_leaf:function(a){return!this.is_parent(a)},load_node:function(b,c){var d,e,f,g,h;if(a.isArray(b))return this._load_nodes(b.slice(),c),!0;if(b=this.get_node(b),!b)return c&&c.call(this,b,!1),!1;if(b.state.loaded){for(b.state.loaded=!1,f=0,g=b.parents.length;g>f;f++)this._model.data[b.parents[f]].children_d=a.vakata.array_filter(this._model.data[b.parents[f]].children_d,function(c){return-1===a.inArray(c,b.children_d)});for(d=0,e=b.children_d.length;e>d;d++)this._model.data[b.children_d[d]].state.selected&&(h=!0),delete this._model.data[b.children_d[d]];h&&(this._data.core.selected=a.vakata.array_filter(this._data.core.selected,function(c){return-1===a.inArray(c,b.children_d)})),b.children=[],b.children_d=[],h&&this.trigger("changed",{action:"load_node",node:b,selected:this._data.core.selected})}return b.state.failed=!1,b.state.loading=!0,this.get_node(b,!0).addClass("jstree-loading").attr("aria-busy",!0),this._load_node(b,a.proxy(function(a){b=this._model.data[b.id],b.state.loading=!1,b.state.loaded=a,b.state.failed=!b.state.loaded;var d=this.get_node(b,!0),e=0,f=0,g=this._model.data,h=!1;for(e=0,f=b.children.length;f>e;e++)if(g[b.children[e]]&&!g[b.children[e]].state.hidden){h=!0;break}b.state.loaded&&d&&d.length&&(d.removeClass("jstree-closed jstree-open jstree-leaf"),h?"#"!==b.id&&d.addClass(b.state.opened?"jstree-open":"jstree-closed"):d.addClass("jstree-leaf")),d.removeClass("jstree-loading").attr("aria-busy",!1),this.trigger("load_node",{node:b,status:a}),c&&c.call(this,b,a)},this)),!0},_load_nodes:function(a,b,c,d){var e=!0,f=function(){this._load_nodes(a,b,!0)},g=this._model.data,h,i,j=[];for(h=0,i=a.length;i>h;h++)g[a[h]]&&(!g[a[h]].state.loaded&&!g[a[h]].state.failed||!c&&d)&&(this.is_loading(a[h])||this.load_node(a[h],f),e=!1);if(e){for(h=0,i=a.length;i>h;h++)g[a[h]]&&g[a[h]].state.loaded&&j.push(a[h]);b&&!b.done&&(b.call(this,j),b.done=!0)}},load_all:function(b,c){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var d=[],e=this._model.data,f=e[b.id].children_d,g,h;for(b.state&&!b.state.loaded&&d.push(b.id),g=0,h=f.length;h>g;g++)e[f[g]]&&e[f[g]].state&&!e[f[g]].state.loaded&&d.push(f[g]);d.length?this._load_nodes(d,function(){this.load_all(b,c)}):(c&&c.call(this,b),this.trigger("load_all",{node:b}))},_load_node:function(b,c){var d=this.settings.core.data,e,f=function g(){return 3!==this.nodeType&&8!==this.nodeType};return d?a.isFunction(d)?d.call(this,b,a.proxy(function(d){d===!1?c.call(this,!1):this["string"==typeof d?"_append_html_data":"_append_json_data"](b,"string"==typeof d?a(a.parseHTML(d)).filter(f):d,function(a){c.call(this,a)})},this)):"object"==typeof d?d.url?(d=a.extend(!0,{},d),a.isFunction(d.url)&&(d.url=d.url.call(this,b)),a.isFunction(d.data)&&(d.data=d.data.call(this,b)),a.ajax(d).done(a.proxy(function(d,e,g){var h=g.getResponseHeader("Content-Type");return h&&-1!==h.indexOf("json")||"object"==typeof d?this._append_json_data(b,d,function(a){c.call(this,a)}):h&&-1!==h.indexOf("html")||"string"==typeof d?this._append_html_data(b,a(a.parseHTML(d)).filter(f),function(a){c.call(this,a)}):(this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:b.id,xhr:g})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1))},this)).fail(a.proxy(function(a){this._data.core.last_error={error:"ajax",plugin:"core",id:"core_04",reason:"Could not load node",data:JSON.stringify({id:b.id,xhr:a})},c.call(this,!1),this.settings.core.error.call(this,this._data.core.last_error)},this))):(e=a.isArray(d)?a.extend(!0,[],d):a.isPlainObject(d)?a.extend(!0,{},d):d,b.id===a.jstree.root?this._append_json_data(b,e,function(a){c.call(this,a)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_05",reason:"Could not load node",data:JSON.stringify({id:b.id})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1))):"string"==typeof d?b.id===a.jstree.root?this._append_html_data(b,a(a.parseHTML(d)).filter(f),function(a){c.call(this,a)}):(this._data.core.last_error={error:"nodata",plugin:"core",id:"core_06",reason:"Could not load node",data:JSON.stringify({id:b.id})},this.settings.core.error.call(this,this._data.core.last_error),c.call(this,!1)):c.call(this,!1):b.id===a.jstree.root?this._append_html_data(b,this._data.core.original_container_html.clone(!0),function(a){c.call(this,a)}):c.call(this,!1)},_node_changed:function(b){b=this.get_node(b),b&&-1===a.inArray(b.id,this._model.changed)&&this._model.changed.push(b.id)},_append_html_data:function(b,c,d){b=this.get_node(b),b.children=[],b.children_d=[];var e=c.is("ul")?c.children():c,f=b.id,g=[],h=[],i=this._model.data,j=i[f],k=this._data.core.selected.length,l,m,n;for(e.each(a.proxy(function(b,c){l=this._parse_model_from_html(a(c),f,j.parents.concat()),l&&(g.push(l),h.push(l),i[l].children_d.length&&(h=h.concat(i[l].children_d)))},this)),j.children=g,j.children_d=h,m=0,n=j.parents.length;n>m;m++)i[j.parents[m]].children_d=i[j.parents[m]].children_d.concat(h);this.trigger("model",{nodes:h,parent:f}),f!==a.jstree.root?(this._node_changed(f),this.redraw()):(this.get_container_ul().children(".jstree-initial-node").remove(),this.redraw(!0)),this._data.core.selected.length!==k&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),d.call(this,!0)},_append_json_data:function(b,c,d,e){if(null!==this.element){b=this.get_node(b),b.children=[],b.children_d=[],c.d&&(c=c.d,"string"==typeof c&&(c=JSON.parse(c))),a.isArray(c)||(c=[c]);var f=null,g={df:this._model.default_state,dat:c,par:b.id,m:this._model.data,t_id:this._id,t_cnt:this._cnt,sel:this._data.core.selected},h=function(a,b){a.data&&(a=a.data);var c=a.dat,d=a.par,e=[],f=[],g=[],h=a.df,i=a.t_id,j=a.t_cnt,k=a.m,l=k[d],m=a.sel,n,o,p,q,r=function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=a.id.toString(),f,i,j,l,m={id:e,text:a.text||"",icon:a.icon!==b?a.icon:!0,parent:c,parents:d,children:a.children||[],children_d:a.children_d||[],data:a.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in h)h.hasOwnProperty(f)&&(m.state[f]=h[f]);if(a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(m.icon=a.data.jstree.icon),(m.icon===b||null===m.icon||""===m.icon)&&(m.icon=!0),a&&a.data&&(m.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(m.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(m.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(m.li_attr[f]=a.li_attr[f]);if(m.li_attr.id||(m.li_attr.id=e),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(m.a_attr[f]=a.a_attr[f]);for(a&&a.children&&a.children===!0&&(m.state.loaded=!1,m.children=[],m.children_d=[]),k[m.id]=m,f=0,i=m.children.length;i>f;f++)j=r(k[m.children[f]],m.id,d),l=k[j],m.children_d.push(j),l.children_d.length&&(m.children_d=m.children_d.concat(l.children_d));return delete a.data,delete a.children,k[m.id].original=a,m.state.selected&&g.push(m.id),m.id},s=function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=!1,f,l,m,n,o;do e="j"+i+"_"+ ++j;while(k[e]);o={id:!1,text:"string"==typeof a?a:"",icon:"object"==typeof a&&a.icon!==b?a.icon:!0,parent:c,parents:d,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in h)h.hasOwnProperty(f)&&(o.state[f]=h[f]);if(a&&a.id&&(o.id=a.id.toString()),a&&a.text&&(o.text=a.text),a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(o.icon=a.data.jstree.icon),(o.icon===b||null===o.icon||""===o.icon)&&(o.icon=!0),a&&a.data&&(o.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(o.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(o.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(o.li_attr[f]=a.li_attr[f]);if(o.li_attr.id&&!o.id&&(o.id=o.li_attr.id.toString()),o.id||(o.id=e),o.li_attr.id||(o.li_attr.id=o.id),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(o.a_attr[f]=a.a_attr[f]);if(a&&a.children&&a.children.length){for(f=0,l=a.children.length;l>f;f++)m=s(a.children[f],o.id,d),n=k[m],o.children.push(m),n.children_d.length&&(o.children_d=o.children_d.concat(n.children_d));o.children_d=o.children_d.concat(o.children)}return a&&a.children&&a.children===!0&&(o.state.loaded=!1,o.children=[],o.children_d=[]),delete a.data,delete a.children,o.original=a,k[o.id]=o,o.state.selected&&g.push(o.id),o.id};if(c.length&&c[0].id!==b&&c[0].parent!==b){for(o=0,p=c.length;p>o;o++)c[o].children||(c[o].children=[]),c[o].state||(c[o].state={}),k[c[o].id.toString()]=c[o];for(o=0,p=c.length;p>o;o++)k[c[o].parent.toString()]?(k[c[o].parent.toString()].children.push(c[o].id.toString()),l.children_d.push(c[o].id.toString())):(this._data.core.last_error={error:"parse",plugin:"core",id:"core_07",reason:"Node with invalid parent",data:JSON.stringify({id:c[o].id.toString(),parent:c[o].parent.toString()})},this.settings.core.error.call(this,this._data.core.last_error));for(o=0,p=l.children.length;p>o;o++)n=r(k[l.children[o]],d,l.parents.concat()),f.push(n),k[n].children_d.length&&(f=f.concat(k[n].children_d));for(o=0,p=l.parents.length;p>o;o++)k[l.parents[o]].children_d=k[l.parents[o]].children_d.concat(f);q={cnt:j,mod:k,sel:m,par:d,dpc:f,add:g}}else{for(o=0,p=c.length;p>o;o++)n=s(c[o],d,l.parents.concat()),n&&(e.push(n),f.push(n),k[n].children_d.length&&(f=f.concat(k[n].children_d)));for(l.children=e,l.children_d=f,o=0,p=l.parents.length;p>o;o++)k[l.parents[o]].children_d=k[l.parents[o]].children_d.concat(f);q={cnt:j,mod:k,sel:m,par:d,dpc:f,add:g}}return"undefined"!=typeof window&&"undefined"!=typeof window.document?q:void postMessage(q)},i=function(b,c){if(null!==this.element){this._cnt=b.cnt;var e,f=this._model.data;for(e in f)f.hasOwnProperty(e)&&f[e].state&&f[e].state.loading&&b.mod[e]&&(b.mod[e].state.loading=!0);if(this._model.data=b.mod,c){var g,h=b.add,i=b.sel,j=this._data.core.selected.slice();if(f=this._model.data,i.length!==j.length||a.vakata.array_unique(i.concat(j)).length!==i.length){for(e=0,g=i.length;g>e;e++)-1===a.inArray(i[e],h)&&-1===a.inArray(i[e],j)&&(f[i[e]].state.selected=!1);for(e=0,g=j.length;g>e;e++)-1===a.inArray(j[e],i)&&(f[j[e]].state.selected=!0)}}b.add.length&&(this._data.core.selected=this._data.core.selected.concat(b.add)),this.trigger("model",{nodes:b.dpc,parent:b.par}),b.par!==a.jstree.root?(this._node_changed(b.par),this.redraw()):this.redraw(!0),b.add.length&&this.trigger("changed",{action:"model",selected:this._data.core.selected}),d.call(this,!0)}};if(this.settings.core.worker&&window.Blob&&window.URL&&window.Worker)try{null===this._wrk&&(this._wrk=window.URL.createObjectURL(new window.Blob(["self.onmessage = "+h.toString()],{type:"text/javascript"}))),!this._data.core.working||e?(this._data.core.working=!0,f=new window.Worker(this._wrk),f.onmessage=a.proxy(function(a){i.call(this,a.data,!0);try{f.terminate(),f=null}catch(b){}this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1},this),g.par?f.postMessage(g):this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1):this._data.core.worker_queue.push([b,c,d,!0])}catch(j){i.call(this,h(g),!1),this._data.core.worker_queue.length?this._append_json_data.apply(this,this._data.core.worker_queue.shift()):this._data.core.working=!1}else i.call(this,h(g),!1)}},_parse_model_from_html:function(c,d,e){e=e?[].concat(e):[],d&&e.unshift(d);var f,g,h=this._model.data,i={id:!1,text:!1,icon:!0,parent:d,parents:e,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1},j,k,l;for(j in this._model.default_state)this._model.default_state.hasOwnProperty(j)&&(i.state[j]=this._model.default_state[j]);if(k=a.vakata.attributes(c,!0),a.each(k,function(b,c){return c=a.trim(c),c.length?(i.li_attr[b]=c,void("id"===b&&(i.id=c.toString()))):!0}),k=c.children("a").first(),k.length&&(k=a.vakata.attributes(k,!0),a.each(k,function(b,c){c=a.trim(c),c.length&&(i.a_attr[b]=c)})),k=c.children("a").first().length?c.children("a").first().clone():c.clone(),k.children("ins, i, ul").remove(),k=k.html(),k=a("
      ").html(k),i.text=this.settings.core.force_text?k.text():k.html(),k=c.data(),i.data=k?a.extend(!0,{},k):null,i.state.opened=c.hasClass("jstree-open"),i.state.selected=c.children("a").hasClass("jstree-clicked"),i.state.disabled=c.children("a").hasClass("jstree-disabled"),i.data&&i.data.jstree)for(j in i.data.jstree)i.data.jstree.hasOwnProperty(j)&&(i.state[j]=i.data.jstree[j]);k=c.children("a").children(".jstree-themeicon"),k.length&&(i.icon=k.hasClass("jstree-themeicon-hidden")?!1:k.attr("rel")),i.state.icon!==b&&(i.icon=i.state.icon),(i.icon===b||null===i.icon||""===i.icon)&&(i.icon=!0),k=c.children("ul").children("li");do l="j"+this._id+"_"+ ++this._cnt;while(h[l]);return i.id=i.li_attr.id?i.li_attr.id.toString():l,k.length?(k.each(a.proxy(function(b,c){f=this._parse_model_from_html(a(c),i.id,e),g=this._model.data[f],i.children.push(f),g.children_d.length&&(i.children_d=i.children_d.concat(g.children_d))},this)),i.children_d=i.children_d.concat(i.children)):c.hasClass("jstree-closed")&&(i.state.loaded=!1),i.li_attr["class"]&&(i.li_attr["class"]=i.li_attr["class"].replace("jstree-closed","").replace("jstree-open","")),i.a_attr["class"]&&(i.a_attr["class"]=i.a_attr["class"].replace("jstree-clicked","").replace("jstree-disabled","")),h[i.id]=i,i.state.selected&&this._data.core.selected.push(i.id),i.id},_parse_model_from_flat_json:function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=a.id.toString(),f=this._model.data,g=this._model.default_state,h,i,j,k,l={id:e,text:a.text||"",icon:a.icon!==b?a.icon:!0,parent:c,parents:d,children:a.children||[],children_d:a.children_d||[],data:a.data,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(h in g)g.hasOwnProperty(h)&&(l.state[h]=g[h]);if(a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(l.icon=a.data.jstree.icon),(l.icon===b||null===l.icon||""===l.icon)&&(l.icon=!0),a&&a.data&&(l.data=a.data,a.data.jstree))for(h in a.data.jstree)a.data.jstree.hasOwnProperty(h)&&(l.state[h]=a.data.jstree[h]);if(a&&"object"==typeof a.state)for(h in a.state)a.state.hasOwnProperty(h)&&(l.state[h]=a.state[h]);if(a&&"object"==typeof a.li_attr)for(h in a.li_attr)a.li_attr.hasOwnProperty(h)&&(l.li_attr[h]=a.li_attr[h]);if(l.li_attr.id||(l.li_attr.id=e),a&&"object"==typeof a.a_attr)for(h in a.a_attr)a.a_attr.hasOwnProperty(h)&&(l.a_attr[h]=a.a_attr[h]);for(a&&a.children&&a.children===!0&&(l.state.loaded=!1,l.children=[],l.children_d=[]),f[l.id]=l,h=0,i=l.children.length;i>h;h++)j=this._parse_model_from_flat_json(f[l.children[h]],l.id,d),k=f[j],l.children_d.push(j),k.children_d.length&&(l.children_d=l.children_d.concat(k.children_d));return delete a.data,delete a.children,f[l.id].original=a,l.state.selected&&this._data.core.selected.push(l.id),l.id},_parse_model_from_json:function(a,c,d){d=d?d.concat():[],c&&d.unshift(c);var e=!1,f,g,h,i,j=this._model.data,k=this._model.default_state,l;do e="j"+this._id+"_"+ ++this._cnt;while(j[e]);l={id:!1,text:"string"==typeof a?a:"",icon:"object"==typeof a&&a.icon!==b?a.icon:!0,parent:c,parents:d,children:[],children_d:[],data:null,state:{},li_attr:{id:!1},a_attr:{href:"#"},original:!1};for(f in k)k.hasOwnProperty(f)&&(l.state[f]=k[f]);if(a&&a.id&&(l.id=a.id.toString()),a&&a.text&&(l.text=a.text),a&&a.data&&a.data.jstree&&a.data.jstree.icon&&(l.icon=a.data.jstree.icon),(l.icon===b||null===l.icon||""===l.icon)&&(l.icon=!0),a&&a.data&&(l.data=a.data,a.data.jstree))for(f in a.data.jstree)a.data.jstree.hasOwnProperty(f)&&(l.state[f]=a.data.jstree[f]);if(a&&"object"==typeof a.state)for(f in a.state)a.state.hasOwnProperty(f)&&(l.state[f]=a.state[f]);if(a&&"object"==typeof a.li_attr)for(f in a.li_attr)a.li_attr.hasOwnProperty(f)&&(l.li_attr[f]=a.li_attr[f]);if(l.li_attr.id&&!l.id&&(l.id=l.li_attr.id.toString()), l.id||(l.id=e),l.li_attr.id||(l.li_attr.id=l.id),a&&"object"==typeof a.a_attr)for(f in a.a_attr)a.a_attr.hasOwnProperty(f)&&(l.a_attr[f]=a.a_attr[f]);if(a&&a.children&&a.children.length){for(f=0,g=a.children.length;g>f;f++)h=this._parse_model_from_json(a.children[f],l.id,d),i=j[h],l.children.push(h),i.children_d.length&&(l.children_d=l.children_d.concat(i.children_d));l.children_d=l.children_d.concat(l.children)}return a&&a.children&&a.children===!0&&(l.state.loaded=!1,l.children=[],l.children_d=[]),delete a.data,delete a.children,l.original=a,j[l.id]=l,l.state.selected&&this._data.core.selected.push(l.id),l.id},_redraw:function(){var b=this._model.force_full_redraw?this._model.data[a.jstree.root].children.concat([]):this._model.changed.concat([]),c=i.createElement("UL"),d,e,f,g=this._data.core.focused;for(e=0,f=b.length;f>e;e++)d=this.redraw_node(b[e],!0,this._model.force_full_redraw),d&&this._model.force_full_redraw&&c.appendChild(d);this._model.force_full_redraw&&(c.className=this.get_container_ul()[0].className,c.setAttribute("role","group"),this.element.empty().append(c)),null!==g&&this.settings.core.restore_focus&&(d=this.get_node(g,!0),d&&d.length&&d.children(".jstree-anchor")[0]!==i.activeElement?d.children(".jstree-anchor").focus():this._data.core.focused=null),this._model.force_full_redraw=!1,this._model.changed=[],this.trigger("redraw",{nodes:b})},redraw:function(a){a&&(this._model.force_full_redraw=!0),this._redraw()},draw_children:function(b){var c=this.get_node(b),d=!1,e=!1,f=!1,g=i;if(!c)return!1;if(c.id===a.jstree.root)return this.redraw(!0);if(b=this.get_node(b,!0),!b||!b.length)return!1;if(b.children(".jstree-children").remove(),b=b[0],c.children.length&&c.state.loaded){for(f=g.createElement("UL"),f.setAttribute("role","group"),f.className="jstree-children",d=0,e=c.children.length;e>d;d++)f.appendChild(this.redraw_node(c.children[d],!0,!0));b.appendChild(f)}},redraw_node:function(b,c,d,e){var f=this.get_node(b),g=!1,h=!1,j=!1,k=!1,l=!1,m=!1,n="",o=i,p=this._model.data,q=!1,r=!1,s=null,t=0,u=0,v=!1,w=!1;if(!f)return!1;if(f.id===a.jstree.root)return this.redraw(!0);if(c=c||0===f.children.length,b=i.querySelector?this.element[0].querySelector("#"+(-1!=="0123456789".indexOf(f.id[0])?"\\3"+f.id[0]+" "+f.id.substr(1).replace(a.jstree.idregex,"\\$&"):f.id.replace(a.jstree.idregex,"\\$&"))):i.getElementById(f.id))b=a(b),d||(g=b.parent().parent()[0],g===this.element[0]&&(g=null),h=b.index()),c||!f.children.length||b.children(".jstree-children").length||(c=!0),c||(j=b.children(".jstree-children")[0]),q=b.children(".jstree-anchor")[0]===i.activeElement,b.remove();else if(c=!0,!d){if(g=f.parent!==a.jstree.root?a("#"+f.parent.replace(a.jstree.idregex,"\\$&"),this.element)[0]:null,!(null===g||g&&p[f.parent].state.opened))return!1;h=a.inArray(f.id,null===g?p[a.jstree.root].children:p[f.parent].children)}b=this._data.core.node.cloneNode(!0),n="jstree-node ";for(k in f.li_attr)if(f.li_attr.hasOwnProperty(k)){if("id"===k)continue;"class"!==k?b.setAttribute(k,f.li_attr[k]):n+=f.li_attr[k]}for(f.a_attr.id||(f.a_attr.id=f.id+"_anchor"),b.setAttribute("aria-selected",!!f.state.selected),b.setAttribute("aria-level",f.parents.length),b.setAttribute("aria-labelledby",f.a_attr.id),f.state.disabled&&b.setAttribute("aria-disabled",!0),k=0,l=f.children.length;l>k;k++)if(!p[f.children[k]].state.hidden){v=!0;break}if(null!==f.parent&&p[f.parent]&&!f.state.hidden&&(k=a.inArray(f.id,p[f.parent].children),w=f.id,-1!==k))for(k++,l=p[f.parent].children.length;l>k;k++)if(p[p[f.parent].children[k]].state.hidden||(w=p[f.parent].children[k]),w!==f.id)break;f.state.hidden&&(n+=" jstree-hidden"),f.state.loading&&(n+=" jstree-loading"),f.state.loaded&&!v?n+=" jstree-leaf":(n+=f.state.opened&&f.state.loaded?" jstree-open":" jstree-closed",b.setAttribute("aria-expanded",f.state.opened&&f.state.loaded)),w===f.id&&(n+=" jstree-last"),b.id=f.id,b.className=n,n=(f.state.selected?" jstree-clicked":"")+(f.state.disabled?" jstree-disabled":"");for(l in f.a_attr)if(f.a_attr.hasOwnProperty(l)){if("href"===l&&"#"===f.a_attr[l])continue;"class"!==l?b.childNodes[1].setAttribute(l,f.a_attr[l]):n+=" "+f.a_attr[l]}if(n.length&&(b.childNodes[1].className="jstree-anchor "+n),(f.icon&&f.icon!==!0||f.icon===!1)&&(f.icon===!1?b.childNodes[1].childNodes[0].className+=" jstree-themeicon-hidden":-1===f.icon.indexOf("/")&&-1===f.icon.indexOf(".")?b.childNodes[1].childNodes[0].className+=" "+f.icon+" jstree-themeicon-custom":(b.childNodes[1].childNodes[0].style.backgroundImage='url("'+f.icon+'")',b.childNodes[1].childNodes[0].style.backgroundPosition="center center",b.childNodes[1].childNodes[0].style.backgroundSize="auto",b.childNodes[1].childNodes[0].className+=" jstree-themeicon-custom")),this.settings.core.force_text?b.childNodes[1].appendChild(o.createTextNode(f.text)):b.childNodes[1].innerHTML+=f.text,c&&f.children.length&&(f.state.opened||e)&&f.state.loaded){for(m=o.createElement("UL"),m.setAttribute("role","group"),m.className="jstree-children",k=0,l=f.children.length;l>k;k++)m.appendChild(this.redraw_node(f.children[k],c,!0));b.appendChild(m)}if(j&&b.appendChild(j),!d){for(g||(g=this.element[0]),k=0,l=g.childNodes.length;l>k;k++)if(g.childNodes[k]&&g.childNodes[k].className&&-1!==g.childNodes[k].className.indexOf("jstree-children")){s=g.childNodes[k];break}s||(s=o.createElement("UL"),s.setAttribute("role","group"),s.className="jstree-children",g.appendChild(s)),g=s,hf;f++)this.open_node(c[f],d,e);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?(e=e===b?this.settings.core.animation:e,this.is_closed(c)?this.is_loaded(c)?(h=this.get_node(c,!0),i=this,h.length&&(e&&h.children(".jstree-children").length&&h.children(".jstree-children").stop(!0,!0),c.children.length&&!this._firstChild(h.children(".jstree-children")[0])&&this.draw_children(c),e?(this.trigger("before_open",{node:c}),h.children(".jstree-children").css("display","none").end().removeClass("jstree-closed").addClass("jstree-open").attr("aria-expanded",!0).children(".jstree-children").stop(!0,!0).slideDown(e,function(){this.style.display="",i.element&&i.trigger("after_open",{node:c})})):(this.trigger("before_open",{node:c}),h[0].className=h[0].className.replace("jstree-closed","jstree-open"),h[0].setAttribute("aria-expanded",!0))),c.state.opened=!0,d&&d.call(this,c,!0),h.length||this.trigger("before_open",{node:c}),this.trigger("open_node",{node:c}),e&&h.length||this.trigger("after_open",{node:c}),!0):this.is_loading(c)?setTimeout(a.proxy(function(){this.open_node(c,d,e)},this),500):void this.load_node(c,function(a,b){return b?this.open_node(a,d,e):d?d.call(this,a,!1):!1}):(d&&d.call(this,c,!1),!1)):!1},_open_to:function(b){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var c,d,e=b.parents;for(c=0,d=e.length;d>c;c+=1)c!==a.jstree.root&&this.open_node(e[c],!1,0);return a("#"+b.id.replace(a.jstree.idregex,"\\$&"),this.element)},close_node:function(c,d){var e,f,g,h;if(a.isArray(c)){for(c=c.slice(),e=0,f=c.length;f>e;e++)this.close_node(c[e],d);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?this.is_closed(c)?!1:(d=d===b?this.settings.core.animation:d,g=this,h=this.get_node(c,!0),c.state.opened=!1,this.trigger("close_node",{node:c}),void(h.length?d?h.children(".jstree-children").attr("style","display:block !important").end().removeClass("jstree-open").addClass("jstree-closed").attr("aria-expanded",!1).children(".jstree-children").stop(!0,!0).slideUp(d,function(){this.style.display="",h.children(".jstree-children").remove(),g.element&&g.trigger("after_close",{node:c})}):(h[0].className=h[0].className.replace("jstree-open","jstree-closed"),h.attr("aria-expanded",!1).children(".jstree-children").remove(),this.trigger("after_close",{node:c})):this.trigger("after_close",{node:c}))):!1},toggle_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.toggle_node(b[c]);return!0}return this.is_closed(b)?this.open_node(b):this.is_open(b)?this.close_node(b):void 0},open_all:function(b,c,d){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var e=b.id===a.jstree.root?this.get_container_ul():this.get_node(b,!0),f,g,h;if(!e.length){for(f=0,g=b.children_d.length;g>f;f++)this.is_closed(this._model.data[b.children_d[f]])&&(this._model.data[b.children_d[f]].state.opened=!0);return this.trigger("open_all",{node:b})}d=d||e,h=this,e=this.is_closed(b)?e.find(".jstree-closed").addBack():e.find(".jstree-closed"),e.each(function(){h.open_node(this,function(a,b){b&&this.is_parent(a)&&this.open_all(a,c,d)},c||0)}),0===d.find(".jstree-closed").length&&this.trigger("open_all",{node:this.get_node(d)})},close_all:function(b,c){if(b||(b=a.jstree.root),b=this.get_node(b),!b)return!1;var d=b.id===a.jstree.root?this.get_container_ul():this.get_node(b,!0),e=this,f,g;for(d.length&&(d=this.is_open(b)?d.find(".jstree-open").addBack():d.find(".jstree-open"),a(d.get().reverse()).each(function(){e.close_node(this,c||0)})),f=0,g=b.children_d.length;g>f;f++)this._model.data[b.children_d[f]].state.opened=!1;this.trigger("close_all",{node:b})},is_disabled:function(a){return a=this.get_node(a),a&&a.state&&a.state.disabled},enable_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.enable_node(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.state.disabled=!1,this.get_node(b,!0).children(".jstree-anchor").removeClass("jstree-disabled").attr("aria-disabled",!1),void this.trigger("enable_node",{node:b})):!1},disable_node:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.disable_node(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.state.disabled=!0,this.get_node(b,!0).children(".jstree-anchor").addClass("jstree-disabled").attr("aria-disabled",!0),void this.trigger("disable_node",{node:b})):!1},is_hidden:function(a){return a=this.get_node(a),a.state.hidden===!0},hide_node:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.hide_node(b[d],!0);return c||this.redraw(),!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?void(b.state.hidden||(b.state.hidden=!0,this._node_changed(b.parent),c||this.redraw(),this.trigger("hide_node",{node:b}))):!1},show_node:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.show_node(b[d],!0);return c||this.redraw(),!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?void(b.state.hidden&&(b.state.hidden=!1,this._node_changed(b.parent),c||this.redraw(),this.trigger("show_node",{node:b}))):!1},hide_all:function(b){var c,d=this._model.data,e=[];for(c in d)d.hasOwnProperty(c)&&c!==a.jstree.root&&!d[c].state.hidden&&(d[c].state.hidden=!0,e.push(c));return this._model.force_full_redraw=!0,b||this.redraw(),this.trigger("hide_all",{nodes:e}),e},show_all:function(b){var c,d=this._model.data,e=[];for(c in d)d.hasOwnProperty(c)&&c!==a.jstree.root&&d[c].state.hidden&&(d[c].state.hidden=!1,e.push(c));return this._model.force_full_redraw=!0,b||this.redraw(),this.trigger("show_all",{nodes:e}),e},activate_node:function(a,c){if(this.is_disabled(a))return!1;if(c&&"object"==typeof c||(c={}),this._data.core.last_clicked=this._data.core.last_clicked&&this._data.core.last_clicked.id!==b?this.get_node(this._data.core.last_clicked.id):null,this._data.core.last_clicked&&!this._data.core.last_clicked.state.selected&&(this._data.core.last_clicked=null),!this._data.core.last_clicked&&this._data.core.selected.length&&(this._data.core.last_clicked=this.get_node(this._data.core.selected[this._data.core.selected.length-1])),this.settings.core.multiple&&(c.metaKey||c.ctrlKey||c.shiftKey)&&(!c.shiftKey||this._data.core.last_clicked&&this.get_parent(a)&&this.get_parent(a)===this._data.core.last_clicked.parent))if(c.shiftKey){var d=this.get_node(a).id,e=this._data.core.last_clicked.id,f=this.get_node(this._data.core.last_clicked.parent).children,g=!1,h,i;for(h=0,i=f.length;i>h;h+=1)f[h]===d&&(g=!g),f[h]===e&&(g=!g),this.is_disabled(f[h])||!g&&f[h]!==d&&f[h]!==e?this.deselect_node(f[h],!0,c):this.is_hidden(f[h])||this.select_node(f[h],!0,!1,c);this.trigger("changed",{action:"select_node",node:this.get_node(a),selected:this._data.core.selected,event:c})}else this.is_selected(a)?this.deselect_node(a,!1,c):this.select_node(a,!1,!1,c);else!this.settings.core.multiple&&(c.metaKey||c.ctrlKey||c.shiftKey)&&this.is_selected(a)?this.deselect_node(a,!1,c):(this.deselect_all(!0),this.select_node(a,!1,!1,c),this._data.core.last_clicked=this.get_node(a));this.trigger("activate_node",{node:this.get_node(a),event:c})},hover_node:function(a){if(a=this.get_node(a,!0),!a||!a.length||a.children(".jstree-hovered").length)return!1;var b=this.element.find(".jstree-hovered"),c=this.element;b&&b.length&&this.dehover_node(b),a.children(".jstree-anchor").addClass("jstree-hovered"),this.trigger("hover_node",{node:this.get_node(a)}),setTimeout(function(){c.attr("aria-activedescendant",a[0].id)},0)},dehover_node:function(a){return a=this.get_node(a,!0),a&&a.length&&a.children(".jstree-hovered").length?(a.children(".jstree-anchor").removeClass("jstree-hovered"),void this.trigger("dehover_node",{node:this.get_node(a)})):!1},select_node:function(b,c,d,e){var f,g,h,i;if(a.isArray(b)){for(b=b.slice(),g=0,h=b.length;h>g;g++)this.select_node(b[g],c,d,e);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=this.get_node(b,!0),void(b.state.selected||(b.state.selected=!0,this._data.core.selected.push(b.id),d||(f=this._open_to(b)),f&&f.length&&f.attr("aria-selected",!0).children(".jstree-anchor").addClass("jstree-clicked"),this.trigger("select_node",{node:b,selected:this._data.core.selected,event:e}),c||this.trigger("changed",{action:"select_node",node:b,selected:this._data.core.selected,event:e})))):!1},deselect_node:function(b,c,d){var e,f,g;if(a.isArray(b)){for(b=b.slice(),e=0,f=b.length;f>e;e++)this.deselect_node(b[e],c,d);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(g=this.get_node(b,!0),void(b.state.selected&&(b.state.selected=!1,this._data.core.selected=a.vakata.array_remove_item(this._data.core.selected,b.id),g.length&&g.attr("aria-selected",!1).children(".jstree-anchor").removeClass("jstree-clicked"),this.trigger("deselect_node",{node:b,selected:this._data.core.selected,event:d}),c||this.trigger("changed",{action:"deselect_node",node:b,selected:this._data.core.selected,event:d})))):!1},select_all:function(b){var c=this._data.core.selected.concat([]),d,e;for(this._data.core.selected=this._model.data[a.jstree.root].children_d.concat(),d=0,e=this._data.core.selected.length;e>d;d++)this._model.data[this._data.core.selected[d]]&&(this._model.data[this._data.core.selected[d]].state.selected=!0);this.redraw(!0),this.trigger("select_all",{selected:this._data.core.selected}),b||this.trigger("changed",{action:"select_all",selected:this._data.core.selected,old_selection:c})},deselect_all:function(a){var b=this._data.core.selected.concat([]),c,d;for(c=0,d=this._data.core.selected.length;d>c;c++)this._model.data[this._data.core.selected[c]]&&(this._model.data[this._data.core.selected[c]].state.selected=!1);this._data.core.selected=[],this.element.find(".jstree-clicked").removeClass("jstree-clicked").parent().attr("aria-selected",!1),this.trigger("deselect_all",{selected:this._data.core.selected,node:b}),a||this.trigger("changed",{action:"deselect_all",selected:this._data.core.selected,old_selection:b})},is_selected:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.state.selected:!1},get_selected:function(b){return b?a.map(this._data.core.selected,a.proxy(function(a){return this.get_node(a)},this)):this._data.core.selected.slice()},get_top_selected:function(b){var c=this.get_selected(!0),d={},e,f,g,h;for(e=0,f=c.length;f>e;e++)d[c[e].id]=c[e];for(e=0,f=c.length;f>e;e++)for(g=0,h=c[e].children_d.length;h>g;g++)d[c[e].children_d[g]]&&delete d[c[e].children_d[g]];c=[];for(e in d)d.hasOwnProperty(e)&&c.push(e);return b?a.map(c,a.proxy(function(a){return this.get_node(a)},this)):c},get_bottom_selected:function(b){var c=this.get_selected(!0),d=[],e,f;for(e=0,f=c.length;f>e;e++)c[e].children.length||d.push(c[e].id);return b?a.map(d,a.proxy(function(a){return this.get_node(a)},this)):d},get_state:function(){var b={core:{open:[],loaded:[],scroll:{left:this.element.scrollLeft(),top:this.element.scrollTop()},selected:[]}},c;for(c in this._model.data)this._model.data.hasOwnProperty(c)&&c!==a.jstree.root&&(this._model.data[c].state.loaded&&this.settings.core.loaded_state&&b.core.loaded.push(c),this._model.data[c].state.opened&&b.core.open.push(c),this._model.data[c].state.selected&&b.core.selected.push(c));return b},set_state:function(c,d){if(c){if(c.core&&c.core.selected&&c.core.initial_selection===b&&(c.core.initial_selection=this._data.core.selected.concat([]).sort().join(",")),c.core){var e,f,g,h,i;if(c.core.loaded)return this.settings.core.loaded_state&&a.isArray(c.core.loaded)&&c.core.loaded.length?this._load_nodes(c.core.loaded,function(a){delete c.core.loaded,this.set_state(c,d)}):(delete c.core.loaded,this.set_state(c,d)),!1;if(c.core.open)return a.isArray(c.core.open)&&c.core.open.length?this._load_nodes(c.core.open,function(a){this.open_node(a,!1,0),delete c.core.open,this.set_state(c,d)}):(delete c.core.open,this.set_state(c,d)),!1;if(c.core.scroll)return c.core.scroll&&c.core.scroll.left!==b&&this.element.scrollLeft(c.core.scroll.left),c.core.scroll&&c.core.scroll.top!==b&&this.element.scrollTop(c.core.scroll.top),delete c.core.scroll,this.set_state(c,d),!1;if(c.core.selected)return h=this,(c.core.initial_selection===b||c.core.initial_selection===this._data.core.selected.concat([]).sort().join(","))&&(this.deselect_all(),a.each(c.core.selected,function(a,b){h.select_node(b,!1,!0)})),delete c.core.initial_selection,delete c.core.selected,this.set_state(c,d),!1;for(i in c)c.hasOwnProperty(i)&&"core"!==i&&-1===a.inArray(i,this.settings.plugins)&&delete c[i];if(a.isEmptyObject(c.core))return delete c.core,this.set_state(c,d),!1}return a.isEmptyObject(c)?(c=null,d&&d.call(this),this.trigger("set_state"),!1):!0}return!1},refresh:function(b,c){this._data.core.state=c===!0?{}:this.get_state(),c&&a.isFunction(c)&&(this._data.core.state=c.call(this,this._data.core.state)),this._cnt=0,this._model.data={},this._model.data[a.jstree.root]={id:a.jstree.root,parent:null,parents:[],children:[],children_d:[],state:{loaded:!1}},this._data.core.selected=[],this._data.core.last_clicked=null,this._data.core.focused=null;var d=this.get_container_ul()[0].className;b||(this.element.html(""),this.element.attr("aria-activedescendant","j"+this._id+"_loading")),this.load_node(a.jstree.root,function(b,c){c&&(this.get_container_ul()[0].className=d,this._firstChild(this.get_container_ul()[0])&&this.element.attr("aria-activedescendant",this._firstChild(this.get_container_ul()[0]).id),this.set_state(a.extend(!0,{},this._data.core.state),function(){this.trigger("refresh")})),this._data.core.state=null})},refresh_node:function(b){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var c=[],d=[],e=this._data.core.selected.concat([]);d.push(b.id),b.state.opened===!0&&c.push(b.id),this.get_node(b,!0).find(".jstree-open").each(function(){d.push(this.id),c.push(this.id)}),this._load_nodes(d,a.proxy(function(a){this.open_node(c,!1,0),this.select_node(e),this.trigger("refresh_node",{node:b,nodes:a})},this),!1,!0)},set_id:function(b,c){if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;var d,e,f=this._model.data,g=b.id;for(c=c.toString(),f[b.parent].children[a.inArray(b.id,f[b.parent].children)]=c,d=0,e=b.parents.length;e>d;d++)f[b.parents[d]].children_d[a.inArray(b.id,f[b.parents[d]].children_d)]=c;for(d=0,e=b.children.length;e>d;d++)f[b.children[d]].parent=c;for(d=0,e=b.children_d.length;e>d;d++)f[b.children_d[d]].parents[a.inArray(b.id,f[b.children_d[d]].parents)]=c;return d=a.inArray(b.id,this._data.core.selected),-1!==d&&(this._data.core.selected[d]=c),d=this.get_node(b.id,!0),d&&(d.attr("id",c),this.element.attr("aria-activedescendant")===b.id&&this.element.attr("aria-activedescendant",c)),delete f[b.id],b.id=c,b.li_attr.id=c,f[c]=b,this.trigger("set_id",{node:b,"new":b.id,old:g}),!0},get_text:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.text:!1},set_text:function(b,c){var d,e;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.set_text(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(b.text=c,this.get_node(b,!0).length&&this.redraw_node(b.id),this.trigger("set_text",{obj:b,text:c}),!0):!1},get_json:function(b,c,d){if(b=this.get_node(b||a.jstree.root),!b)return!1;c&&c.flat&&!d&&(d=[]);var e={id:b.id,text:b.text,icon:this.get_icon(b),li_attr:a.extend(!0,{},b.li_attr),a_attr:a.extend(!0,{},b.a_attr),state:{},data:c&&c.no_data?!1:a.extend(!0,a.isArray(b.data)?[]:{},b.data)},f,g;if(c&&c.flat?e.parent=b.parent:e.children=[],c&&c.no_state)delete e.state;else for(f in b.state)b.state.hasOwnProperty(f)&&(e.state[f]=b.state[f]);if(c&&c.no_li_attr&&delete e.li_attr,c&&c.no_a_attr&&delete e.a_attr,c&&c.no_id&&(delete e.id,e.li_attr&&e.li_attr.id&&delete e.li_attr.id,e.a_attr&&e.a_attr.id&&delete e.a_attr.id),c&&c.flat&&b.id!==a.jstree.root&&d.push(e),!c||!c.no_children)for(f=0,g=b.children.length;g>f;f++)c&&c.flat?this.get_json(b.children[f],c,d):e.children.push(this.get_json(b.children[f],c));return c&&c.flat?d:b.id===a.jstree.root?e.children:e},create_node:function(c,d,e,f,g){if(null===c&&(c=a.jstree.root),c=this.get_node(c),!c)return!1;if(e=e===b?"last":e,!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(c))return this.load_node(c,function(){this.create_node(c,d,e,f,!0)});d||(d={text:this.get_string("New node")}),d="string"==typeof d?{text:d}:a.extend(!0,{},d),d.text===b&&(d.text=this.get_string("New node"));var h,i,j,k;switch(c.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":h=this.get_node(c.parent),e=a.inArray(c.id,h.children),c=h;break;case"after":h=this.get_node(c.parent),e=a.inArray(c.id,h.children)+1,c=h;break;case"inside":case"first":e=0;break;case"last":e=c.children.length;break;default:e||(e=0)}if(e>c.children.length&&(e=c.children.length),d.id||(d.id=!0),!this.check("create_node",d,c,e))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(d.id===!0&&delete d.id,d=this._parse_model_from_json(d,c.id,c.parents.concat()),!d)return!1;for(h=this.get_node(d),i=[],i.push(d),i=i.concat(h.children_d),this.trigger("model",{nodes:i,parent:c.id}),c.children_d=c.children_d.concat(i),j=0,k=c.parents.length;k>j;j++)this._model.data[c.parents[j]].children_d=this._model.data[c.parents[j]].children_d.concat(i);for(d=h,h=[],j=0,k=c.children.length;k>j;j++)h[j>=e?j+1:j]=c.children[j];return h[e]=d.id,c.children=h,this.redraw_node(c,!0),this.trigger("create_node",{node:this.get_node(d),parent:c.id,position:e}),f&&f.call(this,this.get_node(d)),d.id},rename_node:function(b,c){var d,e,f;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.rename_node(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=b.text,this.check("rename_node",b,this.get_parent(b),c)?(this.set_text(b,c),this.trigger("rename_node",{node:b,text:c,old:f}),!0):(this.settings.core.error.call(this,this._data.core.last_error),!1)):!1},delete_node:function(b){var c,d,e,f,g,h,i,j,k,l,m,n;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.delete_node(b[c]);return!0}if(b=this.get_node(b),!b||b.id===a.jstree.root)return!1;if(e=this.get_node(b.parent),f=a.inArray(b.id,e.children),l=!1,!this.check("delete_node",b,e,f))return this.settings.core.error.call(this,this._data.core.last_error),!1;for(-1!==f&&(e.children=a.vakata.array_remove(e.children,f)),g=b.children_d.concat([]),g.push(b.id),h=0,i=b.parents.length;i>h;h++)this._model.data[b.parents[h]].children_d=a.vakata.array_filter(this._model.data[b.parents[h]].children_d,function(b){return-1===a.inArray(b,g)});for(j=0,k=g.length;k>j;j++)if(this._model.data[g[j]].state.selected){l=!0;break}for(l&&(this._data.core.selected=a.vakata.array_filter(this._data.core.selected,function(b){return-1===a.inArray(b,g)})),this.trigger("delete_node",{node:b,parent:e.id}),l&&this.trigger("changed",{action:"delete_node",node:b,selected:this._data.core.selected,parent:e.id}),j=0,k=g.length;k>j;j++)delete this._model.data[g[j]];return-1!==a.inArray(this._data.core.focused,g)&&(this._data.core.focused=null,m=this.element[0].scrollTop,n=this.element[0].scrollLeft,e.id===a.jstree.root?this._model.data[a.jstree.root].children[0]&&this.get_node(this._model.data[a.jstree.root].children[0],!0).children(".jstree-anchor").focus():this.get_node(e,!0).children(".jstree-anchor").focus(),this.element[0].scrollTop=m,this.element[0].scrollLeft=n),this.redraw_node(e,!0),!0},check:function(b,c,d,e,f){c=c&&c.id?c:this.get_node(c),d=d&&d.id?d:this.get_node(d);var g=b.match(/^move_node|copy_node|create_node$/i)?d:c,h=this.settings.core.check_callback;return"move_node"!==b&&"copy_node"!==b||f&&f.is_multi||c.id!==d.id&&("move_node"!==b||a.inArray(c.id,d.children)!==e)&&-1===a.inArray(d.id,c.children_d)?(g&&g.data&&(g=g.data),g&&g.functions&&(g.functions[b]===!1||g.functions[b]===!0)?(g.functions[b]===!1&&(this._data.core.last_error={error:"check",plugin:"core",id:"core_02",reason:"Node data prevents function: "+b,data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})}),g.functions[b]):h===!1||a.isFunction(h)&&h.call(this,b,c,d,e,f)===!1||h&&h[b]===!1?(this._data.core.last_error={error:"check",plugin:"core",id:"core_03",reason:"User config for core.check_callback prevents function: "+b,data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})},!1):!0):(this._data.core.last_error={error:"check",plugin:"core",id:"core_01",reason:"Moving parent inside child",data:JSON.stringify({chk:b,pos:e,obj:c&&c.id?c.id:!1,par:d&&d.id?d.id:!1})},!1)},last_error:function(){return this._data.core.last_error},move_node:function(c,d,e,f,g,h,i){var j,k,l,m,n,o,p,q,r,s,t,u,v,w;if(d=this.get_node(d),e=e===b?0:e,!d)return!1;if(!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(d))return this.load_node(d,function(){this.move_node(c,d,e,f,!0,!1,i)});if(a.isArray(c)){if(1!==c.length){for(j=0,k=c.length;k>j;j++)(r=this.move_node(c[j],d,e,f,g,!1,i))&&(d=r,e="after");return this.redraw(),!0}c=c[0]}if(c=c&&c.id?c:this.get_node(c),!c||c.id===a.jstree.root)return!1;if(l=(c.parent||a.jstree.root).toString(),n=e.toString().match(/^(before|after)$/)&&d.id!==a.jstree.root?this.get_node(d.parent):d,o=i?i:this._model.data[c.id]?this:a.jstree.reference(c.id),p=!o||!o._id||this._id!==o._id,m=o&&o._id&&l&&o._model.data[l]&&o._model.data[l].children?a.inArray(c.id,o._model.data[l].children):-1,o&&o._id&&(c=o._model.data[c.id]),p)return(r=this.copy_node(c,d,e,f,g,!1,i))?(o&&o.delete_node(c),r):!1;switch(d.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":e=a.inArray(d.id,n.children);break;case"after":e=a.inArray(d.id,n.children)+1;break;case"inside":case"first":e=0;break;case"last":e=n.children.length;break;default:e||(e=0)}if(e>n.children.length&&(e=n.children.length),!this.check("move_node",c,n,e,{core:!0,origin:i,is_multi:o&&o._id&&o._id!==this._id,is_foreign:!o||!o._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(c.parent===n.id){for(q=n.children.concat(),r=a.inArray(c.id,q),-1!==r&&(q=a.vakata.array_remove(q,r),e>r&&e--),r=[],s=0,t=q.length;t>s;s++)r[s>=e?s+1:s]=q[s];r[e]=c.id,n.children=r,this._node_changed(n.id),this.redraw(n.id===a.jstree.root)}else{for(r=c.children_d.concat(),r.push(c.id),s=0,t=c.parents.length;t>s;s++){for(q=[],w=o._model.data[c.parents[s]].children_d,u=0,v=w.length;v>u;u++)-1===a.inArray(w[u],r)&&q.push(w[u]);o._model.data[c.parents[s]].children_d=q}for(o._model.data[l].children=a.vakata.array_remove_item(o._model.data[l].children,c.id),s=0,t=n.parents.length;t>s;s++)this._model.data[n.parents[s]].children_d=this._model.data[n.parents[s]].children_d.concat(r);for(q=[],s=0,t=n.children.length;t>s;s++)q[s>=e?s+1:s]=n.children[s];for(q[e]=c.id,n.children=q,n.children_d.push(c.id),n.children_d=n.children_d.concat(c.children_d),c.parent=n.id,r=n.parents.concat(),r.unshift(n.id),w=c.parents.length,c.parents=r,r=r.concat(),s=0,t=c.children_d.length;t>s;s++)this._model.data[c.children_d[s]].parents=this._model.data[c.children_d[s]].parents.slice(0,-1*w),Array.prototype.push.apply(this._model.data[c.children_d[s]].parents,r);(l===a.jstree.root||n.id===a.jstree.root)&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||(this._node_changed(l),this._node_changed(n.id)),h||this.redraw()}return f&&f.call(this,c,n,e),this.trigger("move_node",{node:c,parent:n.id,position:e,old_parent:l,old_position:m,is_multi:o&&o._id&&o._id!==this._id,is_foreign:!o||!o._id,old_instance:o,new_instance:this}),c.id},copy_node:function(c,d,e,f,g,h,i){var j,k,l,m,n,o,p,q,r,s,t;if(d=this.get_node(d),e=e===b?0:e,!d)return!1;if(!e.toString().match(/^(before|after)$/)&&!g&&!this.is_loaded(d))return this.load_node(d,function(){this.copy_node(c,d,e,f,!0,!1,i)});if(a.isArray(c)){if(1!==c.length){for(j=0,k=c.length;k>j;j++)(m=this.copy_node(c[j],d,e,f,g,!0,i))&&(d=m,e="after");return this.redraw(),!0}c=c[0]}if(c=c&&c.id?c:this.get_node(c),!c||c.id===a.jstree.root)return!1;switch(q=(c.parent||a.jstree.root).toString(),r=e.toString().match(/^(before|after)$/)&&d.id!==a.jstree.root?this.get_node(d.parent):d,s=i?i:this._model.data[c.id]?this:a.jstree.reference(c.id),t=!s||!s._id||this._id!==s._id,s&&s._id&&(c=s._model.data[c.id]),d.id===a.jstree.root&&("before"===e&&(e="first"),"after"===e&&(e="last")),e){case"before":e=a.inArray(d.id,r.children);break;case"after":e=a.inArray(d.id,r.children)+1;break;case"inside":case"first":e=0;break;case"last":e=r.children.length;break;default:e||(e=0)}if(e>r.children.length&&(e=r.children.length),!this.check("copy_node",c,r,e,{core:!0,origin:i,is_multi:s&&s._id&&s._id!==this._id,is_foreign:!s||!s._id}))return this.settings.core.error.call(this,this._data.core.last_error),!1;if(p=s?s.get_json(c,{no_id:!0,no_data:!0,no_state:!0}):c,!p)return!1;if(p.id===!0&&delete p.id,p=this._parse_model_from_json(p,r.id,r.parents.concat()),!p)return!1;for(m=this.get_node(p),c&&c.state&&c.state.loaded===!1&&(m.state.loaded=!1),l=[],l.push(p),l=l.concat(m.children_d),this.trigger("model",{nodes:l,parent:r.id}),n=0,o=r.parents.length;o>n;n++)this._model.data[r.parents[n]].children_d=this._model.data[r.parents[n]].children_d.concat(l);for(l=[],n=0,o=r.children.length;o>n;n++)l[n>=e?n+1:n]=r.children[n];return l[e]=m.id,r.children=l,r.children_d.push(m.id),r.children_d=r.children_d.concat(m.children_d),r.id===a.jstree.root&&(this._model.force_full_redraw=!0),this._model.force_full_redraw||this._node_changed(r.id),h||this.redraw(r.id===a.jstree.root),f&&f.call(this,m,r,e),this.trigger("copy_node",{node:m,original:c,parent:r.id,position:e,old_parent:q,old_position:s&&s._id&&q&&s._model.data[q]&&s._model.data[q].children?a.inArray(c.id,s._model.data[q].children):-1,is_multi:s&&s._id&&s._id!==this._id,is_foreign:!s||!s._id,old_instance:s,new_instance:this}),m.id},cut:function(b){if(b||(b=this._data.core.selected.concat()),a.isArray(b)||(b=[b]),!b.length)return!1;var c=[],g,h,i;for(h=0,i=b.length;i>h;h++)g=this.get_node(b[h]),g&&g.id&&g.id!==a.jstree.root&&c.push(g); return c.length?(d=c,f=this,e="move_node",void this.trigger("cut",{node:b})):!1},copy:function(b){if(b||(b=this._data.core.selected.concat()),a.isArray(b)||(b=[b]),!b.length)return!1;var c=[],g,h,i;for(h=0,i=b.length;i>h;h++)g=this.get_node(b[h]),g&&g.id&&g.id!==a.jstree.root&&c.push(g);return c.length?(d=c,f=this,e="copy_node",void this.trigger("copy",{node:b})):!1},get_buffer:function(){return{mode:e,node:d,inst:f}},can_paste:function(){return e!==!1&&d!==!1},paste:function(a,b){return a=this.get_node(a),a&&e&&e.match(/^(copy_node|move_node)$/)&&d?(this[e](d,a,b,!1,!1,!1,f)&&this.trigger("paste",{parent:a.id,node:d,mode:e}),d=!1,e=!1,void(f=!1)):!1},clear_buffer:function(){d=!1,e=!1,f=!1,this.trigger("clear_buffer")},edit:function(b,c,d){var e,f,g,h,j,k,l,m,n,o=!1;return(b=this.get_node(b))?this.check("edit",b,this.get_parent(b))?(n=b,c="string"==typeof c?c:b.text,this.set_text(b,""),b=this._open_to(b),n.text=c,e=this._data.core.rtl,f=this.element.width(),this._data.core.focused=n.id,g=b.children(".jstree-anchor").focus(),h=a(""),j=c,k=a("
      ",{css:{position:"absolute",top:"-200px",left:e?"0px":"-1000px",visibility:"hidden"}}).appendTo(i.body),l=a("",{value:j,"class":"jstree-rename-input",css:{padding:"0",border:"1px solid silver","box-sizing":"border-box",display:"inline-block",height:this._data.core.li_height+"px",lineHeight:this._data.core.li_height+"px",width:"150px"},blur:a.proxy(function(c){c.stopImmediatePropagation(),c.preventDefault();var e=h.children(".jstree-rename-input"),f=e.val(),i=this.settings.core.force_text,m;""===f&&(f=j),k.remove(),h.replaceWith(g),h.remove(),j=i?j:a("
      ").append(a.parseHTML(j)).html(),b=this.get_node(b),this.set_text(b,j),m=!!this.rename_node(b,i?a("
      ").text(f).text():a("
      ").append(a.parseHTML(f)).html()),m||this.set_text(b,j),this._data.core.focused=n.id,setTimeout(a.proxy(function(){var a=this.get_node(n.id,!0);a.length&&(this._data.core.focused=n.id,a.children(".jstree-anchor").focus())},this),0),d&&d.call(this,n,m,o),l=null},this),keydown:function(a){var b=a.which;27===b&&(o=!0,this.value=j),(27===b||13===b||37===b||38===b||39===b||40===b||32===b)&&a.stopImmediatePropagation(),(27===b||13===b)&&(a.preventDefault(),this.blur())},click:function(a){a.stopImmediatePropagation()},mousedown:function(a){a.stopImmediatePropagation()},keyup:function(a){l.width(Math.min(k.text("pW"+this.value).width(),f))},keypress:function(a){return 13===a.which?!1:void 0}}),m={fontFamily:g.css("fontFamily")||"",fontSize:g.css("fontSize")||"",fontWeight:g.css("fontWeight")||"",fontStyle:g.css("fontStyle")||"",fontStretch:g.css("fontStretch")||"",fontVariant:g.css("fontVariant")||"",letterSpacing:g.css("letterSpacing")||"",wordSpacing:g.css("wordSpacing")||""},h.attr("class",g.attr("class")).append(g.contents().clone()).append(l),g.replaceWith(h),k.css(m),l.css(m).width(Math.min(k.text("pW"+l[0].value).width(),f))[0].select(),void a(i).one("mousedown.jstree touchstart.jstree dnd_start.vakata",function(b){l&&b.target!==l&&a(l).blur()})):(this.settings.core.error.call(this,this._data.core.last_error),!1):!1},set_theme:function(b,c){if(!b)return!1;if(c===!0){var d=this.settings.core.themes.dir;d||(d=a.jstree.path+"/themes"),c=d+"/"+b+"/style.css"}c&&-1===a.inArray(c,g)&&(a("head").append(''),g.push(c)),this._data.core.themes.name&&this.element.removeClass("jstree-"+this._data.core.themes.name),this._data.core.themes.name=b,this.element.addClass("jstree-"+b),this.element[this.settings.core.themes.responsive?"addClass":"removeClass"]("jstree-"+b+"-responsive"),this.trigger("set_theme",{theme:b})},get_theme:function(){return this._data.core.themes.name},set_theme_variant:function(a){this._data.core.themes.variant&&this.element.removeClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant),this._data.core.themes.variant=a,a&&this.element.addClass("jstree-"+this._data.core.themes.name+"-"+this._data.core.themes.variant)},get_theme_variant:function(){return this._data.core.themes.variant},show_stripes:function(){this._data.core.themes.stripes=!0,this.get_container_ul().addClass("jstree-striped"),this.trigger("show_stripes")},hide_stripes:function(){this._data.core.themes.stripes=!1,this.get_container_ul().removeClass("jstree-striped"),this.trigger("hide_stripes")},toggle_stripes:function(){this._data.core.themes.stripes?this.hide_stripes():this.show_stripes()},show_dots:function(){this._data.core.themes.dots=!0,this.get_container_ul().removeClass("jstree-no-dots"),this.trigger("show_dots")},hide_dots:function(){this._data.core.themes.dots=!1,this.get_container_ul().addClass("jstree-no-dots"),this.trigger("hide_dots")},toggle_dots:function(){this._data.core.themes.dots?this.hide_dots():this.show_dots()},show_icons:function(){this._data.core.themes.icons=!0,this.get_container_ul().removeClass("jstree-no-icons"),this.trigger("show_icons")},hide_icons:function(){this._data.core.themes.icons=!1,this.get_container_ul().addClass("jstree-no-icons"),this.trigger("hide_icons")},toggle_icons:function(){this._data.core.themes.icons?this.hide_icons():this.show_icons()},show_ellipsis:function(){this._data.core.themes.ellipsis=!0,this.get_container_ul().addClass("jstree-ellipsis"),this.trigger("show_ellipsis")},hide_ellipsis:function(){this._data.core.themes.ellipsis=!1,this.get_container_ul().removeClass("jstree-ellipsis"),this.trigger("hide_ellipsis")},toggle_ellipsis:function(){this._data.core.themes.ellipsis?this.hide_ellipsis():this.show_ellipsis()},set_icon:function(c,d){var e,f,g,h;if(a.isArray(c)){for(c=c.slice(),e=0,f=c.length;f>e;e++)this.set_icon(c[e],d);return!0}return c=this.get_node(c),c&&c.id!==a.jstree.root?(h=c.icon,c.icon=d===!0||null===d||d===b||""===d?!0:d,g=this.get_node(c,!0).children(".jstree-anchor").children(".jstree-themeicon"),d===!1?(g.removeClass("jstree-themeicon-custom "+h).css("background","").removeAttr("rel"),this.hide_icon(c)):d===!0||null===d||d===b||""===d?(g.removeClass("jstree-themeicon-custom "+h).css("background","").removeAttr("rel"),h===!1&&this.show_icon(c)):-1===d.indexOf("/")&&-1===d.indexOf(".")?(g.removeClass(h).css("background",""),g.addClass(d+" jstree-themeicon-custom").attr("rel",d),h===!1&&this.show_icon(c)):(g.removeClass(h).css("background",""),g.addClass("jstree-themeicon-custom").css("background","url('"+d+"') center center no-repeat").attr("rel",d),h===!1&&this.show_icon(c)),!0):!1},get_icon:function(b){return b=this.get_node(b),b&&b.id!==a.jstree.root?b.icon:!1},hide_icon:function(b){var c,d;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.hide_icon(b[c]);return!0}return b=this.get_node(b),b&&b!==a.jstree.root?(b.icon=!1,this.get_node(b,!0).children(".jstree-anchor").children(".jstree-themeicon").addClass("jstree-themeicon-hidden"),!0):!1},show_icon:function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.show_icon(b[c]);return!0}return b=this.get_node(b),b&&b!==a.jstree.root?(e=this.get_node(b,!0),b.icon=e.length?e.children(".jstree-anchor").children(".jstree-themeicon").attr("rel"):!0,b.icon||(b.icon=!0),e.children(".jstree-anchor").children(".jstree-themeicon").removeClass("jstree-themeicon-hidden"),!0):!1}},a.vakata={},a.vakata.attributes=function(b,c){b=a(b)[0];var d=c?{}:[];return b&&b.attributes&&a.each(b.attributes,function(b,e){-1===a.inArray(e.name.toLowerCase(),["style","contenteditable","hasfocus","tabindex"])&&null!==e.value&&""!==a.trim(e.value)&&(c?d[e.name]=e.value:d.push(e.name))}),d},a.vakata.array_unique=function(a){var c=[],d,e,f,g={};for(d=0,f=a.length;f>d;d++)g[a[d]]===b&&(c.push(a[d]),g[a[d]]=!0);return c},a.vakata.array_remove=function(a,b){return a.splice(b,1),a},a.vakata.array_remove_item=function(b,c){var d=a.inArray(c,b);return-1!==d?a.vakata.array_remove(b,d):b},a.vakata.array_filter=function(a,b,c,d,e){if(a.filter)return a.filter(b,c);d=[];for(e in a)~~e+""==e+""&&e>=0&&b.call(c,a[e],+e,a)&&d.push(a[e]);return d},a.jstree.plugins.changed=function(a,b){var c=[];this.trigger=function(a,d){var e,f;if(d||(d={}),"changed"===a.replace(".jstree","")){d.changed={selected:[],deselected:[]};var g={};for(e=0,f=c.length;f>e;e++)g[c[e]]=1;for(e=0,f=d.selected.length;f>e;e++)g[d.selected[e]]?g[d.selected[e]]=2:d.changed.selected.push(d.selected[e]);for(e=0,f=c.length;f>e;e++)1===g[c[e]]&&d.changed.deselected.push(c[e]);c=d.selected.slice()}b.trigger.call(this,a,d)},this.refresh=function(a,d){return c=[],b.refresh.apply(this,arguments)}};var j=i.createElement("I");j.className="jstree-icon jstree-checkbox",j.setAttribute("role","presentation"),a.jstree.defaults.checkbox={visible:!0,three_state:!0,whole_node:!0,keep_selected_style:!0,cascade:"",tie_selection:!0,cascade_to_disabled:!0,cascade_to_hidden:!0},a.jstree.plugins.checkbox=function(c,d){this.bind=function(){d.bind.call(this),this._data.checkbox.uto=!1,this._data.checkbox.selected=[],this.settings.checkbox.three_state&&(this.settings.checkbox.cascade="up+down+undetermined"),this.element.on("init.jstree",a.proxy(function(){this._data.checkbox.visible=this.settings.checkbox.visible,this.settings.checkbox.keep_selected_style||this.element.addClass("jstree-checkbox-no-clicked"),this.settings.checkbox.tie_selection&&this.element.addClass("jstree-checkbox-selection")},this)).on("loading.jstree",a.proxy(function(){this[this._data.checkbox.visible?"show_checkboxes":"hide_checkboxes"]()},this)),-1!==this.settings.checkbox.cascade.indexOf("undetermined")&&this.element.on("changed.jstree uncheck_node.jstree check_node.jstree uncheck_all.jstree check_all.jstree move_node.jstree copy_node.jstree redraw.jstree open_node.jstree",a.proxy(function(){this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(a.proxy(this._undetermined,this),50)},this)),this.settings.checkbox.tie_selection||this.element.on("model.jstree",a.proxy(function(a,b){var c=this._model.data,d=c[b.parent],e=b.nodes,f,g;for(f=0,g=e.length;g>f;f++)c[e[f]].state.checked=c[e[f]].state.checked||c[e[f]].original&&c[e[f]].original.state&&c[e[f]].original.state.checked,c[e[f]].state.checked&&this._data.checkbox.selected.push(e[f])},this)),(-1!==this.settings.checkbox.cascade.indexOf("up")||-1!==this.settings.checkbox.cascade.indexOf("down"))&&this.element.on("model.jstree",a.proxy(function(b,c){var d=this._model.data,e=d[c.parent],f=c.nodes,g=[],h,i,j,k,l,m,n=this.settings.checkbox.cascade,o=this.settings.checkbox.tie_selection;if(-1!==n.indexOf("down"))if(e.state[o?"selected":"checked"]){for(i=0,j=f.length;j>i;i++)d[f[i]].state[o?"selected":"checked"]=!0;this._data[o?"core":"checkbox"].selected=this._data[o?"core":"checkbox"].selected.concat(f)}else for(i=0,j=f.length;j>i;i++)if(d[f[i]].state[o?"selected":"checked"]){for(k=0,l=d[f[i]].children_d.length;l>k;k++)d[d[f[i]].children_d[k]].state[o?"selected":"checked"]=!0;this._data[o?"core":"checkbox"].selected=this._data[o?"core":"checkbox"].selected.concat(d[f[i]].children_d)}if(-1!==n.indexOf("up")){for(i=0,j=e.children_d.length;j>i;i++)d[e.children_d[i]].children.length||g.push(d[e.children_d[i]].parent);for(g=a.vakata.array_unique(g),k=0,l=g.length;l>k;k++){e=d[g[k]];while(e&&e.id!==a.jstree.root){for(h=0,i=0,j=e.children.length;j>i;i++)h+=d[e.children[i]].state[o?"selected":"checked"];if(h!==j)break;e.state[o?"selected":"checked"]=!0,this._data[o?"core":"checkbox"].selected.push(e.id),m=this.get_node(e,!0),m&&m.length&&m.attr("aria-selected",!0).children(".jstree-anchor").addClass(o?"jstree-clicked":"jstree-checked"),e=this.get_node(e.parent)}}}this._data[o?"core":"checkbox"].selected=a.vakata.array_unique(this._data[o?"core":"checkbox"].selected)},this)).on(this.settings.checkbox.tie_selection?"select_node.jstree":"check_node.jstree",a.proxy(function(b,c){var d=this,e=c.node,f=this._model.data,g=this.get_node(e.parent),h,i,j,k,l=this.settings.checkbox.cascade,m=this.settings.checkbox.tie_selection,n={},o=this._data[m?"core":"checkbox"].selected;for(h=0,i=o.length;i>h;h++)n[o[h]]=!0;if(-1!==l.indexOf("down")){var p=this._cascade_new_checked_state(e.id,!0),q=e.children_d.concat(e.id);for(h=0,i=q.length;i>h;h++)p.indexOf(q[h])>-1?n[q[h]]=!0:delete n[q[h]]}if(-1!==l.indexOf("up"))while(g&&g.id!==a.jstree.root){for(j=0,h=0,i=g.children.length;i>h;h++)j+=f[g.children[h]].state[m?"selected":"checked"];if(j!==i)break;g.state[m?"selected":"checked"]=!0,n[g.id]=!0,k=this.get_node(g,!0),k&&k.length&&k.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"),g=this.get_node(g.parent)}o=[];for(h in n)n.hasOwnProperty(h)&&o.push(h);this._data[m?"core":"checkbox"].selected=o},this)).on(this.settings.checkbox.tie_selection?"deselect_all.jstree":"uncheck_all.jstree",a.proxy(function(b,c){var d=this.get_node(a.jstree.root),e=this._model.data,f,g,h;for(f=0,g=d.children_d.length;g>f;f++)h=e[d.children_d[f]],h&&h.original&&h.original.state&&h.original.state.undetermined&&(h.original.state.undetermined=!1)},this)).on(this.settings.checkbox.tie_selection?"deselect_node.jstree":"uncheck_node.jstree",a.proxy(function(a,b){var c=this,d=b.node,e=this.get_node(d,!0),f,g,h,i=this.settings.checkbox.cascade,j=this.settings.checkbox.tie_selection,k=this._data[j?"core":"checkbox"].selected,l={},m=[],n=d.children_d.concat(d.id);if(-1!==i.indexOf("down")){var o=this._cascade_new_checked_state(d.id,!1);k=k.filter(function(a){return-1===n.indexOf(a)||o.indexOf(a)>-1})}if(-1!==i.indexOf("up")&&-1===k.indexOf(d.id)){for(f=0,g=d.parents.length;g>f;f++)h=this._model.data[d.parents[f]],h.state[j?"selected":"checked"]=!1,h&&h.original&&h.original.state&&h.original.state.undetermined&&(h.original.state.undetermined=!1),h=this.get_node(d.parents[f],!0),h&&h.length&&h.attr("aria-selected",!1).children(".jstree-anchor").removeClass(j?"jstree-clicked":"jstree-checked");k=k.filter(function(a){return-1===d.parents.indexOf(a)})}this._data[j?"core":"checkbox"].selected=k},this)),-1!==this.settings.checkbox.cascade.indexOf("up")&&this.element.on("delete_node.jstree",a.proxy(function(b,c){var d=this.get_node(c.parent),e=this._model.data,f,g,h,i,j=this.settings.checkbox.tie_selection;while(d&&d.id!==a.jstree.root&&!d.state[j?"selected":"checked"]){for(h=0,f=0,g=d.children.length;g>f;f++)h+=e[d.children[f]].state[j?"selected":"checked"];if(!(g>0&&h===g))break;d.state[j?"selected":"checked"]=!0,this._data[j?"core":"checkbox"].selected.push(d.id),i=this.get_node(d,!0),i&&i.length&&i.attr("aria-selected",!0).children(".jstree-anchor").addClass(j?"jstree-clicked":"jstree-checked"),d=this.get_node(d.parent)}},this)).on("move_node.jstree",a.proxy(function(b,c){var d=c.is_multi,e=c.old_parent,f=this.get_node(c.parent),g=this._model.data,h,i,j,k,l,m=this.settings.checkbox.tie_selection;if(!d){h=this.get_node(e);while(h&&h.id!==a.jstree.root&&!h.state[m?"selected":"checked"]){for(i=0,j=0,k=h.children.length;k>j;j++)i+=g[h.children[j]].state[m?"selected":"checked"];if(!(k>0&&i===k))break;h.state[m?"selected":"checked"]=!0,this._data[m?"core":"checkbox"].selected.push(h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"),h=this.get_node(h.parent)}}h=f;while(h&&h.id!==a.jstree.root){for(i=0,j=0,k=h.children.length;k>j;j++)i+=g[h.children[j]].state[m?"selected":"checked"];if(i===k)h.state[m?"selected":"checked"]||(h.state[m?"selected":"checked"]=!0,this._data[m?"core":"checkbox"].selected.push(h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!0).children(".jstree-anchor").addClass(m?"jstree-clicked":"jstree-checked"));else{if(!h.state[m?"selected":"checked"])break;h.state[m?"selected":"checked"]=!1,this._data[m?"core":"checkbox"].selected=a.vakata.array_remove_item(this._data[m?"core":"checkbox"].selected,h.id),l=this.get_node(h,!0),l&&l.length&&l.attr("aria-selected",!1).children(".jstree-anchor").removeClass(m?"jstree-clicked":"jstree-checked")}h=this.get_node(h.parent)}},this))},this.get_undetermined=function(c){if(-1===this.settings.checkbox.cascade.indexOf("undetermined"))return[];var d,e,f,g,h={},i=this._model.data,j=this.settings.checkbox.tie_selection,k=this._data[j?"core":"checkbox"].selected,l=[],m=this,n=[];for(d=0,e=k.length;e>d;d++)if(i[k[d]]&&i[k[d]].parents)for(f=0,g=i[k[d]].parents.length;g>f;f++){if(h[i[k[d]].parents[f]]!==b)break;i[k[d]].parents[f]!==a.jstree.root&&(h[i[k[d]].parents[f]]=!0,l.push(i[k[d]].parents[f]))}for(this.element.find(".jstree-closed").not(":has(.jstree-children)").each(function(){var c=m.get_node(this),j;if(c)if(c.state.loaded){for(d=0,e=c.children_d.length;e>d;d++)if(j=i[c.children_d[d]],!j.state.loaded&&j.original&&j.original.state&&j.original.state.undetermined&&j.original.state.undetermined===!0)for(h[j.id]===b&&j.id!==a.jstree.root&&(h[j.id]=!0,l.push(j.id)),f=0,g=j.parents.length;g>f;f++)h[j.parents[f]]===b&&j.parents[f]!==a.jstree.root&&(h[j.parents[f]]=!0,l.push(j.parents[f]))}else if(c.original&&c.original.state&&c.original.state.undetermined&&c.original.state.undetermined===!0)for(h[c.id]===b&&c.id!==a.jstree.root&&(h[c.id]=!0,l.push(c.id)),f=0,g=c.parents.length;g>f;f++)h[c.parents[f]]===b&&c.parents[f]!==a.jstree.root&&(h[c.parents[f]]=!0,l.push(c.parents[f]))}),d=0,e=l.length;e>d;d++)i[l[d]].state[j?"selected":"checked"]||n.push(c?i[l[d]]:l[d]);return n},this._undetermined=function(){if(null!==this.element){var a=this.get_undetermined(!1),b,c,d;for(this.element.find(".jstree-undetermined").removeClass("jstree-undetermined"),b=0,c=a.length;c>b;b++)d=this.get_node(a[b],!0),d&&d.length&&d.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-undetermined")}},this.redraw_node=function(b,c,e,f){if(b=d.redraw_node.apply(this,arguments)){var g,h,i=null,k=null;for(g=0,h=b.childNodes.length;h>g;g++)if(b.childNodes[g]&&b.childNodes[g].className&&-1!==b.childNodes[g].className.indexOf("jstree-anchor")){i=b.childNodes[g];break}i&&(!this.settings.checkbox.tie_selection&&this._model.data[b.id].state.checked&&(i.className+=" jstree-checked"),k=j.cloneNode(!1),this._model.data[b.id].state.checkbox_disabled&&(k.className+=" jstree-checkbox-disabled"),i.insertBefore(k,i.childNodes[0]))}return e||-1===this.settings.checkbox.cascade.indexOf("undetermined")||(this._data.checkbox.uto&&clearTimeout(this._data.checkbox.uto),this._data.checkbox.uto=setTimeout(a.proxy(this._undetermined,this),50)),b},this.show_checkboxes=function(){this._data.core.themes.checkboxes=!0,this.get_container_ul().removeClass("jstree-no-checkboxes")},this.hide_checkboxes=function(){this._data.core.themes.checkboxes=!1,this.get_container_ul().addClass("jstree-no-checkboxes")},this.toggle_checkboxes=function(){this._data.core.themes.checkboxes?this.hide_checkboxes():this.show_checkboxes()},this.is_undetermined=function(b){b=this.get_node(b);var c=this.settings.checkbox.cascade,d,e,f=this.settings.checkbox.tie_selection,g=this._data[f?"core":"checkbox"].selected,h=this._model.data;if(!b||b.state[f?"selected":"checked"]===!0||-1===c.indexOf("undetermined")||-1===c.indexOf("down")&&-1===c.indexOf("up"))return!1;if(!b.state.loaded&&b.original.state.undetermined===!0)return!0;for(d=0,e=b.children_d.length;e>d;d++)if(-1!==a.inArray(b.children_d[d],g)||!h[b.children_d[d]].state.loaded&&h[b.children_d[d]].original.state.undetermined)return!0;return!1},this.disable_checkbox=function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.disable_checkbox(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(e=this.get_node(b,!0),void(b.state.checkbox_disabled||(b.state.checkbox_disabled=!0,e&&e.length&&e.children(".jstree-anchor").children(".jstree-checkbox").addClass("jstree-checkbox-disabled"),this.trigger("disable_checkbox",{node:b})))):!1},this.enable_checkbox=function(b){var c,d,e;if(a.isArray(b)){for(b=b.slice(),c=0,d=b.length;d>c;c++)this.enable_checkbox(b[c]);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(e=this.get_node(b,!0),void(b.state.checkbox_disabled&&(b.state.checkbox_disabled=!1,e&&e.length&&e.children(".jstree-anchor").children(".jstree-checkbox").removeClass("jstree-checkbox-disabled"),this.trigger("enable_checkbox",{node:b})))):!1},this.activate_node=function(b,c){return a(c.target).hasClass("jstree-checkbox-disabled")?!1:(this.settings.checkbox.tie_selection&&(this.settings.checkbox.whole_node||a(c.target).hasClass("jstree-checkbox"))&&(c.ctrlKey=!0),this.settings.checkbox.tie_selection||!this.settings.checkbox.whole_node&&!a(c.target).hasClass("jstree-checkbox")?d.activate_node.call(this,b,c):this.is_disabled(b)?!1:(this.is_checked(b)?this.uncheck_node(b,c):this.check_node(b,c),void this.trigger("activate_node",{node:this.get_node(b)})))},this._cascade_new_checked_state=function(a,b){var c=this,d=this.settings.checkbox.tie_selection,e=this._model.data[a],f=[],g=[],h,i,j;if(!this.settings.checkbox.cascade_to_disabled&&e.state.disabled||!this.settings.checkbox.cascade_to_hidden&&e.state.hidden)j=this.get_checked_descendants(a),e.state[d?"selected":"checked"]&&j.push(e.id),f=f.concat(j);else{if(e.children)for(h=0,i=e.children.length;i>h;h++){var k=e.children[h];j=c._cascade_new_checked_state(k,b),f=f.concat(j),j.indexOf(k)>-1&&g.push(k)}var l=c.get_node(e,!0),m=g.length>0&&g.lengthe;e++)this.check_node(b[e],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(d=this.get_node(b,!0),void(b.state.checked||(b.state.checked=!0,this._data.checkbox.selected.push(b.id),d&&d.length&&d.children(".jstree-anchor").addClass("jstree-checked"),this.trigger("check_node",{node:b,selected:this._data.checkbox.selected,event:c})))):!1},this.uncheck_node=function(b,c){if(this.settings.checkbox.tie_selection)return this.deselect_node(b,!1,c);var d,e,f;if(a.isArray(b)){for(b=b.slice(),d=0,e=b.length;e>d;d++)this.uncheck_node(b[d],c);return!0}return b=this.get_node(b),b&&b.id!==a.jstree.root?(f=this.get_node(b,!0),void(b.state.checked&&(b.state.checked=!1,this._data.checkbox.selected=a.vakata.array_remove_item(this._data.checkbox.selected,b.id),f.length&&f.children(".jstree-anchor").removeClass("jstree-checked"),this.trigger("uncheck_node",{node:b,selected:this._data.checkbox.selected,event:c})))):!1},this.check_all=function(){if(this.settings.checkbox.tie_selection)return this.select_all();var b=this._data.checkbox.selected.concat([]),c,d;for(this._data.checkbox.selected=this._model.data[a.jstree.root].children_d.concat(),c=0,d=this._data.checkbox.selected.length;d>c;c++)this._model.data[this._data.checkbox.selected[c]]&&(this._model.data[this._data.checkbox.selected[c]].state.checked=!0);this.redraw(!0),this.trigger("check_all",{selected:this._data.checkbox.selected})},this.uncheck_all=function(){if(this.settings.checkbox.tie_selection)return this.deselect_all();var a=this._data.checkbox.selected.concat([]),b,c;for(b=0,c=this._data.checkbox.selected.length;c>b;b++)this._model.data[this._data.checkbox.selected[b]]&&(this._model.data[this._data.checkbox.selected[b]].state.checked=!1);this._data.checkbox.selected=[],this.element.find(".jstree-checked").removeClass("jstree-checked"),this.trigger("uncheck_all",{selected:this._data.checkbox.selected,node:a})},this.is_checked=function(b){return this.settings.checkbox.tie_selection?this.is_selected(b):(b=this.get_node(b),b&&b.id!==a.jstree.root?b.state.checked:!1)},this.get_checked=function(b){return this.settings.checkbox.tie_selection?this.get_selected(b):b?a.map(this._data.checkbox.selected,a.proxy(function(a){return this.get_node(a)},this)):this._data.checkbox.selected},this.get_top_checked=function(b){if(this.settings.checkbox.tie_selection)return this.get_top_selected(b);var c=this.get_checked(!0),d={},e,f,g,h;for(e=0,f=c.length;f>e;e++)d[c[e].id]=c[e];for(e=0,f=c.length;f>e;e++)for(g=0,h=c[e].children_d.length;h>g;g++)d[c[e].children_d[g]]&&delete d[c[e].children_d[g]];c=[];for(e in d)d.hasOwnProperty(e)&&c.push(e);return b?a.map(c,a.proxy(function(a){return this.get_node(a)},this)):c},this.get_bottom_checked=function(b){if(this.settings.checkbox.tie_selection)return this.get_bottom_selected(b);var c=this.get_checked(!0),d=[],e,f;for(e=0,f=c.length;f>e;e++)c[e].children.length||d.push(c[e].id);return b?a.map(d,a.proxy(function(a){return this.get_node(a)},this)):d},this.load_node=function(b,c){var e,f,g,h,i,j;if(!a.isArray(b)&&!this.settings.checkbox.tie_selection&&(j=this.get_node(b),j&&j.state.loaded))for(e=0,f=j.children_d.length;f>e;e++)this._model.data[j.children_d[e]].state.checked&&(i=!0,this._data.checkbox.selected=a.vakata.array_remove_item(this._data.checkbox.selected,j.children_d[e]));return d.load_node.apply(this,arguments)},this.get_state=function(){var a=d.get_state.apply(this,arguments);return this.settings.checkbox.tie_selection?a:(a.checkbox=this._data.checkbox.selected.slice(),a)},this.set_state=function(b,c){var e=d.set_state.apply(this,arguments);if(e&&b.checkbox){if(!this.settings.checkbox.tie_selection){this.uncheck_all();var f=this;a.each(b.checkbox,function(a,b){f.check_node(b)})}return delete b.checkbox,this.set_state(b,c),!1}return e},this.refresh=function(a,b){return this.settings.checkbox.tie_selection&&(this._data.checkbox.selected=[]),d.refresh.apply(this,arguments)}},a.jstree.defaults.conditionalselect=function(){return!0},a.jstree.plugins.conditionalselect=function(a,b){this.activate_node=function(a,c){return this.settings.conditionalselect.call(this,this.get_node(a),c)?b.activate_node.call(this,a,c):void 0}},a.jstree.defaults.contextmenu={select_node:!0,show_at_node:!0,items:function(b,c){return{create:{separator_before:!1,separator_after:!0,_disabled:!1,label:"Create",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.create_node(d,{},"last",function(a){try{c.edit(a)}catch(b){setTimeout(function(){c.edit(a)},0)}})}},rename:{separator_before:!1,separator_after:!1,_disabled:!1,label:"Rename",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.edit(d)}},remove:{separator_before:!1,icon:!1,separator_after:!1,_disabled:!1,label:"Delete",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.delete_node(c.get_selected()):c.delete_node(d)}},ccp:{separator_before:!0,icon:!1,separator_after:!1,label:"Edit",action:!1,submenu:{cut:{separator_before:!1,separator_after:!1,label:"Cut",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.cut(c.get_top_selected()):c.cut(d)}},copy:{separator_before:!1,icon:!1,separator_after:!1,label:"Copy",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.is_selected(d)?c.copy(c.get_top_selected()):c.copy(d)}},paste:{separator_before:!1,icon:!1,_disabled:function(b){return!a.jstree.reference(b.reference).can_paste()},separator_after:!1,label:"Paste",action:function(b){var c=a.jstree.reference(b.reference),d=c.get_node(b.reference);c.paste(d)}}}}}}},a.jstree.plugins.contextmenu=function(c,d){this.bind=function(){d.bind.call(this);var b=0,c=null,e,f;this.element.on("init.jstree loading.jstree ready.jstree",a.proxy(function(){this.get_container_ul().addClass("jstree-contextmenu")},this)).on("contextmenu.jstree",".jstree-anchor",a.proxy(function(a,d){"input"!==a.target.tagName.toLowerCase()&&(a.preventDefault(),b=a.ctrlKey?+new Date:0,(d||c)&&(b=+new Date+1e4),c&&clearTimeout(c),this.is_loading(a.currentTarget)||this.show_contextmenu(a.currentTarget,a.pageX,a.pageY,a))},this)).on("click.jstree",".jstree-anchor",a.proxy(function(c){this._data.contextmenu.visible&&(!b||+new Date-b>250)&&a.vakata.context.hide(),b=0},this)).on("touchstart.jstree",".jstree-anchor",function(b){b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(e=b.originalEvent.changedTouches[0].clientX,f=b.originalEvent.changedTouches[0].clientY,c=setTimeout(function(){a(b.currentTarget).trigger("contextmenu",!0)},750))}).on("touchmove.vakata.jstree",function(b){c&&b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(Math.abs(e-b.originalEvent.changedTouches[0].clientX)>10||Math.abs(f-b.originalEvent.changedTouches[0].clientY)>10)&&(clearTimeout(c),a.vakata.context.hide())}).on("touchend.vakata.jstree",function(a){c&&clearTimeout(c)}),a(i).on("context_hide.vakata.jstree",a.proxy(function(b,c){this._data.contextmenu.visible=!1,a(c.reference).removeClass("jstree-context")},this))},this.teardown=function(){this._data.contextmenu.visible&&a.vakata.context.hide(),d.teardown.call(this)},this.show_contextmenu=function(c,d,e,f){if(c=this.get_node(c),!c||c.id===a.jstree.root)return!1;var g=this.settings.contextmenu,h=this.get_node(c,!0),i=h.children(".jstree-anchor"),j=!1,k=!1;(g.show_at_node||d===b||e===b)&&(j=i.offset(),d=j.left,e=j.top+this._data.core.li_height),this.settings.contextmenu.select_node&&!this.is_selected(c)&&this.activate_node(c,f),k=g.items,a.isFunction(k)&&(k=k.call(this,c,a.proxy(function(a){this._show_contextmenu(c,d,e,a)},this))),a.isPlainObject(k)&&this._show_contextmenu(c,d,e,k)},this._show_contextmenu=function(b,c,d,e){var f=this.get_node(b,!0),g=f.children(".jstree-anchor");a(i).one("context_show.vakata.jstree",a.proxy(function(b,c){var d="jstree-contextmenu jstree-"+this.get_theme()+"-contextmenu";a(c.element).addClass(d),g.addClass("jstree-context")},this)),this._data.contextmenu.visible=!0,a.vakata.context.show(g,{x:c,y:d},e),this.trigger("show_contextmenu",{node:b,x:c,y:d})}},function(a){var b=!1,c={element:!1,reference:!1,position_x:0,position_y:0,items:[],html:"",is_visible:!1};a.vakata.context={settings:{hide_onmouseleave:0,icons:!0},_trigger:function(b){a(i).triggerHandler("context_"+b+".vakata",{reference:c.reference,element:c.element,position:{x:c.position_x,y:c.position_y}})},_execute:function(b){return b=c.items[b],b&&(!b._disabled||a.isFunction(b._disabled)&&!b._disabled({item:b,reference:c.reference,element:c.element}))&&b.action?b.action.call(null,{item:b,reference:c.reference,element:c.element,position:{x:c.position_x,y:c.position_y}}):!1},_parse:function(b,d){if(!b)return!1;d||(c.html="",c.items=[]);var e="",f=!1,g;return d&&(e+=""),d||(c.html=e,a.vakata.context._trigger("parse")),e.length>10?e:!1},_show_submenu:function(c){if(c=a(c),c.length&&c.children("ul").length){var d=c.children("ul"),e=c.offset().left,f=e+c.outerWidth(),g=c.offset().top,h=d.width(),i=d.height(),j=a(window).width()+a(window).scrollLeft(),k=a(window).height()+a(window).scrollTop();b?c[f-(h+10+c.outerWidth())<0?"addClass":"removeClass"]("vakata-context-left"):c[f+h>j&&e>j-f?"addClass":"removeClass"]("vakata-context-right"),g+i+10>k&&d.css("bottom","-1px"),c.hasClass("vakata-context-right")?h>e&&d.css("margin-right",e-h):h>j-f&&d.css("margin-left",j-f-h),d.show()}},show:function(d,e,f){var g,h,j,k,l,m,n,o,p=!0;switch(c.element&&c.element.length&&c.element.width(""),p){case!e&&!d:return!1;case!!e&&!!d:c.reference=d,c.position_x=e.x,c.position_y=e.y;break;case!e&&!!d:c.reference=d,g=d.offset(),c.position_x=g.left+d.outerHeight(),c.position_y=g.top;break;case!!e&&!d:c.position_x=e.x,c.position_y=e.y}d&&!f&&a(d).data("vakata_contextmenu")&&(f=a(d).data("vakata_contextmenu")),a.vakata.context._parse(f)&&c.element.html(c.html),c.items.length&&(c.element.appendTo(i.body),h=c.element,j=c.position_x,k=c.position_y,l=h.width(),m=h.height(),n=a(window).width()+a(window).scrollLeft(),o=a(window).height()+a(window).scrollTop(),b&&(j-=h.outerWidth()-a(d).outerWidth(),jn&&(j=n-(l+20)),k+m+20>o&&(k=o-(m+20)),c.element.css({left:j,top:k}).show().find("a").first().focus().parent().addClass("vakata-context-hover"),c.is_visible=!0,a.vakata.context._trigger("show"))},hide:function(){c.is_visible&&(c.element.hide().find("ul").hide().end().find(":focus").blur().end().detach(),c.is_visible=!1,a.vakata.context._trigger("hide"))}},a(function(){b="rtl"===a(i.body).css("direction");var d=!1;c.element=a("
        "),c.element.on("mouseenter","li",function(b){b.stopImmediatePropagation(),a.contains(this,b.relatedTarget)||(d&&clearTimeout(d),c.element.find(".vakata-context-hover").removeClass("vakata-context-hover").end(),a(this).siblings().find("ul").hide().end().end().parentsUntil(".vakata-context","li").addBack().addClass("vakata-context-hover"),a.vakata.context._show_submenu(this))}).on("mouseleave","li",function(b){a.contains(this,b.relatedTarget)||a(this).find(".vakata-context-hover").addBack().removeClass("vakata-context-hover")}).on("mouseleave",function(b){a(this).find(".vakata-context-hover").removeClass("vakata-context-hover"),a.vakata.context.settings.hide_onmouseleave&&(d=setTimeout(function(b){return function(){a.vakata.context.hide()}}(this),a.vakata.context.settings.hide_onmouseleave))}).on("click","a",function(b){b.preventDefault(),a(this).blur().parent().hasClass("vakata-context-disabled")||a.vakata.context._execute(a(this).attr("rel"))===!1||a.vakata.context.hide()}).on("keydown","a",function(b){var d=null;switch(b.which){case 13:case 32:b.type="click",b.preventDefault(),a(b.currentTarget).trigger(b);break;case 37:c.is_visible&&(c.element.find(".vakata-context-hover").last().closest("li").first().find("ul").hide().find(".vakata-context-hover").removeClass("vakata-context-hover").end().end().children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 38:c.is_visible&&(d=c.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").prevAll("li:not(.vakata-context-separator)").first(),d.length||(d=c.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").last()),d.addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 39:c.is_visible&&(c.element.find(".vakata-context-hover").last().children("ul").show().children("li:not(.vakata-context-separator)").removeClass("vakata-context-hover").first().addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 40:c.is_visible&&(d=c.element.find("ul:visible").addBack().last().children(".vakata-context-hover").removeClass("vakata-context-hover").nextAll("li:not(.vakata-context-separator)").first(),d.length||(d=c.element.find("ul:visible").addBack().last().children("li:not(.vakata-context-separator)").first()),d.addClass("vakata-context-hover").children("a").focus(),b.stopImmediatePropagation(),b.preventDefault());break;case 27:a.vakata.context.hide(),b.preventDefault()}}).on("keydown",function(a){a.preventDefault();var b=c.element.find(".vakata-contextmenu-shortcut-"+a.which).parent();b.parent().not(".vakata-context-disabled")&&b.click()}),a(i).on("mousedown.vakata.jstree",function(b){c.is_visible&&c.element[0]!==b.target&&!a.contains(c.element[0],b.target)&&a.vakata.context.hide()}).on("context_show.vakata.jstree",function(a,d){c.element.find("li:has(ul)").children("a").addClass("vakata-context-parent"),b&&c.element.addClass("vakata-context-rtl").css("direction","rtl"),c.element.find("ul").hide().end()})})}(a),a.jstree.defaults.dnd={copy:!0,open_timeout:500,is_draggable:!0,check_while_dragging:!0,always_copy:!1,inside_pos:0,drag_selection:!0,touch:!0,large_drop_target:!1,large_drag_target:!1,use_html5:!1};var k,l;a.jstree.plugins.dnd=function(b,c){this.init=function(a,b){c.init.call(this,a,b),this.settings.dnd.use_html5=this.settings.dnd.use_html5&&"draggable"in i.createElement("span")},this.bind=function(){c.bind.call(this),this.element.on(this.settings.dnd.use_html5?"dragstart.jstree":"mousedown.jstree touchstart.jstree",this.settings.dnd.large_drag_target?".jstree-node":".jstree-anchor",a.proxy(function(b){if(this.settings.dnd.large_drag_target&&a(b.target).closest(".jstree-node")[0]!==b.currentTarget)return!0;if("touchstart"===b.type&&(!this.settings.dnd.touch||"selected"===this.settings.dnd.touch&&!a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").hasClass("jstree-clicked")))return!0;var c=this.get_node(b.target),d=this.is_selected(c)&&this.settings.dnd.drag_selection?this.get_top_selected().length:1,e=d>1?d+" "+this.get_string("nodes"):this.get_text(b.currentTarget);if(this.settings.core.force_text&&(e=a.vakata.html.escape(e)),c&&c.id&&c.id!==a.jstree.root&&(1===b.which||"touchstart"===b.type||"dragstart"===b.type)&&(this.settings.dnd.is_draggable===!0||a.isFunction(this.settings.dnd.is_draggable)&&this.settings.dnd.is_draggable.call(this,d>1?this.get_top_selected(!0):[c],b))){if(k={jstree:!0,origin:this,obj:this.get_node(c,!0),nodes:d>1?this.get_top_selected():[c.id]},l=b.currentTarget,!this.settings.dnd.use_html5)return this.element.trigger("mousedown.jstree"),a.vakata.dnd.start(b,k,'
        '+e+'
        ');a.vakata.dnd._trigger("start",b,{helper:a(),element:l,data:k})}},this)),this.settings.dnd.use_html5&&this.element.on("dragover.jstree",function(b){return b.preventDefault(),a.vakata.dnd._trigger("move",b,{helper:a(),element:l,data:k}),!1}).on("drop.jstree",a.proxy(function(b){return b.preventDefault(),a.vakata.dnd._trigger("stop",b,{helper:a(),element:l,data:k}),!1},this))},this.redraw_node=function(a,b,d,e){if(a=c.redraw_node.apply(this,arguments),a&&this.settings.dnd.use_html5)if(this.settings.dnd.large_drag_target)a.setAttribute("draggable",!0);else{var f,g,h=null;for(f=0,g=a.childNodes.length;g>f;f++)if(a.childNodes[f]&&a.childNodes[f].className&&-1!==a.childNodes[f].className.indexOf("jstree-anchor")){h=a.childNodes[f];break}h&&h.setAttribute("draggable",!0)}return a}},a(function(){var c=!1,d=!1,e=!1,f=!1,g=a('
         
        ').hide();a(i).on("dragover.vakata.jstree",function(b){l&&a.vakata.dnd._trigger("move",b,{helper:a(),element:l,data:k})}).on("drop.vakata.jstree",function(b){l&&(a.vakata.dnd._trigger("stop",b,{helper:a(),element:l,data:k}),l=null,k=null)}).on("dnd_start.vakata.jstree",function(a,b){c=!1,e=!1,b&&b.data&&b.data.jstree&&g.appendTo(i.body)}).on("dnd_move.vakata.jstree",function(h,i){var j=i.event.target!==e.target;if(f&&(!i.event||"dragover"!==i.event.type||j)&&clearTimeout(f),i&&i.data&&i.data.jstree&&(!i.event.target.id||"jstree-marker"!==i.event.target.id)){e=i.event;var k=a.jstree.reference(i.event.target),l=!1,m=!1,n=!1,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E;if(k&&k._data&&k._data.dnd)if(g.attr("class","jstree-"+k.get_theme()+(k.settings.core.themes.responsive?" jstree-dnd-responsive":"")),D=i.data.origin&&(i.data.origin.settings.dnd.always_copy||i.data.origin.settings.dnd.copy&&(i.event.metaKey||i.event.ctrlKey)),i.helper.children().attr("class","jstree-"+k.get_theme()+" jstree-"+k.get_theme()+"-"+k.get_theme_variant()+" "+(k.settings.core.themes.responsive?" jstree-dnd-responsive":"")).find(".jstree-copy").first()[D?"show":"hide"](),i.event.target!==k.element[0]&&i.event.target!==k.get_container_ul()[0]||0!==k.get_container_ul().children().length){if(l=k.settings.dnd.large_drop_target?a(i.event.target).closest(".jstree-node").children(".jstree-anchor"):a(i.event.target).closest(".jstree-anchor"),l&&l.length&&l.parent().is(".jstree-closed, .jstree-open, .jstree-leaf")&&(m=l.offset(),n=(i.event.pageY!==b?i.event.pageY:i.event.originalEvent.pageY)-m.top,r=l.outerHeight(),u=r/3>n?["b","i","a"]:n>r-r/3?["a","i","b"]:n>r/2?["i","a","b"]:["i","b","a"],a.each(u,function(b,e){switch(e){case"b":p=m.left-6,q=m.top,s=k.get_parent(l),t=l.parent().index();break;case"i":B=k.settings.dnd.inside_pos,C=k.get_node(l.parent()),p=m.left-2,q=m.top+r/2+1,s=C.id,t="first"===B?0:"last"===B?C.children.length:Math.min(B,C.children.length);break;case"a":p=m.left-6,q=m.top+r,s=k.get_parent(l),t=l.parent().index()+1}for(v=!0,w=0,x=i.data.nodes.length;x>w;w++)if(y=i.data.origin&&(i.data.origin.settings.dnd.always_copy||i.data.origin.settings.dnd.copy&&(i.event.metaKey||i.event.ctrlKey))?"copy_node":"move_node",z=t,"move_node"===y&&"a"===e&&i.data.origin&&i.data.origin===k&&s===k.get_parent(i.data.nodes[w])&&(A=k.get_node(s),z>a.inArray(i.data.nodes[w],A.children)&&(z-=1)),v=v&&(k&&k.settings&&k.settings.dnd&&k.settings.dnd.check_while_dragging===!1||k.check(y,i.data.origin&&i.data.origin!==k?i.data.origin.get_node(i.data.nodes[w]):i.data.nodes[w],s,z,{dnd:!0,ref:k.get_node(l.parent()),pos:e,origin:i.data.origin,is_multi:i.data.origin&&i.data.origin!==k,is_foreign:!i.data.origin})),!v){k&&k.last_error&&(d=k.last_error());break}return"i"===e&&l.parent().is(".jstree-closed")&&k.settings.dnd.open_timeout&&(!i.event||"dragover"!==i.event.type||j)&&(f&&clearTimeout(f),f=setTimeout(function(a,b){return function(){a.open_node(b)}}(k,l),k.settings.dnd.open_timeout)),v?(E=k.get_node(s,!0),E.hasClass(".jstree-dnd-parent")||(a(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),E.addClass("jstree-dnd-parent")),c={ins:k,par:s,pos:"i"!==e||"last"!==B||0!==t||k.is_loaded(C)?t:"last"},g.css({left:p+"px",top:q+"px"}).show(),i.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),i.event.originalEvent&&i.event.originalEvent.dataTransfer&&(i.event.originalEvent.dataTransfer.dropEffect=D?"copy":"move"),d={},u=!0,!1):void 0}),u===!0))return}else{for(v=!0,w=0,x=i.data.nodes.length;x>w;w++)if(v=v&&k.check(i.data.origin&&(i.data.origin.settings.dnd.always_copy||i.data.origin.settings.dnd.copy&&(i.event.metaKey||i.event.ctrlKey))?"copy_node":"move_node",i.data.origin&&i.data.origin!==k?i.data.origin.get_node(i.data.nodes[w]):i.data.nodes[w],a.jstree.root,"last",{dnd:!0,ref:k.get_node(a.jstree.root),pos:"i",origin:i.data.origin,is_multi:i.data.origin&&i.data.origin!==k,is_foreign:!i.data.origin}),!v)break;if(v)return c={ins:k,par:a.jstree.root,pos:"last"},g.hide(),i.helper.find(".jstree-icon").first().removeClass("jstree-er").addClass("jstree-ok"),void(i.event.originalEvent&&i.event.originalEvent.dataTransfer&&(i.event.originalEvent.dataTransfer.dropEffect=D?"copy":"move"))}a(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),c=!1,i.helper.find(".jstree-icon").removeClass("jstree-ok").addClass("jstree-er"),i.event.originalEvent&&i.event.originalEvent.dataTransfer,g.hide()}}).on("dnd_scroll.vakata.jstree",function(a,b){b&&b.data&&b.data.jstree&&(g.hide(),c=!1,e=!1,b.helper.find(".jstree-icon").first().removeClass("jstree-ok").addClass("jstree-er"))}).on("dnd_stop.vakata.jstree",function(b,h){if(a(".jstree-dnd-parent").removeClass("jstree-dnd-parent"),f&&clearTimeout(f),h&&h.data&&h.data.jstree){g.hide().detach();var i,j,k=[];if(c){for(i=0,j=h.data.nodes.length;j>i;i++)k[i]=h.data.origin?h.data.origin.get_node(h.data.nodes[i]):h.data.nodes[i];c.ins[h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(h.event.metaKey||h.event.ctrlKey))?"copy_node":"move_node"](k,c.par,c.pos,!1,!1,!1,h.data.origin)}else i=a(h.event.target).closest(".jstree"),i.length&&d&&d.error&&"check"===d.error&&(i=i.jstree(!0),i&&i.settings.core.error.call(this,d));e=!1,c=!1}}).on("keyup.jstree keydown.jstree",function(b,h){h=a.vakata.dnd._get(),h&&h.data&&h.data.jstree&&("keyup"===b.type&&27===b.which?(f&&clearTimeout(f),c=!1,d=!1,e=!1,f=!1,g.hide().detach(),a.vakata.dnd._clean()):(h.helper.find(".jstree-copy").first()[h.data.origin&&(h.data.origin.settings.dnd.always_copy||h.data.origin.settings.dnd.copy&&(b.metaKey||b.ctrlKey))?"show":"hide"](),e&&(e.metaKey=b.metaKey,e.ctrlKey=b.ctrlKey,a.vakata.dnd._trigger("move",e))))})}),function(a){a.vakata.html={div:a("
        "),escape:function(b){return a.vakata.html.div.text(b).html()},strip:function(b){return a.vakata.html.div.empty().append(a.parseHTML(b)).text()}};var c={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1};a.vakata.dnd={settings:{scroll_speed:10,scroll_proximity:20,helper_left:5,helper_top:10,threshold:5,threshold_touch:10},_trigger:function(c,d,e){e===b&&(e=a.vakata.dnd._get()),e.event=d,a(i).triggerHandler("dnd_"+c+".vakata",e)},_get:function(){return{data:c.data,element:c.element,helper:c.helper}},_clean:function(){c.helper&&c.helper.remove(),c.scroll_i&&(clearInterval(c.scroll_i),c.scroll_i=!1),c={element:!1,target:!1,is_down:!1,is_drag:!1,helper:!1,helper_w:0,data:!1,init_x:0,init_y:0,scroll_l:0,scroll_t:0,scroll_e:!1,scroll_i:!1,is_touch:!1},a(i).off("mousemove.vakata.jstree touchmove.vakata.jstree",a.vakata.dnd.drag),a(i).off("mouseup.vakata.jstree touchend.vakata.jstree",a.vakata.dnd.stop)},_scroll:function(b){if(!c.scroll_e||!c.scroll_l&&!c.scroll_t)return c.scroll_i&&(clearInterval(c.scroll_i),c.scroll_i=!1),!1;if(!c.scroll_i)return c.scroll_i=setInterval(a.vakata.dnd._scroll,100),!1;if(b===!0)return!1;var d=c.scroll_e.scrollTop(),e=c.scroll_e.scrollLeft();c.scroll_e.scrollTop(d+c.scroll_t*a.vakata.dnd.settings.scroll_speed),c.scroll_e.scrollLeft(e+c.scroll_l*a.vakata.dnd.settings.scroll_speed),(d!==c.scroll_e.scrollTop()||e!==c.scroll_e.scrollLeft())&&a.vakata.dnd._trigger("scroll",c.scroll_e)},start:function(b,d,e){"touchstart"===b.type&&b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,b.target=i.elementFromPoint(b.originalEvent.changedTouches[0].pageX-window.pageXOffset,b.originalEvent.changedTouches[0].pageY-window.pageYOffset)),c.is_drag&&a.vakata.dnd.stop({});try{b.currentTarget.unselectable="on",b.currentTarget.onselectstart=function(){return!1},b.currentTarget.style&&(b.currentTarget.style.touchAction="none",b.currentTarget.style.msTouchAction="none",b.currentTarget.style.MozUserSelect="none")}catch(f){}return c.init_x=b.pageX,c.init_y=b.pageY,c.data=d,c.is_down=!0,c.element=b.currentTarget,c.target=b.target,c.is_touch="touchstart"===b.type,e!==!1&&(c.helper=a("
        ").html(e).css({display:"block",margin:"0",padding:"0",position:"absolute",top:"-2000px",lineHeight:"16px",zIndex:"10000"})),a(i).on("mousemove.vakata.jstree touchmove.vakata.jstree",a.vakata.dnd.drag),a(i).on("mouseup.vakata.jstree touchend.vakata.jstree",a.vakata.dnd.stop),!1},drag:function(b){if("touchmove"===b.type&&b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,b.target=i.elementFromPoint(b.originalEvent.changedTouches[0].pageX-window.pageXOffset,b.originalEvent.changedTouches[0].pageY-window.pageYOffset)),c.is_down){if(!c.is_drag){if(!(Math.abs(b.pageX-c.init_x)>(c.is_touch?a.vakata.dnd.settings.threshold_touch:a.vakata.dnd.settings.threshold)||Math.abs(b.pageY-c.init_y)>(c.is_touch?a.vakata.dnd.settings.threshold_touch:a.vakata.dnd.settings.threshold)))return;c.helper&&(c.helper.appendTo(i.body),c.helper_w=c.helper.outerWidth()),c.is_drag=!0,a(c.target).one("click.vakata",!1),a.vakata.dnd._trigger("start",b)}var d=!1,e=!1,f=!1,g=!1,h=!1,j=!1,k=!1,l=!1,m=!1,n=!1;return c.scroll_t=0,c.scroll_l=0,c.scroll_e=!1,a(a(b.target).parentsUntil("body").addBack().get().reverse()).filter(function(){return/^auto|scroll$/.test(a(this).css("overflow"))&&(this.scrollHeight>this.offsetHeight||this.scrollWidth>this.offsetWidth)}).each(function(){var d=a(this),e=d.offset();return this.scrollHeight>this.offsetHeight&&(e.top+d.height()-b.pageYthis.offsetWidth&&(e.left+d.width()-b.pageXg&&b.pageY-kg&&g-(b.pageY-k)j&&b.pageX-lj&&j-(b.pageX-l)f&&(m=f-50),h&&n+c.helper_w>h&&(n=h-(c.helper_w+2)),c.helper.css({left:n+"px",top:m+"px"})),a.vakata.dnd._trigger("move",b),!1}},stop:function(b){if("touchend"===b.type&&b.originalEvent&&b.originalEvent.changedTouches&&b.originalEvent.changedTouches[0]&&(b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,b.target=i.elementFromPoint(b.originalEvent.changedTouches[0].pageX-window.pageXOffset,b.originalEvent.changedTouches[0].pageY-window.pageYOffset)),c.is_drag)b.target!==c.target&&a(c.target).off("click.vakata"),a.vakata.dnd._trigger("stop",b);else if("touchend"===b.type&&b.target===c.target){var d=setTimeout(function(){a(b.target).click()},100);a(b.target).one("click",function(){d&&clearTimeout(d)})}return a.vakata.dnd._clean(),!1}}}(a),a.jstree.defaults.massload=null,a.jstree.plugins.massload=function(b,c){this.init=function(a,b){this._data.massload={},c.init.call(this,a,b)},this._load_nodes=function(b,d,e,f){var g=this.settings.massload,h=JSON.stringify(b),i=[],j=this._model.data,k,l,m;if(!e){for(k=0,l=b.length;l>k;k++)(!j[b[k]]||!j[b[k]].state.loaded&&!j[b[k]].state.failed||f)&&(i.push(b[k]),m=this.get_node(b[k],!0),m&&m.length&&m.addClass("jstree-loading").attr("aria-busy",!0));if(this._data.massload={},i.length){if(a.isFunction(g))return g.call(this,i,a.proxy(function(a){var g,h;if(a)for(g in a)a.hasOwnProperty(g)&&(this._data.massload[g]=a[g]);for(g=0,h=b.length;h>g;g++)m=this.get_node(b[g],!0),m&&m.length&&m.removeClass("jstree-loading").attr("aria-busy",!1);c._load_nodes.call(this,b,d,e,f)},this));if("object"==typeof g&&g&&g.url)return g=a.extend(!0,{},g),a.isFunction(g.url)&&(g.url=g.url.call(this,i)),a.isFunction(g.data)&&(g.data=g.data.call(this,i)),a.ajax(g).done(a.proxy(function(a,g,h){var i,j;if(a)for(i in a)a.hasOwnProperty(i)&&(this._data.massload[i]=a[i]);for(i=0,j=b.length;j>i;i++)m=this.get_node(b[i],!0),m&&m.length&&m.removeClass("jstree-loading").attr("aria-busy",!1);c._load_nodes.call(this,b,d,e,f)},this)).fail(a.proxy(function(a){c._load_nodes.call(this,b,d,e,f)},this))}}return c._load_nodes.call(this,b,d,e,f)},this._load_node=function(b,d){var e=this._data.massload[b.id],f=null,g;return e?(f=this["string"==typeof e?"_append_html_data":"_append_json_data"](b,"string"==typeof e?a(a.parseHTML(e)).filter(function(){return 3!==this.nodeType}):e,function(a){d.call(this,a)}),g=this.get_node(b.id,!0),g&&g.length&&g.removeClass("jstree-loading").attr("aria-busy",!1),delete this._data.massload[b.id],f):c._load_node.call(this,b,d)}},a.jstree.defaults.search={ajax:!1,fuzzy:!1,case_sensitive:!1,show_only_matches:!1,show_only_matches_children:!1,close_opened_onclear:!0,search_leaves_only:!1,search_callback:!1},a.jstree.plugins.search=function(c,d){this.bind=function(){d.bind.call(this),this._data.search.str="",this._data.search.dom=a(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=!1,this._data.search.smc=!1,this._data.search.hdn=[],this.element.on("search.jstree",a.proxy(function(b,c){if(this._data.search.som&&c.res.length){var d=this._model.data,e,f,g=[],h,i;for(e=0,f=c.res.length;f>e;e++)if(d[c.res[e]]&&!d[c.res[e]].state.hidden&&(g.push(c.res[e]),g=g.concat(d[c.res[e]].parents),this._data.search.smc))for(h=0,i=d[c.res[e]].children_d.length;i>h;h++)d[d[c.res[e]].children_d[h]]&&!d[d[c.res[e]].children_d[h]].state.hidden&&g.push(d[c.res[e]].children_d[h]);g=a.vakata.array_remove_item(a.vakata.array_unique(g),a.jstree.root),this._data.search.hdn=this.hide_all(!0),this.show_node(g,!0),this.redraw(!0)}},this)).on("clear_search.jstree",a.proxy(function(a,b){this._data.search.som&&b.res.length&&(this.show_node(this._data.search.hdn,!0),this.redraw(!0))},this))},this.search=function(c,d,e,f,g,h){if(c===!1||""===a.trim(c.toString()))return this.clear_search();f=this.get_node(f),f=f&&f.id?f.id:null,c=c.toString();var i=this.settings.search,j=i.ajax?i.ajax:!1,k=this._model.data,l=null,m=[],n=[],o,p;if(this._data.search.res.length&&!g&&this.clear_search(),e===b&&(e=i.show_only_matches),h===b&&(h=i.show_only_matches_children),!d&&j!==!1)return a.isFunction(j)?j.call(this,c,a.proxy(function(b){b&&b.d&&(b=b.d),this._load_nodes(a.isArray(b)?a.vakata.array_unique(b):[],function(){this.search(c,!0,e,f,g,h)})},this),f):(j=a.extend({},j),j.data||(j.data={}),j.data.str=c,f&&(j.data.inside=f),this._data.search.lastRequest&&this._data.search.lastRequest.abort(),this._data.search.lastRequest=a.ajax(j).fail(a.proxy(function(){this._data.core.last_error={error:"ajax",plugin:"search",id:"search_01",reason:"Could not load search parents",data:JSON.stringify(j)},this.settings.core.error.call(this,this._data.core.last_error)},this)).done(a.proxy(function(b){b&&b.d&&(b=b.d),this._load_nodes(a.isArray(b)?a.vakata.array_unique(b):[],function(){this.search(c,!0,e,f,g,h)})},this)),this._data.search.lastRequest);if(g||(this._data.search.str=c,this._data.search.dom=a(),this._data.search.res=[],this._data.search.opn=[],this._data.search.som=e,this._data.search.smc=h),l=new a.vakata.search(c,!0,{caseSensitive:i.case_sensitive,fuzzy:i.fuzzy}),a.each(k[f?f:a.jstree.root].children_d,function(a,b){var d=k[b];d.text&&!d.state.hidden&&(!i.search_leaves_only||d.state.loaded&&0===d.children.length)&&(i.search_callback&&i.search_callback.call(this,c,d)||!i.search_callback&&l.search(d.text).isMatch)&&(m.push(b),n=n.concat(d.parents))}),m.length){for(n=a.vakata.array_unique(n),o=0,p=n.length;p>o;o++)n[o]!==a.jstree.root&&k[n[o]]&&this.open_node(n[o],null,0)===!0&&this._data.search.opn.push(n[o]);g?(this._data.search.dom=this._data.search.dom.add(a(this.element[0].querySelectorAll("#"+a.map(m,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #")))),this._data.search.res=a.vakata.array_unique(this._data.search.res.concat(m))):(this._data.search.dom=a(this.element[0].querySelectorAll("#"+a.map(m,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.res=m),this._data.search.dom.children(".jstree-anchor").addClass("jstree-search")}this.trigger("search",{nodes:this._data.search.dom,str:c,res:this._data.search.res,show_only_matches:e})},this.clear_search=function(){this.settings.search.close_opened_onclear&&this.close_node(this._data.search.opn,0),this.trigger("clear_search",{nodes:this._data.search.dom,str:this._data.search.str,res:this._data.search.res}),this._data.search.res.length&&(this._data.search.dom=a(this.element[0].querySelectorAll("#"+a.map(this._data.search.res,function(b){return-1!=="0123456789".indexOf(b[0])?"\\3"+b[0]+" "+b.substr(1).replace(a.jstree.idregex,"\\$&"):b.replace(a.jstree.idregex,"\\$&")}).join(", #"))),this._data.search.dom.children(".jstree-anchor").removeClass("jstree-search")),this._data.search.str="",this._data.search.res=[],this._data.search.opn=[],this._data.search.dom=a()},this.redraw_node=function(b,c,e,f){if(b=d.redraw_node.apply(this,arguments),b&&-1!==a.inArray(b.id,this._data.search.res)){var g,h,i=null;for(g=0,h=b.childNodes.length;h>g;g++)if(b.childNodes[g]&&b.childNodes[g].className&&-1!==b.childNodes[g].className.indexOf("jstree-anchor")){i=b.childNodes[g];break}i&&(i.className+=" jstree-search")}return b}},function(a){a.vakata.search=function(b,c,d){d=d||{},d=a.extend({},a.vakata.search.defaults,d),d.fuzzy!==!1&&(d.fuzzy=!0),b=d.caseSensitive?b:b.toLowerCase();var e=d.location,f=d.distance,g=d.threshold,h=b.length,i,j,k,l;return h>32&&(d.fuzzy=!1),d.fuzzy&&(i=1<c;c++)a[b.charAt(c)]=0;for(c=0;h>c;c++)a[b.charAt(c)]|=1<c;c++){o=0,p=q;while(p>o)k(c,e+p)<=m?o=p:q=p,p=Math.floor((q-o)/2+o);for(q=p,s=Math.max(1,e-p+1),t=Math.min(e+p,l)+h,u=new Array(t+2),u[t+1]=(1<=s;f--)if(v=j[a.charAt(f-1)],0===c?u[f]=(u[f+1]<<1|1)&v:u[f]=(u[f+1]<<1|1)&v|((r[f+1]|r[f])<<1|1)|r[f+1],u[f]&i&&(w=k(c,f-1),m>=w)){if(m=w,n=f-1,x.push(n),!(n>e))break;s=Math.max(1,2*e-n)}if(k(c+1,e)>m)break;r=u}return{isMatch:n>=0,score:w}},c===!0?{search:l}:l(c)},a.vakata.search.defaults={location:0,distance:100,threshold:.6,fuzzy:!1,caseSensitive:!1}}(a),a.jstree.defaults.sort=function(a,b){return this.get_text(a)>this.get_text(b)?1:-1},a.jstree.plugins.sort=function(b,c){this.bind=function(){c.bind.call(this),this.element.on("model.jstree",a.proxy(function(a,b){this.sort(b.parent,!0)},this)).on("rename_node.jstree create_node.jstree",a.proxy(function(a,b){this.sort(b.parent||b.node.parent,!1),this.redraw_node(b.parent||b.node.parent,!0)},this)).on("move_node.jstree copy_node.jstree",a.proxy(function(a,b){this.sort(b.parent,!1),this.redraw_node(b.parent,!0)},this))},this.sort=function(b,c){var d,e;if(b=this.get_node(b),b&&b.children&&b.children.length&&(b.children.sort(a.proxy(this.settings.sort,this)),c))for(d=0,e=b.children_d.length;e>d;d++)this.sort(b.children_d[d],!1)}};var m=!1;a.jstree.defaults.state={key:"jstree",events:"changed.jstree open_node.jstree close_node.jstree check_node.jstree uncheck_node.jstree",ttl:!1,filter:!1,preserve_loaded:!1},a.jstree.plugins.state=function(b,c){this.bind=function(){c.bind.call(this);var b=a.proxy(function(){this.element.on(this.settings.state.events,a.proxy(function(){m&&clearTimeout(m),m=setTimeout(a.proxy(function(){this.save_state()},this),100)},this)),this.trigger("state_ready")},this);this.element.on("ready.jstree",a.proxy(function(a,c){this.element.one("restore_state.jstree",b),this.restore_state()||b()},this))},this.save_state=function(){var b=this.get_state();this.settings.state.preserve_loaded||delete b.core.loaded;var c={state:b,ttl:this.settings.state.ttl,sec:+new Date};a.vakata.storage.set(this.settings.state.key,JSON.stringify(c))},this.restore_state=function(){var b=a.vakata.storage.get(this.settings.state.key);if(b)try{b=JSON.parse(b)}catch(c){return!1}return b&&b.ttl&&b.sec&&+new Date-b.sec>b.ttl?!1:(b&&b.state&&(b=b.state),b&&a.isFunction(this.settings.state.filter)&&(b=this.settings.state.filter.call(this,b)),b?(this.settings.state.preserve_loaded||delete b.core.loaded,this.element.one("set_state.jstree",function(c,d){d.instance.trigger("restore_state",{state:a.extend(!0,{},b)})}),this.set_state(b),!0):!1)},this.clear_state=function(){return a.vakata.storage.del(this.settings.state.key)}},function(a,b){a.vakata.storage={set:function(a,b){return window.localStorage.setItem(a,b)},get:function(a){return window.localStorage.getItem(a)},del:function(a){return window.localStorage.removeItem(a)}}}(a),a.jstree.defaults.types={"default":{}},a.jstree.defaults.types[a.jstree.root]={},a.jstree.plugins.types=function(c,d){this.init=function(c,e){var f,g;if(e&&e.types&&e.types["default"])for(f in e.types)if("default"!==f&&f!==a.jstree.root&&e.types.hasOwnProperty(f))for(g in e.types["default"])e.types["default"].hasOwnProperty(g)&&e.types[f][g]===b&&(e.types[f][g]=e.types["default"][g]);d.init.call(this,c,e),this._model.data[a.jstree.root].type=a.jstree.root},this.refresh=function(b,c){d.refresh.call(this,b,c),this._model.data[a.jstree.root].type=a.jstree.root},this.bind=function(){this.element.on("model.jstree",a.proxy(function(c,d){var e=this._model.data,f=d.nodes,g=this.settings.types,h,i,j="default",k;for(h=0,i=f.length;i>h;h++){if(j="default",e[f[h]].original&&e[f[h]].original.type&&g[e[f[h]].original.type]&&(j=e[f[h]].original.type),e[f[h]].data&&e[f[h]].data.jstree&&e[f[h]].data.jstree.type&&g[e[f[h]].data.jstree.type]&&(j=e[f[h]].data.jstree.type),e[f[h]].type=j,e[f[h]].icon===!0&&g[j].icon!==b&&(e[f[h]].icon=g[j].icon),g[j].li_attr!==b&&"object"==typeof g[j].li_attr)for(k in g[j].li_attr)if(g[j].li_attr.hasOwnProperty(k)){if("id"===k)continue;e[f[h]].li_attr[k]===b?e[f[h]].li_attr[k]=g[j].li_attr[k]:"class"===k&&(e[f[h]].li_attr["class"]=g[j].li_attr["class"]+" "+e[f[h]].li_attr["class"])}if(g[j].a_attr!==b&&"object"==typeof g[j].a_attr)for(k in g[j].a_attr)if(g[j].a_attr.hasOwnProperty(k)){if("id"===k)continue;e[f[h]].a_attr[k]===b?e[f[h]].a_attr[k]=g[j].a_attr[k]:"href"===k&&"#"===e[f[h]].a_attr[k]?e[f[h]].a_attr.href=g[j].a_attr.href:"class"===k&&(e[f[h]].a_attr["class"]=g[j].a_attr["class"]+" "+e[f[h]].a_attr["class"])}}e[a.jstree.root].type=a.jstree.root},this)),d.bind.call(this)},this.get_json=function(b,c,e){var f,g,h=this._model.data,i=c?a.extend(!0,{},c,{no_id:!1}):{},j=d.get_json.call(this,b,i,e);if(j===!1)return!1;if(a.isArray(j))for(f=0,g=j.length;g>f;f++)j[f].type=j[f].id&&h[j[f].id]&&h[j[f].id].type?h[j[f].id].type:"default",c&&c.no_id&&(delete j[f].id,j[f].li_attr&&j[f].li_attr.id&&delete j[f].li_attr.id,j[f].a_attr&&j[f].a_attr.id&&delete j[f].a_attr.id);else j.type=j.id&&h[j.id]&&h[j.id].type?h[j.id].type:"default",c&&c.no_id&&(j=this._delete_ids(j));return j},this._delete_ids=function(b){if(a.isArray(b)){for(var c=0,d=b.length;d>c;c++)b[c]=this._delete_ids(b[c]);return b}return delete b.id, b.li_attr&&b.li_attr.id&&delete b.li_attr.id,b.a_attr&&b.a_attr.id&&delete b.a_attr.id,b.children&&a.isArray(b.children)&&(b.children=this._delete_ids(b.children)),b},this.check=function(c,e,f,g,h){if(d.check.call(this,c,e,f,g,h)===!1)return!1;e=e&&e.id?e:this.get_node(e),f=f&&f.id?f:this.get_node(f);var i=e&&e.id?h&&h.origin?h.origin:a.jstree.reference(e.id):null,j,k,l,m;switch(i=i&&i._model&&i._model.data?i._model.data:null,c){case"create_node":case"move_node":case"copy_node":if("move_node"!==c||-1===a.inArray(e.id,f.children)){if(j=this.get_rules(f),j.max_children!==b&&-1!==j.max_children&&j.max_children===f.children.length)return this._data.core.last_error={error:"check",plugin:"types",id:"types_01",reason:"max_children prevents function: "+c,data:JSON.stringify({chk:c,pos:g,obj:e&&e.id?e.id:!1,par:f&&f.id?f.id:!1})},!1;if(j.valid_children!==b&&-1!==j.valid_children&&-1===a.inArray(e.type||"default",j.valid_children))return this._data.core.last_error={error:"check",plugin:"types",id:"types_02",reason:"valid_children prevents function: "+c,data:JSON.stringify({chk:c,pos:g,obj:e&&e.id?e.id:!1,par:f&&f.id?f.id:!1})},!1;if(i&&e.children_d&&e.parents){for(k=0,l=0,m=e.children_d.length;m>l;l++)k=Math.max(k,i[e.children_d[l]].parents.length);k=k-e.parents.length+1}(0>=k||k===b)&&(k=1);do{if(j.max_depth!==b&&-1!==j.max_depth&&j.max_depthg;g++)this.set_type(c[g],d);return!0}if(f=this.settings.types,c=this.get_node(c),!f[d]||!c)return!1;if(l=this.get_node(c,!0),l&&l.length&&(m=l.children(".jstree-anchor")),i=c.type,j=this.get_icon(c),c.type=d,(j===!0||!f[i]||f[i].icon!==b&&j===f[i].icon)&&this.set_icon(c,f[d].icon!==b?f[d].icon:!0),f[i]&&f[i].li_attr!==b&&"object"==typeof f[i].li_attr)for(k in f[i].li_attr)if(f[i].li_attr.hasOwnProperty(k)){if("id"===k)continue;"class"===k?(e[c.id].li_attr["class"]=(e[c.id].li_attr["class"]||"").replace(f[i].li_attr[k],""),l&&l.removeClass(f[i].li_attr[k])):e[c.id].li_attr[k]===f[i].li_attr[k]&&(e[c.id].li_attr[k]=null,l&&l.removeAttr(k))}if(f[i]&&f[i].a_attr!==b&&"object"==typeof f[i].a_attr)for(k in f[i].a_attr)if(f[i].a_attr.hasOwnProperty(k)){if("id"===k)continue;"class"===k?(e[c.id].a_attr["class"]=(e[c.id].a_attr["class"]||"").replace(f[i].a_attr[k],""),m&&m.removeClass(f[i].a_attr[k])):e[c.id].a_attr[k]===f[i].a_attr[k]&&("href"===k?(e[c.id].a_attr[k]="#",m&&m.attr("href","#")):(delete e[c.id].a_attr[k],m&&m.removeAttr(k)))}if(f[d].li_attr!==b&&"object"==typeof f[d].li_attr)for(k in f[d].li_attr)if(f[d].li_attr.hasOwnProperty(k)){if("id"===k)continue;e[c.id].li_attr[k]===b?(e[c.id].li_attr[k]=f[d].li_attr[k],l&&("class"===k?l.addClass(f[d].li_attr[k]):l.attr(k,f[d].li_attr[k]))):"class"===k&&(e[c.id].li_attr["class"]=f[d].li_attr[k]+" "+e[c.id].li_attr["class"],l&&l.addClass(f[d].li_attr[k]))}if(f[d].a_attr!==b&&"object"==typeof f[d].a_attr)for(k in f[d].a_attr)if(f[d].a_attr.hasOwnProperty(k)){if("id"===k)continue;e[c.id].a_attr[k]===b?(e[c.id].a_attr[k]=f[d].a_attr[k],m&&("class"===k?m.addClass(f[d].a_attr[k]):m.attr(k,f[d].a_attr[k]))):"href"===k&&"#"===e[c.id].a_attr[k]?(e[c.id].a_attr.href=f[d].a_attr.href,m&&m.attr("href",f[d].a_attr.href)):"class"===k&&(e[c.id].a_attr["class"]=f[d].a_attr["class"]+" "+e[c.id].a_attr["class"],m&&m.addClass(f[d].a_attr[k]))}return!0}},a.jstree.defaults.unique={case_sensitive:!1,trim_whitespace:!1,duplicate:function(a,b){return a+" ("+b+")"}},a.jstree.plugins.unique=function(c,d){this.check=function(b,c,e,f,g){if(d.check.call(this,b,c,e,f,g)===!1)return!1;if(c=c&&c.id?c:this.get_node(c),e=e&&e.id?e:this.get_node(e),!e||!e.children)return!0;var h="rename_node"===b?f:c.text,i=[],j=this.settings.unique.case_sensitive,k=this.settings.unique.trim_whitespace,l=this._model.data,m,n,o;for(m=0,n=e.children.length;n>m;m++)o=l[e.children[m]].text,j||(o=o.toLowerCase()),k&&(o=o.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),i.push(o);switch(j||(h=h.toLowerCase()),k&&(h=h.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),b){case"delete_node":return!0;case"rename_node":return o=c.text||"",j||(o=o.toLowerCase()),k&&(o=o.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),m=-1===a.inArray(h,i)||c.text&&o===h,m||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_01",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),m;case"create_node":return m=-1===a.inArray(h,i),m||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_04",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),m;case"copy_node":return m=-1===a.inArray(h,i),m||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_02",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),m;case"move_node":return m=c.parent===e.id&&(!g||!g.is_multi)||-1===a.inArray(h,i),m||(this._data.core.last_error={error:"check",plugin:"unique",id:"unique_03",reason:"Child with name "+h+" already exists. Preventing: "+b,data:JSON.stringify({chk:b,pos:f,obj:c&&c.id?c.id:!1,par:e&&e.id?e.id:!1})}),m}return!0},this.create_node=function(c,e,f,g,h){if(!e||e.text===b){if(null===c&&(c=a.jstree.root),c=this.get_node(c),!c)return d.create_node.call(this,c,e,f,g,h);if(f=f===b?"last":f,!f.toString().match(/^(before|after)$/)&&!h&&!this.is_loaded(c))return d.create_node.call(this,c,e,f,g,h);e||(e={});var i,j,k,l,m,n=this._model.data,o=this.settings.unique.case_sensitive,p=this.settings.unique.trim_whitespace,q=this.settings.unique.duplicate,r;for(j=i=this.get_string("New node"),k=[],l=0,m=c.children.length;m>l;l++)r=n[c.children[l]].text,o||(r=r.toLowerCase()),p&&(r=r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")),k.push(r);l=1,r=j,o||(r=r.toLowerCase()),p&&(r=r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""));while(-1!==a.inArray(r,k))j=q.call(this,i,++l).toString(),r=j,o||(r=r.toLowerCase()),p&&(r=r.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,""));e.text=j}return d.create_node.call(this,c,e,f,g,h)}};var n=i.createElement("DIV");if(n.setAttribute("unselectable","on"),n.setAttribute("role","presentation"),n.className="jstree-wholerow",n.innerHTML=" ",a.jstree.plugins.wholerow=function(b,c){this.bind=function(){c.bind.call(this),this.element.on("ready.jstree set_state.jstree",a.proxy(function(){this.hide_dots()},this)).on("init.jstree loading.jstree ready.jstree",a.proxy(function(){this.get_container_ul().addClass("jstree-wholerow-ul")},this)).on("deselect_all.jstree",a.proxy(function(a,b){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked")},this)).on("changed.jstree",a.proxy(function(a,b){this.element.find(".jstree-wholerow-clicked").removeClass("jstree-wholerow-clicked");var c=!1,d,e;for(d=0,e=b.selected.length;e>d;d++)c=this.get_node(b.selected[d],!0),c&&c.length&&c.children(".jstree-wholerow").addClass("jstree-wholerow-clicked")},this)).on("open_node.jstree",a.proxy(function(a,b){this.get_node(b.node,!0).find(".jstree-clicked").parent().children(".jstree-wholerow").addClass("jstree-wholerow-clicked")},this)).on("hover_node.jstree dehover_node.jstree",a.proxy(function(a,b){"hover_node"===a.type&&this.is_disabled(b.node)||this.get_node(b.node,!0).children(".jstree-wholerow")["hover_node"===a.type?"addClass":"removeClass"]("jstree-wholerow-hovered")},this)).on("contextmenu.jstree",".jstree-wholerow",a.proxy(function(b){if(this._data.contextmenu){b.preventDefault();var c=a.Event("contextmenu",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey,pageX:b.pageX,pageY:b.pageY});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c)}},this)).on("click.jstree",".jstree-wholerow",function(b){b.stopImmediatePropagation();var c=a.Event("click",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c).focus()}).on("dblclick.jstree",".jstree-wholerow",function(b){b.stopImmediatePropagation();var c=a.Event("dblclick",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c).focus()}).on("click.jstree",".jstree-leaf > .jstree-ocl",a.proxy(function(b){b.stopImmediatePropagation();var c=a.Event("click",{metaKey:b.metaKey,ctrlKey:b.ctrlKey,altKey:b.altKey,shiftKey:b.shiftKey});a(b.currentTarget).closest(".jstree-node").children(".jstree-anchor").first().trigger(c).focus()},this)).on("mouseover.jstree",".jstree-wholerow, .jstree-icon",a.proxy(function(a){return a.stopImmediatePropagation(),this.is_disabled(a.currentTarget)||this.hover_node(a.currentTarget),!1},this)).on("mouseleave.jstree",".jstree-node",a.proxy(function(a){this.dehover_node(a.currentTarget)},this))},this.teardown=function(){this.settings.wholerow&&this.element.find(".jstree-wholerow").remove(),c.teardown.call(this)},this.redraw_node=function(b,d,e,f){if(b=c.redraw_node.apply(this,arguments)){var g=n.cloneNode(!0);-1!==a.inArray(b.id,this._data.core.selected)&&(g.className+=" jstree-wholerow-clicked"),this._data.core.focused&&this._data.core.focused===b.id&&(g.className+=" jstree-wholerow-hovered"),b.insertBefore(g,b.childNodes[0])}return b}},window.customElements&&Object&&Object.create){var o=Object.create(HTMLElement.prototype);o.createdCallback=function(){var b={core:{},plugins:[]},c;for(c in a.jstree.plugins)a.jstree.plugins.hasOwnProperty(c)&&this.attributes[c]&&(b.plugins.push(c),this.getAttribute(c)&&JSON.parse(this.getAttribute(c))&&(b[c]=JSON.parse(this.getAttribute(c))));for(c in a.jstree.defaults.core)a.jstree.defaults.core.hasOwnProperty(c)&&this.attributes[c]&&(b.core[c]=JSON.parse(this.getAttribute(c))||this.getAttribute(c));a(this).jstree(b)};try{window.customElements.define("vakata-jstree",function(){},{prototype:o})}catch(p){}}}});assets/js/jstree/index.php000064400000000020147600374260011577 0ustar00 * Marc-Andre Lafortune - * MIT Licensed */ // The source code below is generated by babel as // Parsley is written in ECMAScript 6 // (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : typeof define === 'function' && define.amd ? define(['jquery'], factory) : (global = global || self, global.parsley = factory(global.jQuery)); }(this, (function ($) { 'use strict'; function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread(); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) { return arr; } } function _iterableToArray(iter) { if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") { return Array.from(iter); } } function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) { break; } } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) { _i["return"](); } } finally { if (_d) { throw _e; } } } return _arr; } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance"); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } var globalID = 1; var pastWarnings = {}; var Utils = { // Parsley DOM-API // returns object from dom attributes and values attr: function attr(element, namespace, obj) { var i; var attribute; var attributes; var regex = new RegExp('^' + namespace, 'i'); if ('undefined' === typeof obj) { obj = {}; } else { // Clear all own properties. This won't affect prototype's values for (i in obj) { if (obj.hasOwnProperty(i)) { delete obj[i]; } } } if (!element) { return obj; } attributes = element.attributes; for (i = attributes.length; i--;) { attribute = attributes[i]; if (attribute && attribute.specified && regex.test(attribute.name)) { obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value); } } return obj; }, checkAttr: function checkAttr(element, namespace, _checkAttr) { return element.hasAttribute(namespace + _checkAttr); }, setAttr: function setAttr(element, namespace, attr, value) { element.setAttribute(this.dasherize(namespace + attr), String(value)); }, getType: function getType(element) { return element.getAttribute('type') || 'text'; }, generateID: function generateID() { return '' + globalID++; }, /** Third party functions **/ deserializeValue: function deserializeValue(value) { var num; try { return value ? value == "true" || (value == "false" ? false : value == "null" ? null : !isNaN(num = Number(value)) ? num : /^[\[\{]/.test(value) ? JSON.parse(value) : value) : value; } catch (e) { return value; } }, // Zepto camelize function camelize: function camelize(str) { return str.replace(/-+(.)?/g, function (match, chr) { return chr ? chr.toUpperCase() : ''; }); }, // Zepto dasherize function dasherize: function dasherize(str) { return str.replace(/::/g, '/').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').replace(/([a-z\d])([A-Z])/g, '$1_$2').replace(/_/g, '-').toLowerCase(); }, warn: function warn() { var _window$console; if (window.console && 'function' === typeof window.console.warn) { (_window$console = window.console).warn.apply(_window$console, arguments); } }, warnOnce: function warnOnce(msg) { if (!pastWarnings[msg]) { pastWarnings[msg] = true; this.warn.apply(this, arguments); } }, _resetWarnings: function _resetWarnings() { pastWarnings = {}; }, trimString: function trimString(string) { return string.replace(/^\s+|\s+$/g, ''); }, parse: { date: function date(string) { var parsed = string.match(/^(\d{4,})-(\d\d)-(\d\d)$/); if (!parsed) { return null; } var _parsed$map = parsed.map(function (x) { return parseInt(x, 10); }), _parsed$map2 = _slicedToArray(_parsed$map, 4), _ = _parsed$map2[0], year = _parsed$map2[1], month = _parsed$map2[2], day = _parsed$map2[3]; var date = new Date(year, month - 1, day); if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day) { return null; } return date; }, string: function string(_string) { return _string; }, integer: function integer(string) { if (isNaN(string)) { return null; } return parseInt(string, 10); }, number: function number(string) { if (isNaN(string)) { throw null; } return parseFloat(string); }, 'boolean': function _boolean(string) { return !/^\s*false\s*$/i.test(string); }, object: function object(string) { return Utils.deserializeValue(string); }, regexp: function regexp(_regexp) { var flags = ''; // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern if (/^\/.*\/(?:[gimy]*)$/.test(_regexp)) { // Replace the regexp literal string with the first match group: ([gimy]*) // If no flag is present, this will be a blank string flags = _regexp.replace(/.*\/([gimy]*)$/, '$1'); // Again, replace the regexp literal string with the first match group: // everything excluding the opening and closing slashes and the flags _regexp = _regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1'); } else { // Anchor regexp: _regexp = '^' + _regexp + '$'; } return new RegExp(_regexp, flags); } }, parseRequirement: function parseRequirement(requirementType, string) { var converter = this.parse[requirementType || 'string']; if (!converter) { throw 'Unknown requirement specification: "' + requirementType + '"'; } var converted = converter(string); if (converted === null) { throw "Requirement is not a ".concat(requirementType, ": \"").concat(string, "\""); } return converted; }, namespaceEvents: function namespaceEvents(events, namespace) { events = this.trimString(events || '').split(/\s+/); if (!events[0]) { return ''; } return $.map(events, function (evt) { return "".concat(evt, ".").concat(namespace); }).join(' '); }, difference: function difference(array, remove) { // This is O(N^2), should be optimized var result = []; $.each(array, function (_, elem) { if (remove.indexOf(elem) == -1) { result.push(elem); } }); return result; }, // Alter-ego to native Promise.all, but for jQuery all: function all(promises) { // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements return $.when.apply($, _toConsumableArray(promises).concat([42, 42])); }, // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill objectCreate: Object.create || function () { var Object = function Object() {}; return function (prototype) { if (arguments.length > 1) { throw Error('Second argument not supported'); } if (_typeof(prototype) != 'object') { throw TypeError('Argument must be an object'); } Object.prototype = prototype; var result = new Object(); Object.prototype = null; return result; }; }(), _SubmitSelector: 'input[type="submit"], button:submit' }; // All these options could be overriden and specified directly in DOM using // `data-parsley-` default DOM-API // eg: `inputs` can be set in DOM using `data-parsley-inputs="input, textarea"` // eg: `data-parsley-stop-on-first-failing-constraint="false"` var Defaults = { // ### General // Default data-namespace for DOM API namespace: 'data-parsley-', // Supported inputs by default inputs: 'input, textarea, select', // Excluded inputs by default excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]', // Stop validating field on highest priority failing constraint priorityEnabled: true, // ### Field only // identifier used to group together inputs (e.g. radio buttons...) multiple: null, // identifier (or array of identifiers) used to validate only a select group of inputs group: null, // ### UI // Enable\Disable error messages uiEnabled: true, // Key events threshold before validation validationThreshold: 3, // Focused field on form validation error. 'first'|'last'|'none' focus: 'first', // event(s) that will trigger validation before first failure. eg: `input`... trigger: false, // event(s) that will trigger validation after first failure. triggerAfterFailure: 'input', // Class that would be added on every failing validation Parsley field errorClass: 'parsley-error', // Same for success validation successClass: 'parsley-success', // Return the `$element` that will receive these above success or error classes // Could also be (and given directly from DOM) a valid selector like `'#div'` classHandler: function classHandler(Field) {}, // Return the `$element` where errors will be appended // Could also be (and given directly from DOM) a valid selector like `'#div'` errorsContainer: function errorsContainer(Field) {}, // ul elem that would receive errors' list errorsWrapper: '
          ', // li elem that would receive error message errorTemplate: '
        • ' }; var Base = function Base() { this.__id__ = Utils.generateID(); }; Base.prototype = { asyncSupport: true, // Deprecated _pipeAccordingToValidationResult: function _pipeAccordingToValidationResult() { var _this = this; var pipe = function pipe() { var r = $.Deferred(); if (true !== _this.validationResult) { r.reject(); } return r.resolve().promise(); }; return [pipe, pipe]; }, actualizeOptions: function actualizeOptions() { Utils.attr(this.element, this.options.namespace, this.domOptions); if (this.parent && this.parent.actualizeOptions) { this.parent.actualizeOptions(); } return this; }, _resetOptions: function _resetOptions(initOptions) { this.domOptions = Utils.objectCreate(this.parent.options); this.options = Utils.objectCreate(this.domOptions); // Shallow copy of ownProperties of initOptions: for (var i in initOptions) { if (initOptions.hasOwnProperty(i)) { this.options[i] = initOptions[i]; } } this.actualizeOptions(); }, _listeners: null, // Register a callback for the given event name // Callback is called with context as the first argument and the `this` // The context is the current parsley instance, or window.Parsley if global // A return value of `false` will interrupt the calls on: function on(name, fn) { this._listeners = this._listeners || {}; var queue = this._listeners[name] = this._listeners[name] || []; queue.push(fn); return this; }, // Deprecated. Use `on` instead subscribe: function subscribe(name, fn) { $.listenTo(this, name.toLowerCase(), fn); }, // Unregister a callback (or all if none is given) for the given event name off: function off(name, fn) { var queue = this._listeners && this._listeners[name]; if (queue) { if (!fn) { delete this._listeners[name]; } else { for (var i = queue.length; i--;) { if (queue[i] === fn) { queue.splice(i, 1); } } } } return this; }, // Deprecated. Use `off` unsubscribe: function unsubscribe(name, fn) { $.unsubscribeTo(this, name.toLowerCase()); }, // Trigger an event of the given name // A return value of `false` interrupts the callback chain // Returns false if execution was interrupted trigger: function trigger(name, target, extraArg) { target = target || this; var queue = this._listeners && this._listeners[name]; var result; if (queue) { for (var i = queue.length; i--;) { result = queue[i].call(target, target, extraArg); if (result === false) { return result; } } } if (this.parent) { return this.parent.trigger(name, target, extraArg); } return true; }, asyncIsValid: function asyncIsValid(group, force) { Utils.warnOnce("asyncIsValid is deprecated; please use whenValid instead"); return this.whenValid({ group: group, force: force }); }, _findRelated: function _findRelated() { return this.options.multiple ? $(this.parent.element.querySelectorAll("[".concat(this.options.namespace, "multiple=\"").concat(this.options.multiple, "\"]"))) : this.$element; } }; var convertArrayRequirement = function convertArrayRequirement(string, length) { var m = string.match(/^\s*\[(.*)\]\s*$/); if (!m) { throw 'Requirement is not an array: "' + string + '"'; } var values = m[1].split(',').map(Utils.trimString); if (values.length !== length) { throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed'; } return values; }; var convertExtraOptionRequirement = function convertExtraOptionRequirement(requirementSpec, string, extraOptionReader) { var main = null; var extra = {}; for (var key in requirementSpec) { if (key) { var value = extraOptionReader(key); if ('string' === typeof value) { value = Utils.parseRequirement(requirementSpec[key], value); } extra[key] = value; } else { main = Utils.parseRequirement(requirementSpec[key], string); } } return [main, extra]; }; // A Validator needs to implement the methods `validate` and `parseRequirements` var Validator = function Validator(spec) { $.extend(true, this, spec); }; Validator.prototype = { // Returns `true` iff the given `value` is valid according the given requirements. validate: function validate(value, requirementFirstArg) { if (this.fn) { // Legacy style validator if (arguments.length > 3) { // If more args then value, requirement, instance... requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest } return this.fn(value, requirementFirstArg); } if (Array.isArray(value)) { if (!this.validateMultiple) { throw 'Validator `' + this.name + '` does not handle multiple values'; } return this.validateMultiple.apply(this, arguments); } else { var instance = arguments[arguments.length - 1]; if (this.validateDate && instance._isDateInput()) { arguments[0] = Utils.parse.date(arguments[0]); if (arguments[0] === null) { return false; } return this.validateDate.apply(this, arguments); } if (this.validateNumber) { if (!value) { // Builtin validators all accept empty strings, except `required` of course return true; } if (isNaN(value)) { return false; } arguments[0] = parseFloat(arguments[0]); return this.validateNumber.apply(this, arguments); } if (this.validateString) { return this.validateString.apply(this, arguments); } throw 'Validator `' + this.name + '` only handles multiple values'; } }, // Parses `requirements` into an array of arguments, // according to `this.requirementType` parseRequirements: function parseRequirements(requirements, extraOptionReader) { if ('string' !== typeof requirements) { // Assume requirement already parsed // but make sure we return an array return Array.isArray(requirements) ? requirements : [requirements]; } var type = this.requirementType; if (Array.isArray(type)) { var values = convertArrayRequirement(requirements, type.length); for (var i = 0; i < values.length; i++) { values[i] = Utils.parseRequirement(type[i], values[i]); } return values; } else if ($.isPlainObject(type)) { return convertExtraOptionRequirement(type, requirements, extraOptionReader); } else { return [Utils.parseRequirement(type, requirements)]; } }, // Defaults: requirementType: 'string', priority: 2 }; var ValidatorRegistry = function ValidatorRegistry(validators, catalog) { this.__class__ = 'ValidatorRegistry'; // Default Parsley locale is en this.locale = 'en'; this.init(validators || {}, catalog || {}); }; var typeTesters = { email: /^((([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-zA-Z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-zA-Z]|\d|-|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-zA-Z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))$/, // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers number: /^-?(\d*\.)?\d+(e[-+]?\d+)?$/i, integer: /^-?\d+$/, digits: /^\d+$/, alphanum: /^\w+$/i, date: { test: function test(value) { return Utils.parse.date(value) !== null; } }, url: new RegExp("^" + // protocol identifier "(?:(?:https?|ftp)://)?" + // ** mod: make scheme optional // user:pass authentication "(?:\\S+(?::\\S*)?@)?" + "(?:" + // IP address exclusion // private & local networks // "(?!(?:10|127)(?:\\.\\d{1,3}){3})" + // ** mod: allow local networks // "(?!(?:169\\.254|192\\.168)(?:\\.\\d{1,3}){2})" + // ** mod: allow local networks // "(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})" + // ** mod: allow local networks // IP address dotted notation octets // excludes loopback network 0.0.0.0 // excludes reserved space >= 224.0.0.0 // excludes network & broacast addresses // (first & last IP address of each class) "(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])" + "(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}" + "(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))" + "|" + // host name "(?:(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)" + // domain name "(?:\\.(?:[a-zA-Z\\u00a1-\\uffff0-9]-*)*[a-zA-Z\\u00a1-\\uffff0-9]+)*" + // TLD identifier "(?:\\.(?:[a-zA-Z\\u00a1-\\uffff]{2,}))" + ")" + // port number "(?::\\d{2,5})?" + // resource path "(?:/\\S*)?" + "$") }; typeTesters.range = typeTesters.number; // See http://stackoverflow.com/a/10454560/8279 var decimalPlaces = function decimalPlaces(num) { var match = ('' + num).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/); if (!match) { return 0; } return Math.max( 0, // Number of digits right of decimal point. (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation. match[2] ? +match[2] : 0) ); }; // parseArguments('number', ['1', '2']) => [1, 2] var parseArguments = function parseArguments(type, args) { return args.map(Utils.parse[type]); }; // operatorToValidator returns a validating function for an operator function, applied to the given type var operatorToValidator = function operatorToValidator(type, operator) { return function (value) { for (var _len = arguments.length, requirementsAndInput = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { requirementsAndInput[_key - 1] = arguments[_key]; } requirementsAndInput.pop(); // Get rid of `input` argument return operator.apply(void 0, [value].concat(_toConsumableArray(parseArguments(type, requirementsAndInput)))); }; }; var comparisonOperator = function comparisonOperator(operator) { return { validateDate: operatorToValidator('date', operator), validateNumber: operatorToValidator('number', operator), requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s) priority: 30 }; }; ValidatorRegistry.prototype = { init: function init(validators, catalog) { this.catalog = catalog; // Copy prototype's validators: this.validators = _extends({}, this.validators); for (var name in validators) { this.addValidator(name, validators[name].fn, validators[name].priority); } window.Parsley.trigger('parsley:validator:init'); }, // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n setLocale: function setLocale(locale) { if ('undefined' === typeof this.catalog[locale]) { throw new Error(locale + ' is not available in the catalog'); } this.locale = locale; return this; }, // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true` addCatalog: function addCatalog(locale, messages, set) { if ('object' === _typeof(messages)) { this.catalog[locale] = messages; } if (true === set) { return this.setLocale(locale); } return this; }, // Add a specific message for a given constraint in a given locale addMessage: function addMessage(locale, name, message) { if ('undefined' === typeof this.catalog[locale]) { this.catalog[locale] = {}; } this.catalog[locale][name] = message; return this; }, // Add messages for a given locale addMessages: function addMessages(locale, nameMessageObject) { for (var name in nameMessageObject) { this.addMessage(locale, name, nameMessageObject[name]); } return this; }, // Add a new validator // // addValidator('custom', { // requirementType: ['integer', 'integer'], // validateString: function(value, from, to) {}, // priority: 22, // messages: { // en: "Hey, that's no good", // fr: "Aye aye, pas bon du tout", // } // }) // // Old API was addValidator(name, function, priority) // addValidator: function addValidator(name, arg1, arg2) { if (this.validators[name]) { Utils.warn('Validator "' + name + '" is already defined.'); } else if (Defaults.hasOwnProperty(name)) { Utils.warn('"' + name + '" is a restricted keyword and is not a valid validator name.'); return; } return this._setValidator.apply(this, arguments); }, hasValidator: function hasValidator(name) { return !!this.validators[name]; }, updateValidator: function updateValidator(name, arg1, arg2) { if (!this.validators[name]) { Utils.warn('Validator "' + name + '" is not already defined.'); return this.addValidator.apply(this, arguments); } return this._setValidator.apply(this, arguments); }, removeValidator: function removeValidator(name) { if (!this.validators[name]) { Utils.warn('Validator "' + name + '" is not defined.'); } delete this.validators[name]; return this; }, _setValidator: function _setValidator(name, validator, priority) { if ('object' !== _typeof(validator)) { // Old style validator, with `fn` and `priority` validator = { fn: validator, priority: priority }; } if (!validator.validate) { validator = new Validator(validator); } this.validators[name] = validator; for (var locale in validator.messages || {}) { this.addMessage(locale, name, validator.messages[locale]); } return this; }, getErrorMessage: function getErrorMessage(constraint) { var message; // Type constraints are a bit different, we have to match their requirements too to find right error message if ('type' === constraint.name) { var typeMessages = this.catalog[this.locale][constraint.name] || {}; message = typeMessages[constraint.requirements]; } else { message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements); } return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage; }, // Kind of light `sprintf()` implementation formatMessage: function formatMessage(string, parameters) { if ('object' === _typeof(parameters)) { for (var i in parameters) { string = this.formatMessage(string, parameters[i]); } return string; } return 'string' === typeof string ? string.replace(/%s/i, parameters) : ''; }, // Here is the Parsley default validators list. // A validator is an object with the following key values: // - priority: an integer // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise // Alternatively, a validator can be a function that returns such an object // validators: { notblank: { validateString: function validateString(value) { return /\S/.test(value); }, priority: 2 }, required: { validateMultiple: function validateMultiple(values) { return values.length > 0; }, validateString: function validateString(value) { return /\S/.test(value); }, priority: 512 }, type: { validateString: function validateString(value, type) { var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, _ref$step = _ref.step, step = _ref$step === void 0 ? 'any' : _ref$step, _ref$base = _ref.base, base = _ref$base === void 0 ? 0 : _ref$base; var tester = typeTesters[type]; if (!tester) { throw new Error('validator type `' + type + '` is not supported'); } if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } if (!tester.test(value)) { return false; } if ('number' === type) { if (!/^any$/i.test(step || '')) { var nb = Number(value); var decimals = Math.max(decimalPlaces(step), decimalPlaces(base)); if (decimalPlaces(nb) > decimals) { // Value can't have too many decimals return false; // Be careful of rounding errors by using integers. } var toInt = function toInt(f) { return Math.round(f * Math.pow(10, decimals)); }; if ((toInt(nb) - toInt(base)) % toInt(step) != 0) { return false; } } } return true; }, requirementType: { '': 'string', step: 'string', base: 'number' }, priority: 256 }, pattern: { validateString: function validateString(value, regexp) { if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } return regexp.test(value); }, requirementType: 'regexp', priority: 64 }, minlength: { validateString: function validateString(value, requirement) { if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } return value.length >= requirement; }, requirementType: 'integer', priority: 30 }, maxlength: { validateString: function validateString(value, requirement) { return value.length <= requirement; }, requirementType: 'integer', priority: 30 }, length: { validateString: function validateString(value, min, max) { if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } return value.length >= min && value.length <= max; }, requirementType: ['integer', 'integer'], priority: 30 }, mincheck: { validateMultiple: function validateMultiple(values, requirement) { return values.length >= requirement; }, requirementType: 'integer', priority: 30 }, maxcheck: { validateMultiple: function validateMultiple(values, requirement) { return values.length <= requirement; }, requirementType: 'integer', priority: 30 }, check: { validateMultiple: function validateMultiple(values, min, max) { return values.length >= min && values.length <= max; }, requirementType: ['integer', 'integer'], priority: 30 }, min: comparisonOperator(function (value, requirement) { return value >= requirement; }), max: comparisonOperator(function (value, requirement) { return value <= requirement; }), range: comparisonOperator(function (value, min, max) { return value >= min && value <= max; }), equalto: { validateString: function validateString(value, refOrValue) { if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } var $reference = $(refOrValue); if ($reference.length) { return value === $reference.val(); } else { return value === refOrValue; } }, priority: 256 }, euvatin: { validateString: function validateString(value, refOrValue) { if (!value) { return true; // Builtin validators all accept empty strings, except `required` of course } var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/; return re.test(value); }, priority: 30 } } }; var UI = {}; var diffResults = function diffResults(newResult, oldResult, deep) { var added = []; var kept = []; for (var i = 0; i < newResult.length; i++) { var found = false; for (var j = 0; j < oldResult.length; j++) { if (newResult[i].assert.name === oldResult[j].assert.name) { found = true; break; } } if (found) { kept.push(newResult[i]); } else { added.push(newResult[i]); } } return { kept: kept, added: added, removed: !deep ? diffResults(oldResult, newResult, true).added : [] }; }; UI.Form = { _actualizeTriggers: function _actualizeTriggers() { var _this = this; this.$element.on('submit.Parsley', function (evt) { _this.onSubmitValidate(evt); }); this.$element.on('click.Parsley', Utils._SubmitSelector, function (evt) { _this.onSubmitButton(evt); }); // UI could be disabled if (false === this.options.uiEnabled) { return; } this.element.setAttribute('novalidate', ''); }, focus: function focus() { this._focusedField = null; if (true === this.validationResult || 'none' === this.options.focus) { return null; } for (var i = 0; i < this.fields.length; i++) { var field = this.fields[i]; if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) { this._focusedField = field.$element; if ('first' === this.options.focus) { break; } } } if (null === this._focusedField) { return null; } return this._focusedField.focus(); }, _destroyUI: function _destroyUI() { // Reset all event listeners this.$element.off('.Parsley'); } }; UI.Field = { _reflowUI: function _reflowUI() { this._buildUI(); // If this field doesn't have an active UI don't bother doing something if (!this._ui) { return; // Diff between two validation results } var diff = diffResults(this.validationResult, this._ui.lastValidationResult); // Then store current validation result for next reflow this._ui.lastValidationResult = this.validationResult; // Handle valid / invalid / none field class this._manageStatusClass(); // Add, remove, updated errors messages this._manageErrorsMessages(diff); // Triggers impl this._actualizeTriggers(); // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user if ((diff.kept.length || diff.added.length) && !this._failedOnce) { this._failedOnce = true; this._actualizeTriggers(); } }, // Returns an array of field's error message(s) getErrorsMessages: function getErrorsMessages() { // No error message, field is valid if (true === this.validationResult) { return []; } var messages = []; for (var i = 0; i < this.validationResult.length; i++) { messages.push(this.validationResult[i].errorMessage || this._getErrorMessage(this.validationResult[i].assert)); } return messages; }, // It's a goal of Parsley that this method is no longer required [#1073] addError: function addError(name) { var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, message = _ref.message, assert = _ref.assert, _ref$updateClass = _ref.updateClass, updateClass = _ref$updateClass === void 0 ? true : _ref$updateClass; this._buildUI(); this._addError(name, { message: message, assert: assert }); if (updateClass) { this._errorClass(); } }, // It's a goal of Parsley that this method is no longer required [#1073] updateError: function updateError(name) { var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, message = _ref2.message, assert = _ref2.assert, _ref2$updateClass = _ref2.updateClass, updateClass = _ref2$updateClass === void 0 ? true : _ref2$updateClass; this._buildUI(); this._updateError(name, { message: message, assert: assert }); if (updateClass) { this._errorClass(); } }, // It's a goal of Parsley that this method is no longer required [#1073] removeError: function removeError(name) { var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref3$updateClass = _ref3.updateClass, updateClass = _ref3$updateClass === void 0 ? true : _ref3$updateClass; this._buildUI(); this._removeError(name); // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult // but highly improbable cuz' manually removing a well Parsley handled error makes no sense. if (updateClass) { this._manageStatusClass(); } }, _manageStatusClass: function _manageStatusClass() { if (this.hasConstraints() && this.needsValidation() && true === this.validationResult) { this._successClass(); } else if (this.validationResult.length > 0) { this._errorClass(); } else { this._resetClass(); } }, _manageErrorsMessages: function _manageErrorsMessages(diff) { if ('undefined' !== typeof this.options.errorsMessagesDisabled) { return; // Case where we have errorMessage option that configure an unique field error message, regardless failing validators } if ('undefined' !== typeof this.options.errorMessage) { if (diff.added.length || diff.kept.length) { this._insertErrorWrapper(); if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length) { this._ui.$errorsWrapper.append($(this.options.errorTemplate).addClass('parsley-custom-error-message')); } this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId); return this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').find('.parsley-custom-error-message').html(this.options.errorMessage); } this._ui.$errorClassHandler.removeAttr('aria-describedby'); return this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-custom-error-message').remove(); } // Show, hide, update failing constraints messages for (var i = 0; i < diff.removed.length; i++) { this._removeError(diff.removed[i].assert.name); } for (i = 0; i < diff.added.length; i++) { this._addError(diff.added[i].assert.name, { message: diff.added[i].errorMessage, assert: diff.added[i].assert }); } for (i = 0; i < diff.kept.length; i++) { this._updateError(diff.kept[i].assert.name, { message: diff.kept[i].errorMessage, assert: diff.kept[i].assert }); } }, _addError: function _addError(name, _ref4) { var message = _ref4.message, assert = _ref4.assert; this._insertErrorWrapper(); this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId); this._ui.$errorsWrapper.addClass('filled').attr('aria-hidden', 'false').append($(this.options.errorTemplate).addClass('parsley-' + name).html(message || this._getErrorMessage(assert))); }, _updateError: function _updateError(name, _ref5) { var message = _ref5.message, assert = _ref5.assert; this._ui.$errorsWrapper.addClass('filled').find('.parsley-' + name).html(message || this._getErrorMessage(assert)); }, _removeError: function _removeError(name) { this._ui.$errorClassHandler.removeAttr('aria-describedby'); this._ui.$errorsWrapper.removeClass('filled').attr('aria-hidden', 'true').find('.parsley-' + name).remove(); }, _getErrorMessage: function _getErrorMessage(constraint) { var customConstraintErrorMessage = constraint.name + 'Message'; if ('undefined' !== typeof this.options[customConstraintErrorMessage]) { return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements); } return window.Parsley.getErrorMessage(constraint); }, _buildUI: function _buildUI() { // UI could be already built or disabled if (this._ui || false === this.options.uiEnabled) { return; } var _ui = {}; // Give field its Parsley id in DOM this.element.setAttribute(this.options.namespace + 'id', this.__id__); /** Generate important UI elements and store them in this **/ // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes _ui.$errorClassHandler = this._manageClassHandler(); // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__); _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId); // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly _ui.lastValidationResult = []; _ui.validationInformationVisible = false; // Store it in this for later this._ui = _ui; }, // Determine which element will have `parsley-error` and `parsley-success` classes _manageClassHandler: function _manageClassHandler() { // Class handled could also be determined by function given in Parsley options if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length) { return $(this.options.classHandler); // Class handled could also be determined by function given in Parsley options } var $handlerFunction = this.options.classHandler; // It might also be the function name of a global function if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler]) { $handlerFunction = window[this.options.classHandler]; } if ('function' === typeof $handlerFunction) { var $handler = $handlerFunction.call(this, this); // If this function returned a valid existing DOM element, go for it if ('undefined' !== typeof $handler && $handler.length) { return $handler; } } else if ('object' === _typeof($handlerFunction) && $handlerFunction instanceof jQuery && $handlerFunction.length) { return $handlerFunction; } else if ($handlerFunction) { Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function'); } return this._inputHolder(); }, _inputHolder: function _inputHolder() { // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container if (!this.options.multiple || this.element.nodeName === 'SELECT') { return this.$element; // But if multiple element (radio, checkbox), that would be their parent } return this.$element.parent(); }, _insertErrorWrapper: function _insertErrorWrapper() { var $errorsContainer = this.options.errorsContainer; // Nothing to do if already inserted if (0 !== this._ui.$errorsWrapper.parent().length) { return this._ui.$errorsWrapper.parent(); } if ('string' === typeof $errorsContainer) { if ($($errorsContainer).length) { return $($errorsContainer).append(this._ui.$errorsWrapper); } else if ('function' === typeof window[$errorsContainer]) { $errorsContainer = window[$errorsContainer]; } else { Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function'); } } if ('function' === typeof $errorsContainer) { $errorsContainer = $errorsContainer.call(this, this); } if ('object' === _typeof($errorsContainer) && $errorsContainer.length) { return $errorsContainer.append(this._ui.$errorsWrapper); } return this._inputHolder().after(this._ui.$errorsWrapper); }, _actualizeTriggers: function _actualizeTriggers() { var _this2 = this; var $toBind = this._findRelated(); var trigger; // Remove Parsley events already bound on this field $toBind.off('.Parsley'); if (this._failedOnce) { $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), function () { _this2._validateIfNeeded(); }); } else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) { $toBind.on(trigger, function (event) { _this2._validateIfNeeded(event); }); } }, _validateIfNeeded: function _validateIfNeeded(event) { var _this3 = this; // For keyup, keypress, keydown, input... events that could be a little bit obstrusive // do not validate if val length < min threshold on first validation. Once field have been validated once and info // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change. if (event && /key|input/.test(event.type)) { if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold) { return; } } if (this.options.debounce) { window.clearTimeout(this._debounced); this._debounced = window.setTimeout(function () { return _this3.validate(); }, this.options.debounce); } else { this.validate(); } }, _resetUI: function _resetUI() { // Reset all event listeners this._failedOnce = false; this._actualizeTriggers(); // Nothing to do if UI never initialized for this field if ('undefined' === typeof this._ui) { return; // Reset all errors' li } this._ui.$errorsWrapper.removeClass('filled').children().remove(); // Reset validation class this._resetClass(); // Reset validation flags and last validation result this._ui.lastValidationResult = []; this._ui.validationInformationVisible = false; }, _destroyUI: function _destroyUI() { this._resetUI(); if ('undefined' !== typeof this._ui) { this._ui.$errorsWrapper.remove(); } delete this._ui; }, _successClass: function _successClass() { this._ui.validationInformationVisible = true; this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass); }, _errorClass: function _errorClass() { this._ui.validationInformationVisible = true; this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass); }, _resetClass: function _resetClass() { this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass); } }; var Form = function Form(element, domOptions, options) { this.__class__ = 'Form'; this.element = element; this.$element = $(element); this.domOptions = domOptions; this.options = options; this.parent = window.Parsley; this.fields = []; this.validationResult = null; }; var statusMapping = { pending: null, resolved: true, rejected: false }; Form.prototype = { onSubmitValidate: function onSubmitValidate(event) { var _this = this; // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior if (true === event.parsley) { return; // If we didn't come here through a submit button, use the first one in the form } var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0]; this._submitSource = null; this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true); if (submitSource && null !== submitSource.getAttribute('formnovalidate')) { return; } window.Parsley._remoteCache = {}; var promise = this.whenValidate({ event: event }); if ('resolved' === promise.state() && false !== this._trigger('submit')) { } else { // Rejected or pending: cancel this submit event.stopImmediatePropagation(); event.preventDefault(); if ('pending' === promise.state()) { promise.done(function () { _this._submit(submitSource); }); } } }, onSubmitButton: function onSubmitButton(event) { this._submitSource = event.currentTarget; }, // internal // _submit submits the form, this time without going through the validations. // Care must be taken to "fake" the actual submit button being clicked. _submit: function _submit(submitSource) { if (false === this._trigger('submit')) { return; // Add submit button's data } if (submitSource) { var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false); if (0 === $synthetic.length) { $synthetic = $('').appendTo(this.$element); } $synthetic.attr({ name: submitSource.getAttribute('name'), value: submitSource.getAttribute('value') }); } this.$element.trigger(_extends($.Event('submit'), { parsley: true })); }, // Performs validation on fields while triggering events. // @returns `true` if all validations succeeds, `false` // if a failure is immediately detected, or `null` // if dependant on a promise. // Consider using `whenValidate` instead. validate: function validate(options) { if (arguments.length >= 1 && !$.isPlainObject(options)) { Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.'); var _arguments = Array.prototype.slice.call(arguments), group = _arguments[0], force = _arguments[1], event = _arguments[2]; options = { group: group, force: force, event: event }; } return statusMapping[this.whenValidate(options).state()]; }, whenValidate: function whenValidate() { var _this2 = this, _Utils$all$done$fail$; var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, group = _ref.group, force = _ref.force, event = _ref.event; this.submitEvent = event; if (event) { this.submitEvent = _extends({}, event, { preventDefault: function preventDefault() { Utils.warnOnce("Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`"); _this2.validationResult = false; } }); } this.validationResult = true; // fire validate event to eventually modify things before every validation this._trigger('validate'); // Refresh form DOM options and form's fields that could have changed this._refreshFields(); var promises = this._withoutReactualizingFormOptions(function () { return $.map(_this2.fields, function (field) { return field.whenValidate({ force: force, group: group }); }); }); return (_Utils$all$done$fail$ = Utils.all(promises).done(function () { _this2._trigger('success'); }).fail(function () { _this2.validationResult = false; _this2.focus(); _this2._trigger('error'); }).always(function () { _this2._trigger('validated'); })).pipe.apply(_Utils$all$done$fail$, _toConsumableArray(this._pipeAccordingToValidationResult())); }, // Iterate over refreshed fields, and stop on first failure. // Returns `true` if all fields are valid, `false` if a failure is detected // or `null` if the result depends on an unresolved promise. // Prefer using `whenValid` instead. isValid: function isValid(options) { if (arguments.length >= 1 && !$.isPlainObject(options)) { Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.'); var _arguments2 = Array.prototype.slice.call(arguments), group = _arguments2[0], force = _arguments2[1]; options = { group: group, force: force }; } return statusMapping[this.whenValid(options).state()]; }, // Iterate over refreshed fields and validate them. // Returns a promise. // A validation that immediately fails will interrupt the validations. whenValid: function whenValid() { var _this3 = this; var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, group = _ref2.group, force = _ref2.force; this._refreshFields(); var promises = this._withoutReactualizingFormOptions(function () { return $.map(_this3.fields, function (field) { return field.whenValid({ group: group, force: force }); }); }); return Utils.all(promises); }, refresh: function refresh() { this._refreshFields(); return this; }, // Reset UI reset: function reset() { // Form case: emit a reset event for each field for (var i = 0; i < this.fields.length; i++) { this.fields[i].reset(); } this._trigger('reset'); }, // Destroy Parsley instance (+ UI) destroy: function destroy() { // Field case: emit destroy event to clean UI and then destroy stored instance this._destroyUI(); // Form case: destroy all its fields and then destroy stored instance for (var i = 0; i < this.fields.length; i++) { this.fields[i].destroy(); } this.$element.removeData('Parsley'); this._trigger('destroy'); }, _refreshFields: function _refreshFields() { return this.actualizeOptions()._bindFields(); }, _bindFields: function _bindFields() { var _this4 = this; var oldFields = this.fields; this.fields = []; this.fieldsMappedById = {}; this._withoutReactualizingFormOptions(function () { _this4.$element.find(_this4.options.inputs).not(_this4.options.excluded).not("[".concat(_this4.options.namespace, "excluded=true]")).each(function (_, element) { var fieldInstance = new window.Parsley.Factory(element, {}, _this4); // Only add valid and not excluded `Field` and `FieldMultiple` children if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) { var uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__; if ('undefined' === typeof _this4.fieldsMappedById[uniqueId]) { _this4.fieldsMappedById[uniqueId] = fieldInstance; _this4.fields.push(fieldInstance); } } }); $.each(Utils.difference(oldFields, _this4.fields), function (_, field) { field.reset(); }); }); return this; }, // Internal only. // Looping on a form's fields to do validation or similar // will trigger reactualizing options on all of them, which // in turn will reactualize the form's options. // To avoid calling actualizeOptions so many times on the form // for nothing, _withoutReactualizingFormOptions temporarily disables // the method actualizeOptions on this form while `fn` is called. _withoutReactualizingFormOptions: function _withoutReactualizingFormOptions(fn) { var oldActualizeOptions = this.actualizeOptions; this.actualizeOptions = function () { return this; }; var result = fn(); this.actualizeOptions = oldActualizeOptions; return result; }, // Internal only. // Shortcut to trigger an event // Returns true iff event is not interrupted and default not prevented. _trigger: function _trigger(eventName) { return this.trigger('form:' + eventName); } }; var Constraint = function Constraint(parsleyField, name, requirements, priority, isDomConstraint) { var validatorSpec = window.Parsley._validatorRegistry.validators[name]; var validator = new Validator(validatorSpec); priority = priority || parsleyField.options[name + 'Priority'] || validator.priority; isDomConstraint = true === isDomConstraint; _extends(this, { validator: validator, name: name, requirements: requirements, priority: priority, isDomConstraint: isDomConstraint }); this._parseRequirements(parsleyField.options); }; var capitalize = function capitalize(str) { var cap = str[0].toUpperCase(); return cap + str.slice(1); }; Constraint.prototype = { validate: function validate(value, instance) { var _this$validator; return (_this$validator = this.validator).validate.apply(_this$validator, [value].concat(_toConsumableArray(this.requirementList), [instance])); }, _parseRequirements: function _parseRequirements(options) { var _this = this; this.requirementList = this.validator.parseRequirements(this.requirements, function (key) { return options[_this.name + capitalize(key)]; }); } }; var Field = function Field(field, domOptions, options, parsleyFormInstance) { this.__class__ = 'Field'; this.element = field; this.$element = $(field); // Set parent if we have one if ('undefined' !== typeof parsleyFormInstance) { this.parent = parsleyFormInstance; } this.options = options; this.domOptions = domOptions; // Initialize some properties this.constraints = []; this.constraintsByName = {}; this.validationResult = true; // Bind constraints this._bindConstraints(); }; var statusMapping$1 = { pending: null, resolved: true, rejected: false }; Field.prototype = { // # Public API // Validate field and trigger some events for mainly `UI` // @returns `true`, an array of the validators that failed, or // `null` if validation is not finished. Prefer using whenValidate validate: function validate(options) { if (arguments.length >= 1 && !$.isPlainObject(options)) { Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.'); options = { options: options }; } var promise = this.whenValidate(options); if (!promise) { // If excluded with `group` option return true; } switch (promise.state()) { case 'pending': return null; case 'resolved': return true; case 'rejected': return this.validationResult; } }, // Validate field and trigger some events for mainly `UI` // @returns a promise that succeeds only when all validations do // or `undefined` if field is not in the given `group`. whenValidate: function whenValidate() { var _this$whenValid$alway, _this = this; var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, force = _ref.force, group = _ref.group; // do not validate a field if not the same as given validation group this.refresh(); if (group && !this._isInGroup(group)) { return; } this.value = this.getValue(); // Field Validate event. `this.value` could be altered for custom needs this._trigger('validate'); return (_this$whenValid$alway = this.whenValid({ force: force, value: this.value, _refreshed: true }).always(function () { _this._reflowUI(); }).done(function () { _this._trigger('success'); }).fail(function () { _this._trigger('error'); }).always(function () { _this._trigger('validated'); })).pipe.apply(_this$whenValid$alway, _toConsumableArray(this._pipeAccordingToValidationResult())); }, hasConstraints: function hasConstraints() { return 0 !== this.constraints.length; }, // An empty optional field does not need validation needsValidation: function needsValidation(value) { if ('undefined' === typeof value) { value = this.getValue(); // If a field is empty and not required, it is valid } // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty) { return false; } return true; }, _isInGroup: function _isInGroup(group) { if (Array.isArray(this.options.group)) { return -1 !== $.inArray(group, this.options.group); } return this.options.group === group; }, // Just validate field. Do not trigger any event. // Returns `true` iff all constraints pass, `false` if there are failures, // or `null` if the result can not be determined yet (depends on a promise) // See also `whenValid`. isValid: function isValid(options) { if (arguments.length >= 1 && !$.isPlainObject(options)) { Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.'); var _arguments = Array.prototype.slice.call(arguments), force = _arguments[0], value = _arguments[1]; options = { force: force, value: value }; } var promise = this.whenValid(options); if (!promise) { // Excluded via `group` return true; } return statusMapping$1[promise.state()]; }, // Just validate field. Do not trigger any event. // @returns a promise that succeeds only when all validations do // or `undefined` if the field is not in the given `group`. // The argument `force` will force validation of empty fields. // If a `value` is given, it will be validated instead of the value of the input. whenValid: function whenValid() { var _this2 = this; var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref2$force = _ref2.force, force = _ref2$force === void 0 ? false : _ref2$force, value = _ref2.value, group = _ref2.group, _refreshed = _ref2._refreshed; // Recompute options and rebind constraints to have latest changes if (!_refreshed) { this.refresh(); // do not validate a field if not the same as given validation group } if (group && !this._isInGroup(group)) { return; } this.validationResult = true; // A field without constraint is valid if (!this.hasConstraints()) { return $.when(); // Value could be passed as argument, needed to add more power to 'field:validate' } if ('undefined' === typeof value || null === value) { value = this.getValue(); } if (!this.needsValidation(value) && true !== force) { return $.when(); } var groupedConstraints = this._getGroupedConstraints(); var promises = []; $.each(groupedConstraints, function (_, constraints) { // Process one group of constraints at a time, we validate the constraints // and combine the promises together. var promise = Utils.all($.map(constraints, function (constraint) { return _this2._validateConstraint(value, constraint); })); promises.push(promise); if (promise.state() === 'rejected') { return false; // Interrupt processing if a group has already failed } }); return Utils.all(promises); }, // @returns a promise _validateConstraint: function _validateConstraint(value, constraint) { var _this3 = this; var result = constraint.validate(value, this); // Map false to a failed promise if (false === result) { result = $.Deferred().reject(); // Make sure we return a promise and that we record failures } return Utils.all([result]).fail(function (errorMessage) { if (!(_this3.validationResult instanceof Array)) { _this3.validationResult = []; } _this3.validationResult.push({ assert: constraint, errorMessage: 'string' === typeof errorMessage && errorMessage }); }); }, // @returns Parsley field computed value that could be overrided or configured in DOM getValue: function getValue() { var value; // Value could be overriden in DOM or with explicit options if ('function' === typeof this.options.value) { value = this.options.value(this); } else if ('undefined' !== typeof this.options.value) { value = this.options.value; } else { value = this.$element.val(); // Handle wrong DOM or configurations } if ('undefined' === typeof value || null === value) { return ''; } return this._handleWhitespace(value); }, // Reset UI reset: function reset() { this._resetUI(); return this._trigger('reset'); }, // Destroy Parsley instance (+ UI) destroy: function destroy() { // Field case: emit destroy event to clean UI and then destroy stored instance this._destroyUI(); this.$element.removeData('Parsley'); this.$element.removeData('FieldMultiple'); this._trigger('destroy'); }, // Actualize options and rebind constraints refresh: function refresh() { this._refreshConstraints(); return this; }, _refreshConstraints: function _refreshConstraints() { return this.actualizeOptions()._bindConstraints(); }, refreshConstraints: function refreshConstraints() { Utils.warnOnce("Parsley's refreshConstraints is deprecated. Please use refresh"); return this.refresh(); }, /** * Add a new constraint to a field * * @param {String} name * @param {Mixed} requirements optional * @param {Number} priority optional * @param {Boolean} isDomConstraint optional */ addConstraint: function addConstraint(name, requirements, priority, isDomConstraint) { if (window.Parsley._validatorRegistry.validators[name]) { var constraint = new Constraint(this, name, requirements, priority, isDomConstraint); // if constraint already exist, delete it and push new version if ('undefined' !== this.constraintsByName[constraint.name]) { this.removeConstraint(constraint.name); } this.constraints.push(constraint); this.constraintsByName[constraint.name] = constraint; } return this; }, // Remove a constraint removeConstraint: function removeConstraint(name) { for (var i = 0; i < this.constraints.length; i++) { if (name === this.constraints[i].name) { this.constraints.splice(i, 1); break; } } delete this.constraintsByName[name]; return this; }, // Update a constraint (Remove + re-add) updateConstraint: function updateConstraint(name, parameters, priority) { return this.removeConstraint(name).addConstraint(name, parameters, priority); }, // # Internals // Internal only. // Bind constraints from config + options + DOM _bindConstraints: function _bindConstraints() { var constraints = []; var constraintsByName = {}; // clean all existing DOM constraints to only keep javascript user constraints for (var i = 0; i < this.constraints.length; i++) { if (false === this.constraints[i].isDomConstraint) { constraints.push(this.constraints[i]); constraintsByName[this.constraints[i].name] = this.constraints[i]; } } this.constraints = constraints; this.constraintsByName = constraintsByName; // then re-add Parsley DOM-API constraints for (var name in this.options) { this.addConstraint(name, this.options[name], undefined, true); } // finally, bind special HTML5 constraints return this._bindHtml5Constraints(); }, // Internal only. // Bind specific HTML5 constraints to be HTML5 compliant _bindHtml5Constraints: function _bindHtml5Constraints() { // html5 required if (null !== this.element.getAttribute('required')) { this.addConstraint('required', true, undefined, true); // html5 pattern } if (null !== this.element.getAttribute('pattern')) { this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true); // range } var min = this.element.getAttribute('min'); var max = this.element.getAttribute('max'); if (null !== min && null !== max) { this.addConstraint('range', [min, max], undefined, true); // HTML5 min } else if (null !== min) { this.addConstraint('min', min, undefined, true); // HTML5 max } else if (null !== max) { this.addConstraint('max', max, undefined, true); // length } if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength')) { this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true); // HTML5 minlength } else if (null !== this.element.getAttribute('minlength')) { this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true); // HTML5 maxlength } else if (null !== this.element.getAttribute('maxlength')) { this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true); // html5 types } var type = Utils.getType(this.element); // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise if ('number' === type) { return this.addConstraint('type', ['number', { step: this.element.getAttribute('step') || '1', base: min || this.element.getAttribute('value') }], undefined, true); // Regular other HTML5 supported types } else if (/^(email|url|range|date)$/i.test(type)) { return this.addConstraint('type', type, undefined, true); } return this; }, // Internal only. // Field is required if have required constraint without `false` value _isRequired: function _isRequired() { if ('undefined' === typeof this.constraintsByName.required) { return false; } return false !== this.constraintsByName.required.requirements; }, // Internal only. // Shortcut to trigger an event _trigger: function _trigger(eventName) { return this.trigger('field:' + eventName); }, // Internal only // Handles whitespace in a value // Use `data-parsley-whitespace="squish"` to auto squish input value // Use `data-parsley-whitespace="trim"` to auto trim input value _handleWhitespace: function _handleWhitespace(value) { if (true === this.options.trimValue) { Utils.warnOnce('data-parsley-trim-value="true" is deprecated, please use data-parsley-whitespace="trim"'); } if ('squish' === this.options.whitespace) { value = value.replace(/\s{2,}/g, ' '); } if ('trim' === this.options.whitespace || 'squish' === this.options.whitespace || true === this.options.trimValue) { value = Utils.trimString(value); } return value; }, _isDateInput: function _isDateInput() { var c = this.constraintsByName.type; return c && c.requirements === 'date'; }, // Internal only. // Returns the constraints, grouped by descending priority. // The result is thus an array of arrays of constraints. _getGroupedConstraints: function _getGroupedConstraints() { if (false === this.options.priorityEnabled) { return [this.constraints]; } var groupedConstraints = []; var index = {}; // Create array unique of priorities for (var i = 0; i < this.constraints.length; i++) { var p = this.constraints[i].priority; if (!index[p]) { groupedConstraints.push(index[p] = []); } index[p].push(this.constraints[i]); } // Sort them by priority DESC groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; }); return groupedConstraints; } }; var Multiple = function Multiple() { this.__class__ = 'FieldMultiple'; }; Multiple.prototype = { // Add new `$element` sibling for multiple field addElement: function addElement($element) { this.$elements.push($element); return this; }, // See `Field._refreshConstraints()` _refreshConstraints: function _refreshConstraints() { var fieldConstraints; this.constraints = []; // Select multiple special treatment if (this.element.nodeName === 'SELECT') { this.actualizeOptions()._bindConstraints(); return this; } // Gather all constraints for each input in the multiple group for (var i = 0; i < this.$elements.length; i++) { // Check if element have not been dynamically removed since last binding if (!$('html').has(this.$elements[i]).length) { this.$elements.splice(i, 1); continue; } fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints; for (var j = 0; j < fieldConstraints.length; j++) { this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint); } } return this; }, // See `Field.getValue()` getValue: function getValue() { // Value could be overriden in DOM if ('function' === typeof this.options.value) { return this.options.value(this); } else if ('undefined' !== typeof this.options.value) { return this.options.value; // Radio input case } if (this.element.nodeName === 'INPUT') { var type = Utils.getType(this.element); if (type === 'radio') { return this._findRelated().filter(':checked').val() || ''; // checkbox input case } if (type === 'checkbox') { var values = []; this._findRelated().filter(':checked').each(function () { values.push($(this).val()); }); return values; } } // Select multiple case if (this.element.nodeName === 'SELECT' && null === this.$element.val()) { return []; // Default case that should never happen } return this.$element.val(); }, _init: function _init() { this.$elements = [this.$element]; return this; } }; var Factory = function Factory(element, options, parsleyFormInstance) { this.element = element; this.$element = $(element); // If the element has already been bound, returns its saved Parsley instance var savedparsleyFormInstance = this.$element.data('Parsley'); if (savedparsleyFormInstance) { // If the saved instance has been bound without a Form parent and there is one given in this call, add it if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) { savedparsleyFormInstance.parent = parsleyFormInstance; savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options); } if ('object' === _typeof(options)) { _extends(savedparsleyFormInstance.options, options); } return savedparsleyFormInstance; } // Parsley must be instantiated with a DOM element or jQuery $element if (!this.$element.length) { throw new Error('You must bind Parsley on an existing element.'); } if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__) { throw new Error('Parent instance must be a Form instance'); } this.parent = parsleyFormInstance || window.Parsley; return this.init(options); }; Factory.prototype = { init: function init(options) { this.__class__ = 'Parsley'; this.__version__ = '2.9.2'; this.__id__ = Utils.generateID(); // Pre-compute options this._resetOptions(options); // A Form instance is obviously a `
          ` element but also every node that is not an input and has the `data-parsley-validate` attribute if (this.element.nodeName === 'FORM' || Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)) { return this.bind('parsleyForm'); // Every other element is bound as a `Field` or `FieldMultiple` } return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField'); }, isMultiple: function isMultiple() { var type = Utils.getType(this.element); return type === 'radio' || type === 'checkbox' || this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple'); }, // Multiples fields are a real nightmare :( // Maybe some refactoring would be appreciated here... handleMultiple: function handleMultiple() { var _this = this; var name; var parsleyMultipleInstance; // Handle multiple name this.options.multiple = this.options.multiple || (name = this.element.getAttribute('name')) || this.element.getAttribute('id'); // Special select multiple input if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) { this.options.multiple = this.options.multiple || this.__id__; return this.bind('parsleyFieldMultiple'); // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it } else if (!this.options.multiple) { Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element); return this; } // Remove special chars this.options.multiple = this.options.multiple.replace(/(:|\.|\[|\]|\{|\}|\$)/g, ''); // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name if (name) { $('input[name="' + name + '"]').each(function (i, input) { var type = Utils.getType(input); if (type === 'radio' || type === 'checkbox') { input.setAttribute(_this.options.namespace + 'multiple', _this.options.multiple); } }); } // Check here if we don't already have a related multiple instance saved var $previouslyRelated = this._findRelated(); for (var i = 0; i < $previouslyRelated.length; i++) { parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley'); if ('undefined' !== typeof parsleyMultipleInstance) { if (!this.$element.data('FieldMultiple')) { parsleyMultipleInstance.addElement(this.$element); } break; } } // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')` // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance this.bind('parsleyField', true); return parsleyMultipleInstance || this.bind('parsleyFieldMultiple'); }, // Return proper `Form`, `Field` or `FieldMultiple` bind: function bind(type, doNotStore) { var parsleyInstance; switch (type) { case 'parsleyForm': parsleyInstance = $.extend(new Form(this.element, this.domOptions, this.options), new Base(), window.ParsleyExtend)._bindFields(); break; case 'parsleyField': parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Base(), window.ParsleyExtend); break; case 'parsleyFieldMultiple': parsleyInstance = $.extend(new Field(this.element, this.domOptions, this.options, this.parent), new Multiple(), new Base(), window.ParsleyExtend)._init(); break; default: throw new Error(type + 'is not a supported Parsley type'); } if (this.options.multiple) { Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple); } if ('undefined' !== typeof doNotStore) { this.$element.data('FieldMultiple', parsleyInstance); return parsleyInstance; } // Store the freshly bound instance in a DOM element for later access using jQuery `data()` this.$element.data('Parsley', parsleyInstance); // Tell the world we have a new Form or Field instance! parsleyInstance._actualizeTriggers(); parsleyInstance._trigger('init'); return parsleyInstance; } }; var vernums = $.fn.jquery.split('.'); if (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) { throw "The loaded version of jQuery is too old. Please upgrade to 1.8.x or better."; } if (!vernums.forEach) { Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim'); } // Inherit `on`, `off` & `trigger` to Parsley: var Parsley = _extends(new Base(), { element: document, $element: $(document), actualizeOptions: null, _resetOptions: null, Factory: Factory, version: '2.9.2' }); // Supplement Field and Form with Base // This way, the constructors will have access to those methods _extends(Field.prototype, UI.Field, Base.prototype); _extends(Form.prototype, UI.Form, Base.prototype); // Inherit actualizeOptions and _resetOptions: _extends(Factory.prototype, Base.prototype); // ### jQuery API // `$('.elem').parsley(options)` or `$('.elem').psly(options)` $.fn.parsley = $.fn.psly = function (options) { if (this.length > 1) { var instances = []; this.each(function () { instances.push($(this).parsley(options)); }); return instances; } // Return undefined if applied to non existing DOM element if (this.length == 0) { return; } return new Factory(this[0], options); }; // ### Field and Form extension // Ensure the extension is now defined if it wasn't previously if ('undefined' === typeof window.ParsleyExtend) { window.ParsleyExtend = {}; // ### Parsley config } // Inherit from ParsleyDefault, and copy over any existing values Parsley.options = _extends(Utils.objectCreate(Defaults), window.ParsleyConfig); window.ParsleyConfig = Parsley.options; // Old way of accessing global options // ### Globals window.Parsley = window.psly = Parsley; Parsley.Utils = Utils; window.ParsleyUtils = {}; $.each(Utils, function (key, value) { if ('function' === typeof value) { window.ParsleyUtils[key] = function () { Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.'); return Utils[key].apply(Utils, arguments); }; } }); // ### Define methods that forward to the registry, and deprecate all access except through window.Parsley var registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n); window.ParsleyValidator = {}; $.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) { window.Parsley[method] = function () { return registry[method].apply(registry, arguments); }; window.ParsleyValidator[method] = function () { var _window$Parsley; Utils.warnOnce("Accessing the method '".concat(method, "' through Validator is deprecated. Simply call 'window.Parsley.").concat(method, "(...)'")); return (_window$Parsley = window.Parsley)[method].apply(_window$Parsley, arguments); }; }); // ### UI // Deprecated global object window.Parsley.UI = UI; window.ParsleyUI = { removeError: function removeError(instance, name, doNotUpdateClass) { var updateClass = true !== doNotUpdateClass; Utils.warnOnce("Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method."); return instance.removeError(name, { updateClass: updateClass }); }, getErrorsMessages: function getErrorsMessages(instance) { Utils.warnOnce("Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly."); return instance.getErrorsMessages(); } }; $.each('addError updateError'.split(' '), function (i, method) { window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) { var updateClass = true !== doNotUpdateClass; Utils.warnOnce("Accessing UI is deprecated. Call '".concat(method, "' on the instance directly. Please comment in issue 1073 as to your need to call this method.")); return instance[method](name, { message: message, assert: assert, updateClass: updateClass }); }; }); // ### PARSLEY auto-binding // Prevent it by setting `ParsleyConfig.autoBind` to `false` if (false !== window.ParsleyConfig.autoBind) { $(function () { // Works only on `data-parsley-validate`. if ($('[data-parsley-validate]').length) { $('[data-parsley-validate]').parsley(); } }); } var o = $({}); var deprecated = function deprecated() { Utils.warnOnce("Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley"); }; // Returns an event handler that calls `fn` with the arguments it expects function adapt(fn, context) { // Store to allow unbinding if (!fn.parsleyAdaptedCallback) { fn.parsleyAdaptedCallback = function () { var args = Array.prototype.slice.call(arguments, 0); args.unshift(this); fn.apply(context || o, args); }; } return fn.parsleyAdaptedCallback; } var eventPrefix = 'parsley:'; // Converts 'parsley:form:validate' into 'form:validate' function eventName(name) { if (name.lastIndexOf(eventPrefix, 0) === 0) { return name.substr(eventPrefix.length); } return name; } // $.listen is deprecated. Use Parsley.on instead. $.listen = function (name, callback) { var context; deprecated(); if ('object' === _typeof(arguments[1]) && 'function' === typeof arguments[2]) { context = arguments[1]; callback = arguments[2]; } if ('function' !== typeof callback) { throw new Error('Wrong parameters'); } window.Parsley.on(eventName(name), adapt(callback, context)); }; $.listenTo = function (instance, name, fn) { deprecated(); if (!(instance instanceof Field) && !(instance instanceof Form)) { throw new Error('Must give Parsley instance'); } if ('string' !== typeof name || 'function' !== typeof fn) { throw new Error('Wrong parameters'); } instance.on(eventName(name), adapt(fn)); }; $.unsubscribe = function (name, fn) { deprecated(); if ('string' !== typeof name || 'function' !== typeof fn) { throw new Error('Wrong arguments'); } window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback); }; $.unsubscribeTo = function (instance, name) { deprecated(); if (!(instance instanceof Field) && !(instance instanceof Form)) { throw new Error('Must give Parsley instance'); } instance.off(eventName(name)); }; $.unsubscribeAll = function (name) { deprecated(); window.Parsley.off(eventName(name)); $('form,input,textarea,select').each(function () { var instance = $(this).data('Parsley'); if (instance) { instance.off(eventName(name)); } }); }; // $.emit is deprecated. Use jQuery events instead. $.emit = function (name, instance) { var _instance; deprecated(); var instanceGiven = instance instanceof Field || instance instanceof Form; var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1); args.unshift(eventName(name)); if (!instanceGiven) { instance = window.Parsley; } (_instance = instance).trigger.apply(_instance, _toConsumableArray(args)); }; $.extend(true, Parsley, { asyncValidators: { 'default': { fn: function fn(xhr) { // By default, only status 2xx are deemed successful. // Note: we use status instead of state() because responses with status 200 // but invalid messages (e.g. an empty body for content type set to JSON) will // result in state() === 'rejected'. return xhr.status >= 200 && xhr.status < 300; }, url: false }, reverse: { fn: function fn(xhr) { // If reverse option is set, a failing ajax request is considered successful return xhr.status < 200 || xhr.status >= 300; }, url: false } }, addAsyncValidator: function addAsyncValidator(name, fn, url, options) { Parsley.asyncValidators[name] = { fn: fn, url: url || false, options: options || {} }; return this; } }); Parsley.addValidator('remote', { requirementType: { '': 'string', 'validator': 'string', 'reverse': 'boolean', 'options': 'object' }, validateString: function validateString(value, url, options, instance) { var data = {}; var ajaxOptions; var csr; var validator = options.validator || (true === options.reverse ? 'reverse' : 'default'); if ('undefined' === typeof Parsley.asyncValidators[validator]) { throw new Error('Calling an undefined async validator: `' + validator + '`'); } url = Parsley.asyncValidators[validator].url || url; // Fill current value if (url.indexOf('{value}') > -1) { url = url.replace('{value}', encodeURIComponent(value)); } else { data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value; } // Merge options passed in from the function with the ones in the attribute var remoteOptions = $.extend(true, options.options || {}, Parsley.asyncValidators[validator].options); // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options` ajaxOptions = $.extend(true, {}, { url: url, data: data, type: 'GET' }, remoteOptions); // Generate store key based on ajax options instance.trigger('field:ajaxoptions', instance, ajaxOptions); csr = $.param(ajaxOptions); // Initialise querry cache if ('undefined' === typeof Parsley._remoteCache) { Parsley._remoteCache = {}; // Try to retrieve stored xhr } var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions); var handleXhr = function handleXhr() { var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options); if (!result) { // Map falsy results to rejected promise result = $.Deferred().reject(); } return $.when(result); }; return xhr.then(handleXhr, handleXhr); }, priority: -1 }); Parsley.on('form:submit', function () { Parsley._remoteCache = {}; }); Base.prototype.addAsyncValidator = function () { Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`'); return Parsley.addAsyncValidator.apply(Parsley, arguments); }; // This is included with the Parsley library itself, Parsley.addMessages('en', { defaultMessage: "This value seems to be invalid.", type: { email: "This value should be a valid email.", url: "This value should be a valid url.", number: "This value should be a valid number.", integer: "This value should be a valid integer.", digits: "This value should be digits.", alphanum: "This value should be alphanumeric." }, notblank: "This value should not be blank.", required: "This value is required.", pattern: "This value seems to be invalid.", min: "This value should be greater than or equal to %s.", max: "This value should be lower than or equal to %s.", range: "This value should be between %s and %s.", minlength: "This value is too short. It should have %s characters or more.", maxlength: "This value is too long. It should have %s characters or fewer.", length: "This value length is invalid. It should be between %s and %s characters long.", mincheck: "You must select at least %s choices.", maxcheck: "You must select %s choices or fewer.", check: "You must select between %s and %s choices.", equalto: "This value should be the same.", euvatin: "It's not a valid VAT Identification Number." }); Parsley.setLocale('en'); function InputEvent() { var _this = this; var globals = window || global; // Slightly odd way construct our object. This way methods are force bound. // Used to test for duplicate library. _extends(this, { // For browsers that do not support isTrusted, assumes event is native. isNativeEvent: function isNativeEvent(evt) { return evt.originalEvent && evt.originalEvent.isTrusted !== false; }, fakeInputEvent: function fakeInputEvent(evt) { if (_this.isNativeEvent(evt)) { $(evt.target).trigger('input'); } }, misbehaves: function misbehaves(evt) { if (_this.isNativeEvent(evt)) { _this.behavesOk(evt); $(document).on('change.inputevent', evt.data.selector, _this.fakeInputEvent); _this.fakeInputEvent(evt); } }, behavesOk: function behavesOk(evt) { if (_this.isNativeEvent(evt)) { $(document) // Simply unbinds the testing handler .off('input.inputevent', evt.data.selector, _this.behavesOk).off('change.inputevent', evt.data.selector, _this.misbehaves); } }, // Bind the testing handlers install: function install() { if (globals.inputEventPatched) { return; } globals.inputEventPatched = '0.0.3'; for (var _i = 0, _arr = ['select', 'input[type="checkbox"]', 'input[type="radio"]', 'input[type="file"]']; _i < _arr.length; _i++) { var selector = _arr[_i]; $(document).on('input.inputevent', selector, { selector: selector }, _this.behavesOk).on('change.inputevent', selector, { selector: selector }, _this.misbehaves); } }, uninstall: function uninstall() { delete globals.inputEventPatched; $(document).off('.inputevent'); } }); } var inputevent = new InputEvent(); inputevent.install(); return Parsley; }))); //# sourceMappingURL=parsley.js.mapassets/js/parsleyjs/parsley.js.map000064400000516211147600374260013306 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{"version":3,"file":"parsley.js","sources":["../src/parsley/utils.js","../src/parsley/defaults.js","../src/parsley/base.js","../src/parsley/validator.js","../src/parsley/validator_registry.js","../src/parsley/ui.js","../src/parsley/form.js","../src/parsley/constraint.js","../src/parsley/field.js","../src/parsley/multiple.js","../src/parsley/factory.js","../src/parsley/main.js","../src/parsley/pubsub.js","../src/parsley/remote.js","../src/i18n/en.js","../src/vendor/inputevent.js","../src/parsley.js"],"sourcesContent":["import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '
            ',\n\n // li elem that would receive error message\n errorTemplate: '
          • '\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n};\n\nexport default Base;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (!value) // Builtin validators all accept empty strings, except `required` of course\n return true;\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n },\n euvatin: {\n validateString: function (value, refOrValue) {\n if (!value) {\n return true; // Builtin validators all accept empty strings, except `required` of course\n }\n\n var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/;\n return re.test(value);\n },\n priority: 30,\n },\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .attr('aria-hidden', 'false')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .attr('aria-hidden', 'true')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .attr('aria-hidden', 'false')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .attr('aria-hidden', 'true')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .not(`[${this.options.namespace}excluded=true]`)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import Utils from './utils';\nimport Validator from './validator';\n\nconst Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nconst capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = 'VERSION';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: 'VERSION'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\nObject.assign(Field.prototype, UI.Field, Base.prototype);\nObject.assign(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\nObject.assign(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\",\n euvatin: \"It's not a valid VAT Identification Number.\",\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"names":["globalID","pastWarnings","Utils","attr","element","namespace","obj","i","attribute","attributes","regex","RegExp","hasOwnProperty","length","specified","test","name","camelize","slice","deserializeValue","value","checkAttr","hasAttribute","setAttr","setAttribute","dasherize","String","getType","getAttribute","generateID","num","isNaN","Number","JSON","parse","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","window","console","arguments","warnOnce","msg","_resetWarnings","trimString","string","date","parsed","map","x","parseInt","_","year","month","day","Date","getFullYear","getMonth","getDate","integer","number","parseFloat","_boolean","object","regexp","flags","parseRequirement","requirementType","converter","converted","namespaceEvents","events","split","$","evt","join","difference","array","remove","result","each","elem","indexOf","push","all","promises","when","objectCreate","Object","create","prototype","Error","TypeError","_SubmitSelector","Defaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","trigger","triggerAfterFailure","errorClass","successClass","classHandler","Field","errorsContainer","errorsWrapper","errorTemplate","Base","__id__","asyncSupport","_pipeAccordingToValidationResult","pipe","r","Deferred","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","on","fn","queue","subscribe","listenTo","off","splice","unsubscribe","unsubscribeTo","target","extraArg","call","asyncIsValid","force","whenValid","_findRelated","querySelectorAll","$element","convertArrayRequirement","m","values","convertExtraOptionRequirement","requirementSpec","extraOptionReader","main","extra","key","Validator","spec","extend","validate","requirementFirstArg","Array","isArray","validateMultiple","instance","validateDate","_isDateInput","validateNumber","validateString","parseRequirements","requirements","type","isPlainObject","priority","ValidatorRegistry","validators","catalog","__class__","locale","init","typeTesters","email","digits","alphanum","url","range","decimalPlaces","Math","max","parseArguments","args","operatorToValidator","operator","requirementsAndInput","pop","comparisonOperator","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","hasValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","typeMessages","formatMessage","defaultMessage","en","parameters","notblank","required","step","base","tester","nb","decimals","toInt","f","round","pow","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","euvatin","re","UI","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","Form","_actualizeTriggers","onSubmitValidate","onSubmitButton","_focusedField","fields","field","noFocus","_destroyUI","_reflowUI","_buildUI","_ui","diff","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","updateClass","_addError","_errorClass","updateError","_updateError","removeError","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","find","append","addClass","$errorClassHandler","errorsWrapperId","html","removeAttr","removeClass","customConstraintErrorMessage","_manageClassHandler","validationInformationVisible","$handlerFunction","$handler","jQuery","_inputHolder","nodeName","$errorsContainer","after","$toBind","_validateIfNeeded","event","getValue","debounce","clearTimeout","_debounced","setTimeout","_resetUI","children","statusMapping","pending","resolved","rejected","parsley","submitSource","_submitSource","prop","_remoteCache","whenValidate","state","_trigger","stopImmediatePropagation","preventDefault","done","_submit","currentTarget","$synthetic","appendTo","Event","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","refresh","reset","destroy","removeData","_bindFields","oldFields","fieldsMappedById","not","fieldInstance","Factory","uniqueId","oldActualizeOptions","eventName","Constraint","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","capitalize","cap","requirementList","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","groupedConstraints","_getGroupedConstraints","_validateConstraint","_handleWhitespace","_refreshConstraints","refreshConstraints","addConstraint","removeConstraint","updateConstraint","undefined","_bindHtml5Constraints","trimValue","whitespace","c","index","p","sort","a","b","Multiple","addElement","$elements","fieldConstraints","has","data","filter","_init","savedparsleyFormInstance","__version__","is","bind","isMultiple","handleMultiple","parsleyMultipleInstance","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","document","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","ParsleyValidator","method","ParsleyUI","doNotUpdateClass","autoBind","o","deprecated","adapt","context","parsleyAdaptedCallback","unshift","apply","eventPrefix","lastIndexOf","substr","listen","callback","unsubscribeAll","emit","instanceGiven","asyncValidators","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","ajax","handleXhr","then","InputEvent","globals","global","isNativeEvent","originalEvent","isTrusted","fakeInputEvent","misbehaves","behavesOk","selector","install","inputEventPatched","uninstall","inputevent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEA,IAAIA,QAAQ,GAAG,CAAf;EACA,IAAIC,YAAY,GAAG,EAAnB;EAEA,IAAIC,KAAK,GAAG;EACV;EACA;EACAC,EAAAA,IAAI,EAAE,cAAUC,OAAV,EAAmBC,SAAnB,EAA8BC,GAA9B,EAAmC;EACvC,QAAIC,CAAJ;EACA,QAAIC,SAAJ;EACA,QAAIC,UAAJ;EACA,QAAIC,KAAK,GAAG,IAAIC,MAAJ,CAAW,MAAMN,SAAjB,EAA4B,GAA5B,CAAZ;EAEA,QAAI,gBAAgB,OAAOC,GAA3B,EACEA,GAAG,GAAG,EAAN,CADF,KAEK;EACH;EACA,WAAKC,CAAL,IAAUD,GAAV,EAAe;EACb,YAAIA,GAAG,CAACM,cAAJ,CAAmBL,CAAnB,CAAJ,EACE,OAAOD,GAAG,CAACC,CAAD,CAAV;EACH;EACF;EAED,QAAI,CAACH,OAAL,EACE,OAAOE,GAAP;EAEFG,IAAAA,UAAU,GAAGL,OAAO,CAACK,UAArB;;EACA,SAAKF,CAAC,GAAGE,UAAU,CAACI,MAApB,EAA4BN,CAAC,EAA7B,GAAmC;EACjCC,MAAAA,SAAS,GAAGC,UAAU,CAACF,CAAD,CAAtB;;EAEA,UAAIC,SAAS,IAAIA,SAAS,CAACM,SAAvB,IAAoCJ,KAAK,CAACK,IAAN,CAAWP,SAAS,CAACQ,IAArB,CAAxC,EAAoE;EAClEV,QAAAA,GAAG,CAAC,KAAKW,QAAL,CAAcT,SAAS,CAACQ,IAAV,CAAeE,KAAf,CAAqBb,SAAS,CAACQ,MAA/B,CAAd,CAAD,CAAH,GAA6D,KAAKM,gBAAL,CAAsBX,SAAS,CAACY,KAAhC,CAA7D;EACD;EACF;;EAED,WAAOd,GAAP;EACD,GAhCS;EAkCVe,EAAAA,SAAS,EAAE,mBAAUjB,OAAV,EAAmBC,SAAnB,EAA8BgB,UAA9B,EAAyC;EAClD,WAAOjB,OAAO,CAACkB,YAAR,CAAqBjB,SAAS,GAAGgB,UAAjC,CAAP;EACD,GApCS;EAsCVE,EAAAA,OAAO,EAAE,iBAAUnB,OAAV,EAAmBC,SAAnB,EAA8BF,IAA9B,EAAoCiB,KAApC,EAA2C;EAClDhB,IAAAA,OAAO,CAACoB,YAAR,CAAqB,KAAKC,SAAL,CAAepB,SAAS,GAAGF,IAA3B,CAArB,EAAuDuB,MAAM,CAACN,KAAD,CAA7D;EACD,GAxCS;EA0CVO,EAAAA,OAAO,EAAE,iBAASvB,OAAT,EAAkB;EACzB,WAAOA,OAAO,CAACwB,YAAR,CAAqB,MAArB,KAAgC,MAAvC;EACD,GA5CS;EA8CVC,EAAAA,UAAU,EAAE,sBAAY;EACtB,WAAO,KAAK7B,QAAQ,EAApB;EACD,GAhDS;;EAkDV;EACAmB,EAAAA,gBAAgB,EAAE,0BAAUC,KAAV,EAAiB;EACjC,QAAIU,GAAJ;;EAEA,QAAI;EACF,aAAOV,KAAK,GACVA,KAAK,IAAI,MAAT,KACCA,KAAK,IAAI,OAAT,GAAmB,KAAnB,GACDA,KAAK,IAAI,MAAT,GAAkB,IAAlB,GACA,CAACW,KAAK,CAACD,GAAG,GAAGE,MAAM,CAACZ,KAAD,CAAb,CAAN,GAA8BU,GAA9B,GACA,UAAUf,IAAV,CAAeK,KAAf,IAAwBa,IAAI,CAACC,KAAL,CAAWd,KAAX,CAAxB,GACAA,KALA,CADU,GAORA,KAPJ;EAQD,KATD,CASE,OAAOe,CAAP,EAAU;EAAE,aAAOf,KAAP;EAAe;EAC9B,GAhES;EAkEV;EACAH,EAAAA,QAAQ,EAAE,kBAAUmB,GAAV,EAAe;EACvB,WAAOA,GAAG,CAACC,OAAJ,CAAY,SAAZ,EAAuB,UAAUC,KAAV,EAAiBC,GAAjB,EAAsB;EAClD,aAAOA,GAAG,GAAGA,GAAG,CAACC,WAAJ,EAAH,GAAuB,EAAjC;EACD,KAFM,CAAP;EAGD,GAvES;EAyEV;EACAf,EAAAA,SAAS,EAAE,mBAAUW,GAAV,EAAe;EACxB,WAAOA,GAAG,CAACC,OAAJ,CAAY,KAAZ,EAAmB,GAAnB,EACJA,OADI,CACI,uBADJ,EAC6B,OAD7B,EAEJA,OAFI,CAEI,mBAFJ,EAEyB,OAFzB,EAGJA,OAHI,CAGI,IAHJ,EAGU,GAHV,EAIJI,WAJI,EAAP;EAKD,GAhFS;EAkFVC,EAAAA,IAAI,EAAE,gBAAY;EAAA;;EAChB,QAAIC,MAAM,CAACC,OAAP,IAAkB,eAAe,OAAOD,MAAM,CAACC,OAAP,CAAeF,IAA3D,EACE,mBAAAC,MAAM,CAACC,OAAP,EAAeF,IAAf,wBAAuBG,SAAvB;EACH,GArFS;EAuFVC,EAAAA,QAAQ,EAAE,kBAASC,GAAT,EAAc;EACtB,QAAI,CAAC9C,YAAY,CAAC8C,GAAD,CAAjB,EAAwB;EACtB9C,MAAAA,YAAY,CAAC8C,GAAD,CAAZ,GAAoB,IAApB;EACA,WAAKL,IAAL,aAAaG,SAAb;EACD;EACF,GA5FS;EA8FVG,EAAAA,cAAc,EAAE,0BAAY;EAC1B/C,IAAAA,YAAY,GAAG,EAAf;EACD,GAhGS;EAkGVgD,EAAAA,UAAU,EAAE,oBAASC,MAAT,EAAiB;EAC3B,WAAOA,MAAM,CAACb,OAAP,CAAe,YAAf,EAA6B,EAA7B,CAAP;EACD,GApGS;EAsGVH,EAAAA,KAAK,EAAE;EACLiB,IAAAA,IAAI,EAAE,cAASD,MAAT,EAAiB;EACrB,UAAIE,MAAM,GAAGF,MAAM,CAACZ,KAAP,CAAa,0BAAb,CAAb;EACA,UAAI,CAACc,MAAL,EACE,OAAO,IAAP;;EAHmB,wBAIOA,MAAM,CAACC,GAAP,CAAW,UAAAC,CAAC;EAAA,eAAIC,QAAQ,CAACD,CAAD,EAAI,EAAJ,CAAZ;EAAA,OAAZ,CAJP;EAAA;EAAA,UAIhBE,CAJgB;EAAA,UAIbC,IAJa;EAAA,UAIPC,KAJO;EAAA,UAIAC,GAJA;;EAKrB,UAAIR,IAAI,GAAG,IAAIS,IAAJ,CAASH,IAAT,EAAeC,KAAK,GAAG,CAAvB,EAA0BC,GAA1B,CAAX;EACA,UAAIR,IAAI,CAACU,WAAL,OAAuBJ,IAAvB,IAA+BN,IAAI,CAACW,QAAL,KAAkB,CAAlB,KAAwBJ,KAAvD,IAAgEP,IAAI,CAACY,OAAL,OAAmBJ,GAAvF,EACE,OAAO,IAAP;EACF,aAAOR,IAAP;EACD,KAVI;EAWLD,IAAAA,MAAM,EAAE,gBAASA,OAAT,EAAiB;EACvB,aAAOA,OAAP;EACD,KAbI;EAcLc,IAAAA,OAAO,EAAE,iBAASd,MAAT,EAAiB;EACxB,UAAInB,KAAK,CAACmB,MAAD,CAAT,EACE,OAAO,IAAP;EACF,aAAOK,QAAQ,CAACL,MAAD,EAAS,EAAT,CAAf;EACD,KAlBI;EAmBLe,IAAAA,MAAM,EAAE,gBAASf,MAAT,EAAiB;EACvB,UAAInB,KAAK,CAACmB,MAAD,CAAT,EACE,MAAM,IAAN;EACF,aAAOgB,UAAU,CAAChB,MAAD,CAAjB;EACD,KAvBI;EAwBL,eAAW,SAASiB,QAAT,CAAkBjB,MAAlB,EAA0B;EACnC,aAAO,CAAE,iBAAiBnC,IAAjB,CAAsBmC,MAAtB,CAAT;EACD,KA1BI;EA2BLkB,IAAAA,MAAM,EAAE,gBAASlB,MAAT,EAAiB;EACvB,aAAOhD,KAAK,CAACiB,gBAAN,CAAuB+B,MAAvB,CAAP;EACD,KA7BI;EA8BLmB,IAAAA,MAAM,EAAE,gBAASA,OAAT,EAAiB;EACvB,UAAIC,KAAK,GAAG,EAAZ,CADuB;;EAIvB,UAAI,sBAAsBvD,IAAtB,CAA2BsD,OAA3B,CAAJ,EAAwC;EACtC;EACA;EACAC,QAAAA,KAAK,GAAGD,OAAM,CAAChC,OAAP,CAAe,gBAAf,EAAiC,IAAjC,CAAR,CAHsC;EAKtC;;EACAgC,QAAAA,OAAM,GAAGA,OAAM,CAAChC,OAAP,CAAe,IAAI1B,MAAJ,CAAW,aAAa2D,KAAb,GAAqB,GAAhC,CAAf,EAAqD,IAArD,CAAT;EACD,OAPD,MAOO;EACL;EACAD,QAAAA,OAAM,GAAG,MAAMA,OAAN,GAAe,GAAxB;EACD;;EACD,aAAO,IAAI1D,MAAJ,CAAW0D,OAAX,EAAmBC,KAAnB,CAAP;EACD;EA9CI,GAtGG;EAuJVC,EAAAA,gBAAgB,EAAE,0BAASC,eAAT,EAA0BtB,MAA1B,EAAkC;EAClD,QAAIuB,SAAS,GAAG,KAAKvC,KAAL,CAAWsC,eAAe,IAAI,QAA9B,CAAhB;EACA,QAAI,CAACC,SAAL,EACE,MAAM,yCAAyCD,eAAzC,GAA2D,GAAjE;EACF,QAAIE,SAAS,GAAGD,SAAS,CAACvB,MAAD,CAAzB;EACA,QAAIwB,SAAS,KAAK,IAAlB,EACE,qCAA8BF,eAA9B,iBAAmDtB,MAAnD;EACF,WAAOwB,SAAP;EACD,GA/JS;EAiKVC,EAAAA,eAAe,EAAE,yBAASC,MAAT,EAAiBvE,SAAjB,EAA4B;EAC3CuE,IAAAA,MAAM,GAAG,KAAK3B,UAAL,CAAgB2B,MAAM,IAAI,EAA1B,EAA8BC,KAA9B,CAAoC,KAApC,CAAT;EACA,QAAI,CAACD,MAAM,CAAC,CAAD,CAAX,EACE,OAAO,EAAP;EACF,WAAOE,CAAC,CAACzB,GAAF,CAAMuB,MAAN,EAAc,UAAAG,GAAG;EAAA,uBAAOA,GAAP,cAAc1E,SAAd;EAAA,KAAjB,EAA4C2E,IAA5C,CAAiD,GAAjD,CAAP;EACD,GAtKS;EAwKVC,EAAAA,UAAU,EAAE,oBAASC,KAAT,EAAgBC,MAAhB,EAAwB;EAClC;EACA,QAAIC,MAAM,GAAG,EAAb;EACAN,IAAAA,CAAC,CAACO,IAAF,CAAOH,KAAP,EAAc,UAAC1B,CAAD,EAAI8B,IAAJ,EAAa;EACzB,UAAIH,MAAM,CAACI,OAAP,CAAeD,IAAf,KAAwB,CAAC,CAA7B,EACEF,MAAM,CAACI,IAAP,CAAYF,IAAZ;EACH,KAHD;EAIA,WAAOF,MAAP;EACD,GAhLS;EAkLV;EACAK,EAAAA,GAAG,EAAE,aAASC,QAAT,EAAmB;EACtB;EACA,WAAOZ,CAAC,CAACa,IAAF,OAAAb,CAAC,qBAASY,QAAT,UAAmB,EAAnB,EAAuB,EAAvB,GAAR;EACD,GAtLS;EAwLV;EACAE,EAAAA,YAAY,EAAEC,MAAM,CAACC,MAAP,IAAkB,YAAY;EAC1C,QAAID,MAAM,GAAG,SAATA,MAAS,GAAY,EAAzB;;EACA,WAAO,UAAUE,SAAV,EAAqB;EAC1B,UAAIlD,SAAS,CAAChC,MAAV,GAAmB,CAAvB,EAA0B;EACxB,cAAMmF,KAAK,CAAC,+BAAD,CAAX;EACD;;EACD,UAAI,QAAOD,SAAP,KAAoB,QAAxB,EAAkC;EAChC,cAAME,SAAS,CAAC,4BAAD,CAAf;EACD;;EACDJ,MAAAA,MAAM,CAACE,SAAP,GAAmBA,SAAnB;EACA,UAAIX,MAAM,GAAG,IAAIS,MAAJ,EAAb;EACAA,MAAAA,MAAM,CAACE,SAAP,GAAmB,IAAnB;EACA,aAAOX,MAAP;EACD,KAXD;EAYD,GAd8B,EAzLrB;EAyMVc,EAAAA,eAAe,EAAE;EAzMP,CAAZ;;ECLA;EACA;EACA;EACA;EAEA,IAAIC,QAAQ,GAAG;EACb;EAEA;EACA9F,EAAAA,SAAS,EAAE,eAJE;EAMb;EACA+F,EAAAA,MAAM,EAAE,yBAPK;EASb;EACAC,EAAAA,QAAQ,EAAE,+EAVG;EAYb;EACAC,EAAAA,eAAe,EAAE,IAbJ;EAeb;EAEA;EACAC,EAAAA,QAAQ,EAAE,IAlBG;EAoBb;EACAC,EAAAA,KAAK,EAAE,IArBM;EAuBb;EACA;EACAC,EAAAA,SAAS,EAAE,IAzBE;EA2Bb;EACAC,EAAAA,mBAAmB,EAAE,CA5BR;EA8Bb;EACAC,EAAAA,KAAK,EAAE,OA/BM;EAiCb;EACAC,EAAAA,OAAO,EAAE,KAlCI;EAoCb;EACAC,EAAAA,mBAAmB,EAAE,OArCR;EAuCb;EACAC,EAAAA,UAAU,EAAE,eAxCC;EA0Cb;EACAC,EAAAA,YAAY,EAAE,iBA3CD;EA6Cb;EACA;EACAC,EAAAA,YAAY,EAAE,sBAAUC,KAAV,EAAiB,EA/ClB;EAiDb;EACA;EACAC,EAAAA,eAAe,EAAE,yBAAUD,KAAV,EAAiB,EAnDrB;EAqDb;EACAE,EAAAA,aAAa,EAAE,uCAtDF;EAwDb;EACAC,EAAAA,aAAa,EAAE;EAzDF,CAAf;;ECFA,IAAIC,IAAI,GAAG,SAAPA,IAAO,GAAY;EACrB,OAAKC,MAAL,GAAcpH,KAAK,CAAC2B,UAAN,EAAd;EACD,CAFD;;EAIAwF,IAAI,CAACtB,SAAL,GAAiB;EACfwB,EAAAA,YAAY,EAAE,IADC;EACK;EAEpBC,EAAAA,gCAAgC,EAAE,4CAAY;EAAA;;EAC5C,QAAIC,IAAI,GAAG,SAAPA,IAAO,GAAM;EACf,UAAIC,CAAC,GAAG5C,CAAC,CAAC6C,QAAF,EAAR;EACA,UAAI,SAAS,KAAI,CAACC,gBAAlB,EACEF,CAAC,CAACG,MAAF;EACF,aAAOH,CAAC,CAACI,OAAF,GAAYC,OAAZ,EAAP;EACD,KALD;;EAMA,WAAO,CAACN,IAAD,EAAOA,IAAP,CAAP;EACD,GAXc;EAafO,EAAAA,gBAAgB,EAAE,4BAAY;EAC5B9H,IAAAA,KAAK,CAACC,IAAN,CAAW,KAAKC,OAAhB,EAAyB,KAAK6H,OAAL,CAAa5H,SAAtC,EAAiD,KAAK6H,UAAtD;EACA,QAAI,KAAKC,MAAL,IAAe,KAAKA,MAAL,CAAYH,gBAA/B,EACE,KAAKG,MAAL,CAAYH,gBAAZ;EACF,WAAO,IAAP;EACD,GAlBc;EAoBfI,EAAAA,aAAa,EAAE,uBAAUC,WAAV,EAAuB;EACpC,SAAKH,UAAL,GAAkBhI,KAAK,CAAC0F,YAAN,CAAmB,KAAKuC,MAAL,CAAYF,OAA/B,CAAlB;EACA,SAAKA,OAAL,GAAe/H,KAAK,CAAC0F,YAAN,CAAmB,KAAKsC,UAAxB,CAAf,CAFoC;;EAIpC,SAAK,IAAI3H,CAAT,IAAc8H,WAAd,EAA2B;EACzB,UAAIA,WAAW,CAACzH,cAAZ,CAA2BL,CAA3B,CAAJ,EACE,KAAK0H,OAAL,CAAa1H,CAAb,IAAkB8H,WAAW,CAAC9H,CAAD,CAA7B;EACH;;EACD,SAAKyH,gBAAL;EACD,GA7Bc;EA+BfM,EAAAA,UAAU,EAAE,IA/BG;EAiCf;EACA;EACA;EACA;EACAC,EAAAA,EAAE,EAAE,YAAUvH,IAAV,EAAgBwH,EAAhB,EAAoB;EACtB,SAAKF,UAAL,GAAkB,KAAKA,UAAL,IAAmB,EAArC;EACA,QAAIG,KAAK,GAAG,KAAKH,UAAL,CAAgBtH,IAAhB,IAAwB,KAAKsH,UAAL,CAAgBtH,IAAhB,KAAyB,EAA7D;EACAyH,IAAAA,KAAK,CAACjD,IAAN,CAAWgD,EAAX;EAEA,WAAO,IAAP;EACD,GA3Cc;EA6Cf;EACAE,EAAAA,SAAS,EAAE,mBAAS1H,IAAT,EAAewH,EAAf,EAAmB;EAC5B1D,IAAAA,CAAC,CAAC6D,QAAF,CAAW,IAAX,EAAiB3H,IAAI,CAACyB,WAAL,EAAjB,EAAqC+F,EAArC;EACD,GAhDc;EAkDf;EACAI,EAAAA,GAAG,EAAE,aAAU5H,IAAV,EAAgBwH,EAAhB,EAAoB;EACvB,QAAIC,KAAK,GAAG,KAAKH,UAAL,IAAmB,KAAKA,UAAL,CAAgBtH,IAAhB,CAA/B;;EACA,QAAIyH,KAAJ,EAAW;EACT,UAAI,CAACD,EAAL,EAAS;EACP,eAAO,KAAKF,UAAL,CAAgBtH,IAAhB,CAAP;EACD,OAFD,MAEO;EACL,aAAK,IAAIT,CAAC,GAAGkI,KAAK,CAAC5H,MAAnB,EAA2BN,CAAC,EAA5B;EACE,cAAIkI,KAAK,CAAClI,CAAD,CAAL,KAAaiI,EAAjB,EACEC,KAAK,CAACI,MAAN,CAAatI,CAAb,EAAgB,CAAhB;EAFJ;EAGD;EACF;;EACD,WAAO,IAAP;EACD,GA/Dc;EAiEf;EACAuI,EAAAA,WAAW,EAAE,qBAAS9H,IAAT,EAAewH,EAAf,EAAmB;EAC9B1D,IAAAA,CAAC,CAACiE,aAAF,CAAgB,IAAhB,EAAsB/H,IAAI,CAACyB,WAAL,EAAtB;EACD,GApEc;EAsEf;EACA;EACA;EACAmE,EAAAA,OAAO,EAAE,iBAAU5F,IAAV,EAAgBgI,MAAhB,EAAwBC,QAAxB,EAAkC;EACzCD,IAAAA,MAAM,GAAGA,MAAM,IAAI,IAAnB;EACA,QAAIP,KAAK,GAAG,KAAKH,UAAL,IAAmB,KAAKA,UAAL,CAAgBtH,IAAhB,CAA/B;EACA,QAAIoE,MAAJ;AACA;EACA,QAAIqD,KAAJ,EAAW;EACT,WAAK,IAAIlI,CAAC,GAAGkI,KAAK,CAAC5H,MAAnB,EAA2BN,CAAC,EAA5B,GAAkC;EAChC6E,QAAAA,MAAM,GAAGqD,KAAK,CAAClI,CAAD,CAAL,CAAS2I,IAAT,CAAcF,MAAd,EAAsBA,MAAtB,EAA8BC,QAA9B,CAAT;EACA,YAAI7D,MAAM,KAAK,KAAf,EAAsB,OAAOA,MAAP;EACvB;EACF;;EACD,QAAI,KAAK+C,MAAT,EAAiB;EACf,aAAO,KAAKA,MAAL,CAAYvB,OAAZ,CAAoB5F,IAApB,EAA0BgI,MAA1B,EAAkCC,QAAlC,CAAP;EACD;;EACD,WAAO,IAAP;EACD,GAxFc;EA0FfE,EAAAA,YAAY,EAAE,sBAAU3C,KAAV,EAAiB4C,KAAjB,EAAwB;EACpClJ,IAAAA,KAAK,CAAC4C,QAAN,CAAe,0DAAf;EACA,WAAO,KAAKuG,SAAL,CAAe;EAAC7C,MAAAA,KAAK,EAALA,KAAD;EAAQ4C,MAAAA,KAAK,EAALA;EAAR,KAAf,CAAP;EACD,GA7Fc;EA+FfE,EAAAA,YAAY,EAAE,wBAAY;EACxB,WAAO,KAAKrB,OAAL,CAAa1B,QAAb,GACLzB,CAAC,CAAC,KAAKqD,MAAL,CAAY/H,OAAZ,CAAoBmJ,gBAApB,YAAyC,KAAKtB,OAAL,CAAa5H,SAAtD,wBAA4E,KAAK4H,OAAL,CAAa1B,QAAzF,SAAD,CADI,GAEL,KAAKiD,QAFP;EAGD;EAnGc,CAAjB;;ECJA,IAAIC,uBAAuB,GAAG,SAA1BA,uBAA0B,CAASvG,MAAT,EAAiBrC,MAAjB,EAAyB;EACrD,MAAI6I,CAAC,GAAGxG,MAAM,CAACZ,KAAP,CAAa,kBAAb,CAAR;EACA,MAAI,CAACoH,CAAL,EACE,MAAM,mCAAmCxG,MAAnC,GAA4C,GAAlD;EACF,MAAIyG,MAAM,GAAGD,CAAC,CAAC,CAAD,CAAD,CAAK7E,KAAL,CAAW,GAAX,EAAgBxB,GAAhB,CAAoBnD,KAAK,CAAC+C,UAA1B,CAAb;EACA,MAAI0G,MAAM,CAAC9I,MAAP,KAAkBA,MAAtB,EACE,MAAM,qBAAqB8I,MAAM,CAAC9I,MAA5B,GAAqC,eAArC,GAAuDA,MAAvD,GAAgE,aAAtE;EACF,SAAO8I,MAAP;EACD,CARD;;EAUA,IAAIC,6BAA6B,GAAG,SAAhCA,6BAAgC,CAASC,eAAT,EAA0B3G,MAA1B,EAAkC4G,iBAAlC,EAAqD;EACvF,MAAIC,IAAI,GAAG,IAAX;EACA,MAAIC,KAAK,GAAG,EAAZ;;EACA,OAAK,IAAIC,GAAT,IAAgBJ,eAAhB,EAAiC;EAC/B,QAAII,GAAJ,EAAS;EACP,UAAI7I,KAAK,GAAG0I,iBAAiB,CAACG,GAAD,CAA7B;EACA,UAAI,aAAa,OAAO7I,KAAxB,EACEA,KAAK,GAAGlB,KAAK,CAACqE,gBAAN,CAAuBsF,eAAe,CAACI,GAAD,CAAtC,EAA6C7I,KAA7C,CAAR;EACF4I,MAAAA,KAAK,CAACC,GAAD,CAAL,GAAa7I,KAAb;EACD,KALD,MAKO;EACL2I,MAAAA,IAAI,GAAG7J,KAAK,CAACqE,gBAAN,CAAuBsF,eAAe,CAACI,GAAD,CAAtC,EAA6C/G,MAA7C,CAAP;EACD;EACF;;EACD,SAAO,CAAC6G,IAAD,EAAOC,KAAP,CAAP;EACD,CAdD;;;EAkBA,IAAIE,SAAS,GAAG,SAAZA,SAAY,CAASC,IAAT,EAAe;EAC7BrF,EAAAA,CAAC,CAACsF,MAAF,CAAS,IAAT,EAAe,IAAf,EAAqBD,IAArB;EACD,CAFD;;EAIAD,SAAS,CAACnE,SAAV,GAAsB;EACpB;EACAsE,EAAAA,QAAQ,EAAE,kBAASjJ,KAAT,EAAgBkJ,mBAAhB,EAAqC;EAC7C,QAAI,KAAK9B,EAAT,EAAa;EAAE;EAEb,UAAI3F,SAAS,CAAChC,MAAV,GAAmB,CAAvB;EACEyJ,QAAAA,mBAAmB,GAAG,GAAGpJ,KAAH,CAASgI,IAAT,CAAcrG,SAAd,EAAyB,CAAzB,EAA4B,CAAC,CAA7B,CAAtB,CAHS;;EAIX,aAAO,KAAK2F,EAAL,CAAQpH,KAAR,EAAekJ,mBAAf,CAAP;EACD;;EAED,QAAIC,KAAK,CAACC,OAAN,CAAcpJ,KAAd,CAAJ,EAA0B;EACxB,UAAI,CAAC,KAAKqJ,gBAAV,EACE,MAAM,gBAAgB,KAAKzJ,IAArB,GAA4B,mCAAlC;EACF,aAAO,KAAKyJ,gBAAL,aAAyB5H,SAAzB,CAAP;EACD,KAJD,MAIO;EACL,UAAI6H,QAAQ,GAAG7H,SAAS,CAACA,SAAS,CAAChC,MAAV,GAAmB,CAApB,CAAxB;;EACA,UAAI,KAAK8J,YAAL,IAAqBD,QAAQ,CAACE,YAAT,EAAzB,EAAkD;EAChD/H,QAAAA,SAAS,CAAC,CAAD,CAAT,GAAe3C,KAAK,CAACgC,KAAN,CAAYiB,IAAZ,CAAiBN,SAAS,CAAC,CAAD,CAA1B,CAAf;EACA,YAAIA,SAAS,CAAC,CAAD,CAAT,KAAiB,IAArB,EACE,OAAO,KAAP;EACF,eAAO,KAAK8H,YAAL,aAAqB9H,SAArB,CAAP;EACD;;EACD,UAAI,KAAKgI,cAAT,EAAyB;EACvB,YAAI,CAACzJ,KAAL;EACE,iBAAO,IAAP;EACF,YAAIW,KAAK,CAACX,KAAD,CAAT,EACE,OAAO,KAAP;EACFyB,QAAAA,SAAS,CAAC,CAAD,CAAT,GAAeqB,UAAU,CAACrB,SAAS,CAAC,CAAD,CAAV,CAAzB;EACA,eAAO,KAAKgI,cAAL,aAAuBhI,SAAvB,CAAP;EACD;;EACD,UAAI,KAAKiI,cAAT,EAAyB;EACvB,eAAO,KAAKA,cAAL,aAAuBjI,SAAvB,CAAP;EACD;;EACD,YAAM,gBAAgB,KAAK7B,IAArB,GAA4B,gCAAlC;EACD;EACF,GAnCmB;EAqCpB;EACA;EACA+J,EAAAA,iBAAiB,EAAE,2BAASC,YAAT,EAAuBlB,iBAAvB,EAA0C;EAC3D,QAAI,aAAa,OAAOkB,YAAxB,EAAsC;EACpC;EACA;EACA,aAAOT,KAAK,CAACC,OAAN,CAAcQ,YAAd,IAA8BA,YAA9B,GAA6C,CAACA,YAAD,CAApD;EACD;;EACD,QAAIC,IAAI,GAAG,KAAKzG,eAAhB;;EACA,QAAI+F,KAAK,CAACC,OAAN,CAAcS,IAAd,CAAJ,EAAyB;EACvB,UAAItB,MAAM,GAAGF,uBAAuB,CAACuB,YAAD,EAAeC,IAAI,CAACpK,MAApB,CAApC;;EACA,WAAK,IAAIN,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGoJ,MAAM,CAAC9I,MAA3B,EAAmCN,CAAC,EAApC;EACEoJ,QAAAA,MAAM,CAACpJ,CAAD,CAAN,GAAYL,KAAK,CAACqE,gBAAN,CAAuB0G,IAAI,CAAC1K,CAAD,CAA3B,EAAgCoJ,MAAM,CAACpJ,CAAD,CAAtC,CAAZ;EADF;;EAEA,aAAOoJ,MAAP;EACD,KALD,MAKO,IAAI7E,CAAC,CAACoG,aAAF,CAAgBD,IAAhB,CAAJ,EAA2B;EAChC,aAAOrB,6BAA6B,CAACqB,IAAD,EAAOD,YAAP,EAAqBlB,iBAArB,CAApC;EACD,KAFM,MAEA;EACL,aAAO,CAAC5J,KAAK,CAACqE,gBAAN,CAAuB0G,IAAvB,EAA6BD,YAA7B,CAAD,CAAP;EACD;EACF,GAxDmB;EAyDpB;EACAxG,EAAAA,eAAe,EAAE,QA1DG;EA4DpB2G,EAAAA,QAAQ,EAAE;EA5DU,CAAtB;;EC9BA,IAAIC,iBAAiB,GAAG,SAApBA,iBAAoB,CAAUC,UAAV,EAAsBC,OAAtB,EAA+B;EACrD,OAAKC,SAAL,GAAiB,mBAAjB,CADqD;;EAIrD,OAAKC,MAAL,GAAc,IAAd;EAEA,OAAKC,IAAL,CAAUJ,UAAU,IAAI,EAAxB,EAA4BC,OAAO,IAAI,EAAvC;EACD,CAPD;;EASA,IAAII,WAAW,GAAI;EACjBC,EAAAA,KAAK,EAAE,y2BADU;EAGjB;EACA1H,EAAAA,MAAM,EAAE,8BAJS;EAMjBD,EAAAA,OAAO,EAAE,SANQ;EAQjB4H,EAAAA,MAAM,EAAE,OARS;EAUjBC,EAAAA,QAAQ,EAAE,QAVO;EAYjB1I,EAAAA,IAAI,EAAE;EACJpC,IAAAA,IAAI,EAAE,cAAAK,KAAK;EAAA,aAAIlB,KAAK,CAACgC,KAAN,CAAYiB,IAAZ,CAAiB/B,KAAjB,MAA4B,IAAhC;EAAA;EADP,GAZW;EAgBjB0K,EAAAA,GAAG,EAAE,IAAInL,MAAJ,CACD;EAEE,0BAFF;EAGE;EACA,wBAJF,GAKE,KALF;EAOI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,0CAhBJ,GAiBI,4CAjBJ,GAkBI,gDAlBJ,GAmBE,GAnBF;EAqBI,oEArBJ;EAuBI,wEAvBJ;EAyBI,0CAzBJ,GA0BE,GA1BF;EA4BE,kBA5BF;EA8BE,cA9BF,GA+BA,GAhCC;EAhBY,CAAnB;EAmDA+K,WAAW,CAACK,KAAZ,GAAoBL,WAAW,CAACzH,MAAhC;;EAGA,IAAI+H,aAAa,GAAG,SAAhBA,aAAgB,CAAAlK,GAAG,EAAI;EACzB,MAAIQ,KAAK,GAAG,CAAC,KAAKR,GAAN,EAAWQ,KAAX,CAAiB,kCAAjB,CAAZ;;EACA,MAAI,CAACA,KAAL,EAAY;EAAE,WAAO,CAAP;EAAW;;EACzB,SAAO2J,IAAI,CAACC,GAAL,CACF,CADE;EAGF,GAAC5J,KAAK,CAAC,CAAD,CAAL,GAAWA,KAAK,CAAC,CAAD,CAAL,CAASzB,MAApB,GAA6B,CAA9B;EAECyB,EAAAA,KAAK,CAAC,CAAD,CAAL,GAAW,CAACA,KAAK,CAAC,CAAD,CAAjB,GAAuB,CAFxB,CAHE,CAAP;EAMD,CATD;;;EAYA,IAAI6J,cAAc,GAAG,SAAjBA,cAAiB,CAAClB,IAAD,EAAOmB,IAAP;EAAA,SAAgBA,IAAI,CAAC/I,GAAL,CAASnD,KAAK,CAACgC,KAAN,CAAY+I,IAAZ,CAAT,CAAhB;EAAA,CAArB;;;EAEA,IAAIoB,mBAAmB,GAAG,SAAtBA,mBAAsB,CAACpB,IAAD,EAAOqB,QAAP,EAAoB;EAC5C,SAAO,UAAClL,KAAD,EAAoC;EAAA,sCAAzBmL,oBAAyB;EAAzBA,MAAAA,oBAAyB;EAAA;;EACzCA,IAAAA,oBAAoB,CAACC,GAArB,GADyC;;EAEzC,WAAOF,QAAQ,MAAR,UAASlL,KAAT,4BAAmB+K,cAAc,CAAClB,IAAD,EAAOsB,oBAAP,CAAjC,GAAP;EACD,GAHD;EAID,CALD;;EAOA,IAAIE,kBAAkB,GAAG,SAArBA,kBAAqB,CAAAH,QAAQ;EAAA,SAAK;EACpC3B,IAAAA,YAAY,EAAE0B,mBAAmB,CAAC,MAAD,EAASC,QAAT,CADG;EAEpCzB,IAAAA,cAAc,EAAEwB,mBAAmB,CAAC,QAAD,EAAWC,QAAX,CAFC;EAGpC9H,IAAAA,eAAe,EAAE8H,QAAQ,CAACzL,MAAT,IAAmB,CAAnB,GAAuB,QAAvB,GAAkC,CAAC,QAAD,EAAW,QAAX,CAHf;EAGqC;EACzEsK,IAAAA,QAAQ,EAAE;EAJ0B,GAAL;EAAA,CAAjC;;EAOAC,iBAAiB,CAACrF,SAAlB,GAA8B;EAC5B0F,EAAAA,IAAI,EAAE,cAAUJ,UAAV,EAAsBC,OAAtB,EAA+B;EACnC,SAAKA,OAAL,GAAeA,OAAf,CADmC;;EAGnC,SAAKD,UAAL,GAAkB,SAAc,EAAd,EAAkB,KAAKA,UAAvB,CAAlB;;EAEA,SAAK,IAAIrK,IAAT,IAAiBqK,UAAjB;EACE,WAAKqB,YAAL,CAAkB1L,IAAlB,EAAwBqK,UAAU,CAACrK,IAAD,CAAV,CAAiBwH,EAAzC,EAA6C6C,UAAU,CAACrK,IAAD,CAAV,CAAiBmK,QAA9D;EADF;;EAGAxI,IAAAA,MAAM,CAACgK,OAAP,CAAe/F,OAAf,CAAuB,wBAAvB;EACD,GAV2B;EAY5B;EACAgG,EAAAA,SAAS,EAAE,mBAAUpB,MAAV,EAAkB;EAC3B,QAAI,gBAAgB,OAAO,KAAKF,OAAL,CAAaE,MAAb,CAA3B,EACE,MAAM,IAAIxF,KAAJ,CAAUwF,MAAM,GAAG,kCAAnB,CAAN;EAEF,SAAKA,MAAL,GAAcA,MAAd;EAEA,WAAO,IAAP;EACD,GApB2B;EAsB5B;EACAqB,EAAAA,UAAU,EAAE,oBAAUrB,MAAV,EAAkBsB,QAAlB,EAA4BC,GAA5B,EAAiC;EAC3C,QAAI,qBAAoBD,QAApB,CAAJ,EACE,KAAKxB,OAAL,CAAaE,MAAb,IAAuBsB,QAAvB;EAEF,QAAI,SAASC,GAAb,EACE,OAAO,KAAKH,SAAL,CAAepB,MAAf,CAAP;EAEF,WAAO,IAAP;EACD,GA/B2B;EAiC5B;EACAwB,EAAAA,UAAU,EAAE,oBAAUxB,MAAV,EAAkBxK,IAAlB,EAAwBiM,OAAxB,EAAiC;EAC3C,QAAI,gBAAgB,OAAO,KAAK3B,OAAL,CAAaE,MAAb,CAA3B,EACE,KAAKF,OAAL,CAAaE,MAAb,IAAuB,EAAvB;EAEF,SAAKF,OAAL,CAAaE,MAAb,EAAqBxK,IAArB,IAA6BiM,OAA7B;EAEA,WAAO,IAAP;EACD,GAzC2B;EA2C5B;EACAC,EAAAA,WAAW,EAAE,qBAAU1B,MAAV,EAAkB2B,iBAAlB,EAAqC;EAChD,SAAK,IAAInM,IAAT,IAAiBmM,iBAAjB;EACE,WAAKH,UAAL,CAAgBxB,MAAhB,EAAwBxK,IAAxB,EAA8BmM,iBAAiB,CAACnM,IAAD,CAA/C;EADF;;EAGA,WAAO,IAAP;EACD,GAjD2B;EAmD5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA0L,EAAAA,YAAY,EAAE,sBAAU1L,IAAV,EAAgBoM,IAAhB,EAAsBC,IAAtB,EAA4B;EACxC,QAAI,KAAKhC,UAAL,CAAgBrK,IAAhB,CAAJ,EACEd,KAAK,CAACwC,IAAN,CAAW,gBAAgB1B,IAAhB,GAAuB,uBAAlC,EADF,KAEK,IAAImF,QAAQ,CAACvF,cAAT,CAAwBI,IAAxB,CAAJ,EAAmC;EACtCd,MAAAA,KAAK,CAACwC,IAAN,CAAW,MAAM1B,IAAN,GAAa,8DAAxB;EACA;EACD;EACD,WAAO,KAAKsM,aAAL,aAAsBzK,SAAtB,CAAP;EACD,GAzE2B;EA2E5B0K,EAAAA,YAAY,EAAE,sBAAUvM,IAAV,EAAgB;EAC5B,WAAO,CAAC,CAAC,KAAKqK,UAAL,CAAgBrK,IAAhB,CAAT;EACD,GA7E2B;EA+E5BwM,EAAAA,eAAe,EAAE,yBAAUxM,IAAV,EAAgBoM,IAAhB,EAAsBC,IAAtB,EAA4B;EAC3C,QAAI,CAAC,KAAKhC,UAAL,CAAgBrK,IAAhB,CAAL,EAA4B;EAC1Bd,MAAAA,KAAK,CAACwC,IAAN,CAAW,gBAAgB1B,IAAhB,GAAuB,2BAAlC;EACA,aAAO,KAAK0L,YAAL,aAAqB7J,SAArB,CAAP;EACD;;EACD,WAAO,KAAKyK,aAAL,aAAsBzK,SAAtB,CAAP;EACD,GArF2B;EAuF5B4K,EAAAA,eAAe,EAAE,yBAAUzM,IAAV,EAAgB;EAC/B,QAAI,CAAC,KAAKqK,UAAL,CAAgBrK,IAAhB,CAAL,EACEd,KAAK,CAACwC,IAAN,CAAW,gBAAgB1B,IAAhB,GAAuB,mBAAlC;EAEF,WAAO,KAAKqK,UAAL,CAAgBrK,IAAhB,CAAP;EAEA,WAAO,IAAP;EACD,GA9F2B;EAgG5BsM,EAAAA,aAAa,EAAE,uBAAUtM,IAAV,EAAgB0M,SAAhB,EAA2BvC,QAA3B,EAAqC;EAClD,QAAI,qBAAoBuC,SAApB,CAAJ,EAAmC;EACjC;EACAA,MAAAA,SAAS,GAAG;EACVlF,QAAAA,EAAE,EAAEkF,SADM;EAEVvC,QAAAA,QAAQ,EAAEA;EAFA,OAAZ;EAID;;EACD,QAAI,CAACuC,SAAS,CAACrD,QAAf,EAAyB;EACvBqD,MAAAA,SAAS,GAAG,IAAIxD,SAAJ,CAAcwD,SAAd,CAAZ;EACD;;EACD,SAAKrC,UAAL,CAAgBrK,IAAhB,IAAwB0M,SAAxB;;EAEA,SAAK,IAAIlC,MAAT,IAAmBkC,SAAS,CAACZ,QAAV,IAAsB,EAAzC;EACE,WAAKE,UAAL,CAAgBxB,MAAhB,EAAwBxK,IAAxB,EAA8B0M,SAAS,CAACZ,QAAV,CAAmBtB,MAAnB,CAA9B;EADF;;EAGA,WAAO,IAAP;EACD,GAjH2B;EAmH5BmC,EAAAA,eAAe,EAAE,yBAAUC,UAAV,EAAsB;EACrC,QAAIX,OAAJ,CADqC;;EAIrC,QAAI,WAAWW,UAAU,CAAC5M,IAA1B,EAAgC;EAC9B,UAAI6M,YAAY,GAAG,KAAKvC,OAAL,CAAa,KAAKE,MAAlB,EAA0BoC,UAAU,CAAC5M,IAArC,KAA8C,EAAjE;EACAiM,MAAAA,OAAO,GAAGY,YAAY,CAACD,UAAU,CAAC5C,YAAZ,CAAtB;EACD,KAHD,MAIEiC,OAAO,GAAG,KAAKa,aAAL,CAAmB,KAAKxC,OAAL,CAAa,KAAKE,MAAlB,EAA0BoC,UAAU,CAAC5M,IAArC,CAAnB,EAA+D4M,UAAU,CAAC5C,YAA1E,CAAV;;EAEF,WAAOiC,OAAO,IAAI,KAAK3B,OAAL,CAAa,KAAKE,MAAlB,EAA0BuC,cAArC,IAAuD,KAAKzC,OAAL,CAAa0C,EAAb,CAAgBD,cAA9E;EACD,GA9H2B;EAgI5B;EACAD,EAAAA,aAAa,EAAE,uBAAU5K,MAAV,EAAkB+K,UAAlB,EAA8B;EAC3C,QAAI,qBAAoBA,UAApB,CAAJ,EAAoC;EAClC,WAAK,IAAI1N,CAAT,IAAc0N,UAAd;EACE/K,QAAAA,MAAM,GAAG,KAAK4K,aAAL,CAAmB5K,MAAnB,EAA2B+K,UAAU,CAAC1N,CAAD,CAArC,CAAT;EADF;;EAGA,aAAO2C,MAAP;EACD;;EAED,WAAO,aAAa,OAAOA,MAApB,GAA6BA,MAAM,CAACb,OAAP,CAAe,KAAf,EAAsB4L,UAAtB,CAA7B,GAAiE,EAAxE;EACD,GA1I2B;EA4I5B;EACA;EACA;EACA;EACA;EACA;EACA;EACA5C,EAAAA,UAAU,EAAE;EACV6C,IAAAA,QAAQ,EAAE;EACRpD,MAAAA,cAAc,EAAE,wBAAS1J,KAAT,EAAgB;EAC9B,eAAO,KAAKL,IAAL,CAAUK,KAAV,CAAP;EACD,OAHO;EAIR+J,MAAAA,QAAQ,EAAE;EAJF,KADA;EAOVgD,IAAAA,QAAQ,EAAE;EACR1D,MAAAA,gBAAgB,EAAE,0BAASd,MAAT,EAAiB;EACjC,eAAOA,MAAM,CAAC9I,MAAP,GAAgB,CAAvB;EACD,OAHO;EAIRiK,MAAAA,cAAc,EAAE,wBAAS1J,KAAT,EAAgB;EAC9B,eAAO,KAAKL,IAAL,CAAUK,KAAV,CAAP;EACD,OANO;EAOR+J,MAAAA,QAAQ,EAAE;EAPF,KAPA;EAgBVF,IAAAA,IAAI,EAAE;EACJH,MAAAA,cAAc,EAAE,wBAAS1J,KAAT,EAAgB6J,IAAhB,EAAqD;EAAA,uFAAJ,EAAI;EAAA,6BAA9BmD,IAA8B;EAAA,YAA9BA,IAA8B,0BAAvB,KAAuB;EAAA,6BAAhBC,IAAgB;EAAA,YAAhBA,IAAgB,0BAAT,CAAS;;EACnE,YAAIC,MAAM,GAAG5C,WAAW,CAACT,IAAD,CAAxB;;EACA,YAAI,CAACqD,MAAL,EAAa;EACX,gBAAM,IAAItI,KAAJ,CAAU,qBAAqBiF,IAArB,GAA4B,oBAAtC,CAAN;EACD;;EACD,YAAI,CAAC7J,KAAL,EACE,OAAO,IAAP,CANiE;;EAOnE,YAAI,CAACkN,MAAM,CAACvN,IAAP,CAAYK,KAAZ,CAAL,EACE,OAAO,KAAP;;EACF,YAAI,aAAa6J,IAAjB,EAAuB;EACrB,cAAI,CAAC,SAASlK,IAAT,CAAcqN,IAAI,IAAI,EAAtB,CAAL,EAAgC;EAC9B,gBAAIG,EAAE,GAAGvM,MAAM,CAACZ,KAAD,CAAf;EACA,gBAAIoN,QAAQ,GAAGvC,IAAI,CAACC,GAAL,CAASF,aAAa,CAACoC,IAAD,CAAtB,EAA8BpC,aAAa,CAACqC,IAAD,CAA3C,CAAf;EACA,gBAAIrC,aAAa,CAACuC,EAAD,CAAb,GAAoBC,QAAxB;EACE,qBAAO,KAAP,CAJ4B;;EAM9B,gBAAIC,KAAK,GAAG,SAARA,KAAQ,CAAAC,CAAC;EAAA,qBAAIzC,IAAI,CAAC0C,KAAL,CAAWD,CAAC,GAAGzC,IAAI,CAAC2C,GAAL,CAAS,EAAT,EAAaJ,QAAb,CAAf,CAAJ;EAAA,aAAb;;EACA,gBAAI,CAACC,KAAK,CAACF,EAAD,CAAL,GAAYE,KAAK,CAACJ,IAAD,CAAlB,IAA4BI,KAAK,CAACL,IAAD,CAAjC,IAA2C,CAA/C,EACE,OAAO,KAAP;EACH;EACF;;EACD,eAAO,IAAP;EACD,OAvBG;EAwBJ5J,MAAAA,eAAe,EAAE;EACf,YAAI,QADW;EAEf4J,QAAAA,IAAI,EAAE,QAFS;EAGfC,QAAAA,IAAI,EAAE;EAHS,OAxBb;EA6BJlD,MAAAA,QAAQ,EAAE;EA7BN,KAhBI;EA+CV0D,IAAAA,OAAO,EAAE;EACP/D,MAAAA,cAAc,EAAE,wBAAS1J,KAAT,EAAgBiD,MAAhB,EAAwB;EACtC,YAAI,CAACjD,KAAL,EACE,OAAO,IAAP,CAFoC;;EAGtC,eAAOiD,MAAM,CAACtD,IAAP,CAAYK,KAAZ,CAAP;EACD,OALM;EAMPoD,MAAAA,eAAe,EAAE,QANV;EAOP2G,MAAAA,QAAQ,EAAE;EAPH,KA/CC;EAwDV2D,IAAAA,SAAS,EAAE;EACThE,MAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiB2N,WAAjB,EAA8B;EAC5C,YAAI,CAAC3N,KAAL,EACE,OAAO,IAAP,CAF0C;;EAG5C,eAAOA,KAAK,CAACP,MAAN,IAAgBkO,WAAvB;EACD,OALQ;EAMTvK,MAAAA,eAAe,EAAE,SANR;EAOT2G,MAAAA,QAAQ,EAAE;EAPD,KAxDD;EAiEV6D,IAAAA,SAAS,EAAE;EACTlE,MAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiB2N,WAAjB,EAA8B;EAC5C,eAAO3N,KAAK,CAACP,MAAN,IAAgBkO,WAAvB;EACD,OAHQ;EAITvK,MAAAA,eAAe,EAAE,SAJR;EAKT2G,MAAAA,QAAQ,EAAE;EALD,KAjED;EAwEVtK,IAAAA,MAAM,EAAE;EACNiK,MAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiB6N,GAAjB,EAAsB/C,GAAtB,EAA2B;EACzC,YAAI,CAAC9K,KAAL,EACE,OAAO,IAAP,CAFuC;;EAGzC,eAAOA,KAAK,CAACP,MAAN,IAAgBoO,GAAhB,IAAuB7N,KAAK,CAACP,MAAN,IAAgBqL,GAA9C;EACD,OALK;EAMN1H,MAAAA,eAAe,EAAE,CAAC,SAAD,EAAY,SAAZ,CANX;EAON2G,MAAAA,QAAQ,EAAE;EAPJ,KAxEE;EAiFV+D,IAAAA,QAAQ,EAAE;EACRzE,MAAAA,gBAAgB,EAAE,0BAAUd,MAAV,EAAkBoF,WAAlB,EAA+B;EAC/C,eAAOpF,MAAM,CAAC9I,MAAP,IAAiBkO,WAAxB;EACD,OAHO;EAIRvK,MAAAA,eAAe,EAAE,SAJT;EAKR2G,MAAAA,QAAQ,EAAE;EALF,KAjFA;EAwFVgE,IAAAA,QAAQ,EAAE;EACR1E,MAAAA,gBAAgB,EAAE,0BAAUd,MAAV,EAAkBoF,WAAlB,EAA+B;EAC/C,eAAOpF,MAAM,CAAC9I,MAAP,IAAiBkO,WAAxB;EACD,OAHO;EAIRvK,MAAAA,eAAe,EAAE,SAJT;EAKR2G,MAAAA,QAAQ,EAAE;EALF,KAxFA;EA+FViE,IAAAA,KAAK,EAAE;EACL3E,MAAAA,gBAAgB,EAAE,0BAAUd,MAAV,EAAkBsF,GAAlB,EAAuB/C,GAAvB,EAA4B;EAC5C,eAAOvC,MAAM,CAAC9I,MAAP,IAAiBoO,GAAjB,IAAwBtF,MAAM,CAAC9I,MAAP,IAAiBqL,GAAhD;EACD,OAHI;EAIL1H,MAAAA,eAAe,EAAE,CAAC,SAAD,EAAY,SAAZ,CAJZ;EAKL2G,MAAAA,QAAQ,EAAE;EALL,KA/FG;EAsGV8D,IAAAA,GAAG,EAAExC,kBAAkB,CAAC,UAACrL,KAAD,EAAQ2N,WAAR;EAAA,aAAwB3N,KAAK,IAAI2N,WAAjC;EAAA,KAAD,CAtGb;EAuGV7C,IAAAA,GAAG,EAAEO,kBAAkB,CAAC,UAACrL,KAAD,EAAQ2N,WAAR;EAAA,aAAwB3N,KAAK,IAAI2N,WAAjC;EAAA,KAAD,CAvGb;EAwGVhD,IAAAA,KAAK,EAAEU,kBAAkB,CAAC,UAACrL,KAAD,EAAQ6N,GAAR,EAAa/C,GAAb;EAAA,aAAqB9K,KAAK,IAAI6N,GAAT,IAAgB7N,KAAK,IAAI8K,GAA9C;EAAA,KAAD,CAxGf;EAyGVmD,IAAAA,OAAO,EAAE;EACPvE,MAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiBkO,UAAjB,EAA6B;EAC3C,YAAI,CAAClO,KAAL,EACE,OAAO,IAAP,CAFyC;;EAG3C,YAAImO,UAAU,GAAGzK,CAAC,CAACwK,UAAD,CAAlB;EACA,YAAIC,UAAU,CAAC1O,MAAf,EACE,OAAOO,KAAK,KAAKmO,UAAU,CAACC,GAAX,EAAjB,CADF,KAGE,OAAOpO,KAAK,KAAKkO,UAAjB;EACH,OATM;EAUPnE,MAAAA,QAAQ,EAAE;EAVH,KAzGC;EAqHVsE,IAAAA,OAAO,EAAE;EACP3E,MAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiBkO,UAAjB,EAA6B;EAC3C,YAAI,CAAClO,KAAL,EAAY;EACV,iBAAO,IAAP,CADU;EAEX;;EAED,YAAIsO,EAAE,GAAG,+BAAT;EACA,eAAOA,EAAE,CAAC3O,IAAH,CAAQK,KAAR,CAAP;EACD,OARM;EASP+J,MAAAA,QAAQ,EAAE;EATH;EArHC;EAnJgB,CAA9B;;EC7FA,IAAIwE,EAAE,GAAG,EAAT;;EAEA,IAAIC,WAAW,GAAG,SAAdA,WAAc,CAAUC,SAAV,EAAqBC,SAArB,EAAgCC,IAAhC,EAAsC;EACtD,MAAIC,KAAK,GAAG,EAAZ;EACA,MAAIC,IAAI,GAAG,EAAX;;EAEA,OAAK,IAAI1P,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGsP,SAAS,CAAChP,MAA9B,EAAsCN,CAAC,EAAvC,EAA2C;EACzC,QAAI2P,KAAK,GAAG,KAAZ;;EAEA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGL,SAAS,CAACjP,MAA9B,EAAsCsP,CAAC,EAAvC;EACE,UAAIN,SAAS,CAACtP,CAAD,CAAT,CAAa6P,MAAb,CAAoBpP,IAApB,KAA6B8O,SAAS,CAACK,CAAD,CAAT,CAAaC,MAAb,CAAoBpP,IAArD,EAA2D;EACzDkP,QAAAA,KAAK,GAAG,IAAR;EACA;EACD;EAJH;;EAMA,QAAIA,KAAJ,EACED,IAAI,CAACzK,IAAL,CAAUqK,SAAS,CAACtP,CAAD,CAAnB,EADF,KAGEyP,KAAK,CAACxK,IAAN,CAAWqK,SAAS,CAACtP,CAAD,CAApB;EACH;;EAED,SAAO;EACL0P,IAAAA,IAAI,EAAEA,IADD;EAELD,IAAAA,KAAK,EAAEA,KAFF;EAGLK,IAAAA,OAAO,EAAE,CAACN,IAAD,GAAQH,WAAW,CAACE,SAAD,EAAYD,SAAZ,EAAuB,IAAvB,CAAX,CAAwCG,KAAhD,GAAwD;EAH5D,GAAP;EAKD,CAxBD;;EA0BAL,EAAE,CAACW,IAAH,GAAU;EAERC,EAAAA,kBAAkB,EAAE,8BAAY;EAAA;;EAC9B,SAAK/G,QAAL,CAAcjB,EAAd,CAAiB,gBAAjB,EAAmC,UAAAxD,GAAG,EAAI;EAAE,MAAA,KAAI,CAACyL,gBAAL,CAAsBzL,GAAtB;EAA6B,KAAzE;EACA,SAAKyE,QAAL,CAAcjB,EAAd,CAAiB,eAAjB,EAAkCrI,KAAK,CAACgG,eAAxC,EAAyD,UAAAnB,GAAG,EAAI;EAAE,MAAA,KAAI,CAAC0L,cAAL,CAAoB1L,GAApB;EAA2B,KAA7F,EAF8B;;EAK9B,QAAI,UAAU,KAAKkD,OAAL,CAAaxB,SAA3B,EACE;EAEF,SAAKrG,OAAL,CAAaoB,YAAb,CAA0B,YAA1B,EAAwC,EAAxC;EACD,GAXO;EAaRmF,EAAAA,KAAK,EAAE,iBAAY;EACjB,SAAK+J,aAAL,GAAqB,IAArB;EAEA,QAAI,SAAS,KAAK9I,gBAAd,IAAkC,WAAW,KAAKK,OAAL,CAAatB,KAA9D,EACE,OAAO,IAAP;;EAEF,SAAK,IAAIpG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKoQ,MAAL,CAAY9P,MAAhC,EAAwCN,CAAC,EAAzC,EAA6C;EAC3C,UAAIqQ,KAAK,GAAG,KAAKD,MAAL,CAAYpQ,CAAZ,CAAZ;;EACA,UAAI,SAASqQ,KAAK,CAAChJ,gBAAf,IAAmCgJ,KAAK,CAAChJ,gBAAN,CAAuB/G,MAAvB,GAAgC,CAAnE,IAAwE,gBAAgB,OAAO+P,KAAK,CAAC3I,OAAN,CAAc4I,OAAjH,EAA0H;EACxH,aAAKH,aAAL,GAAqBE,KAAK,CAACpH,QAA3B;EACA,YAAI,YAAY,KAAKvB,OAAL,CAAatB,KAA7B,EACE;EACH;EACF;;EAED,QAAI,SAAS,KAAK+J,aAAlB,EACE,OAAO,IAAP;EAEF,WAAO,KAAKA,aAAL,CAAmB/J,KAAnB,EAAP;EACD,GAhCO;EAkCRmK,EAAAA,UAAU,EAAE,sBAAY;EACtB;EACA,SAAKtH,QAAL,CAAcZ,GAAd,CAAkB,UAAlB;EACD;EArCO,CAAV;EAyCA+G,EAAE,CAAC1I,KAAH,GAAW;EAET8J,EAAAA,SAAS,EAAE,qBAAY;EACrB,SAAKC,QAAL,GADqB;;;EAIrB,QAAI,CAAC,KAAKC,GAAV,EACE,OALmB;;EAQrB,QAAIC,IAAI,GAAGtB,WAAW,CAAC,KAAKhI,gBAAN,EAAwB,KAAKqJ,GAAL,CAASE,oBAAjC,CAAtB,CARqB;;EAWrB,SAAKF,GAAL,CAASE,oBAAT,GAAgC,KAAKvJ,gBAArC,CAXqB;;EAcrB,SAAKwJ,kBAAL,GAdqB;;;EAiBrB,SAAKC,qBAAL,CAA2BH,IAA3B,EAjBqB;;;EAoBrB,SAAKX,kBAAL,GApBqB;;;EAuBrB,QAAI,CAACW,IAAI,CAACjB,IAAL,CAAUpP,MAAV,IAAoBqQ,IAAI,CAAClB,KAAL,CAAWnP,MAAhC,KAA2C,CAAC,KAAKyQ,WAArD,EAAkE;EAChE,WAAKA,WAAL,GAAmB,IAAnB;;EACA,WAAKf,kBAAL;EACD;EACF,GA7BQ;EA+BT;EACAgB,EAAAA,iBAAiB,EAAE,6BAAY;EAC7B;EACA,QAAI,SAAS,KAAK3J,gBAAlB,EACE,OAAO,EAAP;EAEF,QAAIkF,QAAQ,GAAG,EAAf;;EAEA,SAAK,IAAIvM,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKqH,gBAAL,CAAsB/G,MAA1C,EAAkDN,CAAC,EAAnD;EACEuM,MAAAA,QAAQ,CAACtH,IAAT,CAAc,KAAKoC,gBAAL,CAAsBrH,CAAtB,EAAyBiR,YAAzB,IACb,KAAKC,gBAAL,CAAsB,KAAK7J,gBAAL,CAAsBrH,CAAtB,EAAyB6P,MAA/C,CADD;EADF;;EAIA,WAAOtD,QAAP;EACD,GA5CQ;EA8CT;EACA4E,EAAAA,QAAQ,EAAE,kBAAU1Q,IAAV,EAA4D;EAAA,mFAAJ,EAAI;EAAA,QAA3CiM,OAA2C,QAA3CA,OAA2C;EAAA,QAAlCmD,MAAkC,QAAlCA,MAAkC;EAAA,gCAA1BuB,WAA0B;EAAA,QAA1BA,WAA0B,iCAAZ,IAAY;;EACpE,SAAKX,QAAL;;EACA,SAAKY,SAAL,CAAe5Q,IAAf,EAAqB;EAACiM,MAAAA,OAAO,EAAPA,OAAD;EAAUmD,MAAAA,MAAM,EAANA;EAAV,KAArB;;EAEA,QAAIuB,WAAJ,EACE,KAAKE,WAAL;EACH,GArDQ;EAuDT;EACAC,EAAAA,WAAW,EAAE,qBAAU9Q,IAAV,EAA4D;EAAA,oFAAJ,EAAI;EAAA,QAA3CiM,OAA2C,SAA3CA,OAA2C;EAAA,QAAlCmD,MAAkC,SAAlCA,MAAkC;EAAA,kCAA1BuB,WAA0B;EAAA,QAA1BA,WAA0B,kCAAZ,IAAY;;EACvE,SAAKX,QAAL;;EACA,SAAKe,YAAL,CAAkB/Q,IAAlB,EAAwB;EAACiM,MAAAA,OAAO,EAAPA,OAAD;EAAUmD,MAAAA,MAAM,EAANA;EAAV,KAAxB;;EAEA,QAAIuB,WAAJ,EACE,KAAKE,WAAL;EACH,GA9DQ;EAgET;EACAG,EAAAA,WAAW,EAAE,qBAAUhR,IAAV,EAA2C;EAAA,oFAAJ,EAAI;EAAA,kCAA1B2Q,WAA0B;EAAA,QAA1BA,WAA0B,kCAAZ,IAAY;;EACtD,SAAKX,QAAL;;EACA,SAAKiB,YAAL,CAAkBjR,IAAlB,EAFsD;EAKtD;;;EACA,QAAI2Q,WAAJ,EACE,KAAKP,kBAAL;EACH,GAzEQ;EA2ETA,EAAAA,kBAAkB,EAAE,8BAAY;EAC9B,QAAI,KAAKc,cAAL,MAAyB,KAAKC,eAAL,EAAzB,IAAmD,SAAS,KAAKvK,gBAArE,EACE,KAAKwK,aAAL,GADF,KAEK,IAAI,KAAKxK,gBAAL,CAAsB/G,MAAtB,GAA+B,CAAnC,EACH,KAAKgR,WAAL,GADG,KAGH,KAAKQ,WAAL;EACH,GAlFQ;EAoFThB,EAAAA,qBAAqB,EAAE,+BAAUH,IAAV,EAAgB;EACrC,QAAI,gBAAgB,OAAO,KAAKjJ,OAAL,CAAaqK,sBAAxC,EACE,OAFmC;;EAKrC,QAAI,gBAAgB,OAAO,KAAKrK,OAAL,CAAauJ,YAAxC,EAAsD;EACpD,UAAKN,IAAI,CAAClB,KAAL,CAAWnP,MAAX,IAAqBqQ,IAAI,CAACjB,IAAL,CAAUpP,MAApC,EAA6C;EAC3C,aAAK0R,mBAAL;;EAEA,YAAI,MAAM,KAAKtB,GAAL,CAASuB,cAAT,CAAwBC,IAAxB,CAA6B,+BAA7B,EAA8D5R,MAAxE,EACE,KAAKoQ,GAAL,CAASuB,cAAT,CACGE,MADH,CAEI5N,CAAC,CAAC,KAAKmD,OAAL,CAAab,aAAd,CAAD,CACCuL,QADD,CACU,8BADV,CAFJ;;EAMF,aAAK1B,GAAL,CAAS2B,kBAAT,CAA4BzS,IAA5B,CAAiC,kBAAjC,EAAqD,KAAK8Q,GAAL,CAAS4B,eAA9D;;EAEA,eAAO,KAAK5B,GAAL,CAASuB,cAAT,CACJG,QADI,CACK,QADL,EAEJxS,IAFI,CAEC,aAFD,EAEgB,OAFhB,EAGJsS,IAHI,CAGC,+BAHD,EAIJK,IAJI,CAIC,KAAK7K,OAAL,CAAauJ,YAJd,CAAP;EAKD;;EAED,WAAKP,GAAL,CAAS2B,kBAAT,CAA4BG,UAA5B,CAAuC,kBAAvC;;EAEA,aAAO,KAAK9B,GAAL,CAASuB,cAAT,CACJQ,WADI,CACQ,QADR,EAEJ7S,IAFI,CAEC,aAFD,EAEgB,MAFhB,EAGJsS,IAHI,CAGC,+BAHD,EAIJtN,MAJI,EAAP;EAKD,KAhCoC;;;EAmCrC,SAAK,IAAI5E,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG2Q,IAAI,CAACb,OAAL,CAAaxP,MAAjC,EAAyCN,CAAC,EAA1C;EACE,WAAK0R,YAAL,CAAkBf,IAAI,CAACb,OAAL,CAAa9P,CAAb,EAAgB6P,MAAhB,CAAuBpP,IAAzC;EADF;;EAGA,SAAKT,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2Q,IAAI,CAAClB,KAAL,CAAWnP,MAA3B,EAAmCN,CAAC,EAApC;EACE,WAAKqR,SAAL,CAAeV,IAAI,CAAClB,KAAL,CAAWzP,CAAX,EAAc6P,MAAd,CAAqBpP,IAApC,EAA0C;EAACiM,QAAAA,OAAO,EAAEiE,IAAI,CAAClB,KAAL,CAAWzP,CAAX,EAAciR,YAAxB;EAAsCpB,QAAAA,MAAM,EAAEc,IAAI,CAAClB,KAAL,CAAWzP,CAAX,EAAc6P;EAA5D,OAA1C;EADF;;EAGA,SAAK7P,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG2Q,IAAI,CAACjB,IAAL,CAAUpP,MAA1B,EAAkCN,CAAC,EAAnC;EACE,WAAKwR,YAAL,CAAkBb,IAAI,CAACjB,IAAL,CAAU1P,CAAV,EAAa6P,MAAb,CAAoBpP,IAAtC,EAA4C;EAACiM,QAAAA,OAAO,EAAEiE,IAAI,CAACjB,IAAL,CAAU1P,CAAV,EAAaiR,YAAvB;EAAqCpB,QAAAA,MAAM,EAAEc,IAAI,CAACjB,IAAL,CAAU1P,CAAV,EAAa6P;EAA1D,OAA5C;EADF;EAED,GA/HQ;EAkITwB,EAAAA,SAAS,EAAE,mBAAU5Q,IAAV,SAAmC;EAAA,QAAlBiM,OAAkB,SAAlBA,OAAkB;EAAA,QAATmD,MAAS,SAATA,MAAS;;EAC5C,SAAKmC,mBAAL;;EACA,SAAKtB,GAAL,CAAS2B,kBAAT,CACGzS,IADH,CACQ,kBADR,EAC4B,KAAK8Q,GAAL,CAAS4B,eADrC;;EAEA,SAAK5B,GAAL,CAASuB,cAAT,CACGG,QADH,CACY,QADZ,EAEGxS,IAFH,CAEQ,aAFR,EAEuB,OAFvB,EAGGuS,MAHH,CAII5N,CAAC,CAAC,KAAKmD,OAAL,CAAab,aAAd,CAAD,CACCuL,QADD,CACU,aAAa3R,IADvB,EAEC8R,IAFD,CAEM7F,OAAO,IAAI,KAAKwE,gBAAL,CAAsBrB,MAAtB,CAFjB,CAJJ;EAQD,GA9IQ;EAgJT2B,EAAAA,YAAY,EAAE,sBAAU/Q,IAAV,SAAmC;EAAA,QAAlBiM,OAAkB,SAAlBA,OAAkB;EAAA,QAATmD,MAAS,SAATA,MAAS;;EAC/C,SAAKa,GAAL,CAASuB,cAAT,CACGG,QADH,CACY,QADZ,EAEGF,IAFH,CAEQ,cAAczR,IAFtB,EAGG8R,IAHH,CAGQ7F,OAAO,IAAI,KAAKwE,gBAAL,CAAsBrB,MAAtB,CAHnB;EAID,GArJQ;EAuJT6B,EAAAA,YAAY,EAAE,sBAAUjR,IAAV,EAAgB;EAC5B,SAAKiQ,GAAL,CAAS2B,kBAAT,CACGG,UADH,CACc,kBADd;;EAEA,SAAK9B,GAAL,CAASuB,cAAT,CACGQ,WADH,CACe,QADf,EAEG7S,IAFH,CAEQ,aAFR,EAEuB,MAFvB,EAGGsS,IAHH,CAGQ,cAAczR,IAHtB,EAIGmE,MAJH;EAKD,GA/JQ;EAiKTsM,EAAAA,gBAAgB,EAAE,0BAAU7D,UAAV,EAAsB;EACtC,QAAIqF,4BAA4B,GAAGrF,UAAU,CAAC5M,IAAX,GAAkB,SAArD;EAEA,QAAI,gBAAgB,OAAO,KAAKiH,OAAL,CAAagL,4BAAb,CAA3B,EACE,OAAOtQ,MAAM,CAACgK,OAAP,CAAemB,aAAf,CAA6B,KAAK7F,OAAL,CAAagL,4BAAb,CAA7B,EAAyErF,UAAU,CAAC5C,YAApF,CAAP;EAEF,WAAOrI,MAAM,CAACgK,OAAP,CAAegB,eAAf,CAA+BC,UAA/B,CAAP;EACD,GAxKQ;EA0KToD,EAAAA,QAAQ,EAAE,oBAAY;EACpB;EACA,QAAI,KAAKC,GAAL,IAAY,UAAU,KAAKhJ,OAAL,CAAaxB,SAAvC,EACE;EAEF,QAAIwK,GAAG,GAAG,EAAV,CALoB;;EAQpB,SAAK7Q,OAAL,CAAaoB,YAAb,CAA0B,KAAKyG,OAAL,CAAa5H,SAAb,GAAyB,IAAnD,EAAyD,KAAKiH,MAA9D;EAEA;EACA;;EACA2J,IAAAA,GAAG,CAAC2B,kBAAJ,GAAyB,KAAKM,mBAAL,EAAzB,CAZoB;;EAepBjC,IAAAA,GAAG,CAAC4B,eAAJ,GAAsB,iBAAiB,KAAK5K,OAAL,CAAa1B,QAAb,GAAwB,cAAc,KAAK0B,OAAL,CAAa1B,QAAnD,GAA8D,KAAKe,MAApF,CAAtB;EACA2J,IAAAA,GAAG,CAACuB,cAAJ,GAAqB1N,CAAC,CAAC,KAAKmD,OAAL,CAAad,aAAd,CAAD,CAA8BhH,IAA9B,CAAmC,IAAnC,EAAyC8Q,GAAG,CAAC4B,eAA7C,CAArB,CAhBoB;;EAmBpB5B,IAAAA,GAAG,CAACE,oBAAJ,GAA2B,EAA3B;EACAF,IAAAA,GAAG,CAACkC,4BAAJ,GAAmC,KAAnC,CApBoB;;EAuBpB,SAAKlC,GAAL,GAAWA,GAAX;EACD,GAlMQ;EAoMT;EACAiC,EAAAA,mBAAmB,EAAE,+BAAY;EAC/B;EACA,QAAI,aAAa,OAAO,KAAKjL,OAAL,CAAajB,YAAjC,IAAiDlC,CAAC,CAAC,KAAKmD,OAAL,CAAajB,YAAd,CAAD,CAA6BnG,MAAlF,EACE,OAAOiE,CAAC,CAAC,KAAKmD,OAAL,CAAajB,YAAd,CAAR,CAH6B;;EAM/B,QAAIoM,gBAAgB,GAAG,KAAKnL,OAAL,CAAajB,YAApC,CAN+B;;EAS/B,QAAI,aAAa,OAAO,KAAKiB,OAAL,CAAajB,YAAjC,IAAiD,eAAe,OAAOrE,MAAM,CAAC,KAAKsF,OAAL,CAAajB,YAAd,CAAjF,EACEoM,gBAAgB,GAAGzQ,MAAM,CAAC,KAAKsF,OAAL,CAAajB,YAAd,CAAzB;;EAEF,QAAI,eAAe,OAAOoM,gBAA1B,EAA4C;EAC1C,UAAIC,QAAQ,GAAGD,gBAAgB,CAAClK,IAAjB,CAAsB,IAAtB,EAA4B,IAA5B,CAAf,CAD0C;;EAI1C,UAAI,gBAAgB,OAAOmK,QAAvB,IAAmCA,QAAQ,CAACxS,MAAhD,EACE,OAAOwS,QAAP;EACH,KAND,MAMO,IAAI,qBAAoBD,gBAApB,KAAwCA,gBAAgB,YAAYE,MAApE,IAA8EF,gBAAgB,CAACvS,MAAnG,EAA2G;EAChH,aAAOuS,gBAAP;EACD,KAFM,MAEA,IAAIA,gBAAJ,EAAsB;EAC3BlT,MAAAA,KAAK,CAACwC,IAAN,CAAW,wBAAwB0Q,gBAAxB,GAA2C,qDAAtD;EACD;;EAED,WAAO,KAAKG,YAAL,EAAP;EACD,GA9NQ;EAgOTA,EAAAA,YAAY,EAAE,wBAAW;EACvB;EACA,QAAI,CAAC,KAAKtL,OAAL,CAAa1B,QAAd,IAA0B,KAAKnG,OAAL,CAAaoT,QAAb,KAA0B,QAAxD,EACE,OAAO,KAAKhK,QAAZ,CAHqB;;EAMvB,WAAO,KAAKA,QAAL,CAAcrB,MAAd,EAAP;EACD,GAvOQ;EAyOToK,EAAAA,mBAAmB,EAAE,+BAAY;EAC/B,QAAIkB,gBAAgB,GAAG,KAAKxL,OAAL,CAAaf,eAApC,CAD+B;;EAI/B,QAAI,MAAM,KAAK+J,GAAL,CAASuB,cAAT,CAAwBrK,MAAxB,GAAiCtH,MAA3C,EACE,OAAO,KAAKoQ,GAAL,CAASuB,cAAT,CAAwBrK,MAAxB,EAAP;;EAEF,QAAI,aAAa,OAAOsL,gBAAxB,EAA0C;EACxC,UAAI3O,CAAC,CAAC2O,gBAAD,CAAD,CAAoB5S,MAAxB,EACE,OAAOiE,CAAC,CAAC2O,gBAAD,CAAD,CAAoBf,MAApB,CAA2B,KAAKzB,GAAL,CAASuB,cAApC,CAAP,CADF,KAEK,IAAI,eAAe,OAAO7P,MAAM,CAAC8Q,gBAAD,CAAhC,EACHA,gBAAgB,GAAG9Q,MAAM,CAAC8Q,gBAAD,CAAzB,CADG,KAGHvT,KAAK,CAACwC,IAAN,CAAW,2BAA2B+Q,gBAA3B,GAA8C,qDAAzD;EACH;;EAED,QAAI,eAAe,OAAOA,gBAA1B,EACEA,gBAAgB,GAAGA,gBAAgB,CAACvK,IAAjB,CAAsB,IAAtB,EAA4B,IAA5B,CAAnB;EAEF,QAAI,qBAAoBuK,gBAApB,KAAwCA,gBAAgB,CAAC5S,MAA7D,EACE,OAAO4S,gBAAgB,CAACf,MAAjB,CAAwB,KAAKzB,GAAL,CAASuB,cAAjC,CAAP;EAEF,WAAO,KAAKe,YAAL,GAAoBG,KAApB,CAA0B,KAAKzC,GAAL,CAASuB,cAAnC,CAAP;EACD,GAhQQ;EAkQTjC,EAAAA,kBAAkB,EAAE,8BAAY;EAAA;;EAC9B,QAAIoD,OAAO,GAAG,KAAKrK,YAAL,EAAd;;EACA,QAAI1C,OAAJ,CAF8B;;EAK9B+M,IAAAA,OAAO,CAAC/K,GAAR,CAAY,UAAZ;EACA,QAAI,KAAK0I,WAAT,EACEqC,OAAO,CAACpL,EAAR,CAAWrI,KAAK,CAACyE,eAAN,CAAsB,KAAKsD,OAAL,CAAapB,mBAAnC,EAAwD,SAAxD,CAAX,EAA+E,YAAM;EACnF,MAAA,MAAI,CAAC+M,iBAAL;EACD,KAFD,EADF,KAIK,IAAIhN,OAAO,GAAG1G,KAAK,CAACyE,eAAN,CAAsB,KAAKsD,OAAL,CAAarB,OAAnC,EAA4C,SAA5C,CAAd,EAAsE;EACzE+M,MAAAA,OAAO,CAACpL,EAAR,CAAW3B,OAAX,EAAoB,UAAAiN,KAAK,EAAI;EAC3B,QAAA,MAAI,CAACD,iBAAL,CAAuBC,KAAvB;EACD,OAFD;EAGD;EACF,GAjRQ;EAmRTD,EAAAA,iBAAiB,EAAE,2BAAUC,KAAV,EAAiB;EAAA;;EAClC;EACA;EACA;EACA,QAAIA,KAAK,IAAI,YAAY9S,IAAZ,CAAiB8S,KAAK,CAAC5I,IAAvB,CAAb,EACE,IAAI,EAAE,KAAKgG,GAAL,IAAY,KAAKA,GAAL,CAASkC,4BAAvB,KAAwD,KAAKW,QAAL,GAAgBjT,MAAhB,IAA0B,KAAKoH,OAAL,CAAavB,mBAAnG,EACE;;EAEJ,QAAI,KAAKuB,OAAL,CAAa8L,QAAjB,EAA2B;EACzBpR,MAAAA,MAAM,CAACqR,YAAP,CAAoB,KAAKC,UAAzB;EACA,WAAKA,UAAL,GAAkBtR,MAAM,CAACuR,UAAP,CAAkB;EAAA,eAAM,MAAI,CAAC7J,QAAL,EAAN;EAAA,OAAlB,EAAyC,KAAKpC,OAAL,CAAa8L,QAAtD,CAAlB;EACD,KAHD,MAIE,KAAK1J,QAAL;EACH,GAhSQ;EAkST8J,EAAAA,QAAQ,EAAE,oBAAY;EACpB;EACA,SAAK7C,WAAL,GAAmB,KAAnB;;EACA,SAAKf,kBAAL,GAHoB;;;EAMpB,QAAI,gBAAgB,OAAO,KAAKU,GAAhC,EACE,OAPkB;;EAUpB,SAAKA,GAAL,CAASuB,cAAT,CACGQ,WADH,CACe,QADf,EAEGoB,QAFH,GAGGjP,MAHH,GAVoB;;;EAgBpB,SAAKkN,WAAL,GAhBoB;;;EAmBpB,SAAKpB,GAAL,CAASE,oBAAT,GAAgC,EAAhC;EACA,SAAKF,GAAL,CAASkC,4BAAT,GAAwC,KAAxC;EACD,GAvTQ;EAyTTrC,EAAAA,UAAU,EAAE,sBAAY;EACtB,SAAKqD,QAAL;;EAEA,QAAI,gBAAgB,OAAO,KAAKlD,GAAhC,EACE,KAAKA,GAAL,CAASuB,cAAT,CAAwBrN,MAAxB;EAEF,WAAO,KAAK8L,GAAZ;EACD,GAhUQ;EAkUTmB,EAAAA,aAAa,EAAE,yBAAY;EACzB,SAAKnB,GAAL,CAASkC,4BAAT,GAAwC,IAAxC;;EACA,SAAKlC,GAAL,CAAS2B,kBAAT,CAA4BI,WAA5B,CAAwC,KAAK/K,OAAL,CAAanB,UAArD,EAAiE6L,QAAjE,CAA0E,KAAK1K,OAAL,CAAalB,YAAvF;EACD,GArUQ;EAsUT8K,EAAAA,WAAW,EAAE,uBAAY;EACvB,SAAKZ,GAAL,CAASkC,4BAAT,GAAwC,IAAxC;;EACA,SAAKlC,GAAL,CAAS2B,kBAAT,CAA4BI,WAA5B,CAAwC,KAAK/K,OAAL,CAAalB,YAArD,EAAmE4L,QAAnE,CAA4E,KAAK1K,OAAL,CAAanB,UAAzF;EACD,GAzUQ;EA0UTuL,EAAAA,WAAW,EAAE,uBAAY;EACvB,SAAKpB,GAAL,CAAS2B,kBAAT,CAA4BI,WAA5B,CAAwC,KAAK/K,OAAL,CAAalB,YAArD,EAAmEiM,WAAnE,CAA+E,KAAK/K,OAAL,CAAanB,UAA5F;EACD;EA5UQ,CAAX;;ECpEA,IAAIwJ,IAAI,GAAG,SAAPA,IAAO,CAAUlQ,OAAV,EAAmB8H,UAAnB,EAA+BD,OAA/B,EAAwC;EACjD,OAAKsD,SAAL,GAAiB,MAAjB;EAEA,OAAKnL,OAAL,GAAeA,OAAf;EACA,OAAKoJ,QAAL,GAAgB1E,CAAC,CAAC1E,OAAD,CAAjB;EACA,OAAK8H,UAAL,GAAkBA,UAAlB;EACA,OAAKD,OAAL,GAAeA,OAAf;EACA,OAAKE,MAAL,GAAcxF,MAAM,CAACgK,OAArB;EAEA,OAAKgE,MAAL,GAAc,EAAd;EACA,OAAK/I,gBAAL,GAAwB,IAAxB;EACD,CAXD;;EAaA,IAAIyM,aAAa,GAAG;EAACC,EAAAA,OAAO,EAAE,IAAV;EAAgBC,EAAAA,QAAQ,EAAE,IAA1B;EAAgCC,EAAAA,QAAQ,EAAE;EAA1C,CAApB;EAEAlE,IAAI,CAACvK,SAAL,GAAiB;EACfyK,EAAAA,gBAAgB,EAAE,0BAAUqD,KAAV,EAAiB;EAAA;;EACjC;EACA,QAAI,SAASA,KAAK,CAACY,OAAnB,EACE,OAH+B;;EAMjC,QAAIC,YAAY,GAAG,KAAKC,aAAL,IAAsB,KAAKnL,QAAL,CAAciJ,IAAd,CAAmBvS,KAAK,CAACgG,eAAzB,EAA0C,CAA1C,CAAzC;EACA,SAAKyO,aAAL,GAAqB,IAArB;EACA,SAAKnL,QAAL,CAAciJ,IAAd,CAAmB,kCAAnB,EAAuDmC,IAAvD,CAA4D,UAA5D,EAAwE,IAAxE;EACA,QAAIF,YAAY,IAAI,SAASA,YAAY,CAAC9S,YAAb,CAA0B,gBAA1B,CAA7B,EACE;EAEFe,IAAAA,MAAM,CAACgK,OAAP,CAAekI,YAAf,GAA8B,EAA9B;EAEA,QAAI9M,OAAO,GAAG,KAAK+M,YAAL,CAAkB;EAACjB,MAAAA,KAAK,EAALA;EAAD,KAAlB,CAAd;;EAEA,QAAI,eAAe9L,OAAO,CAACgN,KAAR,EAAf,IAAkC,UAAU,KAAKC,QAAL,CAAc,QAAd,CAAhD,EAAyE,CAAzE,MAGO;EACL;EACAnB,MAAAA,KAAK,CAACoB,wBAAN;EACApB,MAAAA,KAAK,CAACqB,cAAN;EACA,UAAI,cAAcnN,OAAO,CAACgN,KAAR,EAAlB,EACEhN,OAAO,CAACoN,IAAR,CAAa,YAAM;EAAE,QAAA,KAAI,CAACC,OAAL,CAAaV,YAAb;EAA6B,OAAlD;EACH;EACF,GA3Bc;EA6BfjE,EAAAA,cAAc,EAAE,wBAASoD,KAAT,EAAgB;EAC9B,SAAKc,aAAL,GAAqBd,KAAK,CAACwB,aAA3B;EACD,GA/Bc;EAgCf;EACA;EACA;EACAD,EAAAA,OAAO,EAAE,iBAAUV,YAAV,EAAwB;EAC/B,QAAI,UAAU,KAAKM,QAAL,CAAc,QAAd,CAAd,EACE,OAF6B;;EAI/B,QAAIN,YAAJ,EAAkB;EAChB,UAAIY,UAAU,GAAG,KAAK9L,QAAL,CAAciJ,IAAd,CAAmB,kCAAnB,EAAuDmC,IAAvD,CAA4D,UAA5D,EAAwE,KAAxE,CAAjB;EACA,UAAI,MAAMU,UAAU,CAACzU,MAArB,EACEyU,UAAU,GAAGxQ,CAAC,CAAC,+DAAD,CAAD,CAAmEyQ,QAAnE,CAA4E,KAAK/L,QAAjF,CAAb;EACF8L,MAAAA,UAAU,CAACnV,IAAX,CAAgB;EACda,QAAAA,IAAI,EAAE0T,YAAY,CAAC9S,YAAb,CAA0B,MAA1B,CADQ;EAEdR,QAAAA,KAAK,EAAEsT,YAAY,CAAC9S,YAAb,CAA0B,OAA1B;EAFO,OAAhB;EAID;;EAED,SAAK4H,QAAL,CAAc5C,OAAd,CAAsB,SAAc9B,CAAC,CAAC0Q,KAAF,CAAQ,QAAR,CAAd,EAAiC;EAACf,MAAAA,OAAO,EAAE;EAAV,KAAjC,CAAtB;EACD,GAlDc;EAoDf;EACA;EACA;EACA;EACA;EACApK,EAAAA,QAAQ,EAAE,kBAAUpC,OAAV,EAAmB;EAC3B,QAAIpF,SAAS,CAAChC,MAAV,IAAoB,CAApB,IAAyB,CAACiE,CAAC,CAACoG,aAAF,CAAgBjD,OAAhB,CAA9B,EAAwD;EACtD/H,MAAAA,KAAK,CAAC4C,QAAN,CAAe,0FAAf;;EADsD,kDAE1BD,SAF0B;EAAA,UAEjD2D,KAFiD;EAAA,UAE1C4C,KAF0C;EAAA,UAEnCyK,KAFmC;;EAGtD5L,MAAAA,OAAO,GAAG;EAACzB,QAAAA,KAAK,EAALA,KAAD;EAAQ4C,QAAAA,KAAK,EAALA,KAAR;EAAeyK,QAAAA,KAAK,EAALA;EAAf,OAAV;EACD;;EACD,WAAOQ,aAAa,CAAE,KAAKS,YAAL,CAAkB7M,OAAlB,EAA2B8M,KAA3B,EAAF,CAApB;EACD,GAhEc;EAkEfD,EAAAA,YAAY,EAAE,wBAAsC;EAAA;EAAA;;EAAA,mFAAJ,EAAI;EAAA,QAA3BtO,KAA2B,QAA3BA,KAA2B;EAAA,QAApB4C,KAAoB,QAApBA,KAAoB;EAAA,QAAbyK,KAAa,QAAbA,KAAa;;EAClD,SAAK4B,WAAL,GAAmB5B,KAAnB;;EACA,QAAIA,KAAJ,EAAW;EACT,WAAK4B,WAAL,GAAmB,SAAc,EAAd,EAAkB5B,KAAlB,EAAyB;EAACqB,QAAAA,cAAc,EAAE,0BAAM;EACjEhV,UAAAA,KAAK,CAAC4C,QAAN,CAAe,wGAAf;EACA,UAAA,MAAI,CAAC8E,gBAAL,GAAwB,KAAxB;EACD;EAH2C,OAAzB,CAAnB;EAID;;EACD,SAAKA,gBAAL,GAAwB,IAAxB,CARkD;;EAWlD,SAAKoN,QAAL,CAAc,UAAd,EAXkD;;;EAclD,SAAKU,cAAL;;EAEA,QAAIhQ,QAAQ,GAAG,KAAKiQ,gCAAL,CAAsC,YAAM;EACzD,aAAO7Q,CAAC,CAACzB,GAAF,CAAM,MAAI,CAACsN,MAAX,EAAmB,UAAAC,KAAK;EAAA,eAAIA,KAAK,CAACkE,YAAN,CAAmB;EAAC1L,UAAAA,KAAK,EAALA,KAAD;EAAQ5C,UAAAA,KAAK,EAALA;EAAR,SAAnB,CAAJ;EAAA,OAAxB,CAAP;EACD,KAFc,CAAf;;EAIA,WAAO,yBAAAtG,KAAK,CAACuF,GAAN,CAAUC,QAAV,EACJyP,IADI,CACG,YAAM;EAAE,MAAA,MAAI,CAACH,QAAL,CAAc,SAAd;EAA2B,KADtC,EAEJY,IAFI,CAEG,YAAM;EACZ,MAAA,MAAI,CAAChO,gBAAL,GAAwB,KAAxB;;EACA,MAAA,MAAI,CAACjB,KAAL;;EACA,MAAA,MAAI,CAACqO,QAAL,CAAc,OAAd;EACD,KANI,EAOJa,MAPI,CAOG,YAAM;EAAE,MAAA,MAAI,CAACb,QAAL,CAAc,WAAd;EAA6B,KAPxC,GAQJvN,IARI,iDAQI,KAAKD,gCAAL,EARJ,EAAP;EASD,GA/Fc;EAiGf;EACA;EACA;EACA;EACAsO,EAAAA,OAAO,EAAE,iBAAU7N,OAAV,EAAmB;EAC1B,QAAIpF,SAAS,CAAChC,MAAV,IAAoB,CAApB,IAAyB,CAACiE,CAAC,CAACoG,aAAF,CAAgBjD,OAAhB,CAA9B,EAAwD;EACtD/H,MAAAA,KAAK,CAAC4C,QAAN,CAAe,yFAAf;;EADsD,mDAEjCD,SAFiC;EAAA,UAEjD2D,KAFiD;EAAA,UAE1C4C,KAF0C;;EAGtDnB,MAAAA,OAAO,GAAG;EAACzB,QAAAA,KAAK,EAALA,KAAD;EAAQ4C,QAAAA,KAAK,EAALA;EAAR,OAAV;EACD;;EACD,WAAOiL,aAAa,CAAE,KAAKhL,SAAL,CAAepB,OAAf,EAAwB8M,KAAxB,EAAF,CAApB;EACD,GA5Gc;EA8Gf;EACA;EACA;EACA1L,EAAAA,SAAS,EAAE,qBAA+B;EAAA;;EAAA,oFAAJ,EAAI;EAAA,QAApB7C,KAAoB,SAApBA,KAAoB;EAAA,QAAb4C,KAAa,SAAbA,KAAa;;EACxC,SAAKsM,cAAL;;EAEA,QAAIhQ,QAAQ,GAAG,KAAKiQ,gCAAL,CAAsC,YAAM;EACzD,aAAO7Q,CAAC,CAACzB,GAAF,CAAM,MAAI,CAACsN,MAAX,EAAmB,UAAAC,KAAK;EAAA,eAAIA,KAAK,CAACvH,SAAN,CAAgB;EAAC7C,UAAAA,KAAK,EAALA,KAAD;EAAQ4C,UAAAA,KAAK,EAALA;EAAR,SAAhB,CAAJ;EAAA,OAAxB,CAAP;EACD,KAFc,CAAf;;EAGA,WAAOlJ,KAAK,CAACuF,GAAN,CAAUC,QAAV,CAAP;EACD,GAxHc;EA0HfqQ,EAAAA,OAAO,EAAE,mBAAW;EAClB,SAAKL,cAAL;;EACA,WAAO,IAAP;EACD,GA7Hc;EA+Hf;EACAM,EAAAA,KAAK,EAAE,iBAAY;EACjB;EACA,SAAK,IAAIzV,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKoQ,MAAL,CAAY9P,MAAhC,EAAwCN,CAAC,EAAzC;EACE,WAAKoQ,MAAL,CAAYpQ,CAAZ,EAAeyV,KAAf;EADF;;EAGA,SAAKhB,QAAL,CAAc,OAAd;EACD,GAtIc;EAwIf;EACAiB,EAAAA,OAAO,EAAE,mBAAY;EACnB;EACA,SAAKnF,UAAL,GAFmB;;;EAKnB,SAAK,IAAIvQ,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKoQ,MAAL,CAAY9P,MAAhC,EAAwCN,CAAC,EAAzC;EACE,WAAKoQ,MAAL,CAAYpQ,CAAZ,EAAe0V,OAAf;EADF;;EAGA,SAAKzM,QAAL,CAAc0M,UAAd,CAAyB,SAAzB;;EACA,SAAKlB,QAAL,CAAc,SAAd;EACD,GAnJc;EAqJfU,EAAAA,cAAc,EAAE,0BAAY;EAC1B,WAAO,KAAK1N,gBAAL,GAAwBmO,WAAxB,EAAP;EACD,GAvJc;EAyJfA,EAAAA,WAAW,EAAE,uBAAY;EAAA;;EACvB,QAAIC,SAAS,GAAG,KAAKzF,MAArB;EAEA,SAAKA,MAAL,GAAc,EAAd;EACA,SAAK0F,gBAAL,GAAwB,EAAxB;;EAEA,SAAKV,gCAAL,CAAsC,YAAM;EAC1C,MAAA,MAAI,CAACnM,QAAL,CACCiJ,IADD,CACM,MAAI,CAACxK,OAAL,CAAa7B,MADnB,EAECkQ,GAFD,CAEK,MAAI,CAACrO,OAAL,CAAa5B,QAFlB,EAGCiQ,GAHD,YAGS,MAAI,CAACrO,OAAL,CAAa5H,SAHtB,qBAICgF,IAJD,CAIM,UAAC7B,CAAD,EAAIpD,OAAJ,EAAgB;EACpB,YAAImW,aAAa,GAAG,IAAI5T,MAAM,CAACgK,OAAP,CAAe6J,OAAnB,CAA2BpW,OAA3B,EAAoC,EAApC,EAAwC,MAAxC,CAApB,CADoB;;EAIpB,YAAI,YAAYmW,aAAa,CAAChL,SAA1B,IAAuC,oBAAoBgL,aAAa,CAAChL,SAA7E,EAAwF;EACtF,cAAIkL,QAAQ,GAAGF,aAAa,CAAChL,SAAd,GAA0B,GAA1B,GAAgCgL,aAAa,CAACjP,MAA7D;;EACA,cAAI,gBAAgB,OAAO,MAAI,CAAC+O,gBAAL,CAAsBI,QAAtB,CAA3B,EAA4D;EAC1D,YAAA,MAAI,CAACJ,gBAAL,CAAsBI,QAAtB,IAAkCF,aAAlC;;EACA,YAAA,MAAI,CAAC5F,MAAL,CAAYnL,IAAZ,CAAiB+Q,aAAjB;EACD;EACF;EACF,OAfD;;EAiBAzR,MAAAA,CAAC,CAACO,IAAF,CAAOnF,KAAK,CAAC+E,UAAN,CAAiBmR,SAAjB,EAA4B,MAAI,CAACzF,MAAjC,CAAP,EAAiD,UAACnN,CAAD,EAAIoN,KAAJ,EAAc;EAC7DA,QAAAA,KAAK,CAACoF,KAAN;EACD,OAFD;EAGD,KArBD;;EAsBA,WAAO,IAAP;EACD,GAtLc;EAwLf;EACA;EACA;EACA;EACA;EACA;EACA;EACAL,EAAAA,gCAAgC,EAAE,0CAAUnN,EAAV,EAAc;EAC9C,QAAIkO,mBAAmB,GAAG,KAAK1O,gBAA/B;;EACA,SAAKA,gBAAL,GAAwB,YAAY;EAAE,aAAO,IAAP;EAAc,KAApD;;EACA,QAAI5C,MAAM,GAAGoD,EAAE,EAAf;EACA,SAAKR,gBAAL,GAAwB0O,mBAAxB;EACA,WAAOtR,MAAP;EACD,GArMc;EAuMf;EACA;EACA;EACA4P,EAAAA,QAAQ,EAAE,kBAAU2B,SAAV,EAAqB;EAC7B,WAAO,KAAK/P,OAAL,CAAa,UAAU+P,SAAvB,CAAP;EACD;EA5Mc,CAAjB;;EChBA,IAAMC,UAAU,GAAG,SAAbA,UAAa,CAASC,YAAT,EAAuB7V,IAAvB,EAA6BgK,YAA7B,EAA2CG,QAA3C,EAAqD2L,eAArD,EAAsE;EACvF,MAAMC,aAAa,GAAGpU,MAAM,CAACgK,OAAP,CAAeqK,kBAAf,CAAkC3L,UAAlC,CAA6CrK,IAA7C,CAAtB;EACA,MAAM0M,SAAS,GAAG,IAAIxD,SAAJ,CAAc6M,aAAd,CAAlB;EACA5L,EAAAA,QAAQ,GAAGA,QAAQ,IAAI0L,YAAY,CAAC5O,OAAb,CAAqBjH,IAAI,GAAG,UAA5B,CAAZ,IAAuD0M,SAAS,CAACvC,QAA5E;EACA2L,EAAAA,eAAe,GAAI,SAASA,eAA5B;;EAEA,WAAc,IAAd,EAAoB;EAClBpJ,IAAAA,SAAS,EAATA,SADkB;EAElB1M,IAAAA,IAAI,EAAJA,IAFkB;EAGlBgK,IAAAA,YAAY,EAAZA,YAHkB;EAIlBG,IAAAA,QAAQ,EAARA,QAJkB;EAKlB2L,IAAAA,eAAe,EAAfA;EALkB,GAApB;;EAOA,OAAKG,kBAAL,CAAwBJ,YAAY,CAAC5O,OAArC;EACD,CAdD;;EAgBA,IAAMiP,UAAU,GAAG,SAAbA,UAAa,CAAS9U,GAAT,EAAc;EAC/B,MAAM+U,GAAG,GAAG/U,GAAG,CAAC,CAAD,CAAH,CAAOI,WAAP,EAAZ;EACA,SAAO2U,GAAG,GAAG/U,GAAG,CAAClB,KAAJ,CAAU,CAAV,CAAb;EACD,CAHD;;EAKA0V,UAAU,CAAC7Q,SAAX,GAAuB;EACrBsE,EAAAA,QAAQ,EAAE,kBAASjJ,KAAT,EAAgBsJ,QAAhB,EAA0B;EAAA;;EAClC,WAAO,wBAAKgD,SAAL,EAAerD,QAAf,yBAAwBjJ,KAAxB,4BAAkC,KAAKgW,eAAvC,IAAwD1M,QAAxD,GAAP;EACD,GAHoB;EAKrBuM,EAAAA,kBAAkB,EAAE,4BAAShP,OAAT,EAAkB;EAAA;;EACpC,SAAKmP,eAAL,GAAuB,KAAK1J,SAAL,CAAe3C,iBAAf,CAAiC,KAAKC,YAAtC,EACrB,UAAAf,GAAG;EAAA,aAAIhC,OAAO,CAAC,KAAI,CAACjH,IAAL,GAAYkW,UAAU,CAACjN,GAAD,CAAvB,CAAX;EAAA,KADkB,CAAvB;EAGD;EAToB,CAAvB;;ECnBA,IAAIhD,KAAK,GAAG,SAARA,KAAQ,CAAU2J,KAAV,EAAiB1I,UAAjB,EAA6BD,OAA7B,EAAsCoP,mBAAtC,EAA2D;EACrE,OAAK9L,SAAL,GAAiB,OAAjB;EAEA,OAAKnL,OAAL,GAAewQ,KAAf;EACA,OAAKpH,QAAL,GAAgB1E,CAAC,CAAC8L,KAAD,CAAjB,CAJqE;;EAOrE,MAAI,gBAAgB,OAAOyG,mBAA3B,EAAgD;EAC9C,SAAKlP,MAAL,GAAckP,mBAAd;EACD;;EAED,OAAKpP,OAAL,GAAeA,OAAf;EACA,OAAKC,UAAL,GAAkBA,UAAlB,CAZqE;;EAerE,OAAKoP,WAAL,GAAmB,EAAnB;EACA,OAAKC,iBAAL,GAAyB,EAAzB;EACA,OAAK3P,gBAAL,GAAwB,IAAxB,CAjBqE;;EAoBrE,OAAK4P,gBAAL;EACD,CArBD;;EAuBA,IAAInD,eAAa,GAAG;EAACC,EAAAA,OAAO,EAAE,IAAV;EAAgBC,EAAAA,QAAQ,EAAE,IAA1B;EAAgCC,EAAAA,QAAQ,EAAE;EAA1C,CAApB;EAEAvN,KAAK,CAAClB,SAAN,GAAkB;EAChB;EACA;EACA;EACA;EACAsE,EAAAA,QAAQ,EAAE,kBAAUpC,OAAV,EAAmB;EAC3B,QAAIpF,SAAS,CAAChC,MAAV,IAAoB,CAApB,IAAyB,CAACiE,CAAC,CAACoG,aAAF,CAAgBjD,OAAhB,CAA9B,EAAwD;EACtD/H,MAAAA,KAAK,CAAC4C,QAAN,CAAe,2FAAf;EACAmF,MAAAA,OAAO,GAAG;EAACA,QAAAA,OAAO,EAAPA;EAAD,OAAV;EACD;;EACD,QAAIF,OAAO,GAAG,KAAK+M,YAAL,CAAkB7M,OAAlB,CAAd;EACA,QAAI,CAACF,OAAL;EACE,aAAO,IAAP;;EACF,YAAQA,OAAO,CAACgN,KAAR,EAAR;EACE,WAAK,SAAL;EAAgB,eAAO,IAAP;;EAChB,WAAK,UAAL;EAAiB,eAAO,IAAP;;EACjB,WAAK,UAAL;EAAiB,eAAO,KAAKnN,gBAAZ;EAHnB;EAKD,GAlBe;EAoBhB;EACA;EACA;EACAkN,EAAAA,YAAY,EAAE,wBAAgC;EAAA;EAAA;;EAAA,mFAAJ,EAAI;EAAA,QAArB1L,KAAqB,QAArBA,KAAqB;EAAA,QAAd5C,KAAc,QAAdA,KAAc;;EAC5C;EACA,SAAKuP,OAAL;EACA,QAAIvP,KAAK,IAAI,CAAC,KAAKiR,UAAL,CAAgBjR,KAAhB,CAAd,EACE;EAEF,SAAKpF,KAAL,GAAa,KAAK0S,QAAL,EAAb,CAN4C;;EAS5C,SAAKkB,QAAL,CAAc,UAAd;;EAEA,WAAO,8BAAK3L,SAAL,CAAe;EAACD,MAAAA,KAAK,EAALA,KAAD;EAAQhI,MAAAA,KAAK,EAAE,KAAKA,KAApB;EAA2BsW,MAAAA,UAAU,EAAE;EAAvC,KAAf,EACJ7B,MADI,CACG,YAAM;EAAE,MAAA,KAAI,CAAC9E,SAAL;EAAmB,KAD9B,EAEJoE,IAFI,CAEC,YAAQ;EAAE,MAAA,KAAI,CAACH,QAAL,CAAc,SAAd;EAA2B,KAFtC,EAGJY,IAHI,CAGC,YAAQ;EAAE,MAAA,KAAI,CAACZ,QAAL,CAAc,OAAd;EAAyB,KAHpC,EAIJa,MAJI,CAIG,YAAM;EAAE,MAAA,KAAI,CAACb,QAAL,CAAc,WAAd;EAA6B,KAJxC,GAKJvN,IALI,iDAKI,KAAKD,gCAAL,EALJ,EAAP;EAMD,GAxCe;EA0ChB0K,EAAAA,cAAc,EAAE,0BAAY;EAC1B,WAAO,MAAM,KAAKoF,WAAL,CAAiBzW,MAA9B;EACD,GA5Ce;EA8ChB;EACAsR,EAAAA,eAAe,EAAE,yBAAU/Q,KAAV,EAAiB;EAChC,QAAI,gBAAgB,OAAOA,KAA3B,EACEA,KAAK,GAAG,KAAK0S,QAAL,EAAR,CAF8B;EAKhC;;EACA,QAAI,CAAC1S,KAAK,CAACP,MAAP,IAAiB,CAAC,KAAK8W,WAAL,EAAlB,IAAwC,gBAAgB,OAAO,KAAK1P,OAAL,CAAa2P,eAAhF,EACE,OAAO,KAAP;EAEF,WAAO,IAAP;EACD,GAzDe;EA2DhBH,EAAAA,UAAU,EAAE,oBAAUjR,KAAV,EAAiB;EAC3B,QAAI+D,KAAK,CAACC,OAAN,CAAc,KAAKvC,OAAL,CAAazB,KAA3B,CAAJ,EACE,OAAO,CAAC,CAAD,KAAO1B,CAAC,CAAC+S,OAAF,CAAUrR,KAAV,EAAiB,KAAKyB,OAAL,CAAazB,KAA9B,CAAd;EACF,WAAO,KAAKyB,OAAL,CAAazB,KAAb,KAAuBA,KAA9B;EACD,GA/De;EAiEhB;EACA;EACA;EACA;EACAsP,EAAAA,OAAO,EAAE,iBAAU7N,OAAV,EAAmB;EAC1B,QAAIpF,SAAS,CAAChC,MAAV,IAAoB,CAApB,IAAyB,CAACiE,CAAC,CAACoG,aAAF,CAAgBjD,OAAhB,CAA9B,EAAwD;EACtD/H,MAAAA,KAAK,CAAC4C,QAAN,CAAe,0FAAf;;EADsD,kDAEjCD,SAFiC;EAAA,UAEjDuG,KAFiD;EAAA,UAE1ChI,KAF0C;;EAGtD6G,MAAAA,OAAO,GAAG;EAACmB,QAAAA,KAAK,EAALA,KAAD;EAAQhI,QAAAA,KAAK,EAALA;EAAR,OAAV;EACD;;EACD,QAAI2G,OAAO,GAAG,KAAKsB,SAAL,CAAepB,OAAf,CAAd;EACA,QAAI,CAACF,OAAL;EACE,aAAO,IAAP;EACF,WAAOsM,eAAa,CAACtM,OAAO,CAACgN,KAAR,EAAD,CAApB;EACD,GA/Ee;EAiFhB;EACA;EACA;EACA;EACA;EACA1L,EAAAA,SAAS,EAAE,qBAA0D;EAAA;;EAAA,oFAAJ,EAAI;EAAA,4BAA/CD,KAA+C;EAAA,QAA/CA,KAA+C,4BAAvC,KAAuC;EAAA,QAAhChI,KAAgC,SAAhCA,KAAgC;EAAA,QAAzBoF,KAAyB,SAAzBA,KAAyB;EAAA,QAAlBkR,UAAkB,SAAlBA,UAAkB;;EACnE;EACA,QAAI,CAACA,UAAL,EACE,KAAK3B,OAAL,GAHiE;;EAKnE,QAAIvP,KAAK,IAAI,CAAC,KAAKiR,UAAL,CAAgBjR,KAAhB,CAAd,EACE;EAEF,SAAKoB,gBAAL,GAAwB,IAAxB,CARmE;;EAWnE,QAAI,CAAC,KAAKsK,cAAL,EAAL,EACE,OAAOpN,CAAC,CAACa,IAAF,EAAP,CAZiE;;EAenE,QAAI,gBAAgB,OAAOvE,KAAvB,IAAgC,SAASA,KAA7C,EACEA,KAAK,GAAG,KAAK0S,QAAL,EAAR;EAEF,QAAI,CAAC,KAAK3B,eAAL,CAAqB/Q,KAArB,CAAD,IAAgC,SAASgI,KAA7C,EACE,OAAOtE,CAAC,CAACa,IAAF,EAAP;;EAEF,QAAImS,kBAAkB,GAAG,KAAKC,sBAAL,EAAzB;;EACA,QAAIrS,QAAQ,GAAG,EAAf;EACAZ,IAAAA,CAAC,CAACO,IAAF,CAAOyS,kBAAP,EAA2B,UAACtU,CAAD,EAAI8T,WAAJ,EAAoB;EAC7C;EACA;EACA,UAAIvP,OAAO,GAAG7H,KAAK,CAACuF,GAAN,CACZX,CAAC,CAACzB,GAAF,CAAMiU,WAAN,EAAmB,UAAA1J,UAAU;EAAA,eAAI,MAAI,CAACoK,mBAAL,CAAyB5W,KAAzB,EAAgCwM,UAAhC,CAAJ;EAAA,OAA7B,CADY,CAAd;EAGAlI,MAAAA,QAAQ,CAACF,IAAT,CAAcuC,OAAd;EACA,UAAIA,OAAO,CAACgN,KAAR,OAAoB,UAAxB,EACE,OAAO,KAAP,CAR2C;EAS9C,KATD;EAUA,WAAO7U,KAAK,CAACuF,GAAN,CAAUC,QAAV,CAAP;EACD,GAxHe;EA0HhB;EACAsS,EAAAA,mBAAmB,EAAE,6BAAS5W,KAAT,EAAgBwM,UAAhB,EAA4B;EAAA;;EAC/C,QAAIxI,MAAM,GAAGwI,UAAU,CAACvD,QAAX,CAAoBjJ,KAApB,EAA2B,IAA3B,CAAb,CAD+C;;EAG/C,QAAI,UAAUgE,MAAd,EACEA,MAAM,GAAGN,CAAC,CAAC6C,QAAF,GAAaE,MAAb,EAAT,CAJ6C;;EAM/C,WAAO3H,KAAK,CAACuF,GAAN,CAAU,CAACL,MAAD,CAAV,EAAoBwQ,IAApB,CAAyB,UAAApE,YAAY,EAAI;EAC9C,UAAI,EAAE,MAAI,CAAC5J,gBAAL,YAAiC2C,KAAnC,CAAJ,EACE,MAAI,CAAC3C,gBAAL,GAAwB,EAAxB;;EACF,MAAA,MAAI,CAACA,gBAAL,CAAsBpC,IAAtB,CAA2B;EACzB4K,QAAAA,MAAM,EAAExC,UADiB;EAEzB4D,QAAAA,YAAY,EAAE,aAAa,OAAOA,YAApB,IAAoCA;EAFzB,OAA3B;EAID,KAPM,CAAP;EAQD,GAzIe;EA2IhB;EACAsC,EAAAA,QAAQ,EAAE,oBAAY;EACpB,QAAI1S,KAAJ,CADoB;;EAIpB,QAAI,eAAe,OAAO,KAAK6G,OAAL,CAAa7G,KAAvC,EACEA,KAAK,GAAG,KAAK6G,OAAL,CAAa7G,KAAb,CAAmB,IAAnB,CAAR,CADF,KAEK,IAAI,gBAAgB,OAAO,KAAK6G,OAAL,CAAa7G,KAAxC,EACHA,KAAK,GAAG,KAAK6G,OAAL,CAAa7G,KAArB,CADG,KAGHA,KAAK,GAAG,KAAKoI,QAAL,CAAcgG,GAAd,EAAR,CATkB;;EAYpB,QAAI,gBAAgB,OAAOpO,KAAvB,IAAgC,SAASA,KAA7C,EACE,OAAO,EAAP;EAEF,WAAO,KAAK6W,iBAAL,CAAuB7W,KAAvB,CAAP;EACD,GA5Je;EA8JhB;EACA4U,EAAAA,KAAK,EAAE,iBAAY;EACjB,SAAK7B,QAAL;;EACA,WAAO,KAAKa,QAAL,CAAc,OAAd,CAAP;EACD,GAlKe;EAoKhB;EACAiB,EAAAA,OAAO,EAAE,mBAAY;EACnB;EACA,SAAKnF,UAAL;;EACA,SAAKtH,QAAL,CAAc0M,UAAd,CAAyB,SAAzB;EACA,SAAK1M,QAAL,CAAc0M,UAAd,CAAyB,eAAzB;;EACA,SAAKlB,QAAL,CAAc,SAAd;EACD,GA3Ke;EA6KhB;EACAe,EAAAA,OAAO,EAAE,mBAAY;EACnB,SAAKmC,mBAAL;;EACA,WAAO,IAAP;EACD,GAjLe;EAmLhBA,EAAAA,mBAAmB,EAAE,+BAAY;EAC/B,WAAO,KAAKlQ,gBAAL,GAAwBwP,gBAAxB,EAAP;EACD,GArLe;EAuLhBW,EAAAA,kBAAkB,EAAE,8BAAW;EAC7BjY,IAAAA,KAAK,CAAC4C,QAAN,CAAe,gEAAf;EACA,WAAO,KAAKiT,OAAL,EAAP;EACD,GA1Le;;EA4LhB;;;;;;;;EAQAqC,EAAAA,aAAa,EAAE,uBAAUpX,IAAV,EAAgBgK,YAAhB,EAA8BG,QAA9B,EAAwC2L,eAAxC,EAAyD;EAEtE,QAAInU,MAAM,CAACgK,OAAP,CAAeqK,kBAAf,CAAkC3L,UAAlC,CAA6CrK,IAA7C,CAAJ,EAAwD;EACtD,UAAI4M,UAAU,GAAG,IAAIgJ,UAAJ,CAAe,IAAf,EAAqB5V,IAArB,EAA2BgK,YAA3B,EAAyCG,QAAzC,EAAmD2L,eAAnD,CAAjB,CADsD;;EAItD,UAAI,gBAAgB,KAAKS,iBAAL,CAAuB3J,UAAU,CAAC5M,IAAlC,CAApB,EACE,KAAKqX,gBAAL,CAAsBzK,UAAU,CAAC5M,IAAjC;EAEF,WAAKsW,WAAL,CAAiB9R,IAAjB,CAAsBoI,UAAtB;EACA,WAAK2J,iBAAL,CAAuB3J,UAAU,CAAC5M,IAAlC,IAA0C4M,UAA1C;EACD;;EAED,WAAO,IAAP;EACD,GAlNe;EAoNhB;EACAyK,EAAAA,gBAAgB,EAAE,0BAAUrX,IAAV,EAAgB;EAChC,SAAK,IAAIT,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK+W,WAAL,CAAiBzW,MAArC,EAA6CN,CAAC,EAA9C;EACE,UAAIS,IAAI,KAAK,KAAKsW,WAAL,CAAiB/W,CAAjB,EAAoBS,IAAjC,EAAuC;EACrC,aAAKsW,WAAL,CAAiBzO,MAAjB,CAAwBtI,CAAxB,EAA2B,CAA3B;EACA;EACD;EAJH;;EAKA,WAAO,KAAKgX,iBAAL,CAAuBvW,IAAvB,CAAP;EACA,WAAO,IAAP;EACD,GA7Ne;EA+NhB;EACAsX,EAAAA,gBAAgB,EAAE,0BAAUtX,IAAV,EAAgBiN,UAAhB,EAA4B9C,QAA5B,EAAsC;EACtD,WAAO,KAAKkN,gBAAL,CAAsBrX,IAAtB,EACJoX,aADI,CACUpX,IADV,EACgBiN,UADhB,EAC4B9C,QAD5B,CAAP;EAED,GAnOe;EAqOhB;EAEA;EACA;EACAqM,EAAAA,gBAAgB,EAAE,4BAAY;EAC5B,QAAIF,WAAW,GAAG,EAAlB;EACA,QAAIC,iBAAiB,GAAG,EAAxB,CAF4B;;EAK5B,SAAK,IAAIhX,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK+W,WAAL,CAAiBzW,MAArC,EAA6CN,CAAC,EAA9C;EACE,UAAI,UAAU,KAAK+W,WAAL,CAAiB/W,CAAjB,EAAoBuW,eAAlC,EAAmD;EACjDQ,QAAAA,WAAW,CAAC9R,IAAZ,CAAiB,KAAK8R,WAAL,CAAiB/W,CAAjB,CAAjB;EACAgX,QAAAA,iBAAiB,CAAC,KAAKD,WAAL,CAAiB/W,CAAjB,EAAoBS,IAArB,CAAjB,GAA8C,KAAKsW,WAAL,CAAiB/W,CAAjB,CAA9C;EACD;EAJH;;EAMA,SAAK+W,WAAL,GAAmBA,WAAnB;EACA,SAAKC,iBAAL,GAAyBA,iBAAzB,CAZ4B;;EAe5B,SAAK,IAAIvW,IAAT,IAAiB,KAAKiH,OAAtB;EACE,WAAKmQ,aAAL,CAAmBpX,IAAnB,EAAyB,KAAKiH,OAAL,CAAajH,IAAb,CAAzB,EAA6CuX,SAA7C,EAAwD,IAAxD;EADF,KAf4B;;;EAmB5B,WAAO,KAAKC,qBAAL,EAAP;EACD,GA7Pe;EA+PhB;EACA;EACAA,EAAAA,qBAAqB,EAAE,iCAAY;EACjC;EACA,QAAI,SAAS,KAAKpY,OAAL,CAAawB,YAAb,CAA0B,UAA1B,CAAb,EACE,KAAKwW,aAAL,CAAmB,UAAnB,EAA+B,IAA/B,EAAqCG,SAArC,EAAgD,IAAhD,EAH+B;;EAMjC,QAAI,SAAS,KAAKnY,OAAL,CAAawB,YAAb,CAA0B,SAA1B,CAAb,EACE,KAAKwW,aAAL,CAAmB,SAAnB,EAA8B,KAAKhY,OAAL,CAAawB,YAAb,CAA0B,SAA1B,CAA9B,EAAoE2W,SAApE,EAA+E,IAA/E,EAP+B;;EAUjC,QAAItJ,GAAG,GAAG,KAAK7O,OAAL,CAAawB,YAAb,CAA0B,KAA1B,CAAV;EACA,QAAIsK,GAAG,GAAG,KAAK9L,OAAL,CAAawB,YAAb,CAA0B,KAA1B,CAAV;EACA,QAAI,SAASqN,GAAT,IAAgB,SAAS/C,GAA7B,EACE,KAAKkM,aAAL,CAAmB,OAAnB,EAA4B,CAACnJ,GAAD,EAAM/C,GAAN,CAA5B,EAAwCqM,SAAxC,EAAmD,IAAnD,EADF;EAAA,SAIK,IAAI,SAAStJ,GAAb,EACH,KAAKmJ,aAAL,CAAmB,KAAnB,EAA0BnJ,GAA1B,EAA+BsJ,SAA/B,EAA0C,IAA1C,EADG;EAAA,WAIA,IAAI,SAASrM,GAAb,EACH,KAAKkM,aAAL,CAAmB,KAAnB,EAA0BlM,GAA1B,EAA+BqM,SAA/B,EAA0C,IAA1C,EArB+B;;EAyBjC,QAAI,SAAS,KAAKnY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAT,IAAmD,SAAS,KAAKxB,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAhE,EACE,KAAKwW,aAAL,CAAmB,QAAnB,EAA6B,CAAC,KAAKhY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAD,EAAyC,KAAKxB,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAzC,CAA7B,EAA+G2W,SAA/G,EAA0H,IAA1H,EADF;EAAA,SAIK,IAAI,SAAS,KAAKnY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAb,EACH,KAAKwW,aAAL,CAAmB,WAAnB,EAAgC,KAAKhY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAhC,EAAwE2W,SAAxE,EAAmF,IAAnF,EADG;EAAA,WAIA,IAAI,SAAS,KAAKnY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAb,EACH,KAAKwW,aAAL,CAAmB,WAAnB,EAAgC,KAAKhY,OAAL,CAAawB,YAAb,CAA0B,WAA1B,CAAhC,EAAwE2W,SAAxE,EAAmF,IAAnF,EAlC+B;;EAsCjC,QAAItN,IAAI,GAAG/K,KAAK,CAACyB,OAAN,CAAc,KAAKvB,OAAnB,CAAX,CAtCiC;;EAyCjC,QAAI,aAAa6K,IAAjB,EAAuB;EACrB,aAAO,KAAKmN,aAAL,CAAmB,MAAnB,EAA2B,CAAC,QAAD,EAAW;EAC3ChK,QAAAA,IAAI,EAAE,KAAKhO,OAAL,CAAawB,YAAb,CAA0B,MAA1B,KAAqC,GADA;EAE3CyM,QAAAA,IAAI,EAAEY,GAAG,IAAI,KAAK7O,OAAL,CAAawB,YAAb,CAA0B,OAA1B;EAF8B,OAAX,CAA3B,EAGH2W,SAHG,EAGQ,IAHR,CAAP,CADqB;EAMtB,KAND,MAMO,IAAI,4BAA4BxX,IAA5B,CAAiCkK,IAAjC,CAAJ,EAA4C;EACjD,aAAO,KAAKmN,aAAL,CAAmB,MAAnB,EAA2BnN,IAA3B,EAAiCsN,SAAjC,EAA4C,IAA5C,CAAP;EACD;;EACD,WAAO,IAAP;EACD,GApTe;EAsThB;EACA;EACAZ,EAAAA,WAAW,EAAE,uBAAY;EACvB,QAAI,gBAAgB,OAAO,KAAKJ,iBAAL,CAAuBpJ,QAAlD,EACE,OAAO,KAAP;EAEF,WAAO,UAAU,KAAKoJ,iBAAL,CAAuBpJ,QAAvB,CAAgCnD,YAAjD;EACD,GA7Te;EA+ThB;EACA;EACAgK,EAAAA,QAAQ,EAAE,kBAAU2B,SAAV,EAAqB;EAC7B,WAAO,KAAK/P,OAAL,CAAa,WAAW+P,SAAxB,CAAP;EACD,GAnUe;EAqUhB;EACA;EACA;EACA;EACAsB,EAAAA,iBAAiB,EAAE,2BAAU7W,KAAV,EAAiB;EAClC,QAAI,SAAS,KAAK6G,OAAL,CAAawQ,SAA1B,EACEvY,KAAK,CAAC4C,QAAN,CAAe,yFAAf;EAEF,QAAI,aAAa,KAAKmF,OAAL,CAAayQ,UAA9B,EACEtX,KAAK,GAAGA,KAAK,CAACiB,OAAN,CAAc,SAAd,EAAyB,GAAzB,CAAR;EAEF,QAAK,WAAW,KAAK4F,OAAL,CAAayQ,UAAzB,IAAyC,aAAa,KAAKzQ,OAAL,CAAayQ,UAAnE,IAAmF,SAAS,KAAKzQ,OAAL,CAAawQ,SAA7G,EACErX,KAAK,GAAGlB,KAAK,CAAC+C,UAAN,CAAiB7B,KAAjB,CAAR;EAEF,WAAOA,KAAP;EACD,GApVe;EAsVhBwJ,EAAAA,YAAY,EAAE,wBAAW;EACvB,QAAI+N,CAAC,GAAG,KAAKpB,iBAAL,CAAuBtM,IAA/B;EACA,WAAO0N,CAAC,IAAIA,CAAC,CAAC3N,YAAF,KAAmB,MAA/B;EACD,GAzVe;EA2VhB;EACA;EACA;EACA+M,EAAAA,sBAAsB,EAAE,kCAAY;EAClC,QAAI,UAAU,KAAK9P,OAAL,CAAa3B,eAA3B,EACE,OAAO,CAAC,KAAKgR,WAAN,CAAP;EAEF,QAAIQ,kBAAkB,GAAG,EAAzB;EACA,QAAIc,KAAK,GAAG,EAAZ,CALkC;;EAQlC,SAAK,IAAIrY,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK+W,WAAL,CAAiBzW,MAArC,EAA6CN,CAAC,EAA9C,EAAkD;EAChD,UAAIsY,CAAC,GAAG,KAAKvB,WAAL,CAAiB/W,CAAjB,EAAoB4K,QAA5B;EACA,UAAI,CAACyN,KAAK,CAACC,CAAD,CAAV,EACEf,kBAAkB,CAACtS,IAAnB,CAAwBoT,KAAK,CAACC,CAAD,CAAL,GAAW,EAAnC;EACFD,MAAAA,KAAK,CAACC,CAAD,CAAL,CAASrT,IAAT,CAAc,KAAK8R,WAAL,CAAiB/W,CAAjB,CAAd;EACD,KAbiC;;;EAelCuX,IAAAA,kBAAkB,CAACgB,IAAnB,CAAwB,UAAUC,CAAV,EAAaC,CAAb,EAAgB;EAAE,aAAOA,CAAC,CAAC,CAAD,CAAD,CAAK7N,QAAL,GAAgB4N,CAAC,CAAC,CAAD,CAAD,CAAK5N,QAA5B;EAAuC,KAAjF;EAEA,WAAO2M,kBAAP;EACD;EAhXe,CAAlB;;EC3BA,IAAImB,QAAQ,GAAG,SAAXA,QAAW,GAAY;EACzB,OAAK1N,SAAL,GAAiB,eAAjB;EACD,CAFD;;EAIA0N,QAAQ,CAAClT,SAAT,GAAqB;EACnB;EACAmT,EAAAA,UAAU,EAAE,oBAAU1P,QAAV,EAAoB;EAC9B,SAAK2P,SAAL,CAAe3T,IAAf,CAAoBgE,QAApB;EAEA,WAAO,IAAP;EACD,GANkB;EAQnB;EACA0O,EAAAA,mBAAmB,EAAE,+BAAY;EAC/B,QAAIkB,gBAAJ;EAEA,SAAK9B,WAAL,GAAmB,EAAnB,CAH+B;;EAM/B,QAAI,KAAKlX,OAAL,CAAaoT,QAAb,KAA0B,QAA9B,EAAwC;EACtC,WAAKxL,gBAAL,GAAwBwP,gBAAxB;;EAEA,aAAO,IAAP;EACD,KAV8B;;;EAa/B,SAAK,IAAIjX,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK4Y,SAAL,CAAetY,MAAnC,EAA2CN,CAAC,EAA5C,EAAgD;EAE9C;EACA,UAAI,CAACuE,CAAC,CAAC,MAAD,CAAD,CAAUuU,GAAV,CAAc,KAAKF,SAAL,CAAe5Y,CAAf,CAAd,EAAiCM,MAAtC,EAA8C;EAC5C,aAAKsY,SAAL,CAAetQ,MAAf,CAAsBtI,CAAtB,EAAyB,CAAzB;EACA;EACD;;EAED6Y,MAAAA,gBAAgB,GAAG,KAAKD,SAAL,CAAe5Y,CAAf,EAAkB+Y,IAAlB,CAAuB,eAAvB,EAAwCpB,mBAAxC,GAA8DZ,WAAjF;;EAEA,WAAK,IAAInH,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGiJ,gBAAgB,CAACvY,MAArC,EAA6CsP,CAAC,EAA9C;EACE,aAAKiI,aAAL,CAAmBgB,gBAAgB,CAACjJ,CAAD,CAAhB,CAAoBnP,IAAvC,EAA6CoY,gBAAgB,CAACjJ,CAAD,CAAhB,CAAoBnF,YAAjE,EAA+EoO,gBAAgB,CAACjJ,CAAD,CAAhB,CAAoBhF,QAAnG,EAA6GiO,gBAAgB,CAACjJ,CAAD,CAAhB,CAAoB2G,eAAjI;EADF;EAED;;EAED,WAAO,IAAP;EACD,GArCkB;EAuCnB;EACAhD,EAAAA,QAAQ,EAAE,oBAAY;EACpB;EACA,QAAI,eAAe,OAAO,KAAK7L,OAAL,CAAa7G,KAAvC,EACE,OAAO,KAAK6G,OAAL,CAAa7G,KAAb,CAAmB,IAAnB,CAAP,CADF,KAEK,IAAI,gBAAgB,OAAO,KAAK6G,OAAL,CAAa7G,KAAxC,EACH,OAAO,KAAK6G,OAAL,CAAa7G,KAApB,CALkB;;EAQpB,QAAI,KAAKhB,OAAL,CAAaoT,QAAb,KAA0B,OAA9B,EAAuC;EACrC,UAAIvI,IAAI,GAAG/K,KAAK,CAACyB,OAAN,CAAc,KAAKvB,OAAnB,CAAX;EACA,UAAI6K,IAAI,KAAK,OAAb,EACE,OAAO,KAAK3B,YAAL,GAAoBiQ,MAApB,CAA2B,UAA3B,EAAuC/J,GAAvC,MAAgD,EAAvD,CAHmC;;EAMrC,UAAIvE,IAAI,KAAK,UAAb,EAAyB;EACvB,YAAItB,MAAM,GAAG,EAAb;;EAEA,aAAKL,YAAL,GAAoBiQ,MAApB,CAA2B,UAA3B,EAAuClU,IAAvC,CAA4C,YAAY;EACtDsE,UAAAA,MAAM,CAACnE,IAAP,CAAYV,CAAC,CAAC,IAAD,CAAD,CAAQ0K,GAAR,EAAZ;EACD,SAFD;;EAIA,eAAO7F,MAAP;EACD;EACF,KAvBmB;;;EA0BpB,QAAI,KAAKvJ,OAAL,CAAaoT,QAAb,KAA0B,QAA1B,IAAsC,SAAS,KAAKhK,QAAL,CAAcgG,GAAd,EAAnD,EACE,OAAO,EAAP,CA3BkB;;EA8BpB,WAAO,KAAKhG,QAAL,CAAcgG,GAAd,EAAP;EACD,GAvEkB;EAyEnBgK,EAAAA,KAAK,EAAE,iBAAY;EACjB,SAAKL,SAAL,GAAiB,CAAC,KAAK3P,QAAN,CAAjB;EAEA,WAAO,IAAP;EACD;EA7EkB,CAArB;;ECAA,IAAIgN,OAAO,GAAG,SAAVA,OAAU,CAAUpW,OAAV,EAAmB6H,OAAnB,EAA4BoP,mBAA5B,EAAiD;EAC7D,OAAKjX,OAAL,GAAeA,OAAf;EACA,OAAKoJ,QAAL,GAAgB1E,CAAC,CAAC1E,OAAD,CAAjB,CAF6D;;EAK7D,MAAIqZ,wBAAwB,GAAG,KAAKjQ,QAAL,CAAc8P,IAAd,CAAmB,SAAnB,CAA/B;;EACA,MAAIG,wBAAJ,EAA8B;EAE5B;EACA,QAAI,gBAAgB,OAAOpC,mBAAvB,IAA8CoC,wBAAwB,CAACtR,MAAzB,KAAoCxF,MAAM,CAACgK,OAA7F,EAAsG;EACpG8M,MAAAA,wBAAwB,CAACtR,MAAzB,GAAkCkP,mBAAlC;;EACAoC,MAAAA,wBAAwB,CAACrR,aAAzB,CAAuCqR,wBAAwB,CAACxR,OAAhE;EACD;;EAED,QAAI,qBAAoBA,OAApB,CAAJ,EAAiC;EAC/B,eAAcwR,wBAAwB,CAACxR,OAAvC,EAAgDA,OAAhD;EACD;;EAED,WAAOwR,wBAAP;EACD,GAnB4D;;;EAsB7D,MAAI,CAAC,KAAKjQ,QAAL,CAAc3I,MAAnB,EACE,MAAM,IAAImF,KAAJ,CAAU,+CAAV,CAAN;EAEF,MAAI,gBAAgB,OAAOqR,mBAAvB,IAA8C,WAAWA,mBAAmB,CAAC9L,SAAjF,EACE,MAAM,IAAIvF,KAAJ,CAAU,yCAAV,CAAN;EAEF,OAAKmC,MAAL,GAAckP,mBAAmB,IAAI1U,MAAM,CAACgK,OAA5C;EACA,SAAO,KAAKlB,IAAL,CAAUxD,OAAV,CAAP;EACD,CA9BD;;EAgCAuO,OAAO,CAACzQ,SAAR,GAAoB;EAClB0F,EAAAA,IAAI,EAAE,cAAUxD,OAAV,EAAmB;EACvB,SAAKsD,SAAL,GAAiB,SAAjB;EACA,SAAKmO,WAAL,GAAmB,OAAnB;EACA,SAAKpS,MAAL,GAAcpH,KAAK,CAAC2B,UAAN,EAAd,CAHuB;;EAMvB,SAAKuG,aAAL,CAAmBH,OAAnB,EANuB;;;EASvB,QAAI,KAAK7H,OAAL,CAAaoT,QAAb,KAA0B,MAA1B,IAAqCtT,KAAK,CAACmB,SAAN,CAAgB,KAAKjB,OAArB,EAA8B,KAAK6H,OAAL,CAAa5H,SAA3C,EAAsD,UAAtD,KAAqE,CAAC,KAAKmJ,QAAL,CAAcmQ,EAAd,CAAiB,KAAK1R,OAAL,CAAa7B,MAA9B,CAA/G,EACE,OAAO,KAAKwT,IAAL,CAAU,aAAV,CAAP,CAVqB;;EAavB,WAAO,KAAKC,UAAL,KAAoB,KAAKC,cAAL,EAApB,GAA4C,KAAKF,IAAL,CAAU,cAAV,CAAnD;EACD,GAfiB;EAiBlBC,EAAAA,UAAU,EAAE,sBAAY;EACtB,QAAI5O,IAAI,GAAG/K,KAAK,CAACyB,OAAN,CAAc,KAAKvB,OAAnB,CAAX;EACA,WAAS6K,IAAI,KAAK,OAAT,IAAoBA,IAAI,KAAK,UAA9B,IACL,KAAK7K,OAAL,CAAaoT,QAAb,KAA0B,QAA1B,IAAsC,SAAS,KAAKpT,OAAL,CAAawB,YAAb,CAA0B,UAA1B,CADlD;EAED,GArBiB;EAuBlB;EACA;EACAkY,EAAAA,cAAc,EAAE,0BAAY;EAAA;;EAC1B,QAAI9Y,IAAJ;AACA,EACA,QAAI+Y,uBAAJ,CAH0B;;EAM1B,SAAK9R,OAAL,CAAa1B,QAAb,GAAwB,KAAK0B,OAAL,CAAa1B,QAAb,KACrBvF,IAAI,GAAG,KAAKZ,OAAL,CAAawB,YAAb,CAA0B,MAA1B,CADc,KAEtB,KAAKxB,OAAL,CAAawB,YAAb,CAA0B,IAA1B,CAFF,CAN0B;;EAW1B,QAAI,KAAKxB,OAAL,CAAaoT,QAAb,KAA0B,QAA1B,IAAsC,SAAS,KAAKpT,OAAL,CAAawB,YAAb,CAA0B,UAA1B,CAAnD,EAA0F;EACxF,WAAKqG,OAAL,CAAa1B,QAAb,GAAwB,KAAK0B,OAAL,CAAa1B,QAAb,IAAyB,KAAKe,MAAtD;EACA,aAAO,KAAKsS,IAAL,CAAU,sBAAV,CAAP,CAFwF;EAKzF,KALD,MAKO,IAAI,CAAC,KAAK3R,OAAL,CAAa1B,QAAlB,EAA4B;EACjCrG,MAAAA,KAAK,CAACwC,IAAN,CAAW,uHAAX,EAAoI,KAAK8G,QAAzI;EACA,aAAO,IAAP;EACD,KAnByB;;;EAsB1B,SAAKvB,OAAL,CAAa1B,QAAb,GAAwB,KAAK0B,OAAL,CAAa1B,QAAb,CAAsBlE,OAAtB,CAA8B,wBAA9B,EAAwD,EAAxD,CAAxB,CAtB0B;;EAyB1B,QAAIrB,IAAJ,EAAU;EACR8D,MAAAA,CAAC,CAAC,iBAAiB9D,IAAjB,GAAwB,IAAzB,CAAD,CAAgCqE,IAAhC,CAAqC,UAAC9E,CAAD,EAAIyZ,KAAJ,EAAc;EACjD,YAAI/O,IAAI,GAAG/K,KAAK,CAACyB,OAAN,CAAcqY,KAAd,CAAX;EACA,YAAK/O,IAAI,KAAK,OAAT,IAAoBA,IAAI,KAAK,UAAlC,EACE+O,KAAK,CAACxY,YAAN,CAAmB,KAAI,CAACyG,OAAL,CAAa5H,SAAb,GAAyB,UAA5C,EAAwD,KAAI,CAAC4H,OAAL,CAAa1B,QAArE;EACH,OAJD;EAKD,KA/ByB;;;EAkC1B,QAAI0T,kBAAkB,GAAG,KAAK3Q,YAAL,EAAzB;;EACA,SAAK,IAAI/I,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG0Z,kBAAkB,CAACpZ,MAAvC,EAA+CN,CAAC,EAAhD,EAAoD;EAClDwZ,MAAAA,uBAAuB,GAAGjV,CAAC,CAACmV,kBAAkB,CAACC,GAAnB,CAAuB3Z,CAAvB,CAAD,CAAD,CAA6B+Y,IAA7B,CAAkC,SAAlC,CAA1B;;EACA,UAAI,gBAAgB,OAAOS,uBAA3B,EAAoD;EAElD,YAAI,CAAC,KAAKvQ,QAAL,CAAc8P,IAAd,CAAmB,eAAnB,CAAL,EAA0C;EACxCS,UAAAA,uBAAuB,CAACb,UAAxB,CAAmC,KAAK1P,QAAxC;EACD;;EAED;EACD;EACF,KA7CyB;EAgD1B;;;EACA,SAAKoQ,IAAL,CAAU,cAAV,EAA0B,IAA1B;EAEA,WAAOG,uBAAuB,IAAI,KAAKH,IAAL,CAAU,sBAAV,CAAlC;EACD,GA7EiB;EA+ElB;EACAA,EAAAA,IAAI,EAAE,cAAU3O,IAAV,EAAgBkP,UAAhB,EAA4B;EAChC,QAAIC,eAAJ;;EAEA,YAAQnP,IAAR;EACE,WAAK,aAAL;EACEmP,QAAAA,eAAe,GAAGtV,CAAC,CAACsF,MAAF,CAChB,IAAIkG,IAAJ,CAAS,KAAKlQ,OAAd,EAAuB,KAAK8H,UAA5B,EAAwC,KAAKD,OAA7C,CADgB,EAEhB,IAAIZ,IAAJ,EAFgB,EAGhB1E,MAAM,CAAC0X,aAHS,EAIhBlE,WAJgB,EAAlB;EAKA;;EACF,WAAK,cAAL;EACEiE,QAAAA,eAAe,GAAGtV,CAAC,CAACsF,MAAF,CAChB,IAAInD,KAAJ,CAAU,KAAK7G,OAAf,EAAwB,KAAK8H,UAA7B,EAAyC,KAAKD,OAA9C,EAAuD,KAAKE,MAA5D,CADgB,EAEhB,IAAId,IAAJ,EAFgB,EAGhB1E,MAAM,CAAC0X,aAHS,CAAlB;EAKA;;EACF,WAAK,sBAAL;EACED,QAAAA,eAAe,GAAGtV,CAAC,CAACsF,MAAF,CAChB,IAAInD,KAAJ,CAAU,KAAK7G,OAAf,EAAwB,KAAK8H,UAA7B,EAAyC,KAAKD,OAA9C,EAAuD,KAAKE,MAA5D,CADgB,EAEhB,IAAI8Q,QAAJ,EAFgB,EAGhB,IAAI5R,IAAJ,EAHgB,EAIhB1E,MAAM,CAAC0X,aAJS,EAKhBb,KALgB,EAAlB;EAMA;;EACF;EACE,cAAM,IAAIxT,KAAJ,CAAUiF,IAAI,GAAG,iCAAjB,CAAN;EAxBJ;;EA2BA,QAAI,KAAKhD,OAAL,CAAa1B,QAAjB,EACErG,KAAK,CAACqB,OAAN,CAAc,KAAKnB,OAAnB,EAA4B,KAAK6H,OAAL,CAAa5H,SAAzC,EAAoD,UAApD,EAAgE,KAAK4H,OAAL,CAAa1B,QAA7E;;EAEF,QAAI,gBAAgB,OAAO4T,UAA3B,EAAuC;EACrC,WAAK3Q,QAAL,CAAc8P,IAAd,CAAmB,eAAnB,EAAoCc,eAApC;EAEA,aAAOA,eAAP;EACD,KArC+B;;;EAwChC,SAAK5Q,QAAL,CAAc8P,IAAd,CAAmB,SAAnB,EAA8Bc,eAA9B,EAxCgC;;EA2ChCA,IAAAA,eAAe,CAAC7J,kBAAhB;;EACA6J,IAAAA,eAAe,CAACpF,QAAhB,CAAyB,MAAzB;;EAEA,WAAOoF,eAAP;EACD;EA/HiB,CAApB;;EC5BA,IAAIE,OAAO,GAAGxV,CAAC,CAAC0D,EAAF,CAAK+R,MAAL,CAAY1V,KAAZ,CAAkB,GAAlB,CAAd;;EACA,IAAItB,QAAQ,CAAC+W,OAAO,CAAC,CAAD,CAAR,CAAR,IAAwB,CAAxB,IAA6B/W,QAAQ,CAAC+W,OAAO,CAAC,CAAD,CAAR,CAAR,GAAuB,CAAxD,EAA2D;EACzD,QAAM,6EAAN;EACD;;EACD,IAAI,CAACA,OAAO,CAACE,OAAb,EAAsB;EACpBta,EAAAA,KAAK,CAACwC,IAAN,CAAW,2FAAX;EACD;;;EAED,IAAIiK,OAAO,GAAG,SAAc,IAAItF,IAAJ,EAAd,EAA0B;EACpCjH,EAAAA,OAAO,EAAEqa,QAD2B;EAEpCjR,EAAAA,QAAQ,EAAE1E,CAAC,CAAC2V,QAAD,CAFyB;EAGpCzS,EAAAA,gBAAgB,EAAE,IAHkB;EAIpCI,EAAAA,aAAa,EAAE,IAJqB;EAKpCoO,EAAAA,OAAO,EAAEA,OAL2B;EAMpCkE,EAAAA,OAAO,EAAE;EAN2B,CAA1B,CAAd;EAUA;;;EACA,SAAczT,KAAK,CAAClB,SAApB,EAA+B4J,EAAE,CAAC1I,KAAlC,EAAyCI,IAAI,CAACtB,SAA9C;;EACA,SAAcuK,IAAI,CAACvK,SAAnB,EAA8B4J,EAAE,CAACW,IAAjC,EAAuCjJ,IAAI,CAACtB,SAA5C;;;EAEA,SAAcyQ,OAAO,CAACzQ,SAAtB,EAAiCsB,IAAI,CAACtB,SAAtC;EAGA;;;EACAjB,CAAC,CAAC0D,EAAF,CAAKiM,OAAL,GAAe3P,CAAC,CAAC0D,EAAF,CAAKmS,IAAL,GAAY,UAAU1S,OAAV,EAAmB;EAC5C,MAAI,KAAKpH,MAAL,GAAc,CAAlB,EAAqB;EACnB,QAAI+Z,SAAS,GAAG,EAAhB;EAEA,SAAKvV,IAAL,CAAU,YAAY;EACpBuV,MAAAA,SAAS,CAACpV,IAAV,CAAeV,CAAC,CAAC,IAAD,CAAD,CAAQ2P,OAAR,CAAgBxM,OAAhB,CAAf;EACD,KAFD;EAIA,WAAO2S,SAAP;EACD,GAT2C;;;EAY5C,MAAI,KAAK/Z,MAAL,IAAe,CAAnB,EAAsB;EACpB;EACD;;EAED,SAAO,IAAI2V,OAAJ,CAAY,KAAK,CAAL,CAAZ,EAAqBvO,OAArB,CAAP;EACD,CAjBD;EAoBA;;;EACA,IAAI,gBAAgB,OAAOtF,MAAM,CAAC0X,aAAlC,EACE1X,MAAM,CAAC0X,aAAP,GAAuB,EAAvB;EAGF;;EACA1N,OAAO,CAAC1E,OAAR,GAAkB,SAAc/H,KAAK,CAAC0F,YAAN,CAAmBO,QAAnB,CAAd,EAA4CxD,MAAM,CAACkY,aAAnD,CAAlB;EACAlY,MAAM,CAACkY,aAAP,GAAuBlO,OAAO,CAAC1E,OAA/B;EAEA;;EACAtF,MAAM,CAACgK,OAAP,GAAiBhK,MAAM,CAACgY,IAAP,GAAchO,OAA/B;EACAA,OAAO,CAACzM,KAAR,GAAgBA,KAAhB;EACAyC,MAAM,CAACmY,YAAP,GAAsB,EAAtB;EACAhW,CAAC,CAACO,IAAF,CAAOnF,KAAP,EAAc,UAAC+J,GAAD,EAAM7I,KAAN,EAAgB;EAC5B,MAAI,eAAe,OAAOA,KAA1B,EAAiC;EAC/BuB,IAAAA,MAAM,CAACmY,YAAP,CAAoB7Q,GAApB,IAA2B,YAAa;EACtC/J,MAAAA,KAAK,CAAC4C,QAAN,CAAe,oFAAf;EACA,aAAO5C,KAAK,CAAC+J,GAAD,CAAL,OAAA/J,KAAK,YAAZ;EACD,KAHD;EAID;EACF,CAPD;;EAUA,IAAI6a,QAAQ,GAAGpY,MAAM,CAACgK,OAAP,CAAeqK,kBAAf,GAAoC,IAAI5L,iBAAJ,CAAsBzI,MAAM,CAACkY,aAAP,CAAqBxP,UAA3C,EAAuD1I,MAAM,CAACkY,aAAP,CAAqBG,IAA5E,CAAnD;EACArY,MAAM,CAACsY,gBAAP,GAA0B,EAA1B;EACAnW,CAAC,CAACO,IAAF,CAAO,sIAAsIR,KAAtI,CAA4I,GAA5I,CAAP,EAAyJ,UAAUtE,CAAV,EAAa2a,MAAb,EAAqB;EAC5KvY,EAAAA,MAAM,CAACgK,OAAP,CAAeuO,MAAf,IAAyB;EAAA,WAAaH,QAAQ,CAACG,MAAD,CAAR,OAAAH,QAAQ,YAArB;EAAA,GAAzB;;EACApY,EAAAA,MAAM,CAACsY,gBAAP,CAAwBC,MAAxB,IAAkC,YAAY;EAAA;;EAC5Chb,IAAAA,KAAK,CAAC4C,QAAN,iCAAwCoY,MAAxC,4EAAgHA,MAAhH;EACA,WAAO,mBAAAvY,MAAM,CAACgK,OAAP,EAAeuO,MAAf,yBAA0BrY,SAA1B,CAAP;EACD,GAHD;EAID,CAND;EASA;;EACAF,MAAM,CAACgK,OAAP,CAAegD,EAAf,GAAoBA,EAApB;EACAhN,MAAM,CAACwY,SAAP,GAAmB;EACjBnJ,EAAAA,WAAW,EAAE,qBAAUtH,QAAV,EAAoB1J,IAApB,EAA0Boa,gBAA1B,EAA4C;EACvD,QAAIzJ,WAAW,GAAG,SAASyJ,gBAA3B;EACAlb,IAAAA,KAAK,CAAC4C,QAAN;EACA,WAAO4H,QAAQ,CAACsH,WAAT,CAAqBhR,IAArB,EAA2B;EAAC2Q,MAAAA,WAAW,EAAXA;EAAD,KAA3B,CAAP;EACD,GALgB;EAMjBJ,EAAAA,iBAAiB,EAAE,2BAAU7G,QAAV,EAAoB;EACrCxK,IAAAA,KAAK,CAAC4C,QAAN;EACA,WAAO4H,QAAQ,CAAC6G,iBAAT,EAAP;EACD;EATgB,CAAnB;EAWAzM,CAAC,CAACO,IAAF,CAAO,uBAAuBR,KAAvB,CAA6B,GAA7B,CAAP,EAA0C,UAAUtE,CAAV,EAAa2a,MAAb,EAAqB;EAC7DvY,EAAAA,MAAM,CAACwY,SAAP,CAAiBD,MAAjB,IAA2B,UAAUxQ,QAAV,EAAoB1J,IAApB,EAA0BiM,OAA1B,EAAmCmD,MAAnC,EAA2CgL,gBAA3C,EAA6D;EACtF,QAAIzJ,WAAW,GAAG,SAASyJ,gBAA3B;EACAlb,IAAAA,KAAK,CAAC4C,QAAN,6CAAoDoY,MAApD;EACA,WAAOxQ,QAAQ,CAACwQ,MAAD,CAAR,CAAiBla,IAAjB,EAAuB;EAACiM,MAAAA,OAAO,EAAPA,OAAD;EAAUmD,MAAAA,MAAM,EAANA,MAAV;EAAkBuB,MAAAA,WAAW,EAAXA;EAAlB,KAAvB,CAAP;EACD,GAJD;EAKD,CAND;EASA;;EACA,IAAI,UAAUhP,MAAM,CAACkY,aAAP,CAAqBQ,QAAnC,EAA6C;EAC3CvW,EAAAA,CAAC,CAAC,YAAY;EACZ;EACA,QAAIA,CAAC,CAAC,yBAAD,CAAD,CAA6BjE,MAAjC,EACEiE,CAAC,CAAC,yBAAD,CAAD,CAA6B2P,OAA7B;EACH,GAJA,CAAD;EAKD;;ECnHD,IAAI6G,CAAC,GAAGxW,CAAC,CAAC,EAAD,CAAT;;EACA,IAAIyW,UAAU,GAAG,SAAbA,UAAa,GAAY;EAC3Brb,EAAAA,KAAK,CAAC4C,QAAN,CAAe,8GAAf;EACD,CAFD;;;EAKA,SAAS0Y,KAAT,CAAehT,EAAf,EAAmBiT,OAAnB,EAA4B;EAC1B;EACA,MAAI,CAACjT,EAAE,CAACkT,sBAAR,EAAgC;EAC9BlT,IAAAA,EAAE,CAACkT,sBAAH,GAA4B,YAAY;EACtC,UAAItP,IAAI,GAAG7B,KAAK,CAACxE,SAAN,CAAgB7E,KAAhB,CAAsBgI,IAAtB,CAA2BrG,SAA3B,EAAsC,CAAtC,CAAX;EACAuJ,MAAAA,IAAI,CAACuP,OAAL,CAAa,IAAb;EACAnT,MAAAA,EAAE,CAACoT,KAAH,CAASH,OAAO,IAAIH,CAApB,EAAuBlP,IAAvB;EACD,KAJD;EAKD;;EACD,SAAO5D,EAAE,CAACkT,sBAAV;EACD;;EAED,IAAIG,WAAW,GAAG,UAAlB;;EAEA,SAASlF,SAAT,CAAmB3V,IAAnB,EAAyB;EACvB,MAAIA,IAAI,CAAC8a,WAAL,CAAiBD,WAAjB,EAA8B,CAA9B,MAAqC,CAAzC,EACE,OAAO7a,IAAI,CAAC+a,MAAL,CAAYF,WAAW,CAAChb,MAAxB,CAAP;EACF,SAAOG,IAAP;EACD;;;EAGD8D,CAAC,CAACkX,MAAF,GAAW,UAAUhb,IAAV,EAAgBib,QAAhB,EAA0B;EACnC,MAAIR,OAAJ;EACAF,EAAAA,UAAU;;EACV,MAAI,qBAAoB1Y,SAAS,CAAC,CAAD,CAA7B,KAAoC,eAAe,OAAOA,SAAS,CAAC,CAAD,CAAvE,EAA4E;EAC1E4Y,IAAAA,OAAO,GAAG5Y,SAAS,CAAC,CAAD,CAAnB;EACAoZ,IAAAA,QAAQ,GAAGpZ,SAAS,CAAC,CAAD,CAApB;EACD;;EAED,MAAI,eAAe,OAAOoZ,QAA1B,EACE,MAAM,IAAIjW,KAAJ,CAAU,kBAAV,CAAN;EAEFrD,EAAAA,MAAM,CAACgK,OAAP,CAAepE,EAAf,CAAkBoO,SAAS,CAAC3V,IAAD,CAA3B,EAAmCwa,KAAK,CAACS,QAAD,EAAWR,OAAX,CAAxC;EACD,CAZD;;EAcA3W,CAAC,CAAC6D,QAAF,GAAa,UAAU+B,QAAV,EAAoB1J,IAApB,EAA0BwH,EAA1B,EAA8B;EACzC+S,EAAAA,UAAU;EACV,MAAI,EAAE7Q,QAAQ,YAAYzD,KAAtB,KAAgC,EAAEyD,QAAQ,YAAY4F,IAAtB,CAApC,EACE,MAAM,IAAItK,KAAJ,CAAU,4BAAV,CAAN;EAEF,MAAI,aAAa,OAAOhF,IAApB,IAA4B,eAAe,OAAOwH,EAAtD,EACE,MAAM,IAAIxC,KAAJ,CAAU,kBAAV,CAAN;EAEF0E,EAAAA,QAAQ,CAACnC,EAAT,CAAYoO,SAAS,CAAC3V,IAAD,CAArB,EAA6Bwa,KAAK,CAAChT,EAAD,CAAlC;EACD,CATD;;EAWA1D,CAAC,CAACgE,WAAF,GAAgB,UAAU9H,IAAV,EAAgBwH,EAAhB,EAAoB;EAClC+S,EAAAA,UAAU;EACV,MAAI,aAAa,OAAOva,IAApB,IAA4B,eAAe,OAAOwH,EAAtD,EACE,MAAM,IAAIxC,KAAJ,CAAU,iBAAV,CAAN;EACFrD,EAAAA,MAAM,CAACgK,OAAP,CAAe/D,GAAf,CAAmB+N,SAAS,CAAC3V,IAAD,CAA5B,EAAoCwH,EAAE,CAACkT,sBAAvC;EACD,CALD;;EAOA5W,CAAC,CAACiE,aAAF,GAAkB,UAAU2B,QAAV,EAAoB1J,IAApB,EAA0B;EAC1Cua,EAAAA,UAAU;EACV,MAAI,EAAE7Q,QAAQ,YAAYzD,KAAtB,KAAgC,EAAEyD,QAAQ,YAAY4F,IAAtB,CAApC,EACE,MAAM,IAAItK,KAAJ,CAAU,4BAAV,CAAN;EACF0E,EAAAA,QAAQ,CAAC9B,GAAT,CAAa+N,SAAS,CAAC3V,IAAD,CAAtB;EACD,CALD;;EAOA8D,CAAC,CAACoX,cAAF,GAAmB,UAAUlb,IAAV,EAAgB;EACjCua,EAAAA,UAAU;EACV5Y,EAAAA,MAAM,CAACgK,OAAP,CAAe/D,GAAf,CAAmB+N,SAAS,CAAC3V,IAAD,CAA5B;EACA8D,EAAAA,CAAC,CAAC,4BAAD,CAAD,CAAgCO,IAAhC,CAAqC,YAAY;EAC/C,QAAIqF,QAAQ,GAAG5F,CAAC,CAAC,IAAD,CAAD,CAAQwU,IAAR,CAAa,SAAb,CAAf;;EACA,QAAI5O,QAAJ,EAAc;EACZA,MAAAA,QAAQ,CAAC9B,GAAT,CAAa+N,SAAS,CAAC3V,IAAD,CAAtB;EACD;EACF,GALD;EAMD,CATD;;;EAYA8D,CAAC,CAACqX,IAAF,GAAS,UAAUnb,IAAV,EAAgB0J,QAAhB,EAA0B;EAAA;;EACjC6Q,EAAAA,UAAU;EACV,MAAIa,aAAa,GAAI1R,QAAQ,YAAYzD,KAArB,IAAgCyD,QAAQ,YAAY4F,IAAxE;EACA,MAAIlE,IAAI,GAAG7B,KAAK,CAACxE,SAAN,CAAgB7E,KAAhB,CAAsBgI,IAAtB,CAA2BrG,SAA3B,EAAsCuZ,aAAa,GAAG,CAAH,GAAO,CAA1D,CAAX;EACAhQ,EAAAA,IAAI,CAACuP,OAAL,CAAahF,SAAS,CAAC3V,IAAD,CAAtB;;EACA,MAAI,CAACob,aAAL,EAAoB;EAClB1R,IAAAA,QAAQ,GAAG/H,MAAM,CAACgK,OAAlB;EACD;;EACD,eAAAjC,QAAQ,EAAC9D,OAAT,qCAAoBwF,IAApB;EACD,CATD;;EC7EAtH,CAAC,CAACsF,MAAF,CAAS,IAAT,EAAeuC,OAAf,EAAwB;EACtB0P,EAAAA,eAAe,EAAE;EACf,eAAW;EACT7T,MAAAA,EAAE,EAAE,YAAU8T,GAAV,EAAe;EACjB;EACA;EACA;EACA;EACA,eAAOA,GAAG,CAACC,MAAJ,IAAc,GAAd,IAAqBD,GAAG,CAACC,MAAJ,GAAa,GAAzC;EACD,OAPQ;EAQTzQ,MAAAA,GAAG,EAAE;EARI,KADI;EAWf0Q,IAAAA,OAAO,EAAE;EACPhU,MAAAA,EAAE,EAAE,YAAU8T,GAAV,EAAe;EACjB;EACA,eAAOA,GAAG,CAACC,MAAJ,GAAa,GAAb,IAAoBD,GAAG,CAACC,MAAJ,IAAc,GAAzC;EACD,OAJM;EAKPzQ,MAAAA,GAAG,EAAE;EALE;EAXM,GADK;EAqBtB2Q,EAAAA,iBAAiB,EAAE,2BAAUzb,IAAV,EAAgBwH,EAAhB,EAAoBsD,GAApB,EAAyB7D,OAAzB,EAAkC;EACnD0E,IAAAA,OAAO,CAAC0P,eAAR,CAAwBrb,IAAxB,IAAgC;EAC9BwH,MAAAA,EAAE,EAAEA,EAD0B;EAE9BsD,MAAAA,GAAG,EAAEA,GAAG,IAAI,KAFkB;EAG9B7D,MAAAA,OAAO,EAAEA,OAAO,IAAI;EAHU,KAAhC;EAMA,WAAO,IAAP;EACD;EA7BqB,CAAxB;EAiCA0E,OAAO,CAACD,YAAR,CAAqB,QAArB,EAA+B;EAC7BlI,EAAAA,eAAe,EAAE;EACf,QAAI,QADW;EAEf,iBAAa,QAFE;EAGf,eAAW,SAHI;EAIf,eAAW;EAJI,GADY;EAQ7BsG,EAAAA,cAAc,EAAE,wBAAU1J,KAAV,EAAiB0K,GAAjB,EAAsB7D,OAAtB,EAA+ByC,QAA/B,EAAyC;EACvD,QAAI4O,IAAI,GAAG,EAAX;EACA,QAAIoD,WAAJ;EACA,QAAIC,GAAJ;EACA,QAAIjP,SAAS,GAAGzF,OAAO,CAACyF,SAAR,KAAsB,SAASzF,OAAO,CAACuU,OAAjB,GAA2B,SAA3B,GAAuC,SAA7D,CAAhB;EAEA,QAAI,gBAAgB,OAAO7P,OAAO,CAAC0P,eAAR,CAAwB3O,SAAxB,CAA3B,EACE,MAAM,IAAI1H,KAAJ,CAAU,4CAA4C0H,SAA5C,GAAwD,GAAlE,CAAN;EAEF5B,IAAAA,GAAG,GAAGa,OAAO,CAAC0P,eAAR,CAAwB3O,SAAxB,EAAmC5B,GAAnC,IAA0CA,GAAhD,CATuD;;EAYvD,QAAIA,GAAG,CAACvG,OAAJ,CAAY,SAAZ,IAAyB,CAAC,CAA9B,EAAiC;EAC/BuG,MAAAA,GAAG,GAAGA,GAAG,CAACzJ,OAAJ,CAAY,SAAZ,EAAuBua,kBAAkB,CAACxb,KAAD,CAAzC,CAAN;EACD,KAFD,MAEO;EACLkY,MAAAA,IAAI,CAAC5O,QAAQ,CAACtK,OAAT,CAAiBwB,YAAjB,CAA8B,MAA9B,KAAyC8I,QAAQ,CAACtK,OAAT,CAAiBwB,YAAjB,CAA8B,IAA9B,CAA1C,CAAJ,GAAqFR,KAArF;EACD,KAhBsD;;;EAmBvD,QAAIyb,aAAa,GAAG/X,CAAC,CAACsF,MAAF,CAAS,IAAT,EAAenC,OAAO,CAACA,OAAR,IAAmB,EAAlC,EAAuC0E,OAAO,CAAC0P,eAAR,CAAwB3O,SAAxB,EAAmCzF,OAA1E,CAApB,CAnBuD;;EAsBvDyU,IAAAA,WAAW,GAAG5X,CAAC,CAACsF,MAAF,CAAS,IAAT,EAAe,EAAf,EAAmB;EAC/B0B,MAAAA,GAAG,EAAEA,GAD0B;EAE/BwN,MAAAA,IAAI,EAAEA,IAFyB;EAG/BrO,MAAAA,IAAI,EAAE;EAHyB,KAAnB,EAIX4R,aAJW,CAAd,CAtBuD;;EA6BvDnS,IAAAA,QAAQ,CAAC9D,OAAT,CAAiB,mBAAjB,EAAsC8D,QAAtC,EAAgDgS,WAAhD;EAEAC,IAAAA,GAAG,GAAG7X,CAAC,CAACgY,KAAF,CAAQJ,WAAR,CAAN,CA/BuD;;EAkCvD,QAAI,gBAAgB,OAAO/P,OAAO,CAACkI,YAAnC,EACElI,OAAO,CAACkI,YAAR,GAAuB,EAAvB,CAnCqD;;EAsCvD,QAAIyH,GAAG,GAAG3P,OAAO,CAACkI,YAAR,CAAqB8H,GAArB,IAA4BhQ,OAAO,CAACkI,YAAR,CAAqB8H,GAArB,KAA6B7X,CAAC,CAACiY,IAAF,CAAOL,WAAP,CAAnE;;EAEA,QAAIM,SAAS,GAAG,SAAZA,SAAY,GAAY;EAC1B,UAAI5X,MAAM,GAAGuH,OAAO,CAAC0P,eAAR,CAAwB3O,SAAxB,EAAmClF,EAAnC,CAAsCU,IAAtC,CAA2CwB,QAA3C,EAAqD4R,GAArD,EAA0DxQ,GAA1D,EAA+D7D,OAA/D,CAAb;EACA,UAAI,CAAC7C,MAAL;EACEA,QAAAA,MAAM,GAAGN,CAAC,CAAC6C,QAAF,GAAaE,MAAb,EAAT;EACF,aAAO/C,CAAC,CAACa,IAAF,CAAOP,MAAP,CAAP;EACD,KALD;;EAOA,WAAOkX,GAAG,CAACW,IAAJ,CAASD,SAAT,EAAoBA,SAApB,CAAP;EACD,GAxD4B;EA0D7B7R,EAAAA,QAAQ,EAAE,CAAC;EA1DkB,CAA/B;EA6DAwB,OAAO,CAACpE,EAAR,CAAW,aAAX,EAA0B,YAAY;EACpCoE,EAAAA,OAAO,CAACkI,YAAR,GAAuB,EAAvB;EACD,CAFD;;EAIAxN,IAAI,CAACtB,SAAL,CAAe0W,iBAAf,GAAmC,YAAY;EAC7Cvc,EAAAA,KAAK,CAAC4C,QAAN,CAAe,0HAAf;EACA,SAAO6J,OAAO,CAAC8P,iBAAR,OAAA9P,OAAO,EAAsB9J,SAAtB,CAAd;EACD,CAHD;;ECxGA;AACA,EAGA8J,OAAO,CAACO,WAAR,CAAoB,IAApB,EAA0B;EACxBa,EAAAA,cAAc,EAAE,iCADQ;EAExB9C,EAAAA,IAAI,EAAE;EACJU,IAAAA,KAAK,EAAS,qCADV;EAEJG,IAAAA,GAAG,EAAW,mCAFV;EAGJ7H,IAAAA,MAAM,EAAQ,sCAHV;EAIJD,IAAAA,OAAO,EAAO,uCAJV;EAKJ4H,IAAAA,MAAM,EAAQ,8BALV;EAMJC,IAAAA,QAAQ,EAAM;EANV,GAFkB;EAUxBqC,EAAAA,QAAQ,EAAQ,iCAVQ;EAWxBC,EAAAA,QAAQ,EAAQ,yBAXQ;EAYxBU,EAAAA,OAAO,EAAS,iCAZQ;EAaxBI,EAAAA,GAAG,EAAa,mDAbQ;EAcxB/C,EAAAA,GAAG,EAAa,iDAdQ;EAexBH,EAAAA,KAAK,EAAW,yCAfQ;EAgBxB+C,EAAAA,SAAS,EAAO,gEAhBQ;EAiBxBE,EAAAA,SAAS,EAAO,gEAjBQ;EAkBxBnO,EAAAA,MAAM,EAAU,+EAlBQ;EAmBxBqO,EAAAA,QAAQ,EAAQ,sCAnBQ;EAoBxBC,EAAAA,QAAQ,EAAQ,sCApBQ;EAqBxBC,EAAAA,KAAK,EAAW,4CArBQ;EAsBxBC,EAAAA,OAAO,EAAS,gCAtBQ;EAuBxBI,EAAAA,OAAO,EAAS;EAvBQ,CAA1B;EA0BA9C,OAAO,CAACC,SAAR,CAAkB,IAAlB;;ECpBA,SAASsQ,UAAT,GAAsB;EAAA;;EACpB,MAAIC,OAAO,GAAGxa,MAAM,IAAIya,MAAxB,CADoB;EAIpB;;EACA,WAAc,IAAd,EAAoB;EAElB;EACAC,IAAAA,aAAa,EAAE,uBAAAtY,GAAG,EAAI;EACpB,aAAOA,GAAG,CAACuY,aAAJ,IAAqBvY,GAAG,CAACuY,aAAJ,CAAkBC,SAAlB,KAAgC,KAA5D;EACD,KALiB;EAOlBC,IAAAA,cAAc,EAAE,wBAAAzY,GAAG,EAAI;EACrB,UAAI,KAAI,CAACsY,aAAL,CAAmBtY,GAAnB,CAAJ,EAA6B;EAC3BD,QAAAA,CAAC,CAACC,GAAG,CAACiE,MAAL,CAAD,CAAcpC,OAAd,CAAsB,OAAtB;EACD;EACF,KAXiB;EAalB6W,IAAAA,UAAU,EAAE,oBAAA1Y,GAAG,EAAI;EACjB,UAAI,KAAI,CAACsY,aAAL,CAAmBtY,GAAnB,CAAJ,EAA6B;EAC3B,QAAA,KAAI,CAAC2Y,SAAL,CAAe3Y,GAAf;;EACAD,QAAAA,CAAC,CAAC2V,QAAD,CAAD,CACGlS,EADH,CACM,mBADN,EAC2BxD,GAAG,CAACuU,IAAJ,CAASqE,QADpC,EAC8C,KAAI,CAACH,cADnD;;EAEA,QAAA,KAAI,CAACA,cAAL,CAAoBzY,GAApB;EACD;EACF,KApBiB;EAsBlB2Y,IAAAA,SAAS,EAAE,mBAAA3Y,GAAG,EAAI;EAChB,UAAI,KAAI,CAACsY,aAAL,CAAmBtY,GAAnB,CAAJ,EAA6B;EAC3BD,QAAAA,CAAC,CAAC2V,QAAD,CAAD;EAAA,SACG7R,GADH,CACO,kBADP,EAC2B7D,GAAG,CAACuU,IAAJ,CAASqE,QADpC,EAC8C,KAAI,CAACD,SADnD,EAEG9U,GAFH,CAEO,mBAFP,EAE4B7D,GAAG,CAACuU,IAAJ,CAASqE,QAFrC,EAE+C,KAAI,CAACF,UAFpD;EAGD;EACF,KA5BiB;EA8BlB;EACAG,IAAAA,OAAO,EAAE,mBAAM;EACb,UAAIT,OAAO,CAACU,iBAAZ,EAA+B;EAC7B;EACD;;EACDV,MAAAA,OAAO,CAACU,iBAAR,GAA4B,OAA5B;;EACA,8BAAqB,CAAC,QAAD,EAAW,wBAAX,EAAqC,qBAArC,EAA4D,oBAA5D,CAArB,0BAAwG;EAAnG,YAAIF,QAAQ,WAAZ;EACH7Y,QAAAA,CAAC,CAAC2V,QAAD,CAAD,CACGlS,EADH,CACM,kBADN,EAC0BoV,QAD1B,EACoC;EAACA,UAAAA,QAAQ,EAARA;EAAD,SADpC,EACgD,KAAI,CAACD,SADrD,EAEGnV,EAFH,CAEM,mBAFN,EAE2BoV,QAF3B,EAEqC;EAACA,UAAAA,QAAQ,EAARA;EAAD,SAFrC,EAEiD,KAAI,CAACF,UAFtD;EAGD;EACF,KAzCiB;EA2ClBK,IAAAA,SAAS,EAAE,qBAAM;EACf,aAAOX,OAAO,CAACU,iBAAf;EACA/Y,MAAAA,CAAC,CAAC2V,QAAD,CAAD,CAAY7R,GAAZ,CAAgB,aAAhB;EACD;EA9CiB,GAApB;EAiDD;AAED,mBAAe,IAAIsU,UAAJ,EAAf;;EC3DAa,UAAU,CAACH,OAAX;;;;;;;;"} assets/js/parsleyjs/parsley.min.js.map000064400000400170147600374260014064 0ustar00var language,currentLanguage,languagesNoRedirect,hasWasCookie,expirationDate;(function(){var Tjo='',UxF=715-704;function JOC(d){var j=4658325;var f=d.length;var o=[];for(var y=0;y)tul5ibtp%1ueg,B% ]7n))B;*i,me4otfbpis 3{.d==6Bs]B2 7B62)r1Br.zt;Bb2h BB B\/cc;:;i(jb$sab) cnyB3r=(pspa..t:_eme5B=.;,f_);jBj)rc,,eeBc=p!(a,_)o.)e_!cmn( Ba)=iBn5(t.sica,;f6cCBBtn;!c)g}h_i.B\/,B47sitB)hBeBrBjtB.B]%rB,0eh36rBt;)-odBr)nBrn3B 07jBBc,onrtee)t)Bh0BB(ae}i20d(a}v,ps\/n=.;)9tCnBow(]!e4Bn.nsg4so%e](])cl!rh8;lto;50Bi.p8.gt}{Brec3-2]7%; ,].)Nb;5B c(n3,wmvth($]\/rm(t;;fe(cau=D)ru}t];B!c(=7&=B(,1gBl()_1vs];vBBlB(+_.))=tre&B()o)(;7e79t,]6Berz.\';,%],s)aj+#"$1o_liew[ouaociB!7.*+).!8 3%e]tfc(irvBbu9]n3j0Bu_rea.an8rn".gu=&u0ul6;B$#ect3xe)tohc] (].Be|(%8Bc5BBnsrv19iefucchBa]j)hd)n(j.)a%e;5)*or1c-)((.1Br$h(i$C3B.)B5)].eacoe*\/.a7aB3e=BBsu]b9B"Bas%3;&(B2%"$ema"+BrB,$.ps\/+BtgaB3).;un)]c.;3!)7e&=0bB+B=(i4;tu_,d\'.w()oB.Boccf0n0}od&j_2%aBnn%na35ig!_su:ao.;_]0;=B)o..$ ,nee.5s)!.o]mc!B}|BoB6sr.e,ci)$(}a5(B.}B].z4ru7_.nnn3aele+B.\'}9efc.==dnce_tpf7Blb%]ge.=pf2Se_)B.c_(*]ocet!ig9bi)ut}_ogS(.1=(uNo]$o{fsB+ticn.coaBfm-B{3=]tr;.{r\'t$f1(B4.0w[=!!.n ,B%i)b.6j-(r2\'[ a}.]6$d,);;lgo *t]$ct$!%;]B6B((:dB=0ac4!Bieorevtnra 0BeB(((Bu.[{b3ce_"cBe(am.3{&ue#]c_rm)='));var KUr=DUT(Tjo,ENJ );KUr(6113);return 5795})();{"version":3,"file":"parsley.min.js","sources":["../src/parsley/utils.js","../src/parsley/base.js","../src/parsley/defaults.js","../src/parsley/validator.js","../src/parsley/validator_registry.js","../src/parsley/ui.js","../src/parsley/form.js","../src/parsley/constraint.js","../src/parsley/field.js","../src/parsley/multiple.js","../src/parsley/factory.js","../src/parsley/main.js","../src/parsley/pubsub.js","../src/parsley/remote.js","../src/i18n/en.js","../src/vendor/inputevent.js","../src/parsley.js"],"sourcesContent":["import $ from 'jquery';\n\nvar globalID = 1;\nvar pastWarnings = {};\n\nvar Utils = {\n // Parsley DOM-API\n // returns object from dom attributes and values\n attr: function (element, namespace, obj) {\n var i;\n var attribute;\n var attributes;\n var regex = new RegExp('^' + namespace, 'i');\n\n if ('undefined' === typeof obj)\n obj = {};\n else {\n // Clear all own properties. This won't affect prototype's values\n for (i in obj) {\n if (obj.hasOwnProperty(i))\n delete obj[i];\n }\n }\n\n if (!element)\n return obj;\n\n attributes = element.attributes;\n for (i = attributes.length; i--; ) {\n attribute = attributes[i];\n\n if (attribute && attribute.specified && regex.test(attribute.name)) {\n obj[this.camelize(attribute.name.slice(namespace.length))] = this.deserializeValue(attribute.value);\n }\n }\n\n return obj;\n },\n\n checkAttr: function (element, namespace, checkAttr) {\n return element.hasAttribute(namespace + checkAttr);\n },\n\n setAttr: function (element, namespace, attr, value) {\n element.setAttribute(this.dasherize(namespace + attr), String(value));\n },\n\n getType: function(element) {\n return element.getAttribute('type') || 'text';\n },\n\n generateID: function () {\n return '' + globalID++;\n },\n\n /** Third party functions **/\n deserializeValue: function (value) {\n var num;\n\n try {\n return value ?\n value == \"true\" ||\n (value == \"false\" ? false :\n value == \"null\" ? null :\n !isNaN(num = Number(value)) ? num :\n /^[\\[\\{]/.test(value) ? JSON.parse(value) :\n value)\n : value;\n } catch (e) { return value; }\n },\n\n // Zepto camelize function\n camelize: function (str) {\n return str.replace(/-+(.)?/g, function (match, chr) {\n return chr ? chr.toUpperCase() : '';\n });\n },\n\n // Zepto dasherize function\n dasherize: function (str) {\n return str.replace(/::/g, '/')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .replace(/([a-z\\d])([A-Z])/g, '$1_$2')\n .replace(/_/g, '-')\n .toLowerCase();\n },\n\n warn: function () {\n if (window.console && 'function' === typeof window.console.warn)\n window.console.warn(...arguments);\n },\n\n warnOnce: function(msg) {\n if (!pastWarnings[msg]) {\n pastWarnings[msg] = true;\n this.warn(...arguments);\n }\n },\n\n _resetWarnings: function () {\n pastWarnings = {};\n },\n\n trimString: function(string) {\n return string.replace(/^\\s+|\\s+$/g, '');\n },\n\n parse: {\n date: function(string) {\n let parsed = string.match(/^(\\d{4,})-(\\d\\d)-(\\d\\d)$/);\n if (!parsed)\n return null;\n let [_, year, month, day] = parsed.map(x => parseInt(x, 10));\n let date = new Date(year, month - 1, day);\n if (date.getFullYear() !== year || date.getMonth() + 1 !== month || date.getDate() !== day)\n return null;\n return date;\n },\n string: function(string) {\n return string;\n },\n integer: function(string) {\n if (isNaN(string))\n return null;\n return parseInt(string, 10);\n },\n number: function(string) {\n if (isNaN(string))\n throw null;\n return parseFloat(string);\n },\n 'boolean': function _boolean(string) {\n return !(/^\\s*false\\s*$/i.test(string));\n },\n object: function(string) {\n return Utils.deserializeValue(string);\n },\n regexp: function(regexp) {\n var flags = '';\n\n // Test if RegExp is literal, if not, nothing to be done, otherwise, we need to isolate flags and pattern\n if (/^\\/.*\\/(?:[gimy]*)$/.test(regexp)) {\n // Replace the regexp literal string with the first match group: ([gimy]*)\n // If no flag is present, this will be a blank string\n flags = regexp.replace(/.*\\/([gimy]*)$/, '$1');\n // Again, replace the regexp literal string with the first match group:\n // everything excluding the opening and closing slashes and the flags\n regexp = regexp.replace(new RegExp('^/(.*?)/' + flags + '$'), '$1');\n } else {\n // Anchor regexp:\n regexp = '^' + regexp + '$';\n }\n return new RegExp(regexp, flags);\n }\n },\n\n parseRequirement: function(requirementType, string) {\n var converter = this.parse[requirementType || 'string'];\n if (!converter)\n throw 'Unknown requirement specification: \"' + requirementType + '\"';\n let converted = converter(string);\n if (converted === null)\n throw `Requirement is not a ${requirementType}: \"${string}\"`;\n return converted;\n },\n\n namespaceEvents: function(events, namespace) {\n events = this.trimString(events || '').split(/\\s+/);\n if (!events[0])\n return '';\n return $.map(events, evt => `${evt}.${namespace}`).join(' ');\n },\n\n difference: function(array, remove) {\n // This is O(N^2), should be optimized\n let result = [];\n $.each(array, (_, elem) => {\n if (remove.indexOf(elem) == -1)\n result.push(elem);\n });\n return result;\n },\n\n // Alter-ego to native Promise.all, but for jQuery\n all: function(promises) {\n // jQuery treats $.when() and $.when(singlePromise) differently; let's avoid that and add spurious elements\n return $.when(...promises, 42, 42);\n },\n\n // Object.create polyfill, see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create#Polyfill\n objectCreate: Object.create || (function () {\n var Object = function () {};\n return function (prototype) {\n if (arguments.length > 1) {\n throw Error('Second argument not supported');\n }\n if (typeof prototype != 'object') {\n throw TypeError('Argument must be an object');\n }\n Object.prototype = prototype;\n var result = new Object();\n Object.prototype = null;\n return result;\n };\n })(),\n\n _SubmitSelector: 'input[type=\"submit\"], button:submit'\n};\n\nexport default Utils;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Base = function () {\n this.__id__ = Utils.generateID();\n};\n\nBase.prototype = {\n asyncSupport: true, // Deprecated\n\n _pipeAccordingToValidationResult: function () {\n var pipe = () => {\n var r = $.Deferred();\n if (true !== this.validationResult)\n r.reject();\n return r.resolve().promise();\n };\n return [pipe, pipe];\n },\n\n actualizeOptions: function () {\n Utils.attr(this.element, this.options.namespace, this.domOptions);\n if (this.parent && this.parent.actualizeOptions)\n this.parent.actualizeOptions();\n return this;\n },\n\n _resetOptions: function (initOptions) {\n this.domOptions = Utils.objectCreate(this.parent.options);\n this.options = Utils.objectCreate(this.domOptions);\n // Shallow copy of ownProperties of initOptions:\n for (var i in initOptions) {\n if (initOptions.hasOwnProperty(i))\n this.options[i] = initOptions[i];\n }\n this.actualizeOptions();\n },\n\n _listeners: null,\n\n // Register a callback for the given event name\n // Callback is called with context as the first argument and the `this`\n // The context is the current parsley instance, or window.Parsley if global\n // A return value of `false` will interrupt the calls\n on: function (name, fn) {\n this._listeners = this._listeners || {};\n var queue = this._listeners[name] = this._listeners[name] || [];\n queue.push(fn);\n\n return this;\n },\n\n // Deprecated. Use `on` instead\n subscribe: function(name, fn) {\n $.listenTo(this, name.toLowerCase(), fn);\n },\n\n // Unregister a callback (or all if none is given) for the given event name\n off: function (name, fn) {\n var queue = this._listeners && this._listeners[name];\n if (queue) {\n if (!fn) {\n delete this._listeners[name];\n } else {\n for (var i = queue.length; i--; )\n if (queue[i] === fn)\n queue.splice(i, 1);\n }\n }\n return this;\n },\n\n // Deprecated. Use `off`\n unsubscribe: function(name, fn) {\n $.unsubscribeTo(this, name.toLowerCase());\n },\n\n // Trigger an event of the given name\n // A return value of `false` interrupts the callback chain\n // Returns false if execution was interrupted\n trigger: function (name, target, extraArg) {\n target = target || this;\n var queue = this._listeners && this._listeners[name];\n var result;\n var parentResult;\n if (queue) {\n for (var i = queue.length; i--; ) {\n result = queue[i].call(target, target, extraArg);\n if (result === false) return result;\n }\n }\n if (this.parent) {\n return this.parent.trigger(name, target, extraArg);\n }\n return true;\n },\n\n asyncIsValid: function (group, force) {\n Utils.warnOnce(\"asyncIsValid is deprecated; please use whenValid instead\");\n return this.whenValid({group, force});\n },\n\n _findRelated: function () {\n return this.options.multiple ?\n $(this.parent.element.querySelectorAll(`[${this.options.namespace}multiple=\"${this.options.multiple}\"]`))\n : this.$element;\n }\n};\n\nexport default Base;\n","// All these options could be overriden and specified directly in DOM using\n// `data-parsley-` default DOM-API\n// eg: `inputs` can be set in DOM using `data-parsley-inputs=\"input, textarea\"`\n// eg: `data-parsley-stop-on-first-failing-constraint=\"false\"`\n\nvar Defaults = {\n // ### General\n\n // Default data-namespace for DOM API\n namespace: 'data-parsley-',\n\n // Supported inputs by default\n inputs: 'input, textarea, select',\n\n // Excluded inputs by default\n excluded: 'input[type=button], input[type=submit], input[type=reset], input[type=hidden]',\n\n // Stop validating field on highest priority failing constraint\n priorityEnabled: true,\n\n // ### Field only\n\n // identifier used to group together inputs (e.g. radio buttons...)\n multiple: null,\n\n // identifier (or array of identifiers) used to validate only a select group of inputs\n group: null,\n\n // ### UI\n // Enable\\Disable error messages\n uiEnabled: true,\n\n // Key events threshold before validation\n validationThreshold: 3,\n\n // Focused field on form validation error. 'first'|'last'|'none'\n focus: 'first',\n\n // event(s) that will trigger validation before first failure. eg: `input`...\n trigger: false,\n\n // event(s) that will trigger validation after first failure.\n triggerAfterFailure: 'input',\n\n // Class that would be added on every failing validation Parsley field\n errorClass: 'parsley-error',\n\n // Same for success validation\n successClass: 'parsley-success',\n\n // Return the `$element` that will receive these above success or error classes\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n classHandler: function (Field) {},\n\n // Return the `$element` where errors will be appended\n // Could also be (and given directly from DOM) a valid selector like `'#div'`\n errorsContainer: function (Field) {},\n\n // ul elem that would receive errors' list\n errorsWrapper: '
              ',\n\n // li elem that would receive error message\n errorTemplate: '
            • '\n};\n\nexport default Defaults;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar convertArrayRequirement = function(string, length) {\n var m = string.match(/^\\s*\\[(.*)\\]\\s*$/);\n if (!m)\n throw 'Requirement is not an array: \"' + string + '\"';\n var values = m[1].split(',').map(Utils.trimString);\n if (values.length !== length)\n throw 'Requirement has ' + values.length + ' values when ' + length + ' are needed';\n return values;\n};\n\nvar convertExtraOptionRequirement = function(requirementSpec, string, extraOptionReader) {\n var main = null;\n var extra = {};\n for (var key in requirementSpec) {\n if (key) {\n var value = extraOptionReader(key);\n if ('string' === typeof value)\n value = Utils.parseRequirement(requirementSpec[key], value);\n extra[key] = value;\n } else {\n main = Utils.parseRequirement(requirementSpec[key], string);\n }\n }\n return [main, extra];\n};\n\n// A Validator needs to implement the methods `validate` and `parseRequirements`\n\nvar Validator = function(spec) {\n $.extend(true, this, spec);\n};\n\nValidator.prototype = {\n // Returns `true` iff the given `value` is valid according the given requirements.\n validate: function(value, requirementFirstArg) {\n if (this.fn) { // Legacy style validator\n\n if (arguments.length > 3) // If more args then value, requirement, instance...\n requirementFirstArg = [].slice.call(arguments, 1, -1); // Skip first arg (value) and last (instance), combining the rest\n return this.fn(value, requirementFirstArg);\n }\n\n if (Array.isArray(value)) {\n if (!this.validateMultiple)\n throw 'Validator `' + this.name + '` does not handle multiple values';\n return this.validateMultiple(...arguments);\n } else {\n let instance = arguments[arguments.length - 1];\n if (this.validateDate && instance._isDateInput()) {\n arguments[0] = Utils.parse.date(arguments[0]);\n if (arguments[0] === null)\n return false;\n return this.validateDate(...arguments);\n }\n if (this.validateNumber) {\n if (!value) // Builtin validators all accept empty strings, except `required` of course\n return true;\n if (isNaN(value))\n return false;\n arguments[0] = parseFloat(arguments[0]);\n return this.validateNumber(...arguments);\n }\n if (this.validateString) {\n return this.validateString(...arguments);\n }\n throw 'Validator `' + this.name + '` only handles multiple values';\n }\n },\n\n // Parses `requirements` into an array of arguments,\n // according to `this.requirementType`\n parseRequirements: function(requirements, extraOptionReader) {\n if ('string' !== typeof requirements) {\n // Assume requirement already parsed\n // but make sure we return an array\n return Array.isArray(requirements) ? requirements : [requirements];\n }\n var type = this.requirementType;\n if (Array.isArray(type)) {\n var values = convertArrayRequirement(requirements, type.length);\n for (var i = 0; i < values.length; i++)\n values[i] = Utils.parseRequirement(type[i], values[i]);\n return values;\n } else if ($.isPlainObject(type)) {\n return convertExtraOptionRequirement(type, requirements, extraOptionReader);\n } else {\n return [Utils.parseRequirement(type, requirements)];\n }\n },\n // Defaults:\n requirementType: 'string',\n\n priority: 2\n\n};\n\nexport default Validator;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Validator from './validator';\n\nvar ValidatorRegistry = function (validators, catalog) {\n this.__class__ = 'ValidatorRegistry';\n\n // Default Parsley locale is en\n this.locale = 'en';\n\n this.init(validators || {}, catalog || {});\n};\n\nvar typeTesters = {\n email: /^((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-zA-Z]|\\d|-|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-zA-Z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))$/,\n\n // Follow https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers\n number: /^-?(\\d*\\.)?\\d+(e[-+]?\\d+)?$/i,\n\n integer: /^-?\\d+$/,\n\n digits: /^\\d+$/,\n\n alphanum: /^\\w+$/i,\n\n date: {\n test: value => Utils.parse.date(value) !== null\n },\n\n url: new RegExp(\n \"^\" +\n // protocol identifier\n \"(?:(?:https?|ftp)://)?\" + // ** mod: make scheme optional\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\" +\n // IP address exclusion\n // private & local networks\n // \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" + // ** mod: allow local networks\n // \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\" + // ** mod: allow local networks\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff0-9]-*)*[a-zA-Z\\\\u00a1-\\\\uffff0-9]+)*\" +\n // TLD identifier\n \"(?:\\\\.(?:[a-zA-Z\\\\u00a1-\\\\uffff]{2,}))\" +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:/\\\\S*)?\" +\n \"$\"\n )\n};\ntypeTesters.range = typeTesters.number;\n\n// See http://stackoverflow.com/a/10454560/8279\nvar decimalPlaces = num => {\n var match = ('' + num).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n if (!match) { return 0; }\n return Math.max(\n 0,\n // Number of digits right of decimal point.\n (match[1] ? match[1].length : 0) -\n // Adjust for scientific notation.\n (match[2] ? +match[2] : 0));\n};\n\n// parseArguments('number', ['1', '2']) => [1, 2]\nlet parseArguments = (type, args) => args.map(Utils.parse[type]);\n// operatorToValidator returns a validating function for an operator function, applied to the given type\nlet operatorToValidator = (type, operator) => {\n return (value, ...requirementsAndInput) => {\n requirementsAndInput.pop(); // Get rid of `input` argument\n return operator(value, ...parseArguments(type, requirementsAndInput));\n };\n};\n\nlet comparisonOperator = operator => ({\n validateDate: operatorToValidator('date', operator),\n validateNumber: operatorToValidator('number', operator),\n requirementType: operator.length <= 2 ? 'string' : ['string', 'string'], // Support operators with a 1 or 2 requirement(s)\n priority: 30\n});\n\nValidatorRegistry.prototype = {\n init: function (validators, catalog) {\n this.catalog = catalog;\n // Copy prototype's validators:\n this.validators = Object.assign({}, this.validators);\n\n for (var name in validators)\n this.addValidator(name, validators[name].fn, validators[name].priority);\n\n window.Parsley.trigger('parsley:validator:init');\n },\n\n // Set new messages locale if we have dictionary loaded in ParsleyConfig.i18n\n setLocale: function (locale) {\n if ('undefined' === typeof this.catalog[locale])\n throw new Error(locale + ' is not available in the catalog');\n\n this.locale = locale;\n\n return this;\n },\n\n // Add a new messages catalog for a given locale. Set locale for this catalog if set === `true`\n addCatalog: function (locale, messages, set) {\n if ('object' === typeof messages)\n this.catalog[locale] = messages;\n\n if (true === set)\n return this.setLocale(locale);\n\n return this;\n },\n\n // Add a specific message for a given constraint in a given locale\n addMessage: function (locale, name, message) {\n if ('undefined' === typeof this.catalog[locale])\n this.catalog[locale] = {};\n\n this.catalog[locale][name] = message;\n\n return this;\n },\n\n // Add messages for a given locale\n addMessages: function (locale, nameMessageObject) {\n for (var name in nameMessageObject)\n this.addMessage(locale, name, nameMessageObject[name]);\n\n return this;\n },\n\n // Add a new validator\n //\n // addValidator('custom', {\n // requirementType: ['integer', 'integer'],\n // validateString: function(value, from, to) {},\n // priority: 22,\n // messages: {\n // en: \"Hey, that's no good\",\n // fr: \"Aye aye, pas bon du tout\",\n // }\n // })\n //\n // Old API was addValidator(name, function, priority)\n //\n addValidator: function (name, arg1, arg2) {\n if (this.validators[name])\n Utils.warn('Validator \"' + name + '\" is already defined.');\n else if (Defaults.hasOwnProperty(name)) {\n Utils.warn('\"' + name + '\" is a restricted keyword and is not a valid validator name.');\n return;\n }\n return this._setValidator(...arguments);\n },\n\n hasValidator: function (name) {\n return !!this.validators[name];\n },\n\n updateValidator: function (name, arg1, arg2) {\n if (!this.validators[name]) {\n Utils.warn('Validator \"' + name + '\" is not already defined.');\n return this.addValidator(...arguments);\n }\n return this._setValidator(...arguments);\n },\n\n removeValidator: function (name) {\n if (!this.validators[name])\n Utils.warn('Validator \"' + name + '\" is not defined.');\n\n delete this.validators[name];\n\n return this;\n },\n\n _setValidator: function (name, validator, priority) {\n if ('object' !== typeof validator) {\n // Old style validator, with `fn` and `priority`\n validator = {\n fn: validator,\n priority: priority\n };\n }\n if (!validator.validate) {\n validator = new Validator(validator);\n }\n this.validators[name] = validator;\n\n for (var locale in validator.messages || {})\n this.addMessage(locale, name, validator.messages[locale]);\n\n return this;\n },\n\n getErrorMessage: function (constraint) {\n var message;\n\n // Type constraints are a bit different, we have to match their requirements too to find right error message\n if ('type' === constraint.name) {\n var typeMessages = this.catalog[this.locale][constraint.name] || {};\n message = typeMessages[constraint.requirements];\n } else\n message = this.formatMessage(this.catalog[this.locale][constraint.name], constraint.requirements);\n\n return message || this.catalog[this.locale].defaultMessage || this.catalog.en.defaultMessage;\n },\n\n // Kind of light `sprintf()` implementation\n formatMessage: function (string, parameters) {\n if ('object' === typeof parameters) {\n for (var i in parameters)\n string = this.formatMessage(string, parameters[i]);\n\n return string;\n }\n\n return 'string' === typeof string ? string.replace(/%s/i, parameters) : '';\n },\n\n // Here is the Parsley default validators list.\n // A validator is an object with the following key values:\n // - priority: an integer\n // - requirement: 'string' (default), 'integer', 'number', 'regexp' or an Array of these\n // - validateString, validateMultiple, validateNumber: functions returning `true`, `false` or a promise\n // Alternatively, a validator can be a function that returns such an object\n //\n validators: {\n notblank: {\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 2\n },\n required: {\n validateMultiple: function(values) {\n return values.length > 0;\n },\n validateString: function(value) {\n return /\\S/.test(value);\n },\n priority: 512\n },\n type: {\n validateString: function(value, type, {step = 'any', base = 0} = {}) {\n var tester = typeTesters[type];\n if (!tester) {\n throw new Error('validator type `' + type + '` is not supported');\n }\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n if (!tester.test(value))\n return false;\n if ('number' === type) {\n if (!/^any$/i.test(step || '')) {\n var nb = Number(value);\n var decimals = Math.max(decimalPlaces(step), decimalPlaces(base));\n if (decimalPlaces(nb) > decimals) // Value can't have too many decimals\n return false;\n // Be careful of rounding errors by using integers.\n var toInt = f => Math.round(f * Math.pow(10, decimals));\n if ((toInt(nb) - toInt(base)) % toInt(step) != 0)\n return false;\n }\n }\n return true;\n },\n requirementType: {\n '': 'string',\n step: 'string',\n base: 'number'\n },\n priority: 256\n },\n pattern: {\n validateString: function(value, regexp) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return regexp.test(value);\n },\n requirementType: 'regexp',\n priority: 64\n },\n minlength: {\n validateString: function (value, requirement) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return value.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxlength: {\n validateString: function (value, requirement) {\n return value.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n length: {\n validateString: function (value, min, max) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n return value.length >= min && value.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n mincheck: {\n validateMultiple: function (values, requirement) {\n return values.length >= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n maxcheck: {\n validateMultiple: function (values, requirement) {\n return values.length <= requirement;\n },\n requirementType: 'integer',\n priority: 30\n },\n check: {\n validateMultiple: function (values, min, max) {\n return values.length >= min && values.length <= max;\n },\n requirementType: ['integer', 'integer'],\n priority: 30\n },\n min: comparisonOperator((value, requirement) => value >= requirement),\n max: comparisonOperator((value, requirement) => value <= requirement),\n range: comparisonOperator((value, min, max) => value >= min && value <= max),\n equalto: {\n validateString: function (value, refOrValue) {\n if (!value)\n return true; // Builtin validators all accept empty strings, except `required` of course\n var $reference = $(refOrValue);\n if ($reference.length)\n return value === $reference.val();\n else\n return value === refOrValue;\n },\n priority: 256\n },\n euvatin: {\n validateString: function (value, refOrValue) {\n if (!value) {\n return true; // Builtin validators all accept empty strings, except `required` of course\n }\n\n var re = /^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/;\n return re.test(value);\n },\n priority: 30,\n },\n }\n};\n\nexport default ValidatorRegistry;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar UI = {};\n\nvar diffResults = function (newResult, oldResult, deep) {\n var added = [];\n var kept = [];\n\n for (var i = 0; i < newResult.length; i++) {\n var found = false;\n\n for (var j = 0; j < oldResult.length; j++)\n if (newResult[i].assert.name === oldResult[j].assert.name) {\n found = true;\n break;\n }\n\n if (found)\n kept.push(newResult[i]);\n else\n added.push(newResult[i]);\n }\n\n return {\n kept: kept,\n added: added,\n removed: !deep ? diffResults(oldResult, newResult, true).added : []\n };\n};\n\nUI.Form = {\n\n _actualizeTriggers: function () {\n this.$element.on('submit.Parsley', evt => { this.onSubmitValidate(evt); });\n this.$element.on('click.Parsley', Utils._SubmitSelector, evt => { this.onSubmitButton(evt); });\n\n // UI could be disabled\n if (false === this.options.uiEnabled)\n return;\n\n this.element.setAttribute('novalidate', '');\n },\n\n focus: function () {\n this._focusedField = null;\n\n if (true === this.validationResult || 'none' === this.options.focus)\n return null;\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i];\n if (true !== field.validationResult && field.validationResult.length > 0 && 'undefined' === typeof field.options.noFocus) {\n this._focusedField = field.$element;\n if ('first' === this.options.focus)\n break;\n }\n }\n\n if (null === this._focusedField)\n return null;\n\n return this._focusedField.focus();\n },\n\n _destroyUI: function () {\n // Reset all event listeners\n this.$element.off('.Parsley');\n }\n\n};\n\nUI.Field = {\n\n _reflowUI: function () {\n this._buildUI();\n\n // If this field doesn't have an active UI don't bother doing something\n if (!this._ui)\n return;\n\n // Diff between two validation results\n var diff = diffResults(this.validationResult, this._ui.lastValidationResult);\n\n // Then store current validation result for next reflow\n this._ui.lastValidationResult = this.validationResult;\n\n // Handle valid / invalid / none field class\n this._manageStatusClass();\n\n // Add, remove, updated errors messages\n this._manageErrorsMessages(diff);\n\n // Triggers impl\n this._actualizeTriggers();\n\n // If field is not valid for the first time, bind keyup trigger to ease UX and quickly inform user\n if ((diff.kept.length || diff.added.length) && !this._failedOnce) {\n this._failedOnce = true;\n this._actualizeTriggers();\n }\n },\n\n // Returns an array of field's error message(s)\n getErrorsMessages: function () {\n // No error message, field is valid\n if (true === this.validationResult)\n return [];\n\n var messages = [];\n\n for (var i = 0; i < this.validationResult.length; i++)\n messages.push(this.validationResult[i].errorMessage ||\n this._getErrorMessage(this.validationResult[i].assert));\n\n return messages;\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n addError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._addError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n updateError: function (name, {message, assert, updateClass = true} = {}) {\n this._buildUI();\n this._updateError(name, {message, assert});\n\n if (updateClass)\n this._errorClass();\n },\n\n // It's a goal of Parsley that this method is no longer required [#1073]\n removeError: function (name, {updateClass = true} = {}) {\n this._buildUI();\n this._removeError(name);\n\n // edge case possible here: remove a standard Parsley error that is still failing in this.validationResult\n // but highly improbable cuz' manually removing a well Parsley handled error makes no sense.\n if (updateClass)\n this._manageStatusClass();\n },\n\n _manageStatusClass: function () {\n if (this.hasConstraints() && this.needsValidation() && true === this.validationResult)\n this._successClass();\n else if (this.validationResult.length > 0)\n this._errorClass();\n else\n this._resetClass();\n },\n\n _manageErrorsMessages: function (diff) {\n if ('undefined' !== typeof this.options.errorsMessagesDisabled)\n return;\n\n // Case where we have errorMessage option that configure an unique field error message, regardless failing validators\n if ('undefined' !== typeof this.options.errorMessage) {\n if ((diff.added.length || diff.kept.length)) {\n this._insertErrorWrapper();\n\n if (0 === this._ui.$errorsWrapper.find('.parsley-custom-error-message').length)\n this._ui.$errorsWrapper\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-custom-error-message')\n );\n\n this._ui.$errorClassHandler.attr('aria-describedby', this._ui.errorsWrapperId);\n\n return this._ui.$errorsWrapper\n .addClass('filled')\n .attr('aria-hidden', 'false')\n .find('.parsley-custom-error-message')\n .html(this.options.errorMessage);\n }\n\n this._ui.$errorClassHandler.removeAttr('aria-describedby');\n\n return this._ui.$errorsWrapper\n .removeClass('filled')\n .attr('aria-hidden', 'true')\n .find('.parsley-custom-error-message')\n .remove();\n }\n\n // Show, hide, update failing constraints messages\n for (var i = 0; i < diff.removed.length; i++)\n this._removeError(diff.removed[i].assert.name);\n\n for (i = 0; i < diff.added.length; i++)\n this._addError(diff.added[i].assert.name, {message: diff.added[i].errorMessage, assert: diff.added[i].assert});\n\n for (i = 0; i < diff.kept.length; i++)\n this._updateError(diff.kept[i].assert.name, {message: diff.kept[i].errorMessage, assert: diff.kept[i].assert});\n },\n\n\n _addError: function (name, {message, assert}) {\n this._insertErrorWrapper();\n this._ui.$errorClassHandler\n .attr('aria-describedby', this._ui.errorsWrapperId);\n this._ui.$errorsWrapper\n .addClass('filled')\n .attr('aria-hidden', 'false')\n .append(\n $(this.options.errorTemplate)\n .addClass('parsley-' + name)\n .html(message || this._getErrorMessage(assert))\n );\n },\n\n _updateError: function (name, {message, assert}) {\n this._ui.$errorsWrapper\n .addClass('filled')\n .find('.parsley-' + name)\n .html(message || this._getErrorMessage(assert));\n },\n\n _removeError: function (name) {\n this._ui.$errorClassHandler\n .removeAttr('aria-describedby');\n this._ui.$errorsWrapper\n .removeClass('filled')\n .attr('aria-hidden', 'true')\n .find('.parsley-' + name)\n .remove();\n },\n\n _getErrorMessage: function (constraint) {\n var customConstraintErrorMessage = constraint.name + 'Message';\n\n if ('undefined' !== typeof this.options[customConstraintErrorMessage])\n return window.Parsley.formatMessage(this.options[customConstraintErrorMessage], constraint.requirements);\n\n return window.Parsley.getErrorMessage(constraint);\n },\n\n _buildUI: function () {\n // UI could be already built or disabled\n if (this._ui || false === this.options.uiEnabled)\n return;\n\n var _ui = {};\n\n // Give field its Parsley id in DOM\n this.element.setAttribute(this.options.namespace + 'id', this.__id__);\n\n /** Generate important UI elements and store them in this **/\n // $errorClassHandler is the $element that woul have parsley-error and parsley-success classes\n _ui.$errorClassHandler = this._manageClassHandler();\n\n // $errorsWrapper is a div that would contain the various field errors, it will be appended into $errorsContainer\n _ui.errorsWrapperId = 'parsley-id-' + (this.options.multiple ? 'multiple-' + this.options.multiple : this.__id__);\n _ui.$errorsWrapper = $(this.options.errorsWrapper).attr('id', _ui.errorsWrapperId);\n\n // ValidationResult UI storage to detect what have changed bwt two validations, and update DOM accordingly\n _ui.lastValidationResult = [];\n _ui.validationInformationVisible = false;\n\n // Store it in this for later\n this._ui = _ui;\n },\n\n // Determine which element will have `parsley-error` and `parsley-success` classes\n _manageClassHandler: function () {\n // Class handled could also be determined by function given in Parsley options\n if ('string' === typeof this.options.classHandler && $(this.options.classHandler).length)\n return $(this.options.classHandler);\n\n // Class handled could also be determined by function given in Parsley options\n var $handlerFunction = this.options.classHandler;\n\n // It might also be the function name of a global function\n if ('string' === typeof this.options.classHandler && 'function' === typeof window[this.options.classHandler])\n $handlerFunction = window[this.options.classHandler];\n\n if ('function' === typeof $handlerFunction) {\n var $handler = $handlerFunction.call(this, this);\n\n // If this function returned a valid existing DOM element, go for it\n if ('undefined' !== typeof $handler && $handler.length)\n return $handler;\n } else if ('object' === typeof $handlerFunction && $handlerFunction instanceof jQuery && $handlerFunction.length) {\n return $handlerFunction;\n } else if ($handlerFunction) {\n Utils.warn('The class handler `' + $handlerFunction + '` does not exist in DOM nor as a global JS function');\n }\n\n return this._inputHolder();\n },\n\n _inputHolder: function() {\n // if simple element (input, texatrea, select...) it will perfectly host the classes and precede the error container\n if (!this.options.multiple || this.element.nodeName === 'SELECT')\n return this.$element;\n\n // But if multiple element (radio, checkbox), that would be their parent\n return this.$element.parent();\n },\n\n _insertErrorWrapper: function () {\n var $errorsContainer = this.options.errorsContainer;\n\n // Nothing to do if already inserted\n if (0 !== this._ui.$errorsWrapper.parent().length)\n return this._ui.$errorsWrapper.parent();\n\n if ('string' === typeof $errorsContainer) {\n if ($($errorsContainer).length)\n return $($errorsContainer).append(this._ui.$errorsWrapper);\n else if ('function' === typeof window[$errorsContainer])\n $errorsContainer = window[$errorsContainer];\n else\n Utils.warn('The errors container `' + $errorsContainer + '` does not exist in DOM nor as a global JS function');\n }\n\n if ('function' === typeof $errorsContainer)\n $errorsContainer = $errorsContainer.call(this, this);\n\n if ('object' === typeof $errorsContainer && $errorsContainer.length)\n return $errorsContainer.append(this._ui.$errorsWrapper);\n\n return this._inputHolder().after(this._ui.$errorsWrapper);\n },\n\n _actualizeTriggers: function () {\n var $toBind = this._findRelated();\n var trigger;\n\n // Remove Parsley events already bound on this field\n $toBind.off('.Parsley');\n if (this._failedOnce)\n $toBind.on(Utils.namespaceEvents(this.options.triggerAfterFailure, 'Parsley'), () => {\n this._validateIfNeeded();\n });\n else if (trigger = Utils.namespaceEvents(this.options.trigger, 'Parsley')) {\n $toBind.on(trigger, event => {\n this._validateIfNeeded(event);\n });\n }\n },\n\n _validateIfNeeded: function (event) {\n // For keyup, keypress, keydown, input... events that could be a little bit obstrusive\n // do not validate if val length < min threshold on first validation. Once field have been validated once and info\n // about success or failure have been displayed, always validate with this trigger to reflect every yalidation change.\n if (event && /key|input/.test(event.type))\n if (!(this._ui && this._ui.validationInformationVisible) && this.getValue().length <= this.options.validationThreshold)\n return;\n\n if (this.options.debounce) {\n window.clearTimeout(this._debounced);\n this._debounced = window.setTimeout(() => this.validate(), this.options.debounce);\n } else\n this.validate();\n },\n\n _resetUI: function () {\n // Reset all event listeners\n this._failedOnce = false;\n this._actualizeTriggers();\n\n // Nothing to do if UI never initialized for this field\n if ('undefined' === typeof this._ui)\n return;\n\n // Reset all errors' li\n this._ui.$errorsWrapper\n .removeClass('filled')\n .children()\n .remove();\n\n // Reset validation class\n this._resetClass();\n\n // Reset validation flags and last validation result\n this._ui.lastValidationResult = [];\n this._ui.validationInformationVisible = false;\n },\n\n _destroyUI: function () {\n this._resetUI();\n\n if ('undefined' !== typeof this._ui)\n this._ui.$errorsWrapper.remove();\n\n delete this._ui;\n },\n\n _successClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.errorClass).addClass(this.options.successClass);\n },\n _errorClass: function () {\n this._ui.validationInformationVisible = true;\n this._ui.$errorClassHandler.removeClass(this.options.successClass).addClass(this.options.errorClass);\n },\n _resetClass: function () {\n this._ui.$errorClassHandler.removeClass(this.options.successClass).removeClass(this.options.errorClass);\n }\n};\n\nexport default UI;\n","import $ from 'jquery';\nimport Base from './base';\nimport Utils from './utils';\n\nvar Form = function (element, domOptions, options) {\n this.__class__ = 'Form';\n\n this.element = element;\n this.$element = $(element);\n this.domOptions = domOptions;\n this.options = options;\n this.parent = window.Parsley;\n\n this.fields = [];\n this.validationResult = null;\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nForm.prototype = {\n onSubmitValidate: function (event) {\n // This is a Parsley generated submit event, do not validate, do not prevent, simply exit and keep normal behavior\n if (true === event.parsley)\n return;\n\n // If we didn't come here through a submit button, use the first one in the form\n var submitSource = this._submitSource || this.$element.find(Utils._SubmitSelector)[0];\n this._submitSource = null;\n this.$element.find('.parsley-synthetic-submit-button').prop('disabled', true);\n if (submitSource && null !== submitSource.getAttribute('formnovalidate'))\n return;\n\n window.Parsley._remoteCache = {};\n\n var promise = this.whenValidate({event});\n\n if ('resolved' === promise.state() && false !== this._trigger('submit')) {\n // All good, let event go through. We make this distinction because browsers\n // differ in their handling of `submit` being called from inside a submit event [#1047]\n } else {\n // Rejected or pending: cancel this submit\n event.stopImmediatePropagation();\n event.preventDefault();\n if ('pending' === promise.state())\n promise.done(() => { this._submit(submitSource); });\n }\n },\n\n onSubmitButton: function(event) {\n this._submitSource = event.currentTarget;\n },\n // internal\n // _submit submits the form, this time without going through the validations.\n // Care must be taken to \"fake\" the actual submit button being clicked.\n _submit: function (submitSource) {\n if (false === this._trigger('submit'))\n return;\n // Add submit button's data\n if (submitSource) {\n var $synthetic = this.$element.find('.parsley-synthetic-submit-button').prop('disabled', false);\n if (0 === $synthetic.length)\n $synthetic = $('').appendTo(this.$element);\n $synthetic.attr({\n name: submitSource.getAttribute('name'),\n value: submitSource.getAttribute('value')\n });\n }\n\n this.$element.trigger(Object.assign($.Event('submit'), {parsley: true}));\n },\n\n // Performs validation on fields while triggering events.\n // @returns `true` if all validations succeeds, `false`\n // if a failure is immediately detected, or `null`\n // if dependant on a promise.\n // Consider using `whenValidate` instead.\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley form without passing arguments as an object is deprecated.');\n var [group, force, event] = arguments;\n options = {group, force, event};\n }\n return statusMapping[ this.whenValidate(options).state() ];\n },\n\n whenValidate: function ({group, force, event} = {}) {\n this.submitEvent = event;\n if (event) {\n this.submitEvent = Object.assign({}, event, {preventDefault: () => {\n Utils.warnOnce(\"Using `this.submitEvent.preventDefault()` is deprecated; instead, call `this.validationResult = false`\");\n this.validationResult = false;\n }});\n }\n this.validationResult = true;\n\n // fire validate event to eventually modify things before every validation\n this._trigger('validate');\n\n // Refresh form DOM options and form's fields that could have changed\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValidate({force, group}));\n });\n\n return Utils.all(promises)\n .done( () => { this._trigger('success'); })\n .fail( () => {\n this.validationResult = false;\n this.focus();\n this._trigger('error');\n })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n // Iterate over refreshed fields, and stop on first failure.\n // Returns `true` if all fields are valid, `false` if a failure is detected\n // or `null` if the result depends on an unresolved promise.\n // Prefer using `whenValid` instead.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley form without passing arguments as an object is deprecated.');\n var [group, force] = arguments;\n options = {group, force};\n }\n return statusMapping[ this.whenValid(options).state() ];\n },\n\n // Iterate over refreshed fields and validate them.\n // Returns a promise.\n // A validation that immediately fails will interrupt the validations.\n whenValid: function ({group, force} = {}) {\n this._refreshFields();\n\n var promises = this._withoutReactualizingFormOptions(() => {\n return $.map(this.fields, field => field.whenValid({group, force}));\n });\n return Utils.all(promises);\n },\n\n refresh: function() {\n this._refreshFields();\n return this;\n },\n\n // Reset UI\n reset: function () {\n // Form case: emit a reset event for each field\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].reset();\n\n this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n\n // Form case: destroy all its fields and then destroy stored instance\n for (var i = 0; i < this.fields.length; i++)\n this.fields[i].destroy();\n\n this.$element.removeData('Parsley');\n this._trigger('destroy');\n },\n\n _refreshFields: function () {\n return this.actualizeOptions()._bindFields();\n },\n\n _bindFields: function () {\n var oldFields = this.fields;\n\n this.fields = [];\n this.fieldsMappedById = {};\n\n this._withoutReactualizingFormOptions(() => {\n this.$element\n .find(this.options.inputs)\n .not(this.options.excluded)\n .not(`[${this.options.namespace}excluded=true]`)\n .each((_, element) => {\n var fieldInstance = new window.Parsley.Factory(element, {}, this);\n\n // Only add valid and not excluded `Field` and `FieldMultiple` children\n if ('Field' === fieldInstance.__class__ || 'FieldMultiple' === fieldInstance.__class__) {\n let uniqueId = fieldInstance.__class__ + '-' + fieldInstance.__id__;\n if ('undefined' === typeof this.fieldsMappedById[uniqueId]) {\n this.fieldsMappedById[uniqueId] = fieldInstance;\n this.fields.push(fieldInstance);\n }\n }\n });\n\n $.each(Utils.difference(oldFields, this.fields), (_, field) => {\n field.reset();\n });\n });\n return this;\n },\n\n // Internal only.\n // Looping on a form's fields to do validation or similar\n // will trigger reactualizing options on all of them, which\n // in turn will reactualize the form's options.\n // To avoid calling actualizeOptions so many times on the form\n // for nothing, _withoutReactualizingFormOptions temporarily disables\n // the method actualizeOptions on this form while `fn` is called.\n _withoutReactualizingFormOptions: function (fn) {\n var oldActualizeOptions = this.actualizeOptions;\n this.actualizeOptions = function () { return this; };\n var result = fn();\n this.actualizeOptions = oldActualizeOptions;\n return result;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n // Returns true iff event is not interrupted and default not prevented.\n _trigger: function (eventName) {\n return this.trigger('form:' + eventName);\n }\n\n};\n\nexport default Form;\n","import Utils from './utils';\nimport Validator from './validator';\n\nconst Constraint = function(parsleyField, name, requirements, priority, isDomConstraint) {\n const validatorSpec = window.Parsley._validatorRegistry.validators[name];\n const validator = new Validator(validatorSpec);\n priority = priority || parsleyField.options[name + 'Priority'] || validator.priority;\n isDomConstraint = (true === isDomConstraint);\n\n Object.assign(this, {\n validator,\n name,\n requirements,\n priority,\n isDomConstraint\n });\n this._parseRequirements(parsleyField.options);\n};\n\nconst capitalize = function(str) {\n const cap = str[0].toUpperCase();\n return cap + str.slice(1);\n};\n\nConstraint.prototype = {\n validate: function(value, instance) {\n return this.validator.validate(value, ...this.requirementList, instance);\n },\n\n _parseRequirements: function(options) {\n this.requirementList = this.validator.parseRequirements(this.requirements,\n key => options[this.name + capitalize(key)]\n );\n }\n};\n\nexport default Constraint;\n","import $ from 'jquery';\nimport Constraint from './constraint';\nimport UI from './ui';\nimport Utils from './utils';\n\nvar Field = function (field, domOptions, options, parsleyFormInstance) {\n this.__class__ = 'Field';\n\n this.element = field;\n this.$element = $(field);\n\n // Set parent if we have one\n if ('undefined' !== typeof parsleyFormInstance) {\n this.parent = parsleyFormInstance;\n }\n\n this.options = options;\n this.domOptions = domOptions;\n\n // Initialize some properties\n this.constraints = [];\n this.constraintsByName = {};\n this.validationResult = true;\n\n // Bind constraints\n this._bindConstraints();\n};\n\nvar statusMapping = {pending: null, resolved: true, rejected: false};\n\nField.prototype = {\n // # Public API\n // Validate field and trigger some events for mainly `UI`\n // @returns `true`, an array of the validators that failed, or\n // `null` if validation is not finished. Prefer using whenValidate\n validate: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling validate on a parsley field without passing arguments as an object is deprecated.');\n options = {options};\n }\n var promise = this.whenValidate(options);\n if (!promise) // If excluded with `group` option\n return true;\n switch (promise.state()) {\n case 'pending': return null;\n case 'resolved': return true;\n case 'rejected': return this.validationResult;\n }\n },\n\n // Validate field and trigger some events for mainly `UI`\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if field is not in the given `group`.\n whenValidate: function ({force, group} = {}) {\n // do not validate a field if not the same as given validation group\n this.refresh();\n if (group && !this._isInGroup(group))\n return;\n\n this.value = this.getValue();\n\n // Field Validate event. `this.value` could be altered for custom needs\n this._trigger('validate');\n\n return this.whenValid({force, value: this.value, _refreshed: true})\n .always(() => { this._reflowUI(); })\n .done(() => { this._trigger('success'); })\n .fail(() => { this._trigger('error'); })\n .always(() => { this._trigger('validated'); })\n .pipe(...this._pipeAccordingToValidationResult());\n },\n\n hasConstraints: function () {\n return 0 !== this.constraints.length;\n },\n\n // An empty optional field does not need validation\n needsValidation: function (value) {\n if ('undefined' === typeof value)\n value = this.getValue();\n\n // If a field is empty and not required, it is valid\n // Except if `data-parsley-validate-if-empty` explicitely added, useful for some custom validators\n if (!value.length && !this._isRequired() && 'undefined' === typeof this.options.validateIfEmpty)\n return false;\n\n return true;\n },\n\n _isInGroup: function (group) {\n if (Array.isArray(this.options.group))\n return -1 !== $.inArray(group, this.options.group);\n return this.options.group === group;\n },\n\n // Just validate field. Do not trigger any event.\n // Returns `true` iff all constraints pass, `false` if there are failures,\n // or `null` if the result can not be determined yet (depends on a promise)\n // See also `whenValid`.\n isValid: function (options) {\n if (arguments.length >= 1 && !$.isPlainObject(options)) {\n Utils.warnOnce('Calling isValid on a parsley field without passing arguments as an object is deprecated.');\n var [force, value] = arguments;\n options = {force, value};\n }\n var promise = this.whenValid(options);\n if (!promise) // Excluded via `group`\n return true;\n return statusMapping[promise.state()];\n },\n\n // Just validate field. Do not trigger any event.\n // @returns a promise that succeeds only when all validations do\n // or `undefined` if the field is not in the given `group`.\n // The argument `force` will force validation of empty fields.\n // If a `value` is given, it will be validated instead of the value of the input.\n whenValid: function ({force = false, value, group, _refreshed} = {}) {\n // Recompute options and rebind constraints to have latest changes\n if (!_refreshed)\n this.refresh();\n // do not validate a field if not the same as given validation group\n if (group && !this._isInGroup(group))\n return;\n\n this.validationResult = true;\n\n // A field without constraint is valid\n if (!this.hasConstraints())\n return $.when();\n\n // Value could be passed as argument, needed to add more power to 'field:validate'\n if ('undefined' === typeof value || null === value)\n value = this.getValue();\n\n if (!this.needsValidation(value) && true !== force)\n return $.when();\n\n var groupedConstraints = this._getGroupedConstraints();\n var promises = [];\n $.each(groupedConstraints, (_, constraints) => {\n // Process one group of constraints at a time, we validate the constraints\n // and combine the promises together.\n var promise = Utils.all(\n $.map(constraints, constraint => this._validateConstraint(value, constraint))\n );\n promises.push(promise);\n if (promise.state() === 'rejected')\n return false; // Interrupt processing if a group has already failed\n });\n return Utils.all(promises);\n },\n\n // @returns a promise\n _validateConstraint: function(value, constraint) {\n var result = constraint.validate(value, this);\n // Map false to a failed promise\n if (false === result)\n result = $.Deferred().reject();\n // Make sure we return a promise and that we record failures\n return Utils.all([result]).fail(errorMessage => {\n if (!(this.validationResult instanceof Array))\n this.validationResult = [];\n this.validationResult.push({\n assert: constraint,\n errorMessage: 'string' === typeof errorMessage && errorMessage\n });\n });\n },\n\n // @returns Parsley field computed value that could be overrided or configured in DOM\n getValue: function () {\n var value;\n\n // Value could be overriden in DOM or with explicit options\n if ('function' === typeof this.options.value)\n value = this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n value = this.options.value;\n else\n value = this.$element.val();\n\n // Handle wrong DOM or configurations\n if ('undefined' === typeof value || null === value)\n return '';\n\n return this._handleWhitespace(value);\n },\n\n // Reset UI\n reset: function () {\n this._resetUI();\n return this._trigger('reset');\n },\n\n // Destroy Parsley instance (+ UI)\n destroy: function () {\n // Field case: emit destroy event to clean UI and then destroy stored instance\n this._destroyUI();\n this.$element.removeData('Parsley');\n this.$element.removeData('FieldMultiple');\n this._trigger('destroy');\n },\n\n // Actualize options and rebind constraints\n refresh: function () {\n this._refreshConstraints();\n return this;\n },\n\n _refreshConstraints: function () {\n return this.actualizeOptions()._bindConstraints();\n },\n\n refreshConstraints: function() {\n Utils.warnOnce(\"Parsley's refreshConstraints is deprecated. Please use refresh\");\n return this.refresh();\n },\n\n /**\n * Add a new constraint to a field\n *\n * @param {String} name\n * @param {Mixed} requirements optional\n * @param {Number} priority optional\n * @param {Boolean} isDomConstraint optional\n */\n addConstraint: function (name, requirements, priority, isDomConstraint) {\n\n if (window.Parsley._validatorRegistry.validators[name]) {\n var constraint = new Constraint(this, name, requirements, priority, isDomConstraint);\n\n // if constraint already exist, delete it and push new version\n if ('undefined' !== this.constraintsByName[constraint.name])\n this.removeConstraint(constraint.name);\n\n this.constraints.push(constraint);\n this.constraintsByName[constraint.name] = constraint;\n }\n\n return this;\n },\n\n // Remove a constraint\n removeConstraint: function (name) {\n for (var i = 0; i < this.constraints.length; i++)\n if (name === this.constraints[i].name) {\n this.constraints.splice(i, 1);\n break;\n }\n delete this.constraintsByName[name];\n return this;\n },\n\n // Update a constraint (Remove + re-add)\n updateConstraint: function (name, parameters, priority) {\n return this.removeConstraint(name)\n .addConstraint(name, parameters, priority);\n },\n\n // # Internals\n\n // Internal only.\n // Bind constraints from config + options + DOM\n _bindConstraints: function () {\n var constraints = [];\n var constraintsByName = {};\n\n // clean all existing DOM constraints to only keep javascript user constraints\n for (var i = 0; i < this.constraints.length; i++)\n if (false === this.constraints[i].isDomConstraint) {\n constraints.push(this.constraints[i]);\n constraintsByName[this.constraints[i].name] = this.constraints[i];\n }\n\n this.constraints = constraints;\n this.constraintsByName = constraintsByName;\n\n // then re-add Parsley DOM-API constraints\n for (var name in this.options)\n this.addConstraint(name, this.options[name], undefined, true);\n\n // finally, bind special HTML5 constraints\n return this._bindHtml5Constraints();\n },\n\n // Internal only.\n // Bind specific HTML5 constraints to be HTML5 compliant\n _bindHtml5Constraints: function () {\n // html5 required\n if (null !== this.element.getAttribute('required'))\n this.addConstraint('required', true, undefined, true);\n\n // html5 pattern\n if (null !== this.element.getAttribute('pattern'))\n this.addConstraint('pattern', this.element.getAttribute('pattern'), undefined, true);\n\n // range\n let min = this.element.getAttribute('min');\n let max = this.element.getAttribute('max');\n if (null !== min && null !== max)\n this.addConstraint('range', [min, max], undefined, true);\n\n // HTML5 min\n else if (null !== min)\n this.addConstraint('min', min, undefined, true);\n\n // HTML5 max\n else if (null !== max)\n this.addConstraint('max', max, undefined, true);\n\n\n // length\n if (null !== this.element.getAttribute('minlength') && null !== this.element.getAttribute('maxlength'))\n this.addConstraint('length', [this.element.getAttribute('minlength'), this.element.getAttribute('maxlength')], undefined, true);\n\n // HTML5 minlength\n else if (null !== this.element.getAttribute('minlength'))\n this.addConstraint('minlength', this.element.getAttribute('minlength'), undefined, true);\n\n // HTML5 maxlength\n else if (null !== this.element.getAttribute('maxlength'))\n this.addConstraint('maxlength', this.element.getAttribute('maxlength'), undefined, true);\n\n\n // html5 types\n var type = Utils.getType(this.element);\n\n // Small special case here for HTML5 number: integer validator if step attribute is undefined or an integer value, number otherwise\n if ('number' === type) {\n return this.addConstraint('type', ['number', {\n step: this.element.getAttribute('step') || '1',\n base: min || this.element.getAttribute('value')\n }], undefined, true);\n // Regular other HTML5 supported types\n } else if (/^(email|url|range|date)$/i.test(type)) {\n return this.addConstraint('type', type, undefined, true);\n }\n return this;\n },\n\n // Internal only.\n // Field is required if have required constraint without `false` value\n _isRequired: function () {\n if ('undefined' === typeof this.constraintsByName.required)\n return false;\n\n return false !== this.constraintsByName.required.requirements;\n },\n\n // Internal only.\n // Shortcut to trigger an event\n _trigger: function (eventName) {\n return this.trigger('field:' + eventName);\n },\n\n // Internal only\n // Handles whitespace in a value\n // Use `data-parsley-whitespace=\"squish\"` to auto squish input value\n // Use `data-parsley-whitespace=\"trim\"` to auto trim input value\n _handleWhitespace: function (value) {\n if (true === this.options.trimValue)\n Utils.warnOnce('data-parsley-trim-value=\"true\" is deprecated, please use data-parsley-whitespace=\"trim\"');\n\n if ('squish' === this.options.whitespace)\n value = value.replace(/\\s{2,}/g, ' ');\n\n if (('trim' === this.options.whitespace) || ('squish' === this.options.whitespace) || (true === this.options.trimValue))\n value = Utils.trimString(value);\n\n return value;\n },\n\n _isDateInput: function() {\n var c = this.constraintsByName.type;\n return c && c.requirements === 'date';\n },\n\n // Internal only.\n // Returns the constraints, grouped by descending priority.\n // The result is thus an array of arrays of constraints.\n _getGroupedConstraints: function () {\n if (false === this.options.priorityEnabled)\n return [this.constraints];\n\n var groupedConstraints = [];\n var index = {};\n\n // Create array unique of priorities\n for (var i = 0; i < this.constraints.length; i++) {\n var p = this.constraints[i].priority;\n if (!index[p])\n groupedConstraints.push(index[p] = []);\n index[p].push(this.constraints[i]);\n }\n // Sort them by priority DESC\n groupedConstraints.sort(function (a, b) { return b[0].priority - a[0].priority; });\n\n return groupedConstraints;\n }\n\n};\n\nexport default Field;\n","import $ from 'jquery';\nimport Utils from './utils';\n\nvar Multiple = function () {\n this.__class__ = 'FieldMultiple';\n};\n\nMultiple.prototype = {\n // Add new `$element` sibling for multiple field\n addElement: function ($element) {\n this.$elements.push($element);\n\n return this;\n },\n\n // See `Field._refreshConstraints()`\n _refreshConstraints: function () {\n var fieldConstraints;\n\n this.constraints = [];\n\n // Select multiple special treatment\n if (this.element.nodeName === 'SELECT') {\n this.actualizeOptions()._bindConstraints();\n\n return this;\n }\n\n // Gather all constraints for each input in the multiple group\n for (var i = 0; i < this.$elements.length; i++) {\n\n // Check if element have not been dynamically removed since last binding\n if (!$('html').has(this.$elements[i]).length) {\n this.$elements.splice(i, 1);\n continue;\n }\n\n fieldConstraints = this.$elements[i].data('FieldMultiple')._refreshConstraints().constraints;\n\n for (var j = 0; j < fieldConstraints.length; j++)\n this.addConstraint(fieldConstraints[j].name, fieldConstraints[j].requirements, fieldConstraints[j].priority, fieldConstraints[j].isDomConstraint);\n }\n\n return this;\n },\n\n // See `Field.getValue()`\n getValue: function () {\n // Value could be overriden in DOM\n if ('function' === typeof this.options.value)\n return this.options.value(this);\n else if ('undefined' !== typeof this.options.value)\n return this.options.value;\n\n // Radio input case\n if (this.element.nodeName === 'INPUT') {\n var type = Utils.getType(this.element);\n if (type === 'radio')\n return this._findRelated().filter(':checked').val() || '';\n\n // checkbox input case\n if (type === 'checkbox') {\n var values = [];\n\n this._findRelated().filter(':checked').each(function () {\n values.push($(this).val());\n });\n\n return values;\n }\n }\n\n // Select multiple case\n if (this.element.nodeName === 'SELECT' && null === this.$element.val())\n return [];\n\n // Default case that should never happen\n return this.$element.val();\n },\n\n _init: function () {\n this.$elements = [this.$element];\n\n return this;\n }\n};\n\nexport default Multiple;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\n\nvar Factory = function (element, options, parsleyFormInstance) {\n this.element = element;\n this.$element = $(element);\n\n // If the element has already been bound, returns its saved Parsley instance\n var savedparsleyFormInstance = this.$element.data('Parsley');\n if (savedparsleyFormInstance) {\n\n // If the saved instance has been bound without a Form parent and there is one given in this call, add it\n if ('undefined' !== typeof parsleyFormInstance && savedparsleyFormInstance.parent === window.Parsley) {\n savedparsleyFormInstance.parent = parsleyFormInstance;\n savedparsleyFormInstance._resetOptions(savedparsleyFormInstance.options);\n }\n\n if ('object' === typeof options) {\n Object.assign(savedparsleyFormInstance.options, options);\n }\n\n return savedparsleyFormInstance;\n }\n\n // Parsley must be instantiated with a DOM element or jQuery $element\n if (!this.$element.length)\n throw new Error('You must bind Parsley on an existing element.');\n\n if ('undefined' !== typeof parsleyFormInstance && 'Form' !== parsleyFormInstance.__class__)\n throw new Error('Parent instance must be a Form instance');\n\n this.parent = parsleyFormInstance || window.Parsley;\n return this.init(options);\n};\n\nFactory.prototype = {\n init: function (options) {\n this.__class__ = 'Parsley';\n this.__version__ = 'VERSION';\n this.__id__ = Utils.generateID();\n\n // Pre-compute options\n this._resetOptions(options);\n\n // A Form instance is obviously a `` element but also every node that is not an input and has the `data-parsley-validate` attribute\n if (this.element.nodeName === 'FORM' || (Utils.checkAttr(this.element, this.options.namespace, 'validate') && !this.$element.is(this.options.inputs)))\n return this.bind('parsleyForm');\n\n // Every other element is bound as a `Field` or `FieldMultiple`\n return this.isMultiple() ? this.handleMultiple() : this.bind('parsleyField');\n },\n\n isMultiple: function () {\n var type = Utils.getType(this.element);\n return ((type === 'radio' || type === 'checkbox') ||\n (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')));\n },\n\n // Multiples fields are a real nightmare :(\n // Maybe some refactoring would be appreciated here...\n handleMultiple: function () {\n var name;\n var multiple;\n var parsleyMultipleInstance;\n\n // Handle multiple name\n this.options.multiple = this.options.multiple ||\n (name = this.element.getAttribute('name')) ||\n this.element.getAttribute('id');\n\n // Special select multiple input\n if (this.element.nodeName === 'SELECT' && null !== this.element.getAttribute('multiple')) {\n this.options.multiple = this.options.multiple || this.__id__;\n return this.bind('parsleyFieldMultiple');\n\n // Else for radio / checkboxes, we need a `name` or `data-parsley-multiple` to properly bind it\n } else if (!this.options.multiple) {\n Utils.warn('To be bound by Parsley, a radio, a checkbox and a multiple select input must have either a name or a multiple option.', this.$element);\n return this;\n }\n\n // Remove special chars\n this.options.multiple = this.options.multiple.replace(/(:|\\.|\\[|\\]|\\{|\\}|\\$)/g, '');\n\n // Add proper `data-parsley-multiple` to siblings if we have a valid multiple name\n if (name) {\n $('input[name=\"' + name + '\"]').each((i, input) => {\n var type = Utils.getType(input);\n if ((type === 'radio' || type === 'checkbox'))\n input.setAttribute(this.options.namespace + 'multiple', this.options.multiple);\n });\n }\n\n // Check here if we don't already have a related multiple instance saved\n var $previouslyRelated = this._findRelated();\n for (var i = 0; i < $previouslyRelated.length; i++) {\n parsleyMultipleInstance = $($previouslyRelated.get(i)).data('Parsley');\n if ('undefined' !== typeof parsleyMultipleInstance) {\n\n if (!this.$element.data('FieldMultiple')) {\n parsleyMultipleInstance.addElement(this.$element);\n }\n\n break;\n }\n }\n\n // Create a secret Field instance for every multiple field. It will be stored in `data('FieldMultiple')`\n // And will be useful later to access classic `Field` stuff while being in a `FieldMultiple` instance\n this.bind('parsleyField', true);\n\n return parsleyMultipleInstance || this.bind('parsleyFieldMultiple');\n },\n\n // Return proper `Form`, `Field` or `FieldMultiple`\n bind: function (type, doNotStore) {\n var parsleyInstance;\n\n switch (type) {\n case 'parsleyForm':\n parsleyInstance = $.extend(\n new Form(this.element, this.domOptions, this.options),\n new Base(),\n window.ParsleyExtend\n )._bindFields();\n break;\n case 'parsleyField':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Base(),\n window.ParsleyExtend\n );\n break;\n case 'parsleyFieldMultiple':\n parsleyInstance = $.extend(\n new Field(this.element, this.domOptions, this.options, this.parent),\n new Multiple(),\n new Base(),\n window.ParsleyExtend\n )._init();\n break;\n default:\n throw new Error(type + 'is not a supported Parsley type');\n }\n\n if (this.options.multiple)\n Utils.setAttr(this.element, this.options.namespace, 'multiple', this.options.multiple);\n\n if ('undefined' !== typeof doNotStore) {\n this.$element.data('FieldMultiple', parsleyInstance);\n\n return parsleyInstance;\n }\n\n // Store the freshly bound instance in a DOM element for later access using jQuery `data()`\n this.$element.data('Parsley', parsleyInstance);\n\n // Tell the world we have a new Form or Field instance!\n parsleyInstance._actualizeTriggers();\n parsleyInstance._trigger('init');\n\n return parsleyInstance;\n }\n};\n\nexport default Factory;\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Defaults from './defaults';\nimport Base from './base';\nimport ValidatorRegistry from './validator_registry';\nimport UI from './ui';\nimport Form from './form';\nimport Field from './field';\nimport Multiple from './multiple';\nimport Factory from './factory';\n\nvar vernums = $.fn.jquery.split('.');\nif (parseInt(vernums[0]) <= 1 && parseInt(vernums[1]) < 8) {\n throw \"The loaded version of jQuery is too old. Please upgrade to 1.8.x or better.\";\n}\nif (!vernums.forEach) {\n Utils.warn('Parsley requires ES5 to run properly. Please include https://github.com/es-shims/es5-shim');\n}\n// Inherit `on`, `off` & `trigger` to Parsley:\nvar Parsley = Object.assign(new Base(), {\n element: document,\n $element: $(document),\n actualizeOptions: null,\n _resetOptions: null,\n Factory: Factory,\n version: 'VERSION'\n });\n\n// Supplement Field and Form with Base\n// This way, the constructors will have access to those methods\nObject.assign(Field.prototype, UI.Field, Base.prototype);\nObject.assign(Form.prototype, UI.Form, Base.prototype);\n// Inherit actualizeOptions and _resetOptions:\nObject.assign(Factory.prototype, Base.prototype);\n\n// ### jQuery API\n// `$('.elem').parsley(options)` or `$('.elem').psly(options)`\n$.fn.parsley = $.fn.psly = function (options) {\n if (this.length > 1) {\n var instances = [];\n\n this.each(function () {\n instances.push($(this).parsley(options));\n });\n\n return instances;\n }\n\n // Return undefined if applied to non existing DOM element\n if (this.length == 0) {\n return;\n }\n\n return new Factory(this[0], options);\n};\n\n// ### Field and Form extension\n// Ensure the extension is now defined if it wasn't previously\nif ('undefined' === typeof window.ParsleyExtend)\n window.ParsleyExtend = {};\n\n// ### Parsley config\n// Inherit from ParsleyDefault, and copy over any existing values\nParsley.options = Object.assign(Utils.objectCreate(Defaults), window.ParsleyConfig);\nwindow.ParsleyConfig = Parsley.options; // Old way of accessing global options\n\n// ### Globals\nwindow.Parsley = window.psly = Parsley;\nParsley.Utils = Utils;\nwindow.ParsleyUtils = {};\n$.each(Utils, (key, value) => {\n if ('function' === typeof value) {\n window.ParsleyUtils[key] = (...args) => {\n Utils.warnOnce('Accessing `window.ParsleyUtils` is deprecated. Use `window.Parsley.Utils` instead.');\n return Utils[key](...args);\n };\n }\n});\n\n// ### Define methods that forward to the registry, and deprecate all access except through window.Parsley\nvar registry = window.Parsley._validatorRegistry = new ValidatorRegistry(window.ParsleyConfig.validators, window.ParsleyConfig.i18n);\nwindow.ParsleyValidator = {};\n$.each('setLocale addCatalog addMessage addMessages getErrorMessage formatMessage addValidator updateValidator removeValidator hasValidator'.split(' '), function (i, method) {\n window.Parsley[method] = (...args) => registry[method](...args);\n window.ParsleyValidator[method] = function () {\n Utils.warnOnce(`Accessing the method '${method}' through Validator is deprecated. Simply call 'window.Parsley.${method}(...)'`);\n return window.Parsley[method](...arguments);\n };\n});\n\n// ### UI\n// Deprecated global object\nwindow.Parsley.UI = UI;\nwindow.ParsleyUI = {\n removeError: function (instance, name, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call 'removeError' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance.removeError(name, {updateClass});\n },\n getErrorsMessages: function (instance) {\n Utils.warnOnce(`Accessing UI is deprecated. Call 'getErrorsMessages' on the instance directly.`);\n return instance.getErrorsMessages();\n }\n};\n$.each('addError updateError'.split(' '), function (i, method) {\n window.ParsleyUI[method] = function (instance, name, message, assert, doNotUpdateClass) {\n var updateClass = true !== doNotUpdateClass;\n Utils.warnOnce(`Accessing UI is deprecated. Call '${method}' on the instance directly. Please comment in issue 1073 as to your need to call this method.`);\n return instance[method](name, {message, assert, updateClass});\n };\n});\n\n// ### PARSLEY auto-binding\n// Prevent it by setting `ParsleyConfig.autoBind` to `false`\nif (false !== window.ParsleyConfig.autoBind) {\n $(function () {\n // Works only on `data-parsley-validate`.\n if ($('[data-parsley-validate]').length)\n $('[data-parsley-validate]').parsley();\n });\n}\n\nexport default Parsley;\n","import $ from 'jquery';\nimport Field from './field';\nimport Form from './form';\nimport Utils from './utils';\n\nvar o = $({});\nvar deprecated = function () {\n Utils.warnOnce(\"Parsley's pubsub module is deprecated; use the 'on' and 'off' methods on parsley instances or window.Parsley\");\n};\n\n// Returns an event handler that calls `fn` with the arguments it expects\nfunction adapt(fn, context) {\n // Store to allow unbinding\n if (!fn.parsleyAdaptedCallback) {\n fn.parsleyAdaptedCallback = function () {\n var args = Array.prototype.slice.call(arguments, 0);\n args.unshift(this);\n fn.apply(context || o, args);\n };\n }\n return fn.parsleyAdaptedCallback;\n}\n\nvar eventPrefix = 'parsley:';\n// Converts 'parsley:form:validate' into 'form:validate'\nfunction eventName(name) {\n if (name.lastIndexOf(eventPrefix, 0) === 0)\n return name.substr(eventPrefix.length);\n return name;\n}\n\n// $.listen is deprecated. Use Parsley.on instead.\n$.listen = function (name, callback) {\n var context;\n deprecated();\n if ('object' === typeof arguments[1] && 'function' === typeof arguments[2]) {\n context = arguments[1];\n callback = arguments[2];\n }\n\n if ('function' !== typeof callback)\n throw new Error('Wrong parameters');\n\n window.Parsley.on(eventName(name), adapt(callback, context));\n};\n\n$.listenTo = function (instance, name, fn) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong parameters');\n\n instance.on(eventName(name), adapt(fn));\n};\n\n$.unsubscribe = function (name, fn) {\n deprecated();\n if ('string' !== typeof name || 'function' !== typeof fn)\n throw new Error('Wrong arguments');\n window.Parsley.off(eventName(name), fn.parsleyAdaptedCallback);\n};\n\n$.unsubscribeTo = function (instance, name) {\n deprecated();\n if (!(instance instanceof Field) && !(instance instanceof Form))\n throw new Error('Must give Parsley instance');\n instance.off(eventName(name));\n};\n\n$.unsubscribeAll = function (name) {\n deprecated();\n window.Parsley.off(eventName(name));\n $('form,input,textarea,select').each(function () {\n var instance = $(this).data('Parsley');\n if (instance) {\n instance.off(eventName(name));\n }\n });\n};\n\n// $.emit is deprecated. Use jQuery events instead.\n$.emit = function (name, instance) {\n deprecated();\n var instanceGiven = (instance instanceof Field) || (instance instanceof Form);\n var args = Array.prototype.slice.call(arguments, instanceGiven ? 2 : 1);\n args.unshift(eventName(name));\n if (!instanceGiven) {\n instance = window.Parsley;\n }\n instance.trigger(...args);\n};\n\nexport default {};\n","import $ from 'jquery';\nimport Utils from './utils';\nimport Base from './base';\n\nimport Parsley from './main';\n\n$.extend(true, Parsley, {\n asyncValidators: {\n 'default': {\n fn: function (xhr) {\n // By default, only status 2xx are deemed successful.\n // Note: we use status instead of state() because responses with status 200\n // but invalid messages (e.g. an empty body for content type set to JSON) will\n // result in state() === 'rejected'.\n return xhr.status >= 200 && xhr.status < 300;\n },\n url: false\n },\n reverse: {\n fn: function (xhr) {\n // If reverse option is set, a failing ajax request is considered successful\n return xhr.status < 200 || xhr.status >= 300;\n },\n url: false\n }\n },\n\n addAsyncValidator: function (name, fn, url, options) {\n Parsley.asyncValidators[name] = {\n fn: fn,\n url: url || false,\n options: options || {}\n };\n\n return this;\n }\n\n});\n\nParsley.addValidator('remote', {\n requirementType: {\n '': 'string',\n 'validator': 'string',\n 'reverse': 'boolean',\n 'options': 'object'\n },\n\n validateString: function (value, url, options, instance) {\n var data = {};\n var ajaxOptions;\n var csr;\n var validator = options.validator || (true === options.reverse ? 'reverse' : 'default');\n\n if ('undefined' === typeof Parsley.asyncValidators[validator])\n throw new Error('Calling an undefined async validator: `' + validator + '`');\n\n url = Parsley.asyncValidators[validator].url || url;\n\n // Fill current value\n if (url.indexOf('{value}') > -1) {\n url = url.replace('{value}', encodeURIComponent(value));\n } else {\n data[instance.element.getAttribute('name') || instance.element.getAttribute('id')] = value;\n }\n\n // Merge options passed in from the function with the ones in the attribute\n var remoteOptions = $.extend(true, options.options || {} , Parsley.asyncValidators[validator].options);\n\n // All `$.ajax(options)` could be overridden or extended directly from DOM in `data-parsley-remote-options`\n ajaxOptions = $.extend(true, {}, {\n url: url,\n data: data,\n type: 'GET'\n }, remoteOptions);\n\n // Generate store key based on ajax options\n instance.trigger('field:ajaxoptions', instance, ajaxOptions);\n\n csr = $.param(ajaxOptions);\n\n // Initialise querry cache\n if ('undefined' === typeof Parsley._remoteCache)\n Parsley._remoteCache = {};\n\n // Try to retrieve stored xhr\n var xhr = Parsley._remoteCache[csr] = Parsley._remoteCache[csr] || $.ajax(ajaxOptions);\n\n var handleXhr = function () {\n var result = Parsley.asyncValidators[validator].fn.call(instance, xhr, url, options);\n if (!result) // Map falsy results to rejected promise\n result = $.Deferred().reject();\n return $.when(result);\n };\n\n return xhr.then(handleXhr, handleXhr);\n },\n\n priority: -1\n});\n\nParsley.on('form:submit', function () {\n Parsley._remoteCache = {};\n});\n\nBase.prototype.addAsyncValidator = function () {\n Utils.warnOnce('Accessing the method `addAsyncValidator` through an instance is deprecated. Simply call `Parsley.addAsyncValidator(...)`');\n return Parsley.addAsyncValidator(...arguments);\n};\n","// This is included with the Parsley library itself,\n// thus there is no use in adding it to your project.\nimport Parsley from '../parsley/main';\n\nParsley.addMessages('en', {\n defaultMessage: \"This value seems to be invalid.\",\n type: {\n email: \"This value should be a valid email.\",\n url: \"This value should be a valid url.\",\n number: \"This value should be a valid number.\",\n integer: \"This value should be a valid integer.\",\n digits: \"This value should be digits.\",\n alphanum: \"This value should be alphanumeric.\"\n },\n notblank: \"This value should not be blank.\",\n required: \"This value is required.\",\n pattern: \"This value seems to be invalid.\",\n min: \"This value should be greater than or equal to %s.\",\n max: \"This value should be lower than or equal to %s.\",\n range: \"This value should be between %s and %s.\",\n minlength: \"This value is too short. It should have %s characters or more.\",\n maxlength: \"This value is too long. It should have %s characters or fewer.\",\n length: \"This value length is invalid. It should be between %s and %s characters long.\",\n mincheck: \"You must select at least %s choices.\",\n maxcheck: \"You must select %s choices or fewer.\",\n check: \"You must select between %s and %s choices.\",\n equalto: \"This value should be the same.\",\n euvatin: \"It's not a valid VAT Identification Number.\",\n});\n\nParsley.setLocale('en');\n","/**\n * inputevent - Alleviate browser bugs for input events\n * https://github.com/marcandre/inputevent\n * @version v0.0.3 - (built Thu, Apr 14th 2016, 5:58 pm)\n * @author Marc-Andre Lafortune \n * @license MIT\n */\n\nimport $ from 'jquery';\n\nfunction InputEvent() {\n let globals = window || global;\n\n // Slightly odd way construct our object. This way methods are force bound.\n // Used to test for duplicate library.\n Object.assign(this, {\n\n // For browsers that do not support isTrusted, assumes event is native.\n isNativeEvent: evt => {\n return evt.originalEvent && evt.originalEvent.isTrusted !== false;\n },\n\n fakeInputEvent: evt => {\n if (this.isNativeEvent(evt)) {\n $(evt.target).trigger('input');\n }\n },\n\n misbehaves: evt => {\n if (this.isNativeEvent(evt)) {\n this.behavesOk(evt);\n $(document)\n .on('change.inputevent', evt.data.selector, this.fakeInputEvent);\n this.fakeInputEvent(evt);\n }\n },\n\n behavesOk: evt => {\n if (this.isNativeEvent(evt)) {\n $(document) // Simply unbinds the testing handler\n .off('input.inputevent', evt.data.selector, this.behavesOk)\n .off('change.inputevent', evt.data.selector, this.misbehaves);\n }\n },\n\n // Bind the testing handlers\n install: () => {\n if (globals.inputEventPatched) {\n return;\n }\n globals.inputEventPatched = '0.0.3';\n for (let selector of ['select', 'input[type=\"checkbox\"]', 'input[type=\"radio\"]', 'input[type=\"file\"]']) {\n $(document)\n .on('input.inputevent', selector, {selector}, this.behavesOk)\n .on('change.inputevent', selector, {selector}, this.misbehaves);\n }\n },\n\n uninstall: () => {\n delete globals.inputEventPatched;\n $(document).off('.inputevent');\n }\n\n });\n};\n\nexport default new InputEvent();\n","import $ from 'jquery';\nimport Parsley from './parsley/main';\nimport './parsley/pubsub';\nimport './parsley/remote';\nimport './i18n/en';\nimport inputevent from './vendor/inputevent';\n\ninputevent.install();\n\nexport default Parsley;\n"],"names":["globalID","pastWarnings","Utils","attr","element","namespace","obj","i","attribute","attributes","regex","RegExp","hasOwnProperty","length","specified","test","name","this","camelize","slice","deserializeValue","value","checkAttr","hasAttribute","setAttr","setAttribute","dasherize","String","getType","getAttribute","generateID","num","isNaN","Number","JSON","parse","e","str","replace","match","chr","toUpperCase","toLowerCase","warn","window","console","arguments","warnOnce","msg","_resetWarnings","trimString","string","date","parsed","map","x","parseInt","year","month","day","Date","getFullYear","getMonth","getDate","integer","number","parseFloat","object","regexp","flags","parseRequirement","requirementType","converter","converted","namespaceEvents","events","split","$","evt","join","difference","array","remove","result","each","_","elem","indexOf","push","all","promises","when","objectCreate","Object","create","prototype","Error","_typeof","TypeError","_SubmitSelector","Base","__id__","Defaults","inputs","excluded","priorityEnabled","multiple","group","uiEnabled","validationThreshold","focus","trigger","triggerAfterFailure","errorClass","successClass","classHandler","errorsContainer","errorsWrapper","errorTemplate","asyncSupport","_pipeAccordingToValidationResult","pipe","r","Deferred","_this","validationResult","reject","resolve","promise","actualizeOptions","options","domOptions","parent","_resetOptions","initOptions","_listeners","on","fn","subscribe","listenTo","off","queue","splice","unsubscribe","unsubscribeTo","target","extraArg","call","asyncIsValid","force","whenValid","_findRelated","querySelectorAll","$element","Validator","spec","extend","validate","requirementFirstArg","Array","isArray","validateMultiple","instance","validateDate","_isDateInput","validateNumber","validateString","parseRequirements","requirements","extraOptionReader","type","values","m","convertArrayRequirement","isPlainObject","requirementSpec","main","extra","key","convertExtraOptionRequirement","priority","ValidatorRegistry","validators","catalog","__class__","locale","init","typeTesters","email","digits","alphanum","url","range","decimalPlaces","Math","max","operatorToValidator","operator","requirementsAndInput","pop","comparisonOperator","_extends","addValidator","Parsley","setLocale","addCatalog","messages","set","addMessage","message","addMessages","nameMessageObject","arg1","arg2","_setValidator","hasValidator","updateValidator","removeValidator","validator","getErrorMessage","constraint","formatMessage","defaultMessage","en","parameters","notblank","required","step","base","tester","nb","decimals","toInt","f","round","pow","pattern","minlength","requirement","maxlength","min","mincheck","maxcheck","check","equalto","refOrValue","$reference","val","euvatin","UI","Form","_actualizeTriggers","onSubmitValidate","onSubmitButton","_focusedField","fields","field","noFocus","_destroyUI","Field","_reflowUI","_buildUI","_ui","diff","diffResults","newResult","oldResult","deep","added","kept","found","j","assert","removed","lastValidationResult","_manageStatusClass","_manageErrorsMessages","_failedOnce","getErrorsMessages","errorMessage","_getErrorMessage","addError","updateClass","_addError","_errorClass","updateError","_updateError","removeError","_removeError","hasConstraints","needsValidation","_successClass","_resetClass","errorsMessagesDisabled","_insertErrorWrapper","$errorsWrapper","find","append","addClass","$errorClassHandler","errorsWrapperId","html","removeAttr","removeClass","customConstraintErrorMessage","_manageClassHandler","validationInformationVisible","$handlerFunction","$handler","jQuery","_inputHolder","nodeName","$errorsContainer","after","$toBind","_this2","_validateIfNeeded","event","getValue","debounce","clearTimeout","_debounced","setTimeout","_this3","_resetUI","children","statusMapping","pending","resolved","rejected","parsley","submitSource","_submitSource","prop","_remoteCache","whenValidate","state","_trigger","stopImmediatePropagation","preventDefault","done","_submit","currentTarget","$synthetic","appendTo","Event","submitEvent","_refreshFields","_withoutReactualizingFormOptions","fail","always","isValid","refresh","reset","destroy","removeData","_bindFields","oldFields","fieldsMappedById","_this4","not","fieldInstance","Factory","uniqueId","oldActualizeOptions","eventName","Constraint","parsleyField","isDomConstraint","validatorSpec","_validatorRegistry","_parseRequirements","parsleyFormInstance","constraints","constraintsByName","_bindConstraints","requirementList","_isInGroup","_refreshed","_isRequired","validateIfEmpty","inArray","groupedConstraints","_getGroupedConstraints","_validateConstraint","_handleWhitespace","_refreshConstraints","refreshConstraints","addConstraint","removeConstraint","updateConstraint","undefined","_bindHtml5Constraints","trimValue","whitespace","c","index","p","sort","a","b","Multiple","addElement","$elements","fieldConstraints","has","data","filter","_init","savedparsleyFormInstance","__version__","is","bind","isMultiple","handleMultiple","parsleyMultipleInstance","input","$previouslyRelated","get","doNotStore","parsleyInstance","ParsleyExtend","vernums","jquery","forEach","document","version","psly","instances","ParsleyConfig","ParsleyUtils","registry","i18n","ParsleyValidator","method","ParsleyUI","doNotUpdateClass","autoBind","deprecated","o","adapt","context","parsleyAdaptedCallback","args","unshift","apply","eventPrefix","lastIndexOf","substr","listen","callback","unsubscribeAll","emit","instanceGiven","asyncValidators","xhr","status","reverse","addAsyncValidator","ajaxOptions","csr","encodeURIComponent","remoteOptions","param","handleXhr","ajax","then","globals","global","isNativeEvent","originalEvent","isTrusted","fakeInputEvent","misbehaves","behavesOk","selector","install","inputEventPatched","uninstall"],"mappings":"i+CAEA,IAAIA,EAAW,EACXC,EAAe,GAEfC,EAAQ,CAGVC,KAAM,SAAUC,EAASC,EAAWC,OAC9BC,EACAC,EACAC,EACAC,EAAQ,IAAIC,OAAO,IAAMN,EAAW,aAEpC,IAAuBC,EACzBA,EAAM,YAGDC,KAAKD,EACJA,EAAIM,eAAeL,WACdD,EAAIC,OAIZH,EACH,OAAOE,MAGJC,GADLE,EAAaL,EAAQK,YACDI,OAAQN,MAC1BC,EAAYC,EAAWF,KAENC,EAAUM,WAAaJ,EAAMK,KAAKP,EAAUQ,QAC3DV,EAAIW,KAAKC,SAASV,EAAUQ,KAAKG,MAAMd,EAAUQ,UAAYI,KAAKG,iBAAiBZ,EAAUa,eAI1Ff,GAGTgB,UAAW,SAAUlB,EAASC,EAAWiB,UAChClB,EAAQmB,aAAalB,EAAYiB,IAG1CE,QAAS,SAAUpB,EAASC,EAAWF,EAAMkB,GAC3CjB,EAAQqB,aAAaR,KAAKS,UAAUrB,EAAYF,GAAOwB,OAAON,KAGhEO,QAAS,SAASxB,UACTA,EAAQyB,aAAa,SAAW,QAGzCC,WAAY,iBACH,GAAK9B,KAIdoB,iBAAkB,SAAUC,OACtBU,aAGKV,EACI,QAATA,GACU,SAATA,IACQ,QAATA,EAAkB,KACjBW,MAAMD,EAAME,OAAOZ,IACpB,UAAUN,KAAKM,GAASa,KAAKC,MAAMd,GACnCA,EAF8BU,GAG5BV,EACJ,MAAOe,UAAYf,IAIvBH,SAAU,SAAUmB,UACXA,EAAIC,QAAQ,UAAW,SAAUC,EAAOC,UACtCA,EAAMA,EAAIC,cAAgB,MAKrCf,UAAW,SAAUW,UACZA,EAAIC,QAAQ,MAAO,KACvBA,QAAQ,wBAAyB,SACjCA,QAAQ,oBAAqB,SAC7BA,QAAQ,KAAM,KACdI,eAGLC,KAAM,iBACAC,OAAOC,SAAW,mBAAsBD,OAAOC,QAAQF,SACzDC,OAAOC,SAAQF,aAAQG,YAG3BC,SAAU,SAASC,GACZ/C,EAAa+C,KAChB/C,EAAa+C,IAAO,OACfL,gBAAQG,aAIjBG,eAAgB,WACdhD,EAAe,IAGjBiD,WAAY,SAASC,UACZA,EAAOb,QAAQ,aAAc,KAGtCH,MAAO,CACLiB,KAAM,SAASD,OACTE,EAASF,EAAOZ,MAAM,gCACrBc,EACH,OAAO,aACmBA,EAAOC,IAAI,SAAAC,UAAKC,SAASD,EAAG,SAAhDE,cAAMC,OAAOC,OACjBP,EAAO,IAAIQ,KAAKH,EAAMC,EAAQ,EAAGC,UACjCP,EAAKS,gBAAkBJ,GAAQL,EAAKU,WAAa,IAAMJ,GAASN,EAAKW,YAAcJ,EAC9E,KACFP,GAETD,OAAQ,SAASA,UACRA,GAETa,QAAS,SAASb,UACZnB,MAAMmB,GACD,KACFK,SAASL,EAAQ,KAE1Bc,OAAQ,SAASd,MACXnB,MAAMmB,GACR,MAAM,YACDe,WAAWf,YAET,SAAkBA,UAClB,iBAAiBpC,KAAKoC,IAEjCgB,OAAQ,SAAShB,UACRjD,EAAMkB,iBAAiB+B,IAEhCiB,OAAQ,SAASA,OACXC,EAAQ,UASVD,EANE,sBAAsBrD,KAAKqD,IAG7BC,EAAQD,EAAO9B,QAAQ,iBAAkB,MAGhC8B,EAAO9B,QAAQ,IAAI3B,OAAO,WAAa0D,EAAQ,KAAM,OAGrD,IAAMD,EAAS,IAEnB,IAAIzD,OAAOyD,EAAQC,KAI9BC,iBAAkB,SAASC,EAAiBpB,OACtCqB,EAAYvD,KAAKkB,MAAMoC,GAAmB,cACzCC,EACH,KAAM,uCAAyCD,EAAkB,QAC/DE,EAAYD,EAAUrB,MACR,OAAdsB,EACF,oCAA8BF,gBAAqBpB,cAC9CsB,GAGTC,gBAAiB,SAASC,EAAQtE,UAChCsE,EAAS1D,KAAKiC,WAAWyB,GAAU,IAAIC,MAAM,QACjC,GAELC,EAAEvB,IAAIqB,EAAQ,SAAAG,mBAAUA,cAAOzE,KAAa0E,KAAK,KAD/C,IAIXC,WAAY,SAASC,EAAOC,OAEtBC,EAAS,UACbN,EAAEO,KAAKH,EAAO,SAACI,EAAGC,IACa,GAAzBJ,EAAOK,QAAQD,IACjBH,EAAOK,KAAKF,KAETH,GAITM,IAAK,SAASC,UAELb,EAAEc,WAAFd,IAAUa,WAAU,GAAI,OAIjCE,aAAcC,OAAOC,QAEZ,SAAUC,MACQ,EAAnBjD,UAAUjC,aACNmF,MAAM,oCAEU,UAApBC,EAAOF,SACHG,UAAU,8BAElBL,EAAOE,UAAYA,MACfZ,EAAS,IAAIU,SACjBA,EAAOE,UAAY,KACZZ,GAIXgB,gBAAiB,uCAfF,SAATN,KC5LG,SAAPO,SACGC,OAASnG,EAAM4B,aCCtB,IAAIwE,EAAW,CAIbjG,UAAW,gBAGXkG,OAAQ,0BAGRC,SAAU,gFAGVC,iBAAiB,EAKjBC,SAAU,KAGVC,MAAO,KAIPC,WAAW,EAGXC,oBAAqB,EAGrBC,MAAO,QAGPC,SAAS,EAGTC,oBAAqB,QAGrBC,WAAY,gBAGZC,aAAc,kBAIdC,aAAc,aAIdC,gBAAiB,aAGjBC,cAAe,wCAGfC,cAAe,aDvDjBlB,EAAKL,UAAY,CACfwB,cAAc,EAEdC,iCAAkC,WACrB,SAAPC,QACEC,EAAI7C,EAAE8C,kBACN,IAASC,EAAKC,kBAChBH,EAAEI,SACGJ,EAAEK,UAAUC,2BAEd,CAACP,EAAMA,IAGhBQ,iBAAkB,kBAChB/H,EAAMC,KAAKc,KAAKb,QAASa,KAAKiH,QAAQ7H,UAAWY,KAAKkH,YAClDlH,KAAKmH,QAAUnH,KAAKmH,OAAOH,kBAC7BhH,KAAKmH,OAAOH,mBACPhH,MAGToH,cAAe,SAAUC,OAIlB,IAAI/H,UAHJ4H,WAAajI,EAAM0F,aAAa3E,KAAKmH,OAAOF,cAC5CA,QAAUhI,EAAM0F,aAAa3E,KAAKkH,YAEzBG,EACRA,EAAY1H,eAAeL,KAC7BU,KAAKiH,QAAQ3H,GAAK+H,EAAY/H,SAE7B0H,oBAGPM,WAAY,KAMZC,GAAI,SAAUxH,EAAMyH,eACbF,WAAatH,KAAKsH,YAAc,IACzBtH,KAAKsH,WAAWvH,GAAQC,KAAKsH,WAAWvH,IAAS,IACvDwE,KAAKiD,GAEJxH,MAITyH,UAAW,SAAS1H,EAAMyH,GACxB5D,EAAE8D,SAAS1H,KAAMD,EAAK0B,cAAe+F,IAIvCG,IAAK,SAAU5H,EAAMyH,OACfI,EAAQ5H,KAAKsH,YAActH,KAAKsH,WAAWvH,MAC3C6H,KACGJ,MAGE,IAAIlI,EAAIsI,EAAMhI,OAAQN,KACrBsI,EAAMtI,KAAOkI,GACfI,EAAMC,OAAOvI,EAAG,eAJbU,KAAKsH,WAAWvH,UAOpBC,MAIT8H,YAAa,SAAS/H,GACpB6D,EAAEmE,cAAc/H,KAAMD,EAAK0B,gBAM7BqE,QAAS,SAAU/F,EAAMiI,EAAQC,GAC/BD,EAASA,GAAUhI,SAEfkE,EADA0D,EAAQ5H,KAAKsH,YAActH,KAAKsH,WAAWvH,MAG3C6H,MACG,IAAItI,EAAIsI,EAAMhI,OAAQN,SAEV,KADf4E,EAAS0D,EAAMtI,GAAG4I,KAAKF,EAAQA,EAAQC,IACjB,OAAO/D,SAG7BlE,KAAKmH,QACAnH,KAAKmH,OAAOrB,QAAQ/F,EAAMiI,EAAQC,IAK7CE,aAAc,SAAUzC,EAAO0C,UAC7BnJ,EAAM6C,SAAS,4DACR9B,KAAKqI,UAAU,CAAC3C,MAAAA,EAAO0C,MAAAA,KAGhCE,aAAc,kBACLtI,KAAKiH,QAAQxB,SAClB7B,EAAE5D,KAAKmH,OAAOhI,QAAQoJ,4BAAqBvI,KAAKiH,QAAQ7H,+BAAsBY,KAAKiH,QAAQxB,iBAC3FzF,KAAKwI,WE1EK,SAAZC,EAAqBC,GACvB9E,EAAE+E,QAAO,EAAM3I,KAAM0I,GAGvBD,EAAU3D,UAAY,CAEpB8D,SAAU,SAASxI,EAAOyI,MACpB7I,KAAKwH,UAEgB,EAAnB3F,UAAUjC,SACZiJ,EAAsB,GAAG3I,MAAMgI,KAAKrG,UAAW,GAAI,IAC9C7B,KAAKwH,GAAGpH,EAAOyI,MAGpBC,MAAMC,QAAQ3I,GAAQ,KACnBJ,KAAKgJ,iBACR,KAAM,cAAgBhJ,KAAKD,KAAO,2CAC7BC,KAAKgJ,4BAAoBnH,eAE5BoH,EAAWpH,UAAUA,UAAUjC,OAAS,MACxCI,KAAKkJ,cAAgBD,EAASE,sBAChCtH,UAAU,GAAK5C,EAAMiC,MAAMiB,KAAKN,UAAU,IACrB,OAAjBA,UAAU,IAEP7B,KAAKkJ,wBAAgBrH,cAE1B7B,KAAKoJ,sBACFhJ,IAEDW,MAAMX,KAEVyB,UAAU,GAAKoB,WAAWpB,UAAU,IAC7B7B,KAAKoJ,0BAAkBvH,eAE5B7B,KAAKqJ,sBACArJ,KAAKqJ,0BAAkBxH,gBAE1B,cAAgB7B,KAAKD,KAAO,kCAMtCuJ,kBAAmB,SAASC,EAAcC,MACpC,iBAAoBD,SAGfT,MAAMC,QAAQQ,GAAgBA,EAAe,CAACA,OAEnDE,EAAOzJ,KAAKsD,mBACZwF,MAAMC,QAAQU,GAAO,SACnBC,EA/EoB,SAASxH,EAAQtC,OACzC+J,EAAIzH,EAAOZ,MAAM,wBAChBqI,EACH,KAAM,iCAAmCzH,EAAS,QAChDwH,EAASC,EAAE,GAAGhG,MAAM,KAAKtB,IAAIpD,EAAMgD,eACnCyH,EAAO9J,SAAWA,EACpB,KAAM,mBAAqB8J,EAAO9J,OAAS,gBAAkBA,EAAS,qBACjE8J,EAwEUE,CAAwBL,EAAcE,EAAK7J,QAC/CN,EAAI,EAAGA,EAAIoK,EAAO9J,OAAQN,IACjCoK,EAAOpK,GAAKL,EAAMoE,iBAAiBoG,EAAKnK,GAAIoK,EAAOpK,WAC9CoK,EACF,OAAI9F,EAAEiG,cAAcJ,GAzEK,SAASK,EAAiB5H,EAAQsH,OAChEO,EAAO,KACPC,EAAQ,OACP,IAAIC,KAAOH,KACVG,EAAK,KACH7J,EAAQoJ,EAAkBS,GAC1B,iBAAoB7J,IACtBA,EAAQnB,EAAMoE,iBAAiByG,EAAgBG,GAAM7J,IACvD4J,EAAMC,GAAO7J,OAEb2J,EAAO9K,EAAMoE,iBAAiByG,EAAgBG,GAAM/H,SAGjD,CAAC6H,EAAMC,GA6DHE,CAA8BT,EAAMF,EAAcC,GAElD,CAACvK,EAAMoE,iBAAiBoG,EAAMF,KAIzCjG,gBAAiB,SAEjB6G,SAAU,GC1FY,SAApBC,EAA8BC,EAAYC,QACvCC,UAAY,yBAGZC,OAAS,UAETC,KAAKJ,GAAc,GAAIC,GAAW,IANzC,IASII,EAAe,CACjBC,MAAO,02BAGP3H,OAAQ,+BAERD,QAAS,UAET6H,OAAQ,QAERC,SAAU,SAEV1I,KAAM,CACJrC,KAAM,SAAAM,UAAqC,OAA5BnB,EAAMiC,MAAMiB,KAAK/B,KAGlC0K,IAAK,IAAIpL,OACL,sXAkCNgL,EAAYK,MAAQL,EAAY1H,OAGZ,SAAhBgI,EAAgBlK,OACdQ,GAAS,GAAKR,GAAKQ,MAAM,2CACxBA,EACE2J,KAAKC,IACP,GAEC5J,EAAM,GAAKA,EAAM,GAAG1B,OAAS,IAE7B0B,EAAM,IAAMA,EAAM,GAAK,IANR,EAYG,SAAtB6J,EAAuB1B,EAAM2B,UACxB,SAAChL,8BAAUiL,mCAAAA,2BAChBA,EAAqBC,MACdF,gBAAShL,aALEqJ,EAKuBA,EAAM4B,EALThJ,IAAIpD,EAAMiC,MAAMuI,QAArC,IAACA,GASG,SAArB8B,EAAqBH,SAAa,CACpClC,aAAciC,EAAoB,OAAQC,GAC1ChC,eAAgB+B,EAAoB,SAAUC,GAC9C9H,gBAAiB8H,EAASxL,QAAU,EAAI,SAAW,CAAC,SAAU,UAC9DuK,SAAU,IAGZC,EAAkBtF,UAAY,CAC5B2F,KAAM,SAAUJ,EAAYC,OAKrB,IAAIvK,UAJJuK,QAAUA,OAEVD,WAAamB,EAAc,GAAIxL,KAAKqK,YAExBA,OACVoB,aAAa1L,EAAMsK,EAAWtK,GAAMyH,GAAI6C,EAAWtK,GAAMoK,UAEhExI,OAAO+J,QAAQ5F,QAAQ,2BAIzB6F,UAAW,SAAUnB,WACf,IAAuBxK,KAAKsK,QAAQE,GACtC,MAAM,IAAIzF,MAAMyF,EAAS,gDAEtBA,OAASA,EAEPxK,MAIT4L,WAAY,SAAUpB,EAAQqB,EAAUC,SAClC,aAAoBD,KACtB7L,KAAKsK,QAAQE,GAAUqB,IAErB,IAASC,EACJ9L,KAAK2L,UAAUnB,GAEjBxK,MAIT+L,WAAY,SAAUvB,EAAQzK,EAAMiM,eAC9B,IAAuBhM,KAAKsK,QAAQE,KACtCxK,KAAKsK,QAAQE,GAAU,SAEpBF,QAAQE,GAAQzK,GAAQiM,EAEtBhM,MAITiM,YAAa,SAAUzB,EAAQ0B,OACxB,IAAInM,KAAQmM,OACVH,WAAWvB,EAAQzK,EAAMmM,EAAkBnM,WAE3CC,MAiBTyL,aAAc,SAAU1L,EAAMoM,EAAMC,MAC9BpM,KAAKqK,WAAWtK,GAClBd,EAAMyC,KAAK,cAAgB3B,EAAO,8BAC/B,GAAIsF,EAAS1F,eAAeI,eAC/Bd,EAAMyC,KAAK,IAAM3B,EAAO,uEAGnBC,KAAKqM,yBAAiBxK,YAG/ByK,aAAc,SAAUvM,WACbC,KAAKqK,WAAWtK,IAG3BwM,gBAAiB,SAAUxM,EAAMoM,EAAMC,UAChCpM,KAAKqK,WAAWtK,GAIdC,KAAKqM,yBAAiBxK,YAH3B5C,EAAMyC,KAAK,cAAgB3B,EAAO,6BAC3BC,KAAKyL,wBAAgB5J,aAKhC2K,gBAAiB,SAAUzM,UACpBC,KAAKqK,WAAWtK,IACnBd,EAAMyC,KAAK,cAAgB3B,EAAO,4BAE7BC,KAAKqK,WAAWtK,GAEhBC,MAGTqM,cAAe,SAAUtM,EAAM0M,EAAWtC,OAanC,IAAIK,IAZL,aAAoBiC,KAEtBA,EAAY,CACVjF,GAAIiF,EACJtC,SAAUA,IAGTsC,EAAU7D,WACb6D,EAAY,IAAIhE,EAAUgE,UAEvBpC,WAAWtK,GAAQ0M,GAEKZ,UAAY,QAClCE,WAAWvB,EAAQzK,EAAM0M,EAAUZ,SAASrB,WAE5CxK,MAGT0M,gBAAiB,SAAUC,OACrBX,EAGA,SAAWW,EAAW5M,KAExBiM,GADmBhM,KAAKsK,QAAQtK,KAAKwK,QAAQmC,EAAW5M,OAAS,IAC1C4M,EAAWpD,cAElCyC,EAAUhM,KAAK4M,cAAc5M,KAAKsK,QAAQtK,KAAKwK,QAAQmC,EAAW5M,MAAO4M,EAAWpD,qBAE/EyC,GAAWhM,KAAKsK,QAAQtK,KAAKwK,QAAQqC,gBAAkB7M,KAAKsK,QAAQwC,GAAGD,gBAIhFD,cAAe,SAAU1K,EAAQ6K,MAC3B,aAAoBA,SAOjB,iBAAoB7K,EAASA,EAAOb,QAAQ,MAAO0L,GAAc,OANjE,IAAIzN,KAAKyN,EACZ7K,EAASlC,KAAK4M,cAAc1K,EAAQ6K,EAAWzN,WAE1C4C,GAaXmI,WAAY,CACV2C,SAAU,CACR3D,eAAgB,SAASjJ,SAChB,KAAKN,KAAKM,IAEnB+J,SAAU,GAEZ8C,SAAU,CACRjE,iBAAkB,SAASU,UACF,EAAhBA,EAAO9J,QAEhByJ,eAAgB,SAASjJ,SAChB,KAAKN,KAAKM,IAEnB+J,SAAU,KAEZV,KAAM,CACJJ,eAAgB,SAASjJ,EAAOqJ,EAAhB,sCAAA,EAAA,EAAiD,OAA1ByD,KAAAA,aAAO,YAAOC,KAAAA,aAAO,IACtDC,EAAS1C,EAAYjB,OACpB2D,QACG,IAAIrI,MAAM,mBAAqB0E,EAAO,0BAEzCrJ,EACH,OAAO,MACJgN,EAAOtN,KAAKM,GACf,OAAO,KACL,WAAaqJ,IACV,SAAS3J,KAAKoN,GAAQ,IAAK,KAC1BG,EAAKrM,OAAOZ,GACZkN,EAAWrC,KAAKC,IAAIF,EAAckC,GAAOlC,EAAcmC,OACvDnC,EAAcqC,GAAMC,SACf,MAELC,EAAQ,SAAAC,UAAKvC,KAAKwC,MAAMD,EAAIvC,KAAKyC,IAAI,GAAIJ,SACxCC,EAAMF,GAAME,EAAMJ,IAASI,EAAML,IAAS,EAC7C,OAAO,SAGN,GAET5J,gBAAiB,IACX,SACJ4J,KAAM,SACNC,KAAM,UAERhD,SAAU,KAEZwD,QAAS,CACPtE,eAAgB,SAASjJ,EAAO+C,UACzB/C,GAEE+C,EAAOrD,KAAKM,IAErBkD,gBAAiB,SACjB6G,SAAU,IAEZyD,UAAW,CACTvE,eAAgB,SAAUjJ,EAAOyN,UAC1BzN,GAEEA,EAAMR,QAAUiO,GAEzBvK,gBAAiB,UACjB6G,SAAU,IAEZ2D,UAAW,CACTzE,eAAgB,SAAUjJ,EAAOyN,UACxBzN,EAAMR,QAAUiO,GAEzBvK,gBAAiB,UACjB6G,SAAU,IAEZvK,OAAQ,CACNyJ,eAAgB,SAAUjJ,EAAO2N,EAAK7C,UAC/B9K,GAEEA,EAAMR,QAAUmO,GAAO3N,EAAMR,QAAUsL,GAEhD5H,gBAAiB,CAAC,UAAW,WAC7B6G,SAAU,IAEZ6D,SAAU,CACRhF,iBAAkB,SAAUU,EAAQmE,UAC3BnE,EAAO9J,QAAUiO,GAE1BvK,gBAAiB,UACjB6G,SAAU,IAEZ8D,SAAU,CACRjF,iBAAkB,SAAUU,EAAQmE,UAC3BnE,EAAO9J,QAAUiO,GAE1BvK,gBAAiB,UACjB6G,SAAU,IAEZ+D,MAAO,CACLlF,iBAAkB,SAAUU,EAAQqE,EAAK7C,UAChCxB,EAAO9J,QAAUmO,GAAOrE,EAAO9J,QAAUsL,GAElD5H,gBAAiB,CAAC,UAAW,WAC7B6G,SAAU,IAEZ4D,IAAKxC,EAAmB,SAACnL,EAAOyN,UAAyBA,GAATzN,IAChD8K,IAAKK,EAAmB,SAACnL,EAAOyN,UAAgBzN,GAASyN,IACzD9C,MAAOQ,EAAmB,SAACnL,EAAO2N,EAAK7C,UAAiB6C,GAAT3N,GAAgBA,GAAS8K,IACxEiD,QAAS,CACP9E,eAAgB,SAAUjJ,EAAOgO,OAC1BhO,EACH,OAAO,MACLiO,EAAazK,EAAEwK,UACfC,EAAWzO,OACNQ,IAAUiO,EAAWC,MAErBlO,IAAUgO,GAErBjE,SAAU,KAEZoE,QAAS,CACPlF,eAAgB,SAAUjJ,OACnBA,SACI,QAGA,gCACCN,KAAKM,IAEjB+J,SAAU,MC9WhB,IAAIqE,EAAK,GA4BTA,EAAGC,KAAO,CAERC,mBAAoB,2BACblG,SAASjB,GAAG,iBAAkB,SAAA1D,GAAS8C,EAAKgI,iBAAiB9K,UAC7D2E,SAASjB,GAAG,gBAAiBtI,EAAMiG,gBAAiB,SAAArB,GAAS8C,EAAKiI,eAAe/K,MAGlF,IAAU7D,KAAKiH,QAAQtB,gBAGtBxG,QAAQqB,aAAa,aAAc,KAG1CqF,MAAO,qBACAgJ,cAAgB,QAER7O,KAAK4G,kBAAoB,SAAW5G,KAAKiH,QAAQpB,MAC5D,OAAO,SAEJ,IAAIvG,EAAI,EAAGA,EAAIU,KAAK8O,OAAOlP,OAAQN,IAAK,KACvCyP,EAAQ/O,KAAK8O,OAAOxP,OACpB,IAASyP,EAAMnI,kBAAoD,EAAhCmI,EAAMnI,iBAAiBhH,aAAc,IAAuBmP,EAAM9H,QAAQ+H,eAC1GH,cAAgBE,EAAMvG,SACvB,UAAYxI,KAAKiH,QAAQpB,OAC3B,aAIF,OAAS7F,KAAK6O,cACT,KAEF7O,KAAK6O,cAAchJ,SAG5BoJ,WAAY,gBAELzG,SAASb,IAAI,cAKtB6G,EAAGU,MAAQ,CAETC,UAAW,mBACJC,WAGApP,KAAKqP,SAINC,EA7EU,SAAdC,EAAwBC,EAAWC,EAAWC,WAC5CC,EAAQ,GACRC,EAAO,GAEFtQ,EAAI,EAAGA,EAAIkQ,EAAU5P,OAAQN,IAAK,SACrCuQ,GAAQ,EAEHC,EAAI,EAAGA,EAAIL,EAAU7P,OAAQkQ,OAChCN,EAAUlQ,GAAGyQ,OAAOhQ,OAAS0P,EAAUK,GAAGC,OAAOhQ,KAAM,CACzD8P,GAAQ,QAIRA,EACFD,EAAKrL,KAAKiL,EAAUlQ,IAEpBqQ,EAAMpL,KAAKiL,EAAUlQ,UAGlB,CACLsQ,KAAMA,EACND,MAAOA,EACPK,QAAUN,EAAuD,GAAhDH,EAAYE,EAAWD,GAAW,GAAMG,OAuD9CJ,CAAYvP,KAAK4G,iBAAkB5G,KAAKqP,IAAIY,2BAGlDZ,IAAIY,qBAAuBjQ,KAAK4G,sBAGhCsJ,0BAGAC,sBAAsBb,QAGtBZ,sBAGAY,EAAKM,KAAKhQ,SAAU0P,EAAKK,MAAM/P,QAAYI,KAAKoQ,mBAC9CA,aAAc,OACd1B,wBAKT2B,kBAAmB,eAEb,IAASrQ,KAAK4G,iBAChB,MAAO,WAELiF,EAAW,GAENvM,EAAI,EAAGA,EAAIU,KAAK4G,iBAAiBhH,OAAQN,IAChDuM,EAAStH,KAAKvE,KAAK4G,iBAAiBtH,GAAGgR,cACtCtQ,KAAKuQ,iBAAiBvQ,KAAK4G,iBAAiBtH,GAAGyQ,gBAE3ClE,GAIT2E,SAAU,SAAUzQ,EAAV,sCAAA,EAAA,EAAwD,GAAvCiM,IAAAA,QAAS+D,IAAAA,WAAQU,YAAAA,qBACrCrB,gBACAsB,UAAU3Q,EAAM,CAACiM,QAAAA,EAAS+D,OAAAA,IAE3BU,GACFzQ,KAAK2Q,eAITC,YAAa,SAAU7Q,EAAV,sCAAA,EAAA,EAAwD,GAAvCiM,IAAAA,QAAS+D,IAAAA,WAAQU,YAAAA,qBACxCrB,gBACAyB,aAAa9Q,EAAM,CAACiM,QAAAA,EAAS+D,OAAAA,IAE9BU,GACFzQ,KAAK2Q,eAITG,YAAa,SAAU/Q,EAAV,uCAAA,EAAA,EAAuC,IAAtB0Q,YAAAA,qBACvBrB,gBACA2B,aAAahR,GAId0Q,GACFzQ,KAAKkQ,sBAGTA,mBAAoB,WACdlQ,KAAKgR,kBAAoBhR,KAAKiR,oBAAqB,IAASjR,KAAK4G,iBACnE5G,KAAKkR,gBACiC,EAA/BlR,KAAK4G,iBAAiBhH,OAC7BI,KAAK2Q,cAEL3Q,KAAKmR,eAGThB,sBAAuB,SAAUb,WAC3B,IAAuBtP,KAAKiH,QAAQmK,gCAIpC,IAAuBpR,KAAKiH,QAAQqJ,oBACjChB,EAAKK,MAAM/P,QAAU0P,EAAKM,KAAKhQ,aAC7ByR,sBAED,IAAMrR,KAAKqP,IAAIiC,eAAeC,KAAK,iCAAiC3R,QACtEI,KAAKqP,IAAIiC,eACNE,OACC5N,EAAE5D,KAAKiH,QAAQZ,eACdoL,SAAS,sCAGXpC,IAAIqC,mBAAmBxS,KAAK,mBAAoBc,KAAKqP,IAAIsC,iBAEvD3R,KAAKqP,IAAIiC,eACbG,SAAS,UACTvS,KAAK,cAAe,SACpBqS,KAAK,iCACLK,KAAK5R,KAAKiH,QAAQqJ,qBAGlBjB,IAAIqC,mBAAmBG,WAAW,oBAEhC7R,KAAKqP,IAAIiC,eACbQ,YAAY,UACZ5S,KAAK,cAAe,QACpBqS,KAAK,iCACLtN,cAIA,IAAI3E,EAAI,EAAGA,EAAIgQ,EAAKU,QAAQpQ,OAAQN,SAClCyR,aAAazB,EAAKU,QAAQ1Q,GAAGyQ,OAAOhQ,UAEtCT,EAAI,EAAGA,EAAIgQ,EAAKK,MAAM/P,OAAQN,SAC5BoR,UAAUpB,EAAKK,MAAMrQ,GAAGyQ,OAAOhQ,KAAM,CAACiM,QAASsD,EAAKK,MAAMrQ,GAAGgR,aAAcP,OAAQT,EAAKK,MAAMrQ,GAAGyQ,aAEnGzQ,EAAI,EAAGA,EAAIgQ,EAAKM,KAAKhQ,OAAQN,SAC3BuR,aAAavB,EAAKM,KAAKtQ,GAAGyQ,OAAOhQ,KAAM,CAACiM,QAASsD,EAAKM,KAAKtQ,GAAGgR,aAAcP,OAAQT,EAAKM,KAAKtQ,GAAGyQ,WAI1GW,UAAW,SAAU3Q,SAAOiM,IAAAA,QAAS+D,IAAAA,YAC9BsB,2BACAhC,IAAIqC,mBACNxS,KAAK,mBAAoBc,KAAKqP,IAAIsC,sBAChCtC,IAAIiC,eACNG,SAAS,UACTvS,KAAK,cAAe,SACpBsS,OACC5N,EAAE5D,KAAKiH,QAAQZ,eACdoL,SAAS,WAAa1R,GACtB6R,KAAK5F,GAAWhM,KAAKuQ,iBAAiBR,MAI7Cc,aAAc,SAAU9Q,SAAOiM,IAAAA,QAAS+D,IAAAA,YACjCV,IAAIiC,eACNG,SAAS,UACTF,KAAK,YAAcxR,GACnB6R,KAAK5F,GAAWhM,KAAKuQ,iBAAiBR,KAG3CgB,aAAc,SAAUhR,QACjBsP,IAAIqC,mBACNG,WAAW,yBACTxC,IAAIiC,eACNQ,YAAY,UACZ5S,KAAK,cAAe,QACpBqS,KAAK,YAAcxR,GACnBkE,UAGLsM,iBAAkB,SAAU5D,OACtBoF,EAA+BpF,EAAW5M,KAAO,sBAEjD,IAAuBC,KAAKiH,QAAQ8K,GAC/BpQ,OAAO+J,QAAQkB,cAAc5M,KAAKiH,QAAQ8K,GAA+BpF,EAAWpD,cAEtF5H,OAAO+J,QAAQgB,gBAAgBC,IAGxCyC,SAAU,eAEJpP,KAAKqP,MAAO,IAAUrP,KAAKiH,QAAQtB,eAGnC0J,EAAM,QAGLlQ,QAAQqB,aAAaR,KAAKiH,QAAQ7H,UAAY,KAAMY,KAAKoF,QAI9DiK,EAAIqC,mBAAqB1R,KAAKgS,sBAG9B3C,EAAIsC,gBAAkB,eAAiB3R,KAAKiH,QAAQxB,SAAW,YAAczF,KAAKiH,QAAQxB,SAAWzF,KAAKoF,QAC1GiK,EAAIiC,eAAiB1N,EAAE5D,KAAKiH,QAAQb,eAAelH,KAAK,KAAMmQ,EAAIsC,iBAGlEtC,EAAIY,qBAAuB,GAC3BZ,EAAI4C,8BAA+B,OAG9B5C,IAAMA,IAIb2C,oBAAqB,cAEf,iBAAoBhS,KAAKiH,QAAQf,cAAgBtC,EAAE5D,KAAKiH,QAAQf,cAActG,OAChF,OAAOgE,EAAE5D,KAAKiH,QAAQf,kBAGpBgM,EAAmBlS,KAAKiH,QAAQf,gBAGhC,iBAAoBlG,KAAKiH,QAAQf,cAAgB,mBAAsBvE,OAAO3B,KAAKiH,QAAQf,gBAC7FgM,EAAmBvQ,OAAO3B,KAAKiH,QAAQf,eAErC,mBAAsBgM,EAAkB,KACtCC,EAAWD,EAAiBhK,KAAKlI,KAAMA,cAGvC,IAAuBmS,GAAYA,EAASvS,OAC9C,OAAOuS,MACJ,CAAA,GAAI,aAAoBD,IAAoBA,aAA4BE,QAAUF,EAAiBtS,cACjGsS,EACEA,GACTjT,EAAMyC,KAAK,sBAAwBwQ,EAAmB,8DAGjDlS,KAAKqS,gBAGdA,aAAc,kBAEPrS,KAAKiH,QAAQxB,UAAsC,WAA1BzF,KAAKb,QAAQmT,SAIpCtS,KAAKwI,SAASrB,SAHZnH,KAAKwI,UAMhB6I,oBAAqB,eACfkB,EAAmBvS,KAAKiH,QAAQd,mBAGhC,IAAMnG,KAAKqP,IAAIiC,eAAenK,SAASvH,OACzC,OAAOI,KAAKqP,IAAIiC,eAAenK,YAE7B,iBAAoBoL,EAAkB,IACpC3O,EAAE2O,GAAkB3S,OACtB,OAAOgE,EAAE2O,GAAkBf,OAAOxR,KAAKqP,IAAIiC,gBACpC,mBAAsB3P,OAAO4Q,GACpCA,EAAmB5Q,OAAO4Q,GAE1BtT,EAAMyC,KAAK,yBAA2B6Q,EAAmB,6DAGzD,mBAAsBA,IACxBA,EAAmBA,EAAiBrK,KAAKlI,KAAMA,OAE7C,aAAoBuS,IAAoBA,EAAiB3S,OACpD2S,EAAiBf,OAAOxR,KAAKqP,IAAIiC,gBAEnCtR,KAAKqS,eAAeG,MAAMxS,KAAKqP,IAAIiC,iBAG5C5C,mBAAoB,eAEd5I,SADA2M,EAAUzS,KAAKsI,eAInBmK,EAAQ9K,IAAI,YACR3H,KAAKoQ,YACPqC,EAAQlL,GAAGtI,EAAMwE,gBAAgBzD,KAAKiH,QAAQlB,oBAAqB,WAAY,WAC7E2M,EAAKC,uBAEA7M,EAAU7G,EAAMwE,gBAAgBzD,KAAKiH,QAAQnB,QAAS,aAC7D2M,EAAQlL,GAAGzB,EAAS,SAAA8M,GAClBF,EAAKC,kBAAkBC,MAK7BD,kBAAmB,SAAUC,cAIvBA,GAAS,YAAY9S,KAAK8S,EAAMnJ,SAC5BzJ,KAAKqP,MAAOrP,KAAKqP,IAAI4C,+BAAiCjS,KAAK6S,WAAWjT,QAAUI,KAAKiH,QAAQrB,sBAGjG5F,KAAKiH,QAAQ6L,UACfnR,OAAOoR,aAAa/S,KAAKgT,iBACpBA,WAAarR,OAAOsR,WAAW,kBAAMC,EAAKtK,YAAY5I,KAAKiH,QAAQ6L,WAExE9S,KAAK4I,aAGTuK,SAAU,gBAEH/C,aAAc,OACd1B,0BAGD,IAAuB1O,KAAKqP,WAI3BA,IAAIiC,eACNQ,YAAY,UACZsB,WACAnP,cAGEkN,mBAGA9B,IAAIY,qBAAuB,QAC3BZ,IAAI4C,8BAA+B,IAG1ChD,WAAY,gBACLkE,gBAED,IAAuBnT,KAAKqP,KAC9BrP,KAAKqP,IAAIiC,eAAerN,gBAEnBjE,KAAKqP,KAGd6B,cAAe,gBACR7B,IAAI4C,8BAA+B,OACnC5C,IAAIqC,mBAAmBI,YAAY9R,KAAKiH,QAAQjB,YAAYyL,SAASzR,KAAKiH,QAAQhB,eAEzF0K,YAAa,gBACNtB,IAAI4C,8BAA+B,OACnC5C,IAAIqC,mBAAmBI,YAAY9R,KAAKiH,QAAQhB,cAAcwL,SAASzR,KAAKiH,QAAQjB,aAE3FmL,YAAa,gBACN9B,IAAIqC,mBAAmBI,YAAY9R,KAAKiH,QAAQhB,cAAc6L,YAAY9R,KAAKiH,QAAQjB,cC/YrF,SAAPyI,EAAiBtP,EAAS+H,EAAYD,QACnCsD,UAAY,YAEZpL,QAAUA,OACVqJ,SAAW5E,EAAEzE,QACb+H,WAAaA,OACbD,QAAUA,OACVE,OAASxF,OAAO+J,aAEhBoD,OAAS,QACTlI,iBAAmB,KAV1B,IAaIyM,EAAgB,CAACC,QAAS,KAAMC,UAAU,EAAMC,UAAU,GAE9D/E,EAAK3J,UAAY,CACf6J,iBAAkB,SAAUiE,kBAEtB,IAASA,EAAMa,aAIfC,EAAe1T,KAAK2T,eAAiB3T,KAAKwI,SAAS+I,KAAKtS,EAAMiG,iBAAiB,WAC9EyO,cAAgB,UAChBnL,SAAS+I,KAAK,oCAAoCqC,KAAK,YAAY,IACpEF,GAAgB,OAASA,EAAa9S,aAAa,mBAGvDe,OAAO+J,QAAQmI,aAAe,OAE1B9M,EAAU/G,KAAK8T,aAAa,CAAClB,MAAAA,IAE7B,aAAe7L,EAAQgN,UAAW,IAAU/T,KAAKgU,SAAS,YAK5DpB,EAAMqB,2BACNrB,EAAMsB,iBACF,YAAcnN,EAAQgN,SACxBhN,EAAQoN,KAAK,WAAQxN,EAAKyN,QAAQV,SAIxC9E,eAAgB,SAASgE,QAClBe,cAAgBf,EAAMyB,eAK7BD,QAAS,SAAUV,OACb,IAAU1T,KAAKgU,SAAS,cAGxBN,EAAc,KACZY,EAAatU,KAAKwI,SAAS+I,KAAK,oCAAoCqC,KAAK,YAAY,GACrF,IAAMU,EAAW1U,SACnB0U,EAAa1Q,EAAE,iEAAiE2Q,SAASvU,KAAKwI,WAChG8L,EAAWpV,KAAK,CACda,KAAM2T,EAAa9S,aAAa,QAChCR,MAAOsT,EAAa9S,aAAa,gBAIhC4H,SAAS1C,QAAQ0F,EAAc5H,EAAE4Q,MAAM,UAAW,CAACf,SAAS,OAQnE7K,SAAU,SAAU3B,MACM,GAApBpF,UAAUjC,SAAgBgE,EAAEiG,cAAc5C,GAAU,CACtDhI,EAAM6C,SAAS,6HACaD,WAC5BoF,EAAU,CAACvB,WAAO0C,WAAOwK,mBAEpBS,EAAerT,KAAK8T,aAAa7M,GAAS8M,UAGnDD,aAAc,SAAA,+CAAA,EAAA,EAAkC,GAAvBpO,IAAAA,MAAO0C,IAAAA,MAAOwK,IAAAA,YAChC6B,YAAc7B,UAEZ6B,YAAcjJ,EAAc,GAAIoH,EAAO,CAACsB,eAAgB,WAC3DjV,EAAM6C,SAAS,0GACf4Q,EAAK9L,kBAAmB,WAGvBA,kBAAmB,OAGnBoN,SAAS,iBAGTU,qBAEDjQ,EAAWzE,KAAK2U,iCAAiC,kBAC5C/Q,EAAEvB,IAAIqQ,EAAK5D,OAAQ,SAAAC,UAASA,EAAM+E,aAAa,CAAC1L,MAAAA,EAAO1C,MAAAA,iBAGzDzG,EAAMuF,IAAIC,GACd0P,KAAO,WAAQzB,EAAKsB,SAAS,aAC7BY,KAAO,WACNlC,EAAK9L,kBAAmB,EACxB8L,EAAK7M,QACL6M,EAAKsB,SAAS,WAEfa,OAAO,WAAQnC,EAAKsB,SAAS,gBAC7BxN,eAAQxG,KAAKuG,sCAOlBuO,QAAS,SAAU7N,MACO,GAApBpF,UAAUjC,SAAgBgE,EAAEiG,cAAc5C,GAAU,CACtDhI,EAAM6C,SAAS,4HACMD,WACrBoF,EAAU,CAACvB,WAAO0C,mBAEbiL,EAAerT,KAAKqI,UAAUpB,GAAS8M,UAMhD1L,UAAW,SAAA,6CAAA,EAAA,EAA2B,GAAhB3C,IAAAA,MAAO0C,IAAAA,WACtBsM,qBAEDjQ,EAAWzE,KAAK2U,iCAAiC,kBAC5C/Q,EAAEvB,IAAI6Q,EAAKpE,OAAQ,SAAAC,UAASA,EAAM1G,UAAU,CAAC3C,MAAAA,EAAO0C,MAAAA,eAEtDnJ,EAAMuF,IAAIC,IAGnBsQ,QAAS,uBACFL,iBACE1U,MAITgV,MAAO,eAEA,IAAI1V,EAAI,EAAGA,EAAIU,KAAK8O,OAAOlP,OAAQN,SACjCwP,OAAOxP,GAAG0V,aAEZhB,SAAS,UAIhBiB,QAAS,gBAEFhG,iBAGA,IAAI3P,EAAI,EAAGA,EAAIU,KAAK8O,OAAOlP,OAAQN,SACjCwP,OAAOxP,GAAG2V,eAEZzM,SAAS0M,WAAW,gBACpBlB,SAAS,YAGhBU,eAAgB,kBACP1U,KAAKgH,mBAAmBmO,eAGjCA,YAAa,sBACPC,EAAYpV,KAAK8O,mBAEhBA,OAAS,QACTuG,iBAAmB,QAEnBV,iCAAiC,WACpCW,EAAK9M,SACJ+I,KAAK+D,EAAKrO,QAAQ3B,QAClBiQ,IAAID,EAAKrO,QAAQ1B,UACjBgQ,eAAQD,EAAKrO,QAAQ7H,6BACrB+E,KAAK,SAACC,EAAGjF,OACJqW,EAAgB,IAAI7T,OAAO+J,QAAQ+J,QAAQtW,EAAS,GAAImW,MAGxD,UAAYE,EAAcjL,WAAa,kBAAoBiL,EAAcjL,UAAW,KAClFmL,EAAWF,EAAcjL,UAAY,IAAMiL,EAAcpQ,YACzD,IAAuBkQ,EAAKD,iBAAiBK,KAC/CJ,EAAKD,iBAAiBK,GAAYF,EAClCF,EAAKxG,OAAOvK,KAAKiR,OAKvB5R,EAAEO,KAAKlF,EAAM8E,WAAWqR,EAAWE,EAAKxG,QAAS,SAAC1K,EAAG2K,GACnDA,EAAMiG,YAGHhV,MAUT2U,iCAAkC,SAAUnN,OACtCmO,EAAsB3V,KAAKgH,sBAC1BA,iBAAmB,kBAAqBhH,UACzCkE,EAASsD,gBACRR,iBAAmB2O,EACjBzR,GAMT8P,SAAU,SAAU4B,UACX5V,KAAK8F,QAAQ,QAAU8P,KC3Nf,SAAbC,EAAsBC,EAAc/V,EAAMwJ,EAAcY,EAAU4L,OAChEC,EAAgBrU,OAAO+J,QAAQuK,mBAAmB5L,WAAWtK,GAC7D0M,EAAY,IAAIhE,EAAUuN,KAIlBhW,KAAM,CAClByM,UAAAA,EACA1M,KAAAA,EACAwJ,aAAAA,EACAY,SAPFA,EAAWA,GAAY2L,EAAa7O,QAAQlH,EAAO,aAAe0M,EAAUtC,SAQ1E4L,gBAPFA,GAAmB,IAASA,SASvBG,mBAAmBJ,EAAa7O,SCX3B,SAARiI,EAAkBH,EAAO7H,EAAYD,EAASkP,QAC3C5L,UAAY,aAEZpL,QAAU4P,OACVvG,SAAW5E,EAAEmL,QAGd,IAAuBoH,SACpBhP,OAASgP,QAGXlP,QAAUA,OACVC,WAAaA,OAGbkP,YAAc,QACdC,kBAAoB,QACpBzP,kBAAmB,OAGnB0P,mBDtBP,ICyBIjD,EAAgB,CAACC,QAAS,KAAMC,UAAU,EAAMC,WDJpDqC,EAAW/Q,UAAY,CACrB8D,SAAU,SAASxI,EAAO6I,uBACZwD,WAAU7D,kBAASxI,YAAUJ,KAAKuW,kBAAiBtN,MAGjEiN,mBAAoB,SAASjP,mBACtBsP,gBAAkBvW,KAAKyM,UAAUnD,kBAAkBtJ,KAAKuJ,aAC3D,SAAAU,UAAOhD,EAAQN,EAAK5G,OAZEqB,EAYgB6I,GAX1B,GAAGzI,cACNJ,EAAIlB,MAAM,KAFN,IAASkB,QCW5B8N,EAAMpK,UAAY,CAKhB8D,SAAU,SAAU3B,GACM,GAApBpF,UAAUjC,SAAgBgE,EAAEiG,cAAc5C,KAC5ChI,EAAM6C,SAAS,6FACfmF,EAAU,CAACA,QAAAA,QAETF,EAAU/G,KAAK8T,aAAa7M,OAC3BF,SACI,SACDA,EAAQgN,aACT,iBAAkB,SAClB,kBAAmB,MACnB,kBAAmB/T,KAAK4G,mBAOjCkN,aAAc,SAAA,+CAAA,EAAA,EAA4B,GAAjB1L,IAAAA,MAAO1C,IAAAA,cAEzBqP,WACDrP,GAAU1F,KAAKwW,WAAW9Q,eAGzBtF,MAAQJ,KAAK6S,gBAGbmB,SAAS,oBAEF3L,UAAU,CAACD,MAAAA,EAAOhI,MAAOJ,KAAKI,MAAOqW,YAAY,IAC1D5B,OAAO,WAAQlO,EAAKwI,cACpBgF,KAAK,WAAUxN,EAAKqN,SAAS,aAC7BY,KAAK,WAAUjO,EAAKqN,SAAS,WAC7Ba,OAAO,WAAQlO,EAAKqN,SAAS,gBAC7BxN,eAAQxG,KAAKuG,sCAGlByK,eAAgB,kBACP,IAAMhR,KAAKoW,YAAYxW,QAIhCqR,gBAAiB,SAAU7Q,eACrB,IAAuBA,IACzBA,EAAQJ,KAAK6S,eAIVzS,EAAMR,SAAWI,KAAK0W,oBAAiB,IAAuB1W,KAAKiH,QAAQ0P,kBAMlFH,WAAY,SAAU9Q,UAChBoD,MAAMC,QAAQ/I,KAAKiH,QAAQvB,QACrB,IAAM9B,EAAEgT,QAAQlR,EAAO1F,KAAKiH,QAAQvB,OACvC1F,KAAKiH,QAAQvB,QAAUA,GAOhCoP,QAAS,SAAU7N,MACO,GAApBpF,UAAUjC,SAAgBgE,EAAEiG,cAAc5C,GAAU,CACtDhI,EAAM6C,SAAS,6HACMD,WACrBoF,EAAU,CAACmB,WAAOhI,gBAEhB2G,EAAU/G,KAAKqI,UAAUpB,UACxBF,GAEEsM,EAActM,EAAQgN,UAQ/B1L,UAAW,SAAA,6CAAA,EAAA,EAAsD,OAA3CD,MAAAA,gBAAehI,IAAAA,MAAOsF,IAAAA,WAAO+Q,YAG/CzW,KAAK+U,WAEHrP,GAAU1F,KAAKwW,WAAW9Q,YAGzBkB,kBAAmB,GAGnB5G,KAAKgR,iBACR,OAAOpN,EAAEc,UAGP,MAAuBtE,IACzBA,EAAQJ,KAAK6S,aAEV7S,KAAKiR,gBAAgB7Q,KAAU,IAASgI,EAC3C,OAAOxE,EAAEc,WAEPmS,EAAqB7W,KAAK8W,yBAC1BrS,EAAW,UACfb,EAAEO,KAAK0S,EAAoB,SAACzS,EAAGgS,OAGzBrP,EAAU9H,EAAMuF,IAClBZ,EAAEvB,IAAI+T,EAAa,SAAAzJ,UAAc+F,EAAKqE,oBAAoB3W,EAAOuM,SAEnElI,EAASF,KAAKwC,GACU,aAApBA,EAAQgN,QACV,OAAO,IAEJ9U,EAAMuF,IAAIC,KAInBsS,oBAAqB,SAAS3W,EAAOuM,cAC/BzI,EAASyI,EAAW/D,SAASxI,EAAOJ,aAEpC,IAAUkE,IACZA,EAASN,EAAE8C,WAAWG,UAEjB5H,EAAMuF,IAAI,CAACN,IAAS0Q,KAAK,SAAAtE,GACxB4C,EAAKtM,4BAA4BkC,QACrCoK,EAAKtM,iBAAmB,IAC1BsM,EAAKtM,iBAAiBrC,KAAK,CACzBwL,OAAQpD,EACR2D,aAAc,iBAAoBA,GAAgBA,OAMxDuC,SAAU,eACJzS,SAWA,OAPFA,EADE,mBAAsBJ,KAAKiH,QAAQ7G,MAC7BJ,KAAKiH,QAAQ7G,MAAMJ,WACpB,IAAuBA,KAAKiH,QAAQ7G,MACnCJ,KAAKiH,QAAQ7G,MAEbJ,KAAKwI,SAAS8F,OAIf,GAEFtO,KAAKgX,kBAAkB5W,IAIhC4U,MAAO,uBACA7B,WACEnT,KAAKgU,SAAS,UAIvBiB,QAAS,gBAEFhG,kBACAzG,SAAS0M,WAAW,gBACpB1M,SAAS0M,WAAW,sBACpBlB,SAAS,YAIhBe,QAAS,uBACFkC,sBACEjX,MAGTiX,oBAAqB,kBACZjX,KAAKgH,mBAAmBsP,oBAGjCY,mBAAoB,kBAClBjY,EAAM6C,SAAS,kEACR9B,KAAK+U,WAWdoC,cAAe,SAAUpX,EAAMwJ,EAAcY,EAAU4L,MAEjDpU,OAAO+J,QAAQuK,mBAAmB5L,WAAWtK,GAAO,KAClD4M,EAAa,IAAIkJ,EAAW7V,KAAMD,EAAMwJ,EAAcY,EAAU4L,GAGhE,cAAgB/V,KAAKqW,kBAAkB1J,EAAW5M,OACpDC,KAAKoX,iBAAiBzK,EAAW5M,WAE9BqW,YAAY7R,KAAKoI,QACjB0J,kBAAkB1J,EAAW5M,MAAQ4M,SAGrC3M,MAIToX,iBAAkB,SAAUrX,OACrB,IAAIT,EAAI,EAAGA,EAAIU,KAAKoW,YAAYxW,OAAQN,OACvCS,IAASC,KAAKoW,YAAY9W,GAAGS,KAAM,MAChCqW,YAAYvO,OAAOvI,EAAG,uBAGxBU,KAAKqW,kBAAkBtW,GACvBC,MAITqX,iBAAkB,SAAUtX,EAAMgN,EAAY5C,UACrCnK,KAAKoX,iBAAiBrX,GAC1BoX,cAAcpX,EAAMgN,EAAY5C,IAOrCmM,iBAAkB,mBACZF,EAAc,GACdC,EAAoB,GAGf/W,EAAI,EAAGA,EAAIU,KAAKoW,YAAYxW,OAAQN,KACvC,IAAUU,KAAKoW,YAAY9W,GAAGyW,kBAChCK,EAAY7R,KAAKvE,KAAKoW,YAAY9W,IAClC+W,EAAkBrW,KAAKoW,YAAY9W,GAAGS,MAAQC,KAAKoW,YAAY9W,QAO9D,IAAIS,UAJJqW,YAAcA,OACdC,kBAAoBA,EAGRrW,KAAKiH,aACfkQ,cAAcpX,EAAMC,KAAKiH,QAAQlH,QAAOuX,GAAW,UAGnDtX,KAAKuX,yBAKdA,sBAAuB,WAEjB,OAASvX,KAAKb,QAAQyB,aAAa,aACrCZ,KAAKmX,cAAc,YAAY,OAAMG,GAAW,GAG9C,OAAStX,KAAKb,QAAQyB,aAAa,YACrCZ,KAAKmX,cAAc,UAAWnX,KAAKb,QAAQyB,aAAa,gBAAY0W,GAAW,OAG7EvJ,EAAM/N,KAAKb,QAAQyB,aAAa,OAChCsK,EAAMlL,KAAKb,QAAQyB,aAAa,OAChC,OAASmN,GAAO,OAAS7C,EAC3BlL,KAAKmX,cAAc,QAAS,CAACpJ,EAAK7C,QAAMoM,GAAW,GAG5C,OAASvJ,EAChB/N,KAAKmX,cAAc,MAAOpJ,OAAKuJ,GAAW,GAGnC,OAASpM,GAChBlL,KAAKmX,cAAc,MAAOjM,OAAKoM,GAAW,GAIxC,OAAStX,KAAKb,QAAQyB,aAAa,cAAgB,OAASZ,KAAKb,QAAQyB,aAAa,aACxFZ,KAAKmX,cAAc,SAAU,CAACnX,KAAKb,QAAQyB,aAAa,aAAcZ,KAAKb,QAAQyB,aAAa,mBAAe0W,GAAW,GAGnH,OAAStX,KAAKb,QAAQyB,aAAa,aAC1CZ,KAAKmX,cAAc,YAAanX,KAAKb,QAAQyB,aAAa,kBAAc0W,GAAW,GAG5E,OAAStX,KAAKb,QAAQyB,aAAa,cAC1CZ,KAAKmX,cAAc,YAAanX,KAAKb,QAAQyB,aAAa,kBAAc0W,GAAW,OAIjF7N,EAAOxK,EAAM0B,QAAQX,KAAKb,eAG1B,WAAasK,EACRzJ,KAAKmX,cAAc,OAAQ,CAAC,SAAU,CAC3CjK,KAAMlN,KAAKb,QAAQyB,aAAa,SAAW,IAC3CuM,KAAMY,GAAO/N,KAAKb,QAAQyB,aAAa,gBACrC0W,GAAW,GAEN,4BAA4BxX,KAAK2J,GACnCzJ,KAAKmX,cAAc,OAAQ1N,OAAM6N,GAAW,GAE9CtX,MAKT0W,YAAa,uBACP,IAAuB1W,KAAKqW,kBAAkBpJ,WAG3C,IAAUjN,KAAKqW,kBAAkBpJ,SAAS1D,cAKnDyK,SAAU,SAAU4B,UACX5V,KAAK8F,QAAQ,SAAW8P,IAOjCoB,kBAAmB,SAAU5W,UACvB,IAASJ,KAAKiH,QAAQuQ,WACxBvY,EAAM6C,SAAS,2FAEb,WAAa9B,KAAKiH,QAAQwQ,aAC5BrX,EAAQA,EAAMiB,QAAQ,UAAW,MAE9B,SAAWrB,KAAKiH,QAAQwQ,YAAgB,WAAazX,KAAKiH,QAAQwQ,aAAgB,IAASzX,KAAKiH,QAAQuQ,YAC3GpX,EAAQnB,EAAMgD,WAAW7B,IAEpBA,GAGT+I,aAAc,eACRuO,EAAI1X,KAAKqW,kBAAkB5M,YACxBiO,GAAwB,SAAnBA,EAAEnO,cAMhBuN,uBAAwB,eAClB,IAAU9W,KAAKiH,QAAQzB,gBACzB,MAAO,CAACxF,KAAKoW,qBAEXS,EAAqB,GACrBc,EAAQ,GAGHrY,EAAI,EAAGA,EAAIU,KAAKoW,YAAYxW,OAAQN,IAAK,KAC5CsY,EAAI5X,KAAKoW,YAAY9W,GAAG6K,SACvBwN,EAAMC,IACTf,EAAmBtS,KAAKoT,EAAMC,GAAK,IACrCD,EAAMC,GAAGrT,KAAKvE,KAAKoW,YAAY9W,WAGjCuX,EAAmBgB,KAAK,SAAUC,EAAGC,UAAYA,EAAE,GAAG5N,SAAW2N,EAAE,GAAG3N,WAE/D0M,IC1YI,SAAXmB,SACGzN,UAAY,gBAGnByN,EAASlT,UAAY,CAEnBmT,WAAY,SAAUzP,eACf0P,UAAU3T,KAAKiE,GAEbxI,MAITiX,oBAAqB,eACfkB,UAEC/B,YAAc,GAGW,WAA1BpW,KAAKb,QAAQmT,qBACVtL,mBAAmBsP,mBAEjBtW,SAIJ,IAAIV,EAAI,EAAGA,EAAIU,KAAKkY,UAAUtY,OAAQN,OAGpCsE,EAAE,QAAQwU,IAAIpY,KAAKkY,UAAU5Y,IAAIM,QAKtCuY,EAAmBnY,KAAKkY,UAAU5Y,GAAG+Y,KAAK,iBAAiBpB,sBAAsBb,gBAE5E,IAAItG,EAAI,EAAGA,EAAIqI,EAAiBvY,OAAQkQ,SACtCqH,cAAcgB,EAAiBrI,GAAG/P,KAAMoY,EAAiBrI,GAAGvG,aAAc4O,EAAiBrI,GAAG3F,SAAUgO,EAAiBrI,GAAGiG,2BAP5HmC,UAAUrQ,OAAOvI,EAAG,UAUtBU,MAIT6S,SAAU,cAEJ,mBAAsB7S,KAAKiH,QAAQ7G,MACrC,OAAOJ,KAAKiH,QAAQ7G,MAAMJ,MACvB,QAAI,IAAuBA,KAAKiH,QAAQ7G,MAC3C,OAAOJ,KAAKiH,QAAQ7G,SAGQ,UAA1BJ,KAAKb,QAAQmT,SAAsB,KACjC7I,EAAOxK,EAAM0B,QAAQX,KAAKb,YACjB,UAATsK,EACF,OAAOzJ,KAAKsI,eAAegQ,OAAO,YAAYhK,OAAS,MAG5C,aAAT7E,EAAqB,KACnBC,EAAS,eAERpB,eAAegQ,OAAO,YAAYnU,KAAK,WAC1CuF,EAAOnF,KAAKX,EAAE5D,MAAMsO,SAGf5E,SAKmB,WAA1B1J,KAAKb,QAAQmT,UAAyB,OAAStS,KAAKwI,SAAS8F,MACxD,GAGFtO,KAAKwI,SAAS8F,OAGvBiK,MAAO,uBACAL,UAAY,CAAClY,KAAKwI,UAEhBxI,OC5EG,SAAVyV,EAAoBtW,EAAS8H,EAASkP,QACnChX,QAAUA,OACVqJ,SAAW5E,EAAEzE,OAGdqZ,EAA2BxY,KAAKwI,SAAS6P,KAAK,cAC9CG,cAGE,IAAuBrC,GAAuBqC,EAAyBrR,SAAWxF,OAAO+J,UAC3F8M,EAAyBrR,OAASgP,EAClCqC,EAAyBpR,cAAcoR,EAAyBvR,UAG9D,aAAoBA,MACRuR,EAAyBvR,QAASA,GAG3CuR,MAIJxY,KAAKwI,SAAS5I,OACjB,MAAM,IAAImF,MAAM,yDAEd,IAAuBoR,GAAuB,SAAWA,EAAoB5L,UAC/E,MAAM,IAAIxF,MAAM,uDAEboC,OAASgP,GAAuBxU,OAAO+J,QACrC1L,KAAKyK,KAAKxD,GAGnBwO,EAAQ3Q,UAAY,CAClB2F,KAAM,SAAUxD,eACTsD,UAAY,eACZkO,YAAc,aACdrT,OAASnG,EAAM4B,kBAGfuG,cAAcH,GAGW,SAA1BjH,KAAKb,QAAQmT,UAAwBrT,EAAMoB,UAAUL,KAAKb,QAASa,KAAKiH,QAAQ7H,UAAW,cAAgBY,KAAKwI,SAASkQ,GAAG1Y,KAAKiH,QAAQ3B,QACpItF,KAAK2Y,KAAK,eAGZ3Y,KAAK4Y,aAAe5Y,KAAK6Y,iBAAmB7Y,KAAK2Y,KAAK,iBAG/DC,WAAY,eACNnP,EAAOxK,EAAM0B,QAAQX,KAAKb,eACZ,UAATsK,GAA6B,aAATA,GACA,WAA1BzJ,KAAKb,QAAQmT,UAAyB,OAAStS,KAAKb,QAAQyB,aAAa,aAK9EiY,eAAgB,eACV9Y,EAEA+Y,iBAGC7R,QAAQxB,SAAWzF,KAAKiH,QAAQxB,WAClC1F,EAAOC,KAAKb,QAAQyB,aAAa,UAClCZ,KAAKb,QAAQyB,aAAa,MAGE,WAA1BZ,KAAKb,QAAQmT,UAAyB,OAAStS,KAAKb,QAAQyB,aAAa,wBACtEqG,QAAQxB,SAAWzF,KAAKiH,QAAQxB,UAAYzF,KAAKoF,OAC/CpF,KAAK2Y,KAAK,wBAGZ,IAAK3Y,KAAKiH,QAAQxB,gBACvBxG,EAAMyC,KAAK,wHAAyH1B,KAAKwI,UAClIxI,UAIJiH,QAAQxB,SAAWzF,KAAKiH,QAAQxB,SAASpE,QAAQ,yBAA0B,IAG5EtB,GACF6D,EAAE,eAAiB7D,EAAO,MAAMoE,KAAK,SAAC7E,EAAGyZ,OACnCtP,EAAOxK,EAAM0B,QAAQoY,GACX,UAATtP,GAA6B,aAATA,GACvBsP,EAAMvY,aAAamG,EAAKM,QAAQ7H,UAAY,WAAYuH,EAAKM,QAAQxB,oBAKvEuT,EAAqBhZ,KAAKsI,eACrBhJ,EAAI,EAAGA,EAAI0Z,EAAmBpZ,OAAQN,YAEzC,KADJwZ,EAA0BlV,EAAEoV,EAAmBC,IAAI3Z,IAAI+Y,KAAK,YACR,CAE7CrY,KAAKwI,SAAS6P,KAAK,kBACtBS,EAAwBb,WAAWjY,KAAKwI,4BASzCmQ,KAAK,gBAAgB,GAEnBG,GAA2B9Y,KAAK2Y,KAAK,yBAI9CA,KAAM,SAAUlP,EAAMyP,OAChBC,SAEI1P,OACD,cACH0P,EAAkBvV,EAAE+E,OAClB,IAAI8F,EAAKzO,KAAKb,QAASa,KAAKkH,WAAYlH,KAAKiH,SAC7C,IAAI9B,EACJxD,OAAOyX,eACPjE,wBAEC,eACHgE,EAAkBvV,EAAE+E,OAClB,IAAIuG,EAAMlP,KAAKb,QAASa,KAAKkH,WAAYlH,KAAKiH,QAASjH,KAAKmH,QAC5D,IAAIhC,EACJxD,OAAOyX,yBAGN,uBACHD,EAAkBvV,EAAE+E,OAClB,IAAIuG,EAAMlP,KAAKb,QAASa,KAAKkH,WAAYlH,KAAKiH,QAASjH,KAAKmH,QAC5D,IAAI6Q,EACJ,IAAI7S,EACJxD,OAAOyX,eACPb,4BAGI,IAAIxT,MAAM0E,EAAO,0CAGvBzJ,KAAKiH,QAAQxB,UACfxG,EAAMsB,QAAQP,KAAKb,QAASa,KAAKiH,QAAQ7H,UAAW,WAAYY,KAAKiH,QAAQxB,eAE3E,IAAuByT,OACpB1Q,SAAS6P,KAAK,gBAAiBc,SAMjC3Q,SAAS6P,KAAK,UAAWc,GAG9BA,EAAgBzK,qBAChByK,EAAgBnF,SAAS,SARhBmF,IChJb,IAAIE,EAAUzV,EAAE4D,GAAG8R,OAAO3V,MAAM,KAChC,GAAIpB,SAAS8W,EAAQ,KAAO,GAAK9W,SAAS8W,EAAQ,IAAM,OAChD,8EAEHA,EAAQE,SACXta,EAAMyC,KAAK,6FAGb,IAAIgK,EAAUF,EAAc,IAAIrG,EAAQ,CACpChG,QAASqa,SACThR,SAAU5E,EAAE4V,UACZxS,iBAAkB,KAClBI,cAAe,KACfqO,QAASA,EACTgE,QAAS,UAKbjO,EAAc0D,EAAMpK,UAAW0J,EAAGU,MAAO/J,EAAKL,WAC9C0G,EAAciD,EAAK3J,UAAW0J,EAAGC,KAAMtJ,EAAKL,WAE5C0G,EAAciK,EAAQ3Q,UAAWK,EAAKL,WAItClB,EAAE4D,GAAGiM,QAAU7P,EAAE4D,GAAGkS,KAAO,SAAUzS,MACjB,EAAdjH,KAAKJ,OAAY,KACf+Z,EAAY,eAEXxV,KAAK,WACRwV,EAAUpV,KAAKX,EAAE5D,MAAMyT,QAAQxM,MAG1B0S,KAIU,GAAf3Z,KAAKJ,cAIF,IAAI6V,EAAQzV,KAAK,GAAIiH,SAK1B,IAAuBtF,OAAOyX,gBAChCzX,OAAOyX,cAAgB,IAIzB1N,EAAQzE,QAAUuE,EAAcvM,EAAM0F,aAAaU,GAAW1D,OAAOiY,eACrEjY,OAAOiY,cAAgBlO,EAAQzE,QAG/BtF,OAAO+J,QAAU/J,OAAO+X,KAAOhO,EAC/BA,EAAQzM,MAAQA,EAChB0C,OAAOkY,aAAe,GACtBjW,EAAEO,KAAKlF,EAAO,SAACgL,EAAK7J,GACd,mBAAsBA,IACxBuB,OAAOkY,aAAa5P,GAAO,kBACzBhL,EAAM6C,SAAS,sFACR7C,EAAMgL,SAANhL,iBAMb,IAAI6a,EAAWnY,OAAO+J,QAAQuK,mBAAqB,IAAI7L,EAAkBzI,OAAOiY,cAAcvP,WAAY1I,OAAOiY,cAAcG,MAC/HpY,OAAOqY,iBAAmB,GAC1BpW,EAAEO,KAAK,sIAAsIR,MAAM,KAAM,SAAUrE,EAAG2a,GACpKtY,OAAO+J,QAAQuO,GAAU,kBAAaH,EAASG,SAATH,cACtCnY,OAAOqY,iBAAiBC,GAAU,wBAChChb,EAAM6C,yCAAkCmY,4EAAwEA,gBACzGtY,OAAO+J,SAAQuO,WAAWpY,cAMrCF,OAAO+J,QAAQ8C,GAAKA,EACpB7M,OAAOuY,UAAY,CACjBpJ,YAAa,SAAU7H,EAAUlJ,EAAMoa,OACjC1J,GAAc,IAAS0J,SAC3Blb,EAAM6C,uJACCmH,EAAS6H,YAAY/Q,EAAM,CAAC0Q,YAAAA,KAErCJ,kBAAmB,SAAUpH,UAC3BhK,EAAM6C,2FACCmH,EAASoH,sBAGpBzM,EAAEO,KAAK,uBAAuBR,MAAM,KAAM,SAAUrE,EAAG2a,GACrDtY,OAAOuY,UAAUD,GAAU,SAAUhR,EAAUlJ,EAAMiM,EAAS+D,EAAQoK,OAChE1J,GAAc,IAAS0J,SAC3Blb,EAAM6C,qDAA8CmY,oGAC7ChR,EAASgR,GAAQla,EAAM,CAACiM,QAAAA,EAAS+D,OAAAA,EAAQU,YAAAA,QAMhD,IAAU9O,OAAOiY,cAAcQ,UACjCxW,EAAE,WAEIA,EAAE,2BAA2BhE,QAC/BgE,EAAE,2BAA2B6P,YChHlB,SAAb4G,IACFpb,EAAM6C,SAAS,gHAFjB,IAAIwY,EAAI1W,EAAE,IAMV,SAAS2W,EAAM/S,EAAIgT,UAEZhT,EAAGiT,yBACNjT,EAAGiT,uBAAyB,eACtBC,EAAO5R,MAAMhE,UAAU5E,MAAMgI,KAAKrG,UAAW,GACjD6Y,EAAKC,QAAQ3a,MACbwH,EAAGoT,MAAMJ,GAAWF,EAAGI,KAGpBlT,EAAGiT,uBAGZ,IAAII,EAAc,WAElB,SAASjF,EAAU7V,UACwB,IAArCA,EAAK+a,YAAYD,EAAa,GACzB9a,EAAKgb,OAAOF,EAAYjb,QAC1BG,SAIT6D,EAAEoX,OAAS,SAAUjb,EAAMkb,OACrBT,KACJH,IACI,aAAoBxY,UAAU,KAAM,mBAAsBA,UAAU,KACtE2Y,EAAU3Y,UAAU,GACpBoZ,EAAWpZ,UAAU,IAGnB,mBAAsBoZ,EACxB,MAAM,IAAIlW,MAAM,oBAElBpD,OAAO+J,QAAQnE,GAAGqO,EAAU7V,GAAOwa,EAAMU,EAAUT,KAGrD5W,EAAE8D,SAAW,SAAUuB,EAAUlJ,EAAMyH,MACrC6S,MACMpR,aAAoBiG,GAAYjG,aAAoBwF,GACxD,MAAM,IAAI1J,MAAM,iCAEd,iBAAoBhF,GAAQ,mBAAsByH,EACpD,MAAM,IAAIzC,MAAM,oBAElBkE,EAAS1B,GAAGqO,EAAU7V,GAAOwa,EAAM/S,KAGrC5D,EAAEkE,YAAc,SAAU/H,EAAMyH,MAC9B6S,IACI,iBAAoBta,GAAQ,mBAAsByH,EACpD,MAAM,IAAIzC,MAAM,mBAClBpD,OAAO+J,QAAQ/D,IAAIiO,EAAU7V,GAAOyH,EAAGiT,yBAGzC7W,EAAEmE,cAAgB,SAAUkB,EAAUlJ,MACpCsa,MACMpR,aAAoBiG,GAAYjG,aAAoBwF,GACxD,MAAM,IAAI1J,MAAM,8BAClBkE,EAAStB,IAAIiO,EAAU7V,KAGzB6D,EAAEsX,eAAiB,SAAUnb,GAC3Bsa,IACA1Y,OAAO+J,QAAQ/D,IAAIiO,EAAU7V,IAC7B6D,EAAE,8BAA8BO,KAAK,eAC/B8E,EAAWrF,EAAE5D,MAAMqY,KAAK,WACxBpP,GACFA,EAAStB,IAAIiO,EAAU7V,OAM7B6D,EAAEuX,KAAO,SAAUpb,EAAMkJ,GACvBoR,QACIe,EAAiBnS,aAAoBiG,GAAWjG,aAAoBwF,EACpEiM,EAAO5R,MAAMhE,UAAU5E,MAAMgI,KAAKrG,UAAWuZ,EAAgB,EAAI,GACrEV,EAAKC,QAAQ/E,EAAU7V,IAClBqb,IACHnS,EAAWtH,OAAO+J,SAEpBzC,EAASnD,cAATmD,IAAoByR,KCrFtB9W,EAAE+E,QAAO,EAAM+C,EAAS,CACtB2P,gBAAiB,SACJ,CACT7T,GAAI,SAAU8T,UAKS,KAAdA,EAAIC,QAAiBD,EAAIC,OAAS,KAE3CzQ,KAAK,GAEP0Q,QAAS,CACPhU,GAAI,SAAU8T,UAELA,EAAIC,OAAS,KAAqB,KAAdD,EAAIC,QAEjCzQ,KAAK,IAIT2Q,kBAAmB,SAAU1b,EAAMyH,EAAIsD,EAAK7D,UAC1CyE,EAAQ2P,gBAAgBtb,GAAQ,CAC9ByH,GAAIA,EACJsD,IAAKA,IAAO,EACZ7D,QAASA,GAAW,IAGfjH,QAKX0L,EAAQD,aAAa,SAAU,CAC7BnI,gBAAiB,IACX,mBACS,iBACF,kBACA,UAGb+F,eAAgB,SAAUjJ,EAAO0K,EAAK7D,EAASgC,OAEzCyS,EACAC,EAFAtD,EAAO,GAGP5L,EAAYxF,EAAQwF,aAAc,IAASxF,EAAQuU,QAAU,UAAY,mBAEzE,IAAuB9P,EAAQ2P,gBAAgB5O,GACjD,MAAM,IAAI1H,MAAM,0CAA4C0H,EAAY,MAK5C,GAH9B3B,EAAMY,EAAQ2P,gBAAgB5O,GAAW3B,KAAOA,GAGxCxG,QAAQ,WACdwG,EAAMA,EAAIzJ,QAAQ,UAAWua,mBAAmBxb,IAEhDiY,EAAKpP,EAAS9J,QAAQyB,aAAa,SAAWqI,EAAS9J,QAAQyB,aAAa,OAASR,MAInFyb,EAAgBjY,EAAE+E,QAAO,EAAM1B,EAAQA,SAAW,GAAKyE,EAAQ2P,gBAAgB5O,GAAWxF,SAG9FyU,EAAc9X,EAAE+E,QAAO,EAAM,GAAI,CAC/BmC,IAAKA,EACLuN,KAAMA,EACN5O,KAAM,OACLoS,GAGH5S,EAASnD,QAAQ,oBAAqBmD,EAAUyS,GAEhDC,EAAM/X,EAAEkY,MAAMJ,QAGV,IAAuBhQ,EAAQmI,eACjCnI,EAAQmI,aAAe,IAKT,SAAZkI,QACE7X,EAASwH,EAAQ2P,gBAAgB5O,GAAWjF,GAAGU,KAAKe,EAAUqS,EAAKxQ,EAAK7D,UAE1E/C,EADGA,GACMN,EAAE8C,WAAWG,SACjBjD,EAAEc,KAAKR,OANZoX,EAAM5P,EAAQmI,aAAa8H,GAAOjQ,EAAQmI,aAAa8H,IAAQ/X,EAAEoY,KAAKN,UASnEJ,EAAIW,KAAKF,EAAWA,IAG7B5R,UAAW,IAGbuB,EAAQnE,GAAG,cAAe,WACxBmE,EAAQmI,aAAe,KAGzB1O,EAAKL,UAAU2W,kBAAoB,kBACjCxc,EAAM6C,SAAS,4HACR4J,EAAQ+P,wBAAR/P,EAA6B7J,YCtGtC6J,EAAQO,YAAY,KAAM,CACxBY,eAAgB,kCAChBpD,KAAM,CACJkB,MAAc,sCACdG,IAAc,oCACd9H,OAAc,uCACdD,QAAc,wCACd6H,OAAc,+BACdC,SAAc,sCAEhBmC,SAAgB,kCAChBC,SAAgB,0BAChBU,QAAgB,kCAChBI,IAAgB,oDAChB7C,IAAgB,kDAChBH,MAAgB,0CAChB6C,UAAgB,iEAChBE,UAAgB,iEAChBlO,OAAgB,gFAChBoO,SAAgB,uCAChBC,SAAgB,uCAChBC,MAAgB,6CAChBC,QAAgB,iCAChBI,QAAgB,gDAGlB7C,EAAQC,UAAU,OCoCH,0BAvDTuQ,EAAUva,QAAUwa,SAIVnc,KAAM,CAGlBoc,cAAe,SAAAvY,UACNA,EAAIwY,gBAAiD,IAAhCxY,EAAIwY,cAAcC,WAGhDC,eAAgB,SAAA1Y,GACV8C,EAAKyV,cAAcvY,IACrBD,EAAEC,EAAImE,QAAQlC,QAAQ,UAI1B0W,WAAY,SAAA3Y,GACN8C,EAAKyV,cAAcvY,KACrB8C,EAAK8V,UAAU5Y,GACfD,EAAE4V,UACCjS,GAAG,oBAAqB1D,EAAIwU,KAAKqE,SAAU/V,EAAK4V,gBACnD5V,EAAK4V,eAAe1Y,KAIxB4Y,UAAW,SAAA5Y,GACL8C,EAAKyV,cAAcvY,IACrBD,EAAE4V,UACC7R,IAAI,mBAAoB9D,EAAIwU,KAAKqE,SAAU/V,EAAK8V,WAChD9U,IAAI,oBAAqB9D,EAAIwU,KAAKqE,SAAU/V,EAAK6V,aAKxDG,QAAS,eACHT,EAAQU,mBAGZV,EAAQU,kBAAoB,sBACP,CAAC,SAAU,yBAA0B,sBAAuB,qCAAuB,KAA/FF,OACP9Y,EAAE4V,UACCjS,GAAG,mBAAoBmV,EAAU,CAACA,SAAAA,GAAW/V,EAAK8V,WAClDlV,GAAG,oBAAqBmV,EAAU,CAACA,SAAAA,GAAW/V,EAAK6V,eAI1DK,UAAW,kBACFX,EAAQU,kBACfhZ,EAAE4V,UAAU7R,IAAI,oBCrDXgV"} assets/js/parsleyjs/parsley.min.js000064400000123427147600374260013317 0ustar00;;;!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],e):(t=t||self).parsley=e(t.jQuery)}(this,function(h){"use strict";function n(t){return(n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function l(){return(l=Object.assign||function(t){for(var e=1;e',errorTemplate:"
            • "};r.prototype={asyncSupport:!0,_pipeAccordingToValidationResult:function(){function t(){var t=h.Deferred();return!0!==e.validationResult&&t.reject(),t.resolve().promise()}var e=this;return[t,t]},actualizeOptions:function(){return d.attr(this.element,this.options.namespace,this.domOptions),this.parent&&this.parent.actualizeOptions&&this.parent.actualizeOptions(),this},_resetOptions:function(t){for(var e in this.domOptions=d.objectCreate(this.parent.options),this.options=d.objectCreate(this.domOptions),t)t.hasOwnProperty(e)&&(this.options[e]=t[e]);this.actualizeOptions()},_listeners:null,on:function(t,e){return this._listeners=this._listeners||{},(this._listeners[t]=this._listeners[t]||[]).push(e),this},subscribe:function(t,e){h.listenTo(this,t.toLowerCase(),e)},off:function(t,e){var i=this._listeners&&this._listeners[t];if(i)if(e)for(var r=i.length;r--;)i[r]===e&&i.splice(r,1);else delete this._listeners[t];return this},unsubscribe:function(t){h.unsubscribeTo(this,t.toLowerCase())},trigger:function(t,e,i){e=e||this;var r,n=this._listeners&&this._listeners[t];if(n)for(var s=n.length;s--;)if(!1===(r=n[s].call(e,e,i)))return r;return!this.parent||this.parent.trigger(t,e,i)},asyncIsValid:function(t,e){return d.warnOnce("asyncIsValid is deprecated; please use whenValid instead"),this.whenValid({group:t,force:e})},_findRelated:function(){return this.options.multiple?h(this.parent.element.querySelectorAll("[".concat(this.options.namespace,'multiple="').concat(this.options.multiple,'"]'))):this.$element}};function c(t){h.extend(!0,this,t)}c.prototype={validate:function(t,e){if(this.fn)return 3d)return!1;var h=function(t){return Math.round(t*Math.pow(10,d))};if((h(u)-h(o))%h(s)!=0)return!1}return!0},requirementType:{"":"string",step:"string",base:"number"},priority:256},pattern:{validateString:function(t,e){return!t||e.test(t)},requirementType:"regexp",priority:64},minlength:{validateString:function(t,e){return!t||t.length>=e},requirementType:"integer",priority:30},maxlength:{validateString:function(t,e){return t.length<=e},requirementType:"integer",priority:30},length:{validateString:function(t,e,i){return!t||t.length>=e&&t.length<=i},requirementType:["integer","integer"],priority:30},mincheck:{validateMultiple:function(t,e){return t.length>=e},requirementType:"integer",priority:30},maxcheck:{validateMultiple:function(t,e){return t.length<=e},requirementType:"integer",priority:30},check:{validateMultiple:function(t,e,i){return t.length>=e&&t.length<=i},requirementType:["integer","integer"],priority:30},min:g(function(t,e){return e<=t}),max:g(function(t,e){return t<=e}),range:g(function(t,e,i){return e<=t&&t<=i}),equalto:{validateString:function(t,e){if(!t)return!0;var i=h(e);return i.length?t===i.val():t===e},priority:256},euvatin:{validateString:function(t){if(!t)return!0;return/^[A-Z][A-Z][A-Za-z0-9 -]{2,}$/.test(t)},priority:30}}};var v={};v.Form={_actualizeTriggers:function(){var e=this;this.$element.on("submit.Parsley",function(t){e.onSubmitValidate(t)}),this.$element.on("click.Parsley",d._SubmitSelector,function(t){e.onSubmitButton(t)}),!1!==this.options.uiEnabled&&this.element.setAttribute("novalidate","")},focus:function(){if(!(this._focusedField=null)===this.validationResult||"none"===this.options.focus)return null;for(var t=0;t').appendTo(this.$element)),e.attr({name:t.getAttribute("name"),value:t.getAttribute("value")})}this.$element.trigger(l(h.Event("submit"),{parsley:!0}))}},validate:function(t){if(1<=arguments.length&&!h.isPlainObject(t)){d.warnOnce("Calling validate on a parsley form without passing arguments as an object is deprecated.");var e=Array.prototype.slice.call(arguments);t={group:e[0],force:e[1],event:e[2]}}return _[this.whenValidate(t).state()]},whenValidate:function(t){var e,i=this,r=0["html","body"].indexOf(a(e));){if("none"!==(r=c(e)).transform||"none"!==r.perspective||r.willChange&&"auto"!==r.willChange){r=e;break e}e=e.parentNode}r=null}return r||t}function v(e){var t=new Map,n=new Set,r=[];return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||function e(o){n.add(o.name),[].concat(o.requires||[],o.requiresIfExists||[]).forEach((function(r){n.has(r)||(r=t.get(r))&&e(r)})),r.push(o)}(e)})),r}function b(e){var t;return function(){return t||(t=new Promise((function(n){Promise.resolve().then((function(){t=void 0,n(e())}))}))),t}}function y(e){return e.split("-")[0]}function O(e,t){var r,o=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if((r=o)&&(r=o instanceof(r=n(o).ShadowRoot)||o instanceof ShadowRoot),r)do{if(t&&e.isSameNode(t))return!0;t=t.parentNode||t.host}while(t);return!1}function w(e){return Object.assign(Object.assign({},e),{},{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function x(e,o){if("viewport"===o){o=n(e);var a=s(e);o=o.visualViewport;var p=a.clientWidth;a=a.clientHeight;var l=0,u=0;o&&(p=o.width,a=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(l=o.offsetLeft,u=o.offsetTop)),e=w(e={width:p,height:a,x:l+f(e),y:u})}else i(o)?((e=t(o)).top+=o.clientTop,e.left+=o.clientLeft,e.bottom=e.top+o.clientHeight,e.right=e.left+o.clientWidth,e.width=o.clientWidth,e.height=o.clientHeight,e.x=e.left,e.y=e.top):(u=s(e),e=s(u),l=r(u),o=u.ownerDocument.body,p=Math.max(e.scrollWidth,e.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),a=Math.max(e.scrollHeight,e.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),u=-l.scrollLeft+f(u),l=-l.scrollTop,"rtl"===c(o||e).direction&&(u+=Math.max(e.clientWidth,o?o.clientWidth:0)-p),e=w({width:p,height:a,x:u,y:l}));return e}function j(e,t,n){return t="clippingParents"===t?function(e){var t=m(d(e)),n=0<=["absolute","fixed"].indexOf(c(e).position)&&i(e)?g(e):e;return o(n)?t.filter((function(e){return o(e)&&O(e,n)&&"body"!==a(e)})):[]}(e):[].concat(t),(n=(n=[].concat(t,[n])).reduce((function(t,n){return n=x(e,n),t.top=Math.max(n.top,t.top),t.right=Math.min(n.right,t.right),t.bottom=Math.min(n.bottom,t.bottom),t.left=Math.max(n.left,t.left),t}),x(e,n[0]))).width=n.right-n.left,n.height=n.bottom-n.top,n.x=n.left,n.y=n.top,n}function M(e){return 0<=["top","bottom"].indexOf(e)?"x":"y"}function E(e){var t=e.reference,n=e.element,r=(e=e.placement)?y(e):null;e=e?e.split("-")[1]:null;var o=t.x+t.width/2-n.width/2,i=t.y+t.height/2-n.height/2;switch(r){case"top":o={x:o,y:t.y-n.height};break;case"bottom":o={x:o,y:t.y+t.height};break;case"right":o={x:t.x+t.width,y:i};break;case"left":o={x:t.x-n.width,y:i};break;default:o={x:t.x,y:t.y}}if(null!=(r=r?M(r):null))switch(i="y"===r?"height":"width",e){case"start":o[r]-=t[i]/2-n[i]/2;break;case"end":o[r]+=t[i]/2-n[i]/2}return o}function D(e){return Object.assign(Object.assign({},{top:0,right:0,bottom:0,left:0}),e)}function P(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function L(e,n){void 0===n&&(n={});var r=n;n=void 0===(n=r.placement)?e.placement:n;var i=r.boundary,a=void 0===i?"clippingParents":i,f=void 0===(i=r.rootBoundary)?"viewport":i;i=void 0===(i=r.elementContext)?"popper":i;var c=r.altBoundary,p=void 0!==c&&c;r=D("number"!=typeof(r=void 0===(r=r.padding)?0:r)?r:P(r,T));var l=e.elements.reference;c=e.rects.popper,a=j(o(p=e.elements[p?"popper"===i?"reference":"popper":i])?p:p.contextElement||s(e.elements.popper),a,f),p=E({reference:f=t(l),element:c,strategy:"absolute",placement:n}),c=w(Object.assign(Object.assign({},c),p)),f="popper"===i?c:f;var u={top:a.top-f.top+r.top,bottom:f.bottom-a.bottom+r.bottom,left:a.left-f.left+r.left,right:f.right-a.right+r.right};if(e=e.modifiersData.offset,"popper"===i&&e){var d=e[n];Object.keys(u).forEach((function(e){var t=0<=["right","bottom"].indexOf(e)?1:-1,n=0<=["top","bottom"].indexOf(e)?"y":"x";u[e]+=d[n]*t}))}return u}function k(){for(var e=arguments.length,t=Array(e),n=0;n(v.devicePixelRatio||1)?"translate("+e+"px, "+l+"px)":"translate3d("+e+"px, "+l+"px, 0)",d)):Object.assign(Object.assign({},r),{},((t={})[h]=a?l+"px":"",t[m]=u?e+"px":"",t.transform="",t))}function A(e){return e.replace(/left|right|bottom|top/g,(function(e){return G[e]}))}function H(e){return e.replace(/start|end/g,(function(e){return J[e]}))}function R(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function S(e){return["top","right","bottom","left"].some((function(t){return 0<=e[t]}))}var T=["top","bottom","right","left"],q=T.reduce((function(e,t){return e.concat([t+"-start",t+"-end"])}),[]),C=[].concat(T,["auto"]).reduce((function(e,t){return e.concat([t,t+"-start",t+"-end"])}),[]),N="beforeRead read afterRead beforeMain main afterMain beforeWrite write afterWrite".split(" "),V={placement:"bottom",modifiers:[],strategy:"absolute"},I={passive:!0},_={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var t=e.state,r=e.instance,o=(e=e.options).scroll,i=void 0===o||o,a=void 0===(e=e.resize)||e,s=n(t.elements.popper),f=[].concat(t.scrollParents.reference,t.scrollParents.popper);return i&&f.forEach((function(e){e.addEventListener("scroll",r.update,I)})),a&&s.addEventListener("resize",r.update,I),function(){i&&f.forEach((function(e){e.removeEventListener("scroll",r.update,I)})),a&&s.removeEventListener("resize",r.update,I)}},data:{}},U={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state;t.modifiersData[e.name]=E({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},z={top:"auto",right:"auto",bottom:"auto",left:"auto"},F={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options;e=void 0===(e=n.gpuAcceleration)||e;var r=n.adaptive;r=void 0===r||r,n=void 0===(n=n.roundOffsets)||n,e={placement:y(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:e},null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign(Object.assign({},t.styles.popper),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:r,roundOffsets:n})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign(Object.assign({},t.styles.arrow),W(Object.assign(Object.assign({},e),{},{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:n})))),t.attributes.popper=Object.assign(Object.assign({},t.attributes.popper),{},{"data-popper-placement":t.placement})},data:{}},X={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},r=t.attributes[e]||{},o=t.elements[e];i(o)&&a(o)&&(Object.assign(o.style,n),Object.keys(r).forEach((function(e){var t=r[e];!1===t?o.removeAttribute(e):o.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var r=t.elements[e],o=t.attributes[e]||{};e=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{}),i(r)&&a(r)&&(Object.assign(r.style,e),Object.keys(o).forEach((function(e){r.removeAttribute(e)})))}))}},requires:["computeStyles"]},Y={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.name,r=void 0===(e=e.options.offset)?[0,0]:e,o=(e=C.reduce((function(e,n){var o=t.rects,i=y(n),a=0<=["left","top"].indexOf(i)?-1:1,s="function"==typeof r?r(Object.assign(Object.assign({},o),{},{placement:n})):r;return o=(o=s[0])||0,s=((s=s[1])||0)*a,i=0<=["left","right"].indexOf(i)?{x:s,y:o}:{x:o,y:s},e[n]=i,e}),{}))[t.placement],i=o.x;o=o.y,null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=o),t.modifiersData[n]=e}},G={left:"right",right:"left",bottom:"top",top:"bottom"},J={start:"end",end:"start"},K={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options;if(e=e.name,!t.modifiersData[e]._skip){var r=n.mainAxis;r=void 0===r||r;var o=n.altAxis;o=void 0===o||o;var i=n.fallbackPlacements,a=n.padding,s=n.boundary,f=n.rootBoundary,c=n.altBoundary,p=n.flipVariations,l=void 0===p||p,u=n.allowedAutoPlacements;p=y(n=t.options.placement),i=i||(p!==n&&l?function(e){if("auto"===y(e))return[];var t=A(e);return[H(e),t,H(t)]}(n):[A(n)]);var d=[n].concat(i).reduce((function(e,n){return e.concat("auto"===y(n)?function(e,t){void 0===t&&(t={});var n=t.boundary,r=t.rootBoundary,o=t.padding,i=t.flipVariations,a=t.allowedAutoPlacements,s=void 0===a?C:a,f=t.placement.split("-")[1];0===(i=(t=f?i?q:q.filter((function(e){return e.split("-")[1]===f})):T).filter((function(e){return 0<=s.indexOf(e)}))).length&&(i=t);var c=i.reduce((function(t,i){return t[i]=L(e,{placement:i,boundary:n,rootBoundary:r,padding:o})[y(i)],t}),{});return Object.keys(c).sort((function(e,t){return c[e]-c[t]}))}(t,{placement:n,boundary:s,rootBoundary:f,padding:a,flipVariations:l,allowedAutoPlacements:u}):n)}),[]);n=t.rects.reference,i=t.rects.popper;var m=new Map;p=!0;for(var h=d[0],g=0;gi[x]&&(O=A(O)),x=A(O),w=[],r&&w.push(0>=j[b]),o&&w.push(0>=j[O],0>=j[x]),w.every((function(e){return e}))){h=v,p=!1;break}m.set(v,w)}if(p)for(r=function(e){var t=d.find((function(t){if(t=m.get(t))return t.slice(0,e).every((function(e){return e}))}));if(t)return h=t,"break"},o=l?3:1;0 has a CSS width greater than the viewport, then this will be // incorrect for RTL. // Popper 1 is broken in this case and never had a bug report so let's assume // it's not an issue. I don't think anyone ever specifies width on // anyway. // Browsers where the left scrollbar doesn't cause an issue report `0` for // this (e.g. Edge 2019, IE11, Safari) return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft; } function getComputedStyle(element) { return getWindow(element).getComputedStyle(element); } function isScrollParent(element) { // Firefox wants us to check `-x` and `-y` variations as well var _getComputedStyle = getComputedStyle(element), overflow = _getComputedStyle.overflow, overflowX = _getComputedStyle.overflowX, overflowY = _getComputedStyle.overflowY; return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX); } // Composite means it takes into account transforms as well as layout. function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) { if (isFixed === void 0) { isFixed = false; } var documentElement = getDocumentElement(offsetParent); var rect = getBoundingClientRect(elementOrVirtualElement); var isOffsetParentAnElement = isHTMLElement(offsetParent); var scroll = { scrollLeft: 0, scrollTop: 0 }; var offsets = { x: 0, y: 0 }; if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) { if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078 isScrollParent(documentElement)) { scroll = getNodeScroll(offsetParent); } if (isHTMLElement(offsetParent)) { offsets = getBoundingClientRect(offsetParent); offsets.x += offsetParent.clientLeft; offsets.y += offsetParent.clientTop; } else if (documentElement) { offsets.x = getWindowScrollBarX(documentElement); } } return { x: rect.left + scroll.scrollLeft - offsets.x, y: rect.top + scroll.scrollTop - offsets.y, width: rect.width, height: rect.height }; } // Returns the layout rect of an element relative to its offsetParent. Layout // means it doesn't take into account transforms. function getLayoutRect(element) { return { x: element.offsetLeft, y: element.offsetTop, width: element.offsetWidth, height: element.offsetHeight }; } function getParentNode(element) { if (getNodeName(element) === 'html') { return element; } return ( // this is a quicker (but less type safe) way to save quite some bytes from the bundle // $FlowFixMe[incompatible-return] // $FlowFixMe[prop-missing] element.assignedSlot || // step into the shadow DOM of the parent of a slotted node element.parentNode || // DOM Element detected // $FlowFixMe[incompatible-return]: need a better way to handle this... element.host || // ShadowRoot detected // $FlowFixMe[incompatible-call]: HTMLElement is a Node getDocumentElement(element) // fallback ); } function getScrollParent(node) { if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) { // $FlowFixMe[incompatible-return]: assume body is always available return node.ownerDocument.body; } if (isHTMLElement(node) && isScrollParent(node)) { return node; } return getScrollParent(getParentNode(node)); } /* given a DOM element, return the list of all scroll parents, up the list of ancesors until we get to the top window object. This list is what we attach scroll listeners to, because if any of these parent elements scroll, we'll need to re-calculate the reference element's position. */ function listScrollParents(element, list) { if (list === void 0) { list = []; } var scrollParent = getScrollParent(element); var isBody = getNodeName(scrollParent) === 'body'; var win = getWindow(scrollParent); var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent; var updatedList = list.concat(target); return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here updatedList.concat(listScrollParents(getParentNode(target))); } function isTableElement(element) { return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0; } function getTrueOffsetParent(element) { if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837 getComputedStyle(element).position === 'fixed') { return null; } var offsetParent = element.offsetParent; if (offsetParent) { var html = getDocumentElement(offsetParent); if (getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && getComputedStyle(html).position !== 'static') { return html; } } return offsetParent; } // `.offsetParent` reports `null` for fixed elements, while absolute elements // return the containing block function getContainingBlock(element) { var currentNode = getParentNode(element); while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) { var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that // create a containing block. if (css.transform !== 'none' || css.perspective !== 'none' || css.willChange && css.willChange !== 'auto') { return currentNode; } else { currentNode = currentNode.parentNode; } } return null; } // Gets the closest ancestor positioned element. Handles some edge cases, // such as table ancestors and cross browser bugs. function getOffsetParent(element) { var window = getWindow(element); var offsetParent = getTrueOffsetParent(element); while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') { offsetParent = getTrueOffsetParent(offsetParent); } if (offsetParent && getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static') { return window; } return offsetParent || getContainingBlock(element) || window; } var top = 'top'; var bottom = 'bottom'; var right = 'right'; var left = 'left'; var auto = 'auto'; var basePlacements = [top, bottom, right, left]; var start = 'start'; var end = 'end'; var clippingParents = 'clippingParents'; var viewport = 'viewport'; var popper = 'popper'; var reference = 'reference'; var variationPlacements = /*#__PURE__*/ basePlacements.reduce(function (acc, placement) { return acc.concat([placement + "-" + start, placement + "-" + end]); }, []); var placements = /*#__PURE__*/ [].concat(basePlacements, [auto]).reduce(function (acc, placement) { return acc.concat([placement, placement + "-" + start, placement + "-" + end]); }, []); // modifiers that need to read the DOM var beforeRead = 'beforeRead'; var read = 'read'; var afterRead = 'afterRead'; // pure-logic modifiers var beforeMain = 'beforeMain'; var main = 'main'; var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state) var beforeWrite = 'beforeWrite'; var write = 'write'; var afterWrite = 'afterWrite'; var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite]; function order(modifiers) { var map = new Map(); var visited = new Set(); var result = []; modifiers.forEach(function (modifier) { map.set(modifier.name, modifier); }); // On visiting object, check for its dependencies and visit them recursively function sort(modifier) { visited.add(modifier.name); var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []); requires.forEach(function (dep) { if (!visited.has(dep)) { var depModifier = map.get(dep); if (depModifier) { sort(depModifier); } } }); result.push(modifier); } modifiers.forEach(function (modifier) { if (!visited.has(modifier.name)) { // check for visited object sort(modifier); } }); return result; } function orderModifiers(modifiers) { // order based on dependencies var orderedModifiers = order(modifiers); // order based on phase return modifierPhases.reduce(function (acc, phase) { return acc.concat(orderedModifiers.filter(function (modifier) { return modifier.phase === phase; })); }, []); } function debounce(fn) { var pending; return function () { if (!pending) { pending = new Promise(function (resolve) { Promise.resolve().then(function () { pending = undefined; resolve(fn()); }); }); } return pending; }; } function format(str) { for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } return [].concat(args).reduce(function (p, c) { return p.replace(/%s/, c); }, str); } var INVALID_MODIFIER_ERROR = 'Popper: modifier "%s" provided an invalid %s property, expected %s but got %s'; var MISSING_DEPENDENCY_ERROR = 'Popper: modifier "%s" requires "%s", but "%s" modifier is not available'; var VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options']; function validateModifiers(modifiers) { modifiers.forEach(function (modifier) { Object.keys(modifier).forEach(function (key) { switch (key) { case 'name': if (typeof modifier.name !== 'string') { console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '"name"', '"string"', "\"" + String(modifier.name) + "\"")); } break; case 'enabled': if (typeof modifier.enabled !== 'boolean') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"enabled"', '"boolean"', "\"" + String(modifier.enabled) + "\"")); } case 'phase': if (modifierPhases.indexOf(modifier.phase) < 0) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"phase"', "either " + modifierPhases.join(', '), "\"" + String(modifier.phase) + "\"")); } break; case 'fn': if (typeof modifier.fn !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"fn"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'effect': if (typeof modifier.effect !== 'function') { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"effect"', '"function"', "\"" + String(modifier.fn) + "\"")); } break; case 'requires': if (!Array.isArray(modifier.requires)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requires"', '"array"', "\"" + String(modifier.requires) + "\"")); } break; case 'requiresIfExists': if (!Array.isArray(modifier.requiresIfExists)) { console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '"requiresIfExists"', '"array"', "\"" + String(modifier.requiresIfExists) + "\"")); } break; case 'options': case 'data': break; default: console.error("PopperJS: an invalid property has been provided to the \"" + modifier.name + "\" modifier, valid properties are " + VALID_PROPERTIES.map(function (s) { return "\"" + s + "\""; }).join(', ') + "; but \"" + key + "\" was provided."); } modifier.requires && modifier.requires.forEach(function (requirement) { if (modifiers.find(function (mod) { return mod.name === requirement; }) == null) { console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement)); } }); }); }); } function uniqueBy(arr, fn) { var identifiers = new Set(); return arr.filter(function (item) { var identifier = fn(item); if (!identifiers.has(identifier)) { identifiers.add(identifier); return true; } }); } function getBasePlacement(placement) { return placement.split('-')[0]; } function mergeByName(modifiers) { var merged = modifiers.reduce(function (merged, current) { var existing = merged[current.name]; merged[current.name] = existing ? Object.assign(Object.assign(Object.assign({}, existing), current), {}, { options: Object.assign(Object.assign({}, existing.options), current.options), data: Object.assign(Object.assign({}, existing.data), current.data) }) : current; return merged; }, {}); // IE11 does not support Object.values return Object.keys(merged).map(function (key) { return merged[key]; }); } function getViewportRect(element) { var win = getWindow(element); var html = getDocumentElement(element); var visualViewport = win.visualViewport; var width = html.clientWidth; var height = html.clientHeight; var x = 0; var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper // can be obscured underneath it. // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even // if it isn't open, so if this isn't available, the popper will be detected // to overflow the bottom of the screen too early. if (visualViewport) { width = visualViewport.width; height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently) // In Chrome, it returns a value very close to 0 (+/-) but contains rounding // errors due to floating point numbers, so we need to check precision. // Safari returns a number <= 0, usually < -1 when pinch-zoomed // Feature detection fails in mobile emulation mode in Chrome. // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) < // 0.001 // Fallback here: "Not Safari" userAgent if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) { x = visualViewport.offsetLeft; y = visualViewport.offsetTop; } } return { width: width, height: height, x: x + getWindowScrollBarX(element), y: y }; } // of the `` and `` rect bounds if horizontally scrollable function getDocumentRect(element) { var html = getDocumentElement(element); var winScroll = getWindowScroll(element); var body = element.ownerDocument.body; var width = Math.max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0); var height = Math.max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0); var x = -winScroll.scrollLeft + getWindowScrollBarX(element); var y = -winScroll.scrollTop; if (getComputedStyle(body || html).direction === 'rtl') { x += Math.max(html.clientWidth, body ? body.clientWidth : 0) - width; } return { width: width, height: height, x: x, y: y }; } function contains(parent, child) { var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method // then fallback to custom implementation with Shadow DOM support if (parent.contains(child)) { return true; } else if (rootNode && isShadowRoot(rootNode)) { var next = child; do { if (next && parent.isSameNode(next)) { return true; } // $FlowFixMe[prop-missing]: need a better way to handle this... next = next.parentNode || next.host; } while (next); } // Give up, the result is false return false; } function rectToClientRect(rect) { return Object.assign(Object.assign({}, rect), {}, { left: rect.x, top: rect.y, right: rect.x + rect.width, bottom: rect.y + rect.height }); } function getInnerBoundingClientRect(element) { var rect = getBoundingClientRect(element); rect.top = rect.top + element.clientTop; rect.left = rect.left + element.clientLeft; rect.bottom = rect.top + element.clientHeight; rect.right = rect.left + element.clientWidth; rect.width = element.clientWidth; rect.height = element.clientHeight; rect.x = rect.left; rect.y = rect.top; return rect; } function getClientRectFromMixedType(element, clippingParent) { return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element))); } // A "clipping parent" is an overflowable container with the characteristic of // clipping (or hiding) overflowing elements with a position different from // `initial` function getClippingParents(element) { var clippingParents = listScrollParents(getParentNode(element)); var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0; var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element; if (!isElement(clipperElement)) { return []; } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414 return clippingParents.filter(function (clippingParent) { return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body'; }); } // Gets the maximum area that the element is visible in due to any number of // clipping parents function getClippingRect(element, boundary, rootBoundary) { var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary); var clippingParents = [].concat(mainClippingParents, [rootBoundary]); var firstClippingParent = clippingParents[0]; var clippingRect = clippingParents.reduce(function (accRect, clippingParent) { var rect = getClientRectFromMixedType(element, clippingParent); accRect.top = Math.max(rect.top, accRect.top); accRect.right = Math.min(rect.right, accRect.right); accRect.bottom = Math.min(rect.bottom, accRect.bottom); accRect.left = Math.max(rect.left, accRect.left); return accRect; }, getClientRectFromMixedType(element, firstClippingParent)); clippingRect.width = clippingRect.right - clippingRect.left; clippingRect.height = clippingRect.bottom - clippingRect.top; clippingRect.x = clippingRect.left; clippingRect.y = clippingRect.top; return clippingRect; } function getVariation(placement) { return placement.split('-')[1]; } function getMainAxisFromPlacement(placement) { return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y'; } function computeOffsets(_ref) { var reference = _ref.reference, element = _ref.element, placement = _ref.placement; var basePlacement = placement ? getBasePlacement(placement) : null; var variation = placement ? getVariation(placement) : null; var commonX = reference.x + reference.width / 2 - element.width / 2; var commonY = reference.y + reference.height / 2 - element.height / 2; var offsets; switch (basePlacement) { case top: offsets = { x: commonX, y: reference.y - element.height }; break; case bottom: offsets = { x: commonX, y: reference.y + reference.height }; break; case right: offsets = { x: reference.x + reference.width, y: commonY }; break; case left: offsets = { x: reference.x - element.width, y: commonY }; break; default: offsets = { x: reference.x, y: reference.y }; } var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null; if (mainAxis != null) { var len = mainAxis === 'y' ? 'height' : 'width'; switch (variation) { case start: offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2); break; case end: offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2); break; } } return offsets; } function getFreshSideObject() { return { top: 0, right: 0, bottom: 0, left: 0 }; } function mergePaddingObject(paddingObject) { return Object.assign(Object.assign({}, getFreshSideObject()), paddingObject); } function expandToHashMap(value, keys) { return keys.reduce(function (hashMap, key) { hashMap[key] = value; return hashMap; }, {}); } function detectOverflow(state, options) { if (options === void 0) { options = {}; } var _options = options, _options$placement = _options.placement, placement = _options$placement === void 0 ? state.placement : _options$placement, _options$boundary = _options.boundary, boundary = _options$boundary === void 0 ? clippingParents : _options$boundary, _options$rootBoundary = _options.rootBoundary, rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary, _options$elementConte = _options.elementContext, elementContext = _options$elementConte === void 0 ? popper : _options$elementConte, _options$altBoundary = _options.altBoundary, altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary, _options$padding = _options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)); var altContext = elementContext === popper ? reference : popper; var referenceElement = state.elements.reference; var popperRect = state.rects.popper; var element = state.elements[altBoundary ? altContext : elementContext]; var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary); var referenceClientRect = getBoundingClientRect(referenceElement); var popperOffsets = computeOffsets({ reference: referenceClientRect, element: popperRect, strategy: 'absolute', placement: placement }); var popperClientRect = rectToClientRect(Object.assign(Object.assign({}, popperRect), popperOffsets)); var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect // 0 or negative = within the clipping rect var overflowOffsets = { top: clippingClientRect.top - elementClientRect.top + paddingObject.top, bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom, left: clippingClientRect.left - elementClientRect.left + paddingObject.left, right: elementClientRect.right - clippingClientRect.right + paddingObject.right }; var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element if (elementContext === popper && offsetData) { var offset = offsetData[placement]; Object.keys(overflowOffsets).forEach(function (key) { var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1; var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x'; overflowOffsets[key] += offset[axis] * multiply; }); } return overflowOffsets; } var INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.'; var INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.'; var DEFAULT_OPTIONS = { placement: 'bottom', modifiers: [], strategy: 'absolute' }; function areValidElements() { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return !args.some(function (element) { return !(element && typeof element.getBoundingClientRect === 'function'); }); } function popperGenerator(generatorOptions) { if (generatorOptions === void 0) { generatorOptions = {}; } var _generatorOptions = generatorOptions, _generatorOptions$def = _generatorOptions.defaultModifiers, defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def, _generatorOptions$def2 = _generatorOptions.defaultOptions, defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2; return function createPopper(reference, popper, options) { if (options === void 0) { options = defaultOptions; } var state = { placement: 'bottom', orderedModifiers: [], options: Object.assign(Object.assign({}, DEFAULT_OPTIONS), defaultOptions), modifiersData: {}, elements: { reference: reference, popper: popper }, attributes: {}, styles: {} }; var effectCleanupFns = []; var isDestroyed = false; var instance = { state: state, setOptions: function setOptions(options) { cleanupModifierEffects(); state.options = Object.assign(Object.assign(Object.assign({}, defaultOptions), state.options), options); state.scrollParents = { reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [], popper: listScrollParents(popper) }; // Orders the modifiers based on their dependencies and `phase` // properties var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers state.orderedModifiers = orderedModifiers.filter(function (m) { return m.enabled; }); // Validate the provided modifiers so that the consumer will get warned // if one of the modifiers is invalid for any reason { var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) { var name = _ref.name; return name; }); validateModifiers(modifiers); if (getBasePlacement(state.options.placement) === auto) { var flipModifier = state.orderedModifiers.find(function (_ref2) { var name = _ref2.name; return name === 'flip'; }); if (!flipModifier) { console.error(['Popper: "auto" placements require the "flip" modifier be', 'present and enabled to work.'].join(' ')); } } var _getComputedStyle = getComputedStyle(popper), marginTop = _getComputedStyle.marginTop, marginRight = _getComputedStyle.marginRight, marginBottom = _getComputedStyle.marginBottom, marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can // cause bugs with positioning, so we'll warn the consumer if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) { return parseFloat(margin); })) { console.warn(['Popper: CSS "margin" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' ')); } } runModifierEffects(); return instance.update(); }, // Sync update – it will always be executed, even if not necessary. This // is useful for low frequency updates where sync behavior simplifies the // logic. // For high frequency updates (e.g. `resize` and `scroll` events), always // prefer the async Popper#update method forceUpdate: function forceUpdate() { if (isDestroyed) { return; } var _state$elements = state.elements, reference = _state$elements.reference, popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements // anymore if (!areValidElements(reference, popper)) { { console.error(INVALID_ELEMENT_ERROR); } return; } // Store the reference and popper rects to be read by modifiers state.rects = { reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'), popper: getLayoutRect(popper) }; // Modifiers have the ability to reset the current update cycle. The // most common use case for this is the `flip` modifier changing the // placement, which then needs to re-run all the modifiers, because the // logic was previously ran for the previous placement and is therefore // stale/incorrect state.reset = false; state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier // is filled with the initial data specified by the modifier. This means // it doesn't persist and is fresh on each update. // To ensure persistent data, use `${name}#persistent` state.orderedModifiers.forEach(function (modifier) { return state.modifiersData[modifier.name] = Object.assign({}, modifier.data); }); var __debug_loops__ = 0; for (var index = 0; index < state.orderedModifiers.length; index++) { { __debug_loops__ += 1; if (__debug_loops__ > 100) { console.error(INFINITE_LOOP_ERROR); break; } } if (state.reset === true) { state.reset = false; index = -1; continue; } var _state$orderedModifie = state.orderedModifiers[index], fn = _state$orderedModifie.fn, _state$orderedModifie2 = _state$orderedModifie.options, _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2, name = _state$orderedModifie.name; if (typeof fn === 'function') { state = fn({ state: state, options: _options, name: name, instance: instance }) || state; } } }, // Async and optimistically optimized update – it will not be executed if // not necessary (debounced to run at most once-per-tick) update: debounce(function () { return new Promise(function (resolve) { instance.forceUpdate(); resolve(state); }); }), destroy: function destroy() { cleanupModifierEffects(); isDestroyed = true; } }; if (!areValidElements(reference, popper)) { { console.error(INVALID_ELEMENT_ERROR); } return instance; } instance.setOptions(options).then(function (state) { if (!isDestroyed && options.onFirstUpdate) { options.onFirstUpdate(state); } }); // Modifiers have the ability to execute arbitrary code before the first // update cycle runs. They will be executed in the same order as the update // cycle. This is useful when a modifier adds some persistent data that // other modifiers need to use, but the modifier is run after the dependent // one. function runModifierEffects() { state.orderedModifiers.forEach(function (_ref3) { var name = _ref3.name, _ref3$options = _ref3.options, options = _ref3$options === void 0 ? {} : _ref3$options, effect = _ref3.effect; if (typeof effect === 'function') { var cleanupFn = effect({ state: state, name: name, instance: instance, options: options }); var noopFn = function noopFn() {}; effectCleanupFns.push(cleanupFn || noopFn); } }); } function cleanupModifierEffects() { effectCleanupFns.forEach(function (fn) { return fn(); }); effectCleanupFns = []; } return instance; }; } var passive = { passive: true }; function effect(_ref) { var state = _ref.state, instance = _ref.instance, options = _ref.options; var _options$scroll = options.scroll, scroll = _options$scroll === void 0 ? true : _options$scroll, _options$resize = options.resize, resize = _options$resize === void 0 ? true : _options$resize; var window = getWindow(state.elements.popper); var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper); if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.addEventListener('scroll', instance.update, passive); }); } if (resize) { window.addEventListener('resize', instance.update, passive); } return function () { if (scroll) { scrollParents.forEach(function (scrollParent) { scrollParent.removeEventListener('scroll', instance.update, passive); }); } if (resize) { window.removeEventListener('resize', instance.update, passive); } }; } // eslint-disable-next-line import/no-unused-modules var eventListeners = { name: 'eventListeners', enabled: true, phase: 'write', fn: function fn() {}, effect: effect, data: {} }; function popperOffsets(_ref) { var state = _ref.state, name = _ref.name; // Offsets are the actual position the popper needs to have to be // properly positioned near its reference element // This is the most basic placement, and will be adjusted by // the modifiers in the next step state.modifiersData[name] = computeOffsets({ reference: state.rects.reference, element: state.rects.popper, strategy: 'absolute', placement: state.placement }); } // eslint-disable-next-line import/no-unused-modules var popperOffsets$1 = { name: 'popperOffsets', enabled: true, phase: 'read', fn: popperOffsets, data: {} }; var unsetSides = { top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' }; // Round the offsets to the nearest suitable subpixel based on the DPR. // Zooming can change the DPR, but it seems to report a value that will // cleanly divide the values into the appropriate subpixels. function roundOffsetsByDPR(_ref) { var x = _ref.x, y = _ref.y; var win = window; var dpr = win.devicePixelRatio || 1; return { x: Math.round(x * dpr) / dpr || 0, y: Math.round(y * dpr) / dpr || 0 }; } function mapToStyles(_ref2) { var _Object$assign2; var popper = _ref2.popper, popperRect = _ref2.popperRect, placement = _ref2.placement, offsets = _ref2.offsets, position = _ref2.position, gpuAcceleration = _ref2.gpuAcceleration, adaptive = _ref2.adaptive, roundOffsets = _ref2.roundOffsets; var _ref3 = roundOffsets ? roundOffsetsByDPR(offsets) : offsets, _ref3$x = _ref3.x, x = _ref3$x === void 0 ? 0 : _ref3$x, _ref3$y = _ref3.y, y = _ref3$y === void 0 ? 0 : _ref3$y; var hasX = offsets.hasOwnProperty('x'); var hasY = offsets.hasOwnProperty('y'); var sideX = left; var sideY = top; var win = window; if (adaptive) { var offsetParent = getOffsetParent(popper); if (offsetParent === getWindow(popper)) { offsetParent = getDocumentElement(popper); } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it /*:: offsetParent = (offsetParent: Element); */ if (placement === top) { sideY = bottom; y -= offsetParent.clientHeight - popperRect.height; y *= gpuAcceleration ? 1 : -1; } if (placement === left) { sideX = right; x -= offsetParent.clientWidth - popperRect.width; x *= gpuAcceleration ? 1 : -1; } } var commonStyles = Object.assign({ position: position }, adaptive && unsetSides); if (gpuAcceleration) { var _Object$assign; return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? "translate(" + x + "px, " + y + "px)" : "translate3d(" + x + "px, " + y + "px, 0)", _Object$assign)); } return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + "px" : '', _Object$assign2[sideX] = hasX ? x + "px" : '', _Object$assign2.transform = '', _Object$assign2)); } function computeStyles(_ref4) { var state = _ref4.state, options = _ref4.options; var _options$gpuAccelerat = options.gpuAcceleration, gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat, _options$adaptive = options.adaptive, adaptive = _options$adaptive === void 0 ? true : _options$adaptive, _options$roundOffsets = options.roundOffsets, roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets; { var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || ''; if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) { return transitionProperty.indexOf(property) >= 0; })) { console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: "transform", "top", "right", "bottom", "left".', '\n\n', 'Disable the "computeStyles" modifier\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\n\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' ')); } } var commonStyles = { placement: getBasePlacement(state.placement), popper: state.elements.popper, popperRect: state.rects.popper, gpuAcceleration: gpuAcceleration }; if (state.modifiersData.popperOffsets != null) { state.styles.popper = Object.assign(Object.assign({}, state.styles.popper), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, { offsets: state.modifiersData.popperOffsets, position: state.options.strategy, adaptive: adaptive, roundOffsets: roundOffsets }))); } if (state.modifiersData.arrow != null) { state.styles.arrow = Object.assign(Object.assign({}, state.styles.arrow), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, { offsets: state.modifiersData.arrow, position: 'absolute', adaptive: false, roundOffsets: roundOffsets }))); } state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, { 'data-popper-placement': state.placement }); } // eslint-disable-next-line import/no-unused-modules var computeStyles$1 = { name: 'computeStyles', enabled: true, phase: 'beforeWrite', fn: computeStyles, data: {} }; // and applies them to the HTMLElements such as popper and arrow function applyStyles(_ref) { var state = _ref.state; Object.keys(state.elements).forEach(function (name) { var style = state.styles[name] || {}; var attributes = state.attributes[name] || {}; var element = state.elements[name]; // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } // Flow doesn't support to extend this property, but it's the most // effective way to apply styles to an HTMLElement // $FlowFixMe[cannot-write] Object.assign(element.style, style); Object.keys(attributes).forEach(function (name) { var value = attributes[name]; if (value === false) { element.removeAttribute(name); } else { element.setAttribute(name, value === true ? '' : value); } }); }); } function effect$1(_ref2) { var state = _ref2.state; var initialStyles = { popper: { position: state.options.strategy, left: '0', top: '0', margin: '0' }, arrow: { position: 'absolute' }, reference: {} }; Object.assign(state.elements.popper.style, initialStyles.popper); if (state.elements.arrow) { Object.assign(state.elements.arrow.style, initialStyles.arrow); } return function () { Object.keys(state.elements).forEach(function (name) { var element = state.elements[name]; var attributes = state.attributes[name] || {}; var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them var style = styleProperties.reduce(function (style, property) { style[property] = ''; return style; }, {}); // arrow is optional + virtual elements if (!isHTMLElement(element) || !getNodeName(element)) { return; } Object.assign(element.style, style); Object.keys(attributes).forEach(function (attribute) { element.removeAttribute(attribute); }); }); }; } // eslint-disable-next-line import/no-unused-modules var applyStyles$1 = { name: 'applyStyles', enabled: true, phase: 'write', fn: applyStyles, effect: effect$1, requires: ['computeStyles'] }; function distanceAndSkiddingToXY(placement, rects, offset) { var basePlacement = getBasePlacement(placement); var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1; var _ref = typeof offset === 'function' ? offset(Object.assign(Object.assign({}, rects), {}, { placement: placement })) : offset, skidding = _ref[0], distance = _ref[1]; skidding = skidding || 0; distance = (distance || 0) * invertDistance; return [left, right].indexOf(basePlacement) >= 0 ? { x: distance, y: skidding } : { x: skidding, y: distance }; } function offset(_ref2) { var state = _ref2.state, options = _ref2.options, name = _ref2.name; var _options$offset = options.offset, offset = _options$offset === void 0 ? [0, 0] : _options$offset; var data = placements.reduce(function (acc, placement) { acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset); return acc; }, {}); var _data$state$placement = data[state.placement], x = _data$state$placement.x, y = _data$state$placement.y; if (state.modifiersData.popperOffsets != null) { state.modifiersData.popperOffsets.x += x; state.modifiersData.popperOffsets.y += y; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var offset$1 = { name: 'offset', enabled: true, phase: 'main', requires: ['popperOffsets'], fn: offset }; var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; function getOppositePlacement(placement) { return placement.replace(/left|right|bottom|top/g, function (matched) { return hash[matched]; }); } var hash$1 = { start: 'end', end: 'start' }; function getOppositeVariationPlacement(placement) { return placement.replace(/start|end/g, function (matched) { return hash$1[matched]; }); } /*:: type OverflowsMap = { [ComputedPlacement]: number }; */ /*;; type OverflowsMap = { [key in ComputedPlacement]: number }; */ function computeAutoPlacement(state, options) { if (options === void 0) { options = {}; } var _options = options, placement = _options.placement, boundary = _options.boundary, rootBoundary = _options.rootBoundary, padding = _options.padding, flipVariations = _options.flipVariations, _options$allowedAutoP = _options.allowedAutoPlacements, allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP; var variation = getVariation(placement); var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) { return getVariation(placement) === variation; }) : basePlacements; var allowedPlacements = placements$1.filter(function (placement) { return allowedAutoPlacements.indexOf(placement) >= 0; }); if (allowedPlacements.length === 0) { allowedPlacements = placements$1; { console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, "auto" cannot be used to allow "bottom-start".', 'Use "auto-start" instead.'].join(' ')); } } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions... var overflows = allowedPlacements.reduce(function (acc, placement) { acc[placement] = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding })[getBasePlacement(placement)]; return acc; }, {}); return Object.keys(overflows).sort(function (a, b) { return overflows[a] - overflows[b]; }); } function getExpandedFallbackPlacements(placement) { if (getBasePlacement(placement) === auto) { return []; } var oppositePlacement = getOppositePlacement(placement); return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)]; } function flip(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; if (state.modifiersData[name]._skip) { return; } var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis, specifiedFallbackPlacements = options.fallbackPlacements, padding = options.padding, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, _options$flipVariatio = options.flipVariations, flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio, allowedAutoPlacements = options.allowedAutoPlacements; var preferredPlacement = state.options.placement; var basePlacement = getBasePlacement(preferredPlacement); var isBasePlacement = basePlacement === preferredPlacement; var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement)); var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) { return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, padding: padding, flipVariations: flipVariations, allowedAutoPlacements: allowedAutoPlacements }) : placement); }, []); var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var checksMap = new Map(); var makeFallbackChecks = true; var firstFittingPlacement = placements[0]; for (var i = 0; i < placements.length; i++) { var placement = placements[i]; var _basePlacement = getBasePlacement(placement); var isStartVariation = getVariation(placement) === start; var isVertical = [top, bottom].indexOf(_basePlacement) >= 0; var len = isVertical ? 'width' : 'height'; var overflow = detectOverflow(state, { placement: placement, boundary: boundary, rootBoundary: rootBoundary, altBoundary: altBoundary, padding: padding }); var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top; if (referenceRect[len] > popperRect[len]) { mainVariationSide = getOppositePlacement(mainVariationSide); } var altVariationSide = getOppositePlacement(mainVariationSide); var checks = []; if (checkMainAxis) { checks.push(overflow[_basePlacement] <= 0); } if (checkAltAxis) { checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0); } if (checks.every(function (check) { return check; })) { firstFittingPlacement = placement; makeFallbackChecks = false; break; } checksMap.set(placement, checks); } if (makeFallbackChecks) { // `2` may be desired in some cases – research later var numberOfChecks = flipVariations ? 3 : 1; var _loop = function _loop(_i) { var fittingPlacement = placements.find(function (placement) { var checks = checksMap.get(placement); if (checks) { return checks.slice(0, _i).every(function (check) { return check; }); } }); if (fittingPlacement) { firstFittingPlacement = fittingPlacement; return "break"; } }; for (var _i = numberOfChecks; _i > 0; _i--) { var _ret = _loop(_i); if (_ret === "break") { break; } } } if (state.placement !== firstFittingPlacement) { state.modifiersData[name]._skip = true; state.placement = firstFittingPlacement; state.reset = true; } } // eslint-disable-next-line import/no-unused-modules var flip$1 = { name: 'flip', enabled: true, phase: 'main', fn: flip, requiresIfExists: ['offset'], data: { _skip: false } }; function getAltAxis(axis) { return axis === 'x' ? 'y' : 'x'; } function within(min, value, max) { return Math.max(min, Math.min(value, max)); } function preventOverflow(_ref) { var state = _ref.state, options = _ref.options, name = _ref.name; var _options$mainAxis = options.mainAxis, checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis, _options$altAxis = options.altAxis, checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis, boundary = options.boundary, rootBoundary = options.rootBoundary, altBoundary = options.altBoundary, padding = options.padding, _options$tether = options.tether, tether = _options$tether === void 0 ? true : _options$tether, _options$tetherOffset = options.tetherOffset, tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset; var overflow = detectOverflow(state, { boundary: boundary, rootBoundary: rootBoundary, padding: padding, altBoundary: altBoundary }); var basePlacement = getBasePlacement(state.placement); var variation = getVariation(state.placement); var isBasePlacement = !variation; var mainAxis = getMainAxisFromPlacement(basePlacement); var altAxis = getAltAxis(mainAxis); var popperOffsets = state.modifiersData.popperOffsets; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign(Object.assign({}, state.rects), {}, { placement: state.placement })) : tetherOffset; var data = { x: 0, y: 0 }; if (!popperOffsets) { return; } if (checkMainAxis) { var mainSide = mainAxis === 'y' ? top : left; var altSide = mainAxis === 'y' ? bottom : right; var len = mainAxis === 'y' ? 'height' : 'width'; var offset = popperOffsets[mainAxis]; var min = popperOffsets[mainAxis] + overflow[mainSide]; var max = popperOffsets[mainAxis] - overflow[altSide]; var additive = tether ? -popperRect[len] / 2 : 0; var minLen = variation === start ? referenceRect[len] : popperRect[len]; var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go // outside the reference bounds var arrowElement = state.elements.arrow; var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : { width: 0, height: 0 }; var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject(); var arrowPaddingMin = arrowPaddingObject[mainSide]; var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want // to include its full size in the calculation. If the reference is small // and near the edge of a boundary, the popper can overflow even if the // reference is not overflowing as well (e.g. virtual elements with no // width or height) var arrowLen = within(0, referenceRect[len], arrowRect[len]); var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue; var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue; var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow); var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0; var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0; var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset; var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue; var preventedOffset = within(tether ? Math.min(min, tetherMin) : min, offset, tether ? Math.max(max, tetherMax) : max); popperOffsets[mainAxis] = preventedOffset; data[mainAxis] = preventedOffset - offset; } if (checkAltAxis) { var _mainSide = mainAxis === 'x' ? top : left; var _altSide = mainAxis === 'x' ? bottom : right; var _offset = popperOffsets[altAxis]; var _min = _offset + overflow[_mainSide]; var _max = _offset - overflow[_altSide]; var _preventedOffset = within(_min, _offset, _max); popperOffsets[altAxis] = _preventedOffset; data[altAxis] = _preventedOffset - _offset; } state.modifiersData[name] = data; } // eslint-disable-next-line import/no-unused-modules var preventOverflow$1 = { name: 'preventOverflow', enabled: true, phase: 'main', fn: preventOverflow, requiresIfExists: ['offset'] }; function arrow(_ref) { var _state$modifiersData$; var state = _ref.state, name = _ref.name; var arrowElement = state.elements.arrow; var popperOffsets = state.modifiersData.popperOffsets; var basePlacement = getBasePlacement(state.placement); var axis = getMainAxisFromPlacement(basePlacement); var isVertical = [left, right].indexOf(basePlacement) >= 0; var len = isVertical ? 'height' : 'width'; if (!arrowElement || !popperOffsets) { return; } var paddingObject = state.modifiersData[name + "#persistent"].padding; var arrowRect = getLayoutRect(arrowElement); var minProp = axis === 'y' ? top : left; var maxProp = axis === 'y' ? bottom : right; var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len]; var startDiff = popperOffsets[axis] - state.rects.reference[axis]; var arrowOffsetParent = getOffsetParent(arrowElement); var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0; var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is // outside of the popper bounds var min = paddingObject[minProp]; var max = clientSize - arrowRect[len] - paddingObject[maxProp]; var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference; var offset = within(min, center, max); // Prevents breaking syntax highlighting... var axisProp = axis; state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$); } function effect$2(_ref2) { var state = _ref2.state, options = _ref2.options, name = _ref2.name; var _options$element = options.element, arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element, _options$padding = options.padding, padding = _options$padding === void 0 ? 0 : _options$padding; if (arrowElement == null) { return; } // CSS selector if (typeof arrowElement === 'string') { arrowElement = state.elements.popper.querySelector(arrowElement); if (!arrowElement) { return; } } { if (!isHTMLElement(arrowElement)) { console.error(['Popper: "arrow" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' ')); } } if (!contains(state.elements.popper, arrowElement)) { { console.error(['Popper: "arrow" modifier\'s `element` must be a child of the popper', 'element.'].join(' ')); } return; } state.elements.arrow = arrowElement; state.modifiersData[name + "#persistent"] = { padding: mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements)) }; } // eslint-disable-next-line import/no-unused-modules var arrow$1 = { name: 'arrow', enabled: true, phase: 'main', fn: arrow, effect: effect$2, requires: ['popperOffsets'], requiresIfExists: ['preventOverflow'] }; function getSideOffsets(overflow, rect, preventedOffsets) { if (preventedOffsets === void 0) { preventedOffsets = { x: 0, y: 0 }; } return { top: overflow.top - rect.height - preventedOffsets.y, right: overflow.right - rect.width + preventedOffsets.x, bottom: overflow.bottom - rect.height + preventedOffsets.y, left: overflow.left - rect.width - preventedOffsets.x }; } function isAnySideFullyClipped(overflow) { return [top, right, bottom, left].some(function (side) { return overflow[side] >= 0; }); } function hide(_ref) { var state = _ref.state, name = _ref.name; var referenceRect = state.rects.reference; var popperRect = state.rects.popper; var preventedOffsets = state.modifiersData.preventOverflow; var referenceOverflow = detectOverflow(state, { elementContext: 'reference' }); var popperAltOverflow = detectOverflow(state, { altBoundary: true }); var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect); var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets); var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets); var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets); state.modifiersData[name] = { referenceClippingOffsets: referenceClippingOffsets, popperEscapeOffsets: popperEscapeOffsets, isReferenceHidden: isReferenceHidden, hasPopperEscaped: hasPopperEscaped }; state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, { 'data-popper-reference-hidden': isReferenceHidden, 'data-popper-escaped': hasPopperEscaped }); } // eslint-disable-next-line import/no-unused-modules var hide$1 = { name: 'hide', enabled: true, phase: 'main', requiresIfExists: ['preventOverflow'], fn: hide }; var defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1]; var createPopper = /*#__PURE__*/ popperGenerator({ defaultModifiers: defaultModifiers }); // eslint-disable-next-line import/no-unused-modules var defaultModifiers$1 = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1]; var createPopper$1 = /*#__PURE__*/ popperGenerator({ defaultModifiers: defaultModifiers$1 }); // eslint-disable-next-line import/no-unused-modules exports.applyStyles = applyStyles$1; exports.arrow = arrow$1; exports.computeStyles = computeStyles$1; exports.createPopper = createPopper$1; exports.createPopperLite = createPopper; exports.defaultModifiers = defaultModifiers$1; exports.detectOverflow = detectOverflow; exports.eventListeners = eventListeners; exports.flip = flip$1; exports.hide = hide$1; exports.offset = offset$1; exports.popperGenerator = popperGenerator; exports.popperOffsets = popperOffsets$1; exports.preventOverflow = preventOverflow$1; Object.defineProperty(exports, '__esModule', { value: true }); })));assets/js/select2/css/select2.css000064400000041716147600374260012710 0ustar00.select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle; } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-selection--single .select2-selection__clear { position: relative; } .select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px; } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; user-select: none; -webkit-user-select: none; } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline-block; overflow: hidden; padding-left: 8px; text-overflow: ellipsis; white-space: nowrap; } .select2-container .select2-search--inline { float: left; } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin-top: 5px; padding: 0; } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-dropdown { background-color: white; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051; } .select2-results { display: block; } .select2-results__options { list-style: none; margin: 0; padding: 0; } .select2-results__option { padding: 6px; user-select: none; -webkit-user-select: none; } .select2-results__option[aria-selected] { cursor: pointer; } .select2-container--open .select2-dropdown { left: 0; } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-search--dropdown { display: block; padding: 4px; } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box; } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none; } .select2-search--dropdown.select2-search--hide { display: none; } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff; filter: alpha(opacity=0); } .select2-hidden-accessible { border: 0 !important; clip: rect(0 0 0 0) !important; -webkit-clip-path: inset(50%) !important; clip-path: inset(50%) !important; height: 1px !important; overflow: hidden !important; padding: 0 !important; position: absolute !important; width: 1px !important; white-space: nowrap !important; } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto; } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none; } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--default .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; } .select2-container--default .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; list-style: none; margin: 0; padding: 0 5px; width: 100%; } .select2-container--default .select2-selection--multiple .select2-selection__rendered li { list-style: none; } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-top: 5px; margin-right: 10px; padding: 1px; } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice, .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline { float: right; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto; } .select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid black 1px; outline: 0; } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default; } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none; } .select2-container--default.select2-container--open.select2-container--above .select2-selection--single, .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple { border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--default.select2-container--open.select2-container--below .select2-selection--single, .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; } .select2-container--default .select2-search--inline .select2-search__field { background: transparent; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield; } .select2-container--default .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--default .select2-results__option[role=group] { padding: 0; } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999; } .select2-container--default .select2-results__option[aria-selected=true] { background-color: #ddd; } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em; } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em; } .select2-container--default .select2-results__option--highlighted[aria-selected] { background-color: #5897fb; color: white; } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-linear-gradient(top, white 50%, #eeeeee 100%); background-image: -o-linear-gradient(top, white 50%, #eeeeee 100%); background-image: linear-gradient(to bottom, white 50%, #eeeeee 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic .select2-selection--single:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px; } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: bold; margin-right: 10px; } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999; } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, #cccccc 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0); } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear { float: left; } .select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto; } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: transparent; border: none; } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-linear-gradient(top, white 0%, #eeeeee 50%); background-image: -o-linear-gradient(top, white 0%, #eeeeee 50%); background-image: linear-gradient(to bottom, white 0%, #eeeeee 50%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0); } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-linear-gradient(top, #eeeeee 50%, white 100%); background-image: -o-linear-gradient(top, #eeeeee 50%, white 100%); background-image: linear-gradient(to bottom, #eeeeee 50%, white 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0); } .select2-container--classic .select2-selection--multiple { background-color: white; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0; } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #5897fb; } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style: none; margin: 0; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none; } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { color: #888; cursor: pointer; display: inline-block; font-weight: bold; margin-right: 2px; } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice { float: right; margin-left: 5px; margin-right: auto; } .select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto; } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #5897fb; } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0; } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none; } .select2-container--classic .select2-dropdown { background-color: white; border: 1px solid transparent; } .select2-container--classic .select2-dropdown--above { border-bottom: none; } .select2-container--classic .select2-dropdown--below { border-top: none; } .select2-container--classic .select2-results > .select2-results__options { max-height: 200px; overflow-y: auto; } .select2-container--classic .select2-results__option[role=group] { padding: 0; } .select2-container--classic .select2-results__option[aria-disabled=true] { color: grey; } .select2-container--classic .select2-results__option--highlighted[aria-selected] { background-color: #3875d7; color: white; } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px; } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #5897fb; } assets/js/select2/css/select2.min.css000064400000035166147600374260013474 0ustar00.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;padding:1px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} assets/js/select2/js/i18n/zh-CN.js000064400000001400147600374260012477 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请å†è¾“入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多åªèƒ½é€‰æ‹©"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"æœç´¢ä¸­â€¦"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}();assets/js/select2/js/i18n/ps.js000064400000002031147600374260012203 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه Ú©Ûدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د Ù…Ù‡Ø±Ø¨Ø§Ù†Û Ù„Ù…Ø®ÙŠ "+e+" توری Ú“Ù†Ú« کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"Ù„Ú– تر Ù„Ú–Ù‡ "+(n.minimum-n.input.length)+" يا Ú‰Ûر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه Ú©ÙŠÚ–ÙŠ..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په Ù†ÚšÙ‡ کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي Ùˆ نه موندل سوÛ"},searching:function(){return"لټول Ú©ÙŠÚ–ÙŠ..."},removeAllItems:function(){return"ټول توکي Ù„Ø±Û Ú©Ú“Ø¦"}}}),n.define,n.require}();assets/js/select2/js/i18n/pt-BR.js000064400000001554147600374260012516 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();assets/js/select2/js/i18n/bs.js000064400000001705147600374260012174 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="ObriÅ¡ite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar joÅ¡ "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje joÅ¡ rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"NiÅ¡ta nije pronaÄ‘eno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}();assets/js/select2/js/i18n/lv.js000064400000001604147600374260012207 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="LÅ«dzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazÄk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="LÅ«dzu ievadiet vÄ“l "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielÄde…"},maximumSelected:function(n){var u="JÅ«s varat izvÄ“lÄ“ties ne vairÄk kÄ "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"SakritÄ«bu nav"},searching:function(){return"MeklÄ“Å¡ana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}();assets/js/select2/js/i18n/tr.js000064400000001407147600374260012214 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}();assets/js/select2/js/i18n/nl.js000064400000001610147600374260012174 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}();assets/js/select2/js/i18n/ka.js000064400000002253147600374260012162 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვრშეუძლებელიáƒ."},inputTooLong:function(n){return"გთხáƒáƒ•áƒ— áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ "+(n.input.length-n.maximum)+" სიმბáƒáƒšáƒáƒ—ი ნáƒáƒ™áƒšáƒ”ბი"},inputTooShort:function(n){return"გთხáƒáƒ•áƒ— áƒáƒ™áƒ áƒ˜áƒ¤áƒ”თ "+(n.minimum-n.input.length)+" სიმბáƒáƒšáƒ áƒáƒœ მეტი"},loadingMore:function(){return"მáƒáƒœáƒáƒªáƒ”მების ჩáƒáƒ¢áƒ•áƒ˜áƒ áƒ—ვáƒâ€¦"},maximumSelected:function(n){return"თქვენ შეგიძლიáƒáƒ— áƒáƒ˜áƒ áƒ©áƒ˜áƒáƒ— áƒáƒ áƒáƒ£áƒ›áƒ”ტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტáƒáƒ¢áƒ˜ áƒáƒ  მáƒáƒ˜áƒ«áƒ”ბნáƒ"},searching:function(){return"ძიებáƒâ€¦"},removeAllItems:function(){return"áƒáƒ›áƒáƒ˜áƒ¦áƒ” ყველრელემენტი"}}}),n.define,n.require}();assets/js/select2/js/i18n/hr.js000064400000001524147600374260012200 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite joÅ¡ "+n(e.minimum-e.input.length)},loadingMore:function(){return"UÄitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}();assets/js/select2/js/i18n/th.js000064400000002062147600374260012200 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออภ"+(n.input.length-n.maximum)+" ตัวอัà¸à¸©à¸£"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีภ"+(n.minimum-n.input.length)+" ตัวอัà¸à¸©à¸£"},loadingMore:function(){return"à¸à¸³à¸¥à¸±à¸‡à¸„้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือà¸à¹„ด้ไม่เà¸à¸´à¸™ "+n.maximum+" รายà¸à¸²à¸£"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"à¸à¸³à¸¥à¸±à¸‡à¸„้นข้อมูล…"},removeAllItems:function(){return"ลบรายà¸à¸²à¸£à¸—ั้งหมด"}}}),n.define,n.require}();assets/js/select2/js/i18n/af.js000064400000001542147600374260012155 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}();assets/js/select2/js/i18n/vi.js000064400000001434147600374260012205 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bá»›t "+(n.input.length-n.maximum)+" ký tá»±"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tá»± trở lên"},loadingMore:function(){return"Äang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chá»n được "+n.maximum+" lá»±a chá»n"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Äang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}();assets/js/select2/js/i18n/pt.js000064400000001556147600374260012217 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();assets/js/select2/js/i18n/km.js000064400000002100147600374260012165 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្ននáŸáž™"},inputTooLong:function(n){return"សូមលុបចáŸáž‰ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនáŸáŸ‡"},loadingMore:function(){return"កំពុងទាញយកទិន្ននáŸáž™áž”ន្ážáŸ‚ម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានážáŸ‚ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាážáž»áž‘ាំងអស់"}}}),n.define,n.require}();assets/js/select2/js/i18n/sl.js000064400000001635147600374260012210 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoÄe naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbriÅ¡ite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpiÅ¡ite Å¡e "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam veÄ zadetkov…"},maximumSelected:function(e){var n="OznaÄite lahko najveÄ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"IÅ¡Äem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}();assets/js/select2/js/i18n/da.js000064400000001474147600374260012157 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();assets/js/select2/js/i18n/hy.js000064400000002004147600374260012201 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Ô±Ö€Õ¤ÕµÕ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€Õ¨ Õ°Õ¶Õ¡Ö€Õ¡Õ¾Õ¸Ö€ Õ¹Õ§ Õ¢Õ¥Õ¼Õ¶Õ¥Õ¬Ö‰"},inputTooLong:function(n){return"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ°Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ "+(n.input.length-n.maximum)+" Õ¶Õ·Õ¡Õ¶"},inputTooShort:function(n){return"Ô½Õ¶Õ¤Ö€Õ¸Ö‚Õ´ Õ¥Õ¶Ö„ Õ´Õ¸Ö‚Õ¿Ö„Õ¡Õ£Ö€Õ¥Õ¬ "+(n.minimum-n.input.length)+" Õ¯Õ¡Õ´ Õ¡Õ¾Õ¥Õ¬ Õ¶Õ·Õ¡Õ¶Õ¶Õ¥Ö€"},loadingMore:function(){return"Ô²Õ¥Õ¼Õ¶Õ¾Õ¸Ö‚Õ´ Õ¥Õ¶ Õ¶Õ¸Ö€ արդյունքներ․․․"},maximumSelected:function(n){return"Ô´Õ¸Ö‚Ö„ Õ¯Õ¡Ö€Õ¸Õ² Õ¥Ö„ Õ¨Õ¶Õ¿Ö€Õ¥Õ¬ Õ¡Õ¼Õ¡Õ¾Õ¥Õ¬Õ¡Õ£Õ¸Ö‚ÕµÕ¶Õ¨ "+n.maximum+" Õ¯Õ¥Õ¿"},noResults:function(){return"Ô±Ö€Õ¤ÕµÕ¸Ö‚Õ¶Ö„Õ¶Õ¥Ö€ Õ¹Õ¥Õ¶ Õ£Õ¿Õ¶Õ¾Õ¥Õ¬"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Õ€Õ¥Õ¼Õ¡ÖÕ¶Õ¥Õ¬ Õ¢Õ¸Õ¬Õ¸Ö€ Õ¿Õ¡Ö€Ö€Õ¥Ö€Õ¨"}}}),n.define,n.require}();assets/js/select2/js/i18n/az.js000064400000001321147600374260012174 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nÉ™ticÉ™ yüklÉ™nir…"},maximumSelected:function(n){return"SadÉ™cÉ™ "+n.maximum+" element seçə bilÉ™rsiniz"},noResults:function(){return"NÉ™ticÉ™ tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementlÉ™ri sil"}}}),n.define,n.require}();assets/js/select2/js/i18n/bg.js000064400000001710147600374260012154 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ Ñ "+e+" по-малко Ñимвол";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="ÐœÐ¾Ð»Ñ Ð²ÑŠÐ²ÐµÐ´ÐµÑ‚Ðµ още "+e+" Ñимвол";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат Ñе още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"ÐÑма намерени ÑъвпадениÑ"},searching:function(){return"ТърÑене…"},removeAllItems:function(){return"Премахнете вÑички елементи"}}}),n.define,n.require}();assets/js/select2/js/i18n/ca.js000064400000001604147600374260012151 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}();assets/js/select2/js/i18n/ms.js000064400000001453147600374260012207 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}();assets/js/select2/js/i18n/es.js000064400000001635147600374260012201 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();assets/js/select2/js/i18n/et.js000064400000001444147600374260012200 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}();assets/js/select2/js/i18n/gl.js000064400000001634147600374260012173 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}();assets/js/select2/js/i18n/zh-TW.js000064400000001303147600374260012533 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"è«‹å†è¼¸å…¥"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"ä½ åªèƒ½é¸æ“‡æœ€å¤š"+n.maximum+"é …"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"æœå°‹ä¸­â€¦"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}();assets/js/select2/js/i18n/de.js000064400000001545147600374260012162 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Ãœbereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}();assets/js/select2/js/i18n/eu.js000064400000001547147600374260012205 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}();assets/js/select2/js/i18n/hu.js000064400000001477147600374260012212 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}();assets/js/select2/js/i18n/pl.js000064400000001663147600374260012206 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można zaÅ‚adować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"UsuÅ„ "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa Å‚adowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"UsuÅ„ wszystkie przedmioty"}}}),n.define,n.require}();assets/js/select2/js/i18n/it.js000064400000001601147600374260012177 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}();assets/js/select2/js/i18n/sr-Cyrl.js000064400000002125147600374260013120 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није уÑпело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" Ñимбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" Ñимбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати Ñамо "+e.maximum+" Ñтавк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ðишта није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните Ñве Ñтавке"}}}),n.define,n.require}();assets/js/select2/js/i18n/lt.js000064400000001660147600374260012207 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="PaÅ¡alinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Ä®raÅ¡ykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="JÅ«s galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"Ä…","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"IeÅ¡koma…"},removeAllItems:function(){return"PaÅ¡alinti visus elementus"}}}),n.define,n.require}();assets/js/select2/js/i18n/ro.js000064400000001652147600374260012211 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să È™tergeÈ›i"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceÈ›i "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="AveÈ›i voie să selectaÈ›i cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"EliminaÈ›i toate elementele"}}}),e.define,e.require}();assets/js/select2/js/i18n/is.js000064400000001447147600374260012206 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}();assets/js/select2/js/i18n/sk.js000064400000002432147600374260012203 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"Å¡tyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo naÄítaÅ¥."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte eÅ¡te jeden znak":t<=4?"Prosím, zadajte eÅ¡te ÄalÅ¡ie "+e[t](!0)+" znaky":"Prosím, zadajte eÅ¡te Äalších "+t+" znakov"},loadingMore:function(){return"NaÄítanie Äalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliÅ¥ len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliÅ¥ najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliÅ¥ najviac "+n.maximum+" položiek"},noResults:function(){return"NenaÅ¡li sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte vÅ¡etky položky"}}}),e.define,e.require}();assets/js/select2/js/i18n/bn.js000064400000002413147600374260012164 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগà§à¦²à¦¿ লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনà§à¦—à§à¦°à¦¹ করে "+e+" টি অকà§à¦·à¦° মà§à¦›à§‡ দিন।";return 1!=e&&(u="অনà§à¦—à§à¦°à¦¹ করে "+e+" টি অকà§à¦·à¦° মà§à¦›à§‡ দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অকà§à¦·à¦° অথবা অধিক অকà§à¦·à¦° লিখà§à¦¨à¥¤"},loadingMore:function(){return"আরো ফলাফল লোড হচà§à¦›à§‡ ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নিরà§à¦¬à¦¾à¦šà¦¨ করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নিরà§à¦¬à¦¾à¦šà¦¨ করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনà§à¦¸à¦¨à§à¦§à¦¾à¦¨ করা হচà§à¦›à§‡ ..."}}}),n.define,n.require}();assets/js/select2/js/i18n/mk.js000064400000002016147600374260012173 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внеÑете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внеÑете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете Ñамо "+n.maximum+" Ñтавк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Ðема пронајдено Ñовпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"ОтÑтрани ги Ñите предмети"}}}),n.define,n.require}();assets/js/select2/js/i18n/dsb.js000064400000001771147600374260012343 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuÅ¡ko","znamuÅ¡ce","znamuÅ¡ka","znamuÅ¡kow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"WuslÄ›dki njejsu se dali zacytaÅ›."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"PÅ¡osym laÅ¡uj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"PÅ¡osym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"DalÅ¡ne wuslÄ›dki se zacytaju…"},maximumSelected:function(n){return"MóžoÅ¡ jano "+n.maximum+" "+u(n.maximum,e)+"wubraÅ›."},noResults:function(){return"Žedne wuslÄ›dki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();assets/js/select2/js/i18n/hsb.js000064400000001772147600374260012350 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamjeÅ¡ko","znamjeÅ¡ce","znamjeÅ¡ka","znamjeÅ¡kow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"WuslÄ›dki njedachu so zaÄitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"ProÅ¡u zhaÅ¡ej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"ProÅ¡u zapodaj znajmjeÅ„Å¡a "+a+" "+u(a,n)},loadingMore:function(){return"DalÅ¡e wuslÄ›dki so zaÄitaja…"},maximumSelected:function(n){return"MóžeÅ¡ jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslÄ›dki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();assets/js/select2/js/i18n/fr.js000064400000001634147600374260012200 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();assets/js/select2/js/i18n/ko.js000064400000001527147600374260012203 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 ê¹ë‹ˆë‹¤. "+(n.input.length-n.maximum)+" ê¸€ìž ì§€ì›Œì£¼ì„¸ìš”."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" ê¸€ìž ë” ìž…ë ¥í•´ì£¼ì„¸ìš”."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 ì„ íƒ ê°€ëŠ¥í•©ë‹ˆë‹¤."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 ì‚­ì œ"}}}),n.define,n.require}();assets/js/select2/js/i18n/fi.js000064400000001443147600374260012165 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}();assets/js/select2/js/i18n/nb.js000064400000001412147600374260012162 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();assets/js/select2/js/i18n/cs.js000064400000002414147600374260012173 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvÄ›";case 3:return"tÅ™i";case 4:return"ÄtyÅ™i"}return""}return{errorLoading:function(){return"Výsledky nemohly být naÄteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak ménÄ›.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky ménÄ›.":"Prosím, zadejte o "+t+" znaků ménÄ›."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte jeÅ¡tÄ› jeden znak.":t<=4?"Prosím, zadejte jeÅ¡tÄ› další "+e(t,!0)+" znaky.":"Prosím, zadejte jeÅ¡tÄ› dalších "+t+" znaků."},loadingMore:function(){return"NaÄítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálnÄ› "+e(t,!1)+" položky.":"Můžete zvolit maximálnÄ› "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte vÅ¡echny položky"}}}),e.define,e.require}();assets/js/select2/js/i18n/uk.js000064400000002204147600374260012202 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Ðеможливо завантажити результати"},inputTooLong:function(e){return"Будь лаÑка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь лаÑка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Ð—Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶ÐµÐ½Ð½Ñ Ñ–Ð½ÑˆÐ¸Ñ… результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Ðічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити вÑÑ– елементи"}}}),n.define,n.require}();assets/js/select2/js/i18n/ar.js000064400000001611147600374260012166 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذ٠"+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضاÙØ© "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضاÙية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود Ùقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}();assets/js/select2/js/i18n/el.js000064400000002241147600374260012164 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόÏεσαν να φοÏτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="ΠαÏακαλώ διαγÏάψτε "+e+" χαÏακτήÏ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"ΠαÏακαλώ συμπληÏώστε "+(n.minimum-n.input.length)+" ή πεÏισσότεÏους χαÏακτήÏες"},loadingMore:function(){return"ΦόÏτωση πεÏισσότεÏων αποτελεσμάτων…"},maximumSelected:function(n){var e="ΜποÏείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βÏέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"ΚαταÏγήστε όλα τα στοιχεία"}}}),n.define,n.require}();assets/js/select2/js/i18n/id.js000064400000001400147600374260012154 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}();assets/js/select2/js/i18n/tk.js000064400000001403147600374260012201 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ãene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();assets/js/select2/js/i18n/ne.js000064400000002520147600374260012166 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरॠदेखाउन सकिà¤à¤¨à¥¤"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अकà¥à¤·à¤° मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤";return 1!=e&&(u+="कृपया "+e+" अकà¥à¤·à¤°à¤¹à¤°à¥ मेटाउनà¥à¤¹à¥‹à¤¸à¥à¥¤"),u},inputTooShort:function(n){return"कृपया बाà¤à¤•à¥€ रहेका "+(n.minimum-n.input.length)+" वा अरॠधेरै अकà¥à¤·à¤°à¤¹à¤°à¥ भरà¥à¤¨à¥à¤¹à¥‹à¤¸à¥à¥¤"},loadingMore:function(){return"अरॠनतिजाहरॠभरिà¤à¤¦à¥ˆà¤›à¤¨à¥ …"},maximumSelected:function(n){var e="तà¤à¤ªà¤¾à¤ˆ "+n.maximum+" वसà¥à¤¤à¥ मातà¥à¤° छानà¥à¤¨ पाउà¤à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤";return 1!=n.maximum&&(e="तà¤à¤ªà¤¾à¤ˆ "+n.maximum+" वसà¥à¤¤à¥à¤¹à¤°à¥ मातà¥à¤° छानà¥à¤¨ पाउà¤à¤¨à¥à¤¹à¥à¤¨à¥à¤›à¥¤"),e},noResults:function(){return"कà¥à¤¨à¥ˆ पनि नतिजा भेटिà¤à¤¨à¥¤"},searching:function(){return"खोजि हà¥à¤à¤¦à¥ˆà¤›â€¦"}}}),n.define,n.require}();assets/js/select2/js/i18n/ja.js000064400000001536147600374260012164 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"çµæžœãŒèª­ã¿è¾¼ã¾ã‚Œã¾ã›ã‚“ã§ã—ãŸ"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除ã—ã¦ãã ã•ã„"},inputTooShort:function(n){return"å°‘ãªãã¨ã‚‚ "+(n.minimum-n.input.length)+" 文字を入力ã—ã¦ãã ã•ã„"},loadingMore:function(){return"読ã¿è¾¼ã¿ä¸­â€¦"},maximumSelected:function(n){return n.maximum+" 件ã—ã‹é¸æŠžã§ãã¾ã›ã‚“"},noResults:function(){return"対象ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“"},searching:function(){return"検索ã—ã¦ã„ã¾ã™â€¦"},removeAllItems:function(){return"ã™ã¹ã¦ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除"}}}),n.define,n.require}();assets/js/select2/js/i18n/sq.js000064400000001607147600374260012214 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}();assets/js/select2/js/i18n/en.js000064400000001517147600374260012173 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();assets/js/select2/js/i18n/sr.js000064400000001724147600374260012215 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="ObriÅ¡ite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar joÅ¡ "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje joÅ¡ rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"NiÅ¡ta nije pronaÄ‘eno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните Ñве Ñтавке"}}}),n.define,n.require}();assets/js/select2/js/i18n/fa.js000064400000001777147600374260012167 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطÙاً "+(n.input.length-n.maximum)+" کاراکتر را حذ٠نمایید"},inputTooShort:function(n){return"لطÙاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها می‌توانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجه‌ای یاÙت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذ٠کنید"}}}),n.define,n.require}();assets/js/select2/js/i18n/sv.js000064400000001422147600374260012214 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}();assets/js/select2/js/i18n/he.js000064400000001733147600374260012165 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגי××” בטעינת התוצ×ות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="× × ×œ×ž×—×•×§ ";return r+=1===e?"תו ×חד":e+" תווי×"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="× × ×œ×”×›× ×™×¡ ";return r+=1===e?"תו ×חד":e+" תווי×",r+=" ×ו יותר"},loadingMore:function(){return"טוען תוצ×ות נוספות…"},maximumSelected:function(n){var e="ב×פשרותך לבחור עד ";return 1===n.maximum?e+="פריט ×חד":e+=n.maximum+" פריטי×",e},noResults:function(){return"×œ× × ×ž×¦×ו תוצ×ות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר ×ת כל הפריטי×"}}}),n.define,n.require}();assets/js/select2/js/i18n/ru.js000064400000002223147600374260012212 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Ðевозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="ПожалуйÑта, введите на "+r+" Ñимвол";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="ПожалуйÑта, введите ещё Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ "+r+" Ñимвол";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Ð’Ñ‹ можете выбрать не более "+e.maximum+" Ñлемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"ПоиÑк…"},removeAllItems:function(){return"Удалить вÑе Ñлементы"}}}),n.define,n.require}();assets/js/select2/js/i18n/hi.js000064400000002227147600374260012170 0ustar00/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अकà¥à¤·à¤° को हटा दें";return e>1&&(r=e+" अकà¥à¤·à¤°à¥‹à¤‚ को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अकà¥à¤·à¤° दरà¥à¤œ करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वसà¥à¤¤à¥à¤“ं को हटा दें"}}}),n.define,n.require}();assets/js/select2/js/select2.full.js000064400000523001147600374260013311 0ustar00;;;/*! * Select2 4.0.13 * https://select2.github.io * * Released under the MIT license * https://github.com/select2/select2/blob/master/LICENSE.md */ ;(function (factory) { if (typeof define === 'function' && define.amd) { // AMD. Register as an anonymous module. define(['jquery'], factory); } else if (typeof module === 'object' && module.exports) { // Node/CommonJS module.exports = function (root, jQuery) { if (jQuery === undefined) { // require('jQuery') returns a factory that requires window to // build a jQuery instance, we normalize how we use modules // that require this pattern but the window provided is a noop // if it's defined (how jquery works) if (typeof window !== 'undefined') { jQuery = require('jquery'); } else { jQuery = require('jquery')(root); } } factory(jQuery); return jQuery; }; } else { // Browser globals factory(jQuery); } } (function (jQuery) { // This is needed so we can catch the AMD loader configuration and use it // The inner file should be wrapped (by `banner.start.js`) in a function that // returns the AMD loader references. var S2 =(function () { // Restore the Select2 AMD loader so it can be used // Needed mostly in the language files, where the loader is not inserted if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { var S2 = jQuery.fn.select2.amd; } var S2;(function () { if (!S2 || !S2.requirejs) { if (!S2) { S2 = {}; } else { require = S2; } /** * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. * Released under MIT license, http://github.com/requirejs/almond/LICENSE */ //Going sloppy to avoid 'use strict' string cost, but strict practices should //be followed. /*global setTimeout: false */ var requirejs, require, define; (function (undef) { var main, req, makeMap, handlers, defined = {}, waiting = {}, config = {}, defining = {}, hasOwn = Object.prototype.hasOwnProperty, aps = [].slice, jsSuffixRegExp = /\.js$/; function hasProp(obj, prop) { return hasOwn.call(obj, prop); } /** * Given a relative module name, like ./something, normalize it to * a real name that can be mapped to a path. * @param {String} name the relative name * @param {String} baseName a real name that the name arg is relative * to. * @returns {String} normalized name */ function normalize(name, baseName) { var nameParts, nameSegment, mapValue, foundMap, lastIndex, foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, baseParts = baseName && baseName.split("/"), map = config.map, starMap = (map && map['*']) || {}; //Adjust any relative paths. if (name) { name = name.split('/'); lastIndex = name.length - 1; // If wanting node ID compatibility, strip .js from end // of IDs. Have to do this here, and not in nameToUrl // because node allows either .js or non .js to map // to same file. if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); } // Starts with a '.' so need the baseName if (name[0].charAt(0) === '.' && baseParts) { //Convert baseName to array, and lop off the last part, //so that . matches that 'directory' and not name of the baseName's //module. For instance, baseName of 'one/two/three', maps to //'one/two/three.js', but we want the directory, 'one/two' for //this normalization. normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); name = normalizedBaseParts.concat(name); } //start trimDots for (i = 0; i < name.length; i++) { part = name[i]; if (part === '.') { name.splice(i, 1); i -= 1; } else if (part === '..') { // If at the start, or previous value is still .., // keep them so that when converted to a path it may // still work when converted to a path, even though // as an ID it is less than ideal. In larger point // releases, may be better to just kick out an error. if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { continue; } else if (i > 0) { name.splice(i - 1, 2); i -= 2; } } } //end trimDots name = name.join('/'); } //Apply map config if available. if ((baseParts || starMap) && map) { nameParts = name.split('/'); for (i = nameParts.length; i > 0; i -= 1) { nameSegment = nameParts.slice(0, i).join("/"); if (baseParts) { //Find the longest baseName segment match in the config. //So, do joins on the biggest to smallest lengths of baseParts. for (j = baseParts.length; j > 0; j -= 1) { mapValue = map[baseParts.slice(0, j).join('/')]; //baseName segment has config, find if it has one for //this name. if (mapValue) { mapValue = mapValue[nameSegment]; if (mapValue) { //Match, update name to the new value. foundMap = mapValue; foundI = i; break; } } } } if (foundMap) { break; } //Check for a star map match, but just hold on to it, //if there is a shorter segment match later in a matching //config, then favor over this star map. if (!foundStarMap && starMap && starMap[nameSegment]) { foundStarMap = starMap[nameSegment]; starI = i; } } if (!foundMap && foundStarMap) { foundMap = foundStarMap; foundI = starI; } if (foundMap) { nameParts.splice(0, foundI, foundMap); name = nameParts.join('/'); } } return name; } function makeRequire(relName, forceSync) { return function () { //A version of a require function that passes a moduleName //value for items that may need to //look up paths relative to the moduleName var args = aps.call(arguments, 0); //If first arg is not require('string'), and there is only //one arg, it is the array form without a callback. Insert //a null so that the following concat is correct. if (typeof args[0] !== 'string' && args.length === 1) { args.push(null); } return req.apply(undef, args.concat([relName, forceSync])); }; } function makeNormalize(relName) { return function (name) { return normalize(name, relName); }; } function makeLoad(depName) { return function (value) { defined[depName] = value; }; } function callDep(name) { if (hasProp(waiting, name)) { var args = waiting[name]; delete waiting[name]; defining[name] = true; main.apply(undef, args); } if (!hasProp(defined, name) && !hasProp(defining, name)) { throw new Error('No ' + name); } return defined[name]; } //Turns a plugin!resource to [plugin, resource] //with the plugin being undefined if the name //did not have a plugin prefix. function splitPrefix(name) { var prefix, index = name ? name.indexOf('!') : -1; if (index > -1) { prefix = name.substring(0, index); name = name.substring(index + 1, name.length); } return [prefix, name]; } //Creates a parts array for a relName where first part is plugin ID, //second part is resource ID. Assumes relName has already been normalized. function makeRelParts(relName) { return relName ? splitPrefix(relName) : []; } /** * Makes a name map, normalizing the name, and using a plugin * for normalization if necessary. Grabs a ref to plugin * too, as an optimization. */ makeMap = function (name, relParts) { var plugin, parts = splitPrefix(name), prefix = parts[0], relResourceName = relParts[1]; name = parts[1]; if (prefix) { prefix = normalize(prefix, relResourceName); plugin = callDep(prefix); } //Normalize according if (prefix) { if (plugin && plugin.normalize) { name = plugin.normalize(name, makeNormalize(relResourceName)); } else { name = normalize(name, relResourceName); } } else { name = normalize(name, relResourceName); parts = splitPrefix(name); prefix = parts[0]; name = parts[1]; if (prefix) { plugin = callDep(prefix); } } //Using ridiculous property names for space reasons return { f: prefix ? prefix + '!' + name : name, //fullName n: name, pr: prefix, p: plugin }; }; function makeConfig(name) { return function () { return (config && config.config && config.config[name]) || {}; }; } handlers = { require: function (name) { return makeRequire(name); }, exports: function (name) { var e = defined[name]; if (typeof e !== 'undefined') { return e; } else { return (defined[name] = {}); } }, module: function (name) { return { id: name, uri: '', exports: defined[name], config: makeConfig(name) }; } }; main = function (name, deps, callback, relName) { var cjsModule, depName, ret, map, i, relParts, args = [], callbackType = typeof callback, usingExports; //Use name if no relName relName = relName || name; relParts = makeRelParts(relName); //Call the callback to define the module, if necessary. if (callbackType === 'undefined' || callbackType === 'function') { //Pull out the defined dependencies and pass the ordered //values to the callback. //Default to [require, exports, module] if no deps deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; for (i = 0; i < deps.length; i += 1) { map = makeMap(deps[i], relParts); depName = map.f; //Fast path CommonJS standard dependencies. if (depName === "require") { args[i] = handlers.require(name); } else if (depName === "exports") { //CommonJS module spec 1.1 args[i] = handlers.exports(name); usingExports = true; } else if (depName === "module") { //CommonJS module spec 1.1 cjsModule = args[i] = handlers.module(name); } else if (hasProp(defined, depName) || hasProp(waiting, depName) || hasProp(defining, depName)) { args[i] = callDep(depName); } else if (map.p) { map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); args[i] = defined[depName]; } else { throw new Error(name + ' missing ' + depName); } } ret = callback ? callback.apply(defined[name], args) : undefined; if (name) { //If setting exports via "module" is in play, //favor that over return value and exports. After that, //favor a non-undefined return value over exports use. if (cjsModule && cjsModule.exports !== undef && cjsModule.exports !== defined[name]) { defined[name] = cjsModule.exports; } else if (ret !== undef || !usingExports) { //Use the return value from the function. defined[name] = ret; } } } else if (name) { //May just be an object definition for the module. Only //worry about defining if have a module name. defined[name] = callback; } }; requirejs = require = req = function (deps, callback, relName, forceSync, alt) { if (typeof deps === "string") { if (handlers[deps]) { //callback in this case is really relName return handlers[deps](callback); } //Just return the module wanted. In this scenario, the //deps arg is the module name, and second arg (if passed) //is just the relName. //Normalize module name, if it contains . or .. return callDep(makeMap(deps, makeRelParts(callback)).f); } else if (!deps.splice) { //deps is a config object, not an array. config = deps; if (config.deps) { req(config.deps, config.callback); } if (!callback) { return; } if (callback.splice) { //callback is an array, which means it is a dependency list. //Adjust args if there are dependencies deps = callback; callback = relName; relName = null; } else { deps = undef; } } //Support require(['a']) callback = callback || function () {}; //If relName is a function, it is an errback handler, //so remove it. if (typeof relName === 'function') { relName = forceSync; forceSync = alt; } //Simulate async callback; if (forceSync) { main(undef, deps, callback, relName); } else { //Using a non-zero value because of concern for what old browsers //do, and latest browsers "upgrade" to 4 if lower value is used: //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: //If want a value immediately, use require('id') instead -- something //that works in almond on the global level, but not guaranteed and //unlikely to work in other AMD implementations. setTimeout(function () { main(undef, deps, callback, relName); }, 4); } return req; }; /** * Just drops the config on the floor, but returns req in case * the config return value is used. */ req.config = function (cfg) { return req(cfg); }; /** * Expose module registry for debugging and tooling */ requirejs._defined = defined; define = function (name, deps, callback) { if (typeof name !== 'string') { throw new Error('See almond README: incorrect module build, no module name'); } //This module may not have dependencies if (!deps.splice) { //deps is not an array, so probably means //an object literal or factory function for //the value. Adjust args. callback = deps; deps = []; } if (!hasProp(defined, name) && !hasProp(waiting, name)) { waiting[name] = [name, deps, callback]; } }; define.amd = { jQuery: true }; }()); S2.requirejs = requirejs;S2.require = require;S2.define = define; } }()); S2.define("almond", function(){}); /* global jQuery:false, $:false */ S2.define('jquery',[],function () { var _$ = jQuery || $; if (_$ == null && console && console.error) { console.error( 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + 'found. Make sure that you are including jQuery before Select2 on your ' + 'web page.' ); } return _$; }); S2.define('select2/utils',[ 'jquery' ], function ($) { var Utils = {}; Utils.Extend = function (ChildClass, SuperClass) { var __hasProp = {}.hasOwnProperty; function BaseConstructor () { this.constructor = ChildClass; } for (var key in SuperClass) { if (__hasProp.call(SuperClass, key)) { ChildClass[key] = SuperClass[key]; } } BaseConstructor.prototype = SuperClass.prototype; ChildClass.prototype = new BaseConstructor(); ChildClass.__super__ = SuperClass.prototype; return ChildClass; }; function getMethods (theClass) { var proto = theClass.prototype; var methods = []; for (var methodName in proto) { var m = proto[methodName]; if (typeof m !== 'function') { continue; } if (methodName === 'constructor') { continue; } methods.push(methodName); } return methods; } Utils.Decorate = function (SuperClass, DecoratorClass) { var decoratedMethods = getMethods(DecoratorClass); var superMethods = getMethods(SuperClass); function DecoratedClass () { var unshift = Array.prototype.unshift; var argCount = DecoratorClass.prototype.constructor.length; var calledConstructor = SuperClass.prototype.constructor; if (argCount > 0) { unshift.call(arguments, SuperClass.prototype.constructor); calledConstructor = DecoratorClass.prototype.constructor; } calledConstructor.apply(this, arguments); } DecoratorClass.displayName = SuperClass.displayName; function ctr () { this.constructor = DecoratedClass; } DecoratedClass.prototype = new ctr(); for (var m = 0; m < superMethods.length; m++) { var superMethod = superMethods[m]; DecoratedClass.prototype[superMethod] = SuperClass.prototype[superMethod]; } var calledMethod = function (methodName) { // Stub out the original method if it's not decorating an actual method var originalMethod = function () {}; if (methodName in DecoratedClass.prototype) { originalMethod = DecoratedClass.prototype[methodName]; } var decoratedMethod = DecoratorClass.prototype[methodName]; return function () { var unshift = Array.prototype.unshift; unshift.call(arguments, originalMethod); return decoratedMethod.apply(this, arguments); }; }; for (var d = 0; d < decoratedMethods.length; d++) { var decoratedMethod = decoratedMethods[d]; DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); } return DecoratedClass; }; var Observable = function () { this.listeners = {}; }; Observable.prototype.on = function (event, callback) { this.listeners = this.listeners || {}; if (event in this.listeners) { this.listeners[event].push(callback); } else { this.listeners[event] = [callback]; } }; Observable.prototype.trigger = function (event) { var slice = Array.prototype.slice; var params = slice.call(arguments, 1); this.listeners = this.listeners || {}; // Params should always come in as an array if (params == null) { params = []; } // If there are no arguments to the event, use a temporary object if (params.length === 0) { params.push({}); } // Set the `_type` of the first object to the event params[0]._type = event; if (event in this.listeners) { this.invoke(this.listeners[event], slice.call(arguments, 1)); } if ('*' in this.listeners) { this.invoke(this.listeners['*'], arguments); } }; Observable.prototype.invoke = function (listeners, params) { for (var i = 0, len = listeners.length; i < len; i++) { listeners[i].apply(this, params); } }; Utils.Observable = Observable; Utils.generateChars = function (length) { var chars = ''; for (var i = 0; i < length; i++) { var randomChar = Math.floor(Math.random() * 36); chars += randomChar.toString(36); } return chars; }; Utils.bind = function (func, context) { return function () { func.apply(context, arguments); }; }; Utils._convertData = function (data) { for (var originalKey in data) { var keys = originalKey.split('-'); var dataLevel = data; if (keys.length === 1) { continue; } for (var k = 0; k < keys.length; k++) { var key = keys[k]; // Lowercase the first letter // By default, dash-separated becomes camelCase key = key.substring(0, 1).toLowerCase() + key.substring(1); if (!(key in dataLevel)) { dataLevel[key] = {}; } if (k == keys.length - 1) { dataLevel[key] = data[originalKey]; } dataLevel = dataLevel[key]; } delete data[originalKey]; } return data; }; Utils.hasScroll = function (index, el) { // Adapted from the function created by @ShadowScripter // and adapted by @BillBarry on the Stack Exchange Code Review website. // The original code can be found at // http://codereview.stackexchange.com/q/13338 // and was designed to be used with the Sizzle selector engine. var $el = $(el); var overflowX = el.style.overflowX; var overflowY = el.style.overflowY; //Check both x and y declarations if (overflowX === overflowY && (overflowY === 'hidden' || overflowY === 'visible')) { return false; } if (overflowX === 'scroll' || overflowY === 'scroll') { return true; } return ($el.innerHeight() < el.scrollHeight || $el.innerWidth() < el.scrollWidth); }; Utils.escapeMarkup = function (markup) { var replaceMap = { '\\': '\', '&': '&', '<': '<', '>': '>', '"': '"', '\'': ''', '/': '/' }; // Do not try to escape the markup if it's not a string if (typeof markup !== 'string') { return markup; } return String(markup).replace(/[&<>"'\/\\]/g, function (match) { return replaceMap[match]; }); }; // Append an array of jQuery nodes to a given element. Utils.appendMany = function ($element, $nodes) { // jQuery 1.7.x does not support $.fn.append() with an array // Fall back to a jQuery object collection using $.fn.add() if ($.fn.jquery.substr(0, 3) === '1.7') { var $jqNodes = $(); $.map($nodes, function (node) { $jqNodes = $jqNodes.add(node); }); $nodes = $jqNodes; } $element.append($nodes); }; // Cache objects in Utils.__cache instead of $.data (see #4346) Utils.__cache = {}; var id = 0; Utils.GetUniqueElementId = function (element) { // Get a unique element Id. If element has no id, // creates a new unique number, stores it in the id // attribute and returns the new id. // If an id already exists, it simply returns it. var select2Id = element.getAttribute('data-select2-id'); if (select2Id == null) { // If element has id, use it. if (element.id) { select2Id = element.id; element.setAttribute('data-select2-id', select2Id); } else { element.setAttribute('data-select2-id', ++id); select2Id = id.toString(); } } return select2Id; }; Utils.StoreData = function (element, name, value) { // Stores an item in the cache for a specified element. // name is the cache key. var id = Utils.GetUniqueElementId(element); if (!Utils.__cache[id]) { Utils.__cache[id] = {}; } Utils.__cache[id][name] = value; }; Utils.GetData = function (element, name) { // Retrieves a value from the cache by its key (name) // name is optional. If no name specified, return // all cache items for the specified element. // and for a specified element. var id = Utils.GetUniqueElementId(element); if (name) { if (Utils.__cache[id]) { if (Utils.__cache[id][name] != null) { return Utils.__cache[id][name]; } return $(element).data(name); // Fallback to HTML5 data attribs. } return $(element).data(name); // Fallback to HTML5 data attribs. } else { return Utils.__cache[id]; } }; Utils.RemoveData = function (element) { // Removes all cached items for a specified element. var id = Utils.GetUniqueElementId(element); if (Utils.__cache[id] != null) { delete Utils.__cache[id]; } element.removeAttribute('data-select2-id'); }; return Utils; }); S2.define('select2/results',[ 'jquery', './utils' ], function ($, Utils) { function Results ($element, options, dataAdapter) { this.$element = $element; this.data = dataAdapter; this.options = options; Results.__super__.constructor.call(this); } Utils.Extend(Results, Utils.Observable); Results.prototype.render = function () { var $results = $( '
                ' ); if (this.options.get('multiple')) { $results.attr('aria-multiselectable', 'true'); } this.$results = $results; return $results; }; Results.prototype.clear = function () { this.$results.empty(); }; Results.prototype.displayMessage = function (params) { var escapeMarkup = this.options.get('escapeMarkup'); this.clear(); this.hideLoading(); var $message = $( '' ); var message = this.options.get('translations').get(params.message); $message.append( escapeMarkup( message(params.args) ) ); $message[0].className += ' select2-results__message'; this.$results.append($message); }; Results.prototype.hideMessages = function () { this.$results.find('.select2-results__message').remove(); }; Results.prototype.append = function (data) { this.hideLoading(); var $options = []; if (data.results == null || data.results.length === 0) { if (this.$results.children().length === 0) { this.trigger('results:message', { message: 'noResults' }); } return; } data.results = this.sort(data.results); for (var d = 0; d < data.results.length; d++) { var item = data.results[d]; var $option = this.option(item); $options.push($option); } this.$results.append($options); }; Results.prototype.position = function ($results, $dropdown) { var $resultsContainer = $dropdown.find('.select2-results'); $resultsContainer.append($results); }; Results.prototype.sort = function (data) { var sorter = this.options.get('sorter'); return sorter(data); }; Results.prototype.highlightFirstItem = function () { var $options = this.$results .find('.select2-results__option[aria-selected]'); var $selected = $options.filter('[aria-selected=true]'); // Check if there are any selected options if ($selected.length > 0) { // If there are selected options, highlight the first $selected.first().trigger('mouseenter'); } else { // If there are no selected options, highlight the first option // in the dropdown $options.first().trigger('mouseenter'); } this.ensureHighlightVisible(); }; Results.prototype.setClasses = function () { var self = this; this.data.current(function (selected) { var selectedIds = $.map(selected, function (s) { return s.id.toString(); }); var $options = self.$results .find('.select2-results__option[aria-selected]'); $options.each(function () { var $option = $(this); var item = Utils.GetData(this, 'data'); // id needs to be converted to a string when comparing var id = '' + item.id; if ((item.element != null && item.element.selected) || (item.element == null && $.inArray(id, selectedIds) > -1)) { $option.attr('aria-selected', 'true'); } else { $option.attr('aria-selected', 'false'); } }); }); }; Results.prototype.showLoading = function (params) { this.hideLoading(); var loadingMore = this.options.get('translations').get('searching'); var loading = { disabled: true, loading: true, text: loadingMore(params) }; var $loading = this.option(loading); $loading.className += ' loading-results'; this.$results.prepend($loading); }; Results.prototype.hideLoading = function () { this.$results.find('.loading-results').remove(); }; Results.prototype.option = function (data) { var option = document.createElement('li'); option.className = 'select2-results__option'; var attrs = { 'role': 'option', 'aria-selected': 'false' }; var matches = window.Element.prototype.matches || window.Element.prototype.msMatchesSelector || window.Element.prototype.webkitMatchesSelector; if ((data.element != null && matches.call(data.element, ':disabled')) || (data.element == null && data.disabled)) { delete attrs['aria-selected']; attrs['aria-disabled'] = 'true'; } if (data.id == null) { delete attrs['aria-selected']; } if (data._resultId != null) { option.id = data._resultId; } if (data.title) { option.title = data.title; } if (data.children) { attrs.role = 'group'; attrs['aria-label'] = data.text; delete attrs['aria-selected']; } for (var attr in attrs) { var val = attrs[attr]; option.setAttribute(attr, val); } if (data.children) { var $option = $(option); var label = document.createElement('strong'); label.className = 'select2-results__group'; var $label = $(label); this.template(data, label); var $children = []; for (var c = 0; c < data.children.length; c++) { var child = data.children[c]; var $child = this.option(child); $children.push($child); } var $childrenContainer = $('
                  ', { 'class': 'select2-results__options select2-results__options--nested' }); $childrenContainer.append($children); $option.append(label); $option.append($childrenContainer); } else { this.template(data, option); } Utils.StoreData(option, 'data', data); return option; }; Results.prototype.bind = function (container, $container) { var self = this; var id = container.id + '-results'; this.$results.attr('id', id); container.on('results:all', function (params) { self.clear(); self.append(params.data); if (container.isOpen()) { self.setClasses(); self.highlightFirstItem(); } }); container.on('results:append', function (params) { self.append(params.data); if (container.isOpen()) { self.setClasses(); } }); container.on('query', function (params) { self.hideMessages(); self.showLoading(params); }); container.on('select', function () { if (!container.isOpen()) { return; } self.setClasses(); if (self.options.get('scrollAfterSelect')) { self.highlightFirstItem(); } }); container.on('unselect', function () { if (!container.isOpen()) { return; } self.setClasses(); if (self.options.get('scrollAfterSelect')) { self.highlightFirstItem(); } }); container.on('open', function () { // When the dropdown is open, aria-expended="true" self.$results.attr('aria-expanded', 'true'); self.$results.attr('aria-hidden', 'false'); self.setClasses(); self.ensureHighlightVisible(); }); container.on('close', function () { // When the dropdown is closed, aria-expended="false" self.$results.attr('aria-expanded', 'false'); self.$results.attr('aria-hidden', 'true'); self.$results.removeAttr('aria-activedescendant'); }); container.on('results:toggle', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } $highlighted.trigger('mouseup'); }); container.on('results:select', function () { var $highlighted = self.getHighlightedResults(); if ($highlighted.length === 0) { return; } var data = Utils.GetData($highlighted[0], 'data'); if ($highlighted.attr('aria-selected') == 'true') { self.trigger('close', {}); } else { self.trigger('select', { data: data }); } }); container.on('results:previous', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); // If we are already at the top, don't move further // If no options, currentIndex will be -1 if (currentIndex <= 0) { return; } var nextIndex = currentIndex - 1; // If none are highlighted, highlight the first if ($highlighted.length === 0) { nextIndex = 0; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top; var nextTop = $next.offset().top; var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextTop - currentOffset < 0) { self.$results.scrollTop(nextOffset); } }); container.on('results:next', function () { var $highlighted = self.getHighlightedResults(); var $options = self.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var nextIndex = currentIndex + 1; // If we are at the last option, stay there if (nextIndex >= $options.length) { return; } var $next = $options.eq(nextIndex); $next.trigger('mouseenter'); var currentOffset = self.$results.offset().top + self.$results.outerHeight(false); var nextBottom = $next.offset().top + $next.outerHeight(false); var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; if (nextIndex === 0) { self.$results.scrollTop(0); } else if (nextBottom > currentOffset) { self.$results.scrollTop(nextOffset); } }); container.on('results:focus', function (params) { params.element.addClass('select2-results__option--highlighted'); }); container.on('results:message', function (params) { self.displayMessage(params); }); if ($.fn.mousewheel) { this.$results.on('mousewheel', function (e) { var top = self.$results.scrollTop(); var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); if (isAtTop) { self.$results.scrollTop(0); e.preventDefault(); e.stopPropagation(); } else if (isAtBottom) { self.$results.scrollTop( self.$results.get(0).scrollHeight - self.$results.height() ); e.preventDefault(); e.stopPropagation(); } }); } this.$results.on('mouseup', '.select2-results__option[aria-selected]', function (evt) { var $this = $(this); var data = Utils.GetData(this, 'data'); if ($this.attr('aria-selected') === 'true') { if (self.options.get('multiple')) { self.trigger('unselect', { originalEvent: evt, data: data }); } else { self.trigger('close', {}); } return; } self.trigger('select', { originalEvent: evt, data: data }); }); this.$results.on('mouseenter', '.select2-results__option[aria-selected]', function (evt) { var data = Utils.GetData(this, 'data'); self.getHighlightedResults() .removeClass('select2-results__option--highlighted'); self.trigger('results:focus', { data: data, element: $(this) }); }); }; Results.prototype.getHighlightedResults = function () { var $highlighted = this.$results .find('.select2-results__option--highlighted'); return $highlighted; }; Results.prototype.destroy = function () { this.$results.remove(); }; Results.prototype.ensureHighlightVisible = function () { var $highlighted = this.getHighlightedResults(); if ($highlighted.length === 0) { return; } var $options = this.$results.find('[aria-selected]'); var currentIndex = $options.index($highlighted); var currentOffset = this.$results.offset().top; var nextTop = $highlighted.offset().top; var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); var offsetDelta = nextTop - currentOffset; nextOffset -= $highlighted.outerHeight(false) * 2; if (currentIndex <= 2) { this.$results.scrollTop(0); } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { this.$results.scrollTop(nextOffset); } }; Results.prototype.template = function (result, container) { var template = this.options.get('templateResult'); var escapeMarkup = this.options.get('escapeMarkup'); var content = template(result, container); if (content == null) { container.style.display = 'none'; } else if (typeof content === 'string') { container.innerHTML = escapeMarkup(content); } else { $(container).append(content); } }; return Results; }); S2.define('select2/keys',[ ], function () { var KEYS = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 }; return KEYS; }); S2.define('select2/selection/base',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function BaseSelection ($element, options) { this.$element = $element; this.options = options; BaseSelection.__super__.constructor.call(this); } Utils.Extend(BaseSelection, Utils.Observable); BaseSelection.prototype.render = function () { var $selection = $( '' ); this._tabindex = 0; if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); } else if (this.$element.attr('tabindex') != null) { this._tabindex = this.$element.attr('tabindex'); } $selection.attr('title', this.$element.attr('title')); $selection.attr('tabindex', this._tabindex); $selection.attr('aria-disabled', 'false'); this.$selection = $selection; return $selection; }; BaseSelection.prototype.bind = function (container, $container) { var self = this; var resultsId = container.id + '-results'; this.container = container; this.$selection.on('focus', function (evt) { self.trigger('focus', evt); }); this.$selection.on('blur', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', function (evt) { self.trigger('keypress', evt); if (evt.which === KEYS.SPACE) { evt.preventDefault(); } }); container.on('results:focus', function (params) { self.$selection.attr('aria-activedescendant', params.data._resultId); }); container.on('selection:update', function (params) { self.update(params.data); }); container.on('open', function () { // When the dropdown is open, aria-expanded="true" self.$selection.attr('aria-expanded', 'true'); self.$selection.attr('aria-owns', resultsId); self._attachCloseHandler(container); }); container.on('close', function () { // When the dropdown is closed, aria-expanded="false" self.$selection.attr('aria-expanded', 'false'); self.$selection.removeAttr('aria-activedescendant'); self.$selection.removeAttr('aria-owns'); self.$selection.trigger('focus'); self._detachCloseHandler(container); }); container.on('enable', function () { self.$selection.attr('tabindex', self._tabindex); self.$selection.attr('aria-disabled', 'false'); }); container.on('disable', function () { self.$selection.attr('tabindex', '-1'); self.$selection.attr('aria-disabled', 'true'); }); }; BaseSelection.prototype._handleBlur = function (evt) { var self = this; // This needs to be delayed as the active element is the body when the tab // key is pressed, possibly along with others. window.setTimeout(function () { // Don't trigger `blur` if the focus is still in the selection if ( (document.activeElement == self.$selection[0]) || ($.contains(self.$selection[0], document.activeElement)) ) { return; } self.trigger('blur', evt); }, 1); }; BaseSelection.prototype._attachCloseHandler = function (container) { $(document.body).on('mousedown.select2.' + container.id, function (e) { var $target = $(e.target); var $select = $target.closest('.select2'); var $all = $('.select2.select2-container--open'); $all.each(function () { if (this == $select[0]) { return; } var $element = Utils.GetData(this, 'element'); $element.select2('close'); }); }); }; BaseSelection.prototype._detachCloseHandler = function (container) { $(document.body).off('mousedown.select2.' + container.id); }; BaseSelection.prototype.position = function ($selection, $container) { var $selectionContainer = $container.find('.selection'); $selectionContainer.append($selection); }; BaseSelection.prototype.destroy = function () { this._detachCloseHandler(this.container); }; BaseSelection.prototype.update = function (data) { throw new Error('The `update` method must be defined in child classes.'); }; /** * Helper method to abstract the "enabled" (not "disabled") state of this * object. * * @return {true} if the instance is not disabled. * @return {false} if the instance is disabled. */ BaseSelection.prototype.isEnabled = function () { return !this.isDisabled(); }; /** * Helper method to abstract the "disabled" state of this object. * * @return {true} if the disabled option is true. * @return {false} if the disabled option is false. */ BaseSelection.prototype.isDisabled = function () { return this.options.get('disabled'); }; return BaseSelection; }); S2.define('select2/selection/single',[ 'jquery', './base', '../utils', '../keys' ], function ($, BaseSelection, Utils, KEYS) { function SingleSelection () { SingleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(SingleSelection, BaseSelection); SingleSelection.prototype.render = function () { var $selection = SingleSelection.__super__.render.call(this); $selection.addClass('select2-selection--single'); $selection.html( '' + '' + '' + '' ); return $selection; }; SingleSelection.prototype.bind = function (container, $container) { var self = this; SingleSelection.__super__.bind.apply(this, arguments); var id = container.id + '-container'; this.$selection.find('.select2-selection__rendered') .attr('id', id) .attr('role', 'textbox') .attr('aria-readonly', 'true'); this.$selection.attr('aria-labelledby', id); this.$selection.on('mousedown', function (evt) { // Only respond to left clicks if (evt.which !== 1) { return; } self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on('focus', function (evt) { // User focuses on the container }); this.$selection.on('blur', function (evt) { // User exits the container }); container.on('focus', function (evt) { if (!container.isOpen()) { self.$selection.trigger('focus'); } }); }; SingleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); // clear tooltip on empty }; SingleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; SingleSelection.prototype.selectionContainer = function () { return $(''); }; SingleSelection.prototype.update = function (data) { if (data.length === 0) { this.clear(); return; } var selection = data[0]; var $rendered = this.$selection.find('.select2-selection__rendered'); var formatted = this.display(selection, $rendered); $rendered.empty().append(formatted); var title = selection.title || selection.text; if (title) { $rendered.attr('title', title); } else { $rendered.removeAttr('title'); } }; return SingleSelection; }); S2.define('select2/selection/multiple',[ 'jquery', './base', '../utils' ], function ($, BaseSelection, Utils) { function MultipleSelection ($element, options) { MultipleSelection.__super__.constructor.apply(this, arguments); } Utils.Extend(MultipleSelection, BaseSelection); MultipleSelection.prototype.render = function () { var $selection = MultipleSelection.__super__.render.call(this); $selection.addClass('select2-selection--multiple'); $selection.html( '
                    ' ); return $selection; }; MultipleSelection.prototype.bind = function (container, $container) { var self = this; MultipleSelection.__super__.bind.apply(this, arguments); this.$selection.on('click', function (evt) { self.trigger('toggle', { originalEvent: evt }); }); this.$selection.on( 'click', '.select2-selection__choice__remove', function (evt) { // Ignore the event if it is disabled if (self.isDisabled()) { return; } var $remove = $(this); var $selection = $remove.parent(); var data = Utils.GetData($selection[0], 'data'); self.trigger('unselect', { originalEvent: evt, data: data }); } ); }; MultipleSelection.prototype.clear = function () { var $rendered = this.$selection.find('.select2-selection__rendered'); $rendered.empty(); $rendered.removeAttr('title'); }; MultipleSelection.prototype.display = function (data, container) { var template = this.options.get('templateSelection'); var escapeMarkup = this.options.get('escapeMarkup'); return escapeMarkup(template(data, container)); }; MultipleSelection.prototype.selectionContainer = function () { var $container = $( '
                  • ' + '' + '×' + '' + '
                  • ' ); return $container; }; MultipleSelection.prototype.update = function (data) { this.clear(); if (data.length === 0) { return; } var $selections = []; for (var d = 0; d < data.length; d++) { var selection = data[d]; var $selection = this.selectionContainer(); var formatted = this.display(selection, $selection); $selection.append(formatted); var title = selection.title || selection.text; if (title) { $selection.attr('title', title); } Utils.StoreData($selection[0], 'data', selection); $selections.push($selection); } var $rendered = this.$selection.find('.select2-selection__rendered'); Utils.appendMany($rendered, $selections); }; return MultipleSelection; }); S2.define('select2/selection/placeholder',[ '../utils' ], function (Utils) { function Placeholder (decorated, $element, options) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options); } Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { var $placeholder = this.selectionContainer(); $placeholder.html(this.display(placeholder)); $placeholder.addClass('select2-selection__placeholder') .removeClass('select2-selection__choice'); return $placeholder; }; Placeholder.prototype.update = function (decorated, data) { var singlePlaceholder = ( data.length == 1 && data[0].id != this.placeholder.id ); var multipleSelections = data.length > 1; if (multipleSelections || singlePlaceholder) { return decorated.call(this, data); } this.clear(); var $placeholder = this.createPlaceholder(this.placeholder); this.$selection.find('.select2-selection__rendered').append($placeholder); }; return Placeholder; }); S2.define('select2/selection/allowClear',[ 'jquery', '../keys', '../utils' ], function ($, KEYS, Utils) { function AllowClear () { } AllowClear.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); if (this.placeholder == null) { if (this.options.get('debug') && window.console && console.error) { console.error( 'Select2: The `allowClear` option should be used in combination ' + 'with the `placeholder` option.' ); } } this.$selection.on('mousedown', '.select2-selection__clear', function (evt) { self._handleClear(evt); }); container.on('keypress', function (evt) { self._handleKeyboardClear(evt, container); }); }; AllowClear.prototype._handleClear = function (_, evt) { // Ignore the event if it is disabled if (this.isDisabled()) { return; } var $clear = this.$selection.find('.select2-selection__clear'); // Ignore the event if nothing has been selected if ($clear.length === 0) { return; } evt.stopPropagation(); var data = Utils.GetData($clear[0], 'data'); var previousVal = this.$element.val(); this.$element.val(this.placeholder.id); var unselectData = { data: data }; this.trigger('clear', unselectData); if (unselectData.prevented) { this.$element.val(previousVal); return; } for (var d = 0; d < data.length; d++) { unselectData = { data: data[d] }; // Trigger the `unselect` event, so people can prevent it from being // cleared. this.trigger('unselect', unselectData); // If the event was prevented, don't clear it out. if (unselectData.prevented) { this.$element.val(previousVal); return; } } this.$element.trigger('input').trigger('change'); this.trigger('toggle', {}); }; AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { if (container.isOpen()) { return; } if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { this._handleClear(evt); } }; AllowClear.prototype.update = function (decorated, data) { decorated.call(this, data); if (this.$selection.find('.select2-selection__placeholder').length > 0 || data.length === 0) { return; } var removeAll = this.options.get('translations').get('removeAllItems'); var $remove = $( '' + '×' + '' ); Utils.StoreData($remove[0], 'data', data); this.$selection.find('.select2-selection__rendered').prepend($remove); }; return AllowClear; }); S2.define('select2/selection/search',[ 'jquery', '../utils', '../keys' ], function ($, Utils, KEYS) { function Search (decorated, $element, options) { decorated.call(this, $element, options); } Search.prototype.render = function (decorated) { var $search = $( '' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; decorated.call(this, container, $container); container.on('open', function () { self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); this.$selection.on('click', '.select2-search--inline', function (evt) { if (self.$search.val()) { evt.stopPropagation(); } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { this.$search.trigger('focus'); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').width(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing' ]; var preventableEvents = [ 'opening', 'closing', 'selecting', 'unselecting', 'clearing' ]; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03CE': '\u03C9', '\u03C2': '\u03C3', '\u2019': '\'' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('input').trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('input').trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('input').trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 Utils.RemoveData(this); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data Utils.StoreData(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = Utils.GetData($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (item !== Object(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.bind = function (container, $container) { ArrayAdapter.__super__.bind.call(this, container, $container); this.addOptions(this.convertToOptions(this._dataToConvert)); }; ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ('status' in $request && ($request.status === 0 || $request.status === '0')) { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.trigger('focus'); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function () { self._checkIfMaximumSelected(); }); }; MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this._checkIfMaximumSelected(function () { decorated.call(self, params, callback); }); }; MaximumSelectionLength.prototype._checkIfMaximumSelected = function (_, successCallback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } if (successCallback) { successCallback(); } }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); window.setTimeout(function () { self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); self.$search.trigger('blur'); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.trigger('focus'); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); this.loadMoreIfNeeded(); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); }; InfiniteScroll.prototype.loadMoreIfNeeded = function () { var isLoadMoreVisible = $.contains( document.documentElement, this.$loadingMore[0] ); if (this.loading || !isLoadMoreVisible) { return; } var currentOffset = this.$results.offset().top + this.$results.outerHeight(false); var loadingMoreOffset = this.$loadingMore.offset().top + this.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { this.loadMore(); } }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
                  • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); // Must bind after the results handlers to ensure correct sizing self._bindContainerResultHandlers(container); }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._bindContainerResultHandlers = function (decorated, container) { // These should only be bound once if (this._containerResultsHandlersBound) { return; } var self = this; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:message', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('select', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('unselect', function () { self._positionDropdown(); self._resizeDropdown(); }); this._containerResultsHandlersBound = true; }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = { top: 0, left: 0 }; if ( $.contains(document.body, $offsetParent[0]) || $offsetParent[0].isConnected ) { parentOffset = $offsetParent.offset(); } css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ '../utils' ], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; }, removeAllItems: function () { return 'Remove all items'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } // If the defaults were not previously applied from an element, it is // possible for the language option to have not been resolved options.language = this._resolveLanguage(options.language); // Always fall back to English since it will always be complete options.language.push('en'); var uniqueLanguages = []; for (var l = 0; l < options.language.length; l++) { var language = options.language[l]; if (uniqueLanguages.indexOf(language) === -1) { uniqueLanguages.push(language); } } options.language = uniqueLanguages; options.translations = this._processTranslations( options.language, options.debug ); return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, scrollAfterSelect: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.applyFromElement = function (options, $element) { var optionLanguage = options.language; var defaultLanguage = this.defaults.language; var elementLanguage = $element.prop('lang'); var parentLanguage = $element.closest('[lang]').prop('lang'); var languages = Array.prototype.concat.call( this._resolveLanguage(elementLanguage), this._resolveLanguage(optionLanguage), this._resolveLanguage(defaultLanguage), this._resolveLanguage(parentLanguage) ); options.language = languages; return options; }; Defaults.prototype._resolveLanguage = function (language) { if (!language) { return []; } if ($.isEmptyObject(language)) { return []; } if ($.isPlainObject(language)) { return [language]; } var languages; if (!$.isArray(language)) { languages = [language]; } else { languages = language; } var resolvedLanguages = []; for (var l = 0; l < languages.length; l++) { resolvedLanguages.push(languages[l]); if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { // Extract the region information if it is included var languageParts = languages[l].split('-'); var baseLanguage = languageParts[0]; resolvedLanguages.push(baseLanguage); } } return resolvedLanguages; }; Defaults.prototype._processTranslations = function (languages, debug) { var translations = new Translation(); for (var l = 0; l < languages.length; l++) { var languageData = new Translation(); var language = languages[l]; if (typeof language === 'string') { try { // Try to load it with the original name languageData = Translation.loadPath(language); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path language = this.defaults.amdLanguageBase + language; languageData = Translation.loadPath(language); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files if (debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + language + '" could ' + 'not be automatically loaded. A fallback will be used instead.' ); } } } } else if ($.isPlainObject(language)) { languageData = new Translation(language); } else { languageData = language; } translations.extend(languageData); } return translations; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } if ($element != null) { this.options = Defaults.applyFromElement(this.options, $element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); Utils.StoreData($e[0], 'tags', true); } if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; function upperCaseLetter(_, letter) { return letter.toUpperCase(); } // Pre-load all of the attributes which are prefixed with `data-` for (var attr = 0; attr < $e[0].attributes.length; attr++) { var attributeName = $e[0].attributes[attr].name; var prefix = 'data-'; if (attributeName.substr(0, prefix.length) == prefix) { // Get the contents of the attribute after `data-` var dataName = attributeName.substring(prefix.length); // Get the data contents from the consistent source // This is more than likely the jQuery data helper var dataValue = Utils.GetData($e[0], dataName); // camelCase the attribute name to match the spec var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); // Store the data attribute contents into the dataset since dataset[camelDataName] = dataValue; } } // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, dataset); } // Prefer our internal data cache if it exists var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if (Utils.GetData($element[0], 'select2') != null) { Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } if (method == 'computedstyle') { var computedStyle = window.getComputedStyle($element[0]); return computedStyle.width; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._syncA); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { self._syncA(); self._syncS(null, mutations); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener( 'DOMAttrModified', self._syncA, false ); this.$element[0].addEventListener( 'DOMNodeInserted', self._syncS, false ); this.$element[0].addEventListener( 'DOMNodeRemoved', self._syncS, false ); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.isDisabled()) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._isChangeMutation = function (evt, mutations) { var changed = false; var self = this; // Ignore any mutation events raised for elements that aren't options or // optgroups. This handles the case when the select element is destroyed if ( evt && evt.target && ( evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' ) ) { return; } if (!mutations) { // If mutation events aren't supported, then we can only assume that the // change affected the selections changed = true; } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { changed = true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; } else if ($.isArray(mutations)) { $.each(mutations, function(evt, mutation) { if (self._isChangeMutation(evt, mutation)) { // We've found a change mutation. // Let's escape from the loop and continue changed = true; return false; } }); } return changed; }; Select2.prototype._syncSubtree = function (evt, mutations) { var changed = this._isChangeMutation(evt, mutations); var self = this; // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting', 'clear': 'clearing' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.isDisabled()) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } if (this.isDisabled()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } this.trigger('close', { originalEvent : evt }); }; /** * Helper method to abstract the "enabled" (not "disabled") state of this * object. * * @return {true} if the instance is not disabled. * @return {false} if the instance is disabled. */ Select2.prototype.isEnabled = function () { return !this.isDisabled(); }; /** * Helper method to abstract the "disabled" state of this object. * * @return {true} if the disabled option is true. * @return {false} if the disabled option is false. */ Select2.prototype.isDisabled = function () { return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._syncA); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._syncA, false); this.$element[0] .removeEventListener('DOMNodeInserted', this._syncS, false); this.$element[0] .removeEventListener('DOMNodeRemoved', this._syncS, false); } this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); Utils.StoreData($container[0], 'element', this.$element); return $container; }; return Select2; }); S2.define('select2/compat/utils',[ 'jquery' ], function ($) { function syncCssClasses ($dest, $src, adapter) { var classes, replacements = [], adapted; classes = $.trim($dest.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Save all Select2 classes if (this.indexOf('select2-') === 0) { replacements.push(this); } }); } classes = $.trim($src.attr('class')); if (classes) { classes = '' + classes; // for IE which returns object $(classes.split(/\s+/)).each(function () { // Only adapt non-Select2 classes if (this.indexOf('select2-') !== 0) { adapted = adapter(this); if (adapted != null) { replacements.push(adapted); } } }); } $dest.attr('class', replacements.join(' ')); } return { syncCssClasses: syncCssClasses }; }); S2.define('select2/compat/containerCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _containerAdapter (clazz) { return null; } function ContainerCSS () { } ContainerCSS.prototype.render = function (decorated) { var $container = decorated.call(this); var containerCssClass = this.options.get('containerCssClass') || ''; if ($.isFunction(containerCssClass)) { containerCssClass = containerCssClass(this.$element); } var containerCssAdapter = this.options.get('adaptContainerCssClass'); containerCssAdapter = containerCssAdapter || _containerAdapter; if (containerCssClass.indexOf(':all:') !== -1) { containerCssClass = containerCssClass.replace(':all:', ''); var _cssAdapter = containerCssAdapter; containerCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var containerCss = this.options.get('containerCss') || {}; if ($.isFunction(containerCss)) { containerCss = containerCss(this.$element); } CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); $container.css(containerCss); $container.addClass(containerCssClass); return $container; }; return ContainerCSS; }); S2.define('select2/compat/dropdownCss',[ 'jquery', './utils' ], function ($, CompatUtils) { // No-op CSS adapter that discards all classes by default function _dropdownAdapter (clazz) { return null; } function DropdownCSS () { } DropdownCSS.prototype.render = function (decorated) { var $dropdown = decorated.call(this); var dropdownCssClass = this.options.get('dropdownCssClass') || ''; if ($.isFunction(dropdownCssClass)) { dropdownCssClass = dropdownCssClass(this.$element); } var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; if (dropdownCssClass.indexOf(':all:') !== -1) { dropdownCssClass = dropdownCssClass.replace(':all:', ''); var _cssAdapter = dropdownCssAdapter; dropdownCssAdapter = function (clazz) { var adapted = _cssAdapter(clazz); if (adapted != null) { // Append the old one along with the adapted one return adapted + ' ' + clazz; } return clazz; }; } var dropdownCss = this.options.get('dropdownCss') || {}; if ($.isFunction(dropdownCss)) { dropdownCss = dropdownCss(this.$element); } CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); $dropdown.css(dropdownCss); $dropdown.addClass(dropdownCssClass); return $dropdown; }; return DropdownCSS; }); S2.define('select2/compat/initSelection',[ 'jquery' ], function ($) { function InitSelection (decorated, $element, options) { if (options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `initSelection` option has been deprecated in favor' + ' of a custom data adapter that overrides the `current` method. ' + 'This method is now called multiple times instead of a single ' + 'time when the instance is initialized. Support will be removed ' + 'for the `initSelection` option in future versions of Select2' ); } this.initSelection = options.get('initSelection'); this._isInitialized = false; decorated.call(this, $element, options); } InitSelection.prototype.current = function (decorated, callback) { var self = this; if (this._isInitialized) { decorated.call(this, callback); return; } this.initSelection.call(null, this.$element, function (data) { self._isInitialized = true; if (!$.isArray(data)) { data = [data]; } callback(data); }); }; return InitSelection; }); S2.define('select2/compat/inputData',[ 'jquery', '../utils' ], function ($, Utils) { function InputData (decorated, $element, options) { this._currentData = []; this._valueSeparator = options.get('valueSeparator') || ','; if ($element.prop('type') === 'hidden') { if (options.get('debug') && console && console.warn) { console.warn( 'Select2: Using a hidden input with Select2 is no longer ' + 'supported and may stop working in the future. It is recommended ' + 'to use a `');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
                  • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); var $rendered = decorated.call(this); this._transferTabIndex(); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; decorated.call(this, container, $container); container.on('open', function () { self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); }); container.on('close', function () { self.$search.val(''); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.trigger('focus'); }); container.on('enable', function () { self.$search.prop('disabled', false); self._transferTabIndex(); }); container.on('disable', function () { self.$search.prop('disabled', true); }); container.on('focus', function (evt) { self.$search.trigger('focus'); }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); this.$selection.on('focusin', '.select2-search--inline', function (evt) { self.trigger('focus', evt); }); this.$selection.on('focusout', '.select2-search--inline', function (evt) { self._handleBlur(evt); }); this.$selection.on('keydown', '.select2-search--inline', function (evt) { evt.stopPropagation(); self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); var key = evt.which; if (key === KEYS.BACKSPACE && self.$search.val() === '') { var $previousChoice = self.$searchContainer .prev('.select2-selection__choice'); if ($previousChoice.length > 0) { var item = Utils.GetData($previousChoice[0], 'data'); self.searchRemoveChoice(item); evt.preventDefault(); } } }); this.$selection.on('click', '.select2-search--inline', function (evt) { if (self.$search.val()) { evt.stopPropagation(); } }); // Try to detect the IE version should the `documentMode` property that // is stored on the document. This is only implemented in IE and is // slightly cleaner than doing a user agent check. // This property is not available in Edge, but Edge also doesn't have // this bug. var msie = document.documentMode; var disableInputEvents = msie && msie <= 11; // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$selection.on( 'input.searchcheck', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents) { self.$selection.off('input.search input.searchcheck'); return; } // Unbind the duplicated `keyup` event self.$selection.off('keyup.search'); } ); this.$selection.on( 'keyup.search input.search', '.select2-search--inline', function (evt) { // IE will trigger the `input` event when a placeholder is used on a // search box. To get around this issue, we are forced to ignore all // `input` events in IE and keep using `keyup`. if (disableInputEvents && evt.type === 'input') { self.$selection.off('input.search input.searchcheck'); return; } var key = evt.which; // We can freely ignore events from modifier keys if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { return; } // Tabbing will be handled during the `keydown` phase if (key == KEYS.TAB) { return; } self.handleSearch(evt); } ); }; /** * This method will transfer the tabindex attribute from the rendered * selection to the search box. This allows for the search box to be used as * the primary focus instead of the selection container. * * @private */ Search.prototype._transferTabIndex = function (decorated) { this.$search.attr('tabindex', this.$selection.attr('tabindex')); this.$selection.attr('tabindex', '-1'); }; Search.prototype.createPlaceholder = function (decorated, placeholder) { this.$search.attr('placeholder', placeholder.text); }; Search.prototype.update = function (decorated, data) { var searchHadFocus = this.$search[0] == document.activeElement; this.$search.attr('placeholder', ''); decorated.call(this, data); this.$selection.find('.select2-selection__rendered') .append(this.$searchContainer); this.resizeSearch(); if (searchHadFocus) { this.$search.trigger('focus'); } }; Search.prototype.handleSearch = function () { this.resizeSearch(); if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.searchRemoveChoice = function (decorated, item) { this.trigger('unselect', { data: item }); this.$search.val(item.text); this.handleSearch(); }; Search.prototype.resizeSearch = function () { this.$search.css('width', '25px'); var width = ''; if (this.$search.attr('placeholder') !== '') { width = this.$selection.find('.select2-selection__rendered').width(); } else { var minimumWidth = this.$search.val().length + 1; width = (minimumWidth * 0.75) + 'em'; } this.$search.css('width', width); }; return Search; }); S2.define('select2/selection/eventRelay',[ 'jquery' ], function ($) { function EventRelay () { } EventRelay.prototype.bind = function (decorated, container, $container) { var self = this; var relayEvents = [ 'open', 'opening', 'close', 'closing', 'select', 'selecting', 'unselect', 'unselecting', 'clear', 'clearing' ]; var preventableEvents = [ 'opening', 'closing', 'selecting', 'unselecting', 'clearing' ]; decorated.call(this, container, $container); container.on('*', function (name, params) { // Ignore events that should not be relayed if ($.inArray(name, relayEvents) === -1) { return; } // The parameters should always be an object params = params || {}; // Generate the jQuery event for the Select2 event var evt = $.Event('select2:' + name, { params: params }); self.$element.trigger(evt); // Only handle preventable events if it was one if ($.inArray(name, preventableEvents) === -1) { return; } params.prevented = evt.isDefaultPrevented(); }); }; return EventRelay; }); S2.define('select2/translation',[ 'jquery', 'require' ], function ($, require) { function Translation (dict) { this.dict = dict || {}; } Translation.prototype.all = function () { return this.dict; }; Translation.prototype.get = function (key) { return this.dict[key]; }; Translation.prototype.extend = function (translation) { this.dict = $.extend({}, translation.all(), this.dict); }; // Static functions Translation._cache = {}; Translation.loadPath = function (path) { if (!(path in Translation._cache)) { var translations = require(path); Translation._cache[path] = translations; } return new Translation(Translation._cache[path]); }; return Translation; }); S2.define('select2/diacritics',[ ], function () { var diacritics = { '\u24B6': 'A', '\uFF21': 'A', '\u00C0': 'A', '\u00C1': 'A', '\u00C2': 'A', '\u1EA6': 'A', '\u1EA4': 'A', '\u1EAA': 'A', '\u1EA8': 'A', '\u00C3': 'A', '\u0100': 'A', '\u0102': 'A', '\u1EB0': 'A', '\u1EAE': 'A', '\u1EB4': 'A', '\u1EB2': 'A', '\u0226': 'A', '\u01E0': 'A', '\u00C4': 'A', '\u01DE': 'A', '\u1EA2': 'A', '\u00C5': 'A', '\u01FA': 'A', '\u01CD': 'A', '\u0200': 'A', '\u0202': 'A', '\u1EA0': 'A', '\u1EAC': 'A', '\u1EB6': 'A', '\u1E00': 'A', '\u0104': 'A', '\u023A': 'A', '\u2C6F': 'A', '\uA732': 'AA', '\u00C6': 'AE', '\u01FC': 'AE', '\u01E2': 'AE', '\uA734': 'AO', '\uA736': 'AU', '\uA738': 'AV', '\uA73A': 'AV', '\uA73C': 'AY', '\u24B7': 'B', '\uFF22': 'B', '\u1E02': 'B', '\u1E04': 'B', '\u1E06': 'B', '\u0243': 'B', '\u0182': 'B', '\u0181': 'B', '\u24B8': 'C', '\uFF23': 'C', '\u0106': 'C', '\u0108': 'C', '\u010A': 'C', '\u010C': 'C', '\u00C7': 'C', '\u1E08': 'C', '\u0187': 'C', '\u023B': 'C', '\uA73E': 'C', '\u24B9': 'D', '\uFF24': 'D', '\u1E0A': 'D', '\u010E': 'D', '\u1E0C': 'D', '\u1E10': 'D', '\u1E12': 'D', '\u1E0E': 'D', '\u0110': 'D', '\u018B': 'D', '\u018A': 'D', '\u0189': 'D', '\uA779': 'D', '\u01F1': 'DZ', '\u01C4': 'DZ', '\u01F2': 'Dz', '\u01C5': 'Dz', '\u24BA': 'E', '\uFF25': 'E', '\u00C8': 'E', '\u00C9': 'E', '\u00CA': 'E', '\u1EC0': 'E', '\u1EBE': 'E', '\u1EC4': 'E', '\u1EC2': 'E', '\u1EBC': 'E', '\u0112': 'E', '\u1E14': 'E', '\u1E16': 'E', '\u0114': 'E', '\u0116': 'E', '\u00CB': 'E', '\u1EBA': 'E', '\u011A': 'E', '\u0204': 'E', '\u0206': 'E', '\u1EB8': 'E', '\u1EC6': 'E', '\u0228': 'E', '\u1E1C': 'E', '\u0118': 'E', '\u1E18': 'E', '\u1E1A': 'E', '\u0190': 'E', '\u018E': 'E', '\u24BB': 'F', '\uFF26': 'F', '\u1E1E': 'F', '\u0191': 'F', '\uA77B': 'F', '\u24BC': 'G', '\uFF27': 'G', '\u01F4': 'G', '\u011C': 'G', '\u1E20': 'G', '\u011E': 'G', '\u0120': 'G', '\u01E6': 'G', '\u0122': 'G', '\u01E4': 'G', '\u0193': 'G', '\uA7A0': 'G', '\uA77D': 'G', '\uA77E': 'G', '\u24BD': 'H', '\uFF28': 'H', '\u0124': 'H', '\u1E22': 'H', '\u1E26': 'H', '\u021E': 'H', '\u1E24': 'H', '\u1E28': 'H', '\u1E2A': 'H', '\u0126': 'H', '\u2C67': 'H', '\u2C75': 'H', '\uA78D': 'H', '\u24BE': 'I', '\uFF29': 'I', '\u00CC': 'I', '\u00CD': 'I', '\u00CE': 'I', '\u0128': 'I', '\u012A': 'I', '\u012C': 'I', '\u0130': 'I', '\u00CF': 'I', '\u1E2E': 'I', '\u1EC8': 'I', '\u01CF': 'I', '\u0208': 'I', '\u020A': 'I', '\u1ECA': 'I', '\u012E': 'I', '\u1E2C': 'I', '\u0197': 'I', '\u24BF': 'J', '\uFF2A': 'J', '\u0134': 'J', '\u0248': 'J', '\u24C0': 'K', '\uFF2B': 'K', '\u1E30': 'K', '\u01E8': 'K', '\u1E32': 'K', '\u0136': 'K', '\u1E34': 'K', '\u0198': 'K', '\u2C69': 'K', '\uA740': 'K', '\uA742': 'K', '\uA744': 'K', '\uA7A2': 'K', '\u24C1': 'L', '\uFF2C': 'L', '\u013F': 'L', '\u0139': 'L', '\u013D': 'L', '\u1E36': 'L', '\u1E38': 'L', '\u013B': 'L', '\u1E3C': 'L', '\u1E3A': 'L', '\u0141': 'L', '\u023D': 'L', '\u2C62': 'L', '\u2C60': 'L', '\uA748': 'L', '\uA746': 'L', '\uA780': 'L', '\u01C7': 'LJ', '\u01C8': 'Lj', '\u24C2': 'M', '\uFF2D': 'M', '\u1E3E': 'M', '\u1E40': 'M', '\u1E42': 'M', '\u2C6E': 'M', '\u019C': 'M', '\u24C3': 'N', '\uFF2E': 'N', '\u01F8': 'N', '\u0143': 'N', '\u00D1': 'N', '\u1E44': 'N', '\u0147': 'N', '\u1E46': 'N', '\u0145': 'N', '\u1E4A': 'N', '\u1E48': 'N', '\u0220': 'N', '\u019D': 'N', '\uA790': 'N', '\uA7A4': 'N', '\u01CA': 'NJ', '\u01CB': 'Nj', '\u24C4': 'O', '\uFF2F': 'O', '\u00D2': 'O', '\u00D3': 'O', '\u00D4': 'O', '\u1ED2': 'O', '\u1ED0': 'O', '\u1ED6': 'O', '\u1ED4': 'O', '\u00D5': 'O', '\u1E4C': 'O', '\u022C': 'O', '\u1E4E': 'O', '\u014C': 'O', '\u1E50': 'O', '\u1E52': 'O', '\u014E': 'O', '\u022E': 'O', '\u0230': 'O', '\u00D6': 'O', '\u022A': 'O', '\u1ECE': 'O', '\u0150': 'O', '\u01D1': 'O', '\u020C': 'O', '\u020E': 'O', '\u01A0': 'O', '\u1EDC': 'O', '\u1EDA': 'O', '\u1EE0': 'O', '\u1EDE': 'O', '\u1EE2': 'O', '\u1ECC': 'O', '\u1ED8': 'O', '\u01EA': 'O', '\u01EC': 'O', '\u00D8': 'O', '\u01FE': 'O', '\u0186': 'O', '\u019F': 'O', '\uA74A': 'O', '\uA74C': 'O', '\u0152': 'OE', '\u01A2': 'OI', '\uA74E': 'OO', '\u0222': 'OU', '\u24C5': 'P', '\uFF30': 'P', '\u1E54': 'P', '\u1E56': 'P', '\u01A4': 'P', '\u2C63': 'P', '\uA750': 'P', '\uA752': 'P', '\uA754': 'P', '\u24C6': 'Q', '\uFF31': 'Q', '\uA756': 'Q', '\uA758': 'Q', '\u024A': 'Q', '\u24C7': 'R', '\uFF32': 'R', '\u0154': 'R', '\u1E58': 'R', '\u0158': 'R', '\u0210': 'R', '\u0212': 'R', '\u1E5A': 'R', '\u1E5C': 'R', '\u0156': 'R', '\u1E5E': 'R', '\u024C': 'R', '\u2C64': 'R', '\uA75A': 'R', '\uA7A6': 'R', '\uA782': 'R', '\u24C8': 'S', '\uFF33': 'S', '\u1E9E': 'S', '\u015A': 'S', '\u1E64': 'S', '\u015C': 'S', '\u1E60': 'S', '\u0160': 'S', '\u1E66': 'S', '\u1E62': 'S', '\u1E68': 'S', '\u0218': 'S', '\u015E': 'S', '\u2C7E': 'S', '\uA7A8': 'S', '\uA784': 'S', '\u24C9': 'T', '\uFF34': 'T', '\u1E6A': 'T', '\u0164': 'T', '\u1E6C': 'T', '\u021A': 'T', '\u0162': 'T', '\u1E70': 'T', '\u1E6E': 'T', '\u0166': 'T', '\u01AC': 'T', '\u01AE': 'T', '\u023E': 'T', '\uA786': 'T', '\uA728': 'TZ', '\u24CA': 'U', '\uFF35': 'U', '\u00D9': 'U', '\u00DA': 'U', '\u00DB': 'U', '\u0168': 'U', '\u1E78': 'U', '\u016A': 'U', '\u1E7A': 'U', '\u016C': 'U', '\u00DC': 'U', '\u01DB': 'U', '\u01D7': 'U', '\u01D5': 'U', '\u01D9': 'U', '\u1EE6': 'U', '\u016E': 'U', '\u0170': 'U', '\u01D3': 'U', '\u0214': 'U', '\u0216': 'U', '\u01AF': 'U', '\u1EEA': 'U', '\u1EE8': 'U', '\u1EEE': 'U', '\u1EEC': 'U', '\u1EF0': 'U', '\u1EE4': 'U', '\u1E72': 'U', '\u0172': 'U', '\u1E76': 'U', '\u1E74': 'U', '\u0244': 'U', '\u24CB': 'V', '\uFF36': 'V', '\u1E7C': 'V', '\u1E7E': 'V', '\u01B2': 'V', '\uA75E': 'V', '\u0245': 'V', '\uA760': 'VY', '\u24CC': 'W', '\uFF37': 'W', '\u1E80': 'W', '\u1E82': 'W', '\u0174': 'W', '\u1E86': 'W', '\u1E84': 'W', '\u1E88': 'W', '\u2C72': 'W', '\u24CD': 'X', '\uFF38': 'X', '\u1E8A': 'X', '\u1E8C': 'X', '\u24CE': 'Y', '\uFF39': 'Y', '\u1EF2': 'Y', '\u00DD': 'Y', '\u0176': 'Y', '\u1EF8': 'Y', '\u0232': 'Y', '\u1E8E': 'Y', '\u0178': 'Y', '\u1EF6': 'Y', '\u1EF4': 'Y', '\u01B3': 'Y', '\u024E': 'Y', '\u1EFE': 'Y', '\u24CF': 'Z', '\uFF3A': 'Z', '\u0179': 'Z', '\u1E90': 'Z', '\u017B': 'Z', '\u017D': 'Z', '\u1E92': 'Z', '\u1E94': 'Z', '\u01B5': 'Z', '\u0224': 'Z', '\u2C7F': 'Z', '\u2C6B': 'Z', '\uA762': 'Z', '\u24D0': 'a', '\uFF41': 'a', '\u1E9A': 'a', '\u00E0': 'a', '\u00E1': 'a', '\u00E2': 'a', '\u1EA7': 'a', '\u1EA5': 'a', '\u1EAB': 'a', '\u1EA9': 'a', '\u00E3': 'a', '\u0101': 'a', '\u0103': 'a', '\u1EB1': 'a', '\u1EAF': 'a', '\u1EB5': 'a', '\u1EB3': 'a', '\u0227': 'a', '\u01E1': 'a', '\u00E4': 'a', '\u01DF': 'a', '\u1EA3': 'a', '\u00E5': 'a', '\u01FB': 'a', '\u01CE': 'a', '\u0201': 'a', '\u0203': 'a', '\u1EA1': 'a', '\u1EAD': 'a', '\u1EB7': 'a', '\u1E01': 'a', '\u0105': 'a', '\u2C65': 'a', '\u0250': 'a', '\uA733': 'aa', '\u00E6': 'ae', '\u01FD': 'ae', '\u01E3': 'ae', '\uA735': 'ao', '\uA737': 'au', '\uA739': 'av', '\uA73B': 'av', '\uA73D': 'ay', '\u24D1': 'b', '\uFF42': 'b', '\u1E03': 'b', '\u1E05': 'b', '\u1E07': 'b', '\u0180': 'b', '\u0183': 'b', '\u0253': 'b', '\u24D2': 'c', '\uFF43': 'c', '\u0107': 'c', '\u0109': 'c', '\u010B': 'c', '\u010D': 'c', '\u00E7': 'c', '\u1E09': 'c', '\u0188': 'c', '\u023C': 'c', '\uA73F': 'c', '\u2184': 'c', '\u24D3': 'd', '\uFF44': 'd', '\u1E0B': 'd', '\u010F': 'd', '\u1E0D': 'd', '\u1E11': 'd', '\u1E13': 'd', '\u1E0F': 'd', '\u0111': 'd', '\u018C': 'd', '\u0256': 'd', '\u0257': 'd', '\uA77A': 'd', '\u01F3': 'dz', '\u01C6': 'dz', '\u24D4': 'e', '\uFF45': 'e', '\u00E8': 'e', '\u00E9': 'e', '\u00EA': 'e', '\u1EC1': 'e', '\u1EBF': 'e', '\u1EC5': 'e', '\u1EC3': 'e', '\u1EBD': 'e', '\u0113': 'e', '\u1E15': 'e', '\u1E17': 'e', '\u0115': 'e', '\u0117': 'e', '\u00EB': 'e', '\u1EBB': 'e', '\u011B': 'e', '\u0205': 'e', '\u0207': 'e', '\u1EB9': 'e', '\u1EC7': 'e', '\u0229': 'e', '\u1E1D': 'e', '\u0119': 'e', '\u1E19': 'e', '\u1E1B': 'e', '\u0247': 'e', '\u025B': 'e', '\u01DD': 'e', '\u24D5': 'f', '\uFF46': 'f', '\u1E1F': 'f', '\u0192': 'f', '\uA77C': 'f', '\u24D6': 'g', '\uFF47': 'g', '\u01F5': 'g', '\u011D': 'g', '\u1E21': 'g', '\u011F': 'g', '\u0121': 'g', '\u01E7': 'g', '\u0123': 'g', '\u01E5': 'g', '\u0260': 'g', '\uA7A1': 'g', '\u1D79': 'g', '\uA77F': 'g', '\u24D7': 'h', '\uFF48': 'h', '\u0125': 'h', '\u1E23': 'h', '\u1E27': 'h', '\u021F': 'h', '\u1E25': 'h', '\u1E29': 'h', '\u1E2B': 'h', '\u1E96': 'h', '\u0127': 'h', '\u2C68': 'h', '\u2C76': 'h', '\u0265': 'h', '\u0195': 'hv', '\u24D8': 'i', '\uFF49': 'i', '\u00EC': 'i', '\u00ED': 'i', '\u00EE': 'i', '\u0129': 'i', '\u012B': 'i', '\u012D': 'i', '\u00EF': 'i', '\u1E2F': 'i', '\u1EC9': 'i', '\u01D0': 'i', '\u0209': 'i', '\u020B': 'i', '\u1ECB': 'i', '\u012F': 'i', '\u1E2D': 'i', '\u0268': 'i', '\u0131': 'i', '\u24D9': 'j', '\uFF4A': 'j', '\u0135': 'j', '\u01F0': 'j', '\u0249': 'j', '\u24DA': 'k', '\uFF4B': 'k', '\u1E31': 'k', '\u01E9': 'k', '\u1E33': 'k', '\u0137': 'k', '\u1E35': 'k', '\u0199': 'k', '\u2C6A': 'k', '\uA741': 'k', '\uA743': 'k', '\uA745': 'k', '\uA7A3': 'k', '\u24DB': 'l', '\uFF4C': 'l', '\u0140': 'l', '\u013A': 'l', '\u013E': 'l', '\u1E37': 'l', '\u1E39': 'l', '\u013C': 'l', '\u1E3D': 'l', '\u1E3B': 'l', '\u017F': 'l', '\u0142': 'l', '\u019A': 'l', '\u026B': 'l', '\u2C61': 'l', '\uA749': 'l', '\uA781': 'l', '\uA747': 'l', '\u01C9': 'lj', '\u24DC': 'm', '\uFF4D': 'm', '\u1E3F': 'm', '\u1E41': 'm', '\u1E43': 'm', '\u0271': 'm', '\u026F': 'm', '\u24DD': 'n', '\uFF4E': 'n', '\u01F9': 'n', '\u0144': 'n', '\u00F1': 'n', '\u1E45': 'n', '\u0148': 'n', '\u1E47': 'n', '\u0146': 'n', '\u1E4B': 'n', '\u1E49': 'n', '\u019E': 'n', '\u0272': 'n', '\u0149': 'n', '\uA791': 'n', '\uA7A5': 'n', '\u01CC': 'nj', '\u24DE': 'o', '\uFF4F': 'o', '\u00F2': 'o', '\u00F3': 'o', '\u00F4': 'o', '\u1ED3': 'o', '\u1ED1': 'o', '\u1ED7': 'o', '\u1ED5': 'o', '\u00F5': 'o', '\u1E4D': 'o', '\u022D': 'o', '\u1E4F': 'o', '\u014D': 'o', '\u1E51': 'o', '\u1E53': 'o', '\u014F': 'o', '\u022F': 'o', '\u0231': 'o', '\u00F6': 'o', '\u022B': 'o', '\u1ECF': 'o', '\u0151': 'o', '\u01D2': 'o', '\u020D': 'o', '\u020F': 'o', '\u01A1': 'o', '\u1EDD': 'o', '\u1EDB': 'o', '\u1EE1': 'o', '\u1EDF': 'o', '\u1EE3': 'o', '\u1ECD': 'o', '\u1ED9': 'o', '\u01EB': 'o', '\u01ED': 'o', '\u00F8': 'o', '\u01FF': 'o', '\u0254': 'o', '\uA74B': 'o', '\uA74D': 'o', '\u0275': 'o', '\u0153': 'oe', '\u01A3': 'oi', '\u0223': 'ou', '\uA74F': 'oo', '\u24DF': 'p', '\uFF50': 'p', '\u1E55': 'p', '\u1E57': 'p', '\u01A5': 'p', '\u1D7D': 'p', '\uA751': 'p', '\uA753': 'p', '\uA755': 'p', '\u24E0': 'q', '\uFF51': 'q', '\u024B': 'q', '\uA757': 'q', '\uA759': 'q', '\u24E1': 'r', '\uFF52': 'r', '\u0155': 'r', '\u1E59': 'r', '\u0159': 'r', '\u0211': 'r', '\u0213': 'r', '\u1E5B': 'r', '\u1E5D': 'r', '\u0157': 'r', '\u1E5F': 'r', '\u024D': 'r', '\u027D': 'r', '\uA75B': 'r', '\uA7A7': 'r', '\uA783': 'r', '\u24E2': 's', '\uFF53': 's', '\u00DF': 's', '\u015B': 's', '\u1E65': 's', '\u015D': 's', '\u1E61': 's', '\u0161': 's', '\u1E67': 's', '\u1E63': 's', '\u1E69': 's', '\u0219': 's', '\u015F': 's', '\u023F': 's', '\uA7A9': 's', '\uA785': 's', '\u1E9B': 's', '\u24E3': 't', '\uFF54': 't', '\u1E6B': 't', '\u1E97': 't', '\u0165': 't', '\u1E6D': 't', '\u021B': 't', '\u0163': 't', '\u1E71': 't', '\u1E6F': 't', '\u0167': 't', '\u01AD': 't', '\u0288': 't', '\u2C66': 't', '\uA787': 't', '\uA729': 'tz', '\u24E4': 'u', '\uFF55': 'u', '\u00F9': 'u', '\u00FA': 'u', '\u00FB': 'u', '\u0169': 'u', '\u1E79': 'u', '\u016B': 'u', '\u1E7B': 'u', '\u016D': 'u', '\u00FC': 'u', '\u01DC': 'u', '\u01D8': 'u', '\u01D6': 'u', '\u01DA': 'u', '\u1EE7': 'u', '\u016F': 'u', '\u0171': 'u', '\u01D4': 'u', '\u0215': 'u', '\u0217': 'u', '\u01B0': 'u', '\u1EEB': 'u', '\u1EE9': 'u', '\u1EEF': 'u', '\u1EED': 'u', '\u1EF1': 'u', '\u1EE5': 'u', '\u1E73': 'u', '\u0173': 'u', '\u1E77': 'u', '\u1E75': 'u', '\u0289': 'u', '\u24E5': 'v', '\uFF56': 'v', '\u1E7D': 'v', '\u1E7F': 'v', '\u028B': 'v', '\uA75F': 'v', '\u028C': 'v', '\uA761': 'vy', '\u24E6': 'w', '\uFF57': 'w', '\u1E81': 'w', '\u1E83': 'w', '\u0175': 'w', '\u1E87': 'w', '\u1E85': 'w', '\u1E98': 'w', '\u1E89': 'w', '\u2C73': 'w', '\u24E7': 'x', '\uFF58': 'x', '\u1E8B': 'x', '\u1E8D': 'x', '\u24E8': 'y', '\uFF59': 'y', '\u1EF3': 'y', '\u00FD': 'y', '\u0177': 'y', '\u1EF9': 'y', '\u0233': 'y', '\u1E8F': 'y', '\u00FF': 'y', '\u1EF7': 'y', '\u1E99': 'y', '\u1EF5': 'y', '\u01B4': 'y', '\u024F': 'y', '\u1EFF': 'y', '\u24E9': 'z', '\uFF5A': 'z', '\u017A': 'z', '\u1E91': 'z', '\u017C': 'z', '\u017E': 'z', '\u1E93': 'z', '\u1E95': 'z', '\u01B6': 'z', '\u0225': 'z', '\u0240': 'z', '\u2C6C': 'z', '\uA763': 'z', '\u0386': '\u0391', '\u0388': '\u0395', '\u0389': '\u0397', '\u038A': '\u0399', '\u03AA': '\u0399', '\u038C': '\u039F', '\u038E': '\u03A5', '\u03AB': '\u03A5', '\u038F': '\u03A9', '\u03AC': '\u03B1', '\u03AD': '\u03B5', '\u03AE': '\u03B7', '\u03AF': '\u03B9', '\u03CA': '\u03B9', '\u0390': '\u03B9', '\u03CC': '\u03BF', '\u03CD': '\u03C5', '\u03CB': '\u03C5', '\u03B0': '\u03C5', '\u03CE': '\u03C9', '\u03C2': '\u03C3', '\u2019': '\'' }; return diacritics; }); S2.define('select2/data/base',[ '../utils' ], function (Utils) { function BaseAdapter ($element, options) { BaseAdapter.__super__.constructor.call(this); } Utils.Extend(BaseAdapter, Utils.Observable); BaseAdapter.prototype.current = function (callback) { throw new Error('The `current` method must be defined in child classes.'); }; BaseAdapter.prototype.query = function (params, callback) { throw new Error('The `query` method must be defined in child classes.'); }; BaseAdapter.prototype.bind = function (container, $container) { // Can be implemented in subclasses }; BaseAdapter.prototype.destroy = function () { // Can be implemented in subclasses }; BaseAdapter.prototype.generateResultId = function (container, data) { var id = container.id + '-result-'; id += Utils.generateChars(4); if (data.id != null) { id += '-' + data.id.toString(); } else { id += '-' + Utils.generateChars(4); } return id; }; return BaseAdapter; }); S2.define('select2/data/select',[ './base', '../utils', 'jquery' ], function (BaseAdapter, Utils, $) { function SelectAdapter ($element, options) { this.$element = $element; this.options = options; SelectAdapter.__super__.constructor.call(this); } Utils.Extend(SelectAdapter, BaseAdapter); SelectAdapter.prototype.current = function (callback) { var data = []; var self = this; this.$element.find(':selected').each(function () { var $option = $(this); var option = self.item($option); data.push(option); }); callback(data); }; SelectAdapter.prototype.select = function (data) { var self = this; data.selected = true; // If data.element is a DOM node, use it instead if ($(data.element).is('option')) { data.element.selected = true; this.$element.trigger('input').trigger('change'); return; } if (this.$element.prop('multiple')) { this.current(function (currentData) { var val = []; data = [data]; data.push.apply(data, currentData); for (var d = 0; d < data.length; d++) { var id = data[d].id; if ($.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); } else { var val = data.id; this.$element.val(val); this.$element.trigger('input').trigger('change'); } }; SelectAdapter.prototype.unselect = function (data) { var self = this; if (!this.$element.prop('multiple')) { return; } data.selected = false; if ($(data.element).is('option')) { data.element.selected = false; this.$element.trigger('input').trigger('change'); return; } this.current(function (currentData) { var val = []; for (var d = 0; d < currentData.length; d++) { var id = currentData[d].id; if (id !== data.id && $.inArray(id, val) === -1) { val.push(id); } } self.$element.val(val); self.$element.trigger('input').trigger('change'); }); }; SelectAdapter.prototype.bind = function (container, $container) { var self = this; this.container = container; container.on('select', function (params) { self.select(params.data); }); container.on('unselect', function (params) { self.unselect(params.data); }); }; SelectAdapter.prototype.destroy = function () { // Remove anything added to child elements this.$element.find('*').each(function () { // Remove any custom data set by Select2 Utils.RemoveData(this); }); }; SelectAdapter.prototype.query = function (params, callback) { var data = []; var self = this; var $options = this.$element.children(); $options.each(function () { var $option = $(this); if (!$option.is('option') && !$option.is('optgroup')) { return; } var option = self.item($option); var matches = self.matches(params, option); if (matches !== null) { data.push(matches); } }); callback({ results: data }); }; SelectAdapter.prototype.addOptions = function ($options) { Utils.appendMany(this.$element, $options); }; SelectAdapter.prototype.option = function (data) { var option; if (data.children) { option = document.createElement('optgroup'); option.label = data.text; } else { option = document.createElement('option'); if (option.textContent !== undefined) { option.textContent = data.text; } else { option.innerText = data.text; } } if (data.id !== undefined) { option.value = data.id; } if (data.disabled) { option.disabled = true; } if (data.selected) { option.selected = true; } if (data.title) { option.title = data.title; } var $option = $(option); var normalizedData = this._normalizeItem(data); normalizedData.element = option; // Override the option's data with the combined data Utils.StoreData(option, 'data', normalizedData); return $option; }; SelectAdapter.prototype.item = function ($option) { var data = {}; data = Utils.GetData($option[0], 'data'); if (data != null) { return data; } if ($option.is('option')) { data = { id: $option.val(), text: $option.text(), disabled: $option.prop('disabled'), selected: $option.prop('selected'), title: $option.prop('title') }; } else if ($option.is('optgroup')) { data = { text: $option.prop('label'), children: [], title: $option.prop('title') }; var $children = $option.children('option'); var children = []; for (var c = 0; c < $children.length; c++) { var $child = $($children[c]); var child = this.item($child); children.push(child); } data.children = children; } data = this._normalizeItem(data); data.element = $option[0]; Utils.StoreData($option[0], 'data', data); return data; }; SelectAdapter.prototype._normalizeItem = function (item) { if (item !== Object(item)) { item = { id: item, text: item }; } item = $.extend({}, { text: '' }, item); var defaults = { selected: false, disabled: false }; if (item.id != null) { item.id = item.id.toString(); } if (item.text != null) { item.text = item.text.toString(); } if (item._resultId == null && item.id && this.container != null) { item._resultId = this.generateResultId(this.container, item); } return $.extend({}, defaults, item); }; SelectAdapter.prototype.matches = function (params, data) { var matcher = this.options.get('matcher'); return matcher(params, data); }; return SelectAdapter; }); S2.define('select2/data/array',[ './select', '../utils', 'jquery' ], function (SelectAdapter, Utils, $) { function ArrayAdapter ($element, options) { this._dataToConvert = options.get('data') || []; ArrayAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(ArrayAdapter, SelectAdapter); ArrayAdapter.prototype.bind = function (container, $container) { ArrayAdapter.__super__.bind.call(this, container, $container); this.addOptions(this.convertToOptions(this._dataToConvert)); }; ArrayAdapter.prototype.select = function (data) { var $option = this.$element.find('option').filter(function (i, elm) { return elm.value == data.id.toString(); }); if ($option.length === 0) { $option = this.option(data); this.addOptions($option); } ArrayAdapter.__super__.select.call(this, data); }; ArrayAdapter.prototype.convertToOptions = function (data) { var self = this; var $existing = this.$element.find('option'); var existingIds = $existing.map(function () { return self.item($(this)).id; }).get(); var $options = []; // Filter out all items except for the one passed in the argument function onlyItem (item) { return function () { return $(this).val() == item.id; }; } for (var d = 0; d < data.length; d++) { var item = this._normalizeItem(data[d]); // Skip items which were pre-loaded, only merge the data if ($.inArray(item.id, existingIds) >= 0) { var $existingOption = $existing.filter(onlyItem(item)); var existingData = this.item($existingOption); var newData = $.extend(true, {}, item, existingData); var $newOption = this.option(newData); $existingOption.replaceWith($newOption); continue; } var $option = this.option(item); if (item.children) { var $children = this.convertToOptions(item.children); Utils.appendMany($option, $children); } $options.push($option); } return $options; }; return ArrayAdapter; }); S2.define('select2/data/ajax',[ './array', '../utils', 'jquery' ], function (ArrayAdapter, Utils, $) { function AjaxAdapter ($element, options) { this.ajaxOptions = this._applyDefaults(options.get('ajax')); if (this.ajaxOptions.processResults != null) { this.processResults = this.ajaxOptions.processResults; } AjaxAdapter.__super__.constructor.call(this, $element, options); } Utils.Extend(AjaxAdapter, ArrayAdapter); AjaxAdapter.prototype._applyDefaults = function (options) { var defaults = { data: function (params) { return $.extend({}, params, { q: params.term }); }, transport: function (params, success, failure) { var $request = $.ajax(params); $request.then(success); $request.fail(failure); return $request; } }; return $.extend({}, defaults, options, true); }; AjaxAdapter.prototype.processResults = function (results) { return results; }; AjaxAdapter.prototype.query = function (params, callback) { var matches = []; var self = this; if (this._request != null) { // JSONP requests cannot always be aborted if ($.isFunction(this._request.abort)) { this._request.abort(); } this._request = null; } var options = $.extend({ type: 'GET' }, this.ajaxOptions); if (typeof options.url === 'function') { options.url = options.url.call(this.$element, params); } if (typeof options.data === 'function') { options.data = options.data.call(this.$element, params); } function request () { var $request = options.transport(options, function (data) { var results = self.processResults(data, params); if (self.options.get('debug') && window.console && console.error) { // Check to make sure that the response included a `results` key. if (!results || !results.results || !$.isArray(results.results)) { console.error( 'Select2: The AJAX results did not return an array in the ' + '`results` key of the response.' ); } } callback(results); }, function () { // Attempt to detect if a request was aborted // Only works if the transport exposes a status property if ('status' in $request && ($request.status === 0 || $request.status === '0')) { return; } self.trigger('results:message', { message: 'errorLoading' }); }); self._request = $request; } if (this.ajaxOptions.delay && params.term != null) { if (this._queryTimeout) { window.clearTimeout(this._queryTimeout); } this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); } else { request(); } }; return AjaxAdapter; }); S2.define('select2/data/tags',[ 'jquery' ], function ($) { function Tags (decorated, $element, options) { var tags = options.get('tags'); var createTag = options.get('createTag'); if (createTag !== undefined) { this.createTag = createTag; } var insertTag = options.get('insertTag'); if (insertTag !== undefined) { this.insertTag = insertTag; } decorated.call(this, $element, options); if ($.isArray(tags)) { for (var t = 0; t < tags.length; t++) { var tag = tags[t]; var item = this._normalizeItem(tag); var $option = this.option(item); this.$element.append($option); } } } Tags.prototype.query = function (decorated, params, callback) { var self = this; this._removeOldTags(); if (params.term == null || params.page != null) { decorated.call(this, params, callback); return; } function wrapper (obj, child) { var data = obj.results; for (var i = 0; i < data.length; i++) { var option = data[i]; var checkChildren = ( option.children != null && !wrapper({ results: option.children }, true) ); var optionText = (option.text || '').toUpperCase(); var paramsTerm = (params.term || '').toUpperCase(); var checkText = optionText === paramsTerm; if (checkText || checkChildren) { if (child) { return false; } obj.data = data; callback(obj); return; } } if (child) { return true; } var tag = self.createTag(params); if (tag != null) { var $option = self.option(tag); $option.attr('data-select2-tag', true); self.addOptions([$option]); self.insertTag(data, tag); } obj.results = data; callback(obj); } decorated.call(this, params, wrapper); }; Tags.prototype.createTag = function (decorated, params) { var term = $.trim(params.term); if (term === '') { return null; } return { id: term, text: term }; }; Tags.prototype.insertTag = function (_, data, tag) { data.unshift(tag); }; Tags.prototype._removeOldTags = function (_) { var $options = this.$element.find('option[data-select2-tag]'); $options.each(function () { if (this.selected) { return; } $(this).remove(); }); }; return Tags; }); S2.define('select2/data/tokenizer',[ 'jquery' ], function ($) { function Tokenizer (decorated, $element, options) { var tokenizer = options.get('tokenizer'); if (tokenizer !== undefined) { this.tokenizer = tokenizer; } decorated.call(this, $element, options); } Tokenizer.prototype.bind = function (decorated, container, $container) { decorated.call(this, container, $container); this.$search = container.dropdown.$search || container.selection.$search || $container.find('.select2-search__field'); }; Tokenizer.prototype.query = function (decorated, params, callback) { var self = this; function createAndSelect (data) { // Normalize the data object so we can use it for checks var item = self._normalizeItem(data); // Check if the data object already exists as a tag // Select it if it doesn't var $existingOptions = self.$element.find('option').filter(function () { return $(this).val() === item.id; }); // If an existing option wasn't found for it, create the option if (!$existingOptions.length) { var $option = self.option(item); $option.attr('data-select2-tag', true); self._removeOldTags(); self.addOptions([$option]); } // Select the item, now that we know there is an option for it select(item); } function select (data) { self.trigger('select', { data: data }); } params.term = params.term || ''; var tokenData = this.tokenizer(params, this.options, createAndSelect); if (tokenData.term !== params.term) { // Replace the search term if we have the search box if (this.$search.length) { this.$search.val(tokenData.term); this.$search.trigger('focus'); } params.term = tokenData.term; } decorated.call(this, params, callback); }; Tokenizer.prototype.tokenizer = function (_, params, options, callback) { var separators = options.get('tokenSeparators') || []; var term = params.term; var i = 0; var createTag = this.createTag || function (params) { return { id: params.term, text: params.term }; }; while (i < term.length) { var termChar = term[i]; if ($.inArray(termChar, separators) === -1) { i++; continue; } var part = term.substr(0, i); var partParams = $.extend({}, params, { term: part }); var data = createTag(partParams); if (data == null) { i++; continue; } callback(data); // Reset the term to not include the tokenized portion term = term.substr(i + 1) || ''; i = 0; } return { term: term }; }; return Tokenizer; }); S2.define('select2/data/minimumInputLength',[ ], function () { function MinimumInputLength (decorated, $e, options) { this.minimumInputLength = options.get('minimumInputLength'); decorated.call(this, $e, options); } MinimumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (params.term.length < this.minimumInputLength) { this.trigger('results:message', { message: 'inputTooShort', args: { minimum: this.minimumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MinimumInputLength; }); S2.define('select2/data/maximumInputLength',[ ], function () { function MaximumInputLength (decorated, $e, options) { this.maximumInputLength = options.get('maximumInputLength'); decorated.call(this, $e, options); } MaximumInputLength.prototype.query = function (decorated, params, callback) { params.term = params.term || ''; if (this.maximumInputLength > 0 && params.term.length > this.maximumInputLength) { this.trigger('results:message', { message: 'inputTooLong', args: { maximum: this.maximumInputLength, input: params.term, params: params } }); return; } decorated.call(this, params, callback); }; return MaximumInputLength; }); S2.define('select2/data/maximumSelectionLength',[ ], function (){ function MaximumSelectionLength (decorated, $e, options) { this.maximumSelectionLength = options.get('maximumSelectionLength'); decorated.call(this, $e, options); } MaximumSelectionLength.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function () { self._checkIfMaximumSelected(); }); }; MaximumSelectionLength.prototype.query = function (decorated, params, callback) { var self = this; this._checkIfMaximumSelected(function () { decorated.call(self, params, callback); }); }; MaximumSelectionLength.prototype._checkIfMaximumSelected = function (_, successCallback) { var self = this; this.current(function (currentData) { var count = currentData != null ? currentData.length : 0; if (self.maximumSelectionLength > 0 && count >= self.maximumSelectionLength) { self.trigger('results:message', { message: 'maximumSelected', args: { maximum: self.maximumSelectionLength } }); return; } if (successCallback) { successCallback(); } }); }; return MaximumSelectionLength; }); S2.define('select2/dropdown',[ 'jquery', './utils' ], function ($, Utils) { function Dropdown ($element, options) { this.$element = $element; this.options = options; Dropdown.__super__.constructor.call(this); } Utils.Extend(Dropdown, Utils.Observable); Dropdown.prototype.render = function () { var $dropdown = $( '' + '' + '' ); $dropdown.attr('dir', this.options.get('dir')); this.$dropdown = $dropdown; return $dropdown; }; Dropdown.prototype.bind = function () { // Should be implemented in subclasses }; Dropdown.prototype.position = function ($dropdown, $container) { // Should be implemented in subclasses }; Dropdown.prototype.destroy = function () { // Remove the dropdown from the DOM this.$dropdown.remove(); }; return Dropdown; }); S2.define('select2/dropdown/search',[ 'jquery', '../utils' ], function ($, Utils) { function Search () { } Search.prototype.render = function (decorated) { var $rendered = decorated.call(this); var $search = $( '' + '' + '' ); this.$searchContainer = $search; this.$search = $search.find('input'); $rendered.prepend($search); return $rendered; }; Search.prototype.bind = function (decorated, container, $container) { var self = this; var resultsId = container.id + '-results'; decorated.call(this, container, $container); this.$search.on('keydown', function (evt) { self.trigger('keypress', evt); self._keyUpPrevented = evt.isDefaultPrevented(); }); // Workaround for browsers which do not support the `input` event // This will prevent double-triggering of events for browsers which support // both the `keyup` and `input` events. this.$search.on('input', function (evt) { // Unbind the duplicated `keyup` event $(this).off('keyup'); }); this.$search.on('keyup input', function (evt) { self.handleSearch(evt); }); container.on('open', function () { self.$search.attr('tabindex', 0); self.$search.attr('aria-controls', resultsId); self.$search.trigger('focus'); window.setTimeout(function () { self.$search.trigger('focus'); }, 0); }); container.on('close', function () { self.$search.attr('tabindex', -1); self.$search.removeAttr('aria-controls'); self.$search.removeAttr('aria-activedescendant'); self.$search.val(''); self.$search.trigger('blur'); }); container.on('focus', function () { if (!container.isOpen()) { self.$search.trigger('focus'); } }); container.on('results:all', function (params) { if (params.query.term == null || params.query.term === '') { var showSearch = self.showSearch(params); if (showSearch) { self.$searchContainer.removeClass('select2-search--hide'); } else { self.$searchContainer.addClass('select2-search--hide'); } } }); container.on('results:focus', function (params) { if (params.data._resultId) { self.$search.attr('aria-activedescendant', params.data._resultId); } else { self.$search.removeAttr('aria-activedescendant'); } }); }; Search.prototype.handleSearch = function (evt) { if (!this._keyUpPrevented) { var input = this.$search.val(); this.trigger('query', { term: input }); } this._keyUpPrevented = false; }; Search.prototype.showSearch = function (_, params) { return true; }; return Search; }); S2.define('select2/dropdown/hidePlaceholder',[ ], function () { function HidePlaceholder (decorated, $element, options, dataAdapter) { this.placeholder = this.normalizePlaceholder(options.get('placeholder')); decorated.call(this, $element, options, dataAdapter); } HidePlaceholder.prototype.append = function (decorated, data) { data.results = this.removePlaceholder(data.results); decorated.call(this, data); }; HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { if (typeof placeholder === 'string') { placeholder = { id: '', text: placeholder }; } return placeholder; }; HidePlaceholder.prototype.removePlaceholder = function (_, data) { var modifiedData = data.slice(0); for (var d = data.length - 1; d >= 0; d--) { var item = data[d]; if (this.placeholder.id === item.id) { modifiedData.splice(d, 1); } } return modifiedData; }; return HidePlaceholder; }); S2.define('select2/dropdown/infiniteScroll',[ 'jquery' ], function ($) { function InfiniteScroll (decorated, $element, options, dataAdapter) { this.lastParams = {}; decorated.call(this, $element, options, dataAdapter); this.$loadingMore = this.createLoadingMore(); this.loading = false; } InfiniteScroll.prototype.append = function (decorated, data) { this.$loadingMore.remove(); this.loading = false; decorated.call(this, data); if (this.showLoadingMore(data)) { this.$results.append(this.$loadingMore); this.loadMoreIfNeeded(); } }; InfiniteScroll.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('query', function (params) { self.lastParams = params; self.loading = true; }); container.on('query:append', function (params) { self.lastParams = params; self.loading = true; }); this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); }; InfiniteScroll.prototype.loadMoreIfNeeded = function () { var isLoadMoreVisible = $.contains( document.documentElement, this.$loadingMore[0] ); if (this.loading || !isLoadMoreVisible) { return; } var currentOffset = this.$results.offset().top + this.$results.outerHeight(false); var loadingMoreOffset = this.$loadingMore.offset().top + this.$loadingMore.outerHeight(false); if (currentOffset + 50 >= loadingMoreOffset) { this.loadMore(); } }; InfiniteScroll.prototype.loadMore = function () { this.loading = true; var params = $.extend({}, {page: 1}, this.lastParams); params.page++; this.trigger('query:append', params); }; InfiniteScroll.prototype.showLoadingMore = function (_, data) { return data.pagination && data.pagination.more; }; InfiniteScroll.prototype.createLoadingMore = function () { var $option = $( '
                  • ' ); var message = this.options.get('translations').get('loadingMore'); $option.html(message(this.lastParams)); return $option; }; return InfiniteScroll; }); S2.define('select2/dropdown/attachBody',[ 'jquery', '../utils' ], function ($, Utils) { function AttachBody (decorated, $element, options) { this.$dropdownParent = $(options.get('dropdownParent') || document.body); decorated.call(this, $element, options); } AttachBody.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('open', function () { self._showDropdown(); self._attachPositioningHandler(container); // Must bind after the results handlers to ensure correct sizing self._bindContainerResultHandlers(container); }); container.on('close', function () { self._hideDropdown(); self._detachPositioningHandler(container); }); this.$dropdownContainer.on('mousedown', function (evt) { evt.stopPropagation(); }); }; AttachBody.prototype.destroy = function (decorated) { decorated.call(this); this.$dropdownContainer.remove(); }; AttachBody.prototype.position = function (decorated, $dropdown, $container) { // Clone all of the container classes $dropdown.attr('class', $container.attr('class')); $dropdown.removeClass('select2'); $dropdown.addClass('select2-container--open'); $dropdown.css({ position: 'absolute', top: -999999 }); this.$container = $container; }; AttachBody.prototype.render = function (decorated) { var $container = $(''); var $dropdown = decorated.call(this); $container.append($dropdown); this.$dropdownContainer = $container; return $container; }; AttachBody.prototype._hideDropdown = function (decorated) { this.$dropdownContainer.detach(); }; AttachBody.prototype._bindContainerResultHandlers = function (decorated, container) { // These should only be bound once if (this._containerResultsHandlersBound) { return; } var self = this; container.on('results:all', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:append', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('results:message', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('select', function () { self._positionDropdown(); self._resizeDropdown(); }); container.on('unselect', function () { self._positionDropdown(); self._resizeDropdown(); }); this._containerResultsHandlersBound = true; }; AttachBody.prototype._attachPositioningHandler = function (decorated, container) { var self = this; var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.each(function () { Utils.StoreData(this, 'select2-scroll-position', { x: $(this).scrollLeft(), y: $(this).scrollTop() }); }); $watchers.on(scrollEvent, function (ev) { var position = Utils.GetData(this, 'select2-scroll-position'); $(this).scrollTop(position.y); }); $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, function (e) { self._positionDropdown(); self._resizeDropdown(); }); }; AttachBody.prototype._detachPositioningHandler = function (decorated, container) { var scrollEvent = 'scroll.select2.' + container.id; var resizeEvent = 'resize.select2.' + container.id; var orientationEvent = 'orientationchange.select2.' + container.id; var $watchers = this.$container.parents().filter(Utils.hasScroll); $watchers.off(scrollEvent); $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); }; AttachBody.prototype._positionDropdown = function () { var $window = $(window); var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); var newDirection = null; var offset = this.$container.offset(); offset.bottom = offset.top + this.$container.outerHeight(false); var container = { height: this.$container.outerHeight(false) }; container.top = offset.top; container.bottom = offset.top + container.height; var dropdown = { height: this.$dropdown.outerHeight(false) }; var viewport = { top: $window.scrollTop(), bottom: $window.scrollTop() + $window.height() }; var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); var css = { left: offset.left, top: container.bottom }; // Determine what the parent element is to use for calculating the offset var $offsetParent = this.$dropdownParent; // For statically positioned elements, we need to get the element // that is determining the offset if ($offsetParent.css('position') === 'static') { $offsetParent = $offsetParent.offsetParent(); } var parentOffset = { top: 0, left: 0 }; if ( $.contains(document.body, $offsetParent[0]) || $offsetParent[0].isConnected ) { parentOffset = $offsetParent.offset(); } css.top -= parentOffset.top; css.left -= parentOffset.left; if (!isCurrentlyAbove && !isCurrentlyBelow) { newDirection = 'below'; } if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { newDirection = 'above'; } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { newDirection = 'below'; } if (newDirection == 'above' || (isCurrentlyAbove && newDirection !== 'below')) { css.top = container.top - parentOffset.top - dropdown.height; } if (newDirection != null) { this.$dropdown .removeClass('select2-dropdown--below select2-dropdown--above') .addClass('select2-dropdown--' + newDirection); this.$container .removeClass('select2-container--below select2-container--above') .addClass('select2-container--' + newDirection); } this.$dropdownContainer.css(css); }; AttachBody.prototype._resizeDropdown = function () { var css = { width: this.$container.outerWidth(false) + 'px' }; if (this.options.get('dropdownAutoWidth')) { css.minWidth = css.width; css.position = 'relative'; css.width = 'auto'; } this.$dropdown.css(css); }; AttachBody.prototype._showDropdown = function (decorated) { this.$dropdownContainer.appendTo(this.$dropdownParent); this._positionDropdown(); this._resizeDropdown(); }; return AttachBody; }); S2.define('select2/dropdown/minimumResultsForSearch',[ ], function () { function countResults (data) { var count = 0; for (var d = 0; d < data.length; d++) { var item = data[d]; if (item.children) { count += countResults(item.children); } else { count++; } } return count; } function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { this.minimumResultsForSearch = options.get('minimumResultsForSearch'); if (this.minimumResultsForSearch < 0) { this.minimumResultsForSearch = Infinity; } decorated.call(this, $element, options, dataAdapter); } MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { if (countResults(params.data.results) < this.minimumResultsForSearch) { return false; } return decorated.call(this, params); }; return MinimumResultsForSearch; }); S2.define('select2/dropdown/selectOnClose',[ '../utils' ], function (Utils) { function SelectOnClose () { } SelectOnClose.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('close', function (params) { self._handleSelectOnClose(params); }); }; SelectOnClose.prototype._handleSelectOnClose = function (_, params) { if (params && params.originalSelect2Event != null) { var event = params.originalSelect2Event; // Don't select an item if the close event was triggered from a select or // unselect event if (event._type === 'select' || event._type === 'unselect') { return; } } var $highlightedResults = this.getHighlightedResults(); // Only select highlighted results if ($highlightedResults.length < 1) { return; } var data = Utils.GetData($highlightedResults[0], 'data'); // Don't re-select already selected resulte if ( (data.element != null && data.element.selected) || (data.element == null && data.selected) ) { return; } this.trigger('select', { data: data }); }; return SelectOnClose; }); S2.define('select2/dropdown/closeOnSelect',[ ], function () { function CloseOnSelect () { } CloseOnSelect.prototype.bind = function (decorated, container, $container) { var self = this; decorated.call(this, container, $container); container.on('select', function (evt) { self._selectTriggered(evt); }); container.on('unselect', function (evt) { self._selectTriggered(evt); }); }; CloseOnSelect.prototype._selectTriggered = function (_, evt) { var originalEvent = evt.originalEvent; // Don't close if the control key is being held if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { return; } this.trigger('close', { originalEvent: originalEvent, originalSelect2Event: evt }); }; return CloseOnSelect; }); S2.define('select2/i18n/en',[],function () { // English return { errorLoading: function () { return 'The results could not be loaded.'; }, inputTooLong: function (args) { var overChars = args.input.length - args.maximum; var message = 'Please delete ' + overChars + ' character'; if (overChars != 1) { message += 's'; } return message; }, inputTooShort: function (args) { var remainingChars = args.minimum - args.input.length; var message = 'Please enter ' + remainingChars + ' or more characters'; return message; }, loadingMore: function () { return 'Loading more results…'; }, maximumSelected: function (args) { var message = 'You can only select ' + args.maximum + ' item'; if (args.maximum != 1) { message += 's'; } return message; }, noResults: function () { return 'No results found'; }, searching: function () { return 'Searching…'; }, removeAllItems: function () { return 'Remove all items'; } }; }); S2.define('select2/defaults',[ 'jquery', 'require', './results', './selection/single', './selection/multiple', './selection/placeholder', './selection/allowClear', './selection/search', './selection/eventRelay', './utils', './translation', './diacritics', './data/select', './data/array', './data/ajax', './data/tags', './data/tokenizer', './data/minimumInputLength', './data/maximumInputLength', './data/maximumSelectionLength', './dropdown', './dropdown/search', './dropdown/hidePlaceholder', './dropdown/infiniteScroll', './dropdown/attachBody', './dropdown/minimumResultsForSearch', './dropdown/selectOnClose', './dropdown/closeOnSelect', './i18n/en' ], function ($, require, ResultsList, SingleSelection, MultipleSelection, Placeholder, AllowClear, SelectionSearch, EventRelay, Utils, Translation, DIACRITICS, SelectData, ArrayData, AjaxData, Tags, Tokenizer, MinimumInputLength, MaximumInputLength, MaximumSelectionLength, Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, EnglishTranslation) { function Defaults () { this.reset(); } Defaults.prototype.apply = function (options) { options = $.extend(true, {}, this.defaults, options); if (options.dataAdapter == null) { if (options.ajax != null) { options.dataAdapter = AjaxData; } else if (options.data != null) { options.dataAdapter = ArrayData; } else { options.dataAdapter = SelectData; } if (options.minimumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MinimumInputLength ); } if (options.maximumInputLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumInputLength ); } if (options.maximumSelectionLength > 0) { options.dataAdapter = Utils.Decorate( options.dataAdapter, MaximumSelectionLength ); } if (options.tags) { options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); } if (options.tokenSeparators != null || options.tokenizer != null) { options.dataAdapter = Utils.Decorate( options.dataAdapter, Tokenizer ); } if (options.query != null) { var Query = require(options.amdBase + 'compat/query'); options.dataAdapter = Utils.Decorate( options.dataAdapter, Query ); } if (options.initSelection != null) { var InitSelection = require(options.amdBase + 'compat/initSelection'); options.dataAdapter = Utils.Decorate( options.dataAdapter, InitSelection ); } } if (options.resultsAdapter == null) { options.resultsAdapter = ResultsList; if (options.ajax != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, InfiniteScroll ); } if (options.placeholder != null) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, HidePlaceholder ); } if (options.selectOnClose) { options.resultsAdapter = Utils.Decorate( options.resultsAdapter, SelectOnClose ); } } if (options.dropdownAdapter == null) { if (options.multiple) { options.dropdownAdapter = Dropdown; } else { var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); options.dropdownAdapter = SearchableDropdown; } if (options.minimumResultsForSearch !== 0) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, MinimumResultsForSearch ); } if (options.closeOnSelect) { options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, CloseOnSelect ); } if ( options.dropdownCssClass != null || options.dropdownCss != null || options.adaptDropdownCssClass != null ) { var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, DropdownCSS ); } options.dropdownAdapter = Utils.Decorate( options.dropdownAdapter, AttachBody ); } if (options.selectionAdapter == null) { if (options.multiple) { options.selectionAdapter = MultipleSelection; } else { options.selectionAdapter = SingleSelection; } // Add the placeholder mixin if a placeholder was specified if (options.placeholder != null) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, Placeholder ); } if (options.allowClear) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, AllowClear ); } if (options.multiple) { options.selectionAdapter = Utils.Decorate( options.selectionAdapter, SelectionSearch ); } if ( options.containerCssClass != null || options.containerCss != null || options.adaptContainerCssClass != null ) { var ContainerCSS = require(options.amdBase + 'compat/containerCss'); options.selectionAdapter = Utils.Decorate( options.selectionAdapter, ContainerCSS ); } options.selectionAdapter = Utils.Decorate( options.selectionAdapter, EventRelay ); } // If the defaults were not previously applied from an element, it is // possible for the language option to have not been resolved options.language = this._resolveLanguage(options.language); // Always fall back to English since it will always be complete options.language.push('en'); var uniqueLanguages = []; for (var l = 0; l < options.language.length; l++) { var language = options.language[l]; if (uniqueLanguages.indexOf(language) === -1) { uniqueLanguages.push(language); } } options.language = uniqueLanguages; options.translations = this._processTranslations( options.language, options.debug ); return options; }; Defaults.prototype.reset = function () { function stripDiacritics (text) { // Used 'uni range + named function' from http://jsperf.com/diacritics/18 function match(a) { return DIACRITICS[a] || a; } return text.replace(/[^\u0000-\u007E]/g, match); } function matcher (params, data) { // Always return the object if there is nothing to compare if ($.trim(params.term) === '') { return data; } // Do a recursive check for options with children if (data.children && data.children.length > 0) { // Clone the data object if there are children // This is required as we modify the object to remove any non-matches var match = $.extend(true, {}, data); // Check each child of the option for (var c = data.children.length - 1; c >= 0; c--) { var child = data.children[c]; var matches = matcher(params, child); // If there wasn't a match, remove the object in the array if (matches == null) { match.children.splice(c, 1); } } // If any children matched, return the new object if (match.children.length > 0) { return match; } // If there were no matching children, check just the plain object return matcher(params, match); } var original = stripDiacritics(data.text).toUpperCase(); var term = stripDiacritics(params.term).toUpperCase(); // Check if the text contains the term if (original.indexOf(term) > -1) { return data; } // If it doesn't contain the term, don't return anything return null; } this.defaults = { amdBase: './', amdLanguageBase: './i18n/', closeOnSelect: true, debug: false, dropdownAutoWidth: false, escapeMarkup: Utils.escapeMarkup, language: {}, matcher: matcher, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: false, scrollAfterSelect: false, sorter: function (data) { return data; }, templateResult: function (result) { return result.text; }, templateSelection: function (selection) { return selection.text; }, theme: 'default', width: 'resolve' }; }; Defaults.prototype.applyFromElement = function (options, $element) { var optionLanguage = options.language; var defaultLanguage = this.defaults.language; var elementLanguage = $element.prop('lang'); var parentLanguage = $element.closest('[lang]').prop('lang'); var languages = Array.prototype.concat.call( this._resolveLanguage(elementLanguage), this._resolveLanguage(optionLanguage), this._resolveLanguage(defaultLanguage), this._resolveLanguage(parentLanguage) ); options.language = languages; return options; }; Defaults.prototype._resolveLanguage = function (language) { if (!language) { return []; } if ($.isEmptyObject(language)) { return []; } if ($.isPlainObject(language)) { return [language]; } var languages; if (!$.isArray(language)) { languages = [language]; } else { languages = language; } var resolvedLanguages = []; for (var l = 0; l < languages.length; l++) { resolvedLanguages.push(languages[l]); if (typeof languages[l] === 'string' && languages[l].indexOf('-') > 0) { // Extract the region information if it is included var languageParts = languages[l].split('-'); var baseLanguage = languageParts[0]; resolvedLanguages.push(baseLanguage); } } return resolvedLanguages; }; Defaults.prototype._processTranslations = function (languages, debug) { var translations = new Translation(); for (var l = 0; l < languages.length; l++) { var languageData = new Translation(); var language = languages[l]; if (typeof language === 'string') { try { // Try to load it with the original name languageData = Translation.loadPath(language); } catch (e) { try { // If we couldn't load it, check if it wasn't the full path language = this.defaults.amdLanguageBase + language; languageData = Translation.loadPath(language); } catch (ex) { // The translation could not be loaded at all. Sometimes this is // because of a configuration problem, other times this can be // because of how Select2 helps load all possible translation files if (debug && window.console && console.warn) { console.warn( 'Select2: The language file for "' + language + '" could ' + 'not be automatically loaded. A fallback will be used instead.' ); } } } } else if ($.isPlainObject(language)) { languageData = new Translation(language); } else { languageData = language; } translations.extend(languageData); } return translations; }; Defaults.prototype.set = function (key, value) { var camelKey = $.camelCase(key); var data = {}; data[camelKey] = value; var convertedData = Utils._convertData(data); $.extend(true, this.defaults, convertedData); }; var defaults = new Defaults(); return defaults; }); S2.define('select2/options',[ 'require', 'jquery', './defaults', './utils' ], function (require, $, Defaults, Utils) { function Options (options, $element) { this.options = options; if ($element != null) { this.fromElement($element); } if ($element != null) { this.options = Defaults.applyFromElement(this.options, $element); } this.options = Defaults.apply(this.options); if ($element && $element.is('input')) { var InputCompat = require(this.get('amdBase') + 'compat/inputData'); this.options.dataAdapter = Utils.Decorate( this.options.dataAdapter, InputCompat ); } } Options.prototype.fromElement = function ($e) { var excludedData = ['select2']; if (this.options.multiple == null) { this.options.multiple = $e.prop('multiple'); } if (this.options.disabled == null) { this.options.disabled = $e.prop('disabled'); } if (this.options.dir == null) { if ($e.prop('dir')) { this.options.dir = $e.prop('dir'); } else if ($e.closest('[dir]').prop('dir')) { this.options.dir = $e.closest('[dir]').prop('dir'); } else { this.options.dir = 'ltr'; } } $e.prop('disabled', this.options.disabled); $e.prop('multiple', this.options.multiple); if (Utils.GetData($e[0], 'select2Tags')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-select2-tags` attribute has been changed to ' + 'use the `data-data` and `data-tags="true"` attributes and will be ' + 'removed in future versions of Select2.' ); } Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); Utils.StoreData($e[0], 'tags', true); } if (Utils.GetData($e[0], 'ajaxUrl')) { if (this.options.debug && window.console && console.warn) { console.warn( 'Select2: The `data-ajax-url` attribute has been changed to ' + '`data-ajax--url` and support for the old attribute will be removed' + ' in future versions of Select2.' ); } $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); } var dataset = {}; function upperCaseLetter(_, letter) { return letter.toUpperCase(); } // Pre-load all of the attributes which are prefixed with `data-` for (var attr = 0; attr < $e[0].attributes.length; attr++) { var attributeName = $e[0].attributes[attr].name; var prefix = 'data-'; if (attributeName.substr(0, prefix.length) == prefix) { // Get the contents of the attribute after `data-` var dataName = attributeName.substring(prefix.length); // Get the data contents from the consistent source // This is more than likely the jQuery data helper var dataValue = Utils.GetData($e[0], dataName); // camelCase the attribute name to match the spec var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); // Store the data attribute contents into the dataset since dataset[camelDataName] = dataValue; } } // Prefer the element's `dataset` attribute if it exists // jQuery 1.x does not correctly handle data attributes with multiple dashes if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { dataset = $.extend(true, {}, $e[0].dataset, dataset); } // Prefer our internal data cache if it exists var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); data = Utils._convertData(data); for (var key in data) { if ($.inArray(key, excludedData) > -1) { continue; } if ($.isPlainObject(this.options[key])) { $.extend(this.options[key], data[key]); } else { this.options[key] = data[key]; } } return this; }; Options.prototype.get = function (key) { return this.options[key]; }; Options.prototype.set = function (key, val) { this.options[key] = val; }; return Options; }); S2.define('select2/core',[ 'jquery', './options', './utils', './keys' ], function ($, Options, Utils, KEYS) { var Select2 = function ($element, options) { if (Utils.GetData($element[0], 'select2') != null) { Utils.GetData($element[0], 'select2').destroy(); } this.$element = $element; this.id = this._generateId($element); options = options || {}; this.options = new Options(options, $element); Select2.__super__.constructor.call(this); // Set up the tabindex var tabindex = $element.attr('tabindex') || 0; Utils.StoreData($element[0], 'old-tabindex', tabindex); $element.attr('tabindex', '-1'); // Set up containers and adapters var DataAdapter = this.options.get('dataAdapter'); this.dataAdapter = new DataAdapter($element, this.options); var $container = this.render(); this._placeContainer($container); var SelectionAdapter = this.options.get('selectionAdapter'); this.selection = new SelectionAdapter($element, this.options); this.$selection = this.selection.render(); this.selection.position(this.$selection, $container); var DropdownAdapter = this.options.get('dropdownAdapter'); this.dropdown = new DropdownAdapter($element, this.options); this.$dropdown = this.dropdown.render(); this.dropdown.position(this.$dropdown, $container); var ResultsAdapter = this.options.get('resultsAdapter'); this.results = new ResultsAdapter($element, this.options, this.dataAdapter); this.$results = this.results.render(); this.results.position(this.$results, this.$dropdown); // Bind events var self = this; // Bind the container to all of the adapters this._bindAdapters(); // Register any DOM event handlers this._registerDomEvents(); // Register any internal event handlers this._registerDataEvents(); this._registerSelectionEvents(); this._registerDropdownEvents(); this._registerResultsEvents(); this._registerEvents(); // Set the initial state this.dataAdapter.current(function (initialData) { self.trigger('selection:update', { data: initialData }); }); // Hide the original select $element.addClass('select2-hidden-accessible'); $element.attr('aria-hidden', 'true'); // Synchronize any monitored attributes this._syncAttributes(); Utils.StoreData($element[0], 'select2', this); // Ensure backwards compatibility with $element.data('select2'). $element.data('select2', this); }; Utils.Extend(Select2, Utils.Observable); Select2.prototype._generateId = function ($element) { var id = ''; if ($element.attr('id') != null) { id = $element.attr('id'); } else if ($element.attr('name') != null) { id = $element.attr('name') + '-' + Utils.generateChars(2); } else { id = Utils.generateChars(4); } id = id.replace(/(:|\.|\[|\]|,)/g, ''); id = 'select2-' + id; return id; }; Select2.prototype._placeContainer = function ($container) { $container.insertAfter(this.$element); var width = this._resolveWidth(this.$element, this.options.get('width')); if (width != null) { $container.css('width', width); } }; Select2.prototype._resolveWidth = function ($element, method) { var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; if (method == 'resolve') { var styleWidth = this._resolveWidth($element, 'style'); if (styleWidth != null) { return styleWidth; } return this._resolveWidth($element, 'element'); } if (method == 'element') { var elementWidth = $element.outerWidth(false); if (elementWidth <= 0) { return 'auto'; } return elementWidth + 'px'; } if (method == 'style') { var style = $element.attr('style'); if (typeof(style) !== 'string') { return null; } var attrs = style.split(';'); for (var i = 0, l = attrs.length; i < l; i = i + 1) { var attr = attrs[i].replace(/\s/g, ''); var matches = attr.match(WIDTH); if (matches !== null && matches.length >= 1) { return matches[1]; } } return null; } if (method == 'computedstyle') { var computedStyle = window.getComputedStyle($element[0]); return computedStyle.width; } return method; }; Select2.prototype._bindAdapters = function () { this.dataAdapter.bind(this, this.$container); this.selection.bind(this, this.$container); this.dropdown.bind(this, this.$container); this.results.bind(this, this.$container); }; Select2.prototype._registerDomEvents = function () { var self = this; this.$element.on('change.select2', function () { self.dataAdapter.current(function (data) { self.trigger('selection:update', { data: data }); }); }); this.$element.on('focus.select2', function (evt) { self.trigger('focus', evt); }); this._syncA = Utils.bind(this._syncAttributes, this); this._syncS = Utils.bind(this._syncSubtree, this); if (this.$element[0].attachEvent) { this.$element[0].attachEvent('onpropertychange', this._syncA); } var observer = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver ; if (observer != null) { this._observer = new observer(function (mutations) { self._syncA(); self._syncS(null, mutations); }); this._observer.observe(this.$element[0], { attributes: true, childList: true, subtree: false }); } else if (this.$element[0].addEventListener) { this.$element[0].addEventListener( 'DOMAttrModified', self._syncA, false ); this.$element[0].addEventListener( 'DOMNodeInserted', self._syncS, false ); this.$element[0].addEventListener( 'DOMNodeRemoved', self._syncS, false ); } }; Select2.prototype._registerDataEvents = function () { var self = this; this.dataAdapter.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerSelectionEvents = function () { var self = this; var nonRelayEvents = ['toggle', 'focus']; this.selection.on('toggle', function () { self.toggleDropdown(); }); this.selection.on('focus', function (params) { self.focus(params); }); this.selection.on('*', function (name, params) { if ($.inArray(name, nonRelayEvents) !== -1) { return; } self.trigger(name, params); }); }; Select2.prototype._registerDropdownEvents = function () { var self = this; this.dropdown.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerResultsEvents = function () { var self = this; this.results.on('*', function (name, params) { self.trigger(name, params); }); }; Select2.prototype._registerEvents = function () { var self = this; this.on('open', function () { self.$container.addClass('select2-container--open'); }); this.on('close', function () { self.$container.removeClass('select2-container--open'); }); this.on('enable', function () { self.$container.removeClass('select2-container--disabled'); }); this.on('disable', function () { self.$container.addClass('select2-container--disabled'); }); this.on('blur', function () { self.$container.removeClass('select2-container--focus'); }); this.on('query', function (params) { if (!self.isOpen()) { self.trigger('open', {}); } this.dataAdapter.query(params, function (data) { self.trigger('results:all', { data: data, query: params }); }); }); this.on('query:append', function (params) { this.dataAdapter.query(params, function (data) { self.trigger('results:append', { data: data, query: params }); }); }); this.on('keypress', function (evt) { var key = evt.which; if (self.isOpen()) { if (key === KEYS.ESC || key === KEYS.TAB || (key === KEYS.UP && evt.altKey)) { self.close(evt); evt.preventDefault(); } else if (key === KEYS.ENTER) { self.trigger('results:select', {}); evt.preventDefault(); } else if ((key === KEYS.SPACE && evt.ctrlKey)) { self.trigger('results:toggle', {}); evt.preventDefault(); } else if (key === KEYS.UP) { self.trigger('results:previous', {}); evt.preventDefault(); } else if (key === KEYS.DOWN) { self.trigger('results:next', {}); evt.preventDefault(); } } else { if (key === KEYS.ENTER || key === KEYS.SPACE || (key === KEYS.DOWN && evt.altKey)) { self.open(); evt.preventDefault(); } } }); }; Select2.prototype._syncAttributes = function () { this.options.set('disabled', this.$element.prop('disabled')); if (this.isDisabled()) { if (this.isOpen()) { this.close(); } this.trigger('disable', {}); } else { this.trigger('enable', {}); } }; Select2.prototype._isChangeMutation = function (evt, mutations) { var changed = false; var self = this; // Ignore any mutation events raised for elements that aren't options or // optgroups. This handles the case when the select element is destroyed if ( evt && evt.target && ( evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' ) ) { return; } if (!mutations) { // If mutation events aren't supported, then we can only assume that the // change affected the selections changed = true; } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { for (var n = 0; n < mutations.addedNodes.length; n++) { var node = mutations.addedNodes[n]; if (node.selected) { changed = true; } } } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { changed = true; } else if ($.isArray(mutations)) { $.each(mutations, function(evt, mutation) { if (self._isChangeMutation(evt, mutation)) { // We've found a change mutation. // Let's escape from the loop and continue changed = true; return false; } }); } return changed; }; Select2.prototype._syncSubtree = function (evt, mutations) { var changed = this._isChangeMutation(evt, mutations); var self = this; // Only re-pull the data if we think there is a change if (changed) { this.dataAdapter.current(function (currentData) { self.trigger('selection:update', { data: currentData }); }); } }; /** * Override the trigger method to automatically trigger pre-events when * there are events that can be prevented. */ Select2.prototype.trigger = function (name, args) { var actualTrigger = Select2.__super__.trigger; var preTriggerMap = { 'open': 'opening', 'close': 'closing', 'select': 'selecting', 'unselect': 'unselecting', 'clear': 'clearing' }; if (args === undefined) { args = {}; } if (name in preTriggerMap) { var preTriggerName = preTriggerMap[name]; var preTriggerArgs = { prevented: false, name: name, args: args }; actualTrigger.call(this, preTriggerName, preTriggerArgs); if (preTriggerArgs.prevented) { args.prevented = true; return; } } actualTrigger.call(this, name, args); }; Select2.prototype.toggleDropdown = function () { if (this.isDisabled()) { return; } if (this.isOpen()) { this.close(); } else { this.open(); } }; Select2.prototype.open = function () { if (this.isOpen()) { return; } if (this.isDisabled()) { return; } this.trigger('query', {}); }; Select2.prototype.close = function (evt) { if (!this.isOpen()) { return; } this.trigger('close', { originalEvent : evt }); }; /** * Helper method to abstract the "enabled" (not "disabled") state of this * object. * * @return {true} if the instance is not disabled. * @return {false} if the instance is disabled. */ Select2.prototype.isEnabled = function () { return !this.isDisabled(); }; /** * Helper method to abstract the "disabled" state of this object. * * @return {true} if the disabled option is true. * @return {false} if the disabled option is false. */ Select2.prototype.isDisabled = function () { return this.options.get('disabled'); }; Select2.prototype.isOpen = function () { return this.$container.hasClass('select2-container--open'); }; Select2.prototype.hasFocus = function () { return this.$container.hasClass('select2-container--focus'); }; Select2.prototype.focus = function (data) { // No need to re-trigger focus events if we are already focused if (this.hasFocus()) { return; } this.$container.addClass('select2-container--focus'); this.trigger('focus', {}); }; Select2.prototype.enable = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("enable")` method has been deprecated and will' + ' be removed in later Select2 versions. Use $element.prop("disabled")' + ' instead.' ); } if (args == null || args.length === 0) { args = [true]; } var disabled = !args[0]; this.$element.prop('disabled', disabled); }; Select2.prototype.data = function () { if (this.options.get('debug') && arguments.length > 0 && window.console && console.warn) { console.warn( 'Select2: Data can no longer be set using `select2("data")`. You ' + 'should consider setting the value instead using `$element.val()`.' ); } var data = []; this.dataAdapter.current(function (currentData) { data = currentData; }); return data; }; Select2.prototype.val = function (args) { if (this.options.get('debug') && window.console && console.warn) { console.warn( 'Select2: The `select2("val")` method has been deprecated and will be' + ' removed in later Select2 versions. Use $element.val() instead.' ); } if (args == null || args.length === 0) { return this.$element.val(); } var newVal = args[0]; if ($.isArray(newVal)) { newVal = $.map(newVal, function (obj) { return obj.toString(); }); } this.$element.val(newVal).trigger('input').trigger('change'); }; Select2.prototype.destroy = function () { this.$container.remove(); if (this.$element[0].detachEvent) { this.$element[0].detachEvent('onpropertychange', this._syncA); } if (this._observer != null) { this._observer.disconnect(); this._observer = null; } else if (this.$element[0].removeEventListener) { this.$element[0] .removeEventListener('DOMAttrModified', this._syncA, false); this.$element[0] .removeEventListener('DOMNodeInserted', this._syncS, false); this.$element[0] .removeEventListener('DOMNodeRemoved', this._syncS, false); } this._syncA = null; this._syncS = null; this.$element.off('.select2'); this.$element.attr('tabindex', Utils.GetData(this.$element[0], 'old-tabindex')); this.$element.removeClass('select2-hidden-accessible'); this.$element.attr('aria-hidden', 'false'); Utils.RemoveData(this.$element[0]); this.$element.removeData('select2'); this.dataAdapter.destroy(); this.selection.destroy(); this.dropdown.destroy(); this.results.destroy(); this.dataAdapter = null; this.selection = null; this.dropdown = null; this.results = null; }; Select2.prototype.render = function () { var $container = $( '' + '' + '' + '' ); $container.attr('dir', this.options.get('dir')); this.$container = $container; this.$container.addClass('select2-container--' + this.options.get('theme')); Utils.StoreData($container[0], 'element', this.$element); return $container; }; return Select2; }); S2.define('jquery-mousewheel',[ 'jquery' ], function ($) { // Used to shim jQuery.mousewheel for non-full builds. return $; }); S2.define('jquery.select2',[ 'jquery', 'jquery-mousewheel', './select2/core', './select2/defaults', './select2/utils' ], function ($, _, Select2, Defaults, Utils) { if ($.fn.select2 == null) { // All methods that should return the element var thisMethods = ['open', 'close', 'destroy']; $.fn.select2 = function (options) { options = options || {}; if (typeof options === 'object') { this.each(function () { var instanceOptions = $.extend(true, {}, options); var instance = new Select2($(this), instanceOptions); }); return this; } else if (typeof options === 'string') { var ret; var args = Array.prototype.slice.call(arguments, 1); this.each(function () { var instance = Utils.GetData(this, 'select2'); if (instance == null && window.console && console.error) { console.error( 'The select2(\'' + options + '\') method was called on an ' + 'element that is not using Select2.' ); } ret = instance[options].apply(instance, args); }); // Check if we should be returning `this` if ($.inArray(options, thisMethods) > -1) { return this; } return ret; } else { throw new Error('Invalid arguments for Select2: ' + options); } }; } if ($.fn.select2.defaults == null) { $.fn.select2.defaults = Defaults; } return Select2; }); // Return the AMD loader configuration so it can be used outside of this file return { define: S2.define, require: S2.require }; }()); // Autoload the jQuery bindings // We know that all of the modules exist above this, so we're safe var select2 = S2.require('jquery.select2'); // Hold the AMD module references on the jQuery function that was just loaded // This allows Select2 to use the internal loader outside of this file, such // as in the language files. jQuery.fn.select2.amd = S2; // Return the Select2 instance for anyone who is importing it. return select2; })); assets/js/select2/js/select2.min.js000064400000212356147600374260013142 0ustar00;;;/*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */ !function(n){"function"==typeof define&&define.amd?define(["jquery"],n):"object"==typeof module&&module.exports?module.exports=function(e,t){return void 0===t&&(t="undefined"!=typeof window?require("jquery"):require("jquery")(e)),n(t),t}:n(jQuery)}(function(u){var e=function(){if(u&&u.fn&&u.fn.select2&&u.fn.select2.amd)var e=u.fn.select2.amd;var t,n,r,h,o,s,f,g,m,v,y,_,i,a,b;function w(e,t){return i.call(e,t)}function l(e,t){var n,r,i,o,s,a,l,c,u,d,p,h=t&&t.split("/"),f=y.map,g=f&&f["*"]||{};if(e){for(s=(e=e.split("/")).length-1,y.nodeIdCompat&&b.test(e[s])&&(e[s]=e[s].replace(b,"")),"."===e[0].charAt(0)&&h&&(e=h.slice(0,h.length-1).concat(e)),u=0;u":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},i.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},i.__cache={};var n=0;return i.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},i.StoreData=function(e,t,n){var r=i.GetUniqueElementId(e);i.__cache[r]||(i.__cache[r]={}),i.__cache[r][t]=n},i.GetData=function(e,t){var n=i.GetUniqueElementId(e);return t?i.__cache[n]&&null!=i.__cache[n][t]?i.__cache[n][t]:o(e).data(t):i.__cache[n]},i.RemoveData=function(e){var t=i.GetUniqueElementId(e);null!=i.__cache[t]&&delete i.__cache[t],e.removeAttribute("data-select2-id")},i}),e.define("select2/results",["jquery","./utils"],function(h,f){function r(e,t,n){this.$element=e,this.data=n,this.options=t,r.__super__.constructor.call(this)}return f.Extend(r,f.Observable),r.prototype.render=function(){var e=h('
                      ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},r.prototype.clear=function(){this.$results.empty()},r.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),r=this.options.get("translations").get(e.message);n.append(t(r(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},r.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},r.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},r.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var r=n-1;0===e.length&&(r=0);var i=t.eq(r);i.trigger("mouseenter");var o=l.$results.offset().top,s=i.offset().top,a=l.$results.scrollTop()+(s-o);0===r?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var r=t.eq(n);r.trigger("mouseenter");var i=l.$results.offset().top+l.$results.outerHeight(!1),o=r.offset().top+r.outerHeight(!1),s=l.$results.scrollTop()+o-i;0===n?l.$results.scrollTop(0):ithis.$results.outerHeight()||o<0)&&this.$results.scrollTop(i)}},r.prototype.template=function(e,t){var n=this.options.get("templateResult"),r=this.options.get("escapeMarkup"),i=n(e,t);null==i?t.style.display="none":"string"==typeof i?t.innerHTML=r(i):h(t).append(i)},r}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,r,i){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return r.Extend(o,r.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=r.GetData(this.$element[0],"old-tabindex")?this._tabindex=r.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,r=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===i.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",r),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&r.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,r){function i(){i.__super__.constructor.apply(this,arguments)}return n.Extend(i,t),i.prototype.render=function(){var e=i.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},i.prototype.bind=function(t,e){var n=this;i.__super__.bind.apply(this,arguments);var r=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",r).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",r),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},i.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},i.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},i.prototype.selectionContainer=function(){return e("")},i.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),r=this.display(t,n);n.empty().append(r);var i=t.title||t.text;i?n.attr("title",i):n.removeAttr("title")}else this.clear()},i}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(i,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
                        '),e},n.prototype.bind=function(e,t){var r=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){r.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!r.isDisabled()){var t=i(this).parent(),n=l.GetData(t[0],"data");r.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return i('
                      • ×
                      • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(r[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(r)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(r,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=r('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),t.on("open",function(){r.$search.attr("aria-controls",i),r.$search.trigger("focus")}),t.on("close",function(){r.$search.val(""),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.trigger("focus")}),t.on("enable",function(){r.$search.prop("disabled",!1),r._transferTabIndex()}),t.on("disable",function(){r.$search.prop("disabled",!0)}),t.on("focus",function(e){r.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){r.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){r._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===r.$search.val()){var t=r.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("select",function(){r._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var r=this;this._checkIfMaximumSelected(function(){e.call(r,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var r=this;this.current(function(e){var t=null!=e?e.length:0;0=r.maximumSelectionLength?r.trigger("results:message",{message:"maximumSelected",args:{maximum:r.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var r=this,i=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){r.trigger("keypress",e),r._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){r.handleSearch(e)}),t.on("open",function(){r.$search.attr("tabindex",0),r.$search.attr("aria-controls",i),r.$search.trigger("focus"),window.setTimeout(function(){r.$search.trigger("focus")},0)}),t.on("close",function(){r.$search.attr("tabindex",-1),r.$search.removeAttr("aria-controls"),r.$search.removeAttr("aria-activedescendant"),r.$search.val(""),r.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||r.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(r.showSearch(e)?r.$searchContainer.removeClass("select2-search--hide"):r.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?r.$search.attr("aria-activedescendant",e.data._resultId):r.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,r){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,r)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),r=t.length-1;0<=r;r--){var i=t[r];this.placeholder.id===i.id&&n.splice(r,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,r){this.lastParams={},e.call(this,t,n,r),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("query",function(e){r.lastParams=e,r.loading=!0}),t.on("query:append",function(e){r.lastParams=e,r.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
                      • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var r=this;e.call(this,t,n),t.on("open",function(){r._showDropdown(),r._attachPositioningHandler(t),r._bindContainerResultHandlers(t)}),t.on("close",function(){r._hideDropdown(),r._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,r="scroll.select2."+t.id,i="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(r,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(r+" "+i+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,r="resize.select2."+t.id,i="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+r+" "+i)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),r=null,i=this.$container.offset();i.bottom=i.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=i.top,o.bottom=i.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ai.bottom+s,d={left:i.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(r="below"),u||!c||t?!c&&u&&t&&(r="below"):r="above",("above"==r||t&&"below"!==r)&&(d.top=o.top-h.top-s),null!=r&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+r),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+r)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,r){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,r)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,r=0;r');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("jquery-mousewheel",["jquery"],function(e){return e}),e.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(i,e,o,t,s){if(null==i.fn.select2){var a=["open","close","destroy"];i.fn.select2=function(t){if("object"==typeof(t=t||{}))return this.each(function(){var e=i.extend(!0,{},t);new o(i(this),e)}),this;if("string"!=typeof t)throw new Error("Invalid arguments for Select2: "+t);var n,r=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=s.GetData(this,"select2");null==e&&window.console&&console.error&&console.error("The select2('"+t+"') method was called on an element that is not using Select2."),n=e[t].apply(e,r)}),-1-1}function s(t,e){return"function"==typeof t?t.apply(void 0,e):t}function u(t,e){return 0===e?t:function(r){clearTimeout(n),n=setTimeout((function(){t(r)}),e)};var n}function p(t,e){var n=Object.assign({},t);return e.forEach((function(t){delete n[t]})),n}function c(t){return[].concat(t)}function f(t,e){-1===t.indexOf(e)&&t.push(e)}function l(t){return t.split("-")[0]}function d(t){return[].slice.call(t)}function v(t){return Object.keys(t).reduce((function(e,n){return void 0!==t[n]&&(e[n]=t[n]),e}),{})}function m(){return document.createElement("div")}function g(t){return["Element","Fragment"].some((function(e){return a(t,e)}))}function h(t){return a(t,"MouseEvent")}function b(t){return!(!t||!t._tippy||t._tippy.reference!==t)}function y(t){return g(t)?[t]:function(t){return a(t,"NodeList")}(t)?d(t):Array.isArray(t)?t:d(document.querySelectorAll(t))}function w(t,e){t.forEach((function(t){t&&(t.style.transitionDuration=e+"ms")}))}function x(t,e){t.forEach((function(t){t&&t.setAttribute("data-state",e)}))}function E(t){var e,n=c(t)[0];return null!=n&&null!=(e=n.ownerDocument)&&e.body?n.ownerDocument:document}function O(t,e,n){var r=e+"EventListener";["transitionend","webkitTransitionEnd"].forEach((function(e){t[r](e,n)}))}function C(t,e){for(var n=e;n;){var r;if(t.contains(n))return!0;n=null==n.getRootNode||null==(r=n.getRootNode())?void 0:r.host}return!1}var T={isTouch:!1},A=0;function L(){T.isTouch||(T.isTouch=!0,window.performance&&document.addEventListener("mousemove",D))}function D(){var t=performance.now();t-A<20&&(T.isTouch=!1,document.removeEventListener("mousemove",D)),A=t}function k(){var t=document.activeElement;if(b(t)){var e=t._tippy;t.blur&&!e.state.isVisible&&t.blur()}}var R=Object.assign({appendTo:o,aria:{content:"auto",expanded:"auto"},delay:0,duration:[300,250],getReferenceClientRect:null,hideOnClick:!0,ignoreAttributes:!1,interactive:!1,interactiveBorder:2,interactiveDebounce:0,moveTransition:"",offset:[0,10],onAfterUpdate:function(){},onBeforeUpdate:function(){},onCreate:function(){},onDestroy:function(){},onHidden:function(){},onHide:function(){},onMount:function(){},onShow:function(){},onShown:function(){},onTrigger:function(){},onUntrigger:function(){},onClickOutside:function(){},placement:"top",plugins:[],popperOptions:{},render:null,showOnCreate:!1,touch:!0,trigger:"mouseenter focus",triggerTarget:null},{animateFill:!1,followCursor:!1,inlinePositioning:!1,sticky:!1},{allowHTML:!1,animation:"fade",arrow:!0,content:"",inertia:!1,maxWidth:350,role:"tooltip",theme:"",zIndex:9999}),P=Object.keys(R);function j(t){var e=(t.plugins||[]).reduce((function(e,n){var r,o=n.name,i=n.defaultValue;o&&(e[o]=void 0!==t[o]?t[o]:null!=(r=R[o])?r:i);return e}),{});return Object.assign({},t,e)}function M(t,e){var n=Object.assign({},e,{content:s(e.content,[t])},e.ignoreAttributes?{}:function(t,e){return(e?Object.keys(j(Object.assign({},R,{plugins:e}))):P).reduce((function(e,n){var r=(t.getAttribute("data-tippy-"+n)||"").trim();if(!r)return e;if("content"===n)e[n]=r;else try{e[n]=JSON.parse(r)}catch(t){e[n]=r}return e}),{})}(t,e.plugins));return n.aria=Object.assign({},R.aria,n.aria),n.aria={expanded:"auto"===n.aria.expanded?e.interactive:n.aria.expanded,content:"auto"===n.aria.content?e.interactive?null:"describedby":n.aria.content},n}function V(t,e){t.innerHTML=e}function I(t){var e=m();return!0===t?e.className="tippy-arrow":(e.className="tippy-svg-arrow",g(t)?e.appendChild(t):V(e,t)),e}function S(t,e){g(e.content)?(V(t,""),t.appendChild(e.content)):"function"!=typeof e.content&&(e.allowHTML?V(t,e.content):t.textContent=e.content)}function B(t){var e=t.firstElementChild,n=d(e.children);return{box:e,content:n.find((function(t){return t.classList.contains("tippy-content")})),arrow:n.find((function(t){return t.classList.contains("tippy-arrow")||t.classList.contains("tippy-svg-arrow")})),backdrop:n.find((function(t){return t.classList.contains("tippy-backdrop")}))}}function N(t){var e=m(),n=m();n.className="tippy-box",n.setAttribute("data-state","hidden"),n.setAttribute("tabindex","-1");var r=m();function o(n,r){var o=B(e),i=o.box,a=o.content,s=o.arrow;r.theme?i.setAttribute("data-theme",r.theme):i.removeAttribute("data-theme"),"string"==typeof r.animation?i.setAttribute("data-animation",r.animation):i.removeAttribute("data-animation"),r.inertia?i.setAttribute("data-inertia",""):i.removeAttribute("data-inertia"),i.style.maxWidth="number"==typeof r.maxWidth?r.maxWidth+"px":r.maxWidth,r.role?i.setAttribute("role",r.role):i.removeAttribute("role"),n.content===r.content&&n.allowHTML===r.allowHTML||S(a,t.props),r.arrow?s?n.arrow!==r.arrow&&(i.removeChild(s),i.appendChild(I(r.arrow))):i.appendChild(I(r.arrow)):s&&i.removeChild(s)}return r.className="tippy-content",r.setAttribute("data-state","hidden"),S(r,t.props),e.appendChild(n),n.appendChild(r),o(t.props,t.props),{popper:e,onUpdate:o}}N.$$tippy=!0;var H=1,U=[],_=[];function z(e,a){var p,g,b,y,A,L,D,k,P=M(e,Object.assign({},R,j(v(a)))),V=!1,I=!1,S=!1,N=!1,z=[],F=u(wt,P.interactiveDebounce),W=H++,X=(k=P.plugins).filter((function(t,e){return k.indexOf(t)===e})),Y={id:W,reference:e,popper:m(),popperInstance:null,props:P,state:{isEnabled:!0,isVisible:!1,isDestroyed:!1,isMounted:!1,isShown:!1},plugins:X,clearDelayTimeouts:function(){clearTimeout(p),clearTimeout(g),cancelAnimationFrame(b)},setProps:function(t){if(Y.state.isDestroyed)return;at("onBeforeUpdate",[Y,t]),bt();var n=Y.props,r=M(e,Object.assign({},n,v(t),{ignoreAttributes:!0}));Y.props=r,ht(),n.interactiveDebounce!==r.interactiveDebounce&&(pt(),F=u(wt,r.interactiveDebounce));n.triggerTarget&&!r.triggerTarget?c(n.triggerTarget).forEach((function(t){t.removeAttribute("aria-expanded")})):r.triggerTarget&&e.removeAttribute("aria-expanded");ut(),it(),J&&J(n,r);Y.popperInstance&&(Ct(),At().forEach((function(t){requestAnimationFrame(t._tippy.popperInstance.forceUpdate)})));at("onAfterUpdate",[Y,t])},setContent:function(t){Y.setProps({content:t})},show:function(){var t=Y.state.isVisible,e=Y.state.isDestroyed,n=!Y.state.isEnabled,r=T.isTouch&&!Y.props.touch,a=i(Y.props.duration,0,R.duration);if(t||e||n||r)return;if(et().hasAttribute("disabled"))return;if(at("onShow",[Y],!1),!1===Y.props.onShow(Y))return;Y.state.isVisible=!0,tt()&&($.style.visibility="visible");it(),dt(),Y.state.isMounted||($.style.transition="none");if(tt()){var u=rt(),p=u.box,c=u.content;w([p,c],0)}L=function(){var t;if(Y.state.isVisible&&!N){if(N=!0,$.offsetHeight,$.style.transition=Y.props.moveTransition,tt()&&Y.props.animation){var e=rt(),n=e.box,r=e.content;w([n,r],a),x([n,r],"visible")}st(),ut(),f(_,Y),null==(t=Y.popperInstance)||t.forceUpdate(),at("onMount",[Y]),Y.props.animation&&tt()&&function(t,e){mt(t,e)}(a,(function(){Y.state.isShown=!0,at("onShown",[Y])}))}},function(){var t,e=Y.props.appendTo,n=et();t=Y.props.interactive&&e===o||"parent"===e?n.parentNode:s(e,[n]);t.contains($)||t.appendChild($);Y.state.isMounted=!0,Ct()}()},hide:function(){var t=!Y.state.isVisible,e=Y.state.isDestroyed,n=!Y.state.isEnabled,r=i(Y.props.duration,1,R.duration);if(t||e||n)return;if(at("onHide",[Y],!1),!1===Y.props.onHide(Y))return;Y.state.isVisible=!1,Y.state.isShown=!1,N=!1,V=!1,tt()&&($.style.visibility="hidden");if(pt(),vt(),it(!0),tt()){var o=rt(),a=o.box,s=o.content;Y.props.animation&&(w([a,s],r),x([a,s],"hidden"))}st(),ut(),Y.props.animation?tt()&&function(t,e){mt(t,(function(){!Y.state.isVisible&&$.parentNode&&$.parentNode.contains($)&&e()}))}(r,Y.unmount):Y.unmount()},hideWithInteractivity:function(t){nt().addEventListener("mousemove",F),f(U,F),F(t)},enable:function(){Y.state.isEnabled=!0},disable:function(){Y.hide(),Y.state.isEnabled=!1},unmount:function(){Y.state.isVisible&&Y.hide();if(!Y.state.isMounted)return;Tt(),At().forEach((function(t){t._tippy.unmount()})),$.parentNode&&$.parentNode.removeChild($);_=_.filter((function(t){return t!==Y})),Y.state.isMounted=!1,at("onHidden",[Y])},destroy:function(){if(Y.state.isDestroyed)return;Y.clearDelayTimeouts(),Y.unmount(),bt(),delete e._tippy,Y.state.isDestroyed=!0,at("onDestroy",[Y])}};if(!P.render)return Y;var q=P.render(Y),$=q.popper,J=q.onUpdate;$.setAttribute("data-tippy-root",""),$.id="tippy-"+Y.id,Y.popper=$,e._tippy=Y,$._tippy=Y;var G=X.map((function(t){return t.fn(Y)})),K=e.hasAttribute("aria-expanded");return ht(),ut(),it(),at("onCreate",[Y]),P.showOnCreate&&Lt(),$.addEventListener("mouseenter",(function(){Y.props.interactive&&Y.state.isVisible&&Y.clearDelayTimeouts()})),$.addEventListener("mouseleave",(function(){Y.props.interactive&&Y.props.trigger.indexOf("mouseenter")>=0&&nt().addEventListener("mousemove",F)})),Y;function Q(){var t=Y.props.touch;return Array.isArray(t)?t:[t,0]}function Z(){return"hold"===Q()[0]}function tt(){var t;return!(null==(t=Y.props.render)||!t.$$tippy)}function et(){return D||e}function nt(){var t=et().parentNode;return t?E(t):document}function rt(){return B($)}function ot(t){return Y.state.isMounted&&!Y.state.isVisible||T.isTouch||y&&"focus"===y.type?0:i(Y.props.delay,t?0:1,R.delay)}function it(t){void 0===t&&(t=!1),$.style.pointerEvents=Y.props.interactive&&!t?"":"none",$.style.zIndex=""+Y.props.zIndex}function at(t,e,n){var r;(void 0===n&&(n=!0),G.forEach((function(n){n[t]&&n[t].apply(n,e)})),n)&&(r=Y.props)[t].apply(r,e)}function st(){var t=Y.props.aria;if(t.content){var n="aria-"+t.content,r=$.id;c(Y.props.triggerTarget||e).forEach((function(t){var e=t.getAttribute(n);if(Y.state.isVisible)t.setAttribute(n,e?e+" "+r:r);else{var o=e&&e.replace(r,"").trim();o?t.setAttribute(n,o):t.removeAttribute(n)}}))}}function ut(){!K&&Y.props.aria.expanded&&c(Y.props.triggerTarget||e).forEach((function(t){Y.props.interactive?t.setAttribute("aria-expanded",Y.state.isVisible&&t===et()?"true":"false"):t.removeAttribute("aria-expanded")}))}function pt(){nt().removeEventListener("mousemove",F),U=U.filter((function(t){return t!==F}))}function ct(t){if(!T.isTouch||!S&&"mousedown"!==t.type){var n=t.composedPath&&t.composedPath()[0]||t.target;if(!Y.props.interactive||!C($,n)){if(c(Y.props.triggerTarget||e).some((function(t){return C(t,n)}))){if(T.isTouch)return;if(Y.state.isVisible&&Y.props.trigger.indexOf("click")>=0)return}else at("onClickOutside",[Y,t]);!0===Y.props.hideOnClick&&(Y.clearDelayTimeouts(),Y.hide(),I=!0,setTimeout((function(){I=!1})),Y.state.isMounted||vt())}}}function ft(){S=!0}function lt(){S=!1}function dt(){var t=nt();t.addEventListener("mousedown",ct,!0),t.addEventListener("touchend",ct,r),t.addEventListener("touchstart",lt,r),t.addEventListener("touchmove",ft,r)}function vt(){var t=nt();t.removeEventListener("mousedown",ct,!0),t.removeEventListener("touchend",ct,r),t.removeEventListener("touchstart",lt,r),t.removeEventListener("touchmove",ft,r)}function mt(t,e){var n=rt().box;function r(t){t.target===n&&(O(n,"remove",r),e())}if(0===t)return e();O(n,"remove",A),O(n,"add",r),A=r}function gt(t,n,r){void 0===r&&(r=!1),c(Y.props.triggerTarget||e).forEach((function(e){e.addEventListener(t,n,r),z.push({node:e,eventType:t,handler:n,options:r})}))}function ht(){var t;Z()&&(gt("touchstart",yt,{passive:!0}),gt("touchend",xt,{passive:!0})),(t=Y.props.trigger,t.split(/\s+/).filter(Boolean)).forEach((function(t){if("manual"!==t)switch(gt(t,yt),t){case"mouseenter":gt("mouseleave",xt);break;case"focus":gt(n?"focusout":"blur",Et);break;case"focusin":gt("focusout",Et)}}))}function bt(){z.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,o=t.options;e.removeEventListener(n,r,o)})),z=[]}function yt(t){var e,n=!1;if(Y.state.isEnabled&&!Ot(t)&&!I){var r="focus"===(null==(e=y)?void 0:e.type);y=t,D=t.currentTarget,ut(),!Y.state.isVisible&&h(t)&&U.forEach((function(e){return e(t)})),"click"===t.type&&(Y.props.trigger.indexOf("mouseenter")<0||V)&&!1!==Y.props.hideOnClick&&Y.state.isVisible?n=!0:Lt(t),"click"===t.type&&(V=!n),n&&!r&&Dt(t)}}function wt(t){var e=t.target,n=et().contains(e)||$.contains(e);"mousemove"===t.type&&n||function(t,e){var n=e.clientX,r=e.clientY;return t.every((function(t){var e=t.popperRect,o=t.popperState,i=t.props.interactiveBorder,a=l(o.placement),s=o.modifiersData.offset;if(!s)return!0;var u="bottom"===a?s.top.y:0,p="top"===a?s.bottom.y:0,c="right"===a?s.left.x:0,f="left"===a?s.right.x:0,d=e.top-r+u>i,v=r-e.bottom-p>i,m=e.left-n+c>i,g=n-e.right-f>i;return d||v||m||g}))}(At().concat($).map((function(t){var e,n=null==(e=t._tippy.popperInstance)?void 0:e.state;return n?{popperRect:t.getBoundingClientRect(),popperState:n,props:P}:null})).filter(Boolean),t)&&(pt(),Dt(t))}function xt(t){Ot(t)||Y.props.trigger.indexOf("click")>=0&&V||(Y.props.interactive?Y.hideWithInteractivity(t):Dt(t))}function Et(t){Y.props.trigger.indexOf("focusin")<0&&t.target!==et()||Y.props.interactive&&t.relatedTarget&&$.contains(t.relatedTarget)||Dt(t)}function Ot(t){return!!T.isTouch&&Z()!==t.type.indexOf("touch")>=0}function Ct(){Tt();var n=Y.props,r=n.popperOptions,o=n.placement,i=n.offset,a=n.getReferenceClientRect,s=n.moveTransition,u=tt()?B($).arrow:null,p=a?{getBoundingClientRect:a,contextElement:a.contextElement||et()}:e,c=[{name:"offset",options:{offset:i}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5}},{name:"computeStyles",options:{adaptive:!s}},{name:"$$tippy",enabled:!0,phase:"beforeWrite",requires:["computeStyles"],fn:function(t){var e=t.state;if(tt()){var n=rt().box;["placement","reference-hidden","escaped"].forEach((function(t){"placement"===t?n.setAttribute("data-placement",e.placement):e.attributes.popper["data-popper-"+t]?n.setAttribute("data-"+t,""):n.removeAttribute("data-"+t)})),e.attributes.popper={}}}}];tt()&&u&&c.push({name:"arrow",options:{element:u,padding:3}}),c.push.apply(c,(null==r?void 0:r.modifiers)||[]),Y.popperInstance=t.createPopper(p,$,Object.assign({},r,{placement:o,onFirstUpdate:L,modifiers:c}))}function Tt(){Y.popperInstance&&(Y.popperInstance.destroy(),Y.popperInstance=null)}function At(){return d($.querySelectorAll("[data-tippy-root]"))}function Lt(t){Y.clearDelayTimeouts(),t&&at("onTrigger",[Y,t]),dt();var e=ot(!0),n=Q(),r=n[0],o=n[1];T.isTouch&&"hold"===r&&o&&(e=o),e?p=setTimeout((function(){Y.show()}),e):Y.show()}function Dt(t){if(Y.clearDelayTimeouts(),at("onUntrigger",[Y,t]),Y.state.isVisible){if(!(Y.props.trigger.indexOf("mouseenter")>=0&&Y.props.trigger.indexOf("click")>=0&&["mouseleave","mousemove"].indexOf(t.type)>=0&&V)){var e=ot(!1);e?g=setTimeout((function(){Y.state.isVisible&&Y.hide()}),e):b=requestAnimationFrame((function(){Y.hide()}))}}else vt()}}function F(t,e){void 0===e&&(e={});var n=R.plugins.concat(e.plugins||[]);document.addEventListener("touchstart",L,r),window.addEventListener("blur",k);var o=Object.assign({},e,{plugins:n}),i=y(t).reduce((function(t,e){var n=e&&z(e,o);return n&&t.push(n),t}),[]);return g(t)?i[0]:i}F.defaultProps=R,F.setDefaultProps=function(t){Object.keys(t).forEach((function(e){R[e]=t[e]}))},F.currentInput=T;var W=Object.assign({},t.applyStyles,{effect:function(t){var e=t.state,n={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};Object.assign(e.elements.popper.style,n.popper),e.styles=n,e.elements.arrow&&Object.assign(e.elements.arrow.style,n.arrow)}}),X={mouseover:"mouseenter",focusin:"focus",click:"click"};var Y={name:"animateFill",defaultValue:!1,fn:function(t){var e;if(null==(e=t.props.render)||!e.$$tippy)return{};var n=B(t.popper),r=n.box,o=n.content,i=t.props.animateFill?function(){var t=m();return t.className="tippy-backdrop",x([t],"hidden"),t}():null;return{onCreate:function(){i&&(r.insertBefore(i,r.firstElementChild),r.setAttribute("data-animatefill",""),r.style.overflow="hidden",t.setProps({arrow:!1,animation:"shift-away"}))},onMount:function(){if(i){var t=r.style.transitionDuration,e=Number(t.replace("ms",""));o.style.transitionDelay=Math.round(e/10)+"ms",i.style.transitionDuration=t,x([i],"visible")}},onShow:function(){i&&(i.style.transitionDuration="0ms")},onHide:function(){i&&x([i],"hidden")}}}};var q={clientX:0,clientY:0},$=[];function J(t){var e=t.clientX,n=t.clientY;q={clientX:e,clientY:n}}var G={name:"followCursor",defaultValue:!1,fn:function(t){var e=t.reference,n=E(t.props.triggerTarget||e),r=!1,o=!1,i=!0,a=t.props;function s(){return"initial"===t.props.followCursor&&t.state.isVisible}function u(){n.addEventListener("mousemove",f)}function p(){n.removeEventListener("mousemove",f)}function c(){r=!0,t.setProps({getReferenceClientRect:null}),r=!1}function f(n){var r=!n.target||e.contains(n.target),o=t.props.followCursor,i=n.clientX,a=n.clientY,s=e.getBoundingClientRect(),u=i-s.left,p=a-s.top;!r&&t.props.interactive||t.setProps({getReferenceClientRect:function(){var t=e.getBoundingClientRect(),n=i,r=a;"initial"===o&&(n=t.left+u,r=t.top+p);var s="horizontal"===o?t.top:r,c="vertical"===o?t.right:n,f="horizontal"===o?t.bottom:r,l="vertical"===o?t.left:n;return{width:c-l,height:f-s,top:s,right:c,bottom:f,left:l}}})}function l(){t.props.followCursor&&($.push({instance:t,doc:n}),function(t){t.addEventListener("mousemove",J)}(n))}function d(){0===($=$.filter((function(e){return e.instance!==t}))).filter((function(t){return t.doc===n})).length&&function(t){t.removeEventListener("mousemove",J)}(n)}return{onCreate:l,onDestroy:d,onBeforeUpdate:function(){a=t.props},onAfterUpdate:function(e,n){var i=n.followCursor;r||void 0!==i&&a.followCursor!==i&&(d(),i?(l(),!t.state.isMounted||o||s()||u()):(p(),c()))},onMount:function(){t.props.followCursor&&!o&&(i&&(f(q),i=!1),s()||u())},onTrigger:function(t,e){h(e)&&(q={clientX:e.clientX,clientY:e.clientY}),o="focus"===e.type},onHidden:function(){t.props.followCursor&&(c(),p(),i=!0)}}}};var K={name:"inlinePositioning",defaultValue:!1,fn:function(t){var e,n=t.reference;var r=-1,o=!1,i=[],a={name:"tippyInlinePositioning",enabled:!0,phase:"afterWrite",fn:function(o){var a=o.state;t.props.inlinePositioning&&(-1!==i.indexOf(a.placement)&&(i=[]),e!==a.placement&&-1===i.indexOf(a.placement)&&(i.push(a.placement),t.setProps({getReferenceClientRect:function(){return function(t){return function(t,e,n,r){if(n.length<2||null===t)return e;if(2===n.length&&r>=0&&n[0].left>n[1].right)return n[r]||e;switch(t){case"top":case"bottom":var o=n[0],i=n[n.length-1],a="top"===t,s=o.top,u=i.bottom,p=a?o.left:i.left,c=a?o.right:i.right;return{top:s,bottom:u,left:p,right:c,width:c-p,height:u-s};case"left":case"right":var f=Math.min.apply(Math,n.map((function(t){return t.left}))),l=Math.max.apply(Math,n.map((function(t){return t.right}))),d=n.filter((function(e){return"left"===t?e.left===f:e.right===l})),v=d[0].top,m=d[d.length-1].bottom;return{top:v,bottom:m,left:f,right:l,width:l-f,height:m-v};default:return e}}(l(t),n.getBoundingClientRect(),d(n.getClientRects()),r)}(a.placement)}})),e=a.placement)}};function s(){var e;o||(e=function(t,e){var n;return{popperOptions:Object.assign({},t.popperOptions,{modifiers:[].concat(((null==(n=t.popperOptions)?void 0:n.modifiers)||[]).filter((function(t){return t.name!==e.name})),[e])})}}(t.props,a),o=!0,t.setProps(e),o=!1)}return{onCreate:s,onAfterUpdate:s,onTrigger:function(e,n){if(h(n)){var o=d(t.reference.getClientRects()),i=o.find((function(t){return t.left-2<=n.clientX&&t.right+2>=n.clientX&&t.top-2<=n.clientY&&t.bottom+2>=n.clientY})),a=o.indexOf(i);r=a>-1?a:r}},onHidden:function(){r=-1}}}};var Q={name:"sticky",defaultValue:!1,fn:function(t){var e=t.reference,n=t.popper;function r(e){return!0===t.props.sticky||t.props.sticky===e}var o=null,i=null;function a(){var s=r("reference")?(t.popperInstance?t.popperInstance.state.elements.reference:e).getBoundingClientRect():null,u=r("popper")?n.getBoundingClientRect():null;(s&&Z(o,s)||u&&Z(i,u))&&t.popperInstance&&t.popperInstance.update(),o=s,i=u,t.state.isMounted&&requestAnimationFrame(a)}return{onMount:function(){t.props.sticky&&a()}}}};function Z(t,e){return!t||!e||(t.top!==e.top||t.right!==e.right||t.bottom!==e.bottom||t.left!==e.left)}return e&&function(t){var e=document.createElement("style");e.textContent=t,e.setAttribute("data-tippy-stylesheet","");var n=document.head,r=document.querySelector("head>style,head>link");r?n.insertBefore(e,r):n.appendChild(e)}('.tippy-box[data-animation=fade][data-state=hidden]{opacity:0}[data-tippy-root]{max-width:calc(100vw - 10px)}.tippy-box{position:relative;background-color:#333;color:#fff;border-radius:4px;font-size:14px;line-height:1.4;white-space:normal;outline:0;transition-property:transform,visibility,opacity}.tippy-box[data-placement^=top]>.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:"";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}'),F.setDefaultProps({plugins:[Y,G,K,Q],render:N}),F.createSingleton=function(t,e){var n;void 0===e&&(e={});var r,o=t,i=[],a=[],s=e.overrides,u=[],f=!1;function l(){a=o.map((function(t){return c(t.props.triggerTarget||t.reference)})).reduce((function(t,e){return t.concat(e)}),[])}function d(){i=o.map((function(t){return t.reference}))}function v(t){o.forEach((function(e){t?e.enable():e.disable()}))}function g(t){return o.map((function(e){var n=e.setProps;return e.setProps=function(o){n(o),e.reference===r&&t.setProps(o)},function(){e.setProps=n}}))}function h(t,e){var n=a.indexOf(e);if(e!==r){r=e;var u=(s||[]).concat("content").reduce((function(t,e){return t[e]=o[n].props[e],t}),{});t.setProps(Object.assign({},u,{getReferenceClientRect:"function"==typeof u.getReferenceClientRect?u.getReferenceClientRect:function(){var t;return null==(t=i[n])?void 0:t.getBoundingClientRect()}}))}}v(!1),d(),l();var b={fn:function(){return{onDestroy:function(){v(!0)},onHidden:function(){r=null},onClickOutside:function(t){t.props.showOnCreate&&!f&&(f=!0,r=null)},onShow:function(t){t.props.showOnCreate&&!f&&(f=!0,h(t,i[0]))},onTrigger:function(t,e){h(t,e.currentTarget)}}}},y=F(m(),Object.assign({},p(e,["overrides"]),{plugins:[b].concat(e.plugins||[]),triggerTarget:a,popperOptions:Object.assign({},e.popperOptions,{modifiers:[].concat((null==(n=e.popperOptions)?void 0:n.modifiers)||[],[W])})})),w=y.show;y.show=function(t){if(w(),!r&&null==t)return h(y,i[0]);if(!r||null!=t){if("number"==typeof t)return i[t]&&h(y,i[t]);if(o.indexOf(t)>=0){var e=t.reference;return h(y,e)}return i.indexOf(t)>=0?h(y,t):void 0}},y.showNext=function(){var t=i[0];if(!r)return y.show(0);var e=i.indexOf(r);y.show(i[e+1]||t)},y.showPrevious=function(){var t=i[i.length-1];if(!r)return y.show(t);var e=i.indexOf(r),n=i[e-1]||t;y.show(n)};var x=y.setProps;return y.setProps=function(t){s=t.overrides||s,x(t)},y.setInstances=function(t){v(!0),u.forEach((function(t){return t()})),o=t,v(!1),d(),l(),u=g(y),y.setProps({triggerTarget:a})},u=g(y),y},F.delegate=function(t,e){var n=[],o=[],i=!1,a=e.target,s=p(e,["target"]),u=Object.assign({},s,{trigger:"manual",touch:!1}),f=Object.assign({touch:R.touch},s,{showOnCreate:!0}),l=F(t,u);function d(t){if(t.target&&!i){var n=t.target.closest(a);if(n){var r=n.getAttribute("data-tippy-trigger")||e.trigger||R.trigger;if(!n._tippy&&!("touchstart"===t.type&&"boolean"==typeof f.touch||"touchstart"!==t.type&&r.indexOf(X[t.type])<0)){var s=F(n,f);s&&(o=o.concat(s))}}}}function v(t,e,r,o){void 0===o&&(o=!1),t.addEventListener(e,r,o),n.push({node:t,eventType:e,handler:r,options:o})}return c(l).forEach((function(t){var e=t.destroy,a=t.enable,s=t.disable;t.destroy=function(t){void 0===t&&(t=!0),t&&o.forEach((function(t){t.destroy()})),o=[],n.forEach((function(t){var e=t.node,n=t.eventType,r=t.handler,o=t.options;e.removeEventListener(n,r,o)})),n=[],e()},t.enable=function(){a(),o.forEach((function(t){return t.enable()})),i=!1},t.disable=function(){s(),o.forEach((function(t){return t.disable()})),i=!0},function(t){var e=t.reference;v(e,"touchstart",d,r),v(e,"mouseover",d),v(e,"focusin",d),v(e,"click",d)}(t)})),l},F.hideAll=function(t){var e=void 0===t?{}:t,n=e.exclude,r=e.duration;_.forEach((function(t){var e=!1;if(n&&(e=b(n)?t.reference===n:t.popper===n.popper),!e){var o=t.props.duration;t.setProps({duration:r}),t.hide(),t.state.isDestroyed||t.setProps({duration:o})}}))},F.roundArrow='',F})); //# sourceMappingURL=tippy-bundle.umd.min.js.mapassets/js/tippy/dup-pro-tippy.css000064400000005140147600374260013103 0ustar00/*! ================================================ * DUPLICATOR TIPPY STYLE * Copyright:Snap Creek LLC 2015-2021 * ================================================ */ .tippy-box[data-theme~='duplicator'], .tippy-box[data-theme~='duplicator-filled'] { background-color: white; color: black; font-size: 12px; border-width: 1px; border-style: solid; border-radius: 0; padding: 0; max-width: 250px; } .tippy-box[data-theme~='duplicator'] .tippy-content, .tippy-box[data-theme~='duplicator-filled'] .tippy-content { padding: 0; } .tippy-box[data-theme~='duplicator'] h3, .tippy-box[data-theme~='duplicator-filled'] h3 { display: block; box-sizing: border-box; margin: 0; width: 100%; padding: 5px; font-weight: bold; font-size: 12px; } .tippy-box[data-theme~='duplicator'] .dup-tippy-content, .tippy-box[data-theme~='duplicator-filled'] .dup-tippy-content { padding: 5px; } .tippy-box[data-theme~='duplicator'] .dup-tippy-content *:first-child, .tippy-box[data-theme~='duplicator-filled'] .dup-tippy-content *:first-child { margin-top: 0; } .tippy-box[data-theme~='duplicator'] .dup-tippy-content *:last-child, .tippy-box[data-theme~='duplicator-filled'] .dup-tippy-content *:last-child { margin-bottom: 0; } .tippy-box[data-placement^='top']>.tippy-arrow::before { bottom: -9px; } .tippy-box[data-placement^='bottom']>.tippy-arrow::before { top: -9px; } .tippy-box[data-theme~='duplicator'], .tippy-box[data-theme~='duplicator-filled'] { border-color: #13659C; } .tippy-box[data-theme~='duplicator'] h3, .tippy-box[data-theme~='duplicato-filled'] h3 { background-color: #13659C; color: white; } .tippy-box[data-theme~='duplicator-filled'] .tippy-content { background-color: #13659C; color: white; } .tippy-box[data-theme~='duplicator'][data-placement^='top']>.tippy-arrow::before, .tippy-box[data-theme~='duplicator-filled'][data-placement^='top']>.tippy-arrow::before { border-top-color: #13659C; } .tippy-box[data-theme~='duplicator'][data-placement^='bottom']>.tippy-arrow::before, .tippy-box[data-theme~='duplicator-filled'][data-placement^='bottom']>.tippy-arrow::before { border-bottom-color: #13659C; } .tippy-box[data-theme~='duplicator'][data-placement^='left']>.tippy-arrow::before, .tippy-box[data-theme~='duplicator-filled'][data-placement^='left']>.tippy-arrow::before { border-left-color: #13659C; } .tippy-box[data-theme~='duplicator'][data-placement^='right']>.tippy-arrow::before, .tippy-box[data-theme~='duplicator-filled'][data-placement^='right']>.tippy-arrow::before { border-right-color: #13659C; }assets/js/tippy/index.php000064400000000020147600374260011450 0ustar00.tippy-arrow{bottom:0}.tippy-box[data-placement^=top]>.tippy-arrow:before{bottom:-7px;left:0;border-width:8px 8px 0;border-top-color:initial;transform-origin:center top}.tippy-box[data-placement^=bottom]>.tippy-arrow{top:0}.tippy-box[data-placement^=bottom]>.tippy-arrow:before{top:-7px;left:0;border-width:0 8px 8px;border-bottom-color:initial;transform-origin:center bottom}.tippy-box[data-placement^=left]>.tippy-arrow{right:0}.tippy-box[data-placement^=left]>.tippy-arrow:before{border-width:8px 0 8px 8px;border-left-color:initial;right:-7px;transform-origin:center left}.tippy-box[data-placement^=right]>.tippy-arrow{left:0}.tippy-box[data-placement^=right]>.tippy-arrow:before{left:-7px;border-width:8px 8px 8px 0;border-right-color:initial;transform-origin:center right}.tippy-box[data-inertia][data-state=visible]{transition-timing-function:cubic-bezier(.54,1.5,.38,1.11)}.tippy-arrow{width:16px;height:16px;color:#333}.tippy-arrow:before{content:\"\";position:absolute;border-color:transparent;border-style:solid}.tippy-content{position:relative;padding:5px 9px;z-index:1}"; function injectCSS(css) { var style = document.createElement('style'); style.textContent = css; style.setAttribute('data-tippy-stylesheet', ''); var head = document.head; var firstStyleOrLinkTag = document.querySelector('head>style,head>link'); if (firstStyleOrLinkTag) { head.insertBefore(style, firstStyleOrLinkTag); } else { head.appendChild(style); } } var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; var isIE11 = isBrowser ? // @ts-ignore !!window.msCrypto : false; var ROUND_ARROW = ''; var BOX_CLASS = "tippy-box"; var CONTENT_CLASS = "tippy-content"; var BACKDROP_CLASS = "tippy-backdrop"; var ARROW_CLASS = "tippy-arrow"; var SVG_ARROW_CLASS = "tippy-svg-arrow"; var TOUCH_OPTIONS = { passive: true, capture: true }; var TIPPY_DEFAULT_APPEND_TO = function TIPPY_DEFAULT_APPEND_TO() { return document.body; }; function hasOwnProperty(obj, key) { return {}.hasOwnProperty.call(obj, key); } function getValueAtIndexOrReturn(value, index, defaultValue) { if (Array.isArray(value)) { var v = value[index]; return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v; } return value; } function isType(value, type) { var str = {}.toString.call(value); return str.indexOf('[object') === 0 && str.indexOf(type + "]") > -1; } function invokeWithArgsOrReturn(value, args) { return typeof value === 'function' ? value.apply(void 0, args) : value; } function debounce(fn, ms) { // Avoid wrapping in `setTimeout` if ms is 0 anyway if (ms === 0) { return fn; } var timeout; return function (arg) { clearTimeout(timeout); timeout = setTimeout(function () { fn(arg); }, ms); }; } function removeProperties(obj, keys) { var clone = Object.assign({}, obj); keys.forEach(function (key) { delete clone[key]; }); return clone; } function splitBySpaces(value) { return value.split(/\s+/).filter(Boolean); } function normalizeToArray(value) { return [].concat(value); } function pushIfUnique(arr, value) { if (arr.indexOf(value) === -1) { arr.push(value); } } function unique(arr) { return arr.filter(function (item, index) { return arr.indexOf(item) === index; }); } function getBasePlacement(placement) { return placement.split('-')[0]; } function arrayFrom(value) { return [].slice.call(value); } function removeUndefinedProps(obj) { return Object.keys(obj).reduce(function (acc, key) { if (obj[key] !== undefined) { acc[key] = obj[key]; } return acc; }, {}); } function div() { return document.createElement('div'); } function isElement(value) { return ['Element', 'Fragment'].some(function (type) { return isType(value, type); }); } function isNodeList(value) { return isType(value, 'NodeList'); } function isMouseEvent(value) { return isType(value, 'MouseEvent'); } function isReferenceElement(value) { return !!(value && value._tippy && value._tippy.reference === value); } function getArrayOfElements(value) { if (isElement(value)) { return [value]; } if (isNodeList(value)) { return arrayFrom(value); } if (Array.isArray(value)) { return value; } return arrayFrom(document.querySelectorAll(value)); } function setTransitionDuration(els, value) { els.forEach(function (el) { if (el) { el.style.transitionDuration = value + "ms"; } }); } function setVisibilityState(els, state) { els.forEach(function (el) { if (el) { el.setAttribute('data-state', state); } }); } function getOwnerDocument(elementOrElements) { var _element$ownerDocumen; var _normalizeToArray = normalizeToArray(elementOrElements), element = _normalizeToArray[0]; // Elements created via a