From 39e8fb2036945303836c461a61f133b0059c8991 Mon Sep 17 00:00:00 2001 From: Christian Cleberg Date: Mon, 22 May 2023 15:19:08 -0500 Subject: initial commit --- vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 445 ++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 17 + vendor/composer/autoload_files.php | 17 + vendor/composer/autoload_namespaces.php | 11 + vendor/composer/autoload_psr4.php | 17 + vendor/composer/autoload_real.php | 73 + vendor/composer/autoload_static.php | 113 + vendor/composer/installed.json | 748 +++ vendor/eher/oauth/.gitignore | 4 + vendor/eher/oauth/.travis.yml | 9 + vendor/eher/oauth/README.md | 3 + vendor/eher/oauth/composer.json | 17 + vendor/eher/oauth/phpunit.xml.dist | 7 + vendor/eher/oauth/src/Eher/OAuth/Consumer.php | 19 + vendor/eher/oauth/src/Eher/OAuth/HmacSha1.php | 31 + .../eher/oauth/src/Eher/OAuth/OAuthDataStore.php | 30 + .../eher/oauth/src/Eher/OAuth/OAuthException.php | 9 + vendor/eher/oauth/src/Eher/OAuth/OAuthServer.php | 225 + vendor/eher/oauth/src/Eher/OAuth/PlainText.php | 36 + vendor/eher/oauth/src/Eher/OAuth/Request.php | 264 + vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php | 70 + .../eher/oauth/src/Eher/OAuth/SignatureMethod.php | 40 + vendor/eher/oauth/src/Eher/OAuth/Token.php | 34 + vendor/eher/oauth/src/Eher/OAuth/Util.php | 155 + vendor/eher/oauth/test/Eher/OAuth/ConsumerTest.php | 18 + vendor/eher/oauth/test/Eher/OAuth/RequestTest.php | 40 + vendor/guzzlehttp/guzzle/.php_cs | 23 + vendor/guzzlehttp/guzzle/CHANGELOG.md | 1338 +++++ vendor/guzzlehttp/guzzle/Dockerfile | 18 + vendor/guzzlehttp/guzzle/LICENSE | 19 + vendor/guzzlehttp/guzzle/README.md | 90 + vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++++ vendor/guzzlehttp/guzzle/composer.json | 59 + vendor/guzzlehttp/guzzle/src/Client.php | 501 ++ vendor/guzzlehttp/guzzle/src/ClientInterface.php | 87 + vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php | 316 ++ .../guzzle/src/Cookie/CookieJarInterface.php | 84 + .../guzzlehttp/guzzle/src/Cookie/FileCookieJar.php | 91 + .../guzzle/src/Cookie/SessionCookieJar.php | 72 + vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php | 403 ++ .../guzzle/src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 9 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 23 + .../src/Exception/InvalidArgumentException.php | 7 + .../guzzle/src/Exception/RequestException.php | 192 + .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 9 + .../src/Exception/TooManyRedirectsException.php | 6 + .../guzzle/src/Exception/TransferException.php | 6 + .../guzzlehttp/guzzle/src/Handler/CurlFactory.php | 585 ++ .../guzzle/src/Handler/CurlFactoryInterface.php | 27 + .../guzzlehttp/guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 219 + .../guzzlehttp/guzzle/src/Handler/EasyHandle.php | 92 + .../guzzlehttp/guzzle/src/Handler/MockHandler.php | 195 + vendor/guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 545 ++ vendor/guzzlehttp/guzzle/src/HandlerStack.php | 277 + vendor/guzzlehttp/guzzle/src/MessageFormatter.php | 185 + vendor/guzzlehttp/guzzle/src/Middleware.php | 254 + vendor/guzzlehttp/guzzle/src/Pool.php | 134 + .../guzzle/src/PrepareBodyMiddleware.php | 111 + .../guzzlehttp/guzzle/src/RedirectMiddleware.php | 255 + vendor/guzzlehttp/guzzle/src/RequestOptions.php | 263 + vendor/guzzlehttp/guzzle/src/RetryMiddleware.php | 128 + vendor/guzzlehttp/guzzle/src/TransferStats.php | 126 + vendor/guzzlehttp/guzzle/src/UriTemplate.php | 237 + vendor/guzzlehttp/guzzle/src/Utils.php | 92 + vendor/guzzlehttp/guzzle/src/functions.php | 334 ++ vendor/guzzlehttp/guzzle/src/functions_include.php | 6 + vendor/guzzlehttp/promises/CHANGELOG.md | 65 + vendor/guzzlehttp/promises/LICENSE | 19 + vendor/guzzlehttp/promises/Makefile | 13 + vendor/guzzlehttp/promises/README.md | 504 ++ vendor/guzzlehttp/promises/composer.json | 34 + .../guzzlehttp/promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + vendor/guzzlehttp/promises/src/Coroutine.php | 151 + vendor/guzzlehttp/promises/src/EachPromise.php | 229 + .../guzzlehttp/promises/src/FulfilledPromise.php | 82 + vendor/guzzlehttp/promises/src/Promise.php | 280 + .../guzzlehttp/promises/src/PromiseInterface.php | 93 + .../guzzlehttp/promises/src/PromisorInterface.php | 15 + vendor/guzzlehttp/promises/src/RejectedPromise.php | 87 + .../guzzlehttp/promises/src/RejectionException.php | 47 + vendor/guzzlehttp/promises/src/TaskQueue.php | 66 + .../guzzlehttp/promises/src/TaskQueueInterface.php | 25 + vendor/guzzlehttp/promises/src/functions.php | 457 ++ .../guzzlehttp/promises/src/functions_include.php | 6 + vendor/guzzlehttp/psr7/CHANGELOG.md | 246 + vendor/guzzlehttp/psr7/LICENSE | 19 + vendor/guzzlehttp/psr7/README.md | 745 +++ vendor/guzzlehttp/psr7/composer.json | 49 + vendor/guzzlehttp/psr7/src/AppendStream.php | 241 + vendor/guzzlehttp/psr7/src/BufferStream.php | 137 + vendor/guzzlehttp/psr7/src/CachingStream.php | 138 + vendor/guzzlehttp/psr7/src/DroppingStream.php | 42 + vendor/guzzlehttp/psr7/src/FnStream.php | 158 + vendor/guzzlehttp/psr7/src/InflateStream.php | 52 + vendor/guzzlehttp/psr7/src/LazyOpenStream.php | 39 + vendor/guzzlehttp/psr7/src/LimitStream.php | 155 + vendor/guzzlehttp/psr7/src/MessageTrait.php | 213 + vendor/guzzlehttp/psr7/src/MultipartStream.php | 153 + vendor/guzzlehttp/psr7/src/NoSeekStream.php | 22 + vendor/guzzlehttp/psr7/src/PumpStream.php | 165 + vendor/guzzlehttp/psr7/src/Request.php | 151 + vendor/guzzlehttp/psr7/src/Response.php | 154 + vendor/guzzlehttp/psr7/src/Rfc7230.php | 18 + vendor/guzzlehttp/psr7/src/ServerRequest.php | 376 ++ vendor/guzzlehttp/psr7/src/Stream.php | 267 + .../guzzlehttp/psr7/src/StreamDecoratorTrait.php | 149 + vendor/guzzlehttp/psr7/src/StreamWrapper.php | 161 + vendor/guzzlehttp/psr7/src/UploadedFile.php | 316 ++ vendor/guzzlehttp/psr7/src/Uri.php | 760 +++ vendor/guzzlehttp/psr7/src/UriNormalizer.php | 216 + vendor/guzzlehttp/psr7/src/UriResolver.php | 219 + vendor/guzzlehttp/psr7/src/functions.php | 899 +++ vendor/guzzlehttp/psr7/src/functions_include.php | 6 + vendor/paragonie/random_compat/LICENSE | 22 + vendor/paragonie/random_compat/build-phar.sh | 5 + vendor/paragonie/random_compat/composer.json | 34 + .../random_compat/dist/random_compat.phar.pubkey | 5 + .../dist/random_compat.phar.pubkey.asc | 11 + vendor/paragonie/random_compat/lib/random.php | 32 + .../paragonie/random_compat/other/build_phar.php | 57 + vendor/paragonie/random_compat/psalm-autoload.php | 9 + vendor/paragonie/random_compat/psalm.xml | 19 + vendor/psr/http-message/CHANGELOG.md | 36 + vendor/psr/http-message/LICENSE | 19 + vendor/psr/http-message/README.md | 13 + vendor/psr/http-message/composer.json | 26 + vendor/psr/http-message/src/MessageInterface.php | 187 + vendor/psr/http-message/src/RequestInterface.php | 129 + vendor/psr/http-message/src/ResponseInterface.php | 68 + .../http-message/src/ServerRequestInterface.php | 261 + vendor/psr/http-message/src/StreamInterface.php | 158 + .../psr/http-message/src/UploadedFileInterface.php | 123 + vendor/psr/http-message/src/UriInterface.php | 323 ++ vendor/ralouphie/getallheaders/LICENSE | 21 + vendor/ralouphie/getallheaders/README.md | 27 + vendor/ralouphie/getallheaders/composer.json | 26 + .../ralouphie/getallheaders/src/getallheaders.php | 46 + vendor/symfony/polyfill-intl-idn/Idn.php | 915 ++++ vendor/symfony/polyfill-intl-idn/Info.php | 23 + vendor/symfony/polyfill-intl-idn/LICENSE | 19 + vendor/symfony/polyfill-intl-idn/README.md | 12 + .../Resources/unidata/DisallowedRanges.php | 375 ++ .../polyfill-intl-idn/Resources/unidata/Regex.php | 24 + .../Resources/unidata/deviation.php | 8 + .../Resources/unidata/disallowed.php | 2638 +++++++++ .../Resources/unidata/disallowed_STD3_mapped.php | 308 ++ .../Resources/unidata/disallowed_STD3_valid.php | 71 + .../Resources/unidata/ignored.php | 273 + .../polyfill-intl-idn/Resources/unidata/mapped.php | 5778 ++++++++++++++++++++ .../polyfill-intl-idn/Resources/unidata/virama.php | 65 + vendor/symfony/polyfill-intl-idn/bootstrap.php | 141 + vendor/symfony/polyfill-intl-idn/composer.json | 45 + vendor/symfony/polyfill-intl-normalizer/LICENSE | 19 + .../polyfill-intl-normalizer/Normalizer.php | 308 ++ vendor/symfony/polyfill-intl-normalizer/README.md | 14 + .../Resources/stubs/Normalizer.php | 17 + .../Resources/unidata/canonicalComposition.php | 945 ++++ .../Resources/unidata/canonicalDecomposition.php | 2065 +++++++ .../Resources/unidata/combiningClass.php | 876 +++ .../unidata/compatibilityDecomposition.php | 3695 +++++++++++++ .../symfony/polyfill-intl-normalizer/bootstrap.php | 19 + .../symfony/polyfill-intl-normalizer/composer.json | 39 + vendor/symfony/polyfill-php70/LICENSE | 19 + vendor/symfony/polyfill-php70/Php70.php | 74 + vendor/symfony/polyfill-php70/README.md | 28 + .../Resources/stubs/ArithmeticError.php | 5 + .../Resources/stubs/AssertionError.php | 5 + .../Resources/stubs/DivisionByZeroError.php | 5 + .../polyfill-php70/Resources/stubs/Error.php | 5 + .../polyfill-php70/Resources/stubs/ParseError.php | 5 + .../SessionUpdateTimestampHandlerInterface.php | 23 + .../polyfill-php70/Resources/stubs/TypeError.php | 5 + vendor/symfony/polyfill-php70/bootstrap.php | 30 + vendor/symfony/polyfill-php70/composer.json | 37 + vendor/symfony/polyfill-php72/LICENSE | 19 + vendor/symfony/polyfill-php72/Php72.php | 217 + vendor/symfony/polyfill-php72/README.md | 28 + vendor/symfony/polyfill-php72/bootstrap.php | 57 + vendor/symfony/polyfill-php72/composer.json | 35 + vendor/tumblr/tumblr/.gitignore | 12 + vendor/tumblr/tumblr/.travis.yml | 12 + vendor/tumblr/tumblr/CONTRIBUTING.md | 22 + vendor/tumblr/tumblr/LICENSE | 202 + vendor/tumblr/tumblr/README.md | 109 + vendor/tumblr/tumblr/composer.json | 39 + vendor/tumblr/tumblr/lib/Tumblr/API/Client.php | 502 ++ .../tumblr/lib/Tumblr/API/RequestException.php | 35 + .../tumblr/lib/Tumblr/API/RequestHandler.php | 151 + vendor/tumblr/tumblr/phpunit.xml | 15 + vendor/tumblr/tumblr/test/BlogTest.php | 67 + vendor/tumblr/tumblr/test/PostTest.php | 30 + vendor/tumblr/tumblr/test/RequestExceptionTest.php | 28 + vendor/tumblr/tumblr/test/RequestHandlerTest.php | 71 + vendor/tumblr/tumblr/test/TaggedTest.php | 16 + vendor/tumblr/tumblr/test/TumblrTest.php | 51 + vendor/tumblr/tumblr/test/UserTest.php | 40 + vendor/tumblr/tumblr/test/bootstrap.php | 8 + 205 files changed, 42112 insertions(+) create mode 100644 vendor/autoload.php create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_files.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/eher/oauth/.gitignore create mode 100644 vendor/eher/oauth/.travis.yml create mode 100644 vendor/eher/oauth/README.md create mode 100644 vendor/eher/oauth/composer.json create mode 100644 vendor/eher/oauth/phpunit.xml.dist create mode 100644 vendor/eher/oauth/src/Eher/OAuth/Consumer.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/HmacSha1.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/OAuthDataStore.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/OAuthException.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/OAuthServer.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/PlainText.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/Request.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/SignatureMethod.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/Token.php create mode 100644 vendor/eher/oauth/src/Eher/OAuth/Util.php create mode 100644 vendor/eher/oauth/test/Eher/OAuth/ConsumerTest.php create mode 100644 vendor/eher/oauth/test/Eher/OAuth/RequestTest.php create mode 100644 vendor/guzzlehttp/guzzle/.php_cs create mode 100644 vendor/guzzlehttp/guzzle/CHANGELOG.md create mode 100644 vendor/guzzlehttp/guzzle/Dockerfile create mode 100644 vendor/guzzlehttp/guzzle/LICENSE create mode 100644 vendor/guzzlehttp/guzzle/README.md create mode 100644 vendor/guzzlehttp/guzzle/UPGRADING.md create mode 100644 vendor/guzzlehttp/guzzle/composer.json create mode 100644 vendor/guzzlehttp/guzzle/src/Client.php create mode 100644 vendor/guzzlehttp/guzzle/src/ClientInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/FileCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php create mode 100644 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ClientException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ConnectException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/InvalidArgumentException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/RequestException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/SeekException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/ServerException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TooManyRedirectsException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Exception/TransferException.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/Proxy.php create mode 100644 vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php create mode 100644 vendor/guzzlehttp/guzzle/src/HandlerStack.php create mode 100644 vendor/guzzlehttp/guzzle/src/MessageFormatter.php create mode 100644 vendor/guzzlehttp/guzzle/src/Middleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/Pool.php create mode 100644 vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/RequestOptions.php create mode 100644 vendor/guzzlehttp/guzzle/src/RetryMiddleware.php create mode 100644 vendor/guzzlehttp/guzzle/src/TransferStats.php create mode 100644 vendor/guzzlehttp/guzzle/src/UriTemplate.php create mode 100644 vendor/guzzlehttp/guzzle/src/Utils.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions.php create mode 100644 vendor/guzzlehttp/guzzle/src/functions_include.php create mode 100644 vendor/guzzlehttp/promises/CHANGELOG.md create mode 100644 vendor/guzzlehttp/promises/LICENSE create mode 100644 vendor/guzzlehttp/promises/Makefile create mode 100644 vendor/guzzlehttp/promises/README.md create mode 100644 vendor/guzzlehttp/promises/composer.json create mode 100644 vendor/guzzlehttp/promises/src/AggregateException.php create mode 100644 vendor/guzzlehttp/promises/src/CancellationException.php create mode 100644 vendor/guzzlehttp/promises/src/Coroutine.php create mode 100644 vendor/guzzlehttp/promises/src/EachPromise.php create mode 100644 vendor/guzzlehttp/promises/src/FulfilledPromise.php create mode 100644 vendor/guzzlehttp/promises/src/Promise.php create mode 100644 vendor/guzzlehttp/promises/src/PromiseInterface.php create mode 100644 vendor/guzzlehttp/promises/src/PromisorInterface.php create mode 100644 vendor/guzzlehttp/promises/src/RejectedPromise.php create mode 100644 vendor/guzzlehttp/promises/src/RejectionException.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueue.php create mode 100644 vendor/guzzlehttp/promises/src/TaskQueueInterface.php create mode 100644 vendor/guzzlehttp/promises/src/functions.php create mode 100644 vendor/guzzlehttp/promises/src/functions_include.php create mode 100644 vendor/guzzlehttp/psr7/CHANGELOG.md create mode 100644 vendor/guzzlehttp/psr7/LICENSE create mode 100644 vendor/guzzlehttp/psr7/README.md create mode 100644 vendor/guzzlehttp/psr7/composer.json create mode 100644 vendor/guzzlehttp/psr7/src/AppendStream.php create mode 100644 vendor/guzzlehttp/psr7/src/BufferStream.php create mode 100644 vendor/guzzlehttp/psr7/src/CachingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/DroppingStream.php create mode 100644 vendor/guzzlehttp/psr7/src/FnStream.php create mode 100644 vendor/guzzlehttp/psr7/src/InflateStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LazyOpenStream.php create mode 100644 vendor/guzzlehttp/psr7/src/LimitStream.php create mode 100644 vendor/guzzlehttp/psr7/src/MessageTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/MultipartStream.php create mode 100644 vendor/guzzlehttp/psr7/src/NoSeekStream.php create mode 100644 vendor/guzzlehttp/psr7/src/PumpStream.php create mode 100644 vendor/guzzlehttp/psr7/src/Request.php create mode 100644 vendor/guzzlehttp/psr7/src/Response.php create mode 100644 vendor/guzzlehttp/psr7/src/Rfc7230.php create mode 100644 vendor/guzzlehttp/psr7/src/ServerRequest.php create mode 100644 vendor/guzzlehttp/psr7/src/Stream.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php create mode 100644 vendor/guzzlehttp/psr7/src/StreamWrapper.php create mode 100644 vendor/guzzlehttp/psr7/src/UploadedFile.php create mode 100644 vendor/guzzlehttp/psr7/src/Uri.php create mode 100644 vendor/guzzlehttp/psr7/src/UriNormalizer.php create mode 100644 vendor/guzzlehttp/psr7/src/UriResolver.php create mode 100644 vendor/guzzlehttp/psr7/src/functions.php create mode 100644 vendor/guzzlehttp/psr7/src/functions_include.php create mode 100644 vendor/paragonie/random_compat/LICENSE create mode 100644 vendor/paragonie/random_compat/build-phar.sh create mode 100644 vendor/paragonie/random_compat/composer.json create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey create mode 100644 vendor/paragonie/random_compat/dist/random_compat.phar.pubkey.asc create mode 100644 vendor/paragonie/random_compat/lib/random.php create mode 100644 vendor/paragonie/random_compat/other/build_phar.php create mode 100644 vendor/paragonie/random_compat/psalm-autoload.php create mode 100644 vendor/paragonie/random_compat/psalm.xml create mode 100644 vendor/psr/http-message/CHANGELOG.md create mode 100644 vendor/psr/http-message/LICENSE create mode 100644 vendor/psr/http-message/README.md create mode 100644 vendor/psr/http-message/composer.json create mode 100644 vendor/psr/http-message/src/MessageInterface.php create mode 100644 vendor/psr/http-message/src/RequestInterface.php create mode 100644 vendor/psr/http-message/src/ResponseInterface.php create mode 100644 vendor/psr/http-message/src/ServerRequestInterface.php create mode 100644 vendor/psr/http-message/src/StreamInterface.php create mode 100644 vendor/psr/http-message/src/UploadedFileInterface.php create mode 100644 vendor/psr/http-message/src/UriInterface.php create mode 100644 vendor/ralouphie/getallheaders/LICENSE create mode 100644 vendor/ralouphie/getallheaders/README.md create mode 100644 vendor/ralouphie/getallheaders/composer.json create mode 100644 vendor/ralouphie/getallheaders/src/getallheaders.php create mode 100644 vendor/symfony/polyfill-intl-idn/Idn.php create mode 100644 vendor/symfony/polyfill-intl-idn/Info.php create mode 100644 vendor/symfony/polyfill-intl-idn/LICENSE create mode 100644 vendor/symfony/polyfill-intl-idn/README.md create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/deviation.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php create mode 100644 vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php create mode 100644 vendor/symfony/polyfill-intl-idn/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-idn/composer.json create mode 100644 vendor/symfony/polyfill-intl-normalizer/LICENSE create mode 100644 vendor/symfony/polyfill-intl-normalizer/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/README.md create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalComposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/bootstrap.php create mode 100644 vendor/symfony/polyfill-intl-normalizer/composer.json create mode 100644 vendor/symfony/polyfill-php70/LICENSE create mode 100644 vendor/symfony/polyfill-php70/Php70.php create mode 100644 vendor/symfony/polyfill-php70/README.md create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/AssertionError.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/Error.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/ParseError.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php create mode 100644 vendor/symfony/polyfill-php70/Resources/stubs/TypeError.php create mode 100644 vendor/symfony/polyfill-php70/bootstrap.php create mode 100644 vendor/symfony/polyfill-php70/composer.json create mode 100644 vendor/symfony/polyfill-php72/LICENSE create mode 100644 vendor/symfony/polyfill-php72/Php72.php create mode 100644 vendor/symfony/polyfill-php72/README.md create mode 100644 vendor/symfony/polyfill-php72/bootstrap.php create mode 100644 vendor/symfony/polyfill-php72/composer.json create mode 100644 vendor/tumblr/tumblr/.gitignore create mode 100644 vendor/tumblr/tumblr/.travis.yml create mode 100644 vendor/tumblr/tumblr/CONTRIBUTING.md create mode 100644 vendor/tumblr/tumblr/LICENSE create mode 100644 vendor/tumblr/tumblr/README.md create mode 100644 vendor/tumblr/tumblr/composer.json create mode 100644 vendor/tumblr/tumblr/lib/Tumblr/API/Client.php create mode 100644 vendor/tumblr/tumblr/lib/Tumblr/API/RequestException.php create mode 100644 vendor/tumblr/tumblr/lib/Tumblr/API/RequestHandler.php create mode 100644 vendor/tumblr/tumblr/phpunit.xml create mode 100644 vendor/tumblr/tumblr/test/BlogTest.php create mode 100644 vendor/tumblr/tumblr/test/PostTest.php create mode 100644 vendor/tumblr/tumblr/test/RequestExceptionTest.php create mode 100644 vendor/tumblr/tumblr/test/RequestHandlerTest.php create mode 100644 vendor/tumblr/tumblr/test/TaggedTest.php create mode 100644 vendor/tumblr/tumblr/test/TumblrTest.php create mode 100644 vendor/tumblr/tumblr/test/UserTest.php create mode 100644 vendor/tumblr/tumblr/test/bootstrap.php (limited to 'vendor') diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..527cadb --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,7 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see http://www.php-fig.org/psr/psr-0/ + * @see http://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + // PSR-4 + private $prefixLengthsPsr4 = array(); + private $prefixDirsPsr4 = array(); + private $fallbackDirsPsr4 = array(); + + // PSR-0 + private $prefixesPsr0 = array(); + private $fallbackDirsPsr0 = array(); + + private $useIncludePath = false; + private $classMap = array(); + private $classMapAuthoritative = false; + private $missingClasses = array(); + private $apcuPrefix; + + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + */ + public function add($prefix, $paths, $prepend = false) + { + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + (array) $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + (array) $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + (array) $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + } + + /** + * Unregisters this instance as an autoloader. + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return bool|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + includeFile($file); + + return true; + } + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } +} + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..6e0d84a --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,17 @@ + $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', + 'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', + 'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', + 'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php', + 'Normalizer' => $vendorDir . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', + 'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', + 'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', +); diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php new file mode 100644 index 0000000..851b997 --- /dev/null +++ b/vendor/composer/autoload_files.php @@ -0,0 +1,17 @@ + $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php', + '25072dd6e2470089de65ae7bf11d3109' => $vendorDir . '/symfony/polyfill-php72/bootstrap.php', + 'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php', + 'f598d06aa772fa33d905e87be6398fb1' => $vendorDir . '/symfony/polyfill-intl-idn/bootstrap.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..412af9e --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,11 @@ + array($vendorDir . '/tumblr/tumblr/lib'), + 'Eher\\OAuth' => array($vendorDir . '/eher/oauth/src'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..1e17d6c --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,17 @@ + array($vendorDir . '/symfony/polyfill-php72'), + 'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => array($vendorDir . '/symfony/polyfill-intl-normalizer'), + 'Symfony\\Polyfill\\Intl\\Idn\\' => array($vendorDir . '/symfony/polyfill-intl-idn'), + 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), + 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'), + 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'), + 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..91bd6bb --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,73 @@ += 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::getInitializer($loader)); + } else { + $map = require __DIR__ . '/autoload_namespaces.php'; + foreach ($map as $namespace => $path) { + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); + } + + $classMap = require __DIR__ . '/autoload_classmap.php'; + if ($classMap) { + $loader->addClassMap($classMap); + } + } + + $loader->register(true); + + if ($useStaticLoader) { + $includeFiles = Composer\Autoload\ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequiref8d6d64bba203612c5380d5c06f720ff($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequiref8d6d64bba203612c5380d5c06f720ff($fileIdentifier, $file) +{ + if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { + require $file; + + $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 0000000..9846f92 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,113 @@ + __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php', + 'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php', + '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php', + '25072dd6e2470089de65ae7bf11d3109' => __DIR__ . '/..' . '/symfony/polyfill-php72/bootstrap.php', + 'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + 'f598d06aa772fa33d905e87be6398fb1' => __DIR__ . '/..' . '/symfony/polyfill-intl-idn/bootstrap.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'S' => + array ( + 'Symfony\\Polyfill\\Php72\\' => 23, + 'Symfony\\Polyfill\\Php70\\' => 23, + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => 33, + 'Symfony\\Polyfill\\Intl\\Idn\\' => 26, + ), + 'P' => + array ( + 'Psr\\Http\\Message\\' => 17, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'Symfony\\Polyfill\\Php72\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php72', + ), + 'Symfony\\Polyfill\\Php70\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-php70', + ), + 'Symfony\\Polyfill\\Intl\\Normalizer\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer', + ), + 'Symfony\\Polyfill\\Intl\\Idn\\' => + array ( + 0 => __DIR__ . '/..' . '/symfony/polyfill-intl-idn', + ), + 'Psr\\Http\\Message\\' => + array ( + 0 => __DIR__ . '/..' . '/psr/http-message/src', + ), + 'GuzzleHttp\\Psr7\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/psr7/src', + ), + 'GuzzleHttp\\Promise\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/promises/src', + ), + 'GuzzleHttp\\' => + array ( + 0 => __DIR__ . '/..' . '/guzzlehttp/guzzle/src', + ), + ); + + public static $prefixesPsr0 = array ( + 'T' => + array ( + 'Tumblr\\API' => + array ( + 0 => __DIR__ . '/..' . '/tumblr/tumblr/lib', + ), + ), + 'E' => + array ( + 'Eher\\OAuth' => + array ( + 0 => __DIR__ . '/..' . '/eher/oauth/src', + ), + ), + ); + + public static $classMap = array ( + 'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php', + 'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php', + 'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php', + 'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php', + 'Normalizer' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php', + 'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php', + 'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php', + 'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::$prefixesPsr0; + $loader->classMap = ComposerStaticInitf8d6d64bba203612c5380d5c06f720ff::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..6cfbe5b --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,748 @@ +[ + { + "name": "eher/oauth", + "version": "1.0.7", + "version_normalized": "1.0.7.0", + "source": { + "type": "git", + "url": "https://github.com/EHER/OAuth.git", + "reference": "935c1f7709d1c1457de9e250d0e5f29cac06e507" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/EHER/OAuth/zipball/935c1f7709d1c1457de9e250d0e5f29cac06e507", + "reference": "935c1f7709d1c1457de9e250d0e5f29cac06e507", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "eher/phpunit": "1.6" + }, + "time": "2012-12-13T23:48:10+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Eher\\OAuth": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "OAuth 1 PHP Library" + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.5.5", + "version_normalized": "6.5.5.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "reference": "9d4290de1cfd701f38099ef7e183b64b4b7b0c5e", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.17.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2020-06-16T21:01:06+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "rest", + "web service" + ] + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "version_normalized": "1.3.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", + "shasum": "" + }, + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "time": "2016-12-20T10:07:11+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ] + }, + { + "name": "guzzlehttp/psr7", + "version": "1.6.1", + "version_normalized": "1.6.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/239400de7a173fe9901b9ac7c06497751f00727a", + "reference": "239400de7a173fe9901b9ac7c06497751f00727a", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "ext-zlib": "*", + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "time": "2019-07-01T23:21:34+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ] + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.99", + "version_normalized": "9.99.99.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95", + "shasum": "" + }, + "require": { + "php": "^7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "time": "2018-07-02T15:55:56+00:00", + "type": "library", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ] + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2016-08-06T14:39:51+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ] + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "version_normalized": "3.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "time": "2019-03-08T08:55:37+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders." + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "reference": "5dcab1bc7146cf8c1beaa4502a3d9be344334251", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-08-04T06:02:08+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "reference": "37078a8dd4a2a1e9ab0231af7c6cb671b2ed5a7e", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php70", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php70.git", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "reference": "0dd93f2c578bdc9c72697eaa5f1dd25644e618d3", + "shasum": "" + }, + "require": { + "paragonie/random_compat": "~1.0|~2.0|~9.99", + "php": ">=5.3.3" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php70\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.18.1", + "version_normalized": "1.18.1.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "639447d008615574653fb3bc60d1986d7172eaae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/639447d008615574653fb3bc60d1986d7172eaae", + "reference": "639447d008615574653fb3bc60d1986d7172eaae", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2020-07-14T12:35:20+00:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ] + }, + { + "name": "tumblr/tumblr", + "version": "v0.4.0", + "version_normalized": "0.4.0.0", + "source": { + "type": "git", + "url": "https://github.com/tumblr/tumblr.php.git", + "reference": "308ad2a8a840ae8a8b70e96a19701b7ef1b00d0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tumblr/tumblr.php/zipball/308ad2a8a840ae8a8b70e96a19701b7ef1b00d0d", + "reference": "308ad2a8a840ae8a8b70e96a19701b7ef1b00d0d", + "shasum": "" + }, + "require": { + "eher/oauth": "1.0.*", + "guzzlehttp/guzzle": "6.*" + }, + "require-dev": { + "phpunit/phpunit": "5.3.*" + }, + "time": "2017-09-29T21:32:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Tumblr\\API": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "John Crepezzi", + "email": "john.crepezzi@gmail.com", + "homepage": "https://github.com/seejohnrun", + "role": "developer" + } + ], + "description": "Official Tumblr PHP Client", + "homepage": "https://github.com/tumblr/tumblr.php", + "keywords": [ + "api", + "gif", + "sdk", + "tumblr" + ] + } +] diff --git a/vendor/eher/oauth/.gitignore b/vendor/eher/oauth/.gitignore new file mode 100644 index 0000000..eeeaea3 --- /dev/null +++ b/vendor/eher/oauth/.gitignore @@ -0,0 +1,4 @@ +*.swp +composer.phar +composer.lock +vendor diff --git a/vendor/eher/oauth/.travis.yml b/vendor/eher/oauth/.travis.yml new file mode 100644 index 0000000..f64de41 --- /dev/null +++ b/vendor/eher/oauth/.travis.yml @@ -0,0 +1,9 @@ +language: php + +php: + - 5.3 + - 5.4 + +before_script: + - wget -c http://getcomposer.org/composer.phar + - php composer.phar install diff --git a/vendor/eher/oauth/README.md b/vendor/eher/oauth/README.md new file mode 100644 index 0000000..c288c8c --- /dev/null +++ b/vendor/eher/oauth/README.md @@ -0,0 +1,3 @@ +#OAuth 1 PHP Library[![Build Status](https://secure.travis-ci.org/EHER/OAuth.png?branch=master)](http://travis-ci.org/EHER/OAuth) + +Based on [Andy Smith's](http://term.ie/) [basic php library](http://oauth.googlecode.com/svn/code/php/) for OAuth. diff --git a/vendor/eher/oauth/composer.json b/vendor/eher/oauth/composer.json new file mode 100644 index 0000000..29bf4d9 --- /dev/null +++ b/vendor/eher/oauth/composer.json @@ -0,0 +1,17 @@ +{ + "name": "eher/oauth", + "type": "library", + "license": "BSD-3-Clause", + "description": "OAuth 1 PHP Library", + "require": { + "php": ">=5.3.0" + }, + "autoload": { + "psr-0": { + "Eher\\OAuth": "src" + } + }, + "require-dev": { + "eher/phpunit": "1.6" + } +} diff --git a/vendor/eher/oauth/phpunit.xml.dist b/vendor/eher/oauth/phpunit.xml.dist new file mode 100644 index 0000000..9735ad4 --- /dev/null +++ b/vendor/eher/oauth/phpunit.xml.dist @@ -0,0 +1,7 @@ + + + + test + + + diff --git a/vendor/eher/oauth/src/Eher/OAuth/Consumer.php b/vendor/eher/oauth/src/Eher/OAuth/Consumer.php new file mode 100644 index 0000000..44dbc59 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/Consumer.php @@ -0,0 +1,19 @@ +key = $key; + $this->secret = $secret; + $this->callback_url = $callback_url; + } + + function __toString() { + return "Consumer[key=$this->key,secret=$this->secret]"; + } +} + diff --git a/vendor/eher/oauth/src/Eher/OAuth/HmacSha1.php b/vendor/eher/oauth/src/Eher/OAuth/HmacSha1.php new file mode 100644 index 0000000..be7da63 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/HmacSha1.php @@ -0,0 +1,31 @@ +get_signature_base_string(); + $request->base_string = $base_string; + + $key_parts = array( + $consumer->secret, + ($token) ? $token->secret : "" + ); + + $key_parts = Util::urlencode_rfc3986($key_parts); + $key = implode('&', $key_parts); + + return base64_encode(hash_hmac('sha1', $base_string, $key, true)); + } +} diff --git a/vendor/eher/oauth/src/Eher/OAuth/OAuthDataStore.php b/vendor/eher/oauth/src/Eher/OAuth/OAuthDataStore.php new file mode 100644 index 0000000..8ad2f30 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/OAuthDataStore.php @@ -0,0 +1,30 @@ +data_store = $data_store; + } + + public function add_signature_method($signature_method) { + $this->signature_methods[$signature_method->get_name()] = + $signature_method; + } + + // high level functions + + /** + * process a request_token request + * returns the request token on success + */ + public function fetch_request_token(&$request) { + $this->get_version($request); + + $consumer = $this->get_consumer($request); + + // no token required for the initial token request + $token = NULL; + + $this->check_signature($request, $consumer, $token); + + // Rev A change + $callback = $request->get_parameter('oauth_callback'); + $new_token = $this->data_store->new_request_token($consumer, $callback); + + return $new_token; + } + + /** + * process an access_token request + * returns the access token on success + */ + public function fetch_access_token(&$request) { + $this->get_version($request); + + $consumer = $this->get_consumer($request); + + // requires authorized request token + $token = $this->get_token($request, $consumer, "request"); + + $this->check_signature($request, $consumer, $token); + + // Rev A change + $verifier = $request->get_parameter('oauth_verifier'); + $new_token = $this->data_store->new_access_token($token, $consumer, $verifier); + + return $new_token; + } + + /** + * verify an api call, checks all the parameters + */ + public function verify_request(&$request) { + $this->get_version($request); + $consumer = $this->get_consumer($request); + $token = $this->get_token($request, $consumer, "access"); + $this->check_signature($request, $consumer, $token); + return array($consumer, $token); + } + + // Internals from here + /** + * version 1 + */ + private function get_version(&$request) { + $version = $request->get_parameter("oauth_version"); + if (!$version) { + // Service Providers MUST assume the protocol version to be 1.0 if this parameter is not present. + // Chapter 7.0 ("Accessing Protected Ressources") + $version = '1.0'; + } + if ($version !== $this->version) { + throw new OAuthException("OAuth version '$version' not supported"); + } + return $version; + } + + /** + * figure out the signature with some defaults + */ + private function get_signature_method($request) { + $signature_method = $request instanceof Request + ? $request->get_parameter("oauth_signature_method") + : NULL; + + if (!$signature_method) { + // According to chapter 7 ("Accessing Protected Ressources") the signature-method + // parameter is required, and we can't just fallback to PLAINTEXT + throw new OAuthException('No signature method parameter. This parameter is required'); + } + + if (!in_array($signature_method, + array_keys($this->signature_methods))) { + throw new OAuthException( + "Signature method '$signature_method' not supported " . + "try one of the following: " . + implode(", ", array_keys($this->signature_methods)) + ); + } + return $this->signature_methods[$signature_method]; + } + + /** + * try to find the consumer for the provided request's consumer key + */ + private function get_consumer($request) { + $consumer_key = $request instanceof Request + ? $request->get_parameter("oauth_consumer_key") + : NULL; + + if (!$consumer_key) { + throw new OAuthException("Invalid consumer key"); + } + + $consumer = $this->data_store->lookup_consumer($consumer_key); + if (!$consumer) { + throw new OAuthException("Invalid consumer"); + } + + return $consumer; + } + + /** + * try to find the token for the provided request's token key + */ + private function get_token($request, $consumer, $token_type="access") { + $token_field = $request instanceof Request + ? $request->get_parameter('oauth_token') + : NULL; + + $token = $this->data_store->lookup_token( + $consumer, $token_type, $token_field + ); + if (!$token) { + throw new OAuthException("Invalid $token_type token: $token_field"); + } + return $token; + } + + /** + * all-in-one function to check the signature on a request + * should guess the signature method appropriately + */ + private function check_signature($request, $consumer, $token) { + // this should probably be in a different method + $timestamp = $request instanceof Request + ? $request->get_parameter('oauth_timestamp') + : NULL; + $nonce = $request instanceof Request + ? $request->get_parameter('oauth_nonce') + : NULL; + + $this->check_timestamp($timestamp); + $this->check_nonce($consumer, $token, $nonce, $timestamp); + + $signature_method = $this->get_signature_method($request); + + $signature = $request->get_parameter('oauth_signature'); + $valid_sig = $signature_method->check_signature( + $request, + $consumer, + $token, + Util::urldecode_rfc3986($signature) + ); + + if (!$valid_sig) { + throw new OAuthException("Invalid signature"); + } + } + + /** + * check that the timestamp is new enough + */ + private function check_timestamp($timestamp) { + if( ! $timestamp ) + throw new OAuthException( + 'Missing timestamp parameter. The parameter is required' + ); + + // verify that timestamp is recentish + $now = time(); + if (abs($now - $timestamp) > $this->timestamp_threshold) { + throw new OAuthException( + "Expired timestamp, yours $timestamp, ours $now" + ); + } + } + + /** + * check that the nonce is not repeated + */ + private function check_nonce($consumer, $token, $nonce, $timestamp) { + if( ! $nonce ) + throw new OAuthException( + 'Missing nonce parameter. The parameter is required' + ); + + // verify that the nonce is uniqueish + $found = $this->data_store->lookup_nonce( + $consumer, + $token, + $nonce, + $timestamp + ); + if ($found) { + throw new OAuthException("Nonce already used: $nonce"); + } + } + +} diff --git a/vendor/eher/oauth/src/Eher/OAuth/PlainText.php b/vendor/eher/oauth/src/Eher/OAuth/PlainText.php new file mode 100644 index 0000000..895aeed --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/PlainText.php @@ -0,0 +1,36 @@ +secret, + ($token) ? $token->secret : "" + ); + + $key_parts = Util::urlencode_rfc3986($key_parts); + $key = implode('&', $key_parts); + $request->base_string = $key; + + return $key; + } +} diff --git a/vendor/eher/oauth/src/Eher/OAuth/Request.php b/vendor/eher/oauth/src/Eher/OAuth/Request.php new file mode 100644 index 0000000..afb2b20 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/Request.php @@ -0,0 +1,264 @@ +parameters = $parameters; + $this->http_method = $http_method; + $this->http_url = $http_url; + } + + + /** + * attempt to build up a request from what was passed to the server + */ + public static function from_request($http_method=NULL, $http_url=NULL, $parameters=NULL) { + $scheme = (!isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") + ? 'http' + : 'https'; + $http_url = ($http_url) ? $http_url : $scheme . + '://' . $_SERVER['HTTP_HOST'] . + ':' . + $_SERVER['SERVER_PORT'] . + $_SERVER['REQUEST_URI']; + $http_method = ($http_method) ? $http_method : $_SERVER['REQUEST_METHOD']; + + // We weren't handed any parameters, so let's find the ones relevant to + // this request. + // If you run XML-RPC or similar you should use this to provide your own + // parsed parameter-list + if (!$parameters) { + // Find request headers + $request_headers = Util::get_headers(); + + // Parse the query-string to find GET parameters + $parameters = Util::parse_parameters($_SERVER['QUERY_STRING']); + + // It's a POST request of the proper content-type, so parse POST + // parameters and add those overriding any duplicates from GET + if ($http_method == "POST" + && isset($request_headers['Content-Type']) + && strstr($request_headers['Content-Type'], + 'application/x-www-form-urlencoded') + ) { + $post_data = Util::parse_parameters( + file_get_contents(self::$POST_INPUT) + ); + $parameters = array_merge($parameters, $post_data); + } + + // We have a Authorization-header with OAuth data. Parse the header + // and add those overriding any duplicates from GET or POST + if (isset($request_headers['Authorization']) && substr($request_headers['Authorization'], 0, 6) == 'OAuth ') { + $header_parameters = Util::split_header( + $request_headers['Authorization'] + ); + $parameters = array_merge($parameters, $header_parameters); + } + + } + + return new Request($http_method, $http_url, $parameters); + } + + /** + * pretty much a helper function to set up the request + */ + public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) { + $parameters = ($parameters) ? $parameters : array(); + $defaults = array("oauth_version" => Request::$version, + "oauth_nonce" => Request::generate_nonce(), + "oauth_timestamp" => Request::generate_timestamp(), + "oauth_consumer_key" => $consumer->key); + if ($token) + $defaults['oauth_token'] = $token->key; + + $parameters = array_merge($defaults, $parameters); + + return new Request($http_method, $http_url, $parameters); + } + + public function set_parameter($name, $value, $allow_duplicates = true) { + if ($allow_duplicates && isset($this->parameters[$name])) { + // We have already added parameter(s) with this name, so add to the list + if (is_scalar($this->parameters[$name])) { + // This is the first duplicate, so transform scalar (string) + // into an array so we can add the duplicates + $this->parameters[$name] = array($this->parameters[$name]); + } + + $this->parameters[$name][] = $value; + } else { + $this->parameters[$name] = $value; + } + } + + public function get_parameter($name) { + return isset($this->parameters[$name]) ? $this->parameters[$name] : null; + } + + public function get_parameters() { + return $this->parameters; + } + + public function unset_parameter($name) { + unset($this->parameters[$name]); + } + + /** + * The request parameters, sorted and concatenated into a normalized string. + * @return string + */ + public function get_signable_parameters() { + // Grab all parameters + $params = $this->parameters; + + // Remove oauth_signature if present + // Ref: Spec: 9.1.1 ("The oauth_signature parameter MUST be excluded.") + if (isset($params['oauth_signature'])) { + unset($params['oauth_signature']); + } + + return Util::build_http_query($params); + } + + /** + * Returns the base string of this request + * + * The base string defined as the method, the url + * and the parameters (normalized), each urlencoded + * and the concated with &. + */ + public function get_signature_base_string() { + $parts = array( + $this->get_normalized_http_method(), + $this->get_normalized_http_url(), + $this->get_signable_parameters() + ); + + $parts = Util::urlencode_rfc3986($parts); + + return implode('&', $parts); + } + + /** + * just uppercases the http method + */ + public function get_normalized_http_method() { + return strtoupper($this->http_method); + } + + /** + * parses the url and rebuilds it to be + * scheme://host/path + */ + public function get_normalized_http_url() { + $parts = parse_url($this->http_url); + + $scheme = (isset($parts['scheme'])) ? $parts['scheme'] : 'http'; + $port = (isset($parts['port'])) ? $parts['port'] : (($scheme == 'https') ? '443' : '80'); + $host = (isset($parts['host'])) ? $parts['host'] : ''; + $path = (isset($parts['path'])) ? $parts['path'] : ''; + + if (($scheme == 'https' && $port != '443') + || ($scheme == 'http' && $port != '80')) { + $host = "$host:$port"; + } + return "$scheme://$host$path"; + } + + /** + * builds a url usable for a GET request + */ + public function to_url() { + $post_data = $this->to_postdata(); + $out = $this->get_normalized_http_url(); + if ($post_data) { + $out .= '?'.$post_data; + } + return $out; + } + + /** + * builds the data one would send in a POST request + */ + public function to_postdata() { + return Util::build_http_query($this->parameters); + } + + /** + * builds the Authorization: header + */ + public function to_header($realm=null) { + $first = true; + if($realm) { + $out = 'Authorization: OAuth realm="' . Util::urlencode_rfc3986($realm) . '"'; + $first = false; + } else + $out = 'Authorization: OAuth'; + + $total = array(); + foreach ($this->parameters as $k => $v) { + if (substr($k, 0, 5) != "oauth") continue; + if (is_array($v)) { + throw new OAuthException('Arrays not supported in headers'); + } + $out .= ($first) ? ' ' : ','; + $out .= Util::urlencode_rfc3986($k) . + '="' . + Util::urlencode_rfc3986($v) . + '"'; + $first = false; + } + return $out; + } + + public function __toString() { + return $this->to_url(); + } + + + public function sign_request($signature_method, $consumer, $token) { + $this->set_parameter( + "oauth_signature_method", + $signature_method->get_name(), + false + ); + $signature = $this->build_signature($signature_method, $consumer, $token); + $this->set_parameter("oauth_signature", $signature, false); + } + + public function build_signature($signature_method, $consumer, $token) { + $signature = $signature_method->build_signature($this, $consumer, $token); + return $signature; + } + + /** + * util function: current timestamp + */ + private static function generate_timestamp() { + return time(); + } + + /** + * util function: current nonce + */ + private static function generate_nonce() { + $mt = microtime(); + $rand = mt_rand(); + + return md5($mt . $rand); // md5s look nicer than numbers + } +} + diff --git a/vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php b/vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php new file mode 100644 index 0000000..a749ce3 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/RsaSha1.php @@ -0,0 +1,70 @@ +get_signature_base_string(); + $request->base_string = $base_string; + + // Fetch the private key cert based on the request + $cert = $this->fetch_private_cert($request); + + // Pull the private key ID from the certificate + $privatekeyid = openssl_get_privatekey($cert); + + // Sign using the key + $ok = openssl_sign($base_string, $signature, $privatekeyid); + + // Release the key resource + openssl_free_key($privatekeyid); + + return base64_encode($signature); + } + + public function check_signature($request, $consumer, $token, $signature) { + $decoded_sig = base64_decode($signature); + + $base_string = $request->get_signature_base_string(); + + // Fetch the public key cert based on the request + $cert = $this->fetch_public_cert($request); + + // Pull the public key ID from the certificate + $publickeyid = openssl_get_publickey($cert); + + // Check the computed signature against the one passed in the query + $ok = openssl_verify($base_string, $decoded_sig, $publickeyid); + + // Release the key resource + openssl_free_key($publickeyid); + + return $ok == 1; + } +} diff --git a/vendor/eher/oauth/src/Eher/OAuth/SignatureMethod.php b/vendor/eher/oauth/src/Eher/OAuth/SignatureMethod.php new file mode 100644 index 0000000..d938632 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/SignatureMethod.php @@ -0,0 +1,40 @@ +build_signature($request, $consumer, $token); + return $built == $signature; + } +} diff --git a/vendor/eher/oauth/src/Eher/OAuth/Token.php b/vendor/eher/oauth/src/Eher/OAuth/Token.php new file mode 100644 index 0000000..e1d9f65 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/Token.php @@ -0,0 +1,34 @@ +key = $key; + $this->secret = $secret; + } + + /** + * generates the basic string serialization of a token that a server + * would respond to request_token and access_token calls with + */ + function to_string() { + return "oauth_token=" . + Util::urlencode_rfc3986($this->key) . + "&oauth_token_secret=" . + Util::urlencode_rfc3986($this->secret); + } + + function __toString() { + return $this->to_string(); + } +} + diff --git a/vendor/eher/oauth/src/Eher/OAuth/Util.php b/vendor/eher/oauth/src/Eher/OAuth/Util.php new file mode 100644 index 0000000..1feee44 --- /dev/null +++ b/vendor/eher/oauth/src/Eher/OAuth/Util.php @@ -0,0 +1,155 @@ + $h) { + $params[$h] = Util::urldecode_rfc3986(empty($matches[3][$i]) ? $matches[4][$i] : $matches[3][$i]); + } + if (isset($params['realm'])) { + unset($params['realm']); + } + } + return $params; + } + + // helper to try to sort out headers for people who aren't running apache + public static function get_headers() { + if (function_exists('apache_request_headers')) { + // we need this to get the actual Authorization: header + // because apache tends to tell us it doesn't exist + $headers = apache_request_headers(); + + // sanitize the output of apache_request_headers because + // we always want the keys to be Cased-Like-This and arh() + // returns the headers in the same case as they are in the + // request + $out = array(); + foreach ($headers AS $key => $value) { + $key = str_replace( + " ", + "-", + ucwords(strtolower(str_replace("-", " ", $key))) + ); + $out[$key] = $value; + } + } else { + // otherwise we don't have apache and are just going to have to hope + // that $_SERVER actually contains what we need + $out = array(); + if( isset($_SERVER['CONTENT_TYPE']) ) + $out['Content-Type'] = $_SERVER['CONTENT_TYPE']; + if( isset($_ENV['CONTENT_TYPE']) ) + $out['Content-Type'] = $_ENV['CONTENT_TYPE']; + + foreach ($_SERVER as $key => $value) { + if (substr($key, 0, 5) == "HTTP_") { + // this is chaos, basically it is just there to capitalize the first + // letter of every word that is not an initial HTTP and strip HTTP + // code from przemek + $key = str_replace( + " ", + "-", + ucwords(strtolower(str_replace("_", " ", substr($key, 5)))) + ); + $out[$key] = $value; + } + } + } + return $out; + } + + // This function takes a input like a=b&a=c&d=e and returns the parsed + // parameters like this + // array('a' => array('b','c'), 'd' => 'e') + public static function parse_parameters( $input ) { + if (!isset($input) || !$input) return array(); + + $pairs = explode('&', $input); + + $parsed_parameters = array(); + foreach ($pairs as $pair) { + $split = explode('=', $pair, 2); + $parameter = Util::urldecode_rfc3986($split[0]); + $value = isset($split[1]) ? Util::urldecode_rfc3986($split[1]) : ''; + + if (isset($parsed_parameters[$parameter])) { + // We have already recieved parameter(s) with this name, so add to the list + // of parameters with this name + + if (is_scalar($parsed_parameters[$parameter])) { + // This is the first duplicate, so transform scalar (string) into an array + // so we can add the duplicates + $parsed_parameters[$parameter] = array($parsed_parameters[$parameter]); + } + + $parsed_parameters[$parameter][] = $value; + } else { + $parsed_parameters[$parameter] = $value; + } + } + return $parsed_parameters; + } + + public static function build_http_query($params) { + if (!$params) return ''; + + // Urlencode both keys and values + $keys = Util::urlencode_rfc3986(array_keys($params)); + $values = Util::urlencode_rfc3986(array_values($params)); + $params = array_combine($keys, $values); + + // Parameters are sorted by name, using lexicographical byte value ordering. + // Ref: Spec: 9.1.1 (1) + uksort($params, 'strcmp'); + + $pairs = array(); + foreach ($params as $parameter => $value) { + if (is_array($value)) { + // If two or more parameters share the same name, they are sorted by their value + // Ref: Spec: 9.1.1 (1) + // June 12th, 2010 - changed to sort because of issue 164 by hidetaka + sort($value, SORT_STRING); + foreach ($value as $duplicate_value) { + $pairs[] = $parameter . '=' . $duplicate_value; + } + } else { + $pairs[] = $parameter . '=' . $value; + } + } + // For each parameter, the name is separated from the corresponding value by an '=' character (ASCII code 61) + // Each name-value pair is separated by an '&' character (ASCII code 38) + return implode('&', $pairs); + } +} + diff --git a/vendor/eher/oauth/test/Eher/OAuth/ConsumerTest.php b/vendor/eher/oauth/test/Eher/OAuth/ConsumerTest.php new file mode 100644 index 0000000..3ce742c --- /dev/null +++ b/vendor/eher/oauth/test/Eher/OAuth/ConsumerTest.php @@ -0,0 +1,18 @@ +assertEquals( + 'Consumer[key=ConsumerKey,secret=ConsumerSecret]', + (string) $consumer + ); + } +} diff --git a/vendor/eher/oauth/test/Eher/OAuth/RequestTest.php b/vendor/eher/oauth/test/Eher/OAuth/RequestTest.php new file mode 100644 index 0000000..4551695 --- /dev/null +++ b/vendor/eher/oauth/test/Eher/OAuth/RequestTest.php @@ -0,0 +1,40 @@ +sign_request($signatureMethod, $consumer, null); + + $once = $request->get_parameter('oauth_nonce'); + $timestamp = $request->get_parameter('oauth_timestamp'); + $signature = $request->get_parameter('oauth_signature'); + $expectedUrl = "http://www.endpoint.url/?" + . "oauth_consumer_key=ConsumerKey" + . "&oauth_nonce=" . $once + . "&oauth_signature=" . Util::urlencode_rfc3986($signature) + . "&oauth_signature_method=HMAC-SHA1" + . "&oauth_timestamp=" . $timestamp + . "&oauth_version=1.0"; + $this->assertEquals( $expectedUrl, (string) $request); + } +} diff --git a/vendor/guzzlehttp/guzzle/.php_cs b/vendor/guzzlehttp/guzzle/.php_cs new file mode 100644 index 0000000..2dd5036 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/.php_cs @@ -0,0 +1,23 @@ +setRiskyAllowed(true) + ->setRules([ + '@PSR2' => true, + 'array_syntax' => ['syntax' => 'short'], + 'declare_strict_types' => false, + 'concat_space' => ['spacing'=>'one'], + 'php_unit_test_case_static_method_calls' => ['call_type' => 'self'], + 'ordered_imports' => true, + // 'phpdoc_align' => ['align'=>'vertical'], + // 'native_function_invocation' => true, + ]) + ->setFinder( + PhpCsFixer\Finder::create() + ->in(__DIR__.'/src') + ->in(__DIR__.'/tests') + ->name('*.php') + ) +; + +return $config; diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md new file mode 100644 index 0000000..464cf1c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -0,0 +1,1338 @@ +# Change Log + +## 6.5.5 - 2020-06-16 + +* Unpin version constraint for `symfony/polyfill-intl-idn` [#2678](https://github.com/guzzle/guzzle/pull/2678) + +## 6.5.4 - 2020-05-25 + +* Fix various intl icu issues [#2626](https://github.com/guzzle/guzzle/pull/2626) + +## 6.5.3 - 2020-04-18 + +* Use Symfony intl-idn polyfill [#2550](https://github.com/guzzle/guzzle/pull/2550) +* Remove use of internal functions [#2548](https://github.com/guzzle/guzzle/pull/2548) + +## 6.5.2 - 2019-12-23 + +* idn_to_ascii() fix for old PHP versions [#2489](https://github.com/guzzle/guzzle/pull/2489) + +## 6.5.1 - 2019-12-21 + +* Better defaults for PHP installations with old ICU lib [#2454](https://github.com/guzzle/guzzle/pull/2454) +* IDN support for redirects [#2424](https://github.com/guzzle/guzzle/pull/2424) + +## 6.5.0 - 2019-12-07 + +* Improvement: Added support for reset internal queue in MockHandler. [#2143](https://github.com/guzzle/guzzle/pull/2143) +* Improvement: Added support to pass arbitrary options to `curl_multi_init`. [#2287](https://github.com/guzzle/guzzle/pull/2287) +* Fix: Gracefully handle passing `null` to the `header` option. [#2132](https://github.com/guzzle/guzzle/pull/2132) +* Fix: `RetryMiddleware` did not do exponential delay between retries due unit mismatch. [#2132](https://github.com/guzzle/guzzle/pull/2132) + Previously, `RetryMiddleware` would sleep for 1 millisecond, then 2 milliseconds, then 4 milliseconds. + **After this change, `RetryMiddleware` will sleep for 1 second, then 2 seconds, then 4 seconds.** + `Middleware::retry()` accepts a second callback parameter to override the default timeouts if needed. +* Fix: Prevent undefined offset when using array for ssl_key options. [#2348](https://github.com/guzzle/guzzle/pull/2348) +* Deprecated `ClientInterface::VERSION` + +## 6.4.1 - 2019-10-23 + +* No `guzzle.phar` was created in 6.4.0 due expired API token. This release will fix that +* Added `parent::__construct()` to `FileCookieJar` and `SessionCookieJar` + +## 6.4.0 - 2019-10-23 + +* Improvement: Improved error messages when using curl < 7.21.2 [#2108](https://github.com/guzzle/guzzle/pull/2108) +* Fix: Test if response is readable before returning a summary in `RequestException::getResponseBodySummary()` [#2081](https://github.com/guzzle/guzzle/pull/2081) +* Fix: Add support for GUZZLE_CURL_SELECT_TIMEOUT environment variable [#2161](https://github.com/guzzle/guzzle/pull/2161) +* Improvement: Added `GuzzleHttp\Exception\InvalidArgumentException` [#2163](https://github.com/guzzle/guzzle/pull/2163) +* Improvement: Added `GuzzleHttp\_current_time()` to use `hrtime()` if that function exists. [#2242](https://github.com/guzzle/guzzle/pull/2242) +* Improvement: Added curl's `appconnect_time` in `TransferStats` [#2284](https://github.com/guzzle/guzzle/pull/2284) +* Improvement: Make GuzzleException extend Throwable wherever it's available [#2273](https://github.com/guzzle/guzzle/pull/2273) +* Fix: Prevent concurrent writes to file when saving `CookieJar` [#2335](https://github.com/guzzle/guzzle/pull/2335) +* Improvement: Update `MockHandler` so we can test transfer time [#2362](https://github.com/guzzle/guzzle/pull/2362) + +## 6.3.3 - 2018-04-22 + +* Fix: Default headers when decode_content is specified + + +## 6.3.2 - 2018-03-26 + +* Fix: Release process + + +## 6.3.1 - 2018-03-26 + +* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014) +* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012) +* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999) +* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998) +* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953) +* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915) +* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916) + ++ Minor code cleanups, documentation fixes and clarifications. + + +## 6.3.0 - 2017-06-22 + +* Feature: force IP resolution (ipv4 or ipv6) [#1608](https://github.com/guzzle/guzzle/pull/1608), [#1659](https://github.com/guzzle/guzzle/pull/1659) +* Improvement: Don't include summary in exception message when body is empty [#1621](https://github.com/guzzle/guzzle/pull/1621) +* Improvement: Handle `on_headers` option in MockHandler [#1580](https://github.com/guzzle/guzzle/pull/1580) +* Improvement: Added SUSE Linux CA path [#1609](https://github.com/guzzle/guzzle/issues/1609) +* Improvement: Use class reference for getting the name of the class instead of using hardcoded strings [#1641](https://github.com/guzzle/guzzle/pull/1641) +* Feature: Added `read_timeout` option [#1611](https://github.com/guzzle/guzzle/pull/1611) +* Bug fix: PHP 7.x fixes [#1685](https://github.com/guzzle/guzzle/pull/1685), [#1686](https://github.com/guzzle/guzzle/pull/1686), [#1811](https://github.com/guzzle/guzzle/pull/1811) +* Deprecation: BadResponseException instantiation without a response [#1642](https://github.com/guzzle/guzzle/pull/1642) +* Feature: Added NTLM auth [#1569](https://github.com/guzzle/guzzle/pull/1569) +* Feature: Track redirect HTTP status codes [#1711](https://github.com/guzzle/guzzle/pull/1711) +* Improvement: Check handler type during construction [#1745](https://github.com/guzzle/guzzle/pull/1745) +* Improvement: Always include the Content-Length if there's a body [#1721](https://github.com/guzzle/guzzle/pull/1721) +* Feature: Added convenience method to access a cookie by name [#1318](https://github.com/guzzle/guzzle/pull/1318) +* Bug fix: Fill `CURLOPT_CAPATH` and `CURLOPT_CAINFO` properly [#1684](https://github.com/guzzle/guzzle/pull/1684) +* Improvement: Use `\GuzzleHttp\Promise\rejection_for` function instead of object init [#1827](https://github.com/guzzle/guzzle/pull/1827) + + ++ Minor code cleanups, documentation fixes and clarifications. + +## 6.2.3 - 2017-02-28 + +* Fix deprecations with guzzle/psr7 version 1.4 + +## 6.2.2 - 2016-10-08 + +* Allow to pass nullable Response to delay callable +* Only add scheme when host is present +* Fix drain case where content-length is the literal string zero +* Obfuscate in-URL credentials in exceptions + +## 6.2.1 - 2016-07-18 + +* Address HTTP_PROXY security vulnerability, CVE-2016-5385: + https://httpoxy.org/ +* Fixing timeout bug with StreamHandler: + https://github.com/guzzle/guzzle/pull/1488 +* Only read up to `Content-Length` in PHP StreamHandler to avoid timeouts when + a server does not honor `Connection: close`. +* Ignore URI fragment when sending requests. + +## 6.2.0 - 2016-03-21 + +* Feature: added `GuzzleHttp\json_encode` and `GuzzleHttp\json_decode`. + https://github.com/guzzle/guzzle/pull/1389 +* Bug fix: Fix sleep calculation when waiting for delayed requests. + https://github.com/guzzle/guzzle/pull/1324 +* Feature: More flexible history containers. + https://github.com/guzzle/guzzle/pull/1373 +* Bug fix: defer sink stream opening in StreamHandler. + https://github.com/guzzle/guzzle/pull/1377 +* Bug fix: do not attempt to escape cookie values. + https://github.com/guzzle/guzzle/pull/1406 +* Feature: report original content encoding and length on decoded responses. + https://github.com/guzzle/guzzle/pull/1409 +* Bug fix: rewind seekable request bodies before dispatching to cURL. + https://github.com/guzzle/guzzle/pull/1422 +* Bug fix: provide an empty string to `http_build_query` for HHVM workaround. + https://github.com/guzzle/guzzle/pull/1367 + +## 6.1.1 - 2015-11-22 + +* Bug fix: Proxy::wrapSync() now correctly proxies to the appropriate handler + https://github.com/guzzle/guzzle/commit/911bcbc8b434adce64e223a6d1d14e9a8f63e4e4 +* Feature: HandlerStack is now more generic. + https://github.com/guzzle/guzzle/commit/f2102941331cda544745eedd97fc8fd46e1ee33e +* Bug fix: setting verify to false in the StreamHandler now disables peer + verification. https://github.com/guzzle/guzzle/issues/1256 +* Feature: Middleware now uses an exception factory, including more error + context. https://github.com/guzzle/guzzle/pull/1282 +* Feature: better support for disabled functions. + https://github.com/guzzle/guzzle/pull/1287 +* Bug fix: fixed regression where MockHandler was not using `sink`. + https://github.com/guzzle/guzzle/pull/1292 + +## 6.1.0 - 2015-09-08 + +* Feature: Added the `on_stats` request option to provide access to transfer + statistics for requests. https://github.com/guzzle/guzzle/pull/1202 +* Feature: Added the ability to persist session cookies in CookieJars. + https://github.com/guzzle/guzzle/pull/1195 +* Feature: Some compatibility updates for Google APP Engine + https://github.com/guzzle/guzzle/pull/1216 +* Feature: Added support for NO_PROXY to prevent the use of a proxy based on + a simple set of rules. https://github.com/guzzle/guzzle/pull/1197 +* Feature: Cookies can now contain square brackets. + https://github.com/guzzle/guzzle/pull/1237 +* Bug fix: Now correctly parsing `=` inside of quotes in Cookies. + https://github.com/guzzle/guzzle/pull/1232 +* Bug fix: Cusotm cURL options now correctly override curl options of the + same name. https://github.com/guzzle/guzzle/pull/1221 +* Bug fix: Content-Type header is now added when using an explicitly provided + multipart body. https://github.com/guzzle/guzzle/pull/1218 +* Bug fix: Now ignoring Set-Cookie headers that have no name. +* Bug fix: Reason phrase is no longer cast to an int in some cases in the + cURL handler. https://github.com/guzzle/guzzle/pull/1187 +* Bug fix: Remove the Authorization header when redirecting if the Host + header changes. https://github.com/guzzle/guzzle/pull/1207 +* Bug fix: Cookie path matching fixes + https://github.com/guzzle/guzzle/issues/1129 +* Bug fix: Fixing the cURL `body_as_string` setting + https://github.com/guzzle/guzzle/pull/1201 +* Bug fix: quotes are no longer stripped when parsing cookies. + https://github.com/guzzle/guzzle/issues/1172 +* Bug fix: `form_params` and `query` now always uses the `&` separator. + https://github.com/guzzle/guzzle/pull/1163 +* Bug fix: Adding a Content-Length to PHP stream wrapper requests if not set. + https://github.com/guzzle/guzzle/pull/1189 + +## 6.0.2 - 2015-07-04 + +* Fixed a memory leak in the curl handlers in which references to callbacks + were not being removed by `curl_reset`. +* Cookies are now extracted properly before redirects. +* Cookies now allow more character ranges. +* Decoded Content-Encoding responses are now modified to correctly reflect + their state if the encoding was automatically removed by a handler. This + means that the `Content-Encoding` header may be removed an the + `Content-Length` modified to reflect the message size after removing the + encoding. +* Added a more explicit error message when trying to use `form_params` and + `multipart` in the same request. +* Several fixes for HHVM support. +* Functions are now conditionally required using an additional level of + indirection to help with global Composer installations. + +## 6.0.1 - 2015-05-27 + +* Fixed a bug with serializing the `query` request option where the `&` + separator was missing. +* Added a better error message for when `body` is provided as an array. Please + use `form_params` or `multipart` instead. +* Various doc fixes. + +## 6.0.0 - 2015-05-26 + +* See the UPGRADING.md document for more information. +* Added `multipart` and `form_params` request options. +* Added `synchronous` request option. +* Added the `on_headers` request option. +* Fixed `expect` handling. +* No longer adding default middlewares in the client ctor. These need to be + present on the provided handler in order to work. +* Requests are no longer initiated when sending async requests with the + CurlMultiHandler. This prevents unexpected recursion from requests completing + while ticking the cURL loop. +* Removed the semantics of setting `default` to `true`. This is no longer + required now that the cURL loop is not ticked for async requests. +* Added request and response logging middleware. +* No longer allowing self signed certificates when using the StreamHandler. +* Ensuring that `sink` is valid if saving to a file. +* Request exceptions now include a "handler context" which provides handler + specific contextual information. +* Added `GuzzleHttp\RequestOptions` to allow request options to be applied + using constants. +* `$maxHandles` has been removed from CurlMultiHandler. +* `MultipartPostBody` is now part of the `guzzlehttp/psr7` package. + +## 5.3.0 - 2015-05-19 + +* Mock now supports `save_to` +* Marked `AbstractRequestEvent::getTransaction()` as public. +* Fixed a bug in which multiple headers using different casing would overwrite + previous headers in the associative array. +* Added `Utils::getDefaultHandler()` +* Marked `GuzzleHttp\Client::getDefaultUserAgent` as deprecated. +* URL scheme is now always lowercased. + +## 6.0.0-beta.1 + +* Requires PHP >= 5.5 +* Updated to use PSR-7 + * Requires immutable messages, which basically means an event based system + owned by a request instance is no longer possible. + * Utilizing the [Guzzle PSR-7 package](https://github.com/guzzle/psr7). + * Removed the dependency on `guzzlehttp/streams`. These stream abstractions + are available in the `guzzlehttp/psr7` package under the `GuzzleHttp\Psr7` + namespace. +* Added middleware and handler system + * Replaced the Guzzle event and subscriber system with a middleware system. + * No longer depends on RingPHP, but rather places the HTTP handlers directly + in Guzzle, operating on PSR-7 messages. + * Retry logic is now encapsulated in `GuzzleHttp\Middleware::retry`, which + means the `guzzlehttp/retry-subscriber` is now obsolete. + * Mocking responses is now handled using `GuzzleHttp\Handler\MockHandler`. +* Asynchronous responses + * No longer supports the `future` request option to send an async request. + Instead, use one of the `*Async` methods of a client (e.g., `requestAsync`, + `getAsync`, etc.). + * Utilizing `GuzzleHttp\Promise` instead of React's promise library to avoid + recursion required by chaining and forwarding react promises. See + https://github.com/guzzle/promises + * Added `requestAsync` and `sendAsync` to send request asynchronously. + * Added magic methods for `getAsync()`, `postAsync()`, etc. to send requests + asynchronously. +* Request options + * POST and form updates + * Added the `form_fields` and `form_files` request options. + * Removed the `GuzzleHttp\Post` namespace. + * The `body` request option no longer accepts an array for POST requests. + * The `exceptions` request option has been deprecated in favor of the + `http_errors` request options. + * The `save_to` request option has been deprecated in favor of `sink` request + option. +* Clients no longer accept an array of URI template string and variables for + URI variables. You will need to expand URI templates before passing them + into a client constructor or request method. +* Client methods `get()`, `post()`, `put()`, `patch()`, `options()`, etc. are + now magic methods that will send synchronous requests. +* Replaced `Utils.php` with plain functions in `functions.php`. +* Removed `GuzzleHttp\Collection`. +* Removed `GuzzleHttp\BatchResults`. Batched pool results are now returned as + an array. +* Removed `GuzzleHttp\Query`. Query string handling is now handled using an + associative array passed into the `query` request option. The query string + is serialized using PHP's `http_build_query`. If you need more control, you + can pass the query string in as a string. +* `GuzzleHttp\QueryParser` has been replaced with the + `GuzzleHttp\Psr7\parse_query`. + +## 5.2.0 - 2015-01-27 + +* Added `AppliesHeadersInterface` to make applying headers to a request based + on the body more generic and not specific to `PostBodyInterface`. +* Reduced the number of stack frames needed to send requests. +* Nested futures are now resolved in the client rather than the RequestFsm +* Finishing state transitions is now handled in the RequestFsm rather than the + RingBridge. +* Added a guard in the Pool class to not use recursion for request retries. + +## 5.1.0 - 2014-12-19 + +* Pool class no longer uses recursion when a request is intercepted. +* The size of a Pool can now be dynamically adjusted using a callback. + See https://github.com/guzzle/guzzle/pull/943. +* Setting a request option to `null` when creating a request with a client will + ensure that the option is not set. This allows you to overwrite default + request options on a per-request basis. + See https://github.com/guzzle/guzzle/pull/937. +* Added the ability to limit which protocols are allowed for redirects by + specifying a `protocols` array in the `allow_redirects` request option. +* Nested futures due to retries are now resolved when waiting for synchronous + responses. See https://github.com/guzzle/guzzle/pull/947. +* `"0"` is now an allowed URI path. See + https://github.com/guzzle/guzzle/pull/935. +* `Query` no longer typehints on the `$query` argument in the constructor, + allowing for strings and arrays. +* Exceptions thrown in the `end` event are now correctly wrapped with Guzzle + specific exceptions if necessary. + +## 5.0.3 - 2014-11-03 + +This change updates query strings so that they are treated as un-encoded values +by default where the value represents an un-encoded value to send over the +wire. A Query object then encodes the value before sending over the wire. This +means that even value query string values (e.g., ":") are url encoded. This +makes the Query class match PHP's http_build_query function. However, if you +want to send requests over the wire using valid query string characters that do +not need to be encoded, then you can provide a string to Url::setQuery() and +pass true as the second argument to specify that the query string is a raw +string that should not be parsed or encoded (unless a call to getQuery() is +subsequently made, forcing the query-string to be converted into a Query +object). + +## 5.0.2 - 2014-10-30 + +* Added a trailing `\r\n` to multipart/form-data payloads. See + https://github.com/guzzle/guzzle/pull/871 +* Added a `GuzzleHttp\Pool::send()` convenience method to match the docs. +* Status codes are now returned as integers. See + https://github.com/guzzle/guzzle/issues/881 +* No longer overwriting an existing `application/x-www-form-urlencoded` header + when sending POST requests, allowing for customized headers. See + https://github.com/guzzle/guzzle/issues/877 +* Improved path URL serialization. + + * No longer double percent-encoding characters in the path or query string if + they are already encoded. + * Now properly encoding the supplied path to a URL object, instead of only + encoding ' ' and '?'. + * Note: This has been changed in 5.0.3 to now encode query string values by + default unless the `rawString` argument is provided when setting the query + string on a URL: Now allowing many more characters to be present in the + query string without being percent encoded. See http://tools.ietf.org/html/rfc3986#appendix-A + +## 5.0.1 - 2014-10-16 + +Bugfix release. + +* Fixed an issue where connection errors still returned response object in + error and end events event though the response is unusable. This has been + corrected so that a response is not returned in the `getResponse` method of + these events if the response did not complete. https://github.com/guzzle/guzzle/issues/867 +* Fixed an issue where transfer statistics were not being populated in the + RingBridge. https://github.com/guzzle/guzzle/issues/866 + +## 5.0.0 - 2014-10-12 + +Adding support for non-blocking responses and some minor API cleanup. + +### New Features + +* Added support for non-blocking responses based on `guzzlehttp/guzzle-ring`. +* Added a public API for creating a default HTTP adapter. +* Updated the redirect plugin to be non-blocking so that redirects are sent + concurrently. Other plugins like this can now be updated to be non-blocking. +* Added a "progress" event so that you can get upload and download progress + events. +* Added `GuzzleHttp\Pool` which implements FutureInterface and transfers + requests concurrently using a capped pool size as efficiently as possible. +* Added `hasListeners()` to EmitterInterface. +* Removed `GuzzleHttp\ClientInterface::sendAll` and marked + `GuzzleHttp\Client::sendAll` as deprecated (it's still there, just not the + recommended way). + +### Breaking changes + +The breaking changes in this release are relatively minor. The biggest thing to +look out for is that request and response objects no longer implement fluent +interfaces. + +* Removed the fluent interfaces (i.e., `return $this`) from requests, + responses, `GuzzleHttp\Collection`, `GuzzleHttp\Url`, + `GuzzleHttp\Query`, `GuzzleHttp\Post\PostBody`, and + `GuzzleHttp\Cookie\SetCookie`. This blog post provides a good outline of + why I did this: http://ocramius.github.io/blog/fluent-interfaces-are-evil/. + This also makes the Guzzle message interfaces compatible with the current + PSR-7 message proposal. +* Removed "functions.php", so that Guzzle is truly PSR-4 compliant. Except + for the HTTP request functions from function.php, these functions are now + implemented in `GuzzleHttp\Utils` using camelCase. `GuzzleHttp\json_decode` + moved to `GuzzleHttp\Utils::jsonDecode`. `GuzzleHttp\get_path` moved to + `GuzzleHttp\Utils::getPath`. `GuzzleHttp\set_path` moved to + `GuzzleHttp\Utils::setPath`. `GuzzleHttp\batch` should now be + `GuzzleHttp\Pool::batch`, which returns an `objectStorage`. Using functions.php + caused problems for many users: they aren't PSR-4 compliant, require an + explicit include, and needed an if-guard to ensure that the functions are not + declared multiple times. +* Rewrote adapter layer. + * Removing all classes from `GuzzleHttp\Adapter`, these are now + implemented as callables that are stored in `GuzzleHttp\Ring\Client`. + * Removed the concept of "parallel adapters". Sending requests serially or + concurrently is now handled using a single adapter. + * Moved `GuzzleHttp\Adapter\Transaction` to `GuzzleHttp\Transaction`. The + Transaction object now exposes the request, response, and client as public + properties. The getters and setters have been removed. +* Removed the "headers" event. This event was only useful for changing the + body a response once the headers of the response were known. You can implement + a similar behavior in a number of ways. One example might be to use a + FnStream that has access to the transaction being sent. For example, when the + first byte is written, you could check if the response headers match your + expectations, and if so, change the actual stream body that is being + written to. +* Removed the `asArray` parameter from + `GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header + value as an array, then use the newly added `getHeaderAsArray()` method of + `MessageInterface`. This change makes the Guzzle interfaces compatible with + the PSR-7 interfaces. +* `GuzzleHttp\Message\MessageFactory` no longer allows subclasses to add + custom request options using double-dispatch (this was an implementation + detail). Instead, you should now provide an associative array to the + constructor which is a mapping of the request option name mapping to a + function that applies the option value to a request. +* Removed the concept of "throwImmediately" from exceptions and error events. + This control mechanism was used to stop a transfer of concurrent requests + from completing. This can now be handled by throwing the exception or by + cancelling a pool of requests or each outstanding future request individually. +* Updated to "GuzzleHttp\Streams" 3.0. + * `GuzzleHttp\Stream\StreamInterface::getContents()` no longer accepts a + `maxLen` parameter. This update makes the Guzzle streams project + compatible with the current PSR-7 proposal. + * `GuzzleHttp\Stream\Stream::__construct`, + `GuzzleHttp\Stream\Stream::factory`, and + `GuzzleHttp\Stream\Utils::create` no longer accept a size in the second + argument. They now accept an associative array of options, including the + "size" key and "metadata" key which can be used to provide custom metadata. + +## 4.2.2 - 2014-09-08 + +* Fixed a memory leak in the CurlAdapter when reusing cURL handles. +* No longer using `request_fulluri` in stream adapter proxies. +* Relative redirects are now based on the last response, not the first response. + +## 4.2.1 - 2014-08-19 + +* Ensuring that the StreamAdapter does not always add a Content-Type header +* Adding automated github releases with a phar and zip + +## 4.2.0 - 2014-08-17 + +* Now merging in default options using a case-insensitive comparison. + Closes https://github.com/guzzle/guzzle/issues/767 +* Added the ability to automatically decode `Content-Encoding` response bodies + using the `decode_content` request option. This is set to `true` by default + to decode the response body if it comes over the wire with a + `Content-Encoding`. Set this value to `false` to disable decoding the + response content, and pass a string to provide a request `Accept-Encoding` + header and turn on automatic response decoding. This feature now allows you + to pass an `Accept-Encoding` header in the headers of a request but still + disable automatic response decoding. + Closes https://github.com/guzzle/guzzle/issues/764 +* Added the ability to throw an exception immediately when transferring + requests in parallel. Closes https://github.com/guzzle/guzzle/issues/760 +* Updating guzzlehttp/streams dependency to ~2.1 +* No longer utilizing the now deprecated namespaced methods from the stream + package. + +## 4.1.8 - 2014-08-14 + +* Fixed an issue in the CurlFactory that caused setting the `stream=false` + request option to throw an exception. + See: https://github.com/guzzle/guzzle/issues/769 +* TransactionIterator now calls rewind on the inner iterator. + See: https://github.com/guzzle/guzzle/pull/765 +* You can now set the `Content-Type` header to `multipart/form-data` + when creating POST requests to force multipart bodies. + See https://github.com/guzzle/guzzle/issues/768 + +## 4.1.7 - 2014-08-07 + +* Fixed an error in the HistoryPlugin that caused the same request and response + to be logged multiple times when an HTTP protocol error occurs. +* Ensuring that cURL does not add a default Content-Type when no Content-Type + has been supplied by the user. This prevents the adapter layer from modifying + the request that is sent over the wire after any listeners may have already + put the request in a desired state (e.g., signed the request). +* Throwing an exception when you attempt to send requests that have the + "stream" set to true in parallel using the MultiAdapter. +* Only calling curl_multi_select when there are active cURL handles. This was + previously changed and caused performance problems on some systems due to PHP + always selecting until the maximum select timeout. +* Fixed a bug where multipart/form-data POST fields were not correctly + aggregated (e.g., values with "&"). + +## 4.1.6 - 2014-08-03 + +* Added helper methods to make it easier to represent messages as strings, + including getting the start line and getting headers as a string. + +## 4.1.5 - 2014-08-02 + +* Automatically retrying cURL "Connection died, retrying a fresh connect" + errors when possible. +* cURL implementation cleanup +* Allowing multiple event subscriber listeners to be registered per event by + passing an array of arrays of listener configuration. + +## 4.1.4 - 2014-07-22 + +* Fixed a bug that caused multi-part POST requests with more than one field to + serialize incorrectly. +* Paths can now be set to "0" +* `ResponseInterface::xml` now accepts a `libxml_options` option and added a + missing default argument that was required when parsing XML response bodies. +* A `save_to` stream is now created lazily, which means that files are not + created on disk unless a request succeeds. + +## 4.1.3 - 2014-07-15 + +* Various fixes to multipart/form-data POST uploads +* Wrapping function.php in an if-statement to ensure Guzzle can be used + globally and in a Composer install +* Fixed an issue with generating and merging in events to an event array +* POST headers are only applied before sending a request to allow you to change + the query aggregator used before uploading +* Added much more robust query string parsing +* Fixed various parsing and normalization issues with URLs +* Fixing an issue where multi-valued headers were not being utilized correctly + in the StreamAdapter + +## 4.1.2 - 2014-06-18 + +* Added support for sending payloads with GET requests + +## 4.1.1 - 2014-06-08 + +* Fixed an issue related to using custom message factory options in subclasses +* Fixed an issue with nested form fields in a multi-part POST +* Fixed an issue with using the `json` request option for POST requests +* Added `ToArrayInterface` to `GuzzleHttp\Cookie\CookieJar` + +## 4.1.0 - 2014-05-27 + +* Added a `json` request option to easily serialize JSON payloads. +* Added a `GuzzleHttp\json_decode()` wrapper to safely parse JSON. +* Added `setPort()` and `getPort()` to `GuzzleHttp\Message\RequestInterface`. +* Added the ability to provide an emitter to a client in the client constructor. +* Added the ability to persist a cookie session using $_SESSION. +* Added a trait that can be used to add event listeners to an iterator. +* Removed request method constants from RequestInterface. +* Fixed warning when invalid request start-lines are received. +* Updated MessageFactory to work with custom request option methods. +* Updated cacert bundle to latest build. + +4.0.2 (2014-04-16) +------------------ + +* Proxy requests using the StreamAdapter now properly use request_fulluri (#632) +* Added the ability to set scalars as POST fields (#628) + +## 4.0.1 - 2014-04-04 + +* The HTTP status code of a response is now set as the exception code of + RequestException objects. +* 303 redirects will now correctly switch from POST to GET requests. +* The default parallel adapter of a client now correctly uses the MultiAdapter. +* HasDataTrait now initializes the internal data array as an empty array so + that the toArray() method always returns an array. + +## 4.0.0 - 2014-03-29 + +* For more information on the 4.0 transition, see: + http://mtdowling.com/blog/2014/03/15/guzzle-4-rc/ +* For information on changes and upgrading, see: + https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 +* Added `GuzzleHttp\batch()` as a convenience function for sending requests in + parallel without needing to write asynchronous code. +* Restructured how events are added to `GuzzleHttp\ClientInterface::sendAll()`. + You can now pass a callable or an array of associative arrays where each + associative array contains the "fn", "priority", and "once" keys. + +## 4.0.0.rc-2 - 2014-03-25 + +* Removed `getConfig()` and `setConfig()` from clients to avoid confusion + around whether things like base_url, message_factory, etc. should be able to + be retrieved or modified. +* Added `getDefaultOption()` and `setDefaultOption()` to ClientInterface +* functions.php functions were renamed using snake_case to match PHP idioms +* Added support for `HTTP_PROXY`, `HTTPS_PROXY`, and + `GUZZLE_CURL_SELECT_TIMEOUT` environment variables +* Added the ability to specify custom `sendAll()` event priorities +* Added the ability to specify custom stream context options to the stream + adapter. +* Added a functions.php function for `get_path()` and `set_path()` +* CurlAdapter and MultiAdapter now use a callable to generate curl resources +* MockAdapter now properly reads a body and emits a `headers` event +* Updated Url class to check if a scheme and host are set before adding ":" + and "//". This allows empty Url (e.g., "") to be serialized as "". +* Parsing invalid XML no longer emits warnings +* Curl classes now properly throw AdapterExceptions +* Various performance optimizations +* Streams are created with the faster `Stream\create()` function +* Marked deprecation_proxy() as internal +* Test server is now a collection of static methods on a class + +## 4.0.0-rc.1 - 2014-03-15 + +* See https://github.com/guzzle/guzzle/blob/master/UPGRADING.md#3x-to-40 + +## 3.8.1 - 2014-01-28 + +* Bug: Always using GET requests when redirecting from a 303 response +* Bug: CURLOPT_SSL_VERIFYHOST is now correctly set to false when setting `$certificateAuthority` to false in + `Guzzle\Http\ClientInterface::setSslVerification()` +* Bug: RedirectPlugin now uses strict RFC 3986 compliance when combining a base URL with a relative URL +* Bug: The body of a request can now be set to `"0"` +* Sending PHP stream requests no longer forces `HTTP/1.0` +* Adding more information to ExceptionCollection exceptions so that users have more context, including a stack trace of + each sub-exception +* Updated the `$ref` attribute in service descriptions to merge over any existing parameters of a schema (rather than + clobbering everything). +* Merging URLs will now use the query string object from the relative URL (thus allowing custom query aggregators) +* Query strings are now parsed in a way that they do no convert empty keys with no value to have a dangling `=`. + For example `foo&bar=baz` is now correctly parsed and recognized as `foo&bar=baz` rather than `foo=&bar=baz`. +* Now properly escaping the regular expression delimiter when matching Cookie domains. +* Network access is now disabled when loading XML documents + +## 3.8.0 - 2013-12-05 + +* Added the ability to define a POST name for a file +* JSON response parsing now properly walks additionalProperties +* cURL error code 18 is now retried automatically in the BackoffPlugin +* Fixed a cURL error when URLs contain fragments +* Fixed an issue in the BackoffPlugin retry event where it was trying to access all exceptions as if they were + CurlExceptions +* CURLOPT_PROGRESS function fix for PHP 5.5 (69fcc1e) +* Added the ability for Guzzle to work with older versions of cURL that do not support `CURLOPT_TIMEOUT_MS` +* Fixed a bug that was encountered when parsing empty header parameters +* UriTemplate now has a `setRegex()` method to match the docs +* The `debug` request parameter now checks if it is truthy rather than if it exists +* Setting the `debug` request parameter to true shows verbose cURL output instead of using the LogPlugin +* Added the ability to combine URLs using strict RFC 3986 compliance +* Command objects can now return the validation errors encountered by the command +* Various fixes to cache revalidation (#437 and 29797e5) +* Various fixes to the AsyncPlugin +* Cleaned up build scripts + +## 3.7.4 - 2013-10-02 + +* Bug fix: 0 is now an allowed value in a description parameter that has a default value (#430) +* Bug fix: SchemaFormatter now returns an integer when formatting to a Unix timestamp + (see https://github.com/aws/aws-sdk-php/issues/147) +* Bug fix: Cleaned up and fixed URL dot segment removal to properly resolve internal dots +* Minimum PHP version is now properly specified as 5.3.3 (up from 5.3.2) (#420) +* Updated the bundled cacert.pem (#419) +* OauthPlugin now supports adding authentication to headers or query string (#425) + +## 3.7.3 - 2013-09-08 + +* Added the ability to get the exception associated with a request/command when using `MultiTransferException` and + `CommandTransferException`. +* Setting `additionalParameters` of a response to false is now honored when parsing responses with a service description +* Schemas are only injected into response models when explicitly configured. +* No longer guessing Content-Type based on the path of a request. Content-Type is now only guessed based on the path of + an EntityBody. +* Bug fix: ChunkedIterator can now properly chunk a \Traversable as well as an \Iterator. +* Bug fix: FilterIterator now relies on `\Iterator` instead of `\Traversable`. +* Bug fix: Gracefully handling malformed responses in RequestMediator::writeResponseBody() +* Bug fix: Replaced call to canCache with canCacheRequest in the CallbackCanCacheStrategy of the CachePlugin +* Bug fix: Visiting XML attributes first before visiting XML children when serializing requests +* Bug fix: Properly parsing headers that contain commas contained in quotes +* Bug fix: mimetype guessing based on a filename is now case-insensitive + +## 3.7.2 - 2013-08-02 + +* Bug fix: Properly URL encoding paths when using the PHP-only version of the UriTemplate expander + See https://github.com/guzzle/guzzle/issues/371 +* Bug fix: Cookie domains are now matched correctly according to RFC 6265 + See https://github.com/guzzle/guzzle/issues/377 +* Bug fix: GET parameters are now used when calculating an OAuth signature +* Bug fix: Fixed an issue with cache revalidation where the If-None-Match header was being double quoted +* `Guzzle\Common\AbstractHasDispatcher::dispatch()` now returns the event that was dispatched +* `Guzzle\Http\QueryString::factory()` now guesses the most appropriate query aggregator to used based on the input. + See https://github.com/guzzle/guzzle/issues/379 +* Added a way to add custom domain objects to service description parsing using the `operation.parse_class` event. See + https://github.com/guzzle/guzzle/pull/380 +* cURL multi cleanup and optimizations + +## 3.7.1 - 2013-07-05 + +* Bug fix: Setting default options on a client now works +* Bug fix: Setting options on HEAD requests now works. See #352 +* Bug fix: Moving stream factory before send event to before building the stream. See #353 +* Bug fix: Cookies no longer match on IP addresses per RFC 6265 +* Bug fix: Correctly parsing header parameters that are in `<>` and quotes +* Added `cert` and `ssl_key` as request options +* `Host` header can now diverge from the host part of a URL if the header is set manually +* `Guzzle\Service\Command\LocationVisitor\Request\XmlVisitor` was rewritten to change from using SimpleXML to XMLWriter +* OAuth parameters are only added via the plugin if they aren't already set +* Exceptions are now thrown when a URL cannot be parsed +* Returning `false` if `Guzzle\Http\EntityBody::getContentMd5()` fails +* Not setting a `Content-MD5` on a command if calculating the Content-MD5 fails via the CommandContentMd5Plugin + +## 3.7.0 - 2013-06-10 + +* See UPGRADING.md for more information on how to upgrade. +* Requests now support the ability to specify an array of $options when creating a request to more easily modify a + request. You can pass a 'request.options' configuration setting to a client to apply default request options to + every request created by a client (e.g. default query string variables, headers, curl options, etc.). +* Added a static facade class that allows you to use Guzzle with static methods and mount the class to `\Guzzle`. + See `Guzzle\Http\StaticClient::mount`. +* Added `command.request_options` to `Guzzle\Service\Command\AbstractCommand` to pass request options to requests + created by a command (e.g. custom headers, query string variables, timeout settings, etc.). +* Stream size in `Guzzle\Stream\PhpStreamRequestFactory` will now be set if Content-Length is returned in the + headers of a response +* Added `Guzzle\Common\Collection::setPath($path, $value)` to set a value into an array using a nested key + (e.g. `$collection->setPath('foo/baz/bar', 'test'); echo $collection['foo']['bar']['bar'];`) +* ServiceBuilders now support storing and retrieving arbitrary data +* CachePlugin can now purge all resources for a given URI +* CachePlugin can automatically purge matching cached items when a non-idempotent request is sent to a resource +* CachePlugin now uses the Vary header to determine if a resource is a cache hit +* `Guzzle\Http\Message\Response` now implements `\Serializable` +* Added `Guzzle\Cache\CacheAdapterFactory::fromCache()` to more easily create cache adapters +* `Guzzle\Service\ClientInterface::execute()` now accepts an array, single command, or Traversable +* Fixed a bug in `Guzzle\Http\Message\Header\Link::addLink()` +* Better handling of calculating the size of a stream in `Guzzle\Stream\Stream` using fstat() and caching the size +* `Guzzle\Common\Exception\ExceptionCollection` now creates a more readable exception message +* Fixing BC break: Added back the MonologLogAdapter implementation rather than extending from PsrLog so that older + Symfony users can still use the old version of Monolog. +* Fixing BC break: Added the implementation back in for `Guzzle\Http\Message\AbstractMessage::getTokenizedHeader()`. + Now triggering an E_USER_DEPRECATED warning when used. Use `$message->getHeader()->parseParams()`. +* Several performance improvements to `Guzzle\Common\Collection` +* Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +* Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +* Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +* Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +* Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +* Added `Guzzle\Stream\StreamInterface::isRepeatable` +* Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + $client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))`. +* Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use $client->getConfig()->getPath('request.options/headers')`. +* Removed `Guzzle\Http\ClientInterface::expandTemplate()` +* Removed `Guzzle\Http\ClientInterface::setRequestFactory()` +* Removed `Guzzle\Http\ClientInterface::getCurlMulti()` +* Removed `Guzzle\Http\Message\RequestInterface::canCache` +* Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect` +* Removed `Guzzle\Http\Message\RequestInterface::isRedirect` +* Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. +* You can now enable E_USER_DEPRECATED warnings to see if you are using a deprecated method by setting + `Guzzle\Common\Version::$emitWarnings` to true. +* Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use + `$request->getResponseBody()->isRepeatable()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use + `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +* Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +* Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +* Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. + These will work through Guzzle 4.0 +* Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use [request.options][params]. +* Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +* Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use $client->getConfig()->getPath('request.options/headers')`. +* Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use $client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. +* Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +* Marked `Guzzle\Common\Collection::inject()` as deprecated. +* Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest');` +* CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +* Always setting X-cache headers on cached responses +* Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +* `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +* `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +* `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +* Added `CacheStorageInterface::purge($url)` +* `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +* Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +## 3.6.0 - 2013-05-29 + +* ServiceDescription now implements ToArrayInterface +* Added command.hidden_params to blacklist certain headers from being treated as additionalParameters +* Guzzle can now correctly parse incomplete URLs +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess +* Added the ability to cast Model objects to a string to view debug information. + +## 3.5.0 - 2013-05-13 + +* Bug: Fixed a regression so that request responses are parsed only once per oncomplete event rather than multiple times +* Bug: Better cleanup of one-time events across the board (when an event is meant to fire once, it will now remove + itself from the EventDispatcher) +* Bug: `Guzzle\Log\MessageFormatter` now properly writes "total_time" and "connect_time" values +* Bug: Cloning an EntityEnclosingRequest now clones the EntityBody too +* Bug: Fixed an undefined index error when parsing nested JSON responses with a sentAs parameter that reference a + non-existent key +* Bug: All __call() method arguments are now required (helps with mocking frameworks) +* Deprecating Response::getRequest() and now using a shallow clone of a request object to remove a circular reference + to help with refcount based garbage collection of resources created by sending a request +* Deprecating ZF1 cache and log adapters. These will be removed in the next major version. +* Deprecating `Response::getPreviousResponse()` (method signature still exists, but it's deprecated). Use the + HistoryPlugin for a history. +* Added a `responseBody` alias for the `response_body` location +* Refactored internals to no longer rely on Response::getRequest() +* HistoryPlugin can now be cast to a string +* HistoryPlugin now logs transactions rather than requests and responses to more accurately keep track of the requests + and responses that are sent over the wire +* Added `getEffectiveUrl()` and `getRedirectCount()` to Response objects + +## 3.4.3 - 2013-04-30 + +* Bug fix: Fixing bug introduced in 3.4.2 where redirect responses are duplicated on the final redirected response +* Added a check to re-extract the temp cacert bundle from the phar before sending each request + +## 3.4.2 - 2013-04-29 + +* Bug fix: Stream objects now work correctly with "a" and "a+" modes +* Bug fix: Removing `Transfer-Encoding: chunked` header when a Content-Length is present +* Bug fix: AsyncPlugin no longer forces HEAD requests +* Bug fix: DateTime timezones are now properly handled when using the service description schema formatter +* Bug fix: CachePlugin now properly handles stale-if-error directives when a request to the origin server fails +* Setting a response on a request will write to the custom request body from the response body if one is specified +* LogPlugin now writes to php://output when STDERR is undefined +* Added the ability to set multiple POST files for the same key in a single call +* application/x-www-form-urlencoded POSTs now use the utf-8 charset by default +* Added the ability to queue CurlExceptions to the MockPlugin +* Cleaned up how manual responses are queued on requests (removed "queued_response" and now using request.before_send) +* Configuration loading now allows remote files + +## 3.4.1 - 2013-04-16 + +* Large refactoring to how CurlMulti handles work. There is now a proxy that sits in front of a pool of CurlMulti + handles. This greatly simplifies the implementation, fixes a couple bugs, and provides a small performance boost. +* Exceptions are now properly grouped when sending requests in parallel +* Redirects are now properly aggregated when a multi transaction fails +* Redirects now set the response on the original object even in the event of a failure +* Bug fix: Model names are now properly set even when using $refs +* Added support for PHP 5.5's CurlFile to prevent warnings with the deprecated @ syntax +* Added support for oauth_callback in OAuth signatures +* Added support for oauth_verifier in OAuth signatures +* Added support to attempt to retrieve a command first literally, then ucfirst, the with inflection + +## 3.4.0 - 2013-04-11 + +* Bug fix: URLs are now resolved correctly based on http://tools.ietf.org/html/rfc3986#section-5.2. #289 +* Bug fix: Absolute URLs with a path in a service description will now properly override the base URL. #289 +* Bug fix: Parsing a query string with a single PHP array value will now result in an array. #263 +* Bug fix: Better normalization of the User-Agent header to prevent duplicate headers. #264. +* Bug fix: Added `number` type to service descriptions. +* Bug fix: empty parameters are removed from an OAuth signature +* Bug fix: Revalidating a cache entry prefers the Last-Modified over the Date header +* Bug fix: Fixed "array to string" error when validating a union of types in a service description +* Bug fix: Removed code that attempted to determine the size of a stream when data is written to the stream +* Bug fix: Not including an `oauth_token` if the value is null in the OauthPlugin. +* Bug fix: Now correctly aggregating successful requests and failed requests in CurlMulti when a redirect occurs. +* The new default CURLOPT_TIMEOUT setting has been increased to 150 seconds so that Guzzle works on poor connections. +* Added a feature to EntityEnclosingRequest::setBody() that will automatically set the Content-Type of the request if + the Content-Type can be determined based on the entity body or the path of the request. +* Added the ability to overwrite configuration settings in a client when grabbing a throwaway client from a builder. +* Added support for a PSR-3 LogAdapter. +* Added a `command.after_prepare` event +* Added `oauth_callback` parameter to the OauthPlugin +* Added the ability to create a custom stream class when using a stream factory +* Added a CachingEntityBody decorator +* Added support for `additionalParameters` in service descriptions to define how custom parameters are serialized. +* The bundled SSL certificate is now provided in the phar file and extracted when running Guzzle from a phar. +* You can now send any EntityEnclosingRequest with POST fields or POST files and cURL will handle creating bodies +* POST requests using a custom entity body are now treated exactly like PUT requests but with a custom cURL method. This + means that the redirect behavior of POST requests with custom bodies will not be the same as POST requests that use + POST fields or files (the latter is only used when emulating a form POST in the browser). +* Lots of cleanup to CurlHandle::factory and RequestFactory::createRequest + +## 3.3.1 - 2013-03-10 + +* Added the ability to create PHP streaming responses from HTTP requests +* Bug fix: Running any filters when parsing response headers with service descriptions +* Bug fix: OauthPlugin fixes to allow for multi-dimensional array signing, and sorting parameters before signing +* Bug fix: Removed the adding of default empty arrays and false Booleans to responses in order to be consistent across + response location visitors. +* Bug fix: Removed the possibility of creating configuration files with circular dependencies +* RequestFactory::create() now uses the key of a POST file when setting the POST file name +* Added xmlAllowEmpty to serialize an XML body even if no XML specific parameters are set + +## 3.3.0 - 2013-03-03 + +* A large number of performance optimizations have been made +* Bug fix: Added 'wb' as a valid write mode for streams +* Bug fix: `Guzzle\Http\Message\Response::json()` now allows scalar values to be returned +* Bug fix: Fixed bug in `Guzzle\Http\Message\Response` where wrapping quotes were stripped from `getEtag()` +* BC: Removed `Guzzle\Http\Utils` class +* BC: Setting a service description on a client will no longer modify the client's command factories. +* BC: Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using + the 'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' +* BC: `Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getSteamType()` are no longer converted to + lowercase +* Operation parameter objects are now lazy loaded internally +* Added ErrorResponsePlugin that can throw errors for responses defined in service description operations' errorResponses +* Added support for instantiating responseType=class responseClass classes. Classes must implement + `Guzzle\Service\Command\ResponseClassInterface` +* Added support for additionalProperties for top-level parameters in responseType=model responseClasses. These + additional properties also support locations and can be used to parse JSON responses where the outermost part of the + JSON is an array +* Added support for nested renaming of JSON models (rename sentAs to name) +* CachePlugin + * Added support for stale-if-error so that the CachePlugin can now serve stale content from the cache on error + * Debug headers can now added to cached response in the CachePlugin + +## 3.2.0 - 2013-02-14 + +* CurlMulti is no longer reused globally. A new multi object is created per-client. This helps to isolate clients. +* URLs with no path no longer contain a "/" by default +* Guzzle\Http\QueryString does no longer manages the leading "?". This is now handled in Guzzle\Http\Url. +* BadResponseException no longer includes the full request and response message +* Adding setData() to Guzzle\Service\Description\ServiceDescriptionInterface +* Adding getResponseBody() to Guzzle\Http\Message\RequestInterface +* Various updates to classes to use ServiceDescriptionInterface type hints rather than ServiceDescription +* Header values can now be normalized into distinct values when multiple headers are combined with a comma separated list +* xmlEncoding can now be customized for the XML declaration of a XML service description operation +* Guzzle\Http\QueryString now uses Guzzle\Http\QueryAggregator\QueryAggregatorInterface objects to add custom value + aggregation and no longer uses callbacks +* The URL encoding implementation of Guzzle\Http\QueryString can now be customized +* Bug fix: Filters were not always invoked for array service description parameters +* Bug fix: Redirects now use a target response body rather than a temporary response body +* Bug fix: The default exponential backoff BackoffPlugin was not giving when the request threshold was exceeded +* Bug fix: Guzzle now takes the first found value when grabbing Cache-Control directives + +## 3.1.2 - 2013-01-27 + +* Refactored how operation responses are parsed. Visitors now include a before() method responsible for parsing the + response body. For example, the XmlVisitor now parses the XML response into an array in the before() method. +* Fixed an issue where cURL would not automatically decompress responses when the Accept-Encoding header was sent +* CURLOPT_SSL_VERIFYHOST is never set to 1 because it is deprecated (see 5e0ff2ef20f839e19d1eeb298f90ba3598784444) +* Fixed a bug where redirect responses were not chained correctly using getPreviousResponse() +* Setting default headers on a client after setting the user-agent will not erase the user-agent setting + +## 3.1.1 - 2013-01-20 + +* Adding wildcard support to Guzzle\Common\Collection::getPath() +* Adding alias support to ServiceBuilder configs +* Adding Guzzle\Service\Resource\CompositeResourceIteratorFactory and cleaning up factory interface + +## 3.1.0 - 2013-01-12 + +* BC: CurlException now extends from RequestException rather than BadResponseException +* BC: Renamed Guzzle\Plugin\Cache\CanCacheStrategyInterface::canCache() to canCacheRequest() and added CanCacheResponse() +* Added getData to ServiceDescriptionInterface +* Added context array to RequestInterface::setState() +* Bug: Removing hard dependency on the BackoffPlugin from Guzzle\Http +* Bug: Adding required content-type when JSON request visitor adds JSON to a command +* Bug: Fixing the serialization of a service description with custom data +* Made it easier to deal with exceptions thrown when transferring commands or requests in parallel by providing + an array of successful and failed responses +* Moved getPath from Guzzle\Service\Resource\Model to Guzzle\Common\Collection +* Added Guzzle\Http\IoEmittingEntityBody +* Moved command filtration from validators to location visitors +* Added `extends` attributes to service description parameters +* Added getModels to ServiceDescriptionInterface + +## 3.0.7 - 2012-12-19 + +* Fixing phar detection when forcing a cacert to system if null or true +* Allowing filename to be passed to `Guzzle\Http\Message\Request::setResponseBody()` +* Cleaning up `Guzzle\Common\Collection::inject` method +* Adding a response_body location to service descriptions + +## 3.0.6 - 2012-12-09 + +* CurlMulti performance improvements +* Adding setErrorResponses() to Operation +* composer.json tweaks + +## 3.0.5 - 2012-11-18 + +* Bug: Fixing an infinite recursion bug caused from revalidating with the CachePlugin +* Bug: Response body can now be a string containing "0" +* Bug: Using Guzzle inside of a phar uses system by default but now allows for a custom cacert +* Bug: QueryString::fromString now properly parses query string parameters that contain equal signs +* Added support for XML attributes in service description responses +* DefaultRequestSerializer now supports array URI parameter values for URI template expansion +* Added better mimetype guessing to requests and post files + +## 3.0.4 - 2012-11-11 + +* Bug: Fixed a bug when adding multiple cookies to a request to use the correct glue value +* Bug: Cookies can now be added that have a name, domain, or value set to "0" +* Bug: Using the system cacert bundle when using the Phar +* Added json and xml methods to Response to make it easier to parse JSON and XML response data into data structures +* Enhanced cookie jar de-duplication +* Added the ability to enable strict cookie jars that throw exceptions when invalid cookies are added +* Added setStream to StreamInterface to actually make it possible to implement custom rewind behavior for entity bodies +* Added the ability to create any sort of hash for a stream rather than just an MD5 hash + +## 3.0.3 - 2012-11-04 + +* Implementing redirects in PHP rather than cURL +* Added PECL URI template extension and using as default parser if available +* Bug: Fixed Content-Length parsing of Response factory +* Adding rewind() method to entity bodies and streams. Allows for custom rewinding of non-repeatable streams. +* Adding ToArrayInterface throughout library +* Fixing OauthPlugin to create unique nonce values per request + +## 3.0.2 - 2012-10-25 + +* Magic methods are enabled by default on clients +* Magic methods return the result of a command +* Service clients no longer require a base_url option in the factory +* Bug: Fixed an issue with URI templates where null template variables were being expanded + +## 3.0.1 - 2012-10-22 + +* Models can now be used like regular collection objects by calling filter, map, etc. +* Models no longer require a Parameter structure or initial data in the constructor +* Added a custom AppendIterator to get around a PHP bug with the `\AppendIterator` + +## 3.0.0 - 2012-10-15 + +* Rewrote service description format to be based on Swagger + * Now based on JSON schema + * Added nested input structures and nested response models + * Support for JSON and XML input and output models + * Renamed `commands` to `operations` + * Removed dot class notation + * Removed custom types +* Broke the project into smaller top-level namespaces to be more component friendly +* Removed support for XML configs and descriptions. Use arrays or JSON files. +* Removed the Validation component and Inspector +* Moved all cookie code to Guzzle\Plugin\Cookie +* Magic methods on a Guzzle\Service\Client now return the command un-executed. +* Calling getResult() or getResponse() on a command will lazily execute the command if needed. +* Now shipping with cURL's CA certs and using it by default +* Added previousResponse() method to response objects +* No longer sending Accept and Accept-Encoding headers on every request +* Only sending an Expect header by default when a payload is greater than 1MB +* Added/moved client options: + * curl.blacklist to curl.option.blacklist + * Added ssl.certificate_authority +* Added a Guzzle\Iterator component +* Moved plugins from Guzzle\Http\Plugin to Guzzle\Plugin +* Added a more robust backoff retry strategy (replaced the ExponentialBackoffPlugin) +* Added a more robust caching plugin +* Added setBody to response objects +* Updating LogPlugin to use a more flexible MessageFormatter +* Added a completely revamped build process +* Cleaning up Collection class and removing default values from the get method +* Fixed ZF2 cache adapters + +## 2.8.8 - 2012-10-15 + +* Bug: Fixed a cookie issue that caused dot prefixed domains to not match where popular browsers did + +## 2.8.7 - 2012-09-30 + +* Bug: Fixed config file aliases for JSON includes +* Bug: Fixed cookie bug on a request object by using CookieParser to parse cookies on requests +* Bug: Removing the path to a file when sending a Content-Disposition header on a POST upload +* Bug: Hardening request and response parsing to account for missing parts +* Bug: Fixed PEAR packaging +* Bug: Fixed Request::getInfo +* Bug: Fixed cases where CURLM_CALL_MULTI_PERFORM return codes were causing curl transactions to fail +* Adding the ability for the namespace Iterator factory to look in multiple directories +* Added more getters/setters/removers from service descriptions +* Added the ability to remove POST fields from OAuth signatures +* OAuth plugin now supports 2-legged OAuth + +## 2.8.6 - 2012-09-05 + +* Added the ability to modify and build service descriptions +* Added the use of visitors to apply parameters to locations in service descriptions using the dynamic command +* Added a `json` parameter location +* Now allowing dot notation for classes in the CacheAdapterFactory +* Using the union of two arrays rather than an array_merge when extending service builder services and service params +* Ensuring that a service is a string before doing strpos() checks on it when substituting services for references + in service builder config files. +* Services defined in two different config files that include one another will by default replace the previously + defined service, but you can now create services that extend themselves and merge their settings over the previous +* The JsonLoader now supports aliasing filenames with different filenames. This allows you to alias something like + '_default' with a default JSON configuration file. + +## 2.8.5 - 2012-08-29 + +* Bug: Suppressed empty arrays from URI templates +* Bug: Added the missing $options argument from ServiceDescription::factory to enable caching +* Added support for HTTP responses that do not contain a reason phrase in the start-line +* AbstractCommand commands are now invokable +* Added a way to get the data used when signing an Oauth request before a request is sent + +## 2.8.4 - 2012-08-15 + +* Bug: Custom delay time calculations are no longer ignored in the ExponentialBackoffPlugin +* Added the ability to transfer entity bodies as a string rather than streamed. This gets around curl error 65. Set `body_as_string` in a request's curl options to enable. +* Added a StreamInterface, EntityBodyInterface, and added ftell() to Guzzle\Common\Stream +* Added an AbstractEntityBodyDecorator and a ReadLimitEntityBody decorator to transfer only a subset of a decorated stream +* Stream and EntityBody objects will now return the file position to the previous position after a read required operation (e.g. getContentMd5()) +* Added additional response status codes +* Removed SSL information from the default User-Agent header +* DELETE requests can now send an entity body +* Added an EventDispatcher to the ExponentialBackoffPlugin and added an ExponentialBackoffLogger to log backoff retries +* Added the ability of the MockPlugin to consume mocked request bodies +* LogPlugin now exposes request and response objects in the extras array + +## 2.8.3 - 2012-07-30 + +* Bug: Fixed a case where empty POST requests were sent as GET requests +* Bug: Fixed a bug in ExponentialBackoffPlugin that caused fatal errors when retrying an EntityEnclosingRequest that does not have a body +* Bug: Setting the response body of a request to null after completing a request, not when setting the state of a request to new +* Added multiple inheritance to service description commands +* Added an ApiCommandInterface and added `getParamNames()` and `hasParam()` +* Removed the default 2mb size cutoff from the Md5ValidatorPlugin so that it now defaults to validating everything +* Changed CurlMulti::perform to pass a smaller timeout to CurlMulti::executeHandles + +## 2.8.2 - 2012-07-24 + +* Bug: Query string values set to 0 are no longer dropped from the query string +* Bug: A Collection object is no longer created each time a call is made to `Guzzle\Service\Command\AbstractCommand::getRequestHeaders()` +* Bug: `+` is now treated as an encoded space when parsing query strings +* QueryString and Collection performance improvements +* Allowing dot notation for class paths in filters attribute of a service descriptions + +## 2.8.1 - 2012-07-16 + +* Loosening Event Dispatcher dependency +* POST redirects can now be customized using CURLOPT_POSTREDIR + +## 2.8.0 - 2012-07-15 + +* BC: Guzzle\Http\Query + * Query strings with empty variables will always show an equal sign unless the variable is set to QueryString::BLANK (e.g. ?acl= vs ?acl) + * Changed isEncodingValues() and isEncodingFields() to isUrlEncoding() + * Changed setEncodeValues(bool) and setEncodeFields(bool) to useUrlEncoding(bool) + * Changed the aggregation functions of QueryString to be static methods + * Can now use fromString() with querystrings that have a leading ? +* cURL configuration values can be specified in service descriptions using `curl.` prefixed parameters +* Content-Length is set to 0 before emitting the request.before_send event when sending an empty request body +* Cookies are no longer URL decoded by default +* Bug: URI template variables set to null are no longer expanded + +## 2.7.2 - 2012-07-02 + +* BC: Moving things to get ready for subtree splits. Moving Inflection into Common. Moving Guzzle\Http\Parser to Guzzle\Parser. +* BC: Removing Guzzle\Common\Batch\Batch::count() and replacing it with isEmpty() +* CachePlugin now allows for a custom request parameter function to check if a request can be cached +* Bug fix: CachePlugin now only caches GET and HEAD requests by default +* Bug fix: Using header glue when transferring headers over the wire +* Allowing deeply nested arrays for composite variables in URI templates +* Batch divisors can now return iterators or arrays + +## 2.7.1 - 2012-06-26 + +* Minor patch to update version number in UA string +* Updating build process + +## 2.7.0 - 2012-06-25 + +* BC: Inflection classes moved to Guzzle\Inflection. No longer static methods. Can now inject custom inflectors into classes. +* BC: Removed magic setX methods from commands +* BC: Magic methods mapped to service description commands are now inflected in the command factory rather than the client __call() method +* Verbose cURL options are no longer enabled by default. Set curl.debug to true on a client to enable. +* Bug: Now allowing colons in a response start-line (e.g. HTTP/1.1 503 Service Unavailable: Back-end server is at capacity) +* Guzzle\Service\Resource\ResourceIteratorApplyBatched now internally uses the Guzzle\Common\Batch namespace +* Added Guzzle\Service\Plugin namespace and a PluginCollectionPlugin +* Added the ability to set POST fields and files in a service description +* Guzzle\Http\EntityBody::factory() now accepts objects with a __toString() method +* Adding a command.before_prepare event to clients +* Added BatchClosureTransfer and BatchClosureDivisor +* BatchTransferException now includes references to the batch divisor and transfer strategies +* Fixed some tests so that they pass more reliably +* Added Guzzle\Common\Log\ArrayLogAdapter + +## 2.6.6 - 2012-06-10 + +* BC: Removing Guzzle\Http\Plugin\BatchQueuePlugin +* BC: Removing Guzzle\Service\Command\CommandSet +* Adding generic batching system (replaces the batch queue plugin and command set) +* Updating ZF cache and log adapters and now using ZF's composer repository +* Bug: Setting the name of each ApiParam when creating through an ApiCommand +* Adding result_type, result_doc, deprecated, and doc_url to service descriptions +* Bug: Changed the default cookie header casing back to 'Cookie' + +## 2.6.5 - 2012-06-03 + +* BC: Renaming Guzzle\Http\Message\RequestInterface::getResourceUri() to getResource() +* BC: Removing unused AUTH_BASIC and AUTH_DIGEST constants from +* BC: Guzzle\Http\Cookie is now used to manage Set-Cookie data, not Cookie data +* BC: Renaming methods in the CookieJarInterface +* Moving almost all cookie logic out of the CookiePlugin and into the Cookie or CookieJar implementations +* Making the default glue for HTTP headers ';' instead of ',' +* Adding a removeValue to Guzzle\Http\Message\Header +* Adding getCookies() to request interface. +* Making it easier to add event subscribers to HasDispatcherInterface classes. Can now directly call addSubscriber() + +## 2.6.4 - 2012-05-30 + +* BC: Cleaning up how POST files are stored in EntityEnclosingRequest objects. Adding PostFile class. +* BC: Moving ApiCommand specific functionality from the Inspector and on to the ApiCommand +* Bug: Fixing magic method command calls on clients +* Bug: Email constraint only validates strings +* Bug: Aggregate POST fields when POST files are present in curl handle +* Bug: Fixing default User-Agent header +* Bug: Only appending or prepending parameters in commands if they are specified +* Bug: Not requiring response reason phrases or status codes to match a predefined list of codes +* Allowing the use of dot notation for class namespaces when using instance_of constraint +* Added any_match validation constraint +* Added an AsyncPlugin +* Passing request object to the calculateWait method of the ExponentialBackoffPlugin +* Allowing the result of a command object to be changed +* Parsing location and type sub values when instantiating a service description rather than over and over at runtime + +## 2.6.3 - 2012-05-23 + +* [BC] Guzzle\Common\FromConfigInterface no longer requires any config options. +* [BC] Refactoring how POST files are stored on an EntityEnclosingRequest. They are now separate from POST fields. +* You can now use an array of data when creating PUT request bodies in the request factory. +* Removing the requirement that HTTPS requests needed a Cache-Control: public directive to be cacheable. +* [Http] Adding support for Content-Type in multipart POST uploads per upload +* [Http] Added support for uploading multiple files using the same name (foo[0], foo[1]) +* Adding more POST data operations for easier manipulation of POST data. +* You can now set empty POST fields. +* The body of a request is only shown on EntityEnclosingRequest objects that do not use POST files. +* Split the Guzzle\Service\Inspector::validateConfig method into two methods. One to initialize when a command is created, and one to validate. +* CS updates + +## 2.6.2 - 2012-05-19 + +* [Http] Better handling of nested scope requests in CurlMulti. Requests are now always prepares in the send() method rather than the addRequest() method. + +## 2.6.1 - 2012-05-19 + +* [BC] Removing 'path' support in service descriptions. Use 'uri'. +* [BC] Guzzle\Service\Inspector::parseDocBlock is now protected. Adding getApiParamsForClass() with cache. +* [BC] Removing Guzzle\Common\NullObject. Use https://github.com/mtdowling/NullObject if you need it. +* [BC] Removing Guzzle\Common\XmlElement. +* All commands, both dynamic and concrete, have ApiCommand objects. +* Adding a fix for CurlMulti so that if all of the connections encounter some sort of curl error, then the loop exits. +* Adding checks to EntityEnclosingRequest so that empty POST files and fields are ignored. +* Making the method signature of Guzzle\Service\Builder\ServiceBuilder::factory more flexible. + +## 2.6.0 - 2012-05-15 + +* [BC] Moving Guzzle\Service\Builder to Guzzle\Service\Builder\ServiceBuilder +* [BC] Executing a Command returns the result of the command rather than the command +* [BC] Moving all HTTP parsing logic to Guzzle\Http\Parsers. Allows for faster C implementations if needed. +* [BC] Changing the Guzzle\Http\Message\Response::setProtocol() method to accept a protocol and version in separate args. +* [BC] Moving ResourceIterator* to Guzzle\Service\Resource +* [BC] Completely refactored ResourceIterators to iterate over a cloned command object +* [BC] Moved Guzzle\Http\UriTemplate to Guzzle\Http\Parser\UriTemplate\UriTemplate +* [BC] Guzzle\Guzzle is now deprecated +* Moving Guzzle\Common\Guzzle::inject to Guzzle\Common\Collection::inject +* Adding Guzzle\Version class to give version information about Guzzle +* Adding Guzzle\Http\Utils class to provide getDefaultUserAgent() and getHttpDate() +* Adding Guzzle\Curl\CurlVersion to manage caching curl_version() data +* ServiceDescription and ServiceBuilder are now cacheable using similar configs +* Changing the format of XML and JSON service builder configs. Backwards compatible. +* Cleaned up Cookie parsing +* Trimming the default Guzzle User-Agent header +* Adding a setOnComplete() method to Commands that is called when a command completes +* Keeping track of requests that were mocked in the MockPlugin +* Fixed a caching bug in the CacheAdapterFactory +* Inspector objects can be injected into a Command object +* Refactoring a lot of code and tests to be case insensitive when dealing with headers +* Adding Guzzle\Http\Message\HeaderComparison for easy comparison of HTTP headers using a DSL +* Adding the ability to set global option overrides to service builder configs +* Adding the ability to include other service builder config files from within XML and JSON files +* Moving the parseQuery method out of Url and on to QueryString::fromString() as a static factory method. + +## 2.5.0 - 2012-05-08 + +* Major performance improvements +* [BC] Simplifying Guzzle\Common\Collection. Please check to see if you are using features that are now deprecated. +* [BC] Using a custom validation system that allows a flyweight implementation for much faster validation. No longer using Symfony2 Validation component. +* [BC] No longer supporting "{{ }}" for injecting into command or UriTemplates. Use "{}" +* Added the ability to passed parameters to all requests created by a client +* Added callback functionality to the ExponentialBackoffPlugin +* Using microtime in ExponentialBackoffPlugin to allow more granular backoff strategies. +* Rewinding request stream bodies when retrying requests +* Exception is thrown when JSON response body cannot be decoded +* Added configurable magic method calls to clients and commands. This is off by default. +* Fixed a defect that added a hash to every parsed URL part +* Fixed duplicate none generation for OauthPlugin. +* Emitting an event each time a client is generated by a ServiceBuilder +* Using an ApiParams object instead of a Collection for parameters of an ApiCommand +* cache.* request parameters should be renamed to params.cache.* +* Added the ability to set arbitrary curl options on requests (disable_wire, progress, etc.). See CurlHandle. +* Added the ability to disable type validation of service descriptions +* ServiceDescriptions and ServiceBuilders are now Serializable diff --git a/vendor/guzzlehttp/guzzle/Dockerfile b/vendor/guzzlehttp/guzzle/Dockerfile new file mode 100644 index 0000000..f6a0952 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/Dockerfile @@ -0,0 +1,18 @@ +FROM 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 diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE new file mode 100644 index 0000000..50a177b --- /dev/null +++ b/vendor/guzzlehttp/guzzle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md new file mode 100644 index 0000000..5fdb6c5 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/README.md @@ -0,0 +1,90 @@ +Guzzle, PHP HTTP client +======================= + +[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases) +[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle) +[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle) + +Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and +trivial to integrate with web services. + +- Simple interface for building query strings, POST requests, streaming large + uploads, streaming large downloads, using HTTP cookies, uploading JSON data, + etc... +- Can send both synchronous and asynchronous requests using the same interface. +- Uses PSR-7 interfaces for requests, responses, and streams. This allows you + to utilize other PSR-7 compatible libraries with Guzzle. +- Abstracts away the underlying HTTP transport, allowing you to write + environment and transport agnostic code; i.e., no hard dependency on cURL, + PHP streams, sockets, or non-blocking event loops. +- Middleware system allows you to augment and compose client behavior. + +```php +$client = new \GuzzleHttp\Client(); +$response = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); + +echo $response->getStatusCode(); # 200 +echo $response->getHeaderLine('content-type'); # 'application/json; charset=utf8' +echo $response->getBody(); # '{"id": 1420053, "name": "guzzle", ...}' + +# Send an asynchronous request. +$request = new \GuzzleHttp\Psr7\Request('GET', 'http://httpbin.org'); +$promise = $client->sendAsync($request)->then(function ($response) { + echo 'I completed! ' . $response->getBody(); +}); + +$promise->wait(); +``` + +## Help and docs + +- [Documentation](http://guzzlephp.org/) +- [Stack Overflow](http://stackoverflow.com/questions/tagged/guzzle) +- [Gitter](https://gitter.im/guzzle/guzzle) + + +## Installing Guzzle + +The recommended way to install Guzzle is through +[Composer](http://getcomposer.org). + +```bash +# Install Composer +curl -sS https://getcomposer.org/installer | php +``` + +Next, run the Composer command to install the latest stable version of Guzzle: + +```bash +composer require guzzlehttp/guzzle +``` + +After installing, you need to require Composer's autoloader: + +```php +require 'vendor/autoload.php'; +``` + +You can then later update Guzzle using composer: + + ```bash +composer update + ``` + + +## Version Guidance + +| Version | Status | Packagist | Namespace | Repo | Docs | PSR-7 | PHP Version | +|---------|------------|---------------------|--------------|---------------------|---------------------|-------|-------------| +| 3.x | EOL | `guzzle/guzzle` | `Guzzle` | [v3][guzzle-3-repo] | [v3][guzzle-3-docs] | No | >= 5.3.3 | +| 4.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v4][guzzle-4-repo] | N/A | No | >= 5.4 | +| 5.x | EOL | `guzzlehttp/guzzle` | `GuzzleHttp` | [v5][guzzle-5-repo] | [v5][guzzle-5-docs] | No | >= 5.4 | +| 6.x | Latest | `guzzlehttp/guzzle` | `GuzzleHttp` | [v6][guzzle-6-repo] | [v6][guzzle-6-docs] | Yes | >= 5.5 | + +[guzzle-3-repo]: https://github.com/guzzle/guzzle3 +[guzzle-4-repo]: https://github.com/guzzle/guzzle/tree/4.x +[guzzle-5-repo]: https://github.com/guzzle/guzzle/tree/5.3 +[guzzle-6-repo]: https://github.com/guzzle/guzzle +[guzzle-3-docs]: http://guzzle3.readthedocs.org +[guzzle-5-docs]: http://guzzle.readthedocs.org/en/5.3/ +[guzzle-6-docs]: http://guzzle.readthedocs.org/en/latest/ diff --git a/vendor/guzzlehttp/guzzle/UPGRADING.md b/vendor/guzzlehttp/guzzle/UPGRADING.md new file mode 100644 index 0000000..91d1dcc --- /dev/null +++ b/vendor/guzzlehttp/guzzle/UPGRADING.md @@ -0,0 +1,1203 @@ +Guzzle Upgrade Guide +==================== + +5.0 to 6.0 +---------- + +Guzzle now uses [PSR-7](http://www.php-fig.org/psr/psr-7/) for HTTP messages. +Due to the fact that these messages are immutable, this prompted a refactoring +of Guzzle to use a middleware based system rather than an event system. Any +HTTP message interaction (e.g., `GuzzleHttp\Message\Request`) need to be +updated to work with the new immutable PSR-7 request and response objects. Any +event listeners or subscribers need to be updated to become middleware +functions that wrap handlers (or are injected into a +`GuzzleHttp\HandlerStack`). + +- Removed `GuzzleHttp\BatchResults` +- Removed `GuzzleHttp\Collection` +- Removed `GuzzleHttp\HasDataTrait` +- Removed `GuzzleHttp\ToArrayInterface` +- The `guzzlehttp/streams` dependency has been removed. Stream functionality + is now present in the `GuzzleHttp\Psr7` namespace provided by the + `guzzlehttp/psr7` package. +- Guzzle no longer uses ReactPHP promises and now uses the + `guzzlehttp/promises` library. We use a custom promise library for three + significant reasons: + 1. React promises (at the time of writing this) are recursive. Promise + chaining and promise resolution will eventually blow the stack. Guzzle + promises are not recursive as they use a sort of trampolining technique. + Note: there has been movement in the React project to modify promises to + no longer utilize recursion. + 2. Guzzle needs to have the ability to synchronously block on a promise to + wait for a result. Guzzle promises allows this functionality (and does + not require the use of recursion). + 3. Because we need to be able to wait on a result, doing so using React + promises requires wrapping react promises with RingPHP futures. This + overhead is no longer needed, reducing stack sizes, reducing complexity, + and improving performance. +- `GuzzleHttp\Mimetypes` has been moved to a function in + `GuzzleHttp\Psr7\mimetype_from_extension` and + `GuzzleHttp\Psr7\mimetype_from_filename`. +- `GuzzleHttp\Query` and `GuzzleHttp\QueryParser` have been removed. Query + strings must now be passed into request objects as strings, or provided to + the `query` request option when creating requests with clients. The `query` + option uses PHP's `http_build_query` to convert an array to a string. If you + need a different serialization technique, you will need to pass the query + string in as a string. There are a couple helper functions that will make + working with query strings easier: `GuzzleHttp\Psr7\parse_query` and + `GuzzleHttp\Psr7\build_query`. +- Guzzle no longer has a dependency on RingPHP. Due to the use of a middleware + system based on PSR-7, using RingPHP and it's middleware system as well adds + more complexity than the benefits it provides. All HTTP handlers that were + present in RingPHP have been modified to work directly with PSR-7 messages + and placed in the `GuzzleHttp\Handler` namespace. This significantly reduces + complexity in Guzzle, removes a dependency, and improves performance. RingPHP + will be maintained for Guzzle 5 support, but will no longer be a part of + Guzzle 6. +- As Guzzle now uses a middleware based systems the event system and RingPHP + integration has been removed. Note: while the event system has been removed, + it is possible to add your own type of event system that is powered by the + middleware system. + - Removed the `Event` namespace. + - Removed the `Subscriber` namespace. + - Removed `Transaction` class + - Removed `RequestFsm` + - Removed `RingBridge` + - `GuzzleHttp\Subscriber\Cookie` is now provided by + `GuzzleHttp\Middleware::cookies` + - `GuzzleHttp\Subscriber\HttpError` is now provided by + `GuzzleHttp\Middleware::httpError` + - `GuzzleHttp\Subscriber\History` is now provided by + `GuzzleHttp\Middleware::history` + - `GuzzleHttp\Subscriber\Mock` is now provided by + `GuzzleHttp\Handler\MockHandler` + - `GuzzleHttp\Subscriber\Prepare` is now provided by + `GuzzleHttp\PrepareBodyMiddleware` + - `GuzzleHttp\Subscriber\Redirect` is now provided by + `GuzzleHttp\RedirectMiddleware` +- Guzzle now uses `Psr\Http\Message\UriInterface` (implements in + `GuzzleHttp\Psr7\Uri`) for URI support. `GuzzleHttp\Url` is now gone. +- Static functions in `GuzzleHttp\Utils` have been moved to namespaced + functions under the `GuzzleHttp` namespace. This requires either a Composer + based autoloader or you to include functions.php. +- `GuzzleHttp\ClientInterface::getDefaultOption` has been renamed to + `GuzzleHttp\ClientInterface::getConfig`. +- `GuzzleHttp\ClientInterface::setDefaultOption` has been removed. +- The `json` and `xml` methods of response objects has been removed. With the + migration to strictly adhering to PSR-7 as the interface for Guzzle messages, + adding methods to message interfaces would actually require Guzzle messages + to extend from PSR-7 messages rather then work with them directly. + +## Migrating to middleware + +The change to PSR-7 unfortunately required significant refactoring to Guzzle +due to the fact that PSR-7 messages are immutable. Guzzle 5 relied on an event +system from plugins. The event system relied on mutability of HTTP messages and +side effects in order to work. With immutable messages, you have to change your +workflow to become more about either returning a value (e.g., functional +middlewares) or setting a value on an object. Guzzle v6 has chosen the +functional middleware approach. + +Instead of using the event system to listen for things like the `before` event, +you now create a stack based middleware function that intercepts a request on +the way in and the promise of the response on the way out. This is a much +simpler and more predictable approach than the event system and works nicely +with PSR-7 middleware. Due to the use of promises, the middleware system is +also asynchronous. + +v5: + +```php +use GuzzleHttp\Event\BeforeEvent; +$client = new GuzzleHttp\Client(); +// Get the emitter and listen to the before event. +$client->getEmitter()->on('before', function (BeforeEvent $e) { + // Guzzle v5 events relied on mutation + $e->getRequest()->setHeader('X-Foo', 'Bar'); +}); +``` + +v6: + +In v6, you can modify the request before it is sent using the `mapRequest` +middleware. The idiomatic way in v6 to modify the request/response lifecycle is +to setup a handler middleware stack up front and inject the handler into a +client. + +```php +use GuzzleHttp\Middleware; +// Create a handler stack that has all of the default middlewares attached +$handler = GuzzleHttp\HandlerStack::create(); +// Push the handler onto the handler stack +$handler->push(Middleware::mapRequest(function (RequestInterface $request) { + // Notice that we have to return a request object + return $request->withHeader('X-Foo', 'Bar'); +})); +// Inject the handler into the client +$client = new GuzzleHttp\Client(['handler' => $handler]); +``` + +## POST Requests + +This version added the [`form_params`](http://guzzle.readthedocs.org/en/latest/request-options.html#form_params) +and `multipart` request options. `form_params` is an associative array of +strings or array of strings and is used to serialize an +`application/x-www-form-urlencoded` POST request. The +[`multipart`](http://guzzle.readthedocs.org/en/latest/request-options.html#multipart) +option is now used to send a multipart/form-data POST request. + +`GuzzleHttp\Post\PostFile` has been removed. Use the `multipart` option to add +POST files to a multipart/form-data request. + +The `body` option no longer accepts an array to send POST requests. Please use +`multipart` or `form_params` instead. + +The `base_url` option has been renamed to `base_uri`. + +4.x to 5.0 +---------- + +## Rewritten Adapter Layer + +Guzzle now uses [RingPHP](http://ringphp.readthedocs.org/en/latest) to send +HTTP requests. The `adapter` option in a `GuzzleHttp\Client` constructor +is still supported, but it has now been renamed to `handler`. Instead of +passing a `GuzzleHttp\Adapter\AdapterInterface`, you must now pass a PHP +`callable` that follows the RingPHP specification. + +## Removed Fluent Interfaces + +[Fluent interfaces were removed](http://ocramius.github.io/blog/fluent-interfaces-are-evil) +from the following classes: + +- `GuzzleHttp\Collection` +- `GuzzleHttp\Url` +- `GuzzleHttp\Query` +- `GuzzleHttp\Post\PostBody` +- `GuzzleHttp\Cookie\SetCookie` + +## Removed functions.php + +Removed "functions.php", so that Guzzle is truly PSR-4 compliant. The following +functions can be used as replacements. + +- `GuzzleHttp\json_decode` -> `GuzzleHttp\Utils::jsonDecode` +- `GuzzleHttp\get_path` -> `GuzzleHttp\Utils::getPath` +- `GuzzleHttp\Utils::setPath` -> `GuzzleHttp\set_path` +- `GuzzleHttp\Pool::batch` -> `GuzzleHttp\batch`. This function is, however, + deprecated in favor of using `GuzzleHttp\Pool::batch()`. + +The "procedural" global client has been removed with no replacement (e.g., +`GuzzleHttp\get()`, `GuzzleHttp\post()`, etc.). Use a `GuzzleHttp\Client` +object as a replacement. + +## `throwImmediately` has been removed + +The concept of "throwImmediately" has been removed from exceptions and error +events. This control mechanism was used to stop a transfer of concurrent +requests from completing. This can now be handled by throwing the exception or +by cancelling a pool of requests or each outstanding future request +individually. + +## headers event has been removed + +Removed the "headers" event. This event was only useful for changing the +body a response once the headers of the response were known. You can implement +a similar behavior in a number of ways. One example might be to use a +FnStream that has access to the transaction being sent. For example, when the +first byte is written, you could check if the response headers match your +expectations, and if so, change the actual stream body that is being +written to. + +## Updates to HTTP Messages + +Removed the `asArray` parameter from +`GuzzleHttp\Message\MessageInterface::getHeader`. If you want to get a header +value as an array, then use the newly added `getHeaderAsArray()` method of +`MessageInterface`. This change makes the Guzzle interfaces compatible with +the PSR-7 interfaces. + +3.x to 4.0 +---------- + +## Overarching changes: + +- Now requires PHP 5.4 or greater. +- No longer requires cURL to send requests. +- Guzzle no longer wraps every exception it throws. Only exceptions that are + recoverable are now wrapped by Guzzle. +- Various namespaces have been removed or renamed. +- No longer requiring the Symfony EventDispatcher. A custom event dispatcher + based on the Symfony EventDispatcher is + now utilized in `GuzzleHttp\Event\EmitterInterface` (resulting in significant + speed and functionality improvements). + +Changes per Guzzle 3.x namespace are described below. + +## Batch + +The `Guzzle\Batch` namespace has been removed. This is best left to +third-parties to implement on top of Guzzle's core HTTP library. + +## Cache + +The `Guzzle\Cache` namespace has been removed. (Todo: No suitable replacement +has been implemented yet, but hoping to utilize a PSR cache interface). + +## Common + +- Removed all of the wrapped exceptions. It's better to use the standard PHP + library for unrecoverable exceptions. +- `FromConfigInterface` has been removed. +- `Guzzle\Common\Version` has been removed. The VERSION constant can be found + at `GuzzleHttp\ClientInterface::VERSION`. + +### Collection + +- `getAll` has been removed. Use `toArray` to convert a collection to an array. +- `inject` has been removed. +- `keySearch` has been removed. +- `getPath` no longer supports wildcard expressions. Use something better like + JMESPath for this. +- `setPath` now supports appending to an existing array via the `[]` notation. + +### Events + +Guzzle no longer requires Symfony's EventDispatcher component. Guzzle now uses +`GuzzleHttp\Event\Emitter`. + +- `Symfony\Component\EventDispatcher\EventDispatcherInterface` is replaced by + `GuzzleHttp\Event\EmitterInterface`. +- `Symfony\Component\EventDispatcher\EventDispatcher` is replaced by + `GuzzleHttp\Event\Emitter`. +- `Symfony\Component\EventDispatcher\Event` is replaced by + `GuzzleHttp\Event\Event`, and Guzzle now has an EventInterface in + `GuzzleHttp\Event\EventInterface`. +- `AbstractHasDispatcher` has moved to a trait, `HasEmitterTrait`, and + `HasDispatcherInterface` has moved to `HasEmitterInterface`. Retrieving the + event emitter of a request, client, etc. now uses the `getEmitter` method + rather than the `getDispatcher` method. + +#### Emitter + +- Use the `once()` method to add a listener that automatically removes itself + the first time it is invoked. +- Use the `listeners()` method to retrieve a list of event listeners rather than + the `getListeners()` method. +- Use `emit()` instead of `dispatch()` to emit an event from an emitter. +- Use `attach()` instead of `addSubscriber()` and `detach()` instead of + `removeSubscriber()`. + +```php +$mock = new Mock(); +// 3.x +$request->getEventDispatcher()->addSubscriber($mock); +$request->getEventDispatcher()->removeSubscriber($mock); +// 4.x +$request->getEmitter()->attach($mock); +$request->getEmitter()->detach($mock); +``` + +Use the `on()` method to add a listener rather than the `addListener()` method. + +```php +// 3.x +$request->getEventDispatcher()->addListener('foo', function (Event $event) { /* ... */ } ); +// 4.x +$request->getEmitter()->on('foo', function (Event $event, $name) { /* ... */ } ); +``` + +## Http + +### General changes + +- The cacert.pem certificate has been moved to `src/cacert.pem`. +- Added the concept of adapters that are used to transfer requests over the + wire. +- Simplified the event system. +- Sending requests in parallel is still possible, but batching is no longer a + concept of the HTTP layer. Instead, you must use the `complete` and `error` + events to asynchronously manage parallel request transfers. +- `Guzzle\Http\Url` has moved to `GuzzleHttp\Url`. +- `Guzzle\Http\QueryString` has moved to `GuzzleHttp\Query`. +- QueryAggregators have been rewritten so that they are simply callable + functions. +- `GuzzleHttp\StaticClient` has been removed. Use the functions provided in + `functions.php` for an easy to use static client instance. +- Exceptions in `GuzzleHttp\Exception` have been updated to all extend from + `GuzzleHttp\Exception\TransferException`. + +### Client + +Calling methods like `get()`, `post()`, `head()`, etc. no longer create and +return a request, but rather creates a request, sends the request, and returns +the response. + +```php +// 3.0 +$request = $client->get('/'); +$response = $request->send(); + +// 4.0 +$response = $client->get('/'); + +// or, to mirror the previous behavior +$request = $client->createRequest('GET', '/'); +$response = $client->send($request); +``` + +`GuzzleHttp\ClientInterface` has changed. + +- The `send` method no longer accepts more than one request. Use `sendAll` to + send multiple requests in parallel. +- `setUserAgent()` has been removed. Use a default request option instead. You + could, for example, do something like: + `$client->setConfig('defaults/headers/User-Agent', 'Foo/Bar ' . $client::getDefaultUserAgent())`. +- `setSslVerification()` has been removed. Use default request options instead, + like `$client->setConfig('defaults/verify', true)`. + +`GuzzleHttp\Client` has changed. + +- The constructor now accepts only an associative array. You can include a + `base_url` string or array to use a URI template as the base URL of a client. + You can also specify a `defaults` key that is an associative array of default + request options. You can pass an `adapter` to use a custom adapter, + `batch_adapter` to use a custom adapter for sending requests in parallel, or + a `message_factory` to change the factory used to create HTTP requests and + responses. +- The client no longer emits a `client.create_request` event. +- Creating requests with a client no longer automatically utilize a URI + template. You must pass an array into a creational method (e.g., + `createRequest`, `get`, `put`, etc.) in order to expand a URI template. + +### Messages + +Messages no longer have references to their counterparts (i.e., a request no +longer has a reference to it's response, and a response no loger has a +reference to its request). This association is now managed through a +`GuzzleHttp\Adapter\TransactionInterface` object. You can get references to +these transaction objects using request events that are emitted over the +lifecycle of a request. + +#### Requests with a body + +- `GuzzleHttp\Message\EntityEnclosingRequest` and + `GuzzleHttp\Message\EntityEnclosingRequestInterface` have been removed. The + separation between requests that contain a body and requests that do not + contain a body has been removed, and now `GuzzleHttp\Message\RequestInterface` + handles both use cases. +- Any method that previously accepts a `GuzzleHttp\Response` object now accept a + `GuzzleHttp\Message\ResponseInterface`. +- `GuzzleHttp\Message\RequestFactoryInterface` has been renamed to + `GuzzleHttp\Message\MessageFactoryInterface`. This interface is used to create + both requests and responses and is implemented in + `GuzzleHttp\Message\MessageFactory`. +- POST field and file methods have been removed from the request object. You + must now use the methods made available to `GuzzleHttp\Post\PostBodyInterface` + to control the format of a POST body. Requests that are created using a + standard `GuzzleHttp\Message\MessageFactoryInterface` will automatically use + a `GuzzleHttp\Post\PostBody` body if the body was passed as an array or if + the method is POST and no body is provided. + +```php +$request = $client->createRequest('POST', '/'); +$request->getBody()->setField('foo', 'bar'); +$request->getBody()->addFile(new PostFile('file_key', fopen('/path/to/content', 'r'))); +``` + +#### Headers + +- `GuzzleHttp\Message\Header` has been removed. Header values are now simply + represented by an array of values or as a string. Header values are returned + as a string by default when retrieving a header value from a message. You can + pass an optional argument of `true` to retrieve a header value as an array + of strings instead of a single concatenated string. +- `GuzzleHttp\PostFile` and `GuzzleHttp\PostFileInterface` have been moved to + `GuzzleHttp\Post`. This interface has been simplified and now allows the + addition of arbitrary headers. +- Custom headers like `GuzzleHttp\Message\Header\Link` have been removed. Most + of the custom headers are now handled separately in specific + subscribers/plugins, and `GuzzleHttp\Message\HeaderValues::parseParams()` has + been updated to properly handle headers that contain parameters (like the + `Link` header). + +#### Responses + +- `GuzzleHttp\Message\Response::getInfo()` and + `GuzzleHttp\Message\Response::setInfo()` have been removed. Use the event + system to retrieve this type of information. +- `GuzzleHttp\Message\Response::getRawHeaders()` has been removed. +- `GuzzleHttp\Message\Response::getMessage()` has been removed. +- `GuzzleHttp\Message\Response::calculateAge()` and other cache specific + methods have moved to the CacheSubscriber. +- Header specific helper functions like `getContentMd5()` have been removed. + Just use `getHeader('Content-MD5')` instead. +- `GuzzleHttp\Message\Response::setRequest()` and + `GuzzleHttp\Message\Response::getRequest()` have been removed. Use the event + system to work with request and response objects as a transaction. +- `GuzzleHttp\Message\Response::getRedirectCount()` has been removed. Use the + Redirect subscriber instead. +- `GuzzleHttp\Message\Response::isSuccessful()` and other related methods have + been removed. Use `getStatusCode()` instead. + +#### Streaming responses + +Streaming requests can now be created by a client directly, returning a +`GuzzleHttp\Message\ResponseInterface` object that contains a body stream +referencing an open PHP HTTP stream. + +```php +// 3.0 +use Guzzle\Stream\PhpStreamRequestFactory; +$request = $client->get('/'); +$factory = new PhpStreamRequestFactory(); +$stream = $factory->fromRequest($request); +$data = $stream->read(1024); + +// 4.0 +$response = $client->get('/', ['stream' => true]); +// Read some data off of the stream in the response body +$data = $response->getBody()->read(1024); +``` + +#### Redirects + +The `configureRedirects()` method has been removed in favor of a +`allow_redirects` request option. + +```php +// Standard redirects with a default of a max of 5 redirects +$request = $client->createRequest('GET', '/', ['allow_redirects' => true]); + +// Strict redirects with a custom number of redirects +$request = $client->createRequest('GET', '/', [ + 'allow_redirects' => ['max' => 5, 'strict' => true] +]); +``` + +#### EntityBody + +EntityBody interfaces and classes have been removed or moved to +`GuzzleHttp\Stream`. All classes and interfaces that once required +`GuzzleHttp\EntityBodyInterface` now require +`GuzzleHttp\Stream\StreamInterface`. Creating a new body for a request no +longer uses `GuzzleHttp\EntityBody::factory` but now uses +`GuzzleHttp\Stream\Stream::factory` or even better: +`GuzzleHttp\Stream\create()`. + +- `Guzzle\Http\EntityBodyInterface` is now `GuzzleHttp\Stream\StreamInterface` +- `Guzzle\Http\EntityBody` is now `GuzzleHttp\Stream\Stream` +- `Guzzle\Http\CachingEntityBody` is now `GuzzleHttp\Stream\CachingStream` +- `Guzzle\Http\ReadLimitEntityBody` is now `GuzzleHttp\Stream\LimitStream` +- `Guzzle\Http\IoEmittyinEntityBody` has been removed. + +#### Request lifecycle events + +Requests previously submitted a large number of requests. The number of events +emitted over the lifecycle of a request has been significantly reduced to make +it easier to understand how to extend the behavior of a request. All events +emitted during the lifecycle of a request now emit a custom +`GuzzleHttp\Event\EventInterface` object that contains context providing +methods and a way in which to modify the transaction at that specific point in +time (e.g., intercept the request and set a response on the transaction). + +- `request.before_send` has been renamed to `before` and now emits a + `GuzzleHttp\Event\BeforeEvent` +- `request.complete` has been renamed to `complete` and now emits a + `GuzzleHttp\Event\CompleteEvent`. +- `request.sent` has been removed. Use `complete`. +- `request.success` has been removed. Use `complete`. +- `error` is now an event that emits a `GuzzleHttp\Event\ErrorEvent`. +- `request.exception` has been removed. Use `error`. +- `request.receive.status_line` has been removed. +- `curl.callback.progress` has been removed. Use a custom `StreamInterface` to + maintain a status update. +- `curl.callback.write` has been removed. Use a custom `StreamInterface` to + intercept writes. +- `curl.callback.read` has been removed. Use a custom `StreamInterface` to + intercept reads. + +`headers` is a new event that is emitted after the response headers of a +request have been received before the body of the response is downloaded. This +event emits a `GuzzleHttp\Event\HeadersEvent`. + +You can intercept a request and inject a response using the `intercept()` event +of a `GuzzleHttp\Event\BeforeEvent`, `GuzzleHttp\Event\CompleteEvent`, and +`GuzzleHttp\Event\ErrorEvent` event. + +See: http://docs.guzzlephp.org/en/latest/events.html + +## Inflection + +The `Guzzle\Inflection` namespace has been removed. This is not a core concern +of Guzzle. + +## Iterator + +The `Guzzle\Iterator` namespace has been removed. + +- `Guzzle\Iterator\AppendIterator`, `Guzzle\Iterator\ChunkedIterator`, and + `Guzzle\Iterator\MethodProxyIterator` are nice, but not a core requirement of + Guzzle itself. +- `Guzzle\Iterator\FilterIterator` is no longer needed because an equivalent + class is shipped with PHP 5.4. +- `Guzzle\Iterator\MapIterator` is not really needed when using PHP 5.5 because + it's easier to just wrap an iterator in a generator that maps values. + +For a replacement of these iterators, see https://github.com/nikic/iter + +## Log + +The LogPlugin has moved to https://github.com/guzzle/log-subscriber. The +`Guzzle\Log` namespace has been removed. Guzzle now relies on +`Psr\Log\LoggerInterface` for all logging. The MessageFormatter class has been +moved to `GuzzleHttp\Subscriber\Log\Formatter`. + +## Parser + +The `Guzzle\Parser` namespace has been removed. This was previously used to +make it possible to plug in custom parsers for cookies, messages, URI +templates, and URLs; however, this level of complexity is not needed in Guzzle +so it has been removed. + +- Cookie: Cookie parsing logic has been moved to + `GuzzleHttp\Cookie\SetCookie::fromString`. +- Message: Message parsing logic for both requests and responses has been moved + to `GuzzleHttp\Message\MessageFactory::fromMessage`. Message parsing is only + used in debugging or deserializing messages, so it doesn't make sense for + Guzzle as a library to add this level of complexity to parsing messages. +- UriTemplate: URI template parsing has been moved to + `GuzzleHttp\UriTemplate`. The Guzzle library will automatically use the PECL + URI template library if it is installed. +- Url: URL parsing is now performed in `GuzzleHttp\Url::fromString` (previously + it was `Guzzle\Http\Url::factory()`). If custom URL parsing is necessary, + then developers are free to subclass `GuzzleHttp\Url`. + +## Plugin + +The `Guzzle\Plugin` namespace has been renamed to `GuzzleHttp\Subscriber`. +Several plugins are shipping with the core Guzzle library under this namespace. + +- `GuzzleHttp\Subscriber\Cookie`: Replaces the old CookiePlugin. Cookie jar + code has moved to `GuzzleHttp\Cookie`. +- `GuzzleHttp\Subscriber\History`: Replaces the old HistoryPlugin. +- `GuzzleHttp\Subscriber\HttpError`: Throws errors when a bad HTTP response is + received. +- `GuzzleHttp\Subscriber\Mock`: Replaces the old MockPlugin. +- `GuzzleHttp\Subscriber\Prepare`: Prepares the body of a request just before + sending. This subscriber is attached to all requests by default. +- `GuzzleHttp\Subscriber\Redirect`: Replaces the RedirectPlugin. + +The following plugins have been removed (third-parties are free to re-implement +these if needed): + +- `GuzzleHttp\Plugin\Async` has been removed. +- `GuzzleHttp\Plugin\CurlAuth` has been removed. +- `GuzzleHttp\Plugin\ErrorResponse\ErrorResponsePlugin` has been removed. This + functionality should instead be implemented with event listeners that occur + after normal response parsing occurs in the guzzle/command package. + +The following plugins are not part of the core Guzzle package, but are provided +in separate repositories: + +- `Guzzle\Http\Plugin\BackoffPlugin` has been rewritten to be much simpler + to build custom retry policies using simple functions rather than various + chained classes. See: https://github.com/guzzle/retry-subscriber +- `Guzzle\Http\Plugin\Cache\CachePlugin` has moved to + https://github.com/guzzle/cache-subscriber +- `Guzzle\Http\Plugin\Log\LogPlugin` has moved to + https://github.com/guzzle/log-subscriber +- `Guzzle\Http\Plugin\Md5\Md5Plugin` has moved to + https://github.com/guzzle/message-integrity-subscriber +- `Guzzle\Http\Plugin\Mock\MockPlugin` has moved to + `GuzzleHttp\Subscriber\MockSubscriber`. +- `Guzzle\Http\Plugin\Oauth\OauthPlugin` has moved to + https://github.com/guzzle/oauth-subscriber + +## Service + +The service description layer of Guzzle has moved into two separate packages: + +- http://github.com/guzzle/command Provides a high level abstraction over web + services by representing web service operations using commands. +- http://github.com/guzzle/guzzle-services Provides an implementation of + guzzle/command that provides request serialization and response parsing using + Guzzle service descriptions. + +## Stream + +Stream have moved to a separate package available at +https://github.com/guzzle/streams. + +`Guzzle\Stream\StreamInterface` has been given a large update to cleanly take +on the responsibilities of `Guzzle\Http\EntityBody` and +`Guzzle\Http\EntityBodyInterface` now that they have been removed. The number +of methods implemented by the `StreamInterface` has been drastically reduced to +allow developers to more easily extend and decorate stream behavior. + +## Removed methods from StreamInterface + +- `getStream` and `setStream` have been removed to better encapsulate streams. +- `getMetadata` and `setMetadata` have been removed in favor of + `GuzzleHttp\Stream\MetadataStreamInterface`. +- `getWrapper`, `getWrapperData`, `getStreamType`, and `getUri` have all been + removed. This data is accessible when + using streams that implement `GuzzleHttp\Stream\MetadataStreamInterface`. +- `rewind` has been removed. Use `seek(0)` for a similar behavior. + +## Renamed methods + +- `detachStream` has been renamed to `detach`. +- `feof` has been renamed to `eof`. +- `ftell` has been renamed to `tell`. +- `readLine` has moved from an instance method to a static class method of + `GuzzleHttp\Stream\Stream`. + +## Metadata streams + +`GuzzleHttp\Stream\MetadataStreamInterface` has been added to denote streams +that contain additional metadata accessible via `getMetadata()`. +`GuzzleHttp\Stream\StreamInterface::getMetadata` and +`GuzzleHttp\Stream\StreamInterface::setMetadata` have been removed. + +## StreamRequestFactory + +The entire concept of the StreamRequestFactory has been removed. The way this +was used in Guzzle 3 broke the actual interface of sending streaming requests +(instead of getting back a Response, you got a StreamInterface). Streaming +PHP requests are now implemented through the `GuzzleHttp\Adapter\StreamAdapter`. + +3.6 to 3.7 +---------- + +### Deprecations + +- You can now enable E_USER_DEPRECATED warnings to see if you are using any deprecated methods.: + +```php +\Guzzle\Common\Version::$emitWarnings = true; +``` + +The following APIs and options have been marked as deprecated: + +- Marked `Guzzle\Http\Message\Request::isResponseBodyRepeatable()` as deprecated. Use `$request->getResponseBody()->isRepeatable()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::canCache()` as deprecated. Use `Guzzle\Plugin\Cache\DefaultCanCacheStrategy->canCacheRequest()` instead. +- Marked `Guzzle\Http\Message\Request::setIsRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Http\Message\Request::isRedirect()` as deprecated. Use the HistoryPlugin instead. +- Marked `Guzzle\Cache\CacheAdapterFactory::factory()` as deprecated +- Marked `Guzzle\Service\Client::enableMagicMethods()` as deprecated. Magic methods can no longer be disabled on a Guzzle\Service\Client. +- Marked `Guzzle\Parser\Url\UrlParser` as deprecated. Just use PHP's `parse_url()` and percent encode your UTF-8. +- Marked `Guzzle\Common\Collection::inject()` as deprecated. +- Marked `Guzzle\Plugin\CurlAuth\CurlAuthPlugin` as deprecated. Use + `$client->getConfig()->setPath('request.options/auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` or + `$client->setDefaultOption('auth', array('user', 'pass', 'Basic|Digest|NTLM|Any'));` + +3.7 introduces `request.options` as a parameter for a client configuration and as an optional argument to all creational +request methods. When paired with a client's configuration settings, these options allow you to specify default settings +for various aspects of a request. Because these options make other previous configuration options redundant, several +configuration options and methods of a client and AbstractCommand have been deprecated. + +- Marked `Guzzle\Service\Client::getDefaultHeaders()` as deprecated. Use `$client->getDefaultOption('headers')`. +- Marked `Guzzle\Service\Client::setDefaultHeaders()` as deprecated. Use `$client->setDefaultOption('headers/{header_name}', 'value')`. +- Marked 'request.params' for `Guzzle\Http\Client` as deprecated. Use `$client->setDefaultOption('params/{param_name}', 'value')` +- Marked 'command.headers', 'command.response_body' and 'command.on_complete' as deprecated for AbstractCommand. These will work through Guzzle 4.0 + + $command = $client->getCommand('foo', array( + 'command.headers' => array('Test' => '123'), + 'command.response_body' => '/path/to/file' + )); + + // Should be changed to: + + $command = $client->getCommand('foo', array( + 'command.request_options' => array( + 'headers' => array('Test' => '123'), + 'save_as' => '/path/to/file' + ) + )); + +### Interface changes + +Additions and changes (you will need to update any implementations or subclasses you may have created): + +- Added an `$options` argument to the end of the following methods of `Guzzle\Http\ClientInterface`: + createRequest, head, delete, put, patch, post, options, prepareRequest +- Added an `$options` argument to the end of `Guzzle\Http\Message\Request\RequestFactoryInterface::createRequest()` +- Added an `applyOptions()` method to `Guzzle\Http\Message\Request\RequestFactoryInterface` +- Changed `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $body = null)` to + `Guzzle\Http\ClientInterface::get($uri = null, $headers = null, $options = array())`. You can still pass in a + resource, string, or EntityBody into the $options parameter to specify the download location of the response. +- Changed `Guzzle\Common\Collection::__construct($data)` to no longer accepts a null value for `$data` but a + default `array()` +- Added `Guzzle\Stream\StreamInterface::isRepeatable` +- Made `Guzzle\Http\Client::expandTemplate` and `getUriTemplate` protected methods. + +The following methods were removed from interfaces. All of these methods are still available in the concrete classes +that implement them, but you should update your code to use alternative methods: + +- Removed `Guzzle\Http\ClientInterface::setDefaultHeaders(). Use + `$client->getConfig()->setPath('request.options/headers/{header_name}', 'value')`. or + `$client->getConfig()->setPath('request.options/headers', array('header_name' => 'value'))` or + `$client->setDefaultOption('headers/{header_name}', 'value')`. or + `$client->setDefaultOption('headers', array('header_name' => 'value'))`. +- Removed `Guzzle\Http\ClientInterface::getDefaultHeaders(). Use `$client->getConfig()->getPath('request.options/headers')`. +- Removed `Guzzle\Http\ClientInterface::expandTemplate()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::setRequestFactory()`. This is an implementation detail. +- Removed `Guzzle\Http\ClientInterface::getCurlMulti()`. This is a very specific implementation detail. +- Removed `Guzzle\Http\Message\RequestInterface::canCache`. Use the CachePlugin. +- Removed `Guzzle\Http\Message\RequestInterface::setIsRedirect`. Use the HistoryPlugin. +- Removed `Guzzle\Http\Message\RequestInterface::isRedirect`. Use the HistoryPlugin. + +### Cache plugin breaking changes + +- CacheKeyProviderInterface and DefaultCacheKeyProvider are no longer used. All of this logic is handled in a + CacheStorageInterface. These two objects and interface will be removed in a future version. +- Always setting X-cache headers on cached responses +- Default cache TTLs are now handled by the CacheStorageInterface of a CachePlugin +- `CacheStorageInterface::cache($key, Response $response, $ttl = null)` has changed to `cache(RequestInterface + $request, Response $response);` +- `CacheStorageInterface::fetch($key)` has changed to `fetch(RequestInterface $request);` +- `CacheStorageInterface::delete($key)` has changed to `delete(RequestInterface $request);` +- Added `CacheStorageInterface::purge($url)` +- `DefaultRevalidation::__construct(CacheKeyProviderInterface $cacheKey, CacheStorageInterface $cache, CachePlugin + $plugin)` has changed to `DefaultRevalidation::__construct(CacheStorageInterface $cache, + CanCacheStrategyInterface $canCache = null)` +- Added `RevalidationInterface::shouldRevalidate(RequestInterface $request, Response $response)` + +3.5 to 3.6 +---------- + +* Mixed casing of headers are now forced to be a single consistent casing across all values for that header. +* Messages internally use a HeaderCollection object to delegate handling case-insensitive header resolution +* Removed the whole changedHeader() function system of messages because all header changes now go through addHeader(). + For example, setHeader() first removes the header using unset on a HeaderCollection and then calls addHeader(). + Keeping the Host header and URL host in sync is now handled by overriding the addHeader method in Request. +* Specific header implementations can be created for complex headers. When a message creates a header, it uses a + HeaderFactory which can map specific headers to specific header classes. There is now a Link header and + CacheControl header implementation. +* Moved getLinks() from Response to just be used on a Link header object. + +If you previously relied on Guzzle\Http\Message\Header::raw(), then you will need to update your code to use the +HeaderInterface (e.g. toArray(), getAll(), etc.). + +### Interface changes + +* Removed from interface: Guzzle\Http\ClientInterface::setUriTemplate +* Removed from interface: Guzzle\Http\ClientInterface::setCurlMulti() +* Removed Guzzle\Http\Message\Request::receivedRequestHeader() and implemented this functionality in + Guzzle\Http\Curl\RequestMediator +* Removed the optional $asString parameter from MessageInterface::getHeader(). Just cast the header to a string. +* Removed the optional $tryChunkedTransfer option from Guzzle\Http\Message\EntityEnclosingRequestInterface +* Removed the $asObjects argument from Guzzle\Http\Message\MessageInterface::getHeaders() + +### Removed deprecated functions + +* Removed Guzzle\Parser\ParserRegister::get(). Use getParser() +* Removed Guzzle\Parser\ParserRegister::set(). Use registerParser(). + +### Deprecations + +* The ability to case-insensitively search for header values +* Guzzle\Http\Message\Header::hasExactHeader +* Guzzle\Http\Message\Header::raw. Use getAll() +* Deprecated cache control specific methods on Guzzle\Http\Message\AbstractMessage. Use the CacheControl header object + instead. + +### Other changes + +* All response header helper functions return a string rather than mixing Header objects and strings inconsistently +* Removed cURL blacklist support. This is no longer necessary now that Expect, Accept, etc. are managed by Guzzle + directly via interfaces +* Removed the injecting of a request object onto a response object. The methods to get and set a request still exist + but are a no-op until removed. +* Most classes that used to require a `Guzzle\Service\Command\CommandInterface` typehint now request a + `Guzzle\Service\Command\ArrayCommandInterface`. +* Added `Guzzle\Http\Message\RequestInterface::startResponse()` to the RequestInterface to handle injecting a response + on a request while the request is still being transferred +* `Guzzle\Service\Command\CommandInterface` now extends from ToArrayInterface and ArrayAccess + +3.3 to 3.4 +---------- + +Base URLs of a client now follow the rules of http://tools.ietf.org/html/rfc3986#section-5.2.2 when merging URLs. + +3.2 to 3.3 +---------- + +### Response::getEtag() quote stripping removed + +`Guzzle\Http\Message\Response::getEtag()` no longer strips quotes around the ETag response header + +### Removed `Guzzle\Http\Utils` + +The `Guzzle\Http\Utils` class was removed. This class was only used for testing. + +### Stream wrapper and type + +`Guzzle\Stream\Stream::getWrapper()` and `Guzzle\Stream\Stream::getStreamType()` are no longer converted to lowercase. + +### curl.emit_io became emit_io + +Emitting IO events from a RequestMediator is now a parameter that must be set in a request's curl options using the +'emit_io' key. This was previously set under a request's parameters using 'curl.emit_io' + +3.1 to 3.2 +---------- + +### CurlMulti is no longer reused globally + +Before 3.2, the same CurlMulti object was reused globally for each client. This can cause issue where plugins added +to a single client can pollute requests dispatched from other clients. + +If you still wish to reuse the same CurlMulti object with each client, then you can add a listener to the +ServiceBuilder's `service_builder.create_client` event to inject a custom CurlMulti object into each client as it is +created. + +```php +$multi = new Guzzle\Http\Curl\CurlMulti(); +$builder = Guzzle\Service\Builder\ServiceBuilder::factory('/path/to/config.json'); +$builder->addListener('service_builder.create_client', function ($event) use ($multi) { + $event['client']->setCurlMulti($multi); +} +}); +``` + +### No default path + +URLs no longer have a default path value of '/' if no path was specified. + +Before: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com/ +``` + +After: + +```php +$request = $client->get('http://www.foo.com'); +echo $request->getUrl(); +// >> http://www.foo.com +``` + +### Less verbose BadResponseException + +The exception message for `Guzzle\Http\Exception\BadResponseException` no longer contains the full HTTP request and +response information. You can, however, get access to the request and response object by calling `getRequest()` or +`getResponse()` on the exception object. + +### Query parameter aggregation + +Multi-valued query parameters are no longer aggregated using a callback function. `Guzzle\Http\Query` now has a +setAggregator() method that accepts a `Guzzle\Http\QueryAggregator\QueryAggregatorInterface` object. This object is +responsible for handling the aggregation of multi-valued query string variables into a flattened hash. + +2.8 to 3.x +---------- + +### Guzzle\Service\Inspector + +Change `\Guzzle\Service\Inspector::fromConfig` to `\Guzzle\Common\Collection::fromConfig` + +**Before** + +```php +use Guzzle\Service\Inspector; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Inspector::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +**After** + +```php +use Guzzle\Common\Collection; + +class YourClient extends \Guzzle\Service\Client +{ + public static function factory($config = array()) + { + $default = array(); + $required = array('base_url', 'username', 'api_key'); + $config = Collection::fromConfig($config, $default, $required); + + $client = new self( + $config->get('base_url'), + $config->get('username'), + $config->get('api_key') + ); + $client->setConfig($config); + + $client->setDescription(ServiceDescription::factory(__DIR__ . DIRECTORY_SEPARATOR . 'client.json')); + + return $client; + } +``` + +### Convert XML Service Descriptions to JSON + +**Before** + +```xml + + + + + + Get a list of groups + + + Uses a search query to get a list of groups + + + + Create a group + + + + + Delete a group by ID + + + + + + + Update a group + + + + + + +``` + +**After** + +```json +{ + "name": "Zendesk REST API v2", + "apiVersion": "2012-12-31", + "description":"Provides access to Zendesk views, groups, tickets, ticket fields, and users", + "operations": { + "list_groups": { + "httpMethod":"GET", + "uri": "groups.json", + "summary": "Get a list of groups" + }, + "search_groups":{ + "httpMethod":"GET", + "uri": "search.json?query=\"{query} type:group\"", + "summary": "Uses a search query to get a list of groups", + "parameters":{ + "query":{ + "location": "uri", + "description":"Zendesk Search Query", + "type": "string", + "required": true + } + } + }, + "create_group": { + "httpMethod":"POST", + "uri": "groups.json", + "summary": "Create a group", + "parameters":{ + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + }, + "delete_group": { + "httpMethod":"DELETE", + "uri": "groups/{id}.json", + "summary": "Delete a group", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to delete by ID", + "type": "integer", + "required": true + } + } + }, + "get_group": { + "httpMethod":"GET", + "uri": "groups/{id}.json", + "summary": "Get a ticket", + "parameters":{ + "id":{ + "location": "uri", + "description":"Group to get by ID", + "type": "integer", + "required": true + } + } + }, + "update_group": { + "httpMethod":"PUT", + "uri": "groups/{id}.json", + "summary": "Update a group", + "parameters":{ + "id": { + "location": "uri", + "description":"Group to update by ID", + "type": "integer", + "required": true + }, + "data": { + "type": "array", + "location": "body", + "description":"Group JSON", + "filters": "json_encode", + "required": true + }, + "Content-Type":{ + "type": "string", + "location":"header", + "static": "application/json" + } + } + } +} +``` + +### Guzzle\Service\Description\ServiceDescription + +Commands are now called Operations + +**Before** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getCommands(); // @returns ApiCommandInterface[] +$sd->hasCommand($name); +$sd->getCommand($name); // @returns ApiCommandInterface|null +$sd->addCommand($command); // @param ApiCommandInterface $command +``` + +**After** + +```php +use Guzzle\Service\Description\ServiceDescription; + +$sd = new ServiceDescription(); +$sd->getOperations(); // @returns OperationInterface[] +$sd->hasOperation($name); +$sd->getOperation($name); // @returns OperationInterface|null +$sd->addOperation($operation); // @param OperationInterface $operation +``` + +### Guzzle\Common\Inflection\Inflector + +Namespace is now `Guzzle\Inflection\Inflector` + +### Guzzle\Http\Plugin + +Namespace is now `Guzzle\Plugin`. Many other changes occur within this namespace and are detailed in their own sections below. + +### Guzzle\Http\Plugin\LogPlugin and Guzzle\Common\Log + +Now `Guzzle\Plugin\Log\LogPlugin` and `Guzzle\Log` respectively. + +**Before** + +```php +use Guzzle\Common\Log\ClosureLogAdapter; +use Guzzle\Http\Plugin\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $verbosity is an integer indicating desired message verbosity level +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $verbosity = LogPlugin::LOG_VERBOSE); +``` + +**After** + +```php +use Guzzle\Log\ClosureLogAdapter; +use Guzzle\Log\MessageFormatter; +use Guzzle\Plugin\Log\LogPlugin; + +/** @var \Guzzle\Http\Client */ +$client; + +// $format is a string indicating desired message format -- @see MessageFormatter +$client->addSubscriber(new LogPlugin(new ClosureLogAdapter(function($m) { echo $m; }, $format = MessageFormatter::DEBUG_FORMAT); +``` + +### Guzzle\Http\Plugin\CurlAuthPlugin + +Now `Guzzle\Plugin\CurlAuth\CurlAuthPlugin`. + +### Guzzle\Http\Plugin\ExponentialBackoffPlugin + +Now `Guzzle\Plugin\Backoff\BackoffPlugin`, and other changes. + +**Before** + +```php +use Guzzle\Http\Plugin\ExponentialBackoffPlugin; + +$backoffPlugin = new ExponentialBackoffPlugin($maxRetries, array_merge( + ExponentialBackoffPlugin::getDefaultFailureCodes(), array(429) + )); + +$client->addSubscriber($backoffPlugin); +``` + +**After** + +```php +use Guzzle\Plugin\Backoff\BackoffPlugin; +use Guzzle\Plugin\Backoff\HttpBackoffStrategy; + +// Use convenient factory method instead -- see implementation for ideas of what +// you can do with chaining backoff strategies +$backoffPlugin = BackoffPlugin::getExponentialBackoff($maxRetries, array_merge( + HttpBackoffStrategy::getDefaultFailureCodes(), array(429) + )); +$client->addSubscriber($backoffPlugin); +``` + +### Known Issues + +#### [BUG] Accept-Encoding header behavior changed unintentionally. + +(See #217) (Fixed in 09daeb8c666fb44499a0646d655a8ae36456575e) + +In version 2.8 setting the `Accept-Encoding` header would set the CURLOPT_ENCODING option, which permitted cURL to +properly handle gzip/deflate compressed responses from the server. In versions affected by this bug this does not happen. +See issue #217 for a workaround, or use a version containing the fix. diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json new file mode 100644 index 0000000..c01864f --- /dev/null +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -0,0 +1,59 @@ +{ + "name": "guzzlehttp/guzzle", + "type": "library", + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "framework", + "http", + "rest", + "web service", + "curl", + "client", + "HTTP client" + ], + "homepage": "http://guzzlephp.org/", + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.5", + "ext-json": "*", + "symfony/polyfill-intl-idn": "^1.17.0", + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.6.1" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", + "psr/log": "^1.1" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "config": { + "sort-packages": true + }, + "extra": { + "branch-alias": { + "dev-master": "6.5-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\": "src/" + }, + "files": [ + "src/functions_include.php" + ] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\": "tests/" + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php new file mode 100644 index 0000000..315a022 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Client.php @@ -0,0 +1,501 @@ + '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 \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'] = \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.'); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php new file mode 100644 index 0000000..638b75d --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -0,0 +1,87 @@ +strictMode = $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)); + } + $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() + ); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php new file mode 100644 index 0000000..6ee1188 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJarInterface.php @@ -0,0 +1,84 @@ +filename = $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 = \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 = \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}"); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php new file mode 100644 index 0000000..0224a24 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -0,0 +1,72 @@ +sessionKey = $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"); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php new file mode 100644 index 0000000..3d776a7 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -0,0 +1,403 @@ + 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\0\x0B") + : 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) + { + // Remove the leading '.' as per spec in RFC 6265. + // http://tools.ietf.org/html/rfc6265#section-5.2.3 + $cookieDomain = ltrim($this->getDomain(), '.'); + + // Domain not set or exact match. + if (!$cookieDomain || !strcasecmp($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; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php new file mode 100644 index 0000000..427d896 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/BadResponseException.php @@ -0,0 +1,27 @@ +getStatusCode() + : 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 \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; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php b/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php new file mode 100644 index 0000000..a77c289 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/SeekException.php @@ -0,0 +1,27 @@ +stream = $stream; + $msg = $msg ?: 'Could not seek the stream to position ' . $pos; + parent::__construct($msg); + } + + /** + * @return StreamInterface + */ + public function getStream() + { + return $this->stream; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php new file mode 100644 index 0000000..127094c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -0,0 +1,9 @@ +maxHandles = $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 \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 \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 \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 = \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']) || + !\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] = \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); + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php new file mode 100644 index 0000000..b0fc236 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactoryInterface.php @@ -0,0 +1,27 @@ +factory = 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); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php new file mode 100644 index 0000000..564c95f --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -0,0 +1,219 @@ +factory = 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; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php new file mode 100644 index 0000000..7754e91 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/EasyHandle.php @@ -0,0 +1,92 @@ +headers)) { + throw new \RuntimeException('No headers have been received'); + } + + // HTTP-version SP status-code SP reason-phrase + $startLine = explode(' ', array_shift($this->headers), 3); + $headers = \GuzzleHttp\headers_from_lines($this->headers); + $normalizedKeys = \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); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php new file mode 100644 index 0000000..5b312bc --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -0,0 +1,195 @@ +onFulfilled = $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 + ? \GuzzleHttp\Promise\rejection_for($response) + : \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 \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 \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 ' . \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); + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php new file mode 100644 index 0000000..f8b00be --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php @@ -0,0 +1,55 @@ +withoutHeader('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') // DNS lookup failed + || strpos($message, 'Connection refused') + || strpos($message, "couldn't connect to host") // error on HHVM + || 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 \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 = \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 \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 = \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']) + || !\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'] = \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 = \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); + } + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php new file mode 100644 index 0000000..6a49cc0 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -0,0 +1,277 @@ +push(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) . ')'; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php new file mode 100644 index 0000000..dc36bb5 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php @@ -0,0 +1,185 @@ +>>>>>>>\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); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php new file mode 100644 index 0000000..bffc197 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Middleware.php @@ -0,0 +1,254 @@ +withCookieHeader($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 \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' /* \Psr\Log\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 \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); + }; + }; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Pool.php b/vendor/guzzlehttp/guzzle/src/Pool.php new file mode 100644 index 0000000..5838db4 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Pool.php @@ -0,0 +1,134 @@ + $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; + }; + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php new file mode 100644 index 0000000..568a1e9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -0,0 +1,111 @@ +nextHandler = $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'; + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php new file mode 100644 index 0000000..e4644b7 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -0,0 +1,255 @@ + 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 (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 = $this->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 header if host is different. + if ($request->getUri()->getHost() !== $modify['uri']->getHost()) { + $modify['remove_headers'][] = 'Authorization'; + } + + 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 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; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/RequestOptions.php b/vendor/guzzlehttp/guzzle/src/RequestOptions.php new file mode 100644 index 0000000..355f658 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -0,0 +1,263 @@ +decider = $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 \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); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/TransferStats.php b/vendor/guzzlehttp/guzzle/src/TransferStats.php new file mode 100644 index 0000000..87fb3c0 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/TransferStats.php @@ -0,0 +1,126 @@ +request = $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; + } +} diff --git a/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/vendor/guzzlehttp/guzzle/src/UriTemplate.php new file mode 100644 index 0000000..96dcfd0 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/UriTemplate.php @@ -0,0 +1,237 @@ + ['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); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Utils.php b/vendor/guzzlehttp/guzzle/src/Utils.php new file mode 100644 index 0000000..c698acb --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Utils.php @@ -0,0 +1,92 @@ +getHost()) { + $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'); + } +} diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php new file mode 100644 index 0000000..c2afd8c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/functions.php @@ -0,0 +1,334 @@ +expand($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('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 = '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( + <<< EOT +No system CA bundle could be found in any of the the common system locations. +PHP versions earlier than 5.6 are not properly configured to use the system's +CA bundle by default. In order to verify peer certificates, you will need to +supply the path on disk to a certificate bundle to the 'verify' request +option: http://docs.guzzlephp.org/en/latest/clients.html#verify. If you do not +need a specific certificate bundle, then Mozilla provides a commonly used CA +bundle which can be downloaded here (provided by the maintainer of cURL): +https://raw.githubusercontent.com/bagder/ca-bundle/master/ca-bundle.crt. Once +you have a CA bundle available on disk, you can set the 'openssl.cafile' PHP +ini setting to point to the path to the file, allowing you to omit the 'verify' +request option. See http://curl.haxx.se/docs/sslcerts.html for more +information. +EOT + ); +} + +/** + * Creates an associative array of lowercase header names to the actual + * header casing. + * + * @param array $headers + * + * @return array + */ +function normalize_header_keys(array $headers) +{ + $result = []; + foreach (array_keys($headers) as $key) { + $result[strtolower($key)] = $key; + } + + return $result; +} + +/** + * Returns true if the provided host matches any of the no proxy areas. + * + * This method will strip a port from the host if it is present. Each pattern + * can be matched with an exact match (e.g., "foo.com" == "foo.com") or a + * partial match: (e.g., "foo.com" == "baz.foo.com" and ".foo.com" == + * "baz.foo.com", but ".foo.com" != "foo.com"). + * + * Areas are matched in the following cases: + * 1. "*" (without quotes) always matches any hosts. + * 2. An exact match. + * 3. The area starts with "." and the area is the last part of the host. e.g. + * '.mit.edu' will match any host that ends with '.mit.edu'. + * + * @param string $host Host to check against the patterns. + * @param array $noProxyArray An array of host patterns. + * + * @return bool + */ +function is_host_in_noproxy($host, array $noProxyArray) +{ + if (strlen($host) === 0) { + throw new \InvalidArgumentException('Empty host provided'); + } + + // Strip port if present. + if (strpos($host, ':')) { + $host = explode($host, ':', 2)[0]; + } + + foreach ($noProxyArray as $area) { + // Always match on wildcards. + if ($area === '*') { + return true; + } elseif (empty($area)) { + // Don't match on empty values. + continue; + } elseif ($area === $host) { + // Exact matches. + return true; + } else { + // Special match if the area when prefixed with ".". Remove any + // existing leading "." and add a new leading ".". + $area = '.' . ltrim($area, '.'); + if (substr($host, -(strlen($area))) === $area) { + return true; + } + } + } + + return false; +} + +/** + * Wrapper for json_decode that throws when an error occurs. + * + * @param string $json JSON data to parse + * @param bool $assoc When true, returned objects will be converted + * into associative arrays. + * @param int $depth User specified recursion depth. + * @param int $options Bitmask of JSON decode options. + * + * @return mixed + * @throws Exception\InvalidArgumentException if the JSON cannot be decoded. + * @link http://www.php.net/manual/en/function.json-decode.php + */ +function json_decode($json, $assoc = false, $depth = 512, $options = 0) +{ + $data = \json_decode($json, $assoc, $depth, $options); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_decode error: ' . json_last_error_msg() + ); + } + + return $data; +} + +/** + * Wrapper for JSON encoding that throws when an error occurs. + * + * @param mixed $value The value being encoded + * @param int $options JSON encode option bitmask + * @param int $depth Set the maximum depth. Must be greater than zero. + * + * @return string + * @throws Exception\InvalidArgumentException if the JSON cannot be encoded. + * @link http://www.php.net/manual/en/function.json-encode.php + */ +function json_encode($value, $options = 0, $depth = 512) +{ + $json = \json_encode($value, $options, $depth); + if (JSON_ERROR_NONE !== json_last_error()) { + throw new Exception\InvalidArgumentException( + 'json_encode error: ' . json_last_error_msg() + ); + } + + return $json; +} diff --git a/vendor/guzzlehttp/guzzle/src/functions_include.php b/vendor/guzzlehttp/guzzle/src/functions_include.php new file mode 100644 index 0000000..a93393a --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/functions_include.php @@ -0,0 +1,6 @@ + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/promises/Makefile b/vendor/guzzlehttp/promises/Makefile new file mode 100644 index 0000000..8d5b3ef --- /dev/null +++ b/vendor/guzzlehttp/promises/Makefile @@ -0,0 +1,13 @@ +all: clean test + +test: + vendor/bin/phpunit + +coverage: + vendor/bin/phpunit --coverage-html=artifacts/coverage + +view-coverage: + open artifacts/coverage/index.html + +clean: + rm -rf artifacts/* diff --git a/vendor/guzzlehttp/promises/README.md b/vendor/guzzlehttp/promises/README.md new file mode 100644 index 0000000..7b607e2 --- /dev/null +++ b/vendor/guzzlehttp/promises/README.md @@ -0,0 +1,504 @@ +# Guzzle Promises + +[Promises/A+](https://promisesaplus.com/) implementation that handles promise +chaining and resolution iteratively, allowing for "infinite" promise chaining +while keeping the stack size constant. Read [this blog post](https://blog.domenic.me/youre-missing-the-point-of-promises/) +for a general introduction to promises. + +- [Features](#features) +- [Quick start](#quick-start) +- [Synchronous wait](#synchronous-wait) +- [Cancellation](#cancellation) +- [API](#api) + - [Promise](#promise) + - [FulfilledPromise](#fulfilledpromise) + - [RejectedPromise](#rejectedpromise) +- [Promise interop](#promise-interop) +- [Implementation notes](#implementation-notes) + + +# Features + +- [Promises/A+](https://promisesaplus.com/) implementation. +- Promise resolution and chaining is handled iteratively, allowing for + "infinite" promise chaining. +- Promises have a synchronous `wait` method. +- Promises can be cancelled. +- Works with any object that has a `then` function. +- C# style async/await coroutine promises using + `GuzzleHttp\Promise\coroutine()`. + + +# Quick start + +A *promise* represents the eventual result of an asynchronous operation. The +primary way of interacting with a promise is through its `then` method, which +registers callbacks to receive either a promise's eventual value or the reason +why the promise cannot be fulfilled. + + +## Callbacks + +Callbacks are registered with the `then` method by providing an optional +`$onFulfilled` followed by an optional `$onRejected` function. + + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then( + // $onFulfilled + function ($value) { + echo 'The promise was fulfilled.'; + }, + // $onRejected + function ($reason) { + echo 'The promise was rejected.'; + } +); +``` + +*Resolving* a promise means that you either fulfill a promise with a *value* or +reject a promise with a *reason*. Resolving a promises triggers callbacks +registered with the promises's `then` method. These callbacks are triggered +only once and in the order in which they were added. + + +## Resolving a promise + +Promises are fulfilled using the `resolve($value)` method. Resolving a promise +with any value other than a `GuzzleHttp\Promise\RejectedPromise` will trigger +all of the onFulfilled callbacks (resolving a promise with a rejected promise +will reject the promise and trigger the `$onRejected` callbacks). + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise + ->then(function ($value) { + // Return a value and don't break the chain + return "Hello, " . $value; + }) + // This then is executed after the first then and receives the value + // returned from the first then. + ->then(function ($value) { + echo $value; + }); + +// Resolving the promise triggers the $onFulfilled callbacks and outputs +// "Hello, reader". +$promise->resolve('reader.'); +``` + + +## Promise forwarding + +Promises can be chained one after the other. Each then in the chain is a new +promise. The return value of a promise is what's forwarded to the next +promise in the chain. Returning a promise in a `then` callback will cause the +subsequent promises in the chain to only be fulfilled when the returned promise +has been fulfilled. The next promise in the chain will be invoked with the +resolved value of the promise. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$nextPromise = new Promise(); + +$promise + ->then(function ($value) use ($nextPromise) { + echo $value; + return $nextPromise; + }) + ->then(function ($value) { + echo $value; + }); + +// Triggers the first callback and outputs "A" +$promise->resolve('A'); +// Triggers the second callback and outputs "B" +$nextPromise->resolve('B'); +``` + +## Promise rejection + +When a promise is rejected, the `$onRejected` callbacks are invoked with the +rejection reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + echo $reason; +}); + +$promise->reject('Error!'); +// Outputs "Error!" +``` + +## Rejection forwarding + +If an exception is thrown in an `$onRejected` callback, subsequent +`$onRejected` callbacks are invoked with the thrown exception as the reason. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + throw new \Exception($reason); +})->then(null, function ($reason) { + assert($reason->getMessage() === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +You can also forward a rejection down the promise chain by returning a +`GuzzleHttp\Promise\RejectedPromise` in either an `$onFulfilled` or +`$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new Promise(); +$promise->then(null, function ($reason) { + return new RejectedPromise($reason); +})->then(null, function ($reason) { + assert($reason === 'Error!'); +}); + +$promise->reject('Error!'); +``` + +If an exception is not thrown in a `$onRejected` callback and the callback +does not return a rejected promise, downstream `$onFulfilled` callbacks are +invoked using the value returned from the `$onRejected` callback. + +```php +use GuzzleHttp\Promise\Promise; +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new Promise(); +$promise + ->then(null, function ($reason) { + return "It's ok"; + }) + ->then(function ($value) { + assert($value === "It's ok"); + }); + +$promise->reject('Error!'); +``` + +# Synchronous wait + +You can synchronously force promises to complete using a promise's `wait` +method. When creating a promise, you can provide a wait function that is used +to synchronously force a promise to complete. When a wait function is invoked +it is expected to deliver a value to the promise or reject the promise. If the +wait function does not deliver a value, then an exception is thrown. The wait +function provided to a promise constructor is invoked when the `wait` function +of the promise is called. + +```php +$promise = new Promise(function () use (&$promise) { + $promise->resolve('foo'); +}); + +// Calling wait will return the value of the promise. +echo $promise->wait(); // outputs "foo" +``` + +If an exception is encountered while invoking the wait function of a promise, +the promise is rejected with the exception and the exception is thrown. + +```php +$promise = new Promise(function () use (&$promise) { + throw new \Exception('foo'); +}); + +$promise->wait(); // throws the exception. +``` + +Calling `wait` on a promise that has been fulfilled will not trigger the wait +function. It will simply return the previously resolved value. + +```php +$promise = new Promise(function () { die('this is not called!'); }); +$promise->resolve('foo'); +echo $promise->wait(); // outputs "foo" +``` + +Calling `wait` on a promise that has been rejected will throw an exception. If +the rejection reason is an instance of `\Exception` the reason is thrown. +Otherwise, a `GuzzleHttp\Promise\RejectionException` is thrown and the reason +can be obtained by calling the `getReason` method of the exception. + +```php +$promise = new Promise(); +$promise->reject('foo'); +$promise->wait(); +``` + +> PHP Fatal error: Uncaught exception 'GuzzleHttp\Promise\RejectionException' with message 'The promise was rejected with value: foo' + + +## Unwrapping a promise + +When synchronously waiting on a promise, you are joining the state of the +promise into the current state of execution (i.e., return the value of the +promise if it was fulfilled or throw an exception if it was rejected). This is +called "unwrapping" the promise. Waiting on a promise will by default unwrap +the promise state. + +You can force a promise to resolve and *not* unwrap the state of the promise +by passing `false` to the first argument of the `wait` function: + +```php +$promise = new Promise(); +$promise->reject('foo'); +// This will not throw an exception. It simply ensures the promise has +// been resolved. +$promise->wait(false); +``` + +When unwrapping a promise, the resolved value of the promise will be waited +upon until the unwrapped value is not a promise. This means that if you resolve +promise A with a promise B and unwrap promise A, the value returned by the +wait function will be the value delivered to promise B. + +**Note**: when you do not unwrap the promise, no value is returned. + + +# Cancellation + +You can cancel a promise that has not yet been fulfilled using the `cancel()` +method of a promise. When creating a promise you can provide an optional +cancel function that when invoked cancels the action of computing a resolution +of the promise. + + +# API + + +## Promise + +When creating a promise object, you can provide an optional `$waitFn` and +`$cancelFn`. `$waitFn` is a function that is invoked with no arguments and is +expected to resolve the promise. `$cancelFn` is a function with no arguments +that is expected to cancel the computation of a promise. It is invoked when the +`cancel()` method of a promise is called. + +```php +use GuzzleHttp\Promise\Promise; + +$promise = new Promise( + function () use (&$promise) { + $promise->resolve('waited'); + }, + function () { + // do something that will cancel the promise computation (e.g., close + // a socket, cancel a database query, etc...) + } +); + +assert('waited' === $promise->wait()); +``` + +A promise has the following methods: + +- `then(callable $onFulfilled, callable $onRejected) : PromiseInterface` + + Appends fulfillment and rejection handlers to the promise, and returns a new promise resolving to the return value of the called handler. + +- `otherwise(callable $onRejected) : PromiseInterface` + + Appends a rejection handler callback to the promise, and returns a new promise resolving to the return value of the callback if it is called, or to its original fulfillment value if the promise is instead fulfilled. + +- `wait($unwrap = true) : mixed` + + Synchronously waits on the promise to complete. + + `$unwrap` controls whether or not the value of the promise is returned for a + fulfilled promise or if an exception is thrown if the promise is rejected. + This is set to `true` by default. + +- `cancel()` + + Attempts to cancel the promise if possible. The promise being cancelled and + the parent most ancestor that has not yet been resolved will also be + cancelled. Any promises waiting on the cancelled promise to resolve will also + be cancelled. + +- `getState() : string` + + Returns the state of the promise. One of `pending`, `fulfilled`, or + `rejected`. + +- `resolve($value)` + + Fulfills the promise with the given `$value`. + +- `reject($reason)` + + Rejects the promise with the given `$reason`. + + +## FulfilledPromise + +A fulfilled promise can be created to represent a promise that has been +fulfilled. + +```php +use GuzzleHttp\Promise\FulfilledPromise; + +$promise = new FulfilledPromise('value'); + +// Fulfilled callbacks are immediately invoked. +$promise->then(function ($value) { + echo $value; +}); +``` + + +## RejectedPromise + +A rejected promise can be created to represent a promise that has been +rejected. + +```php +use GuzzleHttp\Promise\RejectedPromise; + +$promise = new RejectedPromise('Error'); + +// Rejected callbacks are immediately invoked. +$promise->then(null, function ($reason) { + echo $reason; +}); +``` + + +# Promise interop + +This library works with foreign promises that have a `then` method. This means +you can use Guzzle promises with [React promises](https://github.com/reactphp/promise) +for example. When a foreign promise is returned inside of a then method +callback, promise resolution will occur recursively. + +```php +// Create a React promise +$deferred = new React\Promise\Deferred(); +$reactPromise = $deferred->promise(); + +// Create a Guzzle promise that is fulfilled with a React promise. +$guzzlePromise = new \GuzzleHttp\Promise\Promise(); +$guzzlePromise->then(function ($value) use ($reactPromise) { + // Do something something with the value... + // Return the React promise + return $reactPromise; +}); +``` + +Please note that wait and cancel chaining is no longer possible when forwarding +a foreign promise. You will need to wrap a third-party promise with a Guzzle +promise in order to utilize wait and cancel functions with foreign promises. + + +## Event Loop Integration + +In order to keep the stack size constant, Guzzle promises are resolved +asynchronously using a task queue. When waiting on promises synchronously, the +task queue will be automatically run to ensure that the blocking promise and +any forwarded promises are resolved. When using promises asynchronously in an +event loop, you will need to run the task queue on each tick of the loop. If +you do not run the task queue, then promises will not be resolved. + +You can run the task queue using the `run()` method of the global task queue +instance. + +```php +// Get the global task queue +$queue = \GuzzleHttp\Promise\queue(); +$queue->run(); +``` + +For example, you could use Guzzle promises with React using a periodic timer: + +```php +$loop = React\EventLoop\Factory::create(); +$loop->addPeriodicTimer(0, [$queue, 'run']); +``` + +*TODO*: Perhaps adding a `futureTick()` on each tick would be faster? + + +# Implementation notes + + +## Promise resolution and chaining is handled iteratively + +By shuffling pending handlers from one owner to another, promises are +resolved iteratively, allowing for "infinite" then chaining. + +```php +then(function ($v) { + // The stack size remains constant (a good thing) + echo xdebug_get_stack_depth() . ', '; + return $v + 1; + }); +} + +$parent->resolve(0); +var_dump($p->wait()); // int(1000) + +``` + +When a promise is fulfilled or rejected with a non-promise value, the promise +then takes ownership of the handlers of each child promise and delivers values +down the chain without using recursion. + +When a promise is resolved with another promise, the original promise transfers +all of its pending handlers to the new promise. When the new promise is +eventually resolved, all of the pending handlers are delivered the forwarded +value. + + +## A promise is the deferred. + +Some promise libraries implement promises using a deferred object to represent +a computation and a promise object to represent the delivery of the result of +the computation. This is a nice separation of computation and delivery because +consumers of the promise cannot modify the value that will be eventually +delivered. + +One side effect of being able to implement promise resolution and chaining +iteratively is that you need to be able for one promise to reach into the state +of another promise to shuffle around ownership of handlers. In order to achieve +this without making the handlers of a promise publicly mutable, a promise is +also the deferred value, allowing promises of the same parent class to reach +into and modify the private properties of promises of the same type. While this +does allow consumers of the value to modify the resolution or rejection of the +deferred, it is a small price to pay for keeping the stack size constant. + +```php +$promise = new Promise(); +$promise->then(function ($value) { echo $value; }); +// The promise is the deferred value, so you can deliver a value to it. +$promise->resolve('foo'); +// prints "foo" +``` diff --git a/vendor/guzzlehttp/promises/composer.json b/vendor/guzzlehttp/promises/composer.json new file mode 100644 index 0000000..ec41a61 --- /dev/null +++ b/vendor/guzzlehttp/promises/composer.json @@ -0,0 +1,34 @@ +{ + "name": "guzzlehttp/promises", + "description": "Guzzle promises library", + "keywords": ["promise"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "require": { + "php": ">=5.5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "scripts": { + "test": "vendor/bin/phpunit", + "test-ci": "vendor/bin/phpunit --coverage-text" + }, + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + } +} diff --git a/vendor/guzzlehttp/promises/src/AggregateException.php b/vendor/guzzlehttp/promises/src/AggregateException.php new file mode 100644 index 0000000..6a5690c --- /dev/null +++ b/vendor/guzzlehttp/promises/src/AggregateException.php @@ -0,0 +1,16 @@ +then(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(); + } + }); + $this->nextCoroutine($this->generator->current()); + } + + 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 = promise_for($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(exception_for($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); + } + } +} diff --git a/vendor/guzzlehttp/promises/src/EachPromise.php b/vendor/guzzlehttp/promises/src/EachPromise.php new file mode 100644 index 0000000..d0ddf60 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/EachPromise.php @@ -0,0 +1,229 @@ +iterable = iter_for($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']; + } + } + + public function promise() + { + if ($this->aggregate) { + return $this->aggregate; + } + + try { + $this->createPromise(); + $this->iterable->rewind(); + $this->refillPending(); + } catch (\Throwable $e) { + $this->aggregate->reject($e); + } catch (\Exception $e) { + $this->aggregate->reject($e); + } + + return $this->aggregate; + } + + private function createPromise() + { + $this->mutex = false; + $this->aggregate = new Promise(function () { + reset($this->pending); + if (empty($this->pending) && !$this->iterable->valid()) { + $this->aggregate->resolve(null); + return; + } + + // 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 ($this->aggregate->getState() !== PromiseInterface::PENDING) { + return; + } + } + }); + + // Clear the references when the promise is resolved. + $clearFn = function () { + $this->iterable = $this->concurrency = $this->pending = null; + $this->onFulfilled = $this->onRejected = null; + }; + + $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 = promise_for($this->iterable->current()); + $idx = $this->iterable->key(); + + $this->pending[$idx] = $promise->then( + function ($value) use ($idx) { + if ($this->onFulfilled) { + call_user_func( + $this->onFulfilled, $value, $idx, $this->aggregate + ); + } + $this->step($idx); + }, + function ($reason) use ($idx) { + if ($this->onRejected) { + call_user_func( + $this->onRejected, $reason, $idx, $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 ($this->aggregate->getState() !== PromiseInterface::PENDING) { + 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; + } +} diff --git a/vendor/guzzlehttp/promises/src/FulfilledPromise.php b/vendor/guzzlehttp/promises/src/FulfilledPromise.php new file mode 100644 index 0000000..dbbeeb9 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/FulfilledPromise.php @@ -0,0 +1,82 @@ +value = $value; + } + + public function then( + callable $onFulfilled = null, + callable $onRejected = null + ) { + // Return itself if there is no onFulfilled function. + if (!$onFulfilled) { + return $this; + } + + $queue = queue(); + $p = new Promise([$queue, 'run']); + $value = $this->value; + $queue->add(static function () use ($p, $value, $onFulfilled) { + if ($p->getState() === self::PENDING) { + 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 + } +} diff --git a/vendor/guzzlehttp/promises/src/Promise.php b/vendor/guzzlehttp/promises/src/Promise.php new file mode 100644 index 0000000..844ada0 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/Promise.php @@ -0,0 +1,280 @@ +waitFn = $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) { + return $onFulfilled + ? promise_for($this->result)->then($onFulfilled) + : promise_for($this->result); + } + + // It's either cancelled or rejected, so return a rejected promise + // and immediately invoke any callbacks. + $rejection = rejection_for($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(); + + $inner = $this->result instanceof PromiseInterface + ? $this->result->wait($unwrap) + : $this->result; + + if ($unwrap) { + if ($this->result instanceof PromiseInterface + || $this->state === self::FULFILLED + ) { + return $inner; + } else { + // It's rejected so "unwrap" and throw an exception. + throw exception_for($inner); + } + } + } + + 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. + 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 (!method_exists($value, 'then')) { + $id = $state === self::FULFILLED ? 1 : 2; + // It's a success, so resolve the handlers in the queue. + queue()->add(static function () use ($id, $value, $handlers) { + foreach ($handlers as $handler) { + self::callHandler($id, $value, $handler); + } + }); + } elseif ($value instanceof Promise + && $value->getState() === self::PENDING + ) { + // 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). + * + * @return array Returns the next group to resolve. + */ + 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 ($promise->getState() !== self::PENDING) { + return; + } + + try { + if (isset($handler[$index])) { + $promise->resolve($handler[$index]($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 not 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.'); + } + + queue()->run(); + + 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) { + while (true) { + $result->waitIfPending(); + + if ($result->result instanceof Promise) { + $result = $result->result; + } else { + if ($result->result instanceof PromiseInterface) { + $result->result->wait(false); + } + break; + } + } + } + } +} diff --git a/vendor/guzzlehttp/promises/src/PromiseInterface.php b/vendor/guzzlehttp/promises/src/PromiseInterface.php new file mode 100644 index 0000000..8f5f4b9 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/PromiseInterface.php @@ -0,0 +1,93 @@ +reason = $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 = queue(); + $reason = $this->reason; + $p = new Promise([$queue, 'run']); + $queue->add(static function () use ($p, $reason, $onRejected) { + if ($p->getState() === self::PENDING) { + 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 exception_for($this->reason); + } + } + + 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 + } +} diff --git a/vendor/guzzlehttp/promises/src/RejectionException.php b/vendor/guzzlehttp/promises/src/RejectionException.php new file mode 100644 index 0000000..07c1136 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/RejectionException.php @@ -0,0 +1,47 @@ +reason = $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; + } +} diff --git a/vendor/guzzlehttp/promises/src/TaskQueue.php b/vendor/guzzlehttp/promises/src/TaskQueue.php new file mode 100644 index 0000000..6e8a2a0 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/TaskQueue.php @@ -0,0 +1,66 @@ +run(); + */ +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() + { + /** @var callable $task */ + while ($task = array_shift($this->queue)) { + $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; + } +} diff --git a/vendor/guzzlehttp/promises/src/TaskQueueInterface.php b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php new file mode 100644 index 0000000..ac8306e --- /dev/null +++ b/vendor/guzzlehttp/promises/src/TaskQueueInterface.php @@ -0,0 +1,25 @@ + + * while ($eventLoop->isRunning()) { + * GuzzleHttp\Promise\queue()->run(); + * } + * + * + * @param TaskQueueInterface $assign Optionally specify a new queue instance. + * + * @return TaskQueueInterface + */ +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 + */ +function task(callable $task) +{ + $queue = queue(); + $promise = new Promise([$queue, 'run']); + $queue->add(function () use ($task, $promise) { + try { + $promise->resolve($task()); + } catch (\Throwable $e) { + $promise->reject($e); + } catch (\Exception $e) { + $promise->reject($e); + } + }); + + return $promise; +} + +/** + * Creates a promise for a value if the value is not a promise. + * + * @param mixed $value Promise or value. + * + * @return PromiseInterface + */ +function promise_for($value) +{ + if ($value instanceof PromiseInterface) { + return $value; + } + + // Return a Guzzle promise that shadows the given promise. + if (method_exists($value, 'then')) { + $wfn = method_exists($value, 'wait') ? [$value, 'wait'] : null; + $cfn = method_exists($value, 'cancel') ? [$value, 'cancel'] : null; + $promise = new Promise($wfn, $cfn); + $value->then([$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 + */ +function rejection_for($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 + */ +function exception_for($reason) +{ + return $reason instanceof \Exception || $reason instanceof \Throwable + ? $reason + : new RejectionException($reason); +} + +/** + * Returns an iterator for the given value. + * + * @param mixed $value + * + * @return \Iterator + */ +function iter_for($value) +{ + if ($value instanceof \Iterator) { + return $value; + } elseif (is_array($value)) { + return new \ArrayIterator($value); + } else { + return new \ArrayIterator([$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 + */ +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. + * + * @param PromiseInterface[] $promises Traversable of promises to wait upon. + * + * @return array + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function inspect_all($promises) +{ + $results = []; + foreach ($promises as $key => $promise) { + $results[$key] = 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 mixed $promises Iterable of PromiseInterface objects to wait on. + * + * @return array + * @throws \Exception on error + * @throws \Throwable on error in PHP >=7 + */ +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. + * + * @return PromiseInterface + */ +function all($promises) +{ + $results = []; + return each( + $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; + }); +} + +/** + * 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 prommise is rejected with a {@see GuzzleHttp\Promise\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 + */ +function some($count, $promises) +{ + $results = []; + $rejections = []; + + return each( + $promises, + function ($value, $idx, PromiseInterface $p) use (&$results, $count) { + if ($p->getState() !== PromiseInterface::PENDING) { + 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 + */ +function any($promises) +{ + return 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. + * + * @param mixed $promises Promises or values. + * + * @return PromiseInterface + * @see GuzzleHttp\Promise\inspect for the inspection state array format. + */ +function settle($promises) +{ + $results = []; + + return each( + $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; + }); +} + +/** + * 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 promise 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 promise if needed. + * + * @param mixed $iterable Iterator or array to iterate over. + * @param callable $onFulfilled + * @param callable $onRejected + * + * @return PromiseInterface + */ +function each( + $iterable, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected + ]))->promise(); +} + +/** + * 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 + */ +function each_limit( + $iterable, + $concurrency, + callable $onFulfilled = null, + callable $onRejected = null +) { + return (new EachPromise($iterable, [ + 'fulfilled' => $onFulfilled, + 'rejected' => $onRejected, + 'concurrency' => $concurrency + ]))->promise(); +} + +/** + * 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 + */ +function each_limit_all( + $iterable, + $concurrency, + callable $onFulfilled = null +) { + return each_limit( + $iterable, + $concurrency, + $onFulfilled, + function ($reason, $idx, PromiseInterface $aggregate) { + $aggregate->reject($reason); + } + ); +} + +/** + * Returns true if a promise is fulfilled. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_fulfilled(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::FULFILLED; +} + +/** + * Returns true if a promise is rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_rejected(PromiseInterface $promise) +{ + return $promise->getState() === PromiseInterface::REJECTED; +} + +/** + * Returns true if a promise is fulfilled or rejected. + * + * @param PromiseInterface $promise + * + * @return bool + */ +function is_settled(PromiseInterface $promise) +{ + return $promise->getState() !== PromiseInterface::PENDING; +} + +/** + * @see Coroutine + * + * @param callable $generatorFn + * + * @return PromiseInterface + */ +function coroutine(callable $generatorFn) +{ + return new Coroutine($generatorFn); +} diff --git a/vendor/guzzlehttp/promises/src/functions_include.php b/vendor/guzzlehttp/promises/src/functions_include.php new file mode 100644 index 0000000..34cd171 --- /dev/null +++ b/vendor/guzzlehttp/promises/src/functions_include.php @@ -0,0 +1,6 @@ +withPath('foo')->withHost('example.com')` will throw an exception + because the path of a URI with an authority must start with a slash "/" or be empty + - `(new Uri())->withScheme('http')` will return `'http://localhost'` + +### Deprecated + +- `Uri::resolve` in favor of `UriResolver::resolve` +- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +### Fixed + +- `Stream::read` when length parameter <= 0. +- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory. +- `ServerRequest::getUriFromGlobals` when `Host` header contains port. +- Compatibility of URIs with `file` scheme and empty host. + + +## [1.3.1] - 2016-06-25 + +### Fixed + +- `Uri::__toString` for network path references, e.g. `//example.org`. +- Missing lowercase normalization for host. +- Handling of URI components in case they are `'0'` in a lot of places, + e.g. as a user info password. +- `Uri::withAddedHeader` to correctly merge headers with different case. +- Trimming of header values in `Uri::withAddedHeader`. Header values may + be surrounded by whitespace which should be ignored according to RFC 7230 + Section 3.2.4. This does not apply to header names. +- `Uri::withAddedHeader` with an array of header values. +- `Uri::resolve` when base path has no slash and handling of fragment. +- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the + key/value both in encoded as well as decoded form to those methods. This is + consistent with withPath, withQuery etc. +- `ServerRequest::withoutAttribute` when attribute value is null. + + +## [1.3.0] - 2016-04-13 + +### Added + +- Remaining interfaces needed for full PSR7 compatibility + (ServerRequestInterface, UploadedFileInterface, etc.). +- Support for stream_for from scalars. + +### Changed + +- Can now extend Uri. + +### Fixed +- A bug in validating request methods by making it more permissive. + + +## [1.2.3] - 2016-02-18 + +### Fixed + +- Support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote + streams, which can sometimes return fewer bytes than requested with `fread`. +- Handling of gzipped responses with FNAME headers. + + +## [1.2.2] - 2016-01-22 + +### Added + +- Support for URIs without any authority. +- Support for HTTP 451 'Unavailable For Legal Reasons.' +- Support for using '0' as a filename. +- Support for including non-standard ports in Host headers. + + +## [1.2.1] - 2015-11-02 + +### Changes + +- Now supporting negative offsets when seeking to SEEK_END. + + +## [1.2.0] - 2015-08-15 + +### Changed + +- Body as `"0"` is now properly added to a response. +- Now allowing forward seeking in CachingStream. +- Now properly parsing HTTP requests that contain proxy targets in + `parse_request`. +- functions.php is now conditionally required. +- user-info is no longer dropped when resolving URIs. + + +## [1.1.0] - 2015-06-24 + +### Changed + +- URIs can now be relative. +- `multipart/form-data` headers are now overridden case-insensitively. +- URI paths no longer encode the following characters because they are allowed + in URIs: "(", ")", "*", "!", "'" +- A port is no longer added to a URI when the scheme is missing and no port is + present. + + +## 1.0.0 - 2015-05-19 + +Initial release. + +Currently unsupported: + +- `Psr\Http\Message\ServerRequestInterface` +- `Psr\Http\Message\UploadedFileInterface` + + + +[Unreleased]: https://github.com/guzzle/psr7/compare/1.6.0...HEAD +[1.6.0]: https://github.com/guzzle/psr7/compare/1.5.2...1.6.0 +[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2 +[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1 +[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0 +[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2 +[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1 +[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0 +[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1 +[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0 +[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3 +[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2 +[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1 +[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0 +[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0 diff --git a/vendor/guzzlehttp/psr7/LICENSE b/vendor/guzzlehttp/psr7/LICENSE new file mode 100644 index 0000000..581d95f --- /dev/null +++ b/vendor/guzzlehttp/psr7/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015 Michael Dowling, https://github.com/mtdowling + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md new file mode 100644 index 0000000..c60a6a3 --- /dev/null +++ b/vendor/guzzlehttp/psr7/README.md @@ -0,0 +1,745 @@ +# PSR-7 Message Implementation + +This repository contains a full [PSR-7](http://www.php-fig.org/psr/psr-7/) +message implementation, several stream decorators, and some helpful +functionality like query string parsing. + + +[![Build Status](https://travis-ci.org/guzzle/psr7.svg?branch=master)](https://travis-ci.org/guzzle/psr7) + + +# Stream implementation + +This package comes with a number of stream implementations and stream +decorators. + + +## AppendStream + +`GuzzleHttp\Psr7\AppendStream` + +Reads from multiple streams, one after the other. + +```php +use GuzzleHttp\Psr7; + +$a = Psr7\stream_for('abc, '); +$b = Psr7\stream_for('123.'); +$composed = new Psr7\AppendStream([$a, $b]); + +$composed->addStream(Psr7\stream_for(' Above all listen to me')); + +echo $composed; // abc, 123. Above all listen to me. +``` + + +## BufferStream + +`GuzzleHttp\Psr7\BufferStream` + +Provides a buffer stream that can be written to fill a buffer, and read +from to remove bytes from the buffer. + +This stream returns a "hwm" metadata value that tells upstream consumers +what the configured high water mark of the stream is, or the maximum +preferred size of the buffer. + +```php +use GuzzleHttp\Psr7; + +// When more than 1024 bytes are in the buffer, it will begin returning +// false to writes. This is an indication that writers should slow down. +$buffer = new Psr7\BufferStream(1024); +``` + + +## CachingStream + +The CachingStream is used to allow seeking over previously read bytes on +non-seekable streams. This can be useful when transferring a non-seekable +entity body fails due to needing to rewind the stream (for example, resulting +from a redirect). Data that is read from the remote stream will be buffered in +a PHP temp stream so that previously read bytes are cached first in memory, +then on disk. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for(fopen('http://www.google.com', 'r')); +$stream = new Psr7\CachingStream($original); + +$stream->read(1024); +echo $stream->tell(); +// 1024 + +$stream->seek(0); +echo $stream->tell(); +// 0 +``` + + +## DroppingStream + +`GuzzleHttp\Psr7\DroppingStream` + +Stream decorator that begins dropping data once the size of the underlying +stream becomes too full. + +```php +use GuzzleHttp\Psr7; + +// Create an empty stream +$stream = Psr7\stream_for(); + +// Start dropping data when the stream has more than 10 bytes +$dropping = new Psr7\DroppingStream($stream, 10); + +$dropping->write('01234567890123456789'); +echo $stream; // 0123456789 +``` + + +## FnStream + +`GuzzleHttp\Psr7\FnStream` + +Compose stream implementations based on a hash of functions. + +Allows for easy testing and extension of a provided stream without needing +to create a concrete class for a simple extension point. + +```php + +use GuzzleHttp\Psr7; + +$stream = Psr7\stream_for('hi'); +$fnStream = Psr7\FnStream::decorate($stream, [ + 'rewind' => function () use ($stream) { + echo 'About to rewind - '; + $stream->rewind(); + echo 'rewound!'; + } +]); + +$fnStream->rewind(); +// Outputs: About to rewind - rewound! +``` + + +## InflateStream + +`GuzzleHttp\Psr7\InflateStream` + +Uses PHP's zlib.inflate filter to inflate deflate or gzipped content. + +This stream decorator skips the first 10 bytes of the given stream to remove +the gzip header, converts the provided stream to a PHP stream resource, +then appends the zlib.inflate filter. The stream is then converted back +to a Guzzle stream resource to be used as a Guzzle stream. + + +## LazyOpenStream + +`GuzzleHttp\Psr7\LazyOpenStream` + +Lazily reads or writes to a file that is opened only after an IO operation +take place on the stream. + +```php +use GuzzleHttp\Psr7; + +$stream = new Psr7\LazyOpenStream('/path/to/file', 'r'); +// The file has not yet been opened... + +echo $stream->read(10); +// The file is opened and read from only when needed. +``` + + +## LimitStream + +`GuzzleHttp\Psr7\LimitStream` + +LimitStream can be used to read a subset or slice of an existing stream object. +This can be useful for breaking a large file into smaller pieces to be sent in +chunks (e.g. Amazon S3's multipart upload API). + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for(fopen('/tmp/test.txt', 'r+')); +echo $original->getSize(); +// >>> 1048576 + +// Limit the size of the body to 1024 bytes and start reading from byte 2048 +$stream = new Psr7\LimitStream($original, 1024, 2048); +echo $stream->getSize(); +// >>> 1024 +echo $stream->tell(); +// >>> 0 +``` + + +## MultipartStream + +`GuzzleHttp\Psr7\MultipartStream` + +Stream that when read returns bytes for a streaming multipart or +multipart/form-data stream. + + +## NoSeekStream + +`GuzzleHttp\Psr7\NoSeekStream` + +NoSeekStream wraps a stream and does not allow seeking. + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for('foo'); +$noSeek = new Psr7\NoSeekStream($original); + +echo $noSeek->read(3); +// foo +var_export($noSeek->isSeekable()); +// false +$noSeek->seek(0); +var_export($noSeek->read(3)); +// NULL +``` + + +## PumpStream + +`GuzzleHttp\Psr7\PumpStream` + +Provides a read only stream that pumps data from a PHP callable. + +When invoking the provided callable, the PumpStream will pass the amount of +data requested to read to the callable. The callable can choose to ignore +this value and return fewer or more bytes than requested. Any extra data +returned by the provided callable is buffered internally until drained using +the read() function of the PumpStream. The provided callable MUST return +false when there is no more data to read. + + +## Implementing stream decorators + +Creating a stream decorator is very easy thanks to the +`GuzzleHttp\Psr7\StreamDecoratorTrait`. This trait provides methods that +implement `Psr\Http\Message\StreamInterface` by proxying to an underlying +stream. Just `use` the `StreamDecoratorTrait` and implement your custom +methods. + +For example, let's say we wanted to call a specific function each time the last +byte is read from a stream. This could be implemented by overriding the +`read()` method. + +```php +use Psr\Http\Message\StreamInterface; +use GuzzleHttp\Psr7\StreamDecoratorTrait; + +class EofCallbackStream implements StreamInterface +{ + use StreamDecoratorTrait; + + private $callback; + + public function __construct(StreamInterface $stream, callable $cb) + { + $this->stream = $stream; + $this->callback = $cb; + } + + public function read($length) + { + $result = $this->stream->read($length); + + // Invoke the callback when EOF is hit. + if ($this->eof()) { + call_user_func($this->callback); + } + + return $result; + } +} +``` + +This decorator could be added to any existing stream and used like so: + +```php +use GuzzleHttp\Psr7; + +$original = Psr7\stream_for('foo'); + +$eofStream = new EofCallbackStream($original, function () { + echo 'EOF!'; +}); + +$eofStream->read(2); +$eofStream->read(1); +// echoes "EOF!" +$eofStream->seek(0); +$eofStream->read(3); +// echoes "EOF!" +``` + + +## PHP StreamWrapper + +You can use the `GuzzleHttp\Psr7\StreamWrapper` class if you need to use a +PSR-7 stream as a PHP stream resource. + +Use the `GuzzleHttp\Psr7\StreamWrapper::getResource()` method to create a PHP +stream from a PSR-7 stream. + +```php +use GuzzleHttp\Psr7\StreamWrapper; + +$stream = GuzzleHttp\Psr7\stream_for('hello!'); +$resource = StreamWrapper::getResource($stream); +echo fread($resource, 6); // outputs hello! +``` + + +# Function API + +There are various functions available under the `GuzzleHttp\Psr7` namespace. + + +## `function str` + +`function str(MessageInterface $message)` + +Returns the string representation of an HTTP message. + +```php +$request = new GuzzleHttp\Psr7\Request('GET', 'http://example.com'); +echo GuzzleHttp\Psr7\str($request); +``` + + +## `function uri_for` + +`function uri_for($uri)` + +This function accepts a string or `Psr\Http\Message\UriInterface` and returns a +UriInterface for the given value. If the value is already a `UriInterface`, it +is returned as-is. + +```php +$uri = GuzzleHttp\Psr7\uri_for('http://example.com'); +assert($uri === GuzzleHttp\Psr7\uri_for($uri)); +``` + + +## `function stream_for` + +`function stream_for($resource = '', array $options = [])` + +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. + +```php +$stream = GuzzleHttp\Psr7\stream_for('foo'); +$stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r')); + +$generator = function ($bytes) { + for ($i = 0; $i < $bytes; $i++) { + yield ' '; + } +} + +$stream = GuzzleHttp\Psr7\stream_for($generator(100)); +``` + + +## `function parse_header` + +`function parse_header($header)` + +Parse an array of header values containing ";" separated data into an array of +associative arrays representing the header key value pair data of the header. +When a parameter does not contain a value, but just contains a key, this +function will inject a key with a '' string value. + + +## `function normalize_header` + +`function normalize_header($header)` + +Converts an array of header values that may contain comma separated headers +into an array of headers with no comma separated values. + + +## `function modify_request` + +`function modify_request(RequestInterface $request, array $changes)` + +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. + + +## `function rewind_body` + +`function rewind_body(MessageInterface $message)` + +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`. + + +## `function try_fopen` + +`function try_fopen($filename, $mode)` + +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. + + +## `function copy_to_string` + +`function copy_to_string(StreamInterface $stream, $maxLen = -1)` + +Copy the contents of a stream into a string until the given number of bytes +have been read. + + +## `function copy_to_stream` + +`function copy_to_stream(StreamInterface $source, StreamInterface $dest, $maxLen = -1)` + +Copy the contents of a stream into another stream until the given number of +bytes have been read. + + +## `function hash` + +`function hash(StreamInterface $stream, $algo, $rawOutput = false)` + +Calculate a hash of a Stream. This method reads the entire stream to calculate +a rolling hash (based on PHP's hash_init functions). + + +## `function readline` + +`function readline(StreamInterface $stream, $maxLength = null)` + +Read a line from the stream up to the maximum allowed buffer length. + + +## `function parse_request` + +`function parse_request($message)` + +Parses a request message string into a request object. + + +## `function parse_response` + +`function parse_response($message)` + +Parses a response message string into a response object. + + +## `function parse_query` + +`function parse_query($str, $urlEncoding = true)` + +Parse a query string into an associative array. + +If multiple values are found for the same key, the value of that key value pair +will become an array. This function does not parse nested PHP style arrays into +an associative array (e.g., `foo[a]=1&foo[b]=2` will be parsed into +`['foo[a]' => '1', 'foo[b]' => '2']`). + + +## `function build_query` + +`function build_query(array $params, $encoding = PHP_QUERY_RFC3986)` + +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). + + +## `function mimetype_from_filename` + +`function mimetype_from_filename($filename)` + +Determines the mimetype of a file by looking at its extension. + + +## `function mimetype_from_extension` + +`function mimetype_from_extension($extension)` + +Maps a file extensions to a mimetype. + + +# Additional URI Methods + +Aside from the standard `Psr\Http\Message\UriInterface` implementation in form of the `GuzzleHttp\Psr7\Uri` class, +this library also provides additional functionality when working with URIs as static methods. + +## URI Types + +An instance of `Psr\Http\Message\UriInterface` can either be an absolute URI or a relative reference. +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 according to +[RFC 3986 Section 4.2](https://tools.ietf.org/html/rfc3986#section-4.2): + +- network-path references, e.g. `//example.com/path` +- absolute-path references, e.g. `/path` +- relative-path references, e.g. `subpath` + +The following methods can be used to identify the type of the URI. + +### `GuzzleHttp\Psr7\Uri::isAbsolute` + +`public static function isAbsolute(UriInterface $uri): bool` + +Whether the URI is absolute, i.e. it has a scheme. + +### `GuzzleHttp\Psr7\Uri::isNetworkPathReference` + +`public static function isNetworkPathReference(UriInterface $uri): bool` + +Whether the URI is a network-path reference. A relative reference that begins with two slash characters is +termed an network-path reference. + +### `GuzzleHttp\Psr7\Uri::isAbsolutePathReference` + +`public static function isAbsolutePathReference(UriInterface $uri): bool` + +Whether the URI is a absolute-path reference. A relative reference that begins with a single slash character is +termed an absolute-path reference. + +### `GuzzleHttp\Psr7\Uri::isRelativePathReference` + +`public static function isRelativePathReference(UriInterface $uri): bool` + +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. + +### `GuzzleHttp\Psr7\Uri::isSameDocumentReference` + +`public static function isSameDocumentReference(UriInterface $uri, UriInterface $base = null): bool` + +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. + +## URI Components + +Additional methods to work with URI components. + +### `GuzzleHttp\Psr7\Uri::isDefaultPort` + +`public static function isDefaultPort(UriInterface $uri): bool` + +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. + +### `GuzzleHttp\Psr7\Uri::composeComponents` + +`public static function composeComponents($scheme, $authority, $path, $query, $fragment): string` + +Composes a URI reference string from its various components according to +[RFC 3986 Section 5.3](https://tools.ietf.org/html/rfc3986#section-5.3). Usually this method does not need to be called +manually but instead is used indirectly via `Psr\Http\Message\UriInterface::__toString`. + +### `GuzzleHttp\Psr7\Uri::fromParts` + +`public static function fromParts(array $parts): UriInterface` + +Creates a URI from a hash of [`parse_url`](http://php.net/manual/en/function.parse-url.php) components. + + +### `GuzzleHttp\Psr7\Uri::withQueryValue` + +`public static function withQueryValue(UriInterface $uri, $key, $value): UriInterface` + +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". + +### `GuzzleHttp\Psr7\Uri::withQueryValues` + +`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface` + +Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an +associative array of key => value. + +### `GuzzleHttp\Psr7\Uri::withoutQueryValue` + +`public static function withoutQueryValue(UriInterface $uri, $key): UriInterface` + +Creates a new URI with a specific query string value removed. Any existing query string values that exactly match the +provided key are removed. + +## Reference Resolution + +`GuzzleHttp\Psr7\UriResolver` provides methods to resolve a URI reference in the context of a base URI according +to [RFC 3986 Section 5](https://tools.ietf.org/html/rfc3986#section-5). This is for example also what web browsers +do when resolving a link in a website based on the current request URI. + +### `GuzzleHttp\Psr7\UriResolver::resolve` + +`public static function resolve(UriInterface $base, UriInterface $rel): UriInterface` + +Converts the relative URI into a new URI that is resolved against the base URI. + +### `GuzzleHttp\Psr7\UriResolver::removeDotSegments` + +`public static function removeDotSegments(string $path): string` + +Removes dot segments from a path and returns the new path according to +[RFC 3986 Section 5.2.4](https://tools.ietf.org/html/rfc3986#section-5.2.4). + +### `GuzzleHttp\Psr7\UriResolver::relativize` + +`public static function relativize(UriInterface $base, UriInterface $target): UriInterface` + +Returns the target URI as a relative reference from the base URI. This method is the counterpart to resolve(): + +```php +(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. + +```php +$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/'. +``` + +## Normalization and Comparison + +`GuzzleHttp\Psr7\UriNormalizer` provides methods to normalize and compare URIs according to +[RFC 3986 Section 6](https://tools.ietf.org/html/rfc3986#section-6). + +### `GuzzleHttp\Psr7\UriNormalizer::normalize` + +`public static function normalize(UriInterface $uri, $flags = self::PRESERVING_NORMALIZATIONS): UriInterface` + +Returns a normalized URI. The scheme and host component are already normalized to lowercase per PSR-7 UriInterface. +This methods adds additional normalizations that can be configured with the `$flags` parameter which is a bitmask +of normalizations to apply. The following normalizations are available: + +- `UriNormalizer::PRESERVING_NORMALIZATIONS` + + Default normalizations which only include the ones that preserve semantics. + +- `UriNormalizer::CAPITALIZE_PERCENT_ENCODING` + + All letters within a percent-encoding triplet (e.g., "%3A") are case-insensitive, and should be capitalized. + + Example: `http://example.org/a%c2%b1b` → `http://example.org/a%C2%B1b` + +- `UriNormalizer::DECODE_UNRESERVED_CHARACTERS` + + Decodes percent-encoded octets of unreserved characters. For consistency, percent-encoded octets in the ranges of + ALPHA (%41–%5A and %61–%7A), DIGIT (%30–%39), hyphen (%2D), period (%2E), underscore (%5F), or tilde (%7E) should + not be created by URI producers and, when found in a URI, should be decoded to their corresponding unreserved + characters by URI normalizers. + + Example: `http://example.org/%7Eusern%61me/` → `http://example.org/~username/` + +- `UriNormalizer::CONVERT_EMPTY_PATH` + + Converts the empty path to "/" for http and https URIs. + + Example: `http://example.org` → `http://example.org/` + +- `UriNormalizer::REMOVE_DEFAULT_HOST` + + Removes the default host of the given URI scheme from the URI. Only the "file" scheme defines the default host + "localhost". All of `file:/myfile`, `file:///myfile`, and `file://localhost/myfile` are equivalent according to + RFC 3986. + + Example: `file://localhost/myfile` → `file:///myfile` + +- `UriNormalizer::REMOVE_DEFAULT_PORT` + + Removes the default port of the given URI scheme from the URI. + + Example: `http://example.org:80/` → `http://example.org/` + +- `UriNormalizer::REMOVE_DOT_SEGMENTS` + + Removes unnecessary dot-segments. Dot-segments in relative-path references are not removed as it would + change the semantics of the URI reference. + + Example: `http://example.org/../a/b/../c/./d.html` → `http://example.org/a/c/d.html` + +- `UriNormalizer::REMOVE_DUPLICATE_SLASHES` + + Paths which include two or more adjacent slashes are converted to one. Webservers usually ignore duplicate slashes + and treat those URIs equivalent. But in theory those URIs do not need to be equivalent. So this normalization + may change the semantics. Encoded slashes (%2F) are not removed. + + Example: `http://example.org//foo///bar.html` → `http://example.org/foo/bar.html` + +- `UriNormalizer::SORT_QUERY_PARAMETERS` + + Sort query parameters with their values in alphabetical order. However, the order of parameters in a URI may be + significant (this is not defined by the standard). So this normalization is not safe and may change the semantics + of the URI. + + Example: `?lang=en&article=fred` → `?article=fred&lang=en` + +### `GuzzleHttp\Psr7\UriNormalizer::isEquivalent` + +`public static function isEquivalent(UriInterface $uri1, UriInterface $uri2, $normalizations = self::PRESERVING_NORMALIZATIONS): bool` + +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. diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json new file mode 100644 index 0000000..168a055 --- /dev/null +++ b/vendor/guzzlehttp/psr7/composer.json @@ -0,0 +1,49 @@ +{ + "name": "guzzlehttp/psr7", + "type": "library", + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"], + "license": "MIT", + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Schultze", + "homepage": "https://github.com/Tobion" + } + ], + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0", + "ralouphie/getallheaders": "^2.0.5 || ^3.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8", + "ext-zlib": "*" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "suggest": { + "zendframework/zend-httphandlerrunner": "Emit PSR-7 responses" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\Psr7\\": "tests/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php new file mode 100644 index 0000000..472a0d6 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -0,0 +1,241 @@ +addStream($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 copy_to_string($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 = []; + } + + 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 : []; + } +} diff --git a/vendor/guzzlehttp/psr7/src/BufferStream.php b/vendor/guzzlehttp/psr7/src/BufferStream.php new file mode 100644 index 0000000..af4d4c2 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/BufferStream.php @@ -0,0 +1,137 @@ +hwm = $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(); + } + + 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 : []; + } +} diff --git a/vendor/guzzlehttp/psr7/src/CachingStream.php b/vendor/guzzlehttp/psr7/src/CachingStream.php new file mode 100644 index 0000000..ed68f08 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/CachingStream.php @@ -0,0 +1,138 @@ +remoteStream = $stream; + $this->stream = $target ?: new Stream(fopen('php://temp', 'r+')); + } + + public function getSize() + { + return max($this->stream->getSize(), $this->remoteStream->getSize()); + } + + 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']); + copy_to_stream($this, $target); + + return $this->tell(); + } +} diff --git a/vendor/guzzlehttp/psr7/src/DroppingStream.php b/vendor/guzzlehttp/psr7/src/DroppingStream.php new file mode 100644 index 0000000..8935c80 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/DroppingStream.php @@ -0,0 +1,42 @@ +stream = $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)); + } +} diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php new file mode 100644 index 0000000..73daea6 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/FnStream.php @@ -0,0 +1,158 @@ +methods = $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); + } +} diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php new file mode 100644 index 0000000..5e4f602 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/InflateStream.php @@ -0,0 +1,52 @@ +read(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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/LazyOpenStream.php b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php new file mode 100644 index 0000000..02cec3a --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/LazyOpenStream.php @@ -0,0 +1,39 @@ +filename = $filename; + $this->mode = $mode; + } + + /** + * Creates the underlying stream lazily when required. + * + * @return StreamInterface + */ + protected function createStream() + { + return stream_for(try_fopen($this->filename, $this->mode)); + } +} diff --git a/vendor/guzzlehttp/psr7/src/LimitStream.php b/vendor/guzzlehttp/psr7/src/LimitStream.php new file mode 100644 index 0000000..e4f239e --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/LimitStream.php @@ -0,0 +1,155 @@ +stream = $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 ''; + } +} diff --git a/vendor/guzzlehttp/psr7/src/MessageTrait.php b/vendor/guzzlehttp/psr7/src/MessageTrait.php new file mode 100644 index 0000000..a7966d1 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -0,0 +1,213 @@ + 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 */ + 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 = stream_for(''); + } + + 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; + } + } + } + + private function normalizeHeaderValue($value) + { + if (!is_array($value)) { + return $this->trimHeaderValues([$value]); + } + + if (count($value) === 0) { + throw new \InvalidArgumentException('Header value can not be an empty array.'); + } + + return $this->trimHeaderValues($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 string[] $values Header values + * + * @return string[] Trimmed header values + * + * @see https://tools.ietf.org/html/rfc7230#section-3.2.4 + */ + private function trimHeaderValues(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) + )); + } + + return trim((string) $value, " \t"); + }, $values); + } + + 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.'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/MultipartStream.php b/vendor/guzzlehttp/psr7/src/MultipartStream.php new file mode 100644 index 0000000..c0fd584 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MultipartStream.php @@ -0,0 +1,153 @@ +boundary = $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(stream_for("--{$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'] = stream_for($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(stream_for($this->getHeaders($headers))); + $stream->addStream($body); + $stream->addStream(stream_for("\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_from_filename($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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/NoSeekStream.php b/vendor/guzzlehttp/psr7/src/NoSeekStream.php new file mode 100644 index 0000000..2332218 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/NoSeekStream.php @@ -0,0 +1,22 @@ +source = $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 copy_to_string($this); + } catch (\Exception $e) { + return ''; + } + } + + public function close() + { + $this->detach(); + } + + public function detach() + { + $this->tellPos = false; + $this->source = 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); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php new file mode 100644 index 0000000..59f337d --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Request.php @@ -0,0 +1,151 @@ +assertMethod($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 = stream_for($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.'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php new file mode 100644 index 0000000..e7e04d8 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Response.php @@ -0,0 +1,154 @@ + '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|null|resource|StreamInterface $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 = stream_for($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 = $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.'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php new file mode 100644 index 0000000..505e474 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php @@ -0,0 +1,18 @@ +@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m"; + const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)"; +} diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php new file mode 100644 index 0000000..1a09a6c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -0,0 +1,376 @@ +serverParams = $serverParams; + + parent::__construct($method, $uri, $headers, $body, $version); + } + + /** + * Return an UploadedFile instance array. + * + * @param array $files A array which respect $_FILES structure + * @throws InvalidArgumentException for unrecognized values + * @return array + */ + 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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php new file mode 100644 index 0000000..d9e7409 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -0,0 +1,267 @@ +size = $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 { + $this->seek(0); + return (string) stream_get_contents($this->stream); + } 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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php new file mode 100644 index 0000000..daec6f5 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/StreamDecoratorTrait.php @@ -0,0 +1,149 @@ +stream = $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 copy_to_string($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'); + } +} diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php new file mode 100644 index 0000000..0f3a285 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -0,0 +1,161 @@ +isReadable()) { + $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 + ]; + } +} diff --git a/vendor/guzzlehttp/psr7/src/UploadedFile.php b/vendor/guzzlehttp/psr7/src/UploadedFile.php new file mode 100644 index 0000000..e62bd5c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UploadedFile.php @@ -0,0 +1,316 @@ +setError($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 boolean + */ + private function isStringOrNull($param) + { + return in_array(gettype($param), ['string', 'NULL']); + } + + /** + * @param mixed $param + * @return boolean + */ + 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 boolean + */ + private function isOk() + { + return $this->error === UPLOAD_ERR_OK; + } + + /** + * @return boolean + */ + 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 { + copy_to_stream( + $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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php new file mode 100644 index 0000000..825a25e --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -0,0 +1,760 @@ + 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 = parse_url($uri); + if ($parts === false) { + throw new \InvalidArgumentException("Unable to parse URI: $uri"); + } + $this->applyParts($parts); + } + } + + 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 strtolower($scheme); + } + + /** + * @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 strtolower($host); + } + + /** + * @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'); + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/UriNormalizer.php b/vendor/guzzlehttp/psr7/src/UriNormalizer.php new file mode 100644 index 0000000..384c29e --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriNormalizer.php @@ -0,0 +1,216 @@ +getPath() === '' && + ($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 + } +} diff --git a/vendor/guzzlehttp/psr7/src/UriResolver.php b/vendor/guzzlehttp/psr7/src/UriResolver.php new file mode 100644 index 0000000..c1cb8a2 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/UriResolver.php @@ -0,0 +1,219 @@ +getScheme() != '') { + 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 + } +} diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php new file mode 100644 index 0000000..8e6dafe --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/functions.php @@ -0,0 +1,899 @@ +getMethod() . ' ' + . $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) { + $msg .= "\r\n{$name}: " . implode(', ', $values); + } + + return "{$msg}\r\n\r\n" . $message->getBody(); +} + +/** + * Returns a UriInterface for the given value. + * + * This function accepts a string or {@see Psr\Http\Message\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 + */ +function uri_for($uri) +{ + if ($uri instanceof UriInterface) { + return $uri; + } elseif (is_string($uri)) { + return new Uri($uri); + } + + throw new \InvalidArgumentException('URI must be a string or UriInterface'); +} + +/** + * 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. + * + * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data + * @param array $options Additional options + * + * @return StreamInterface + * @throws \InvalidArgumentException if the $resource arg is not valid. + */ +function stream_for($resource = '', array $options = []) +{ + if (is_scalar($resource)) { + $stream = fopen('php://temp', 'r+'); + if ($resource !== '') { + fwrite($stream, $resource); + fseek($stream, 0); + } + return new Stream($stream, $options); + } + + switch (gettype($resource)) { + case 'resource': + 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 stream_for((string) $resource, $options); + } + break; + case 'NULL': + return new Stream(fopen('php://temp', 'r+'), $options); + } + + if (is_callable($resource)) { + return new PumpStream($resource, $options); + } + + throw new \InvalidArgumentException('Invalid resource type: ' . gettype($resource)); +} + +/** + * Parse an array of header values containing ";" separated data into an + * array of associative arrays representing the header key value pair + * data of the header. When a parameter does not contain a value, but just + * contains a key, this function will inject a key with a '' string value. + * + * @param string|array $header Header to parse into components. + * + * @return array Returns the parsed header values. + */ +function parse_header($header) +{ + static $trimmed = "\"' \n\t\r"; + $params = $matches = []; + + foreach (normalize_header($header) as $val) { + $part = []; + foreach (preg_split('/;(?=([^"]*"[^"]*")*[^"]*$)/', $val) as $kvp) { + if (preg_match_all('/<[^>]+>|[^=]+/', $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. + */ +function normalize_header($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; +} + +/** + * Clone and modify a request with the given changes. + * + * 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 + */ +function modify_request(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 = _caseless_remove($changes['remove_headers'], $headers); + } + + if (!empty($changes['set_headers'])) { + $headers = _caseless_remove(array_keys($changes['set_headers']), $headers); + $headers = $changes['set_headers'] + $headers; + } + + if (isset($changes['query'])) { + $uri = $uri->withQuery($changes['query']); + } + + if ($request instanceof ServerRequestInterface) { + return (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()); + } + + 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() + ); +} + +/** + * 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 + */ +function rewind_body(MessageInterface $message) +{ + $body = $message->getBody(); + + if ($body->tell()) { + $body->rewind(); + } +} + +/** + * 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 + */ +function try_fopen($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] + )); + }); + + $handle = fopen($filename, $mode); + restore_error_handler(); + + if ($ex) { + /** @var $ex \RuntimeException */ + throw $ex; + } + + return $handle; +} + +/** + * 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. + */ +function copy_to_string(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; +} + +/** + * 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. + */ +function copy_to_stream( + 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); + } + } +} + +/** + * Calculate a hash of a Stream + * + * @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. + */ +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; +} + +/** + * Read a line from the stream up to the maximum allowed buffer length + * + * @param StreamInterface $stream Stream to read from + * @param int $maxLength Maximum buffer length + * + * @return string + */ +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; +} + +/** + * Parses a request message string into a request object. + * + * @param string $message Request message string. + * + * @return Request + */ +function parse_request($message) +{ + $data = _parse_message($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] === '/' ? _parse_request_uri($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 + */ +function parse_response($message) +{ + $data = _parse_message($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( + $parts[1], + $data['headers'], + $data['body'], + explode('/', $parts[0])[1], + isset($parts[2]) ? $parts[2] : null + ); +} + +/** + * Parse a query string into an associative array. + * + * If multiple values are found for the same key, the value of that key + * value pair will become an array. This function does not parse nested + * PHP style arrays into an associative array (e.g., foo[a]=1&foo[b]=2 will + * be parsed into ['foo[a]' => '1', 'foo[b]' => '2']). + * + * @param string $str Query string to parse + * @param int|bool $urlEncoding How the query string is encoded + * + * @return array + */ +function parse_query($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_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 + */ +function build_query(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) : ''; +} + +/** + * Determines the mimetype of a file by looking at its extension. + * + * @param $filename + * + * @return null|string + */ +function mimetype_from_filename($filename) +{ + return mimetype_from_extension(pathinfo($filename, PATHINFO_EXTENSION)); +} + +/** + * 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 + */ +function mimetype_from_extension($extension) +{ + static $mimetypes = [ + '3gp' => '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; +} + +/** + * 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 + */ +function _parse_message($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 + * @internal + */ +function _parse_request_uri($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, '/'); +} + +/** + * 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 null|string + */ +function get_message_body_summary(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]/', $summary)) { + return null; + } + + return $summary; +} + +/** @internal */ +function _caseless_remove($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; +} diff --git a/vendor/guzzlehttp/psr7/src/functions_include.php b/vendor/guzzlehttp/psr7/src/functions_include.php new file mode 100644 index 0000000..96a4a83 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/functions_include.php @@ -0,0 +1,6 @@ +buildFromDirectory(dirname(__DIR__).'/lib'); +rename( + dirname(__DIR__).'/lib/index.php', + dirname(__DIR__).'/lib/random.php' +); + +/** + * If we pass an (optional) path to a private key as a second argument, we will + * sign the Phar with OpenSSL. + * + * If you leave this out, it will produce an unsigned .phar! + */ +if ($argc > 1) { + if (!@is_readable($argv[1])) { + echo 'Could not read the private key file:', $argv[1], "\n"; + exit(255); + } + $pkeyFile = file_get_contents($argv[1]); + + $private = openssl_get_privatekey($pkeyFile); + if ($private !== false) { + $pkey = ''; + openssl_pkey_export($private, $pkey); + $phar->setSignatureAlgorithm(Phar::OPENSSL, $pkey); + + /** + * Save the corresponding public key to the file + */ + if (!@is_readable($dist.'/random_compat.phar.pubkey')) { + $details = openssl_pkey_get_details($private); + file_put_contents( + $dist.'/random_compat.phar.pubkey', + $details['key'] + ); + } + } else { + echo 'An error occurred reading the private key from OpenSSL.', "\n"; + exit(255); + } +} diff --git a/vendor/paragonie/random_compat/psalm-autoload.php b/vendor/paragonie/random_compat/psalm-autoload.php new file mode 100644 index 0000000..d71d1b8 --- /dev/null +++ b/vendor/paragonie/random_compat/psalm-autoload.php @@ -0,0 +1,9 @@ + + + + + + + + + + + + + + + diff --git a/vendor/psr/http-message/CHANGELOG.md b/vendor/psr/http-message/CHANGELOG.md new file mode 100644 index 0000000..74b1ef9 --- /dev/null +++ b/vendor/psr/http-message/CHANGELOG.md @@ -0,0 +1,36 @@ +# Changelog + +All notable changes to this project will be documented in this file, in reverse chronological order by release. + +## 1.0.1 - 2016-08-06 + +### Added + +- Nothing. + +### Deprecated + +- Nothing. + +### Removed + +- Nothing. + +### Fixed + +- Updated all `@return self` annotation references in interfaces to use + `@return static`, which more closelly follows the semantics of the + specification. +- Updated the `MessageInterface::getHeaders()` return annotation to use the + value `string[][]`, indicating the format is a nested array of strings. +- Updated the `@link` annotation for `RequestInterface::withRequestTarget()` + to point to the correct section of RFC 7230. +- Updated the `ServerRequestInterface::withUploadedFiles()` parameter annotation + to add the parameter name (`$uploadedFiles`). +- Updated a `@throws` annotation for the `UploadedFileInterface::moveTo()` + method to correctly reference the method parameter (it was referencing an + incorrect parameter name previously). + +## 1.0.0 - 2016-05-18 + +Initial stable release; reflects accepted PSR-7 specification. diff --git a/vendor/psr/http-message/LICENSE b/vendor/psr/http-message/LICENSE new file mode 100644 index 0000000..c2d8e45 --- /dev/null +++ b/vendor/psr/http-message/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 PHP Framework Interoperability Group + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/psr/http-message/README.md b/vendor/psr/http-message/README.md new file mode 100644 index 0000000..2818533 --- /dev/null +++ b/vendor/psr/http-message/README.md @@ -0,0 +1,13 @@ +PSR Http Message +================ + +This repository holds all interfaces/classes/traits related to +[PSR-7](http://www.php-fig.org/psr/psr-7/). + +Note that this is not a HTTP message implementation of its own. It is merely an +interface that describes a HTTP message. See the specification for more details. + +Usage +----- + +We'll certainly need some stuff in here. \ No newline at end of file diff --git a/vendor/psr/http-message/composer.json b/vendor/psr/http-message/composer.json new file mode 100644 index 0000000..b0d2937 --- /dev/null +++ b/vendor/psr/http-message/composer.json @@ -0,0 +1,26 @@ +{ + "name": "psr/http-message", + "description": "Common interface for HTTP messages", + "keywords": ["psr", "psr-7", "http", "http-message", "request", "response"], + "homepage": "https://github.com/php-fig/http-message", + "license": "MIT", + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "require": { + "php": ">=5.3.0" + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/psr/http-message/src/MessageInterface.php b/vendor/psr/http-message/src/MessageInterface.php new file mode 100644 index 0000000..dd46e5e --- /dev/null +++ b/vendor/psr/http-message/src/MessageInterface.php @@ -0,0 +1,187 @@ +getHeaders() 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); +} diff --git a/vendor/psr/http-message/src/RequestInterface.php b/vendor/psr/http-message/src/RequestInterface.php new file mode 100644 index 0000000..a96d4fd --- /dev/null +++ b/vendor/psr/http-message/src/RequestInterface.php @@ -0,0 +1,129 @@ +getQuery()` + * 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); +} diff --git a/vendor/psr/http-message/src/StreamInterface.php b/vendor/psr/http-message/src/StreamInterface.php new file mode 100644 index 0000000..f68f391 --- /dev/null +++ b/vendor/psr/http-message/src/StreamInterface.php @@ -0,0 +1,158 @@ + + * [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(); +} diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE new file mode 100644 index 0000000..be5540c --- /dev/null +++ b/vendor/ralouphie/getallheaders/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2014 Ralph Khattar + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md new file mode 100644 index 0000000..9430d76 --- /dev/null +++ b/vendor/ralouphie/getallheaders/README.md @@ -0,0 +1,27 @@ +getallheaders +============= + +PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3. + +[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders) +[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master) +[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders) +[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders) + + +This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php). + +## Install + +For PHP version **`>= 5.6`**: + +``` +composer require ralouphie/getallheaders +``` + +For PHP version **`< 5.6`**: + +``` +composer require ralouphie/getallheaders "^2" +``` diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json new file mode 100644 index 0000000..de8ce62 --- /dev/null +++ b/vendor/ralouphie/getallheaders/composer.json @@ -0,0 +1,26 @@ +{ + "name": "ralouphie/getallheaders", + "description": "A polyfill for getallheaders.", + "license": "MIT", + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "require": { + "php": ">=5.6" + }, + "require-dev": { + "phpunit/phpunit": "^5 || ^6.5", + "php-coveralls/php-coveralls": "^2.1" + }, + "autoload": { + "files": ["src/getallheaders.php"] + }, + "autoload-dev": { + "psr-4": { + "getallheaders\\Tests\\": "tests/" + } + } +} diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php new file mode 100644 index 0000000..c7285a5 --- /dev/null +++ b/vendor/ralouphie/getallheaders/src/getallheaders.php @@ -0,0 +1,46 @@ + '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; + } + +} diff --git a/vendor/symfony/polyfill-intl-idn/Idn.php b/vendor/symfony/polyfill-intl-idn/Idn.php new file mode 100644 index 0000000..127437e --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Idn.php @@ -0,0 +1,915 @@ + and Trevor Rowbotham + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Idn; + +use Exception; +use Normalizer; +use Symfony\Polyfill\Intl\Idn\Resources\unidata\DisallowedRanges; +use 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 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 = 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 & \IDNA_CHECK_BIDI), + 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & \IDNA_CHECK_CONTEXTJ), + 'UseSTD3ASCIIRules' => 0 !== ($options & \IDNA_USE_STD3_RULES), + 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & \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 = 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 & \IDNA_CHECK_BIDI), + 'CheckJoiners' => self::INTL_IDNA_VARIANT_UTS46 === $variant && 0 !== ($options & \IDNA_CHECK_CONTEXTJ), + 'UseSTD3ASCIIRules' => 0 !== ($options & \IDNA_USE_STD3_RULES), + 'Transitional_Processing' => self::INTL_IDNA_VARIANT_2003 === $variant || 0 === ($options & \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]) && 0x002D === $codePoints[2] && 0x002D === $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; /* no condition */; $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; /* no condition */; $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 >= 0x00 && $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'); + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Info.php b/vendor/symfony/polyfill-intl-idn/Info.php new file mode 100644 index 0000000..25c3582 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Info.php @@ -0,0 +1,23 @@ + and Trevor Rowbotham + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Polyfill\Intl\Idn; + +/** + * @internal + */ +class Info +{ + public $bidiDomain = false; + public $errors = 0; + public $validBidiDomain = true; + public $transitionalDifferent = false; +} diff --git a/vendor/symfony/polyfill-intl-idn/LICENSE b/vendor/symfony/polyfill-intl-idn/LICENSE new file mode 100644 index 0000000..03c5e25 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2018-2019 Fabien Potencier and Trevor Rowbotham + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-idn/README.md b/vendor/symfony/polyfill-intl-idn/README.md new file mode 100644 index 0000000..2e75f2e --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/README.md @@ -0,0 +1,12 @@ +Symfony Polyfill / Intl: Idn +============================ + +This component provides [`idn_to_ascii`](https://php.net/idn-to-ascii) and [`idn_to_utf8`](https://php.net/idn-to-utf8) functions to users who run php versions without the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php new file mode 100644 index 0000000..5bb70e4 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/DisallowedRanges.php @@ -0,0 +1,375 @@ += 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; + } +} diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php new file mode 100644 index 0000000..5c1c51d --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/Regex.php @@ -0,0 +1,24 @@ + 'ss', + 962 => 'σ', + 8204 => '', + 8205 => '', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php new file mode 100644 index 0000000..25a5f56 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed.php @@ -0,0 +1,2638 @@ + 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, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php new file mode 100644 index 0000000..54f21cc --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_mapped.php @@ -0,0 +1,308 @@ + ' ', + 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)', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php new file mode 100644 index 0000000..223396e --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/disallowed_STD3_valid.php @@ -0,0 +1,71 @@ + 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, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php new file mode 100644 index 0000000..b377844 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/ignored.php @@ -0,0 +1,273 @@ + 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, +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php new file mode 100644 index 0000000..9b85fe9 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/mapped.php @@ -0,0 +1,5778 @@ + '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 => 'đȘ˜€', +); diff --git a/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php b/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php new file mode 100644 index 0000000..1958e37 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/Resources/unidata/virama.php @@ -0,0 +1,65 @@ + 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, +); diff --git a/vendor/symfony/polyfill-intl-idn/bootstrap.php b/vendor/symfony/polyfill-intl-idn/bootstrap.php new file mode 100644 index 0000000..f02d5de --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/bootstrap.php @@ -0,0 +1,141 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use 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); } + } +} diff --git a/vendor/symfony/polyfill-intl-idn/composer.json b/vendor/symfony/polyfill-intl-idn/composer.json new file mode 100644 index 0000000..af34193 --- /dev/null +++ b/vendor/symfony/polyfill-intl-idn/composer.json @@ -0,0 +1,45 @@ +{ + "name": "symfony/polyfill-intl-idn", + "type": "library", + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "idn"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php70": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Idn\\": "" }, + "files": [ "bootstrap.php" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/LICENSE b/vendor/symfony/polyfill-intl-normalizer/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-intl-normalizer/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php new file mode 100644 index 0000000..a60fae6 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Normalizer.php @@ -0,0 +1,308 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace 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 = "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; + + public static function isNormalized($s, $form = self::NFC) + { + if (!\in_array($form, array(self::NFD, self::NFKD, self::NFC, self::NFKC))) { + return false; + } + $s = (string) $s; + if (!isset($s[strspn($s, self::$ASCII)])) { + return true; + } + if (self::NFC == $form && preg_match('//u', $s) && !preg_match('/[^\x00-\x{2FF}]/u', $s)) { + return true; + } + + return self::normalize($s, $form) === $s; + } + + public static function normalize($s, $form = self::NFC) + { + $s = (string) $s; + if (!preg_match('//u', $s)) { + return false; + } + + switch ($form) { + case self::NFC: $C = true; $K = false; break; + case self::NFD: $C = false; $K = false; break; + case self::NFKC: $C = true; $K = true; break; + case self::NFKD: $C = false; $K = true; break; + default: + if (\defined('Normalizer::NONE') && \Normalizer::NONE == $form) { + return $s; + } + + return false; + } + + 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 /* MB_OVERLOAD_STRING */ & (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 < "\xE1\x84\x80" || "\xE1\x84\x92" < $lastUchr + || $uchr < "\xE1\x85\xA1" || "\xE1\x85\xB5" < $uchr + || $lastUcls) { + // Table lookup and combining chars composition + + $ucls = isset($combClass[$uchr]) ? $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 ("\xE1\x86\xA7" <= $uchr && $uchr <= "\xE1\x87\x82") { + $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 = 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 < "\xEA\xB0\x80" || "\xED\x9E\xA3" < $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; + } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/README.md b/vendor/symfony/polyfill-intl-normalizer/README.md new file mode 100644 index 0000000..15060c5 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/README.md @@ -0,0 +1,14 @@ +Symfony Polyfill / Intl: Normalizer +=================================== + +This component provides a fallback implementation for the +[`Normalizer`](https://php.net/Normalizer) class provided +by the [Intl](https://php.net/intl) extension. + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php new file mode 100644 index 0000000..ca18eff --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/stubs/Normalizer.php @@ -0,0 +1,17 @@ + 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'à' => 'Ă ', + 'á' => 'ĂĄ', + 'â' => 'Ăą', + 'ã' => 'ĂŁ', + 'ä' => 'Ă€', + 'å' => 'Ă„', + 'ç' => 'ç', + 'è' => 'Ăš', + 'é' => 'Ă©', + 'ê' => 'ĂȘ', + 'ë' => 'Ă«', + 'ì' => 'ĂŹ', + 'í' => 'Ă­', + 'î' => 'Ăź', + 'ï' => 'ĂŻ', + 'ñ' => 'ñ', + 'ò' => 'ĂČ', + 'ó' => 'Ăł', + 'ô' => 'ĂŽ', + 'õ' => 'Ă”', + 'ö' => 'ö', + 'ù' => 'Ăč', + 'ú' => 'Ăș', + 'û' => 'Ă»', + 'ü' => 'ĂŒ', + 'ý' => 'Ăœ', + 'ÿ' => 'Ăż', + 'Ā' => 'Ā', + 'ā' => 'ā', + 'Ă' => 'Ă', + 'ă' => 'ă', + 'AÌš' => 'Ą', + 'aÌš' => 'ą', + 'Ć' => 'Ć', + 'ć' => 'ć', + 'Ĉ' => 'Ĉ', + 'ĉ' => 'ĉ', + 'Ċ' => 'Ċ', + 'ċ' => 'ċ', + 'Č' => 'Č', + 'č' => 'č', + 'Ď' => 'Ď', + 'ď' => 'ď', + 'Ē' => 'Ē', + 'ē' => 'ē', + 'Ĕ' => 'Ĕ', + 'ĕ' => 'ĕ', + 'Ė' => 'Ė', + 'ė' => 'ė', + 'EÌš' => 'Ę', + 'eÌš' => 'ę', + 'Ě' => 'Ě', + 'ě' => 'ě', + 'Ĝ' => 'Ĝ', + 'ĝ' => 'ĝ', + 'Ğ' => 'Ğ', + 'ğ' => 'ğ', + 'Ġ' => 'Ä ', + 'ġ' => 'ÄĄ', + 'Ģ' => 'Äą', + 'ģ' => 'ÄŁ', + 'Ĥ' => 'Ä€', + 'ĥ' => 'Ä„', + 'Ĩ' => 'Äš', + 'ĩ' => 'Ä©', + 'Ī' => 'ÄȘ', + 'ī' => 'Ä«', + 'Ĭ' => 'ÄŹ', + 'ĭ' => 'Ä­', + 'IÌš' => 'Äź', + 'iÌš' => 'ÄŻ', + 'İ' => 'İ', + 'Ĵ' => 'ÄŽ', + 'ĵ' => 'Ä”', + 'Ķ' => 'Ķ', + 'ķ' => 'Ä·', + 'Ĺ' => 'Äč', + 'ĺ' => 'Äș', + 'Ļ' => 'Ä»', + 'ļ' => 'ÄŒ', + 'Ľ' => 'Äœ', + 'ľ' => 'ÄŸ', + 'Ń' => 'ƃ', + 'ń' => 'Ƅ', + 'Ņ' => 'ƅ', + 'ņ' => 'Ɔ', + 'Ň' => 'Ƈ', + 'ň' => 'ƈ', + 'Ō' => 'Ì', + 'ō' => 'ƍ', + 'Ŏ' => 'Ǝ', + 'ŏ' => 'Ə', + 'Ő' => 'Ɛ', + 'ő' => 'Ƒ', + 'Ŕ' => 'Ɣ', + 'ŕ' => 'ƕ', + 'Ŗ' => 'Ɩ', + 'ŗ' => 'Ɨ', + 'Ř' => 'Ƙ', + 'ř' => 'ƙ', + 'Ś' => 'Ú', + 'ś' => 'ƛ', + 'Ŝ' => 'Ü', + 'ŝ' => 'Ɲ', + 'Ş' => 'ƞ', + 'ş' => 'ß', + 'Š' => 'Ć ', + 'š' => 'ĆĄ', + 'Ţ' => 'Ćą', + 'ţ' => 'ĆŁ', + 'Ť' => 'Ć€', + 'ť' => 'Ć„', + 'Ũ' => 'Ćš', + 'ũ' => 'Ć©', + 'Ū' => 'ĆȘ', + 'ū' => 'Ć«', + 'Ŭ' => 'ĆŹ', + 'ŭ' => 'Ć­', + 'Ů' => 'Ćź', + 'ů' => 'ĆŻ', + 'Ű' => 'ư', + 'ű' => 'Ʊ', + 'UÌš' => 'ĆČ', + 'uÌš' => 'Ćł', + 'Ŵ' => 'ĆŽ', + 'ŵ' => 'Ć”', + 'Ŷ' => 'ƶ', + 'ŷ' => 'Ć·', + 'Ÿ' => 'Ćž', + 'Ź' => 'Ćč', + 'ź' => 'Ćș', + 'Ż' => 'Ć»', + 'ż' => 'ĆŒ', + 'Ž' => 'Ćœ', + 'ž' => 'ĆŸ', + 'Ơ' => 'Æ ', + 'ơ' => 'ÆĄ', + 'Ư' => 'ÆŻ', + 'ư' => 'ư', + 'Ǎ' => 'Ǎ', + 'ǎ' => 'ǎ', + 'Ǐ' => 'Ǐ', + 'ǐ' => 'ǐ', + 'Ǒ' => 'Ǒ', + 'ǒ' => 'ǒ', + 'Ǔ' => 'Ǔ', + 'ǔ' => 'ǔ', + 'ĂœÌ„' => 'Ǖ', + 'ĂŒÌ„' => 'ǖ', + 'ĂœÌ' => 'Ǘ', + 'ĂŒÌ' => 'ǘ', + 'ĂœÌŒ' => 'Ǚ', + 'ĂŒÌŒ' => 'ǚ', + 'ĂœÌ€' => 'Ǜ', + 'ĂŒÌ€' => 'ǜ', + 'Ă„Ì„' => 'Ǟ', + 'Ă€Ì„' => 'ǟ', + 'ÈŠÌ„' => 'Ç ', + 'ǡ' => 'ÇĄ', + 'Ă†Ì„' => 'Çą', + 'ĂŠÌ„' => 'ÇŁ', + 'Ǧ' => 'ÇŠ', + 'ǧ' => 'ǧ', + 'Ǩ' => 'Çš', + 'ǩ' => 'Ç©', + 'OÌš' => 'ÇȘ', + 'oÌš' => 'Ç«', + 'ÇȘ̄' => 'ÇŹ', + 'ǭ' => 'Ç­', + 'Ǯ' => 'Çź', + 'ǯ' => 'ÇŻ', + 'ǰ' => 'ǰ', + 'Ǵ' => 'ÇŽ', + 'ǵ' => 'Ç”', + 'Ǹ' => 'Çž', + 'ǹ' => 'Çč', + 'Ă…Ì' => 'Çș', + 'Ă„Ì' => 'Ç»', + 'Ă†Ì' => 'ÇŒ', + 'ĂŠÌ' => 'Çœ', + 'Ă˜Ì' => 'ÇŸ', + 'ĂžÌ' => 'Çż', + 'Ȁ' => 'Ȁ', + 'ȁ' => 'ȁ', + 'Ȃ' => 'Ȃ', + 'ȃ' => 'ȃ', + 'Ȅ' => 'Ȅ', + 'ȅ' => 'ȅ', + 'Ȇ' => 'Ȇ', + 'ȇ' => 'ȇ', + 'Ȉ' => 'Ȉ', + 'ȉ' => 'ȉ', + 'Ȋ' => 'Ȋ', + 'ȋ' => 'ȋ', + 'Ȍ' => 'Ȍ', + 'ȍ' => 'ȍ', + 'Ȏ' => 'Ȏ', + 'ȏ' => 'ȏ', + 'Ȑ' => 'Ȑ', + 'ȑ' => 'ȑ', + 'Ȓ' => 'Ȓ', + 'ȓ' => 'ȓ', + 'Ȕ' => 'Ȕ', + 'ȕ' => 'ȕ', + 'Ȗ' => 'Ȗ', + 'ȗ' => 'ȗ', + 'SÌŠ' => 'Ș', + 'sÌŠ' => 'ș', + 'TÌŠ' => 'Ț', + 'tÌŠ' => 'ț', + 'Ȟ' => 'Ȟ', + 'ȟ' => 'ȟ', + 'Ȧ' => 'ÈŠ', + 'ȧ' => 'ȧ', + 'Ȩ' => 'Èš', + 'ȩ' => 'È©', + 'Ă–Ì„' => 'ÈȘ', + 'Ă¶Ì„' => 'È«', + 'Ă•Ì„' => 'ÈŹ', + 'Ă”Ì„' => 'È­', + 'Ȯ' => 'Èź', + 'ȯ' => 'ÈŻ', + 'ÈźÌ„' => 'Ȱ', + 'ÈŻÌ„' => 'ȱ', + 'Ȳ' => 'ÈČ', + 'ȳ' => 'Èł', + 'š́' => '΅', + 'Ά' => 'Ά', + 'Έ' => 'Έ', + 'Ή' => 'Ή', + 'Ί' => 'Ί', + 'Ό' => 'Ό', + '΄́' => 'Ύ', + 'Ώ' => 'Ώ', + 'ΐ' => 'ΐ', + 'Ϊ' => 'ÎȘ', + '΄̈' => 'Ϋ', + 'ά' => 'ÎŹ', + 'Δ́' => 'έ', + 'ή' => 'Îź', + 'Îč́' => 'ÎŻ', + 'ΰ' => 'ΰ', + 'Îč̈' => 'ϊ', + 'ϋ' => 'ϋ', + 'ÎżÌ' => 'ό', + 'ύ' => 'ύ', + 'ώ' => 'ώ', + 'ϓ' => 'ϓ', + 'ϔ' => 'ϔ', + 'Đ•Ì€' => 'Ѐ', + 'Đ•Ìˆ' => 'Ё', + 'Đ“Ì' => 'Ѓ', + 'Đ†Ìˆ' => 'Ї', + 'ĐšÌ' => 'Ќ', + 'Đ˜Ì€' => 'Ѝ', + 'ĐŁÌ†' => 'Ў', + 'Đ˜Ì†' => 'Й', + 'ĐžÌ†' => 'Đč', + 'Đ”Ì€' => 'ѐ', + 'Đ”Ìˆ' => 'ё', + 'ĐłÌ' => 'ѓ', + 'Ń–Ìˆ' => 'ї', + 'Đș́' => 'ќ', + 'ĐžÌ€' => 'ѝ', + 'ŃƒÌ†' => 'ў', + 'ŃŽÌ' => 'Ѷ', + 'Ń”Ì' => 'Ń·', + 'Đ–Ì†' => 'Ӂ', + 'Đ¶Ì†' => 'ӂ', + 'ĐÌ†' => 'Ӑ', + 'Đ°Ì†' => 'ӑ', + 'ĐÌˆ' => 'Ӓ', + 'Đ°Ìˆ' => 'ӓ', + 'Đ•Ì†' => 'Ӗ', + 'Đ”Ì†' => 'ӗ', + 'Ӛ' => 'Ӛ', + 'ӛ' => 'ӛ', + 'Đ–Ìˆ' => 'Ӝ', + 'Đ¶Ìˆ' => 'ӝ', + 'Đ—Ìˆ' => 'Ӟ', + 'Đ·Ìˆ' => 'ӟ', + 'Đ˜Ì„' => 'Óą', + 'ĐžÌ„' => 'ÓŁ', + 'Đ˜Ìˆ' => 'Ó€', + 'ĐžÌˆ' => 'Ó„', + 'ĐžÌˆ' => 'ÓŠ', + 'ĐŸÌˆ' => 'Ó§', + 'Ӛ̈' => 'ÓȘ', + 'ӫ' => 'Ó«', + 'Đ­Ìˆ' => 'ÓŹ', + 'ŃÌˆ' => 'Ó­', + 'ĐŁÌ„' => 'Óź', + 'ŃƒÌ„' => 'ÓŻ', + 'ĐŁÌˆ' => 'Ó°', + 'ŃƒÌˆ' => 'Ó±', + 'ĐŁÌ‹' => 'ÓČ', + 'ŃƒÌ‹' => 'Ół', + 'Đ§Ìˆ' => 'ÓŽ', + 'Ń‡Ìˆ' => 'Ó”', + 'Đ«Ìˆ' => 'Óž', + 'Ń‹Ìˆ' => 'Óč', + 'Ű§Ù“' => 'Űą', + 'Ű§Ù”' => 'ŰŁ', + 'ؤ' => 'Ű€', + 'Ű§Ù•' => 'Ű„', + 'ئ' => 'ŰŠ', + 'ۀ' => 'ۀ', + 'ۂ' => 'ۂ', + 'ۓ' => 'ۓ', + 'à€šà€Œ' => 'à€©', + 'à€°à€Œ' => 'à€±', + 'à€łà€Œ' => 'à€Ž', + 'à§‡àŠŸ' => 'ো', + 'ৌ' => 'ৌ', + 'ୈ' => 'ୈ', + 'à­‡àŹŸ' => 'ୋ', + 'ୌ' => 'ୌ', + 'àź’àŻ—' => 'àź”', + 'àŻ†àźŸ' => 'àŻŠ', + 'àŻ‡àźŸ' => 'àŻ‹', + 'àŻ†àŻ—' => 'àŻŒ', + 'ై' => 'ై', + 'àČżàł•' => 'àł€', + 'àł†àł•' => 'àł‡', + 'àł†àł–' => 'àłˆ', + 'àł†àł‚' => 'àłŠ', + 'àłŠàł•' => 'àł‹', + 'à”†àŽŸ' => 'à”Š', + 'à”‡àŽŸ' => 'à”‹', + 'à”†à”—' => 'à”Œ', + 'ේ' => 'ේ', + 'ො' => 'ො', + 'ෝ' => 'ෝ', + 'ෞ' => 'ෞ', + 'ငဟ' => 'ဩ', + 'ᏅᏔ' => 'ᬆ', + 'ᏇᏔ' => 'Ꮘ', + 'ᏉᏔ' => 'ᬊ', + 'ᏋᏔ' => 'ᬌ', + 'áŹáŹ”' => 'ᬎ', + 'ᏑᏔ' => 'ᬒ', + 'áŹșᏔ' => 'ᏻ', + 'áŹŒáŹ”' => 'áŹœ', + 'áŹŸáŹ”' => 'ᭀ', + '᏿Ꮤ' => 'ᭁ', + 'ᭂᏔ' => 'ᭃ', + 'AÌ„' => 'ᾀ', + 'aÌ„' => 'ខ', + 'Ḃ' => 'ᾂ', + 'ḃ' => 'ឃ', + 'BÌŁ' => 'ᾄ', + 'bÌŁ' => 'ᾅ', + 'Ḇ' => 'ᾆ', + 'ḇ' => 'ᾇ', + 'Ă‡Ì' => 'ឈ', + 'Ă§Ì' => 'ᾉ', + 'Ḋ' => 'ᾊ', + 'ḋ' => 'ᾋ', + 'DÌŁ' => 'ᾌ', + 'dÌŁ' => 'ឍ', + 'Ḏ' => 'ᾎ', + 'ḏ' => 'ត', + 'Ḑ' => 'ថ', + 'ḑ' => 'ᾑ', + 'DÌ­' => 'ᾒ', + 'dÌ­' => 'ᾓ', + 'Ḕ' => 'ᾔ', + 'ḕ' => 'ᾕ', + 'Ḗ' => 'ᾖ', + 'ḗ' => 'ᾗ', + 'EÌ­' => 'ម', + 'eÌ­' => 'ᾙ', + 'Ḛ' => 'ᾚ', + 'ḛ' => 'ᾛ', + 'Ț̆' => 'ᾜ', + 'ḝ' => 'ឝ', + 'Ḟ' => 'ᾞ', + 'ḟ' => 'ᾟ', + 'Ḡ' => 'áž ', + 'ḡ' => 'ឥ', + 'Ḣ' => 'ážą', + 'ḣ' => 'ឣ', + 'HÌŁ' => 'ក', + 'hÌŁ' => 'áž„', + 'Ḧ' => 'ដ', + 'ḧ' => 'áž§', + 'Ḩ' => 'ážš', + 'ḩ' => 'áž©', + 'HÌź' => 'ážȘ', + 'hÌź' => 'áž«', + 'Ḭ' => 'ត', + 'ḭ' => 'áž­', + 'ĂÌ' => 'ážź', + 'ĂŻÌ' => 'ឯ', + 'Ḱ' => 'áž°', + 'ḱ' => 'áž±', + 'KÌŁ' => 'ážČ', + 'kÌŁ' => 'ážł', + 'Ḵ' => 'ណ', + 'ḵ' => 'áž”', + 'LÌŁ' => 'áž¶', + 'lÌŁ' => 'áž·', + 'áž¶Ì„' => 'ážž', + 'áž·Ì„' => 'ážč', + 'Ḻ' => 'ážș', + 'ḻ' => 'áž»', + 'LÌ­' => 'ឌ', + 'lÌ­' => 'ážœ', + 'Ḿ' => 'ស', + 'ḿ' => 'ážż', + 'Ṁ' => 'áč€', + 'ṁ' => 'áč', + 'MÌŁ' => 'áč‚', + 'mÌŁ' => 'áčƒ', + 'Ṅ' => 'áč„', + 'ṅ' => 'áč…', + 'NÌŁ' => 'áč†', + 'nÌŁ' => 'áč‡', + 'Ṉ' => 'áčˆ', + 'ṉ' => 'áč‰', + 'NÌ­' => 'áčŠ', + 'nÌ­' => 'áč‹', + 'Ă•Ì' => 'áčŒ', + 'Ă”Ì' => 'áč', + 'Ă•Ìˆ' => 'áčŽ', + 'Ă”Ìˆ' => 'áč', + 'ĆŒÌ€' => 'áč', + 'ĆÌ€' => 'áč‘', + 'ĆŒÌ' => 'áč’', + 'ĆÌ' => 'áč“', + 'Ṕ' => 'áč”', + 'ṕ' => 'áč•', + 'Ṗ' => 'áč–', + 'ṗ' => 'áč—', + 'Ṙ' => 'áč˜', + 'ṙ' => 'áč™', + 'RÌŁ' => 'áčš', + 'rÌŁ' => 'áč›', + 'áčšÌ„' => 'áčœ', + 'áč›Ì„' => 'áč', + 'Ṟ' => 'áčž', + 'ṟ' => 'áčŸ', + 'Ṡ' => 'áč ', + 'ṡ' => 'áčĄ', + 'SÌŁ' => 'áčą', + 'sÌŁ' => 'áčŁ', + 'ĆšÌ‡' => 'áč€', + 'Ć›Ì‡' => 'áč„', + 'Ć Ì‡' => 'áčŠ', + 'ĆĄÌ‡' => 'áč§', + 'áčąÌ‡' => 'áčš', + 'áčŁÌ‡' => 'áč©', + 'Ṫ' => 'áčȘ', + 'ṫ' => 'áč«', + 'TÌŁ' => 'áčŹ', + 'tÌŁ' => 'áč­', + 'Ṯ' => 'áčź', + 'ṯ' => 'áčŻ', + 'TÌ­' => 'áč°', + 'tÌ­' => 'áč±', + 'UÌ€' => 'áčČ', + 'uÌ€' => 'áčł', + 'Ṵ' => 'áčŽ', + 'ṵ' => 'áč”', + 'UÌ­' => 'áč¶', + 'uÌ­' => 'áč·', + 'ĆšÌ' => 'áčž', + 'Ć©Ì' => 'áčč', + 'ĆȘ̈' => 'áčș', + 'Ć«Ìˆ' => 'áč»', + 'Ṽ' => 'áčŒ', + 'ṽ' => 'áčœ', + 'VÌŁ' => 'áčŸ', + 'vÌŁ' => 'áčż', + 'Ẁ' => 'áș€', + 'ẁ' => 'áș', + 'Ẃ' => 'áș‚', + 'ẃ' => 'áșƒ', + 'Ẅ' => 'áș„', + 'ẅ' => 'áș…', + 'Ẇ' => 'áș†', + 'ẇ' => 'áș‡', + 'WÌŁ' => 'áșˆ', + 'wÌŁ' => 'áș‰', + 'Ẋ' => 'áșŠ', + 'ẋ' => 'áș‹', + 'Ẍ' => 'áșŒ', + 'ẍ' => 'áș', + 'Ẏ' => 'áșŽ', + 'ẏ' => 'áș', + 'Ẑ' => 'áș', + 'ẑ' => 'áș‘', + 'ZÌŁ' => 'áș’', + 'zÌŁ' => 'áș“', + 'Ẕ' => 'áș”', + 'ẕ' => 'áș•', + 'ẖ' => 'áș–', + 'ẗ' => 'áș—', + 'ẘ' => 'áș˜', + 'ẙ' => 'áș™', + 'ĆżÌ‡' => 'áș›', + 'AÌŁ' => 'áș ', + 'aÌŁ' => 'áșĄ', + 'Ả' => 'áșą', + 'ả' => 'áșŁ', + 'Ă‚Ì' => 'áș€', + 'ĂąÌ' => 'áș„', + 'Ă‚Ì€' => 'áșŠ', + 'ĂąÌ€' => 'áș§', + 'Ă‚Ì‰' => 'áșš', + 'ĂąÌ‰' => 'áș©', + 'Ă‚Ìƒ' => 'áșȘ', + 'ĂąÌƒ' => 'áș«', + 'áș Ì‚' => 'áșŹ', + 'áșĄÌ‚' => 'áș­', + 'Ắ' => 'áșź', + 'ắ' => 'áșŻ', + 'Ằ' => 'áș°', + 'ằ' => 'áș±', + 'Ẳ' => 'áșČ', + 'ẳ' => 'áșł', + 'Ẵ' => 'áșŽ', + 'ẵ' => 'áș”', + 'áș Ì†' => 'áș¶', + 'áșĄÌ†' => 'áș·', + 'EÌŁ' => 'áșž', + 'eÌŁ' => 'áșč', + 'Ẻ' => 'áșș', + 'ẻ' => 'áș»', + 'Ẽ' => 'áșŒ', + 'ẽ' => 'áșœ', + 'ĂŠÌ' => 'áșŸ', + 'ĂȘ́' => 'áșż', + 'ĂŠÌ€' => 'Ề', + 'ĂȘ̀' => 'ề', + 'ĂŠÌ‰' => 'Ể', + 'ĂȘ̉' => 'ể', + 'ĂŠÌƒ' => 'Ễ', + 'ĂȘ̃' => 'ễ', + 'áșžÌ‚' => 'Ệ', + 'áșč̂' => 'ệ', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'IÌŁ' => 'Ị', + 'iÌŁ' => 'ị', + 'OÌŁ' => 'Ọ', + 'oÌŁ' => 'ọ', + 'Ỏ' => 'Ỏ', + 'ỏ' => 'ỏ', + 'Ă”Ì' => 'Ố', + 'ĂŽÌ' => 'ố', + 'Ă”Ì€' => 'Ồ', + 'ĂŽÌ€' => 'ồ', + 'Ă”Ì‰' => 'Ổ', + 'ĂŽÌ‰' => 'ổ', + 'Ă”Ìƒ' => 'Ỗ', + 'ĂŽÌƒ' => 'ỗ', + 'Ộ' => 'Ộ', + 'ộ' => 'ộ', + 'Ớ' => 'Ớ', + 'ÆĄÌ' => 'ớ', + 'Ờ' => 'Ờ', + 'ÆĄÌ€' => 'ờ', + 'Ở' => 'Ở', + 'ÆĄÌ‰' => 'ở', + 'Ỡ' => 'á» ', + 'ÆĄÌƒ' => 'ụ', + 'Æ ÌŁ' => 'ỹ', + 'ÆĄÌŁ' => 'ợ', + 'UÌŁ' => 'Ề', + 'uÌŁ' => 'Ễ', + 'Ủ' => 'Ị', + 'ủ' => 'á»§', + 'ÆŻÌ' => 'Ớ', + 'ứ' => 'ứ', + 'ÆŻÌ€' => 'á»Ș', + 'ừ' => 'ừ', + 'ÆŻÌ‰' => 'ỏ', + 'ử' => 'á»­', + 'ÆŻÌƒ' => 'ở', + 'ữ' => 'ữ', + 'ÆŻÌŁ' => 'á»°', + 'Æ°ÌŁ' => 'á»±', + 'Ỳ' => 'á»Č', + 'ỳ' => 'ỳ', + 'YÌŁ' => 'Ỏ', + 'yÌŁ' => 'á»”', + 'Ỷ' => 'á»¶', + 'ỷ' => 'á»·', + 'Ỹ' => 'Ở', + 'ỹ' => 'á»č', + 'ἀ' => 'ጀ', + 'ἁ' => 'ጁ', + 'ጀ̀' => 'ጂ', + 'ጁ̀' => 'ጃ', + 'ጀ́' => 'ጄ', + 'ጁ́' => 'ጅ', + 'ጀ͂' => 'ጆ', + 'ጁ͂' => 'ጇ', + 'Ἀ' => 'ገ', + 'Ἁ' => 'ጉ', + 'ገ̀' => 'ጊ', + 'ጉ̀' => 'ጋ', + 'ገ́' => 'ጌ', + 'ጉ́' => 'ግ', + 'ገ͂' => 'ጎ', + 'ጉ͂' => 'ጏ', + 'Δ̓' => 'ጐ', + 'Δ̔' => '጑', + 'ጐ̀' => 'ጒ', + '጑̀' => 'ጓ', + 'ጐ́' => 'ጔ', + '጑́' => 'ጕ', + 'Ἐ' => 'ጘ', + 'Ἑ' => 'ጙ', + 'ጘ̀' => 'ጚ', + 'ጙ̀' => 'ጛ', + 'ጘ́' => 'ጜ', + 'ጙ́' => 'ጝ', + 'ἠ' => 'ጠ', + 'ἡ' => 'áŒĄ', + 'ጠ̀' => 'áŒą', + 'áŒĄÌ€' => 'áŒŁ', + 'ጠ́' => 'ጀ', + 'áŒĄÌ' => 'ጄ', + 'ጠ͂' => 'ጊ', + 'áŒĄÍ‚' => 'ጧ', + 'Ἠ' => 'ጚ', + 'Ἡ' => 'ጩ', + 'ጚ̀' => 'áŒȘ', + 'ጩ̀' => 'ጫ', + 'ጚ́' => 'áŒŹ', + 'ጩ́' => 'ጭ', + 'ጚ͂' => 'áŒź', + 'ጩ͂' => 'áŒŻ', + 'Îč̓' => 'ጰ', + 'Îč̔' => 'ጱ', + 'ጰ̀' => 'áŒČ', + 'ጱ̀' => 'áŒł', + 'ጰ́' => 'ጎ', + 'ጱ́' => 'ጔ', + 'ጰ͂' => 'ጶ', + 'ጱ͂' => 'ጷ', + 'Ἰ' => 'ጞ', + 'Ἱ' => 'áŒč', + 'ጞ̀' => 'áŒș', + 'áŒč̀' => 'ጻ', + 'ጞ́' => 'ጌ', + 'áŒč́' => 'ጜ', + 'ጞ͂' => 'ጟ', + 'áŒč͂' => 'áŒż', + 'ÎżÌ“' => 'ᜀ', + 'ÎżÌ”' => 'ᜁ', + 'ᜀ̀' => 'ᜂ', + 'ᜁ̀' => 'ᜃ', + 'ᜀ́' => 'ᜄ', + 'ᜁ́' => 'ᜅ', + 'Ὀ' => 'ᜈ', + 'Ὁ' => 'ᜉ', + 'ᜈ̀' => 'ᜊ', + 'ᜉ̀' => 'ᜋ', + 'ᜈ́' => 'ᜌ', + 'ᜉ́' => 'ᜍ', + 'ὐ' => 'ᜐ', + 'ὑ' => 'ᜑ', + 'ᜐ̀' => 'ᜒ', + 'ᜑ̀' => 'ᜓ', + 'ᜐ́' => '᜔', + 'ᜑ́' => '᜕', + 'ᜐ͂' => '᜖', + 'ᜑ͂' => '᜗', + '΄̔' => '᜙', + '᜙̀' => '᜛', + '᜙́' => '᜝', + '᜙͂' => 'ᜟ', + 'ὠ' => 'ᜠ', + 'ὡ' => 'áœĄ', + 'ᜠ̀' => 'áœą', + 'áœĄÌ€' => 'áœŁ', + 'ᜠ́' => 'ᜀ', + 'áœĄÌ' => 'ᜄ', + 'ᜠ͂' => 'ᜊ', + 'áœĄÍ‚' => 'ᜧ', + 'Ὠ' => '᜚', + 'Ὡ' => 'ᜩ', + '᜚̀' => 'áœȘ', + 'ᜩ̀' => 'ᜫ', + '᜚́' => 'áœŹ', + 'ᜩ́' => 'ᜭ', + '᜚͂' => 'áœź', + 'ᜩ͂' => 'áœŻ', + 'ὰ' => 'ᜰ', + 'Δ̀' => 'áœČ', + 'ὴ' => 'ᜎ', + 'Îč̀' => '᜶', + 'ÎżÌ€' => '᜞', + 'ὺ' => 'áœș', + 'ὼ' => 'ᜌ', + 'ጀͅ' => 'ៀ', + 'ጁͅ' => 'េ', + 'ጂͅ' => 'ែ', + 'ጃͅ' => 'ៃ', + 'ጄͅ' => 'ោ', + 'ጅͅ' => 'ៅ', + 'ጆͅ' => 'ំ', + 'ጇͅ' => 'ះ', + 'ገͅ' => 'ៈ', + 'ጉͅ' => '៉', + 'ጊͅ' => '៊', + 'ጋͅ' => '់', + 'ጌͅ' => '៌', + 'ግͅ' => '៍', + 'ጎͅ' => '៎', + 'ጏͅ' => '៏', + 'ጠͅ' => '័', + 'áŒĄÍ…' => '៑', + 'áŒąÍ…' => '្', + 'áŒŁÍ…' => '៓', + 'ጀͅ' => '។', + 'ጄͅ' => '៕', + 'ጊͅ' => '៖', + 'ጧͅ' => 'ៗ', + 'ጚͅ' => '៘', + 'ጩͅ' => '៙', + 'áŒȘͅ' => '៚', + 'ጫͅ' => '៛', + 'áŒŹÍ…' => 'ៜ', + 'ጭͅ' => '៝', + 'áŒźÍ…' => '៞', + 'áŒŻÍ…' => '៟', + 'ᜠͅ' => '០', + 'áœĄÍ…' => 'áŸĄ', + 'áœąÍ…' => 'áŸą', + 'áœŁÍ…' => 'áŸŁ', + 'ᜀͅ' => 'ៀ', + 'ᜄͅ' => 'ោ', + 'ᜊͅ' => '៊', + 'ᜧͅ' => '៧', + '᜚ͅ' => '៚', + 'ᜩͅ' => '៩', + 'áœȘͅ' => 'áŸȘ', + 'ᜫͅ' => '៫', + 'áœŹÍ…' => 'áŸŹ', + 'ᜭͅ' => '៭', + 'áœźÍ…' => 'áŸź', + 'áœŻÍ…' => 'áŸŻ', + 'ᾰ' => '៰', + 'ᾱ' => '៱', + 'ᜰͅ' => 'áŸČ', + 'ᾳ' => 'áŸł', + 'ᾴ' => '៎', + 'ᾶ' => '៶', + '៶ͅ' => '៷', + 'Ᾰ' => '៞', + 'Ᾱ' => 'áŸč', + 'Ὰ' => 'áŸș', + 'ᾼ' => '៌', + '¹͂' => '῁', + 'ᜎͅ' => 'ῂ', + 'ῃ' => 'ῃ', + 'μͅ' => 'ῄ', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Ὴ' => 'Ὴ', + 'ῌ' => 'ῌ', + 'áŸżÌ€' => '῍', + 'áŸżÌ' => '῎', + 'áŸżÍ‚' => '῏', + 'Îč̆' => 'ῐ', + 'Îč̄' => 'ῑ', + 'ῒ' => 'ῒ', + 'Îč͂' => 'ῖ', + 'ῗ' => 'ῗ', + 'Ῐ' => 'Ῐ', + 'Ῑ' => 'Ῑ', + 'Ὶ' => 'Ὶ', + 'áżŸÌ€' => '῝', + 'áżŸÌ' => '῞', + 'áżŸÍ‚' => '῟', + 'ῠ' => 'áż ', + 'ῡ' => 'ῥ', + 'ῢ' => 'áżą', + 'ῤ' => '῀', + 'ῥ' => 'áż„', + 'ῦ' => 'Ὴ', + 'ῧ' => 'áż§', + '΄̆' => 'áżš', + '΄̄' => 'áż©', + '΄̀' => 'áżȘ', + 'ÎĄÌ”' => '῏', + 'š̀' => 'áż­', + 'ᜌͅ' => 'áżČ', + 'ῳ' => 'áżł', + 'ῴ' => '῎', + 'ῶ' => 'áż¶', + 'áż¶Í…' => 'áż·', + 'Ὸ' => 'áżž', + 'Ὼ' => 'áżș', + 'ῼ' => 'áżŒ', + '←̞' => '↚', + '→̞' => '↛', + '↔̞' => '↼', + '⇐̞' => '⇍', + '⇔̞' => '⇎', + '⇒̞' => '⇏', + '∃̞' => '∄', + '∈̞' => '∉', + '∋̞' => '∌', + 'âˆŁÌž' => '∀', + '∄̞' => '∊', + '∌̞' => '≁', + '≃̞' => '≄', + '≅̞' => '≇', + '≈̞' => '≉', + '=Ìž' => '≠', + 'â‰ĄÌž' => '≱', + '≍̞' => '≭', + '<Ìž' => '≼', + '>Ìž' => '≯', + '≀̞' => '≰', + '≄̞' => '≱', + 'â‰ČÌž' => '≮', + 'â‰łÌž' => '≔', + '≶̞' => '≾', + '≷̞' => 'â‰č', + 'â‰șÌž' => '⊀', + '≻̞' => '⊁', + '⊂̞' => '⊄', + '⊃̞' => '⊅', + '⊆̞' => '⊈', + '⊇̞' => '⊉', + 'âŠąÌž' => '⊬', + '⊚̞' => '⊭', + '⊩̞' => '⊼', + '⊫̞' => '⊯', + '≌̞' => '⋠', + '≜̞' => '⋡', + '⊑̞' => '⋱', + '⊒̞' => '⋣', + 'âŠČÌž' => 'â‹Ș', + 'âŠłÌž' => '⋫', + '⊎̞' => '⋬', + '⊔̞' => '⋭', + 'が' => 'が', + 'ぎ' => 'ぎ', + 'ぐ' => 'ぐ', + 'げ' => 'げ', + 'ご' => 'ご', + 'ざ' => 'ざ', + 'じ' => 'じ', + 'ず' => 'ず', + 'ぜ' => 'ぜ', + 'ぞ' => 'ぞ', + 'だ' => 'だ', + 'ぢ' => 'べ', + '぀゙' => 'い', + 'ど゙' => 'で', + 'べ゙' => 'ど', + 'ば' => 'ば', + 'ぱ' => 'ぱ', + 'ăČ゙' => 'び', + 'ăČ゚' => 'ぎ', + 'ご゙' => 'ぶ', + 'ご゚' => 'ぷ', + 'ま゙' => 'ăč', + 'ま゚' => 'ăș', + 'ぼ' => 'ăŒ', + 'ぽ' => 'ăœ', + 'ゔ' => 'ゔ', + 'ゞ' => 'ゞ', + 'ă‚«ă‚™' => 'ガ', + 'ギ' => 'ゼ', + 'グ' => 'グ', + 'ゲ' => 'ă‚Č', + 'ゴ' => 'ギ', + 'ゔ゙' => 'ă‚¶', + 'ă‚·ă‚™' => 'ゾ', + 'ă‚č゙' => 'ă‚ș', + 'ゼ' => 'ă‚Œ', + 'ă‚œă‚™' => 'ă‚Ÿ', + 'ダ' => 'ダ', + 'ヂ' => 'ヂ', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'バ' => 'バ', + 'パ' => 'パ', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ポ' => 'ポ', + 'ォ゙' => 'ノ', + 'ヷ' => 'ヷ', + 'ヸ' => 'マ', + 'ăƒ±ă‚™' => 'ăƒč', + 'ăƒČ゙' => 'ăƒș', + 'ăƒœă‚™' => 'ăƒŸ', + '𑂙đ‘‚ș' => '𑂚', + '𑂛đ‘‚ș' => '𑂜', + 'đ‘‚„đ‘‚ș' => 'đ‘‚«', + '𑄮' => '𑄼', + 'đ‘„Č𑄧' => '𑄯', + 'đ‘‡đ‘ŒŸ' => '𑍋', + '𑍌' => '𑍌', + 'đ‘’čđ‘’ș' => 'đ‘’»', + 'đ‘’č𑒰' => 'đ‘’Œ', + 'đ‘’čđ‘’œ' => 'đ‘’Ÿ', + '𑖾𑖯' => 'đ‘–ș', + 'đ‘–č𑖯' => 'đ‘–»', + '𑀔𑀰' => '𑀞', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php new file mode 100644 index 0000000..5a3e8e0 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/canonicalDecomposition.php @@ -0,0 +1,2065 @@ + 'À', + 'Á' => 'Á', + 'Â' => 'Â', + 'Ã' => 'Ã', + 'Ä' => 'Ä', + 'Å' => 'Å', + 'Ç' => 'Ç', + 'È' => 'È', + 'É' => 'É', + 'Ê' => 'Ê', + 'Ë' => 'Ë', + 'Ì' => 'Ì', + 'Í' => 'Í', + 'Î' => 'Î', + 'Ï' => 'Ï', + 'Ñ' => 'Ñ', + 'Ò' => 'Ò', + 'Ó' => 'Ó', + 'Ô' => 'Ô', + 'Õ' => 'Õ', + 'Ö' => 'Ö', + 'Ù' => 'Ù', + 'Ú' => 'Ú', + 'Û' => 'Û', + 'Ü' => 'Ü', + 'Ý' => 'Ý', + 'Ă ' => 'à', + 'ĂĄ' => 'á', + 'Ăą' => 'â', + 'ĂŁ' => 'ã', + 'Ă€' => 'ä', + 'Ă„' => 'å', + 'ç' => 'ç', + 'Ăš' => 'è', + 'Ă©' => 'é', + 'ĂȘ' => 'ê', + 'Ă«' => 'ë', + 'ĂŹ' => 'ì', + 'Ă­' => 'í', + 'Ăź' => 'î', + 'ĂŻ' => 'ï', + 'ñ' => 'ñ', + 'ĂČ' => 'ò', + 'Ăł' => 'ó', + 'ĂŽ' => 'ô', + 'Ă”' => 'õ', + 'ö' => 'ö', + 'Ăč' => 'ù', + 'Ăș' => 'ú', + 'Ă»' => 'û', + 'ĂŒ' => 'ü', + 'Ăœ' => 'ý', + 'Ăż' => 'ÿ', + 'Ā' => 'Ā', + 'ā' => 'ā', + 'Ă' => 'Ă', + 'ă' => 'ă', + 'Ą' => 'AÌš', + 'ą' => 'aÌš', + 'Ć' => 'Ć', + 'ć' => 'ć', + 'Ĉ' => 'Ĉ', + 'ĉ' => 'ĉ', + 'Ċ' => 'Ċ', + 'ċ' => 'ċ', + 'Č' => 'Č', + 'č' => 'č', + 'Ď' => 'Ď', + 'ď' => 'ď', + 'Ē' => 'Ē', + 'ē' => 'ē', + 'Ĕ' => 'Ĕ', + 'ĕ' => 'ĕ', + 'Ė' => 'Ė', + 'ė' => 'ė', + 'Ę' => 'EÌš', + 'ę' => 'eÌš', + 'Ě' => 'Ě', + 'ě' => 'ě', + 'Ĝ' => 'Ĝ', + 'ĝ' => 'ĝ', + 'Ğ' => 'Ğ', + 'ğ' => 'ğ', + 'Ä ' => 'Ġ', + 'ÄĄ' => 'ġ', + 'Äą' => 'Ģ', + 'ÄŁ' => 'ģ', + 'Ä€' => 'Ĥ', + 'Ä„' => 'ĥ', + 'Äš' => 'Ĩ', + 'Ä©' => 'ĩ', + 'ÄȘ' => 'Ī', + 'Ä«' => 'ī', + 'ÄŹ' => 'Ĭ', + 'Ä­' => 'ĭ', + 'Äź' => 'IÌš', + 'ÄŻ' => 'iÌš', + 'İ' => 'İ', + 'ÄŽ' => 'Ĵ', + 'Ä”' => 'ĵ', + 'Ķ' => 'Ķ', + 'Ä·' => 'ķ', + 'Äč' => 'Ĺ', + 'Äș' => 'ĺ', + 'Ä»' => 'Ļ', + 'ÄŒ' => 'ļ', + 'Äœ' => 'Ľ', + 'ÄŸ' => 'ľ', + 'ƃ' => 'Ń', + 'Ƅ' => 'ń', + 'ƅ' => 'Ņ', + 'Ɔ' => 'ņ', + 'Ƈ' => 'Ň', + 'ƈ' => 'ň', + 'Ì' => 'Ō', + 'ƍ' => 'ō', + 'Ǝ' => 'Ŏ', + 'Ə' => 'ŏ', + 'Ɛ' => 'Ő', + 'Ƒ' => 'ő', + 'Ɣ' => 'Ŕ', + 'ƕ' => 'ŕ', + 'Ɩ' => 'Ŗ', + 'Ɨ' => 'ŗ', + 'Ƙ' => 'Ř', + 'ƙ' => 'ř', + 'Ú' => 'Ś', + 'ƛ' => 'ś', + 'Ü' => 'Ŝ', + 'Ɲ' => 'ŝ', + 'ƞ' => 'Ş', + 'ß' => 'ş', + 'Ć ' => 'Š', + 'ĆĄ' => 'š', + 'Ćą' => 'Ţ', + 'ĆŁ' => 'ţ', + 'Ć€' => 'Ť', + 'Ć„' => 'ť', + 'Ćš' => 'Ũ', + 'Ć©' => 'ũ', + 'ĆȘ' => 'Ū', + 'Ć«' => 'ū', + 'ĆŹ' => 'Ŭ', + 'Ć­' => 'ŭ', + 'Ćź' => 'Ů', + 'ĆŻ' => 'ů', + 'ư' => 'Ű', + 'Ʊ' => 'ű', + 'ĆČ' => 'UÌš', + 'Ćł' => 'uÌš', + 'ĆŽ' => 'Ŵ', + 'Ć”' => 'ŵ', + 'ƶ' => 'Ŷ', + 'Ć·' => 'ŷ', + 'Ćž' => 'Ÿ', + 'Ćč' => 'Ź', + 'Ćș' => 'ź', + 'Ć»' => 'Ż', + 'ĆŒ' => 'ż', + 'Ćœ' => 'Ž', + 'ĆŸ' => 'ž', + 'Æ ' => 'Ơ', + 'ÆĄ' => 'ơ', + 'ÆŻ' => 'Ư', + 'ư' => 'ư', + 'Ǎ' => 'Ǎ', + 'ǎ' => 'ǎ', + 'Ǐ' => 'Ǐ', + 'ǐ' => 'ǐ', + 'Ǒ' => 'Ǒ', + 'ǒ' => 'ǒ', + 'Ǔ' => 'Ǔ', + 'ǔ' => 'ǔ', + 'Ǖ' => 'Ǖ', + 'ǖ' => 'ǖ', + 'Ǘ' => 'Ǘ', + 'ǘ' => 'ǘ', + 'Ǚ' => 'Ǚ', + 'ǚ' => 'ǚ', + 'Ǜ' => 'Ǜ', + 'ǜ' => 'ǜ', + 'Ǟ' => 'Ǟ', + 'ǟ' => 'ǟ', + 'Ç ' => 'Ǡ', + 'ÇĄ' => 'ǡ', + 'Çą' => 'Ă†Ì„', + 'ÇŁ' => 'ĂŠÌ„', + 'ÇŠ' => 'Ǧ', + 'ǧ' => 'ǧ', + 'Çš' => 'Ǩ', + 'Ç©' => 'ǩ', + 'ÇȘ' => 'OÌš', + 'Ç«' => 'oÌš', + 'ÇŹ' => 'Ō̚', + 'Ç­' => 'ō̚', + 'Çź' => 'Ǯ', + 'ÇŻ' => 'ǯ', + 'ǰ' => 'ǰ', + 'ÇŽ' => 'Ǵ', + 'Ç”' => 'ǵ', + 'Çž' => 'Ǹ', + 'Çč' => 'ǹ', + 'Çș' => 'Ǻ', + 'Ç»' => 'ǻ', + 'ÇŒ' => 'Ă†Ì', + 'Çœ' => 'ĂŠÌ', + 'ÇŸ' => 'Ă˜Ì', + 'Çż' => 'ĂžÌ', + 'Ȁ' => 'Ȁ', + 'ȁ' => 'ȁ', + 'Ȃ' => 'Ȃ', + 'ȃ' => 'ȃ', + 'Ȅ' => 'Ȅ', + 'ȅ' => 'ȅ', + 'Ȇ' => 'Ȇ', + 'ȇ' => 'ȇ', + 'Ȉ' => 'Ȉ', + 'ȉ' => 'ȉ', + 'Ȋ' => 'Ȋ', + 'ȋ' => 'ȋ', + 'Ȍ' => 'Ȍ', + 'ȍ' => 'ȍ', + 'Ȏ' => 'Ȏ', + 'ȏ' => 'ȏ', + 'Ȑ' => 'Ȑ', + 'ȑ' => 'ȑ', + 'Ȓ' => 'Ȓ', + 'ȓ' => 'ȓ', + 'Ȕ' => 'Ȕ', + 'ȕ' => 'ȕ', + 'Ȗ' => 'Ȗ', + 'ȗ' => 'ȗ', + 'Ș' => 'SÌŠ', + 'ș' => 'sÌŠ', + 'Ț' => 'TÌŠ', + 'ț' => 'tÌŠ', + 'Ȟ' => 'Ȟ', + 'ȟ' => 'ȟ', + 'ÈŠ' => 'Ȧ', + 'ȧ' => 'ȧ', + 'Èš' => 'Ȩ', + 'È©' => 'ȩ', + 'ÈȘ' => 'Ȫ', + 'È«' => 'ȫ', + 'ÈŹ' => 'Ȭ', + 'È­' => 'ȭ', + 'Èź' => 'Ȯ', + 'ÈŻ' => 'ȯ', + 'Ȱ' => 'Ȱ', + 'ȱ' => 'ȱ', + 'ÈČ' => 'Ȳ', + 'Èł' => 'ȳ', + '̀' => '̀', + '́' => '́', + '̓' => '̓', + '̈́' => '̈́', + 'ÍŽ' => 'Êč', + 'ÍŸ' => ';', + '΅' => 'š́', + 'Ά' => 'Ά', + '·' => '·', + 'Έ' => 'Έ', + 'Ή' => 'Ή', + 'Ί' => 'Ί', + 'Ό' => 'Ό', + 'Ύ' => '΄́', + 'Ώ' => 'Ώ', + 'ΐ' => 'Îč̈́', + 'ÎȘ' => 'Ϊ', + 'Ϋ' => '΄̈', + 'ÎŹ' => 'ά', + 'έ' => 'Δ́', + 'Îź' => 'ή', + 'ÎŻ' => 'Îč́', + 'ΰ' => 'ΰ', + 'ϊ' => 'Îč̈', + 'ϋ' => 'ϋ', + 'ό' => 'ÎżÌ', + 'ύ' => 'ύ', + 'ώ' => 'ώ', + 'ϓ' => 'ϓ', + 'ϔ' => 'ϔ', + 'Ѐ' => 'Đ•Ì€', + 'Ё' => 'Đ•Ìˆ', + 'Ѓ' => 'Đ“Ì', + 'Ї' => 'Đ†Ìˆ', + 'Ќ' => 'ĐšÌ', + 'Ѝ' => 'Đ˜Ì€', + 'Ў' => 'ĐŁÌ†', + 'Й' => 'Đ˜Ì†', + 'Đč' => 'ĐžÌ†', + 'ѐ' => 'Đ”Ì€', + 'ё' => 'Đ”Ìˆ', + 'ѓ' => 'ĐłÌ', + 'ї' => 'Ń–Ìˆ', + 'ќ' => 'Đș́', + 'ѝ' => 'ĐžÌ€', + 'ў' => 'ŃƒÌ†', + 'Ѷ' => 'ŃŽÌ', + 'Ń·' => 'Ń”Ì', + 'Ӂ' => 'Đ–Ì†', + 'ӂ' => 'Đ¶Ì†', + 'Ӑ' => 'ĐÌ†', + 'ӑ' => 'Đ°Ì†', + 'Ӓ' => 'ĐÌˆ', + 'ӓ' => 'Đ°Ìˆ', + 'Ӗ' => 'Đ•Ì†', + 'ӗ' => 'Đ”Ì†', + 'Ӛ' => 'Ӛ', + 'ӛ' => 'ӛ', + 'Ӝ' => 'Đ–Ìˆ', + 'ӝ' => 'Đ¶Ìˆ', + 'Ӟ' => 'Đ—Ìˆ', + 'ӟ' => 'Đ·Ìˆ', + 'Óą' => 'Đ˜Ì„', + 'ÓŁ' => 'ĐžÌ„', + 'Ó€' => 'Đ˜Ìˆ', + 'Ó„' => 'ĐžÌˆ', + 'ÓŠ' => 'ĐžÌˆ', + 'Ó§' => 'ĐŸÌˆ', + 'ÓȘ' => 'Ӛ̈', + 'Ó«' => 'ӫ', + 'ÓŹ' => 'Đ­Ìˆ', + 'Ó­' => 'ŃÌˆ', + 'Óź' => 'ĐŁÌ„', + 'ÓŻ' => 'ŃƒÌ„', + 'Ó°' => 'ĐŁÌˆ', + 'Ó±' => 'ŃƒÌˆ', + 'ÓČ' => 'ĐŁÌ‹', + 'Ół' => 'ŃƒÌ‹', + 'ÓŽ' => 'Đ§Ìˆ', + 'Ó”' => 'Ń‡Ìˆ', + 'Óž' => 'Đ«Ìˆ', + 'Óč' => 'Ń‹Ìˆ', + 'Űą' => 'Ű§Ù“', + 'ŰŁ' => 'Ű§Ù”', + 'Ű€' => 'ؤ', + 'Ű„' => 'Ű§Ù•', + 'ŰŠ' => 'ئ', + 'ۀ' => 'ۀ', + 'ۂ' => 'ۂ', + 'ۓ' => 'ۓ', + 'à€©' => 'à€šà€Œ', + 'à€±' => 'à€°à€Œ', + 'à€Ž' => 'à€łà€Œ', + 'à„˜' => 'à€•à€Œ', + 'à„™' => 'à€–à€Œ', + 'à„š' => 'à€—à€Œ', + 'à„›' => 'à€œà€Œ', + 'à„œ' => 'à€Ąà€Œ', + 'à„' => 'à€ąà€Œ', + 'à„ž' => 'à€«à€Œ', + 'à„Ÿ' => 'à€Żà€Œ', + 'ো' => 'à§‡àŠŸ', + 'ৌ' => 'ৌ', + 'ড়' => 'àŠĄàŠŒ', + 'ঢ়' => 'àŠąàŠŒ', + 'য়' => 'àŠŻàŠŒ', + 'àšł' => 'àšČàšŒ', + 'àš¶' => 'àšžàšŒ', + 'ਖ਼' => 'àš–àšŒ', + 'ਗ਼' => 'àš—àšŒ', + 'ਜ਼' => 'àšœàšŒ', + 'ਫ਼' => 'àš«àšŒ', + 'ୈ' => 'ୈ', + 'ୋ' => 'à­‡àŹŸ', + 'ୌ' => 'ୌ', + 'ଡ଼' => 'àŹĄàŹŒ', + 'ଢ଼' => 'àŹąàŹŒ', + 'àź”' => 'àź’àŻ—', + 'àŻŠ' => 'àŻ†àźŸ', + 'àŻ‹' => 'àŻ‡àźŸ', + 'àŻŒ' => 'àŻ†àŻ—', + 'ై' => 'ై', + 'àł€' => 'àČżàł•', + 'àł‡' => 'àł†àł•', + 'àłˆ' => 'àł†àł–', + 'àłŠ' => 'àł†àł‚', + 'àł‹' => 'àł†àł‚àł•', + 'à”Š' => 'à”†àŽŸ', + 'à”‹' => 'à”‡àŽŸ', + 'à”Œ' => 'à”†à”—', + 'ේ' => 'ේ', + 'ො' => 'ො', + 'ෝ' => 'ෝ', + 'ෞ' => 'ෞ', + 'àœƒ' => 'àœ‚àŸ·', + 'àœ' => 'àœŒàŸ·', + 'àœ’' => 'àœ‘àŸ·', + 'àœ—' => 'àœ–àŸ·', + 'àœœ' => 'àœ›àŸ·', + 'àœ©' => 'àœ€àŸ”', + 'àœł' => 'àœ±àœČ', + 'àœ”' => 'àœ±àœŽ', + 'àœ¶' => 'àŸČàŸ€', + 'àœž' => 'àŸłàŸ€', + 'àŸ' => 'àœ±àŸ€', + 'àŸ“' => 'àŸ’àŸ·', + 'àŸ' => 'àŸœàŸ·', + 'àŸą' => 'àŸĄàŸ·', + 'àŸ§' => 'àŸŠàŸ·', + 'àŸŹ' => 'àŸ«àŸ·', + 'àŸč' => 'àŸàŸ”', + 'ဩ' => 'ငဟ', + 'ᬆ' => 'ᏅᏔ', + 'Ꮘ' => 'ᏇᏔ', + 'ᬊ' => 'ᏉᏔ', + 'ᬌ' => 'ᏋᏔ', + 'ᬎ' => 'áŹáŹ”', + 'ᬒ' => 'ᏑᏔ', + 'ᏻ' => 'áŹșᏔ', + 'áŹœ' => 'áŹŒáŹ”', + 'ᭀ' => 'áŹŸáŹ”', + 'ᭁ' => '᏿Ꮤ', + 'ᭃ' => 'ᭂᏔ', + 'ᾀ' => 'AÌ„', + 'ខ' => 'aÌ„', + 'ᾂ' => 'Ḃ', + 'ឃ' => 'ḃ', + 'ᾄ' => 'BÌŁ', + 'ᾅ' => 'bÌŁ', + 'ᾆ' => 'Ḇ', + 'ᾇ' => 'ḇ', + 'ឈ' => 'Ḉ', + 'ᾉ' => 'ḉ', + 'ᾊ' => 'Ḋ', + 'ᾋ' => 'ḋ', + 'ᾌ' => 'DÌŁ', + 'ឍ' => 'dÌŁ', + 'ᾎ' => 'Ḏ', + 'ត' => 'ḏ', + 'ថ' => 'Ḑ', + 'ᾑ' => 'ḑ', + 'ᾒ' => 'DÌ­', + 'ᾓ' => 'dÌ­', + 'ᾔ' => 'Ḕ', + 'ᾕ' => 'ḕ', + 'ᾖ' => 'Ḗ', + 'ᾗ' => 'ḗ', + 'ម' => 'EÌ­', + 'ᾙ' => 'eÌ­', + 'ᾚ' => 'Ḛ', + 'ᾛ' => 'ḛ', + 'ᾜ' => 'Ḝ', + 'ឝ' => 'ḝ', + 'ᾞ' => 'Ḟ', + 'ᾟ' => 'ḟ', + 'áž ' => 'Ḡ', + 'ឥ' => 'ḡ', + 'ážą' => 'Ḣ', + 'ឣ' => 'ḣ', + 'ក' => 'HÌŁ', + 'áž„' => 'hÌŁ', + 'ដ' => 'Ḧ', + 'áž§' => 'ḧ', + 'ážš' => 'Ḩ', + 'áž©' => 'ḩ', + 'ážȘ' => 'HÌź', + 'áž«' => 'hÌź', + 'ត' => 'Ḭ', + 'áž­' => 'ḭ', + 'ážź' => 'Ḯ', + 'ឯ' => 'ḯ', + 'áž°' => 'Ḱ', + 'áž±' => 'ḱ', + 'ážČ' => 'KÌŁ', + 'ážł' => 'kÌŁ', + 'ណ' => 'Ḵ', + 'áž”' => 'ḵ', + 'áž¶' => 'LÌŁ', + 'áž·' => 'lÌŁ', + 'ážž' => 'LÌŁÌ„', + 'ážč' => 'lÌŁÌ„', + 'ážș' => 'Ḻ', + 'áž»' => 'ḻ', + 'ឌ' => 'LÌ­', + 'ážœ' => 'lÌ­', + 'ស' => 'Ḿ', + 'ážż' => 'ḿ', + 'áč€' => 'Ṁ', + 'áč' => 'ṁ', + 'áč‚' => 'MÌŁ', + 'áčƒ' => 'mÌŁ', + 'áč„' => 'Ṅ', + 'áč…' => 'ṅ', + 'áč†' => 'NÌŁ', + 'áč‡' => 'nÌŁ', + 'áčˆ' => 'Ṉ', + 'áč‰' => 'ṉ', + 'áčŠ' => 'NÌ­', + 'áč‹' => 'nÌ­', + 'áčŒ' => 'Ṍ', + 'áč' => 'ṍ', + 'áčŽ' => 'Ṏ', + 'áč' => 'ṏ', + 'áč' => 'Ṑ', + 'áč‘' => 'ṑ', + 'áč’' => 'Ṓ', + 'áč“' => 'ṓ', + 'áč”' => 'Ṕ', + 'áč•' => 'ṕ', + 'áč–' => 'Ṗ', + 'áč—' => 'ṗ', + 'áč˜' => 'Ṙ', + 'áč™' => 'ṙ', + 'áčš' => 'RÌŁ', + 'áč›' => 'rÌŁ', + 'áčœ' => 'RÌŁÌ„', + 'áč' => 'rÌŁÌ„', + 'áčž' => 'Ṟ', + 'áčŸ' => 'ṟ', + 'áč ' => 'Ṡ', + 'áčĄ' => 'ṡ', + 'áčą' => 'SÌŁ', + 'áčŁ' => 'sÌŁ', + 'áč€' => 'Ṥ', + 'áč„' => 'ṥ', + 'áčŠ' => 'Ṧ', + 'áč§' => 'ṧ', + 'áčš' => 'SÌŁÌ‡', + 'áč©' => 'sÌŁÌ‡', + 'áčȘ' => 'Ṫ', + 'áč«' => 'ṫ', + 'áčŹ' => 'TÌŁ', + 'áč­' => 'tÌŁ', + 'áčź' => 'Ṯ', + 'áčŻ' => 'ṯ', + 'áč°' => 'TÌ­', + 'áč±' => 'tÌ­', + 'áčČ' => 'UÌ€', + 'áčł' => 'uÌ€', + 'áčŽ' => 'Ṵ', + 'áč”' => 'ṵ', + 'áč¶' => 'UÌ­', + 'áč·' => 'uÌ­', + 'áčž' => 'Ṹ', + 'áčč' => 'ṹ', + 'áčș' => 'Ṻ', + 'áč»' => 'ṻ', + 'áčŒ' => 'Ṽ', + 'áčœ' => 'ṽ', + 'áčŸ' => 'VÌŁ', + 'áčż' => 'vÌŁ', + 'áș€' => 'Ẁ', + 'áș' => 'ẁ', + 'áș‚' => 'Ẃ', + 'áșƒ' => 'ẃ', + 'áș„' => 'Ẅ', + 'áș…' => 'ẅ', + 'áș†' => 'Ẇ', + 'áș‡' => 'ẇ', + 'áșˆ' => 'WÌŁ', + 'áș‰' => 'wÌŁ', + 'áșŠ' => 'Ẋ', + 'áș‹' => 'ẋ', + 'áșŒ' => 'Ẍ', + 'áș' => 'ẍ', + 'áșŽ' => 'Ẏ', + 'áș' => 'ẏ', + 'áș' => 'Ẑ', + 'áș‘' => 'ẑ', + 'áș’' => 'ZÌŁ', + 'áș“' => 'zÌŁ', + 'áș”' => 'Ẕ', + 'áș•' => 'ẕ', + 'áș–' => 'ẖ', + 'áș—' => 'ẗ', + 'áș˜' => 'ẘ', + 'áș™' => 'ẙ', + 'áș›' => 'ĆżÌ‡', + 'áș ' => 'AÌŁ', + 'áșĄ' => 'aÌŁ', + 'áșą' => 'Ả', + 'áșŁ' => 'ả', + 'áș€' => 'Ấ', + 'áș„' => 'ấ', + 'áșŠ' => 'Ầ', + 'áș§' => 'ầ', + 'áșš' => 'Ẩ', + 'áș©' => 'ẩ', + 'áșȘ' => 'Ẫ', + 'áș«' => 'ẫ', + 'áșŹ' => 'AÌŁÌ‚', + 'áș­' => 'aÌŁÌ‚', + 'áșź' => 'Ắ', + 'áșŻ' => 'ắ', + 'áș°' => 'Ằ', + 'áș±' => 'ằ', + 'áșČ' => 'Ẳ', + 'áșł' => 'ẳ', + 'áșŽ' => 'Ẵ', + 'áș”' => 'ẵ', + 'áș¶' => 'AÌŁÌ†', + 'áș·' => 'aÌŁÌ†', + 'áșž' => 'EÌŁ', + 'áșč' => 'eÌŁ', + 'áșș' => 'Ẻ', + 'áș»' => 'ẻ', + 'áșŒ' => 'Ẽ', + 'áșœ' => 'ẽ', + 'áșŸ' => 'Ế', + 'áșż' => 'ế', + 'Ề' => 'Ề', + 'ề' => 'ề', + 'Ể' => 'Ể', + 'ể' => 'ể', + 'Ễ' => 'Ễ', + 'ễ' => 'ễ', + 'Ệ' => 'EÌŁÌ‚', + 'ệ' => 'eÌŁÌ‚', + 'Ỉ' => 'Ỉ', + 'ỉ' => 'ỉ', + 'Ị' => 'IÌŁ', + 'ị' => 'iÌŁ', + 'Ọ' => 'OÌŁ', + 'ọ' => 'oÌŁ', + 'Ỏ' => 'Ỏ', + 'ỏ' => 'ỏ', + 'Ố' => 'Ố', + 'ố' => 'ố', + 'Ồ' => 'Ồ', + 'ồ' => 'ồ', + 'Ổ' => 'Ổ', + 'ổ' => 'ổ', + 'Ỗ' => 'Ỗ', + 'ỗ' => 'ỗ', + 'Ộ' => 'OÌŁÌ‚', + 'ộ' => 'oÌŁÌ‚', + 'Ớ' => 'Ớ', + 'ớ' => 'ớ', + 'Ờ' => 'Ờ', + 'ờ' => 'ờ', + 'Ở' => 'Ở', + 'ở' => 'ở', + 'á» ' => 'Ỡ', + 'ụ' => 'ỡ', + 'ỹ' => 'OÌ›ÌŁ', + 'ợ' => 'oÌ›ÌŁ', + 'Ề' => 'UÌŁ', + 'Ễ' => 'uÌŁ', + 'Ị' => 'Ủ', + 'á»§' => 'ủ', + 'Ớ' => 'Ứ', + 'ứ' => 'ứ', + 'á»Ș' => 'Ừ', + 'ừ' => 'ừ', + 'ỏ' => 'Ử', + 'á»­' => 'ử', + 'ở' => 'Ữ', + 'ữ' => 'ữ', + 'á»°' => 'UÌ›ÌŁ', + 'á»±' => 'uÌ›ÌŁ', + 'á»Č' => 'Ỳ', + 'ỳ' => 'ỳ', + 'Ỏ' => 'YÌŁ', + 'á»”' => 'yÌŁ', + 'á»¶' => 'Ỷ', + 'á»·' => 'ỷ', + 'Ở' => 'Ỹ', + 'á»č' => 'ỹ', + 'ጀ' => 'ἀ', + 'ጁ' => 'ἁ', + 'ጂ' => 'ἂ', + 'ጃ' => 'ἃ', + 'ጄ' => 'ἄ', + 'ጅ' => 'ἅ', + 'ጆ' => 'ἆ', + 'ጇ' => 'ἇ', + 'ገ' => 'Ἀ', + 'ጉ' => 'Ἁ', + 'ጊ' => 'Ἂ', + 'ጋ' => 'Ἃ', + 'ጌ' => 'Ἄ', + 'ግ' => 'Ἅ', + 'ጎ' => 'Ἆ', + 'ጏ' => 'Ἇ', + 'ጐ' => 'Δ̓', + '጑' => 'Δ̔', + 'ጒ' => 'Δ̓̀', + 'ጓ' => 'Δ̔̀', + 'ጔ' => 'Δ̓́', + 'ጕ' => 'Δ̔́', + 'ጘ' => 'Ἐ', + 'ጙ' => 'Ἑ', + 'ጚ' => 'Ἒ', + 'ጛ' => 'Ἓ', + 'ጜ' => 'Ἔ', + 'ጝ' => 'Ἕ', + 'ጠ' => 'ἠ', + 'áŒĄ' => 'ἡ', + 'áŒą' => 'ἢ', + 'áŒŁ' => 'ἣ', + 'ጀ' => 'ἤ', + 'ጄ' => 'ἥ', + 'ጊ' => 'ἦ', + 'ጧ' => 'ἧ', + 'ጚ' => 'Ἠ', + 'ጩ' => 'Ἡ', + 'áŒȘ' => 'Ἢ', + 'ጫ' => 'Ἣ', + 'áŒŹ' => 'Ἤ', + 'ጭ' => 'Ἥ', + 'áŒź' => 'Ἦ', + 'áŒŻ' => 'Ἧ', + 'ጰ' => 'Îč̓', + 'ጱ' => 'Îč̔', + 'áŒČ' => 'Îč̓̀', + 'áŒł' => 'Îč̔̀', + 'ጎ' => 'Îč̓́', + 'ጔ' => 'Îč̔́', + 'ጶ' => 'Îč̓͂', + 'ጷ' => 'Îč̔͂', + 'ጞ' => 'Ἰ', + 'áŒč' => 'Ἱ', + 'áŒș' => 'Ἲ', + 'ጻ' => 'Ἳ', + 'ጌ' => 'Ἴ', + 'ጜ' => 'Ἵ', + 'ጟ' => 'Ἶ', + 'áŒż' => 'Ἷ', + 'ᜀ' => 'ÎżÌ“', + 'ᜁ' => 'ÎżÌ”', + 'ᜂ' => 'ÎżÌ“Ì€', + 'ᜃ' => 'ÎżÌ”Ì€', + 'ᜄ' => 'ÎżÌ“Ì', + 'ᜅ' => 'ÎżÌ”Ì', + 'ᜈ' => 'Ὀ', + 'ᜉ' => 'Ὁ', + 'ᜊ' => 'Ὂ', + 'ᜋ' => 'Ὃ', + 'ᜌ' => 'Ὄ', + 'ᜍ' => 'Ὅ', + 'ᜐ' => 'ὐ', + 'ᜑ' => 'ὑ', + 'ᜒ' => 'ὒ', + 'ᜓ' => 'ὓ', + '᜔' => 'ὔ', + '᜕' => 'ὕ', + '᜖' => 'ὖ', + '᜗' => 'ὗ', + '᜙' => '΄̔', + '᜛' => '΄̔̀', + '᜝' => '΄̔́', + 'ᜟ' => '΄̔͂', + 'ᜠ' => 'ὠ', + 'áœĄ' => 'ὡ', + 'áœą' => 'ὢ', + 'áœŁ' => 'ὣ', + 'ᜀ' => 'ὤ', + 'ᜄ' => 'ὥ', + 'ᜊ' => 'ὦ', + 'ᜧ' => 'ὧ', + '᜚' => 'Ὠ', + 'ᜩ' => 'Ὡ', + 'áœȘ' => 'Ὢ', + 'ᜫ' => 'Ὣ', + 'áœŹ' => 'Ὤ', + 'ᜭ' => 'Ὥ', + 'áœź' => 'Ὦ', + 'áœŻ' => 'Ὧ', + 'ᜰ' => 'ὰ', + 'ᜱ' => 'ά', + 'áœČ' => 'Δ̀', + 'áœł' => 'Δ́', + 'ᜎ' => 'ὴ', + '᜔' => 'ή', + '᜶' => 'Îč̀', + '᜷' => 'Îč́', + '᜞' => 'ÎżÌ€', + 'áœč' => 'ÎżÌ', + 'áœș' => 'ὺ', + '᜻' => 'ύ', + 'ᜌ' => 'ὼ', + '᜜' => 'ώ', + 'ៀ' => 'ᾀ', + 'េ' => 'ᾁ', + 'ែ' => 'ᾂ', + 'ៃ' => 'ᾃ', + 'ោ' => 'ᾄ', + 'ៅ' => 'ᾅ', + 'ំ' => 'ᾆ', + 'ះ' => 'ᾇ', + 'ៈ' => 'ᾈ', + '៉' => 'ᾉ', + '៊' => 'ᾊ', + '់' => 'ᾋ', + '៌' => 'ᾌ', + '៍' => 'ᾍ', + '៎' => 'ᾎ', + '៏' => 'ᾏ', + '័' => 'ᾐ', + '៑' => 'ᾑ', + '្' => 'ᾒ', + '៓' => 'ᾓ', + '។' => 'ᾔ', + '៕' => 'ᾕ', + '៖' => 'ᾖ', + 'ៗ' => 'ᾗ', + '៘' => 'ᾘ', + '៙' => 'ᾙ', + '៚' => 'ᾚ', + '៛' => 'ᾛ', + 'ៜ' => 'ᾜ', + '៝' => 'ᾝ', + '៞' => 'ᾞ', + '៟' => 'ᾟ', + '០' => 'ᾠ', + 'áŸĄ' => 'ᾡ', + 'áŸą' => 'ᾢ', + 'áŸŁ' => 'ᾣ', + 'ៀ' => 'ᾤ', + 'ោ' => 'ᾥ', + '៊' => 'ᾦ', + '៧' => 'ᾧ', + '៚' => 'ᾨ', + '៩' => 'ᾩ', + 'áŸȘ' => 'ᾪ', + '៫' => 'ᾫ', + 'áŸŹ' => 'ᾬ', + '៭' => 'ᾭ', + 'áŸź' => 'ᾮ', + 'áŸŻ' => 'ᾯ', + '៰' => 'ᾰ', + '៱' => 'ᾱ', + 'áŸČ' => 'ᾲ', + 'áŸł' => 'ᾳ', + '៎' => 'ᾴ', + '៶' => 'ᾶ', + '៷' => 'ᾷ', + '៞' => 'Ᾰ', + 'áŸč' => 'Ᾱ', + 'áŸș' => 'Ὰ', + '៻' => 'Ά', + '៌' => 'ᾼ', + '៟' => 'Îč', + '῁' => '¹͂', + 'ῂ' => 'ῂ', + 'ῃ' => 'ῃ', + 'ῄ' => 'ῄ', + 'ῆ' => 'ῆ', + 'ῇ' => 'ῇ', + 'Ὲ' => 'Ὲ', + 'Έ' => 'Έ', + 'Ὴ' => 'Ὴ', + 'Ή' => 'Ή', + 'ῌ' => 'ῌ', + '῍' => 'áŸżÌ€', + '῎' => 'áŸżÌ', + '῏' => 'áŸżÍ‚', + 'ῐ' => 'Îč̆', + 'ῑ' => 'Îč̄', + 'ῒ' => 'Îč̈̀', + 'ΐ' => 'Îč̈́', + 'ῖ' => 'Îč͂', + 'ῗ' => 'Îč̈͂', + 'Ῐ' => 'Ῐ', + 'Ῑ' => 'Ῑ', + 'Ὶ' => 'Ὶ', + 'Ί' => 'Ί', + '῝' => 'áżŸÌ€', + '῞' => 'áżŸÌ', + '῟' => 'áżŸÍ‚', + 'áż ' => 'ῠ', + 'ῥ' => 'ῡ', + 'áżą' => 'ῢ', + 'ΰ' => 'ΰ', + '῀' => 'ῤ', + 'áż„' => 'ῥ', + 'Ὴ' => 'ῦ', + 'áż§' => 'ῧ', + 'áżš' => '΄̆', + 'áż©' => '΄̄', + 'áżȘ' => '΄̀', + 'áż«' => '΄́', + '῏' => 'ÎĄÌ”', + 'áż­' => 'š̀', + 'áżź' => 'š́', + '`' => '`', + 'áżČ' => 'ῲ', + 'áżł' => 'ῳ', + '῎' => 'ῴ', + 'áż¶' => 'ῶ', + 'áż·' => 'ῷ', + 'áżž' => 'Ὸ', + 'áżč' => 'Ό', + 'áżș' => 'Ὼ', + 'áż»' => 'Ώ', + 'áżŒ' => 'ῼ', + 'áżœ' => 'ÂŽ', + ' ' => ' ', + ' ' => ' ', + '℩' => 'Ω', + 'â„Ș' => 'K', + 'Å' => 'Å', + '↚' => '←̞', + '↛' => '→̞', + '↼' => '↔̞', + '⇍' => '⇐̞', + '⇎' => '⇔̞', + '⇏' => '⇒̞', + '∄' => '∃̞', + '∉' => '∈̞', + '∌' => '∋̞', + '∀' => 'âˆŁÌž', + '∊' => '∄̞', + '≁' => '∌̞', + '≄' => '≃̞', + '≇' => '≅̞', + '≉' => '≈̞', + '≠' => '=Ìž', + '≱' => 'â‰ĄÌž', + '≭' => '≍̞', + '≼' => '<Ìž', + '≯' => '>Ìž', + '≰' => '≀̞', + '≱' => '≄̞', + '≮' => 'â‰ČÌž', + '≔' => 'â‰łÌž', + '≾' => '≶̞', + 'â‰č' => '≷̞', + '⊀' => 'â‰șÌž', + '⊁' => '≻̞', + '⊄' => '⊂̞', + '⊅' => '⊃̞', + '⊈' => '⊆̞', + '⊉' => '⊇̞', + '⊬' => 'âŠąÌž', + '⊭' => '⊚̞', + '⊼' => '⊩̞', + '⊯' => '⊫̞', + '⋠' => '≌̞', + '⋡' => '≜̞', + '⋱' => '⊑̞', + '⋣' => '⊒̞', + 'â‹Ș' => 'âŠČÌž', + '⋫' => 'âŠłÌž', + '⋬' => '⊎̞', + '⋭' => '⊔̞', + '〈' => '〈', + 'âŒȘ' => '〉', + '⫝̸' => '⫝̞', + 'が' => 'が', + 'ぎ' => 'ぎ', + 'ぐ' => 'ぐ', + 'げ' => 'げ', + 'ご' => 'ご', + 'ざ' => 'ざ', + 'じ' => 'じ', + 'ず' => 'ず', + 'ぜ' => 'ぜ', + 'ぞ' => 'ぞ', + 'だ' => 'だ', + 'べ' => 'ぢ', + 'い' => '぀゙', + 'で' => 'ど゙', + 'ど' => 'べ゙', + 'ば' => 'ば', + 'ぱ' => 'ぱ', + 'び' => 'ăČ゙', + 'ぎ' => 'ăČ゚', + 'ぶ' => 'ご゙', + 'ぷ' => 'ご゚', + 'ăč' => 'ま゙', + 'ăș' => 'ま゚', + 'ăŒ' => 'ぼ', + 'ăœ' => 'ぽ', + 'ゔ' => 'ゔ', + 'ゞ' => 'ゞ', + 'ガ' => 'ă‚«ă‚™', + 'ゼ' => 'ギ', + 'グ' => 'グ', + 'ă‚Č' => 'ゲ', + 'ギ' => 'ゴ', + 'ă‚¶' => 'ゔ゙', + 'ゾ' => 'ă‚·ă‚™', + 'ă‚ș' => 'ă‚č゙', + 'ă‚Œ' => 'ゼ', + 'ă‚Ÿ' => 'ă‚œă‚™', + 'ダ' => 'ダ', + 'ヂ' => 'ヂ', + 'ヅ' => 'ヅ', + 'デ' => 'デ', + 'ド' => 'ド', + 'バ' => 'バ', + 'パ' => 'パ', + 'ビ' => 'ビ', + 'ピ' => 'ピ', + 'ブ' => 'ブ', + 'プ' => 'プ', + 'ベ' => 'ベ', + 'ペ' => 'ペ', + 'ボ' => 'ボ', + 'ポ' => 'ポ', + 'ノ' => 'ォ゙', + 'ヷ' => 'ヷ', + 'マ' => 'ヸ', + 'ăƒč' => 'ăƒ±ă‚™', + 'ăƒș' => 'ăƒČ゙', + 'ăƒŸ' => 'ăƒœă‚™', + '' => '豈', + '' => '曎', + '' => '車', + '' => 'èłˆ', + '' => '滑', + '' => 'äžČ', + '' => 'ć„', + '' => '韜', + '' => '韜', + '' => 'ć„‘', + '' => '金', + '' => '文', + '' => '愈', + '' => '懶', + '' => '癩', + '' => '矅', + '' => 'è˜ż', + '' => 'èžș', + '' => 'èŁž', + '' => '邏', + '' => 'æš‚', + '' => '掛', + '' => '烙', + '' => '珞', + '' => '萜', + '' => 'é…Ș', + '' => 'é§±', + '' => 'äș‚', + '' => 'ć”', + '' => 'æŹ„', + '' => '爛', + '' => '蘭', + '' => '龞', + 'ï€Ą' => '攐', + 'ï€ą' => 'æż«', + 'ï€Ł' => '藍', + '' => 'è„€', + '' => '拉', + '' => '臘', + '' => '蠟', + '' => '㻊', + '' => '朗', + 'ï€Ș' => 'æ”Ș', + '' => '狌', + 'ï€Ź' => '郎', + '' => '䟆', + 'ï€ź' => '憷', + 'ï€Ż' => '拞', + '' => '擄', + '' => '櫓', + 'ï€Č' => '爐', + 'ï€ł' => '盧', + '' => '老', + '' => '蘆', + '' => '虜', + '' => 'è·Ż', + '' => 'éœČ', + 'ï€č' => 'é­Ż', + 'ï€ș' => 'é·ș', + '' => '籌', + '' => '焿', + '' => 'ç¶ ', + '' => '菉', + 'ï€ż' => '錄', + 'ï„€' => 'éčż', + '' => '論', + 'ï„‚' => '棟', + '' => 'ćŒ„', + 'ï„„' => 'ç± ', + 'ï„…' => '聟', + '' => '牱', + '' => '磊', + '' => 'èł‚', + '' => '雷', + '' => '棘', + 'ï„‹' => '汹', + '' => 'æš“', + '' => '淚', + '' => '挏', + '' => '环', + '' => 'çž·', + 'ï„‘' => '陋', + 'ï„’' => '拒', + 'ï„“' => '肋', + 'ï„”' => '懜', + 'ï„•' => '懌', + 'ï„–' => '繜', + 'ï„—' => 'ç¶Ÿ', + '' => '菱', + 'ï„™' => 'é™”', + '' => 'èź€', + 'ï„›' => '拏', + '' => 'æš‚', + '' => '諟', + '' => 'äžč', + '' => '毧', + 'ï„ ' => '怒', + 'ï„Ą' => '率', + 'ï„ą' => '異', + 'ï„Ł' => '挗', + 'ï„€' => '磻', + 'ï„„' => 'äŸż', + '' => 'ćŸ©', + 'ï„§' => '䞍', + '' => 'æłŒ', + 'ï„©' => '敞', + 'ï„Ș' => '玹', + 'ï„«' => '揃', + 'ï„Ź' => '桞', + 'ï„­' => '省', + 'ï„ź' => '葉', + 'ï„Ż' => 'èȘȘ', + 'ï„°' => 'æźș', + '' => '蟰', + 'ï„Č' => 'æČˆ', + 'ï„ł' => '拟', + '' => 'è‹„', + 'ï„”' => '掠', + 'ï„¶' => 'ç•„', + 'ï„·' => 'äșź', + '' => 'ć…©', + 'ï„č' => '應', + 'ï„ș' => 'æą', + 'ï„»' => 'çł§', + '' => 'è‰Ż', + '' => '諒', + '' => '量', + 'ï„ż' => 'ć‹”', + '' => '摂', + '' => '愳', + '' => '滏', + '' => '旅', + '' => 'æżŸ', + '' => 'ç€Ș', + '' => '閭', + '' => 'é©Ș', + '' => 'éș—', + '' => '黎', + '' => '抛', + '' => '曆', + '' => 'æ­·', + '' => 'èœą', + '' => 'ćčŽ', + '' => '憐', + '' => '戀', + '' => '撚', + '' => 'æŒŁ', + '' => '煉', + '' => '璉', + '' => '秊', + '' => 'ç·Ž', + '' => 'èŻ', + '' => '茊', + '' => 'è“ź', + '' => '連', + '' => '鍊', + '' => '戗', + '' => '抣', + '' => 'ć’œ', + '' => '烈', + '' => 'èŁ‚', + 'ïŠĄ' => 'èȘȘ', + 'ïŠą' => '滉', + 'ïŠŁ' => 'ćż”', + '' => '捻', + '' => 'æźź', + '' => 'ç°Ÿ', + '' => '獔', + '' => '什', + '' => 'ć›č', + 'ïŠȘ' => '毧', + '' => 'ć¶ș', + 'ïŠŹ' => '怜', + '' => 'çŽČ', + 'ïŠź' => '瑩', + 'ïŠŻ' => '矚', + '' => '聆', + '' => '鈎', + 'ïŠČ' => '零', + 'ïŠł' => '靈', + '' => '領', + '' => '䟋', + '' => '犟', + '' => '醮', + '' => '难', + 'ïŠč' => 'æƒĄ', + 'ïŠș' => 'äș†', + '' => 'ペ', + '' => '毟', + '' => 'ć°ż', + '' => '料', + 'ïŠż' => 'æš‚', + '燎' => '燎', + '療' => '療', + '蓼' => '蓌', + '遼' => '遌', + '龍' => '韍', + '暈' => '暈', + '阮' => '队', + '劉' => '抉', + '杻' => '杻', + '柳' => 'æŸł', + '流' => '攁', + '溜' => 'æșœ', + '琉' => '琉', + '留' => '留', + '硫' => '祫', + '紐' => '玐', + '類' => '類', + '六' => '慭', + '戮' => 'æˆź', + '陸' => '陾', + '倫' => '怫', + '崙' => '殙', + '淪' => 'æ·Ș', + '輪' => 'èŒȘ', + '律' => 'ćŸ‹', + '慄' => '慄', + '栗' => '栗', + '率' => '率', + '隆' => '隆', + '利' => '戩', + '吏' => '搏', + '履' => '汄', + 'ï§ ' => '易', + 'ï§Ą' => '李', + 'ï§ą' => 'æąš', + 'ï§Ł' => 'æł„', + 'ï§€' => '理', + 'ï§„' => '痱', + 'ï§Š' => 'çœč', + 'ï§§' => 'èŁ', + 'ï§š' => 'èŁĄ', + 'ï§©' => '里', + 'ï§Ș' => '雱', + 'ï§«' => '挿', + 'ï§Ź' => 'æșș', + 'ï§­' => '搝', + 'ï§ź' => '燐', + 'ï§Ż' => '璘', + 'ï§°' => 'è—ș', + 'ï§±' => '隣', + 'ï§Č' => '鱗', + 'ï§ł' => 'éșŸ', + 'ï§Ž' => '林', + 'ï§”' => '淋', + 'ï§¶' => '臚', + 'ï§·' => '立', + 'ï§ž' => '珠', + 'ï§č' => 'çȒ', + 'ï§ș' => '狀', + 'ï§»' => '炙', + 'ï§Œ' => '識', + 'ï§œ' => '什', + 'ï§Ÿ' => '茶', + 'ï§ż' => 'ćˆș', + '' => '戇', + '' => 'ćșŠ', + 'ïš‚' => '拓', + '' => '糖', + 'ïš„' => '漅', + 'ïš…' => '掞', + '' => '暎', + '' => '茻', + '' => 'èĄŒ', + '' => '降', + '' => '芋', + 'ïš‹' => '滓', + '' => '慀', + '' => '旀', + '' => '桚', + 'ïš’' => '晎', + 'ïš•' => '懞', + 'ïš–' => 'çŒȘ', + 'ïš—' => '益', + '' => '瀌', + 'ïš™' => '焞', + 'ïšš' => 'ç„„', + 'ïš›' => '犏', + 'ïšœ' => '靖', + '' => 'çČŸ', + '' => '矜', + 'ïš ' => '蘒', + 'ïšą' => '諞', + 'ïš„' => '逾', + '' => '郜', + 'ïšȘ' => '飯', + 'ïš«' => 'éŁŒ', + 'ïšŹ' => '通', + 'ïš­' => 'é¶Ž', + 'ïšź' => '郞', + 'ïšŻ' => '隷', + 'ïš°' => 'äŸź', + 'ïš±' => '惧', + 'ïšČ' => '慍', + 'ïšł' => '拉', + '' => 'ć‹€', + 'ïš”' => '捑', + 'ïš¶' => '斝', + 'ïš·' => '昆', + 'ïšž' => '晹', + 'ïšč' => '桀', + 'ïšș' => 'ćąš', + 'ïš»' => 'ć±€', + '' => '江', + 'ïšœ' => '悔', + '' => 'æ…š', + 'ïšż' => '憎', + '懲' => 'æ‡Č', + '敏' => '敏', + '既' => 'æ—ą', + '暑' => '暑', + '梅' => 'æą…', + '海' => 'æ”·', + '渚' => 'æžš', + '漢' => 'æŒą', + '煮' => '煼', + '爫' => '爫', + '琢' => '琹', + '碑' => '籑', + '社' => '瀟', + '祉' => '焉', + '祈' => '焈', + '祐' => '焐', + '祖' => 'ç„–', + '祝' => '焝', + '禍' => '犍', + '禎' => '犎', + '穀' => '穀', + '突' => 'çȘ', + '節' => '節', + '練' => 'ç·Ž', + '縉' => '羉', + '繁' => 'çč', + '署' => 'çœČ', + '者' => '者', + '臭' => '臭', + '艹' => 'è‰č', + '艹' => 'è‰č', + '著' => '著', + 'ï© ' => '耐', + 'ï©Ą' => '芖', + 'ï©ą' => 'èŹ', + 'ï©Ł' => 'èŹč', + 'ï©€' => 'èł“', + 'ï©„' => '莈', + '琢' => '蟶', + 'ï©§' => '逾', + '署' => '難', + 'ï©©' => '響', + 'ï©Ș' => 'é »', + 'ï©«' => '恔', + 'ï©Ź' => 'đ€‹ź', + 'ï©­' => '舘', + 'ï©°' => '䞊', + '况' => '憔', + 'ï©Č' => '慹', + 'ï©ł' => '䟀', + '祈' => '慅', + 'ï©”' => '憀', + 'ï©¶' => '拇', + 'ï©·' => 'ć‹ș', + '艹' => '斝', + 'ï©č' => '敕', + 'ï©ș' => '料', + 'ï©»' => '旱', + '社' => '桚', + '臭' => 'ćął', + '著' => 'ć„„', + 'ï©ż' => 'ć„”', + 'ïȘ€' => '橹', + 'ïȘ' => '揚', + 'ïȘ‚' => 'ć»’', + 'ïȘƒ' => 'ć»™', + 'ïȘ„' => 'ćœ©', + 'ïȘ…' => 'ćŸ­', + 'ïȘ†' => '惘', + 'ïȘ‡' => '慎', + 'ïȘˆ' => '愈', + 'ïȘ‰' => '憎', + 'ïȘŠ' => '慠', + 'ïȘ‹' => 'æ‡Č', + 'ïȘŒ' => '戎', + 'ïȘ' => '揄', + 'ïȘŽ' => '搜', + 'ïȘ' => '摒', + 'ïȘ' => '敖', + 'ïȘ‘' => '晎', + 'ïȘ’' => '朗', + 'ïȘ“' => '望', + 'ïȘ”' => '杖', + 'ïȘ•' => 'æ­č', + 'ïȘ–' => 'æźș', + 'ïȘ—' => '攁', + 'ïȘ˜' => '滛', + 'ïȘ™' => '滋', + 'ïȘš' => 'æŒą', + 'ïȘ›' => '瀞', + 'ïȘœ' => '煼', + 'ïȘ' => '瞧', + 'ïȘž' => '爔', + 'ïȘŸ' => '犯', + 'ïȘ ' => 'çŒȘ', + 'ïȘĄ' => '瑱', + 'ïȘą' => '甆', + 'ïȘŁ' => '画', + 'ïȘ€' => '瘝', + 'ïȘ„' => '瘟', + 'ïȘŠ' => '益', + 'ïȘ§' => '盛', + 'ïȘš' => '目', + 'ïȘ©' => '睊', + 'ïȘȘ' => '着', + 'ïȘ«' => '磌', + 'ïȘŹ' => 'çȘ±', + 'ïȘ­' => '節', + 'ïȘź' => 'ç±»', + 'ïȘŻ' => 'ç”›', + 'ïȘ°' => 'ç·Ž', + 'ïȘ±' => '猟', + 'ïȘČ' => '者', + 'ïȘł' => '荒', + 'ïȘŽ' => 'èŻ', + 'ïȘ”' => 'èč', + 'ïȘ¶' => '脁', + 'ïȘ·' => '芆', + 'ïȘž' => '芖', + 'ïȘč' => 'èȘż', + 'ïȘș' => '諞', + 'ïȘ»' => '請', + 'ïȘŒ' => 'èŹ', + 'ïȘœ' => '諟', + 'ïȘŸ' => 'è«­', + 'ïȘż' => 'èŹč', + '變' => 'èźŠ', + '贈' => '莈', + '輸' => '茞', + '遲' => 'éČ', + '醙' => '醙', + '鉶' => '鉶', + '陼' => '陌', + '難' => '難', + '靖' => '靖', + '韛' => '韛', + '響' => '響', + '頋' => '頋', + '頻' => 'é »', + '鬒' => '鬒', + '龜' => '韜', + '𢡊' => '𱡊', + '𢡄' => '𱡄', + '𣏕' => '𣏕', + '㮝' => '㼝', + '䀘' => '䀘', + '䀹' => 'ä€č', + '𥉉' => 'đ„‰‰', + '𥳐' => 'đ„ł', + '𧻓' => '𧻓', + '齃' => '霃', + '龎' => '韎', + 'ïŹ' => 'Ś™ÖŽ', + 'ïŹŸ' => 'ŚČÖ·', + 'ïŹȘ' => 'کځ', + 'ïŹ«' => 'کڂ', + 'ïŹŹ' => 'Ś©ÖŒŚ', + 'ïŹ­' => 'Ś©ÖŒŚ‚', + 'ïŹź' => 'ڐַ', + 'ïŹŻ' => 'ŚÖž', + 'ïŹ°' => 'ŚÖŒ', + 'ïŹ±' => 'Ś‘ÖŒ', + 'ïŹČ' => 'Ś’ÖŒ', + 'ïŹł' => 'Ś“ÖŒ', + 'ïŹŽ' => 'Ś”ÖŒ', + 'ïŹ”' => 'Ś•ÖŒ', + 'ïŹ¶' => 'Ś–ÖŒ', + 'ïŹž' => 'Ś˜ÖŒ', + 'ïŹč' => 'Ś™ÖŒ', + 'ïŹș' => 'ŚšÖŒ', + 'ïŹ»' => 'Ś›ÖŒ', + 'ïŹŒ' => 'ŚœÖŒ', + 'ïŹŸ' => 'ŚžÖŒ', + 'נּ' => 'Ś ÖŒ', + 'סּ' => 'ŚĄÖŒ', + 'ףּ' => 'ŚŁÖŒ', + 'פּ' => 'Ś€ÖŒ', + 'צּ' => 'ŚŠÖŒ', + 'קּ' => 'Ś§ÖŒ', + 'רּ' => 'ŚšÖŒ', + 'שּ' => 'Ś©ÖŒ', + 'תּ' => 'ŚȘÖŒ', + 'וֹ' => 'Ś•Öč', + 'בֿ' => 'Ś‘Öż', + 'כֿ' => 'Ś›Öż', + 'פֿ' => 'Ś€Öż', + '𑂚' => '𑂙đ‘‚ș', + '𑂜' => '𑂛đ‘‚ș', + 'đ‘‚«' => 'đ‘‚„đ‘‚ș', + '𑄼' => '𑄮', + '𑄯' => 'đ‘„Č𑄧', + '𑍋' => 'đ‘‡đ‘ŒŸ', + '𑍌' => '𑍌', + 'đ‘’»' => 'đ‘’čđ‘’ș', + 'đ‘’Œ' => 'đ‘’č𑒰', + 'đ‘’Ÿ' => 'đ‘’čđ‘’œ', + 'đ‘–ș' => '𑖾𑖯', + 'đ‘–»' => 'đ‘–č𑖯', + '𑀞' => '𑀔𑀰', + '𝅗𝅥' => 'đ…—đ…„', + '𝅘𝅥' => 'đ…˜đ…„', + '𝅘𝅥𝅮' => 'đ…˜đ…„đ…ź', + '𝅘𝅥𝅯' => 'đ…˜đ…„đ…Ż', + '𝅱' => 'đ…˜đ…„đ…°', + '𝅘𝅥𝅱' => 'đ…˜đ…„đ…±', + 'đ…€' => 'đ…˜đ…„đ…Č', + 'đ†»' => 'đ†čđ…„', + 'đ†Œ' => 'đ†șđ…„', + 'đ†œ' => 'đ†čđ…„đ…ź', + 'đ†Ÿ' => 'đ†șđ…„đ…ź', + '𝆹𝅥𝅯' => 'đ†čđ…„đ…Ż', + '𝆺𝅥𝅯' => 'đ†șđ…„đ…Ż', + '丽' => 'äžœ', + '丸' => 'äžž', + '乁' => 'äč', + '𠄢' => '𠄱', + '你' => '䜠', + '侮' => 'äŸź', + '侻' => '䟻', + '倂' => '怂', + '偺' => 'ćș', + '備' => '悙', + '僧' => '惧', + '像' => '惏', + '㒞' => '㒞', + '𠘺' => 'đ ˜ș', + '免' => '慍', + '兔' => '慔', + '兤' => 'ć…€', + '具' => 'ć…·', + '𠔜' => '𠔜', + '㒹' => 'ă’č', + '內' => '慧', + '再' => '憍', + '𠕋' => '𠕋', + '冗' => '憗', + '冤' => '憀', + '仌' => '仌', + '冬' => '憬', + '况' => '憔', + '𩇟' => 'đ©‡Ÿ', + '凵' => '懔', + '刃' => '戃', + '㓟' => '㓟', + '刻' => '戻', + '勇' => '扆', + '叫' => 'ć‰Č', + '剷' => '扷', + '丽' => '㔕', + '你' => '拇', + '僧' => '拉', + '勤' => 'ć‹€', + '冬' => 'ć‹ș', + '包' => '挅', + 'đŻ Ș' => '挆', + '北' => '挗', + '兔' => '捉', + '卑' => '捑', + '㓟' => '捚', + '即' => '捳', + '卽' => 'ćœ', + '卿' => '捿', + 'đŻ Č' => '捿', + '卿' => '捿', + '免' => '𠚏', + '內' => '灰', + '及' => '揊', + '叟' => '揟', + '刃' => 'đ ­Ł', + 'đŻ č' => 'ć«', + 'đŻ ș' => 'ć±', + '吆' => '搆', + 'đŻ Œ' => '撞', + 'đŻ œ' => '搞', + 'đŻ Ÿ' => '摈', + '周' => '摹', + '咢' => '撱', + '𥃳' => 'ć“¶', + '唐' => '攐', + '𥄙' => '敓', + '啣' => '散', + '善' => '斄', + '善' => '斄', + '喙' => '料', + '睊' => 'ć–«', + '喳' => '斳', + '嗂' => '旂', + '圖' => '朖', + '嘆' => '昆', + '圗' => '朗', + '噑' => '晑', + '噴' => '普', + '磌' => '戇', + '壮' => '棟', + '城' => '柎', + '埴' => '柮', + '堍' => '栍', + '型' => '枋', + '堲' => 'ć Č', + '報' => 'ć ±', + '䄯' => '湏', + '𡓤' => '𥓀', + '売' => 'ćŁČ', + '壷' => '棷', + '夆' => '怆', + '多' => '〚', + '夢' => '怹', + '奢' => '愹', + '䈂' => '𡚹', + '𥲀' => 'đĄ›Ș', + '翺' => 'ć§Ź', + '築' => '湛', + '直' => 'ćš§', + '𥄳' => '様', + '瞋' => '橊', + '䊠' => '㛼', + '穊' => 'ă›Œ', + '糣' => '揈', + 'đŻĄȘ' => 'ćŹŸ', + '𥾆' => 'ćŹŸ', + '碌' => '𥧈', + '䌁' => '毃', + '竮' => '毘', + '縂' => '毧', + '繅' => '毳', + '䌴' => '𥏘', + 'đŻĄČ' => '毿', + '𦉇' => '氆', + '硎' => 'ćœ“', + '𥚚' => 'ć°ą', + '罺' => '㞁', + '𦌾' => 'ć± ', + '𥪧' => '江', + 'đŻĄč' => '泀', + 'đŻĄș' => 'ćȍ', + '𦓚' => '𥷀', + 'đŻĄŒ' => '攃', + 'đŻĄœ' => '𥷊', + 'đŻĄŸ' => '攟', + '聰' => '攫', + '𯱀' => 'ć”Œ', + '𯹁' => 'ć·Ą', + '𯱂' => 'ć·ą', + '𯹃' => 'ă Ż', + '𯱄' => 'ć·œ', + '𯱅' => 'ćžš', + '𯱆' => 'ćžœ', + '𯱇' => 'ćč©', + '𯹈' => '㥹', + '𯱉' => '𱆃', + '𯱊' => 'ăĄŒ', + '𯱋' => 'ćș°', + '𯱌' => 'ćșł', + '𯱍' => 'ćș¶', + '𯱎' => '㻊', + '𯱏' => 'đȘŽ’', + '𯹐' => 'ć»Ÿ', + '𯱑' => 'đąŒ±', + '𯱒' => 'đąŒ±', + '𯱓' => '舁', + '𯱔' => 'ćŒą', + '𯱕' => 'ćŒą', + '𯱖' => '㣇', + '𯱗' => '𣊾', + '𯹘' => '𩇚', + '𯱙' => 'ćœą', + '𯱚' => 'ćœ«', + '𯱛' => '㣣', + '𯱜' => 'ćŸš', + '𯱝' => '濍', + '𯱞' => '濗', + '𯱟' => 'ćżč', + '𯹠' => '悁', + '𯹥' => 'ă€ș', + '𯹹' => 'ă€œ', + '𯹣' => '悔', + '𯹀' => '𱛔', + '𯹄' => '惇', + '𯹊' => '慈', + '𯹧' => '慌', + '𯹚' => '慎', + '𯹩' => '慌', + 'đŻąȘ' => 'æ…ș', + '𯹫' => '憎', + '𯹏' => 'æ†Č', + '𯹭' => '憀', + '𯹟' => 'æ†Ż', + '𯹯' => '懞', + '𯹰' => 'æ‡Č', + '𯹱' => '懶', + 'đŻąČ' => '成', + '𯹳' => '戛', + '𯹎' => '扝', + '𯹔' => '抱', + '𯹶' => '拔', + '𯹷' => '捐', + '𯹞' => '𱬌', + 'đŻąč' => '挜', + 'đŻąș' => '拌', + '𯹻' => '捚', + 'đŻąŒ' => '掃', + 'đŻąœ' => '揀', + 'đŻąŸ' => '𹯱', + '𯹿' => 'æą', + '揅' => '揅', + '掩' => '掩', + '㨮' => 'ăšź', + '摩' => '摩', + '摾' => '摟', + '撝' => '撝', + '摷' => '摷', + '㩬' => '㩏', + '敏' => '敏', + '敬' => 'æ•Ź', + '𣀊' => '𣀊', + '旣' => 'æ—Ł', + '書' => '曞', + '晉' => '晉', + '㬙' => '㬙', + '暑' => '暑', + '㬈' => '㏈', + '㫤' => 'ă«€', + '冒' => '憒', + '冕' => '憕', + '最' => '最', + '暜' => '暜', + '肭' => '肭', + '䏙' => '䏙', + '朗' => '朗', + '望' => '望', + '朡' => 'æœĄ', + '杞' => '杞', + '杓' => '杓', + '𣏃' => '𣏃', + '㭉' => '㭉', + '柺' => 'æŸș', + '枅' => '枅', + '栟' => 'æĄ’', + '𣫺' => 'æą…', + '𣑭' => '𣑭', + '揅' => 'æąŽ', + '摾' => '栟', + '𣀊' => '怔', + '㮝' => '㼝', + '朡' => 'æ„‚', + '榣' => 'æŠŁ', + 'đŻŁȘ' => 'æ§Ș', + '檨' => 'æȘš', + '暑' => '𣚣', + '櫛' => '櫛', + '柺' => '㰘', + '次' => 'æŹĄ', + '𣢧' => '𣹧', + '歔' => '歔', + 'đŻŁČ' => '㱎', + '歲' => 'æ­Č', + '㬙' => 'æźŸ', + '最' => 'æźș', + '殻' => 'æź»', + '𣪍' => 'đŁȘ', + '㭉' => '𡮋', + 'đŻŁč' => 'đŁ«ș', + 'đŻŁș' => '汎', + '𣲼' => 'đŁČŒ', + 'đŻŁŒ' => 'æČż', + 'đŻŁœ' => 'æł', + 'đŻŁŸ' => 'æ±§', + '洖' => '掖', + '𯀀' => '掟', + '𯀁' => 'æ”·', + '𯀂' => '攁', + '𯀃' => '攩', + '𯀄' => '攞', + '𯀅' => '涅', + '𯀆' => '𣮞', + '𯀇' => '掎', + '𯀈' => 'æžŻ', + '𯀉' => 'æčź', + '𯀊' => '㎳', + '𯀋' => '滋', + 'đŻ€Œ' => '滇', + 'đŻ€' => '𣻑', + '𯀎' => 'æ·č', + 'đŻ€' => 'æœź', + '𯀐' => 'đŁœž', + '𯀑' => 'đŁŸŽ', + '𯀒' => 'æż†', + '𯀓' => 'ç€č', + '𯀔' => '瀞', + '𯀕' => '瀛', + '𯀖' => 'ă¶–', + '𯀗' => '灊', + '𯀘' => '灜', + '𯀙' => '灷', + '𯀚' => '炭', + '𯀛' => 'đ ”„', + 'đŻ€œ' => '煅', + 'đŻ€' => 'đ€‰Ł', + '𯀞' => '熜', + 'đŻ€Ÿ' => 'đ€Ž«', + '𯀠' => '爚', + '𯀥' => '爔', + '𯀹' => '牐', + '𯀣' => 'đ€˜ˆ', + '𯀀' => '犀', + '𯀄' => '犕', + '𯀊' => 'đ€œ”', + '𯀧' => 'đ€ ”', + '𯀚' => 'çș', + '𯀩' => '王', + 'đŻ€Ș' => 'ășŹ', + '𯀫' => '玄', + '𯀏' => 'ășž', + '𯀭' => 'ășž', + '𯀟' => '瑇', + '𯀯' => '瑜', + '𯀰' => '瑱', + '𯀱' => '璅', + 'đŻ€Č' => '瓊', + '𯀳' => 'ăŒ›', + '𯀎' => '甀', + '𯀔' => 'đ€°¶', + '𯀶' => '生', + '𯀷' => 'đ€Č’', + '𯀞' => '異', + 'đŻ€č' => '𱆟', + 'đŻ€ș' => '瘐', + '𯀻' => 'đ€ŸĄ', + 'đŻ€Œ' => 'đ€Ÿž', + 'đŻ€œ' => 'đ„„', + 'đŻ€Ÿ' => 'ăżŒ', + '𯀿' => '䀈', + '𯄀' => '目', + '𯄁' => 'đ„ƒł', + '𯄂' => 'đ„ƒČ', + '𯄃' => 'đ„„™', + '𯄄' => 'đ„„ł', + '𯄅' => '眞', + '𯄆' => '真', + '𯄇' => '真', + '𯄈' => '睊', + '𯄉' => 'ä€č', + '𯄊' => '瞋', + '𯄋' => '䁆', + 'đŻ„Œ' => '䂖', + 'đŻ„' => 'đ„', + '𯄎' => '硎', + 'đŻ„' => '籌', + '𯄐' => '磌', + '𯄑' => '䃣', + '𯄒' => 'đ„˜Š', + '𯄓' => 'ç„–', + '𯄔' => 'đ„šš', + '𯄕' => 'đ„›…', + '𯄖' => '犏', + '𯄗' => 'ç§«', + '𯄘' => '䄯', + '𯄙' => '穀', + '𯄚' => '穊', + '𯄛' => '穏', + 'đŻ„œ' => 'đ„„Œ', + 'đŻ„' => 'đ„Ș§', + '𯄞' => 'đ„Ș§', + 'đŻ„Ÿ' => '竟', + '𯄠' => '䈂', + '𯄥' => 'đ„ź«', + '𯄹' => '篆', + '𯄣' => '築', + '𯄀' => '䈧', + '𯄄' => 'đ„Ȁ', + '𯄊' => '糒', + '𯄧' => '䊠', + '𯄚' => 'çłš', + '𯄩' => '糣', + 'đŻ„Ș' => '简', + '𯄫' => 'đ„Ÿ†', + '𯄏' => '産', + '𯄭' => '䌁', + '𯄟' => '緇', + '𯄯' => '羂', + '𯄰' => 'çč…', + '𯄱' => '䌮', + 'đŻ„Č' => '𩈹', + '𯄳' => '𩉇', + '𯄎' => '䍙', + '𯄔' => '𩋙', + '𯄶' => 'çœș', + '𯄷' => 'đŠŒŸ', + '𯄞' => '矕', + 'đŻ„č' => 'çżș', + 'đŻ„ș' => '者', + '𯄻' => '𩓚', + 'đŻ„Œ' => '𩔣', + 'đŻ„œ' => '聠', + 'đŻ„Ÿ' => '𩖹', + '𯄿' => '聰', + '𯩀' => '𣍟', + '𯊁' => '䏕', + '𯩂' => 'è‚Č', + '𯊃' => '脃', + '𯩄' => '䐋', + '𯩅' => '脟', + '𯩆' => 'ćȘ”', + '𯩇' => '𩞧', + '𯊈' => 'đŠž”', + '𯩉' => '𣎓', + '𯩊' => '𣎜', + '𯩋' => '舁', + '𯩌' => '舄', + '𯩍' => '蟞', + '𯩎' => '䑫', + '𯩏' => '芑', + '𯊐' => '芋', + '𯩑' => '芝', + '𯩒' => '抳', + '𯩓' => '花', + '𯩔' => 'èŠł', + '𯩕' => '芜', + '𯩖' => '苊', + '𯩗' => 'đŠŹŒ', + '𯊘' => 'è‹„', + '𯩙' => '茝', + '𯩚' => 'èŁ', + '𯩛' => '莭', + '𯩜' => 'èŒŁ', + '𯩝' => '莜', + '𯩞' => '菧', + '𯩟' => '著', + '𯊠' => '荓', + '𯊥' => '菊', + '𯊹' => '菌', + '𯊣' => '菜', + '𯊀' => 'đŠ°¶', + '𯊄' => 'đŠ”«', + '𯊊' => '𩳕', + '𯊧' => '䔫', + '𯊚' => '蓱', + '𯊩' => 'è“ł', + 'đŻŠȘ' => '蔖', + '𯊫' => '𧏊', + '𯊏' => 'è•€', + '𯊭' => 'đŠŒŹ', + '𯊟' => '䕝', + '𯊯' => '䕡', + '𯊰' => 'đŠŸ±', + '𯊱' => '𧃒', + 'đŻŠČ' => '䕫', + '𯊳' => '虐', + '𯊎' => '虜', + '𯊔' => '虧', + '𯊶' => '虩', + '𯊷' => '蚩', + '𯊞' => '蚈', + 'đŻŠč' => '蜎', + 'đŻŠș' => 'è›ą', + '𯊻' => 'èč', + 'đŻŠŒ' => '蜚', + 'đŻŠœ' => '蝫', + 'đŻŠŸ' => '螆', + '𯊿' => '䗗', + '蟡' => 'èŸĄ', + '蠁' => '蠁', + '䗹' => 'ä—č', + '衠' => 'èĄ ', + '衣' => 'èĄŁ', + '𧙧' => '𧙧', + '裗' => 'èŁ—', + '裞' => 'èŁž', + '䘵' => '䘔', + '裺' => 'èŁș', + '㒻' => 'ă’»', + '𧢮' => 'đ§ąź', + '𧥦' => 'đ§„Š', + '䚾' => '䚟', + '䛇' => '䛇', + '誠' => 'èȘ ', + '諭' => 'è«­', + '變' => 'èźŠ', + '豕' => '豕', + '𧲨' => 'đ§Čš', + '貫' => 'èČ«', + '賁' => 'èł', + '贛' => '莛', + '起' => 'è”·', + '𧼯' => 'đ§ŒŻ', + '𠠄' => '𠠄', + '跋' => '跋', + '趼' => 'è¶Œ', + '跰' => 'è·°', + '𠣞' => '𠣞', + '軔' => '軔', + '輸' => '茞', + '𨗒' => '𹗒', + '𨜮' => '𹗭', + '䩶' => '邔', + '郱' => '郱', + '蟡' => '鄑', + '衣' => '𹜼', + '㒻' => '鄛', + '鈸' => '鈞', + '跋' => '鋗', + '鋘' => '鋘', + 'đݧȘ' => '鉌', + '鏹' => 'éč', + '誠' => '鐕', + '𨯺' => 'đšŻș', + '輸' => '開', + '䦕' => '䩕', + '閷' => '閷', + '𨵷' => 'đš”·', + 'đݧČ' => 'ä§Š', + '雃' => '雃', + '䛇' => 'ć¶Č', + '貫' => '霣', + '𩅅' => 'đ©……', + '𩈚' => 'đ©ˆš', + '軔' => '䩟', + 'đݧč' => 'ä©¶', + 'đݧș' => '韠', + '𩐊' => '𩐊', + 'đŻ§Œ' => 'äȘČ', + 'đŻ§œ' => 'đ©’–', + 'đŻ§Ÿ' => '頋', + '頋' => '頋', + '𯹀' => 'é ©', + '𯚁' => 'đ©–¶', + '𯹂' => '飹', + '𯚃' => '䏳', + '𯹄' => '逩', + '𯹅' => '銧', + '𯹆' => '駂', + '𯹇' => 'é§Ÿ', + '𯚈' => '䯎', + '𯹉' => '𩏰', + '𯹊' => '鬒', + '𯹋' => '鱀', + '𯹌' => 'éłœ', + '𯹍' => '䳎', + '𯹎' => 'äł­', + '𯹏' => 'é”§', + '𯚐' => 'đȘƒŽ', + '𯹑' => 'äłž', + '𯹒' => 'đȘ„…', + '𯹓' => 'đȘˆŽ', + '𯹔' => 'đȘŠ‘', + '𯹕' => 'éș»', + '𯹖' => 'ä”–', + '𯹗' => 'é»č', + '𯚘' => '黟', + '𯹙' => '錅', + '𯹚' => '錏', + '𯹛' => '錖', + '𯹜' => '錻', + '𯹝' => 'đȘ˜€', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php new file mode 100644 index 0000000..ec90f36 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/combiningClass.php @@ -0,0 +1,876 @@ + 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, +); diff --git a/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php new file mode 100644 index 0000000..1574902 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/Resources/unidata/compatibilityDecomposition.php @@ -0,0 +1,3695 @@ + ' ', + 'š' => ' ̈', + 'ÂȘ' => 'a', + 'ÂŻ' => ' ̄', + 'ÂČ' => '2', + 'Âł' => '3', + 'ÂŽ' => ' ́', + '”' => 'ÎŒ', + 'ž' => ' ̧', + 'Âč' => '1', + 'Âș' => 'o', + 'ÂŒ' => '1⁄4', + 'œ' => '1⁄2', + 'Ÿ' => '3⁄4', + 'ÄČ' => 'IJ', + 'Äł' => 'ij', + 'Äż' => 'L·', + 'ƀ' => 'l·', + 'Ɖ' => 'ÊŒn', + 'Ćż' => 's', + 'DŽ' => 'DŽ', + 'Dž' => 'Dž', + 'dž' => 'dž', + 'LJ' => 'LJ', + 'Lj' => 'Lj', + 'lj' => 'lj', + 'NJ' => 'NJ', + 'Nj' => 'Nj', + 'nj' => 'nj', + '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', + 'ïŹ' => 'fi', + 'ïŹ‚' => 'fl', + 'ïŹƒ' => 'ffi', + 'ïŹ„' => 'ffl', + 'ïŹ…' => 'st', + 'ïŹ†' => 'st', + 'ïŹ“' => 'ŐŽŐ¶', + 'ïŹ”' => 'ŐŽŐ„', + 'ïŹ•' => 'ŐŽŐ«', + 'ïŹ–' => 'ŐŸŐ¶', + 'ïŹ—' => 'ŐŽŐ­', + 'ïŹ ' => 'Śą', + 'ïŹĄ' => 'ڐ', + 'ïŹą' => 'Ś“', + 'ïŹŁ' => 'Ś”', + 'ïŹ€' => 'Ś›', + 'ïŹ„' => 'ڜ', + 'ïŹŠ' => 'Ś', + 'ïŹ§' => 'Śš', + 'ïŹš' => 'ŚȘ', + 'ïŹ©' => '+', + 'ﭏ' => 'ڐڜ', + 'ﭐ' => 'Ù±', + 'ﭑ' => 'Ù±', + 'ﭒ' => 'Ù»', + 'ﭓ' => 'Ù»', + 'ﭔ' => 'Ù»', + 'ﭕ' => 'Ù»', + 'ﭖ' => 'ÙŸ', + 'ﭗ' => 'ÙŸ', + 'ﭘ' => 'ÙŸ', + 'ﭙ' => 'ÙŸ', + 'ﭚ' => 'ڀ', + 'ﭛ' => 'ڀ', + 'ﭜ' => 'ڀ', + 'ﭝ' => 'ڀ', + 'ﭞ' => 'Ùș', + 'ﭟ' => 'Ùș', + 'ï­ ' => 'Ùș', + 'ï­Ą' => 'Ùș', + 'ï­ą' => 'Ùż', + 'ï­Ł' => 'Ùż', + 'ï­€' => 'Ùż', + 'ï­„' => 'Ùż', + 'ï­Š' => 'Ùč', + 'ï­§' => 'Ùč', + 'ï­š' => 'Ùč', + 'ï­©' => 'Ùč', + 'ï­Ș' => 'Ú€', + 'ï­«' => 'Ú€', + 'ï­Ź' => 'Ú€', + 'ï­­' => 'Ú€', + 'ï­ź' => 'ÚŠ', + 'ï­Ż' => 'ÚŠ', + 'ï­°' => 'ÚŠ', + 'ï­±' => 'ÚŠ', + 'ï­Č' => 'ڄ', + 'ï­ł' => 'ڄ', + 'ï­Ž' => 'ڄ', + 'ï­”' => 'ڄ', + 'ï­¶' => 'ڃ', + 'ï­·' => 'ڃ', + 'ï­ž' => 'ڃ', + 'ï­č' => 'ڃ', + 'ï­ș' => 'چ', + 'ï­»' => 'چ', + 'ï­Œ' => 'چ', + 'ï­œ' => 'چ', + 'ï­Ÿ' => 'ڇ', + 'ï­ż' => 'ڇ', + 'ïź€' => 'ڇ', + 'ïź' => 'ڇ', + 'ïź‚' => 'ڍ', + 'ïźƒ' => 'ڍ', + 'ïź„' => 'ڌ', + 'ïź…' => 'ڌ', + 'ïź†' => 'ڎ', + 'ïź‡' => 'ڎ', + 'ïźˆ' => 'ڈ', + 'ïź‰' => 'ڈ', + 'ïźŠ' => 'ژ', + 'ïź‹' => 'ژ', + 'ïźŒ' => 'ڑ', + 'ïź' => 'ڑ', + 'ïźŽ' => 'Ú©', + 'ïź' => 'Ú©', + 'ïź' => 'Ú©', + 'ïź‘' => 'Ú©', + 'ïź’' => 'ÚŻ', + 'ïź“' => 'ÚŻ', + 'ïź”' => 'ÚŻ', + 'ïź•' => 'ÚŻ', + 'ïź–' => 'Úł', + 'ïź—' => 'Úł', + 'ïź˜' => 'Úł', + 'ïź™' => 'Úł', + 'ïźš' => 'Ú±', + 'ïź›' => 'Ú±', + 'ïźœ' => 'Ú±', + 'ïź' => 'Ú±', + 'ïźž' => 'Úș', + 'ïźŸ' => 'Úș', + 'ïź ' => 'Ú»', + 'ïźĄ' => 'Ú»', + 'ïźą' => 'Ú»', + 'ïźŁ' => 'Ú»', + 'ïź€' => 'ۀ', + 'ïź„' => 'ۀ', + 'ïźŠ' => 'ہ', + 'ïź§' => 'ہ', + 'ïźš' => 'ہ', + 'ïź©' => 'ہ', + 'ïźȘ' => 'ÚŸ', + 'ïź«' => 'ÚŸ', + 'ïźŹ' => 'ÚŸ', + 'ïź­' => 'ÚŸ', + 'ïźź' => 'ے', + 'ïźŻ' => 'ے', + 'ïź°' => 'ۓ', + 'ïź±' => 'ۓ', + 'ïŻ“' => 'Ú­', + 'ïŻ”' => 'Ú­', + 'ïŻ•' => 'Ú­', + 'ïŻ–' => 'Ú­', + 'ïŻ—' => 'ۇ', + 'ïŻ˜' => 'ۇ', + 'ïŻ™' => 'ۆ', + 'ïŻš' => 'ۆ', + 'ïŻ›' => 'ۈ', + 'ïŻœ' => 'ۈ', + 'ïŻ' => 'Û‡ÙŽ', + 'ïŻž' => 'ۋ', + 'ïŻŸ' => 'ۋ', + 'ïŻ ' => 'ۅ', + 'ïŻĄ' => 'ۅ', + 'ïŻą' => 'ۉ', + 'ïŻŁ' => 'ۉ', + 'ïŻ€' => 'ې', + 'ïŻ„' => 'ې', + 'ïŻŠ' => 'ې', + 'ïŻ§' => 'ې', + 'ïŻš' => 'ى', + 'ïŻ©' => 'ى', + 'ïŻȘ' => 'ÙŠÙ”Ű§', + 'ïŻ«' => 'ÙŠÙ”Ű§', + 'ïŻŹ' => 'ئە', + 'ïŻ­' => 'ئە', + 'ïŻź' => 'ئو', + 'ïŻŻ' => 'ئو', + 'ïŻ°' => 'ئۇ', + 'ïŻ±' => 'ئۇ', + 'ïŻČ' => 'ئۆ', + 'ïŻł' => 'ئۆ', + 'ïŻŽ' => 'ئۈ', + 'ïŻ”' => 'ئۈ', + 'ïŻ¶' => 'ئې', + 'ïŻ·' => 'ئې', + 'ïŻž' => 'ئې', + 'ïŻč' => 'ئى', + 'ïŻș' => 'ئى', + 'ïŻ»' => 'ئى', + 'ïŻŒ' => 'ی', + 'ïŻœ' => 'ی', + 'ïŻŸ' => 'ی', + 'ïŻż' => 'ی', + 'ﰀ' => 'ÙŠÙ”ŰŹ', + 'ﰁ' => 'ÙŠÙ”Ű­', + 'ﰂ' => 'ئم', + 'ﰃ' => 'ئى', + 'ﰄ' => 'ئي', + 'ﰅ' => 'ۚۏ', + 'ﰆ' => 'ۭۚ', + 'ﰇ' => 'ۚ۟', + 'ﰈ' => 'ŰšÙ…', + 'ﰉ' => 'ŰšÙ‰', + 'ﰊ' => 'ŰšÙŠ', + 'ﰋ' => 'ŰȘŰŹ', + 'ﰌ' => 'ŰȘŰ­', + 'ﰍ' => 'ŰȘŰź', + 'ﰎ' => 'ŰȘم', + 'ﰏ' => 'ŰȘى', + 'ﰐ' => 'ŰȘي', + 'ﰑ' => '۫ۏ', + 'ﰒ' => 'Ű«Ù…', + 'ﰓ' => 'Ű«Ù‰', + 'ﰔ' => 'Ű«ÙŠ', + 'ﰕ' => 'ŰŹŰ­', + 'ﰖ' => 'ŰŹÙ…', + 'ﰗ' => 'Ű­ŰŹ', + 'ﰘ' => 'Ű­Ù…', + 'ﰙ' => '۟ۏ', + 'ﰚ' => 'ۭ۟', + 'ﰛ' => 'ŰźÙ…', + 'ﰜ' => '۳ۏ', + 'ﰝ' => '۳ۭ', + 'ﰞ' => '۳۟', + 'ﰟ' => 'ŰłÙ…', + 'ï° ' => '۔ۭ', + 'ï°Ą' => 'Ű”Ù…', + 'ï°ą' => '۶ۏ', + 'ï°Ł' => '۶ۭ', + 'ï°€' => '۶۟', + 'ï°„' => 'Ű¶Ù…', + 'ï°Š' => 'Ű·Ű­', + 'ï°§' => 'Ű·Ù…', + 'ï°š' => 'ŰžÙ…', + 'ï°©' => 'ŰčŰŹ', + 'ï°Ș' => 'Űčم', + 'ï°«' => 'ŰșŰŹ', + 'ï°Ź' => 'Űșم', + 'ï°­' => 'ÙŰŹ', + 'ï°ź' => 'ÙŰ­', + 'ï°Ż' => 'ÙŰź', + 'ï°°' => 'فم', + 'ï°±' => 'فى', + 'ï°Č' => 'في', + 'ï°ł' => 'Ù‚Ű­', + 'ï°Ž' => 'قم', + 'ï°”' => 'قى', + 'ï°¶' => 'قي', + 'ï°·' => 'ÙƒŰ§', + 'ï°ž' => 'ÙƒŰŹ', + 'ï°č' => 'ÙƒŰ­', + 'ï°ș' => 'ÙƒŰź', + 'ï°»' => 'كل', + 'ï°Œ' => 'كم', + 'ï°œ' => 'كى', + 'ï°Ÿ' => 'كي', + 'ï°ż' => 'Ù„ŰŹ', + 'ﱀ' => 'Ù„Ű­', + 'ﱁ' => 'Ù„Űź', + 'ﱂ' => 'لم', + 'ﱃ' => 'لى', + 'ﱄ' => 'لي', + 'ﱅ' => 'Ù…ŰŹ', + 'ﱆ' => 'Ù…Ű­', + 'ﱇ' => 'Ù…Űź', + 'ﱈ' => 'مم', + 'ﱉ' => 'مى', + 'ﱊ' => 'مي', + 'ﱋ' => 'Ù†ŰŹ', + 'ﱌ' => 'Ù†Ű­', + 'ﱍ' => 'Ù†Űź', + 'ﱎ' => 'نم', + 'ﱏ' => 'نى', + 'ﱐ' => 'ني', + 'ﱑ' => 'Ù‡ŰŹ', + 'ﱒ' => 'هم', + 'ﱓ' => 'هى', + 'ﱔ' => 'هي', + 'ﱕ' => 'ÙŠŰŹ', + 'ﱖ' => 'ÙŠŰ­', + 'ﱗ' => 'ÙŠŰź', + 'ﱘ' => 'يم', + 'ﱙ' => 'يى', + 'ﱚ' => 'يي', + 'ﱛ' => 'Ű°Ù°', + 'ﱜ' => 'Ű±Ù°', + 'ﱝ' => 'ىٰ', + 'ﱞ' => ' ٌّ', + 'ﱟ' => ' ٍّ', + 'ï± ' => ' َّ', + 'ï±Ą' => ' ُّ', + 'ï±ą' => ' ِّ', + 'ï±Ł' => ' ّٰ', + 'ï±€' => 'ÙŠÙ”Ű±', + 'ﱄ' => 'ئŰČ', + 'ﱊ' => 'ئم', + 'ï±§' => 'ئن', + 'ﱚ' => 'ئى', + 'ﱩ' => 'ئي', + 'ï±Ș' => 'ۚ۱', + 'ﱫ' => 'ŰšŰČ', + 'ï±Ź' => 'ŰšÙ…', + 'ï±­' => 'ŰšÙ†', + 'ï±ź' => 'ŰšÙ‰', + 'ï±Ż' => 'ŰšÙŠ', + 'ï±°' => 'ŰȘ۱', + 'ï±±' => 'ŰȘŰČ', + 'ï±Č' => 'ŰȘم', + 'ï±ł' => 'ŰȘن', + 'ﱎ' => 'ŰȘى', + 'ï±”' => 'ŰȘي', + 'ï±¶' => '۫۱', + 'ï±·' => 'Ű«ŰČ', + 'ﱞ' => 'Ű«Ù…', + 'ï±č' => 'Ű«Ù†', + 'ï±ș' => 'Ű«Ù‰', + 'ï±»' => 'Ű«ÙŠ', + 'ﱌ' => 'فى', + 'ﱜ' => 'في', + 'ﱟ' => 'قى', + 'ï±ż' => 'قي', + 'ïȀ' => 'ÙƒŰ§', + 'ïȁ' => 'كل', + 'ïȂ' => 'كم', + 'ïȃ' => 'كى', + 'ïȄ' => 'كي', + 'ïȅ' => 'لم', + 'ïȆ' => 'لى', + 'ïȇ' => 'لي', + 'ïȈ' => 'Ù…Ű§', + 'ïȉ' => 'مم', + 'ïȊ' => 'Ù†Ű±', + 'ïȋ' => 'نŰČ', + 'ïȌ' => 'نم', + 'ïȍ' => 'نن', + 'ïȎ' => 'نى', + 'ïȏ' => 'ني', + 'ïȐ' => 'ىٰ', + 'ïȑ' => 'ÙŠŰ±', + 'ïȒ' => 'يŰČ', + 'ïȓ' => 'يم', + 'ïȔ' => 'ين', + 'ïȕ' => 'يى', + 'ïȖ' => 'يي', + 'ïȗ' => 'ÙŠÙ”ŰŹ', + 'ïȘ' => 'ÙŠÙ”Ű­', + 'ïș' => 'ÙŠÙ”Űź', + 'ïȚ' => 'ئم', + 'ïț' => 'ئه', + 'ïȜ' => 'ۚۏ', + 'ïȝ' => 'ۭۚ', + 'ïȞ' => 'ۚ۟', + 'ïȟ' => 'ŰšÙ…', + 'ïČ ' => 'ŰšÙ‡', + 'ïČĄ' => 'ŰȘŰŹ', + 'ïČą' => 'ŰȘŰ­', + 'ïČŁ' => 'ŰȘŰź', + 'ïČ€' => 'ŰȘم', + 'ïČ„' => 'ŰȘه', + 'ïČŠ' => 'Ű«Ù…', + 'ïȧ' => 'ŰŹŰ­', + 'ïČš' => 'ŰŹÙ…', + 'ïČ©' => 'Ű­ŰŹ', + 'ïČȘ' => 'Ű­Ù…', + 'ïČ«' => '۟ۏ', + 'ïČŹ' => 'ŰźÙ…', + 'ïČ­' => '۳ۏ', + 'ïČź' => '۳ۭ', + 'ïČŻ' => '۳۟', + 'ïȰ' => 'ŰłÙ…', + 'ïȱ' => '۔ۭ', + 'ïČČ' => '۔۟', + 'ïČł' => 'Ű”Ù…', + 'ïČŽ' => '۶ۏ', + 'ïČ”' => '۶ۭ', + 'ïȶ' => '۶۟', + 'ïČ·' => 'Ű¶Ù…', + 'ïČž' => 'Ű·Ű­', + 'ïČč' => 'ŰžÙ…', + 'ïČș' => 'ŰčŰŹ', + 'ïČ»' => 'Űčم', + 'ïČŒ' => 'ŰșŰŹ', + 'ïČœ' => 'Űșم', + 'ïČŸ' => 'ÙŰŹ', + 'ïČż' => 'ÙŰ­', + 'ïł€' => 'ÙŰź', + 'ïł' => 'فم', + 'ïł‚' => 'Ù‚Ű­', + 'ïłƒ' => 'قم', + 'ïł„' => 'ÙƒŰŹ', + 'ïł…' => 'ÙƒŰ­', + 'ïł†' => 'ÙƒŰź', + 'ïł‡' => 'كل', + 'ïłˆ' => 'كم', + 'ïł‰' => 'Ù„ŰŹ', + 'ïłŠ' => 'Ù„Ű­', + 'ïł‹' => 'Ù„Űź', + 'ïłŒ' => 'لم', + 'ïł' => 'له', + 'ïłŽ' => 'Ù…ŰŹ', + 'ïł' => 'Ù…Ű­', + 'ïł' => 'Ù…Űź', + 'ïł‘' => 'مم', + 'ïł’' => 'Ù†ŰŹ', + 'ïł“' => 'Ù†Ű­', + 'ïł”' => 'Ù†Űź', + 'ïł•' => 'نم', + 'ïł–' => 'نه', + 'ïł—' => 'Ù‡ŰŹ', + 'ïł˜' => 'هم', + 'ïł™' => 'هٰ', + 'ïłš' => 'ÙŠŰŹ', + 'ïł›' => 'ÙŠŰ­', + 'ïłœ' => 'ÙŠŰź', + 'ïł' => 'يم', + 'ïłž' => 'يه', + 'ïłŸ' => 'ئم', + 'ïł ' => 'ئه', + 'ïłĄ' => 'ŰšÙ…', + 'ïłą' => 'ŰšÙ‡', + 'ïłŁ' => 'ŰȘم', + 'ïł€' => 'ŰȘه', + 'ïł„' => 'Ű«Ù…', + 'ïłŠ' => 'Ű«Ù‡', + 'ïł§' => 'ŰłÙ…', + 'ïłš' => 'ŰłÙ‡', + 'ïł©' => 'ŰŽÙ…', + 'ïłȘ' => 'ŰŽÙ‡', + 'ïł«' => 'كل', + 'ïłŹ' => 'كم', + 'ïł­' => 'لم', + 'ïłź' => 'نم', + 'ïłŻ' => 'نه', + 'ïł°' => 'يم', + 'ïł±' => 'يه', + 'ïłČ' => 'ـَّ', + 'ïłł' => 'ـُّ', + 'ïłŽ' => 'ـِّ', + 'ïł”' => 'Ű·Ù‰', + 'ïł¶' => 'Ű·ÙŠ', + 'ïł·' => 'Űčى', + 'ïłž' => 'Űčي', + 'ïłč' => 'Űșى', + 'ïłș' => 'Űșي', + 'ïł»' => 'ŰłÙ‰', + 'ïłŒ' => 'ŰłÙŠ', + 'ïłœ' => 'ŰŽÙ‰', + 'ïłŸ' => 'ŰŽÙŠ', + 'ïłż' => 'Ű­Ù‰', + '' => 'Ű­ÙŠ', + '' => 'ŰŹÙ‰', + '' => 'ŰŹÙŠ', + '' => 'ŰźÙ‰', + '' => 'ŰźÙŠ', + '' => 'Ű”Ù‰', + '' => 'Ű”ÙŠ', + '' => 'Ű¶Ù‰', + '' => 'Ű¶ÙŠ', + '' => 'ŰŽŰŹ', + '' => 'ŰŽŰ­', + '' => 'ŰŽŰź', + '' => 'ŰŽÙ…', + '' => 'ێ۱', + '' => '۳۱', + '' => '۔۱', + '' => '۶۱', + '' => 'Ű·Ù‰', + '' => 'Ű·ÙŠ', + '' => 'Űčى', + '' => 'Űčي', + '' => 'Űșى', + '' => 'Űșي', + '' => 'ŰłÙ‰', + '' => 'ŰłÙŠ', + '' => 'ŰŽÙ‰', + '' => 'ŰŽÙŠ', + '' => 'Ű­Ù‰', + '' => 'Ű­ÙŠ', + '' => 'ŰŹÙ‰', + '' => 'ŰŹÙŠ', + '' => 'ŰźÙ‰', + '' => 'ŰźÙŠ', + 'ïŽĄ' => 'Ű”Ù‰', + 'ïŽą' => 'Ű”ÙŠ', + 'ïŽŁ' => 'Ű¶Ù‰', + '' => 'Ű¶ÙŠ', + '' => 'ŰŽŰŹ', + '' => 'ŰŽŰ­', + '' => 'ŰŽŰź', + '' => 'ŰŽÙ…', + '' => 'ێ۱', + 'ïŽȘ' => '۳۱', + '' => '۔۱', + 'ïŽŹ' => '۶۱', + '' => 'ŰŽŰŹ', + 'ïŽź' => 'ŰŽŰ­', + 'ïŽŻ' => 'ŰŽŰź', + '' => 'ŰŽÙ…', + '' => 'ŰłÙ‡', + 'ïŽČ' => 'ŰŽÙ‡', + 'ïŽł' => 'Ű·Ù…', + '' => '۳ۏ', + '' => '۳ۭ', + '' => '۳۟', + '' => 'ŰŽŰŹ', + '' => 'ŰŽŰ­', + 'ïŽč' => 'ŰŽŰź', + 'ïŽș' => 'Ű·Ù…', + '' => 'ŰžÙ…', + '' => 'Ű§Ù‹', + '' => 'Ű§Ù‹', + '' => 'ŰȘŰŹÙ…', + '' => 'ŰȘŰ­ŰŹ', + 'ï”’' => 'ŰȘŰ­ŰŹ', + '' => 'ŰȘŰ­Ù…', + 'ï””' => 'ŰȘŰźÙ…', + '' => 'ŰȘÙ…ŰŹ', + 'ï”–' => 'ŰȘÙ…Ű­', + 'ï”—' => 'ŰȘÙ…Űź', + '' => 'ŰŹÙ…Ű­', + 'ï”™' => 'ŰŹÙ…Ű­', + '' => 'Ű­Ù…ÙŠ', + 'ï”›' => 'Ű­Ù…Ù‰', + '' => '۳ۭۏ', + '' => '۳ۏۭ', + '' => 'ŰłŰŹÙ‰', + '' => 'ŰłÙ…Ű­', + 'ï” ' => 'ŰłÙ…Ű­', + 'ï”Ą' => 'ŰłÙ…ŰŹ', + 'ï”ą' => 'ŰłÙ…Ù…', + 'ï”Ł' => 'ŰłÙ…Ù…', + '' => '۔ۭۭ', + '' => '۔ۭۭ', + '' => 'Ű”Ù…Ù…', + 'ï”§' => 'ŰŽŰ­Ù…', + '' => 'ŰŽŰ­Ù…', + '' => 'ŰŽŰŹÙŠ', + 'ï”Ș' => 'ŰŽÙ…Űź', + '' => 'ŰŽÙ…Űź', + 'ï”Ź' => 'ŰŽÙ…Ù…', + 'ï”­' => 'ŰŽÙ…Ù…', + 'ï”ź' => 'Ű¶Ű­Ù‰', + 'ï”Ż' => 'Ű¶ŰźÙ…', + 'ï”°' => 'Ű¶ŰźÙ…', + 'ï”±' => 'Ű·Ù…Ű­', + 'ï”Č' => 'Ű·Ù…Ű­', + 'ï”ł' => 'Ű·Ù…Ù…', + '' => 'Ű·Ù…ÙŠ', + 'ï””' => 'ŰčŰŹÙ…', + 'ï”¶' => 'Űčمم', + 'ï”·' => 'Űčمم', + '' => 'Űčمى', + 'ï”č' => 'Űșمم', + 'ï”ș' => 'Űșمي', + 'ï”»' => 'Űșمى', + '' => 'ÙŰźÙ…', + '' => 'ÙŰźÙ…', + '' => 'Ù‚Ù…Ű­', + 'ï”ż' => 'قمم', + 'ﶀ' => 'Ù„Ű­Ù…', + 'ﶁ' => 'Ù„Ű­ÙŠ', + 'ﶂ' => 'Ù„Ű­Ù‰', + 'ﶃ' => 'Ù„ŰŹŰŹ', + 'ﶄ' => 'Ù„ŰŹŰŹ', + 'ﶅ' => 'Ù„ŰźÙ…', + 'ﶆ' => 'Ù„ŰźÙ…', + 'ﶇ' => 'Ù„Ù…Ű­', + 'ﶈ' => 'Ù„Ù…Ű­', + 'ﶉ' => 'Ù…Ű­ŰŹ', + 'ﶊ' => 'Ù…Ű­Ù…', + 'ﶋ' => 'Ù…Ű­ÙŠ', + 'ﶌ' => 'Ù…ŰŹŰ­', + 'ﶍ' => 'Ù…ŰŹÙ…', + 'ﶎ' => 'Ù…ŰźŰŹ', + 'ﶏ' => 'Ù…ŰźÙ…', + 'ﶒ' => 'Ù…ŰŹŰź', + 'ﶓ' => 'Ù‡Ù…ŰŹ', + 'ﶔ' => 'همم', + 'ﶕ' => 'Ù†Ű­Ù…', + 'ﶖ' => 'Ù†Ű­Ù‰', + 'ﶗ' => 'Ù†ŰŹÙ…', + 'ﶘ' => 'Ù†ŰŹÙ…', + 'ﶙ' => 'Ù†ŰŹÙ‰', + 'ﶚ' => 'نمي', + 'ﶛ' => 'نمى', + 'ﶜ' => 'يمم', + 'ﶝ' => 'يمم', + 'ﶞ' => 'ŰšŰźÙŠ', + 'ﶟ' => 'ŰȘŰŹÙŠ', + 'ï¶ ' => 'ŰȘŰŹÙ‰', + 'ï¶Ą' => 'ŰȘŰźÙŠ', + 'ï¶ą' => 'ŰȘŰźÙ‰', + 'ï¶Ł' => 'ŰȘمي', + 'ï¶€' => 'ŰȘمى', + 'ï¶„' => 'ŰŹÙ…ÙŠ', + 'ï¶Š' => 'ŰŹŰ­Ù‰', + 'ï¶§' => 'ŰŹÙ…Ù‰', + 'ï¶š' => 'ŰłŰźÙ‰', + 'ï¶©' => 'Ű”Ű­ÙŠ', + 'ï¶Ș' => 'ŰŽŰ­ÙŠ', + 'ï¶«' => 'Ű¶Ű­ÙŠ', + 'ï¶Ź' => 'Ù„ŰŹÙŠ', + 'ï¶­' => 'لمي', + 'ï¶ź' => 'ÙŠŰ­ÙŠ', + 'ï¶Ż' => 'ÙŠŰŹÙŠ', + 'ï¶°' => 'يمي', + 'ï¶±' => 'ممي', + 'ï¶Č' => 'قمي', + 'ï¶ł' => 'Ù†Ű­ÙŠ', + 'ï¶Ž' => 'Ù‚Ù…Ű­', + 'ï¶”' => 'Ù„Ű­Ù…', + 'ï¶¶' => 'Űčمي', + 'ï¶·' => 'كمي', + 'ï¶ž' => 'Ù†ŰŹŰ­', + 'ï¶č' => 'Ù…ŰźÙŠ', + 'ï¶ș' => 'Ù„ŰŹÙ…', + 'ï¶»' => 'كمم', + 'ï¶Œ' => 'Ù„ŰŹÙ…', + 'ï¶œ' => 'Ù†ŰŹŰ­', + 'ï¶Ÿ' => 'ŰŹŰ­ÙŠ', + 'ï¶ż' => 'Ű­ŰŹÙŠ', + 'ﷀ' => 'Ù…ŰŹÙŠ', + 'ﷁ' => 'فمي', + 'ﷂ' => 'ŰšŰ­ÙŠ', + 'ﷃ' => 'كمم', + 'ﷄ' => 'ŰčŰŹÙ…', + 'ﷅ' => 'Ű”Ù…Ù…', + 'ﷆ' => 'ŰłŰźÙŠ', + 'ﷇ' => 'Ù†ŰŹÙŠ', + 'ï·°' => 'Ű”Ù„Û’', + 'ï·±' => 'قلے', + 'ï·Č' => 'Ű§Ù„Ù„Ù‡', + 'ï·ł' => 'Ű§ÙƒŰšŰ±', + 'ï·Ž' => 'Ù…Ű­Ù…ŰŻ', + 'ï·”' => 'Ű”Ù„Űčم', + 'ï·¶' => 'Ű±ŰłÙˆÙ„', + 'ï··' => 'Űčليه', + 'ï·ž' => 'ÙˆŰłÙ„Ù…', + 'ï·č' => 'Ű”Ù„Ù‰', + 'ï·ș' => 'Ű”Ù„Ù‰ Ű§Ù„Ù„Ù‡ Űčليه ÙˆŰłÙ„Ù…', + 'ï·»' => 'ŰŹÙ„ ŰŹÙ„Ű§Ù„Ù‡', + 'ï·Œ' => 'Ű±ÛŒŰ§Ù„', + '' => ',', + 'ïž‘' => '、', + 'ïž’' => '。', + 'ïž“' => ':', + 'ïž”' => ';', + 'ïž•' => '!', + 'ïž–' => '?', + 'ïž—' => '〖', + '' => '〗', + 'ïž™' => '...', + 'ïž°' => '..', + 'ïž±' => '—', + 'ïžČ' => '–', + 'ïžł' => '_', + '' => '_', + 'ïž”' => '(', + 'ïž¶' => ')', + 'ïž·' => '{', + 'ïžž' => '}', + 'ïžč' => '〔', + 'ïžș' => '〕', + 'ïž»' => '【', + '' => '】', + 'ïžœ' => '《', + '' => '》', + 'ïžż' => '〈', + 'ïč€' => '〉', + 'ïč' => '「', + 'ïč‚' => '」', + 'ïčƒ' => '『', + 'ïč„' => '』', + 'ïč‡' => '[', + 'ïčˆ' => ']', + 'ïč‰' => ' ̅', + 'ïčŠ' => ' ̅', + 'ïč‹' => ' ̅', + 'ïčŒ' => ' ̅', + 'ïč' => '_', + 'ïčŽ' => '_', + 'ïč' => '_', + 'ïč' => ',', + 'ïč‘' => '、', + 'ïč’' => '.', + 'ïč”' => ';', + 'ïč•' => ':', + 'ïč–' => '?', + 'ïč—' => '!', + 'ïč˜' => '—', + 'ïč™' => '(', + 'ïčš' => ')', + 'ïč›' => '{', + 'ïčœ' => '}', + 'ïč' => '〔', + 'ïčž' => '〕', + 'ïčŸ' => '#', + 'ïč ' => '&', + 'ïčĄ' => '*', + 'ïčą' => '+', + 'ïčŁ' => '-', + 'ïč€' => '<', + 'ïč„' => '>', + 'ïčŠ' => '=', + 'ïčš' => '\\', + 'ïč©' => '$', + 'ïčȘ' => '%', + 'ïč«' => '@', + 'ïč°' => ' ً', + 'ïč±' => 'ـً', + 'ïčČ' => ' ٌ', + 'ïčŽ' => ' ٍ', + 'ïč¶' => ' َ', + 'ïč·' => 'ـَ', + 'ïčž' => ' ُ', + 'ïčč' => 'ـُ', + 'ïčș' => ' ِ', + 'ïč»' => 'ـِ', + 'ïčŒ' => ' ّ', + 'ïčœ' => 'ـّ', + 'ïčŸ' => ' ْ', + 'ïčż' => 'ـْ', + 'ïș€' => 'ŰĄ', + 'ïș' => 'Ű§Ù“', + 'ïș‚' => 'Ű§Ù“', + 'ïșƒ' => 'Ű§Ù”', + 'ïș„' => 'Ű§Ù”', + 'ïș…' => 'ؤ', + 'ïș†' => 'ؤ', + 'ïș‡' => 'Ű§Ù•', + 'ïșˆ' => 'Ű§Ù•', + 'ïș‰' => 'ئ', + 'ïșŠ' => 'ئ', + 'ïș‹' => 'ئ', + 'ïșŒ' => 'ئ', + 'ïș' => 'ۧ', + 'ïșŽ' => 'ۧ', + 'ïș' => 'Űš', + 'ïș' => 'Űš', + 'ïș‘' => 'Űš', + 'ïș’' => 'Űš', + 'ïș“' => 'Ű©', + 'ïș”' => 'Ű©', + 'ïș•' => 'ŰȘ', + 'ïș–' => 'ŰȘ', + 'ïș—' => 'ŰȘ', + 'ïș˜' => 'ŰȘ', + 'ïș™' => 'Ű«', + 'ïșš' => 'Ű«', + 'ïș›' => 'Ű«', + 'ïșœ' => 'Ű«', + 'ïș' => 'ŰŹ', + 'ïșž' => 'ŰŹ', + 'ïșŸ' => 'ŰŹ', + 'ïș ' => 'ŰŹ', + 'ïșĄ' => 'Ű­', + 'ïșą' => 'Ű­', + 'ïșŁ' => 'Ű­', + 'ïș€' => 'Ű­', + 'ïș„' => 'Űź', + 'ïșŠ' => 'Űź', + 'ïș§' => 'Űź', + 'ïșš' => 'Űź', + 'ïș©' => 'ŰŻ', + 'ïșȘ' => 'ŰŻ', + 'ïș«' => '۰', + 'ïșŹ' => '۰', + 'ïș­' => '۱', + 'ïșź' => '۱', + 'ïșŻ' => 'ŰČ', + 'ïș°' => 'ŰČ', + 'ïș±' => 'Űł', + 'ïșČ' => 'Űł', + 'ïșł' => 'Űł', + 'ïșŽ' => 'Űł', + 'ïș”' => 'ŰŽ', + 'ïș¶' => 'ŰŽ', + 'ïș·' => 'ŰŽ', + 'ïșž' => 'ŰŽ', + 'ïșč' => 'Ű”', + 'ïșș' => 'Ű”', + 'ïș»' => 'Ű”', + 'ïșŒ' => 'Ű”', + 'ïșœ' => '۶', + 'ïșŸ' => '۶', + 'ïșż' => '۶', + 'ﻀ' => '۶', + 'ﻁ' => 'Ű·', + 'ﻂ' => 'Ű·', + 'ﻃ' => 'Ű·', + 'ﻄ' => 'Ű·', + 'ﻅ' => 'Űž', + 'ﻆ' => 'Űž', + 'ﻇ' => 'Űž', + 'ﻈ' => 'Űž', + 'ﻉ' => 'Űč', + 'ﻊ' => 'Űč', + 'ﻋ' => 'Űč', + 'ﻌ' => 'Űč', + 'ﻍ' => 'Űș', + 'ﻎ' => 'Űș', + 'ﻏ' => 'Űș', + 'ﻐ' => 'Űș', + 'ﻑ' => 'ف', + 'ﻒ' => 'ف', + 'ﻓ' => 'ف', + 'ﻔ' => 'ف', + 'ﻕ' => 'ق', + 'ﻖ' => 'ق', + 'ﻗ' => 'ق', + 'ﻘ' => 'ق', + 'ﻙ' => 'ك', + 'ﻚ' => 'ك', + 'ﻛ' => 'ك', + 'ﻜ' => 'ك', + 'ﻝ' => 'ل', + 'ﻞ' => 'ل', + 'ﻟ' => 'ل', + 'ï» ' => 'ل', + 'ï»Ą' => 'م', + 'ï»ą' => 'م', + 'ï»Ł' => 'م', + 'ﻀ' => 'م', + 'ﻄ' => 'ن', + 'ﻊ' => 'ن', + 'ï»§' => 'ن', + 'ﻚ' => 'ن', + 'ﻩ' => 'ه', + 'ï»Ș' => 'ه', + 'ﻫ' => 'ه', + 'ï»Ź' => 'ه', + 'ï»­' => 'و', + 'ï»ź' => 'و', + 'ï»Ż' => 'ى', + 'ï»°' => 'ى', + 'ï»±' => 'ي', + 'ï»Č' => 'ي', + 'ï»ł' => 'ي', + 'ﻎ' => 'ي', + 'ï»”' => 'Ù„Ű§Ù“', + 'ï»¶' => 'Ù„Ű§Ù“', + 'ï»·' => 'Ù„Ű§Ù”', + 'ﻞ' => 'Ù„Ű§Ù”', + 'ï»č' => 'Ù„Ű§Ù•', + 'ï»ș' => 'Ù„Ű§Ù•', + 'ï»»' => 'Ù„Ű§', + 'ﻌ' => 'Ù„Ű§', + '' => '!', + '' => '"', + '' => '#', + '' => '$', + '' => '%', + '' => '&', + '' => '\'', + '' => '(', + '' => ')', + '' => '*', + '' => '+', + '' => ',', + '' => '-', + '' => '.', + '' => '/', + '' => '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', + '' => '[', + '' => '\\', + '' => ']', + '' => '^', + 'ïŒż' => '_', + '' => '`', + '' => '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', + '𝑖' => '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', +); diff --git a/vendor/symfony/polyfill-intl-normalizer/bootstrap.php b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php new file mode 100644 index 0000000..ba62006 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/bootstrap.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use Symfony\Polyfill\Intl\Normalizer as p; + +if (!function_exists('normalizer_is_normalized')) { + function normalizer_is_normalized($s, $form = p\Normalizer::NFC) { return p\Normalizer::isNormalized($s, $form); } +} +if (!function_exists('normalizer_normalize')) { + function normalizer_normalize($s, $form = p\Normalizer::NFC) { return p\Normalizer::normalize($s, $form); } +} diff --git a/vendor/symfony/polyfill-intl-normalizer/composer.json b/vendor/symfony/polyfill-intl-normalizer/composer.json new file mode 100644 index 0000000..b0986a8 --- /dev/null +++ b/vendor/symfony/polyfill-intl-normalizer/composer.json @@ -0,0 +1,39 @@ +{ + "name": "symfony/polyfill-intl-normalizer", + "type": "library", + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "keywords": ["polyfill", "shim", "compatibility", "portable", "intl", "normalizer"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "suggest": { + "ext-intl": "For best performance" + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php70/LICENSE b/vendor/symfony/polyfill-php70/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-php70/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php70/Php70.php b/vendor/symfony/polyfill-php70/Php70.php new file mode 100644 index 0000000..7f1ad08 --- /dev/null +++ b/vendor/symfony/polyfill-php70/Php70.php @@ -0,0 +1,74 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace 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; + } +} diff --git a/vendor/symfony/polyfill-php70/README.md b/vendor/symfony/polyfill-php70/README.md new file mode 100644 index 0000000..abd5488 --- /dev/null +++ b/vendor/symfony/polyfill-php70/README.md @@ -0,0 +1,28 @@ +Symfony Polyfill / Php70 +======================== + +This component provides features unavailable in releases prior to PHP 7.0: + +- [`intdiv`](https://php.net/intdiv) +- [`preg_replace_callback_array`](https://php.net/preg_replace_callback_array) +- [`error_clear_last`](https://php.net/error_clear_last) +- `random_bytes` and `random_int` (from [paragonie/random_compat](https://github.com/paragonie/random_compat)) +- [`*Error` throwable classes](https://php.net/Error) +- [`PHP_INT_MIN`](https://php.net/reserved.constants#constant.php-int-min) +- `SessionUpdateTimestampHandlerInterface` + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +Compatibility notes +=================== + +To write portable code between PHP5 and PHP7, some care must be taken: +- `\*Error` exceptions must be caught before `\Exception`; +- after calling `error_clear_last()`, the result of `$e = error_get_last()` must be + verified using `isset($e['message'][0])` instead of `null !== $e`. + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php b/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php new file mode 100644 index 0000000..6819124 --- /dev/null +++ b/vendor/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php @@ -0,0 +1,5 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use 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($dividend, $divisor) { return p\Php70::intdiv($dividend, $divisor); } +} +if (!function_exists('preg_replace_callback_array')) { + function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0) { return p\Php70::preg_replace_callback_array($patterns, $subject, $limit, $count); } +} +if (!function_exists('error_clear_last')) { + function error_clear_last() { return p\Php70::error_clear_last(); } +} diff --git a/vendor/symfony/polyfill-php70/composer.json b/vendor/symfony/polyfill-php70/composer.json new file mode 100644 index 0000000..771a6f6 --- /dev/null +++ b/vendor/symfony/polyfill-php70/composer.json @@ -0,0 +1,37 @@ +{ + "name": "symfony/polyfill-php70", + "type": "library", + "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3", + "paragonie/random_compat": "~1.0|~2.0|~9.99" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php70\\": "" }, + "files": [ "bootstrap.php" ], + "classmap": [ "Resources/stubs" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/symfony/polyfill-php72/LICENSE b/vendor/symfony/polyfill-php72/LICENSE new file mode 100644 index 0000000..4cd8bdd --- /dev/null +++ b/vendor/symfony/polyfill-php72/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2015-2019 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/symfony/polyfill-php72/Php72.php b/vendor/symfony/polyfill-php72/Php72.php new file mode 100644 index 0000000..9b3edc7 --- /dev/null +++ b/vendor/symfony/polyfill-php72/Php72.php @@ -0,0 +1,217 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace 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] & "\x3F"); + $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 ? 0020000 === ($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; + } +} diff --git a/vendor/symfony/polyfill-php72/README.md b/vendor/symfony/polyfill-php72/README.md new file mode 100644 index 0000000..59dec8a --- /dev/null +++ b/vendor/symfony/polyfill-php72/README.md @@ -0,0 +1,28 @@ +Symfony Polyfill / Php72 +======================== + +This component provides functions added to PHP 7.2 core: + +- [`spl_object_id`](https://php.net/spl_object_id) +- [`stream_isatty`](https://php.net/stream_isatty) + +On Windows only: + +- [`sapi_windows_vt100_support`](https://php.net/sapi_windows_vt100_support) + +Moved to core since 7.2 (was in the optional XML extension earlier): + +- [`utf8_encode`](https://php.net/utf8_encode) +- [`utf8_decode`](https://php.net/utf8_decode) + +Also, it provides constants added to PHP 7.2: +- [`PHP_FLOAT_*`](https://php.net/reserved.constants#constant.php-float-dig) +- [`PHP_OS_FAMILY`](https://php.net/reserved.constants#constant.php-os-family) + +More information can be found in the +[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md). + +License +======= + +This library is released under the [MIT license](LICENSE). diff --git a/vendor/symfony/polyfill-php72/bootstrap.php b/vendor/symfony/polyfill-php72/bootstrap.php new file mode 100644 index 0000000..a27a900 --- /dev/null +++ b/vendor/symfony/polyfill-php72/bootstrap.php @@ -0,0 +1,57 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +use 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($s) { return p\Php72::utf8_encode($s); } +} +if (!function_exists('utf8_decode')) { + function utf8_decode($s) { return p\Php72::utf8_decode($s); } +} +if (!function_exists('spl_object_id')) { + function spl_object_id($s) { return p\Php72::spl_object_id($s); } +} +if (!function_exists('mb_ord')) { + function mb_ord($s, $enc = null) { return p\Php72::mb_ord($s, $enc); } +} +if (!function_exists('mb_chr')) { + function mb_chr($code, $enc = null) { return p\Php72::mb_chr($code, $enc); } +} +if (!function_exists('mb_scrub')) { + function mb_scrub($s, $enc = null) { $enc = null === $enc ? mb_internal_encoding() : $enc; return mb_convert_encoding($s, $enc, $enc); } +} diff --git a/vendor/symfony/polyfill-php72/composer.json b/vendor/symfony/polyfill-php72/composer.json new file mode 100644 index 0000000..e295cab --- /dev/null +++ b/vendor/symfony/polyfill-php72/composer.json @@ -0,0 +1,35 @@ +{ + "name": "symfony/polyfill-php72", + "type": "library", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "keywords": ["polyfill", "shim", "compatibility", "portable"], + "homepage": "https://symfony.com", + "license": "MIT", + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "require": { + "php": ">=5.3.3" + }, + "autoload": { + "psr-4": { "Symfony\\Polyfill\\Php72\\": "" }, + "files": [ "bootstrap.php" ] + }, + "minimum-stability": "dev", + "extra": { + "branch-alias": { + "dev-master": "1.18-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + } +} diff --git a/vendor/tumblr/tumblr/.gitignore b/vendor/tumblr/tumblr/.gitignore new file mode 100644 index 0000000..2e61014 --- /dev/null +++ b/vendor/tumblr/tumblr/.gitignore @@ -0,0 +1,12 @@ +coverage +.DS_Store + +composer.phar + +*.swp +*.swo + +usage.php + +vendor +composer.lock diff --git a/vendor/tumblr/tumblr/.travis.yml b/vendor/tumblr/tumblr/.travis.yml new file mode 100644 index 0000000..4986ae4 --- /dev/null +++ b/vendor/tumblr/tumblr/.travis.yml @@ -0,0 +1,12 @@ +language: php +before_script: composer install + +php: + - 7.1 + - 7.0 + - 5.6 + - hhvm + +matrix: + allow_failures: + - php: hhvm diff --git a/vendor/tumblr/tumblr/CONTRIBUTING.md b/vendor/tumblr/tumblr/CONTRIBUTING.md new file mode 100644 index 0000000..e6d97d1 --- /dev/null +++ b/vendor/tumblr/tumblr/CONTRIBUTING.md @@ -0,0 +1,22 @@ +# Contributing + +We want to make contributing to tumblr.php as easy and transparent as possible. If you run into problems, please open an issue. We also actively welcome pull requests. + +## Pull Requests + +1. Fork the repo and create your branch from `master`. +2. If you've added code that should be tested, add tests. +3. If you've changed APIs, update the documentation. +4. Ensure the test suite passes. +5. If you haven't already, complete the Contributor License Agreement ("CLA"). + +## Contributor License Agreement ("CLA") + +In order to accept your pull request, we need you to submit a CLA. + +Complete your CLA [here](http://static.tumblr.com/zyubucd/GaTngbrpr/tumblr_corporate_contributor_license_agreement_v1__10-7-14.pdf) (a more integrated web form is coming soon). + +## License + +By contributing to tumblr.php you agree that your contributions will be licensed under its Apache 2.0 license. + diff --git a/vendor/tumblr/tumblr/LICENSE b/vendor/tumblr/tumblr/LICENSE new file mode 100644 index 0000000..ba74d5c --- /dev/null +++ b/vendor/tumblr/tumblr/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013 Tumblr, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/tumblr/tumblr/README.md b/vendor/tumblr/tumblr/README.md new file mode 100644 index 0000000..69a9dd1 --- /dev/null +++ b/vendor/tumblr/tumblr/README.md @@ -0,0 +1,109 @@ +# tumblr.php + +[![Build Status](https://secure.travis-ci.org/tumblr/tumblr.php.png)](http://travis-ci.org/tumblr/tumblr.php) + +The official PHP client for the +[Tumblr API](http://www.tumblr.com/docs/en/api/v2). + +## Usage + +### Basic Usage + +The first step is setting up a Client: + +``` php +$client = new Tumblr\API\Client($consumerKey, $consumerSecret); +$client->setToken($token, $tokenSecret); +``` + +And then you can do anything you'd like: + +``` php +foreach ($client->getUserInfo()->user->blogs as $blog) { + echo $blog->name . "\n"; +} +``` + +### User Methods + +``` php +$client->getUserInfo(); + +$client->getDashboardPosts($options = null); +$client->getLikedPosts($options = null); +$client->getFollowedBlogs($options = null); + +$client->follow($blogName); +$client->unfollow($blogName); + +$client->like($postId, $reblogKey); +$client->unlike($postId, $reblogKey); +``` + +### Blog Methods + +``` php +$client->getBlogInfo($blogName); + +$client->getBlogAvatar($blogName, $size = null); + +$client->getBlogPosts($blogName, $options = null); +$client->getBlogLikes($blogName, $options = null); +$client->getBlogFollowers($blogName, $options = null); + +$client->getQueuedPosts($blogName, $options = null); +$client->getDraftPosts($blogName, $options = null); +$client->getSubmissionPosts($blogName, $options = null); +``` + +### Post Methods + +``` php +$client->createPost($blogName, $data); +$client->editPost($blogName, $id, $data); +$client->deletePost($blogName, $id, $reblogKey); +$client->reblogPost($blogName, $id, $reblogKey, $options = null); +``` + +### Tagged Methods + +``` php +$client->getTaggedPosts($tag, $options = null); +``` + +## Dependencies + +tumblr.php is available +[on composer](https://packagist.org/packages/tumblr/tumblr) + +* guzzle/guzzle 6.* +* eher/oauth 1.0.x + +If you're using composer (you should!) you can just run +`php composer.phar install` and you'll be good to go. More details on +[getcomposer.org](http://getcomposer.org/). + +## Running tests + +tumblr.php has full unit tests that can be run with PHPUnit like this: + +``` bash +$ phpunit +``` + +That will also generate a coverage report into `./coverage` + +## Copyright and license + +Copyright 2013 Tumblr, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not +use this work except in compliance with the License. You may obtain a copy of +the License in the LICENSE file, or at: + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations. diff --git a/vendor/tumblr/tumblr/composer.json b/vendor/tumblr/tumblr/composer.json new file mode 100644 index 0000000..748a16b --- /dev/null +++ b/vendor/tumblr/tumblr/composer.json @@ -0,0 +1,39 @@ +{ + + "name": "tumblr/tumblr", + + "description": "Official Tumblr PHP Client", + + "keywords": ["tumblr", "api", "sdk", "gif"], + + "homepage": "https://github.com/tumblr/tumblr.php", + + "authors": [ + { + "name": "John Crepezzi", + "email": "john.crepezzi@gmail.com", + "homepage": "https://github.com/seejohnrun", + "role": "developer" + } + ], + + "license": "Apache-2.0", + + "type": "library", + + "require": { + "eher/oauth": "1.0.*", + "guzzlehttp/guzzle": "6.*" + }, + + "require-dev": { + "phpunit/phpunit": "5.3.*" + }, + + "autoload": { + "psr-0": { + "Tumblr\\API": "lib" + } + } + +} diff --git a/vendor/tumblr/tumblr/lib/Tumblr/API/Client.php b/vendor/tumblr/tumblr/lib/Tumblr/API/Client.php new file mode 100644 index 0000000..7d51138 --- /dev/null +++ b/vendor/tumblr/tumblr/lib/Tumblr/API/Client.php @@ -0,0 +1,502 @@ +requestHandler = new RequestHandler(); + $this->setConsumer($consumerKey, $consumerSecret); + + if ($token && $secret) { + $this->setToken($token, $secret); + } + } + + /** + * Set the consumer for this client + * + * @param string $consumerKey the consumer key + * @param string $consumerSecret the consumer secret + */ + public function setConsumer($consumerKey, $consumerSecret) + { + $this->apiKey = $consumerKey; + $this->requestHandler->setConsumer($consumerKey, $consumerSecret); + } + + /** + * Set the token for this client + * + * @param string $token the oauth token + * @param string $secret the oauth secret + */ + public function setToken($token, $secret) + { + $this->requestHandler->setToken($token, $secret); + } + + /** + * Retrieve RequestHandler instance + * + * @return RequestHandler + */ + public function getRequestHandler() + { + return $this->requestHandler; + } + + /** + * Get info on the authenticating user + * + * @return array the response array + */ + public function getUserInfo() + { + return $this->getRequest('v2/user/info', null, false); + } + + /** + * Get user dashboard for the authenticating user + * + * @param array $options the options for the call + * @return array the response array + */ + public function getDashboardPosts($options = null) + { + return $this->getRequest('v2/user/dashboard', $options, false); + } + + /** + * Get followings for the authenticating user + * + * @param array $options the options for the call + * @return array the response array + */ + public function getFollowedBlogs($options = null) + { + return $this->getRequest('v2/user/following', $options, false); + } + + /** + * Get likes for the authenticating user + * + * @param array $options the options for the call + * @return array the response array + */ + public function getLikedPosts($options = null) + { + return $this->getRequest('v2/user/likes', $options, false); + } + + /** + * Follow a blog + * + * @param string $blogName the name of the blog to follow + * @return array the response array + */ + public function follow($blogName) + { + $options = array('url' => $this->blogUrl($blogName)); + + return $this->postRequest('v2/user/follow', $options, false); + } + + /** + * Unfollow a blog + * + * @param string $blogName the name of the blog to follow + * @return array the response array + */ + public function unfollow($blogName) + { + $options = array('url' => $this->blogUrl($blogName)); + + return $this->postRequest('v2/user/unfollow', $options, false); + } + + /** + * Like a post + * + * @param int $postId the id of the post + * @param string $reblogKey the reblog_key of the post + * + * @return array the response array + */ + public function like($postId, $reblogKey) + { + $options = array('id' => $postId, 'reblog_key' => $reblogKey); + + return $this->postRequest('v2/user/like', $options, false); + } + + /** + * Unlike a post + * + * @param int $postId the id of the post + * @param string $reblogKey the reblog_key of the post + * + * @return array the response array + */ + public function unlike($postId, $reblogKey) + { + $options = array('id' => $postId, 'reblog_key' => $reblogKey); + + return $this->postRequest('v2/user/unlike', $options, false); + } + + /** + * Delete a post + * + * @param string $blogName the name of the blog the post is on + * @param int $postId the id of the post + * @param string $reblogKey the reblog_key of the post + * + * @return array the response array + */ + public function deletePost($blogName, $postId, $reblogKey) + { + $options = array('id' => $postId, 'reblog_key' => $reblogKey); + $path = $this->blogPath($blogName, '/post/delete'); + + return $this->postRequest($path, $options, false); + } + + /** + * Reblog a post + * + * @param string $blogName the name of the blog + * @param int $postId the id of the post + * @param string $reblogKey the reblog key of the post + * @param array $options the options for the call + * + * @return array the response array + */ + public function reblogPost($blogName, $postId, $reblogKey, $options = null) + { + $params = array('id' => $postId, 'reblog_key' => $reblogKey); + $params = array_merge($options ?: array(), $params); + $path = $this->blogPath($blogName, '/post/reblog'); + + return $this->postRequest($path, $params, false); + } + + /** + * Edit a post + * + * @param string $blogName the name of the blog + * @param int $postId the id of the post to edit + * @param array $data the data to save + * + * @return array the response array + */ + public function editPost($blogName, $postId, $data) + { + $data['id'] = $postId; + $path = $this->blogPath($blogName, '/post/edit'); + + return $this->postRequest($path, $data, false); + } + + /** + * Create a post + * + * @param string $blogName the name of the blog + * @param array $data the data to save + * + * @return array the response array + */ + public function createPost($blogName, $data) + { + $path = $this->blogPath($blogName, '/post'); + + return $this->postRequest($path, $data, false); + } + + /** + * Get tagged posts + * + * @param string $tag the tag to look up + * @param array $options the options for the call + * + * @return array the response array + */ + public function getTaggedPosts($tag, $options = null) + { + if (!$options) { + $options = array(); + } + $options['tag'] = $tag; + + return $this->getRequest('v2/tagged', $options, true); + } + + /** + * Get information about a given blog + * + * @param string $blogName the name of the blog to look up + * @return array the response array + */ + public function getBlogInfo($blogName) + { + $path = $this->blogPath($blogName, '/info'); + + return $this->getRequest($path, null, true); + } + + /** + * Get blog avatar URL + * + * @param string $blogName the nae of the blog to look up + * @param int $size the size to retrieve + * + * @return string the avatar url + */ + public function getBlogAvatar($blogName, $size = null) + { + $path = $this->blogPath($blogName, '/avatar'); + if ($size) { + $path .= "/$size"; + } + + return $this->getRedirect($path, null, true); + } + + /** + * Get blog likes for a given blog + * + * @param string $blogName the name of the blog to look up + * @param array $options the options for the call + * + * @return array the response array + */ + public function getBlogLikes($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/likes'); + + return $this->getRequest($path, $options, true); + } + + /** + * Get blog followers for a given blog + * + * @param string $blogName the name of the blog to look up + * @param array $options the options for the call + * + * @return array the response array + */ + public function getBlogFollowers($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/followers'); + + return $this->getRequest($path, $options, false); + } + + /** + * Get posts for a given blog + * + * @param string $blogName the name of the blog + * @param array $options the options for the call + * + * @return array the response array + */ + public function getBlogPosts($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/posts'); + if ($options && isset($options['type'])) { + $path .= '/' . $options['type']; + unset($options['type']); + } + + return $this->getRequest($path, $options, true); + } + + /** + * Get queue posts for a given blog + * + * @param string $blogName the name of the blog + * @param array $options the options for the call + * + * @return array the response array + */ + public function getQueuedPosts($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/posts/queue'); + + return $this->getRequest($path, $options, false); + } + + /** + * Get draft posts for a given blog + * + * @param string $blogName the name of the blog + * @param array $options the options for the call + * + * @return array the response array + */ + public function getDraftPosts($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/posts/draft'); + + return $this->getRequest($path, $options, false); + } + + /** + * Get submission posts for a given blog + * + * @param string $blogName the name of the blog + * @param array $options the options for the call + * + * @return array the response array + */ + public function getSubmissionPosts($blogName, $options = null) + { + $path = $this->blogPath($blogName, '/posts/submission'); + + return $this->getRequest($path, $options, false); + } + + /** + * Make a GET request to the given endpoint and return the response + * + * @param string $path the path to call on + * @param array $options the options to call with + * @param bool $addApiKey whether or not to add the api key + * + * @return array the response object (parsed) + */ + public function getRequest($path, $options, $addApiKey) + { + $response = $this->makeRequest('GET', $path, $options, $addApiKey); + + return $this->parseResponse($response); + } + + /** + * Make a POST request to the given endpoint and return the response + * + * @param string $path the path to call on + * @param array $options the options to call with + * @param bool $addApiKey whether or not to add the api key + * + * @return array the response object (parsed) + */ + public function postRequest($path, $options, $addApiKey) + { + if (isset($options['source']) && is_array($options['source'])) { + $sources = $options['source']; + unset($options['source']); + foreach ($sources as $i => $source) { + $options["source[$i]"] = $source; + } + } + + $response = $this->makeRequest('POST', $path, $options, $addApiKey); + return $this->parseResponse($response); + } + + /** + * Parse a response and return an appropriate result + * + * @param \stdClass $response the response from the server + * + * @throws RequestException + * @return array the response data + */ + private function parseResponse($response) + { + $response->json = json_decode($response->body); + if ($response->status < 400) { + return $response->json->response; + } else { + throw new RequestException($response); + } + } + + /** + * Make a GET request to the given endpoint and return the response + * + * @param string $path the path to call on + * @param array $options the options to call with + * @param bool $addApiKey whether or not to add the api key + * + * @return string url redirected to (or null) + */ + private function getRedirect($path, $options, $addApiKey) + { + $response = $this->makeRequest('GET', $path, $options, $addApiKey); + if ($response->status === 301 || $response->status === 302) { + return $response->headers['Location'][0]; + } + + return null; + } + + /** + * Make a request to the given endpoint and return the response + * + * @param string $method the method to call: GET, POST + * @param string $path the path to call on + * @param array $options the options to call with + * @param bool $addApiKey whether or not to add the api key + * + * @return \stdClass the response object (not parsed) + */ + private function makeRequest($method, $path, $options, $addApiKey) + { + if ($addApiKey) { + $options = array_merge( + array('api_key' => $this->apiKey), + $options ?: array() + ); + } + + return $this->requestHandler->request($method, $path, $options); + } + + /** + * Expand the given blogName into a base path for the blog + * + * @param string $blogName the name of the blog + * @param string $ext the url extension + * + * @return string the blog base path + */ + private function blogPath($blogName, $ext) + { + $blogUrl = $this->blogUrl($blogName); + + return "v2/blog/$blogUrl$ext"; + } + + /** + * Get the URL of a blog by name or URL + * + * @param string $blogName the name of the blog + * @return string the blog URL + */ + private function blogUrl($blogName) + { + if (strpos($blogName, '.') === false) { + return "$blogName.tumblr.com"; + } + + return $blogName; + } + +} diff --git a/vendor/tumblr/tumblr/lib/Tumblr/API/RequestException.php b/vendor/tumblr/tumblr/lib/Tumblr/API/RequestException.php new file mode 100644 index 0000000..00af04b --- /dev/null +++ b/vendor/tumblr/tumblr/lib/Tumblr/API/RequestException.php @@ -0,0 +1,35 @@ +body); + + $errstr = 'Unknown Error'; + if (isset($error->meta)) { + $errstr = $error->meta->msg; + if (isset($error->response->errors)) { + $errstr .= ' ('.$error->response->errors[0].')'; + } + } elseif (isset($error->response->errors)) { + $errstr = $error->response->errors[0]; + } + + $this->statusCode = $response->status; + $this->message = $errstr; + parent::__construct($this->message, $this->statusCode); + } + + public function __toString() + { + return __CLASS__ . ": [$this->statusCode]: $this->message\n"; + } + +} diff --git a/vendor/tumblr/tumblr/lib/Tumblr/API/RequestHandler.php b/vendor/tumblr/tumblr/lib/Tumblr/API/RequestHandler.php new file mode 100644 index 0000000..c14eefc --- /dev/null +++ b/vendor/tumblr/tumblr/lib/Tumblr/API/RequestHandler.php @@ -0,0 +1,151 @@ +baseUrl = 'https://api.tumblr.com/'; + $this->version = '0.1.2'; + + $this->signatureMethod = new \Eher\OAuth\HmacSha1(); + $this->client = new \GuzzleHttp\Client(array( + 'allow_redirects' => false, + )); + } + + /** + * Set the consumer for this request handler + * + * @param string $key the consumer key + * @param string $secret the consumer secret + */ + public function setConsumer($key, $secret) + { + $this->consumer = new \Eher\OAuth\Consumer($key, $secret); + } + + /** + * Set the token for this request handler + * + * @param string $token the oauth token + * @param string $secret the oauth secret + */ + public function setToken($token, $secret) + { + $this->token = new \Eher\OAuth\Token($token, $secret); + } + + /** + * Set the base url for this request handler. + * + * @param string $url The base url (e.g. https://api.tumblr.com) + */ + public function setBaseUrl($url) + { + // Ensure we have a trailing slash since it is expected in {@link request}. + if (substr($url, -1) !== '/') { + $url .= '/'; + } + + $this->baseUrl = $url; + } + + /** + * Make a request with this request handler + * + * @param string $method one of GET, POST + * @param string $path the path to hit + * @param array $options the array of params + * + * @return \stdClass response object + */ + public function request($method, $path, $options) + { + // Ensure we have options + $options = $options ?: array(); + + // Take off the data param, we'll add it back after signing + $file = isset($options['data']) ? $options['data'] : false; + unset($options['data']); + + // Get the oauth signature to put in the request header + $url = $this->baseUrl . $path; + $oauth = \Eher\OAuth\Request::from_consumer_and_token( + $this->consumer, + $this->token, + $method, + $url, + $options + ); + $oauth->sign_request($this->signatureMethod, $this->consumer, $this->token); + $authHeader = $oauth->to_header(); + $pieces = explode(' ', $authHeader, 2); + $authString = $pieces[1]; + + + // Set up the request and get the response + $uri = new \GuzzleHttp\Psr7\Uri($url); + $guzzleOptions = [ + 'headers' => [ + 'Authorization' => $authString, + 'User-Agent' => 'tumblr.php/' . $this->version, + ], + // Swallow exceptions since \Tumblr\API\Client will handle them + 'http_errors' => false, + ]; + if ($method === 'GET') { + $uri = $uri->withQuery(http_build_query($options)); + } elseif ($method === 'POST') { + if (!$file) { + $guzzleOptions['form_params'] = $options; + } else { + // Add the files back now that we have the signature without them + $content_type = 'multipart'; + $form = []; + foreach ($options as $name => $contents) { + $form[] = [ + 'name' => $name, + 'contents' => $contents, + ]; + } + foreach ((array) $file as $idx => $path) { + $form[] = [ + 'name' => "data[$idx]", + 'contents' => file_get_contents($path), + 'filename' => pathinfo($path, PATHINFO_FILENAME), + ]; + } + $guzzleOptions['multipart'] = $form; + } + } + + $response = $this->client->request($method, $uri, $guzzleOptions); + + // Construct the object that the Client expects to see, and return it + $obj = new \stdClass; + $obj->status = $response->getStatusCode(); + // Turn the stream into a string + $obj->body = $response->getBody()->__toString(); + $obj->headers = $response->getHeaders(); + + return $obj; + } + +} diff --git a/vendor/tumblr/tumblr/phpunit.xml b/vendor/tumblr/tumblr/phpunit.xml new file mode 100644 index 0000000..2e7968c --- /dev/null +++ b/vendor/tumblr/tumblr/phpunit.xml @@ -0,0 +1,15 @@ + + + + test + + + + + lib + + + + + + diff --git a/vendor/tumblr/tumblr/test/BlogTest.php b/vendor/tumblr/tumblr/test/BlogTest.php new file mode 100644 index 0000000..22a63bf --- /dev/null +++ b/vendor/tumblr/tumblr/test/BlogTest.php @@ -0,0 +1,67 @@ +getBlogInfo('b'); }, 'GET', 'v2/blog/b.tumblr.com/info', array('api_key' => API_KEY)), + + // getBlogAvatar + array(function ($c) use ($test) { + $url = $c->getBlogAvatar('b'); + $test->assertEquals($url, 'url'); + }, 'GET', 'v2/blog/b.tumblr.com/avatar', array('api_key' => API_KEY), 'redirect'), + array(function ($c) use ($test) { + $url = $c->getBlogAvatar('b'); + $test->assertEquals($url, null); + }, 'GET', 'v2/blog/b.tumblr.com/avatar', array('api_key' => API_KEY), 'not_found'), + array(function ($c) { $c->getBlogAvatar('b', 128); }, 'GET', 'v2/blog/b.tumblr.com/avatar/128', array('api_key' => API_KEY)), + + // getBlogLikes + array(function ($c) { $c->getBlogLikes('b.n'); }, 'GET', 'v2/blog/b.n/likes', array('api_key' => API_KEY)), + array(function ($c) { $c->getBlogLikes('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/likes', array('limit' => 10, 'api_key' => API_KEY)), + + // getBlogFollowers + array(function ($c) { $c->getBlogFollowers('b.n'); }, 'GET', 'v2/blog/b.n/followers', null), + array(function ($c) { $c->getBlogFollowers('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/followers', array('limit' => 10)), + + // getBlogPosts + array(function ($c) { $c->getBlogPosts('b.n'); }, 'GET', 'v2/blog/b.n/posts', array('api_key' => API_KEY)), + array(function ($c) { $c->getBlogPosts('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/posts', array('limit' => 10, 'api_key' => API_KEY)), + array(function ($c) { $c->getBlogPosts('b.n', array('type' => 'text')); }, 'GET', 'v2/blog/b.n/posts/text', array('api_key' => API_KEY)), + + // getQueuedPosts + array(function ($c) { $c->getQueuedPosts('b.n'); }, 'GET', 'v2/blog/b.n/posts/queue', null), + array(function ($c) { $c->getQueuedPosts('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/posts/queue', array('limit' => 10)), + + // getDraftPosts + array(function ($c) { $c->getDraftPosts('b.n'); }, 'GET', 'v2/blog/b.n/posts/draft', null), + array(function ($c) { $c->getDraftPosts('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/posts/draft', array('limit' => 10)), + + // getSubmissionPosts + array(function ($c) { $c->getSubmissionPosts('b.n'); }, 'GET', 'v2/blog/b.n/posts/submission', null), + array(function ($c) { $c->getSubmissionPosts('b.n', array('limit' => 10)); }, 'GET', 'v2/blog/b.n/posts/submission', array('limit' => 10)), + + ); + } + + public function testNotFound() + { + try { + $this->testCalls(function ($c) { + $c->getBlogInfo('b'); + }, 'GET', 'v2/blog/b.tumblr.com/info', array('api_key' => API_KEY), 'not_found'); + } catch (\Tumblr\API\RequestException $e) { + $this->assertEquals((string) $e, "Tumblr\API\RequestException: [404]: Unknown Error\n"); + + return; + } + $this->fail('no error thrown'); + } + +} diff --git a/vendor/tumblr/tumblr/test/PostTest.php b/vendor/tumblr/tumblr/test/PostTest.php new file mode 100644 index 0000000..55d1bdb --- /dev/null +++ b/vendor/tumblr/tumblr/test/PostTest.php @@ -0,0 +1,30 @@ +deletePost('b', 123, 'abc'); }, 'POST', 'v2/blog/b.tumblr.com/post/delete', array('id' => 123, 'reblog_key' => 'abc')), + + // reblog post + array(function ($c) { $c->reblogPost('b', 123, 'abc'); }, 'POST', 'v2/blog/b.tumblr.com/post/reblog', array('id' => 123, 'reblog_key' => 'abc')), + array(function ($c) { $c->reblogPost('b', 123, 'abc', array('something' => 'else')); }, 'POST', 'v2/blog/b.tumblr.com/post/reblog', array('id' => 123, 'reblog_key' => 'abc', 'something' => 'else')), + + // edit post + array(function ($c) { $c->editPost('b.n', 123, array('d' => 'ata')); }, 'POST', 'v2/blog/b.n/post/edit', array('d' => 'ata', 'id' => 123)), + + // create post + array(function ($c) { $c->createPost('b.n', array('d' => 'ata')); }, 'POST', 'v2/blog/b.n/post', array('d' => 'ata')), + + // single source + array(function ($c) { $c->createPost('b.n', array('source' => 'remote')); }, 'POST', 'v2/blog/b.n/post', array('source' => 'remote')), + + // multi-source + array(function ($c) { $c->createPost('b.n', array('source' => array('r1', 'r2'))); }, 'POST', 'v2/blog/b.n/post', array('source[0]' => 'r1', 'source[1]' => 'r2')), + + ); + } +} diff --git a/vendor/tumblr/tumblr/test/RequestExceptionTest.php b/vendor/tumblr/tumblr/test/RequestExceptionTest.php new file mode 100644 index 0000000..6180bca --- /dev/null +++ b/vendor/tumblr/tumblr/test/RequestExceptionTest.php @@ -0,0 +1,28 @@ + 401, 'body' => '{}'), "$class_name: [401]: Unknown Error\n"), + + array(array('status' => 404, 'body' => '{"meta":{"msg":"cool story bro"}}'), "$class_name: [404]: cool story bro\n"), + + ); + } + + /** + * @dataProvider provider + */ + public function testErrorString($responseArr, $expectedString) + { + $response = (object) $responseArr; + $err = new \Tumblr\API\RequestException($response); + $this->assertEquals((string) $err, $expectedString); + } + +} diff --git a/vendor/tumblr/tumblr/test/RequestHandlerTest.php b/vendor/tumblr/tumblr/test/RequestHandlerTest.php new file mode 100644 index 0000000..4dfdcb9 --- /dev/null +++ b/vendor/tumblr/tumblr/test/RequestHandlerTest.php @@ -0,0 +1,71 @@ +getRequestHandler(); + $this->assertInstanceOf('Tumblr\API\RequestHandler', $rh); + + $rh->setBaseUrl('http://example.com'); + $this->assertAttributeEquals('http://example.com/', 'baseUrl', $rh); + + $rh->setBaseUrl('http://example.com/'); + $this->assertAttributeEquals('http://example.com/', 'baseUrl', $rh); + } + + /** + * @expectedException GuzzleHttp\Exception\ConnectException + */ + public function testRequestThrowsErrorOnMalformedBaseUrl() + { + $client = new Tumblr\API\Client(API_KEY); + $rh = $client->getRequestHandler(); + $rh->setBaseUrl('this is a malformed URL!'); + + $options = array('some kinda option'); + + $rh->request('GET', 'foo', $options); + + } + + /** + * @expectedException Tumblr\API\RequestException + * @expectedExceptionCode 400 + * @expectedExceptionMessage Sadface + */ + public function testRequestThrowsOnBadResponse() + { + // Setup mock handler and response + $mock = new GuzzleHttp\Handler\MockHandler([ + new GuzzleHttp\Psr7\Response(400, [], '{"meta": {"status": 400, "msg": "Sadface"} }'), + ]); + $stack = GuzzleHttp\HandlerStack::create($mock); + $guzzle = new GuzzleHttp\Client(['handler' => $stack]); + + // Attached mocked guzzle client + $client = new Tumblr\API\Client(API_KEY); + $client->getRequestHandler()->client = $guzzle; + + // Throws because it got a 400 back + $client->getBlogInfo('ceyko.tumblr.com'); + } + + public function testRequestGetsJsonResponseField() + { + // Setup mock handler and response + $mock = new GuzzleHttp\Handler\MockHandler([ + new GuzzleHttp\Psr7\Response(200, [], '{"meta": {"status": 200, "msg": "OK"}, "response": "Response Text"}'), + ]); + $stack = GuzzleHttp\HandlerStack::create($mock); + $guzzle = new GuzzleHttp\Client(['handler' => $stack]); + + // Attached mocked guzzle client + $client = new Tumblr\API\Client(API_KEY); + $client->getRequestHandler()->client = $guzzle; + + // Parses out the `reponse` field in json on success + $this->assertEquals($client->getBlogInfo('ceyko.tumblr.com'), 'Response Text'); + } +} diff --git a/vendor/tumblr/tumblr/test/TaggedTest.php b/vendor/tumblr/tumblr/test/TaggedTest.php new file mode 100644 index 0000000..c595508 --- /dev/null +++ b/vendor/tumblr/tumblr/test/TaggedTest.php @@ -0,0 +1,16 @@ +getTaggedPosts('hey'); }, 'GET', 'v2/tagged', array('tag' => 'hey', 'api_key' => API_KEY)), + array(function ($c) { $c->getTaggedPosts('hey', array('limit' => 10)); }, 'GET', 'v2/tagged', array('limit' => 10, 'tag' => 'hey', 'api_key' => API_KEY)), + + ); + } + +} diff --git a/vendor/tumblr/tumblr/test/TumblrTest.php b/vendor/tumblr/tumblr/test/TumblrTest.php new file mode 100644 index 0000000..a014634 --- /dev/null +++ b/vendor/tumblr/tumblr/test/TumblrTest.php @@ -0,0 +1,51 @@ +getResponseMock($which_mock); + + // Create request mock and set it to check for the proper response + $request = $this->getMock('Tumblr\API\RequestHandler', array('request')); + $request->expects($this->once()) + ->method('request') + ->with($this->equalTo($type), $this->equalTo($path), $this->equalTo($params)) + ->will($this->returnValue($response)); + + // Create a new client and set it up to use that request handler + $client = new Tumblr\API\Client(API_KEY); + $ref = new ReflectionObject($client); + $prop = $ref->getProperty('requestHandler'); + $prop->setAccessible(true); + $prop->setValue($client, $request); + + // Give it tokens + $client->setToken('t1', 't2'); + + // And then run the callback to check the results + $callable($client); + } + + private function getResponseMock($which) + { + $response = new stdClass; + if ($which == 'perfect') { + $response->status = 200; + $response->body = '{"response":[]}'; + } elseif ($which == 'redirect') { + $response->status = 301; + $response->headers = array('Location' => array('url')); + } elseif ($which == 'not_found') { + $response->status = 404; + $response->body = '{}'; + } + + return $response; + } + +} diff --git a/vendor/tumblr/tumblr/test/UserTest.php b/vendor/tumblr/tumblr/test/UserTest.php new file mode 100644 index 0000000..e42b336 --- /dev/null +++ b/vendor/tumblr/tumblr/test/UserTest.php @@ -0,0 +1,40 @@ +getUserInfo(); }, 'GET', 'v2/user/info', null), + + // getDashboardPosts + array(function ($c) { $c->getDashboardPosts(); }, 'GET', 'v2/user/dashboard', null), + array(function ($c) { $c->getDashboardPosts(array('limit' => 10)); }, 'GET', 'v2/user/dashboard', array('limit' => 10)), + + // getFollowedBlogs + array(function ($c) { $c->getFollowedBlogs(); }, 'GET', 'v2/user/following', null), + array(function ($c) { $c->getFollowedBlogs(array('limit' => 10)); }, 'GET', 'v2/user/following', array('limit' => 10)), + + // getLikedPosts + array(function ($c) { $c->getLikedPosts(); }, 'GET', 'v2/user/likes', null), + array(function ($c) { $c->getLikedPosts(array('limit' => 10)); }, 'GET', 'v2/user/likes', array('limit' => 10)), + + // follow + array(function ($c) { $c->follow('b'); }, 'POST', 'v2/user/follow', array('url' => 'b.tumblr.com')), + array(function ($c) { $c->follow('b.n'); }, 'POST', 'v2/user/follow', array('url' => 'b.n')), + + // unfollow + array(function ($c) { $c->unfollow('b'); }, 'POST', 'v2/user/unfollow', array('url' => 'b.tumblr.com')), + + // like + array(function ($c) { $c->like(123, 'abc'); }, 'POST', 'v2/user/like', array('id' => 123, 'reblog_key' => 'abc')), + + // unlike + array(function ($c) { $c->unlike(123, 'abc'); }, 'POST', 'v2/user/unlike', array('id' => 123, 'reblog_key' => 'abc')), + + ); + } + +} diff --git a/vendor/tumblr/tumblr/test/bootstrap.php b/vendor/tumblr/tumblr/test/bootstrap.php new file mode 100644 index 0000000..cfa1b00 --- /dev/null +++ b/vendor/tumblr/tumblr/test/bootstrap.php @@ -0,0 +1,8 @@ +