From 9345707ef0c6519e32414dec2c4e02164ec9cb0c Mon Sep 17 00:00:00 2001 From: Jeroen Moors Date: Sat, 10 Nov 2018 13:40:19 +0100 Subject: [PATCH] Add Smappee --- composer.lock | 252 ++++ composer.phar | Bin 0 -> 1704783 bytes index.php | 49 + src/SmappeeLocal.php | 30 +- test.sh | 3 + vendor/autoload.php | 7 + vendor/composer/ClassLoader.php | 415 ++++++ vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 9 + vendor/composer/autoload_files.php | 12 + vendor/composer/autoload_namespaces.php | 10 + vendor/composer/autoload_psr4.php | 13 + vendor/composer/autoload_real.php | 70 + vendor/composer/autoload_static.php | 66 + vendor/composer/installed.json | 241 ++++ vendor/guzzlehttp/guzzle/CHANGELOG.md | 1264 +++++++++++++++++ vendor/guzzlehttp/guzzle/LICENSE | 19 + vendor/guzzlehttp/guzzle/README.md | 89 ++ vendor/guzzlehttp/guzzle/UPGRADING.md | 1203 ++++++++++++++++ vendor/guzzlehttp/guzzle/composer.json | 44 + vendor/guzzlehttp/guzzle/src/Client.php | 414 ++++++ .../guzzlehttp/guzzle/src/ClientInterface.php | 84 ++ .../guzzle/src/Cookie/CookieJar.php | 314 ++++ .../guzzle/src/Cookie/CookieJarInterface.php | 84 ++ .../guzzle/src/Cookie/FileCookieJar.php | 90 ++ .../guzzle/src/Cookie/SessionCookieJar.php | 71 + .../guzzle/src/Cookie/SetCookie.php | 404 ++++++ .../src/Exception/BadResponseException.php | 27 + .../guzzle/src/Exception/ClientException.php | 7 + .../guzzle/src/Exception/ConnectException.php | 37 + .../guzzle/src/Exception/GuzzleException.php | 4 + .../guzzle/src/Exception/RequestException.php | 217 +++ .../guzzle/src/Exception/SeekException.php | 27 + .../guzzle/src/Exception/ServerException.php | 7 + .../Exception/TooManyRedirectsException.php | 4 + .../src/Exception/TransferException.php | 4 + .../guzzle/src/Handler/CurlFactory.php | 559 ++++++++ .../src/Handler/CurlFactoryInterface.php | 27 + .../guzzle/src/Handler/CurlHandler.php | 45 + .../guzzle/src/Handler/CurlMultiHandler.php | 197 +++ .../guzzle/src/Handler/EasyHandle.php | 92 ++ .../guzzle/src/Handler/MockHandler.php | 189 +++ .../guzzlehttp/guzzle/src/Handler/Proxy.php | 55 + .../guzzle/src/Handler/StreamHandler.php | 533 +++++++ vendor/guzzlehttp/guzzle/src/HandlerStack.php | 273 ++++ .../guzzle/src/MessageFormatter.php | 182 +++ vendor/guzzlehttp/guzzle/src/Middleware.php | 254 ++++ vendor/guzzlehttp/guzzle/src/Pool.php | 123 ++ .../guzzle/src/PrepareBodyMiddleware.php | 106 ++ .../guzzle/src/RedirectMiddleware.php | 237 ++++ .../guzzlehttp/guzzle/src/RequestOptions.php | 255 ++++ .../guzzlehttp/guzzle/src/RetryMiddleware.php | 112 ++ .../guzzlehttp/guzzle/src/TransferStats.php | 126 ++ vendor/guzzlehttp/guzzle/src/UriTemplate.php | 241 ++++ vendor/guzzlehttp/guzzle/src/functions.php | 331 +++++ .../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 + .../promises/src/AggregateException.php | 16 + .../promises/src/CancellationException.php | 9 + vendor/guzzlehttp/promises/src/Coroutine.php | 151 ++ .../guzzlehttp/promises/src/EachPromise.php | 229 +++ .../promises/src/FulfilledPromise.php | 82 ++ vendor/guzzlehttp/promises/src/Promise.php | 280 ++++ .../promises/src/PromiseInterface.php | 93 ++ .../promises/src/PromisorInterface.php | 15 + .../promises/src/RejectedPromise.php | 87 ++ .../promises/src/RejectionException.php | 47 + vendor/guzzlehttp/promises/src/TaskQueue.php | 66 + .../promises/src/TaskQueueInterface.php | 25 + vendor/guzzlehttp/promises/src/functions.php | 457 ++++++ .../promises/src/functions_include.php | 6 + vendor/guzzlehttp/psr7/CHANGELOG.md | 110 ++ vendor/guzzlehttp/psr7/LICENSE | 19 + vendor/guzzlehttp/psr7/README.md | 739 ++++++++++ vendor/guzzlehttp/psr7/composer.json | 39 + vendor/guzzlehttp/psr7/src/AppendStream.php | 233 +++ 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 | 149 ++ 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 | 183 +++ .../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 | 142 ++ vendor/guzzlehttp/psr7/src/Response.php | 132 ++ vendor/guzzlehttp/psr7/src/ServerRequest.php | 358 +++++ vendor/guzzlehttp/psr7/src/Stream.php | 257 ++++ .../psr7/src/StreamDecoratorTrait.php | 149 ++ vendor/guzzlehttp/psr7/src/StreamWrapper.php | 121 ++ vendor/guzzlehttp/psr7/src/UploadedFile.php | 316 +++++ vendor/guzzlehttp/psr7/src/Uri.php | 702 +++++++++ vendor/guzzlehttp/psr7/src/UriNormalizer.php | 216 +++ vendor/guzzlehttp/psr7/src/UriResolver.php | 219 +++ vendor/guzzlehttp/psr7/src/functions.php | 828 +++++++++++ .../guzzlehttp/psr7/src/functions_include.php | 6 + 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 + .../psr/http-message/src/MessageInterface.php | 187 +++ .../psr/http-message/src/RequestInterface.php | 129 ++ .../http-message/src/ResponseInterface.php | 68 + .../src/ServerRequestInterface.php | 261 ++++ .../psr/http-message/src/StreamInterface.php | 158 +++ .../src/UploadedFileInterface.php | 123 ++ vendor/psr/http-message/src/UriInterface.php | 323 +++++ 114 files changed, 18901 insertions(+), 16 deletions(-) create mode 100644 composer.lock create mode 100755 composer.phar create mode 100644 index.php create mode 100644 test.sh 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/guzzlehttp/guzzle/CHANGELOG.md 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/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/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/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/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 diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..f40330f --- /dev/null +++ b/composer.lock @@ -0,0 +1,252 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "hash": "511d76ea6792bd1e9b62108932de25f8", + "content-hash": "08f2b9f39bf73268572ef2ccab63fc27", + "packages": [ + { + "name": "guzzlehttp/guzzle", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0 || ^5.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "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" + ], + "time": "2017-06-22 18:50:49" + }, + { + "name": "guzzlehttp/promises", + "version": "v1.3.1", + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "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" + ], + "time": "2016-12-20 10:07:11" + }, + { + "name": "guzzlehttp/psr7", + "version": "1.4.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + }, + "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", + "request", + "response", + "stream", + "uri", + "url" + ], + "time": "2017-03-20 17:10:46" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "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" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "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" + ], + "time": "2016-08-06 14:39:51" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": { + "php": ">=5.4.0" + }, + "platform-dev": [] +} diff --git a/composer.phar b/composer.phar new file mode 100755 index 0000000000000000000000000000000000000000..929aaea0b0485900bf82bfc2315deba597216abf GIT binary patch literal 1704783 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�o| zUy?vKvSH-l9_TBN?uijZ3QBx=xPADqqF2KSNhkg8P+pE>id|$0fF&V^AJ$9GlmV@& zZ`9!>m^JVbQwDI%C!1|~|iek;E!nhgq7BuHCj-Xtq zp~cZ92a@i!Y*ht&+5KM8epV&RJ*Wd3yR{|f4Ct-+&UofK#;tRAjZlXi6f0BMfLSl- zyKDv`$k04>Isw2mlNiYH8{Seat;`f1neoBl)Y<72Pqjh+0#RIpZ^7^(iS=mVSFz%U zbtBpx1n5H76M+(XK6gr+jh;cI)`9C!&M%ORL~%dSs73>yHBt3dc5zyla~`qO((U2l z^kR&euMmx)lTv5+I^0c4H=9>FP&m=E$=k^cPe#jz)+g9&=C81BIJy>6M~7G9baZ$H zN)F@q!H6NFU7SK7=|b}4*4M`-dp`>9wFg7Xd8^WbS-Cq@5}e|({>qXb3KC3T8ch2vPFKpDk~ zN%4SISaGR-UJ7&E-|_(bu&76Z^I$vDmp&Ehw?|W?$~FN@(aVKWr#*oHGf67@g3;2~ z@$_{6_!9TLN}lVR7qu9}!3f@^6N)qBSQi7x)Y{qX@D9Qv8IBkzFB^M9L+2xh;B60~ z@AfCkbqTu?DbN(Nt(HLD9q-F2%sj1E)m)yJ+mP;@-$}<5wg@LI(hzjI)%Tqp%RX1{ zLxyXheSHk`!MLGjCLHCQj3tbZ!PRznhmkQ^9?pW8RXzVg8J^Ig{F*f=j07gIP}@;r zCB)jk{&aQi6OCwHxhH8<(Y)X%!Nu)LeC)%mW$MFXt?ZkYT?>20;VU^<>4`~T%wJ`RiwQ{)uN^*%0zlv4HG{>_JZ^7kffku$G-BR@#6z zE}5uM^>$2#Av%D3)`mjsfh&d|5&_i+!Oz}!0D+TAo-Sh9q1MZ7!&0{R@T!Z0taJuR zHmm5Kw)guSXOS`$C?ioY>{Y^iuuZxszgyEbkH>DLx>!4y+gfQfq=|Crn+oSo*_i9f z8G|joW$c^UWVb#yibcgI)gQda6 zsTFVx5vzcOZ67thB8+1pTsK(|p5_!mlUf0wQ$Km$sZX32x~cF&usuji>UuOT96e4< zn>HLXP+E{BCKe!_ghgi8 z-92D41r$(iD4423OUr(L`+MK9C$3>DNj< zR$L@*XV{R_g-u#MyyXRWh%qn9HIo6Ul} z#H*+Q+acNm5+Z3`5|go0%$xTgNz@hua&#(u7IIddg8dS|)mwrCy#;7;=yTC54GSK# zPeY?>k9mDS;Ab8Em8MBUFLF7+=XdXkNn)3R$3g;-Uk6U-H4a(Ijags*dEw155RApK zz3lfXEo^07S`MPcQc*Q8Yy~Q2BpB1K)xz>M~aPP*6kg=hBY| zR5Gg*r9v)@9rJk3$C|rX4{Y+B-xI{Z4JSVgPA(7~=j6@UG5vseVu-;!`piKn+m+5# z6Xg{ofTb)AQY6h|*i~&sK8G!)JRl>r#KmB1Yv0&uT z<`6KBE)CjJthbPHM#WVCT4=exE1z+$uO;!_e6fdYjJBseTR-8F*;<*B>b{Xn(s=Mp98LL)~+K5W7@)>~Q*h6qKMQ{qBK zE6L)J{2?^kW<{0Jo6h_I!l?j1Q;wqDM7NTg1sL4_+6w;+TVc`8gaN^&S!9xBtzb*0P9Agb5uj)+Bi5knfZ5>Km$BvQ!>Go;(4IEm^Y z34RS-JWI8KuGzo5eUGvO((ht2j=MIkoWwo>iNnUhq(l7I(M)sdCC82+1uXyjR!;w` z9uTjR>c*fRd>(yolBUUZ-N(97#PdLd$iFmY7B1%_d|nr?i$R6II*k>mb&^zR`7=m7vp2pZCD$Vxy42>ptGW!x0^FcrVe*L!i8aU3<{_0j0EgJW{T&zBurJBJ@c{rkP?)?(8Snb{FX>5F8ZoBJtg~cf-muN3sRP^Vteumj%eqtz zfRMF?_^dmI1*j&?NN&EVasV|4W7FX4AVFtwzCttbwZZZ{*~Lkd$u94cvs9g3flz(L zTyZ<>SAu26eOHxB8F}aZI4Wf(>*+AwUbi?qn_+nc8cb#U zoD8RRnX^76E^9nPvXqoJb;3JW89^JoOF~~`2b33L*Tz@rTAw$g5J`&sIKv4p$s5jb?_H@0O`l?|fXxg&dirts zV!2dqO0{Y{JpcWGk1tNoJ?X6eb~DIQhkgs6*!0~L*I;c1ffWp)zrYR1VBUxMMS-A* zU=4A};Z2sPNzEX40Hn0bzDZslT%DE&1sHj-2QW-R^Q`B@U9;3r8+?ePXAU0x`~T;@b7}h_PKdc?Q{zmf}ZbIxo{%h8p(aE%%+~N#{3PnuHnum37 z7>SygHTVQAoKlsU+B()_=p~$HvYF5(b+#2kflj`Dz_LtatLG?wO8+o(@)yG7GGUWm z@e|sJlpJ&xQ2C)C>WVNlPVv$x5^Fyu7pI0+t`|gzm!PBCx~O3Ddckl^y~Y`WWZ4^thE9MY{?hLqj6oDZ_F-OeEC`cnYgVci?;~@nNE5 zx#=Nm#TzD0Z$RUXXV{L!olIkBNnr(7hn<5VR^cOt0@dB*wtQn}yfb!6jOk9R%0=ijieSieaIBm@+JA2uhp#NH})gSbHx!+gt-36||8%~Nu`o^+e$p7M4 zShcKNAK>|gigxtd{vE_(q%FXx`x{f<*7E>6@YvTF=!O)y3i& zO4j_GHoDlCEX9N&G2$}TIkmW{sOt|Zmud!`znYwU�-8pBR&D%LtGSl9uBFQBsiP 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

5dSuX;NduN8n|goD_~{q+oTHyOBGSpwdRVTji1 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

E(<&G9c~b@l(Vpp|0~a`6=3qEF zL5w|f&cdFx7TOZE#%+0`bDb0xvKf|AE$EY>wOIx|xif^(n}sUL!N%Dk?qfw-Q1G44U>lok&m@!JQAlS=R>*iIdxGrB3j8}RSs*Qnkx{P$n{=Z?EoI%@38B2}(NE*J(@k@Vy~ zRstsFD+r=JQ!H24JX`8Nr$gv?@NU>c8X82)I;Huq~baE{X;puu_9W>9l$fhsxi<#_w z@zpDO*X?$JuyybR8_H25ytUyO^|$?yVlJ_bp3&18FifHdom#*I?Uj(bjnPtpgrL$Q zXuhg;OHY1?Ky8p&Hb7nJqj#PDZe+#%G5Jfa0;u zsgonvI>>F%6uC}ztcSo|+fICU-blATg8E3BCjp%wkW>535Vyh@ARh(}u(#okn_}aL zkr?$L znH#R2C{D*;YOD;wDN`oH-3t4dwmIVrPf*cLRWu|dO3<_jw_HSYKdF-71iPx5F=c(d zY$_&pTk^wrR+4L_E3rYVy8u-(>kJ?L)v#VXvrc>8XlId8iw^T4$f?h!oL`Ws)To(d zMe(*_x>^`Psur=Th%@TIVj7NBjy-TKZt3kOl=Hi9WqrL$O^|{PB{t+c2~J*2DcV% z4#&Uk1eMFNLN|4vsoKW{=Oe}&Uh7oVtkSJVqo!dN@xFfKD;^*K*l~=lcOMxYiB7m4 zdYvDqa#+5hlH$5!DkYZA^_HFpl-1HyZ%i<(BG+PsJ)C_osO(rM6L7yA4>HB3e#NBa z=o0=JTspR8Q0c{jpV-Ojy*hc~lx6GNpeJNl^3P=p-0bp7@1ux2gVsV!-KVh22K_XJ zI@4MXT+K;Wx5MB#!?Luq@r(+sm=P;cbb!?EbePNLqFex_ zrxOzBTHQ_2stLS@i-vL8ae`tameFaM%I^D2jQSGBWj(X?8A!kYR9zkZEbyP(5|_fa zieHUc90${8pzb`Q@|@OjcK)jD)^=LDTFZJmpz2dbmlF7Mz1&MHwI9VP)k)isKArcd zN#K5yrw}GQ^iv)!QBlaCUqr)aB^rlH+936o@>3+Y7{#29k+ec?)@VOMGP||g`LPOb zx~VX#o|Wx4U^$M}koN}J*!+|RST%yQMkHLtHw6Y^J0->b|GHCJEGyUiPOXLa%~ za6t1=>Yjg@yTaq+@#tWfs)^Ib-01#P=W_Fg1{duRjJR@R+ip$wr#6N4O7i5Tj>mFA zwl=5#)=TKYOCU?1<;gXD$mcAg7d1{DCHhE~3TADvEf z+=bv!-4|vSQO5AHC^Ob~=SYn`Or9KjqFs_JgC|S@I<&xO?DqNC%WhxLPQKLDb@WuQ z37g6dg)t6)vDuRG6Ogptih&EaEe5ik@fLCkK!PX}WWDMkHPrUblZ_W}f)1`O#~up8 z!rlv+9BbLj3o)Z4lWw)=Q-DASrn}YP%G`!rS$l`eY?$#lj-WHal6kOXO`X~tO}-r+ z9uCj6s9y4pAXHYseIchF*@7X|a$Cd6IS$r=&w_`ue#*IGMBhrXkiA-0AvA?tSxz3{d)kv?dGFW^XEhU*a!lvx&%_;&BhyZ`YO<`tW3)=N{Pf#yr5V(_dg7+t?C@mJ*0;2Y$|@anY;RVRtAco7#a zUXr5h3&}0QSEW2nRkS^sd1wsT+88U&JXJoYu&r*_ON9i@C&hKAm6@Ck=KqV$LaGMs zmUpB$T2iQN;Q<8GXgrtZEt0j({^{U+Nmn^CAF)-b)WwN4-OJqnargl|<89~yMu20^ z$z?bZg-e&E0z)3ZqC$={RuUFwSrkzlgIgqwd_kkMPZ2ETk-idfL}ElY8W*{v5@_P9 zXuS;{_uKD27@ZxBA0qD<3gk&YByeg`03$~E!5t~~nimsGvof?cftxFD#*IZ=jX^R& zD6_zG*LehpBd9Nxd%Ac>PW*J=3X?8$u&ZHQ+0~91N+!P!9VAX6G3ATphrCv^uZumX zVoMd4v7!p?x)y#HwU!?$h({;m1K1&QYmIQub6=W*(d4N}k8pORhWd8<4hEy8Hb+Yy z^X3Rlz|K+1X`FlkF+U3-bd3pGNhfN-98`lH*4h=8$ul|pv^YX7Za0tNSce8{b}$?*`kuMB@09xP#Q<07-=w@R@#u00 zmXgNt<79|E!y_2kOQo!*!a4xvNcYPm8kru@gvYcz2E)rhU&QkSDAKXB%=>_ z{jLOQFOFDfd3kXJ1l+pxNqK{pNAKQ~6lkVKIU)$9)BIvT!>A-}m|-VlP8A~Bgu^BI z>O|Sx?n&?q=%rP))4((DG%6l28n%sC_m$MFXW1DKn3s{$AL<)^8FX)vk9shV`j4^) zVqCCZSqv4I?`bs(Z&kPTtr%^PkQ!88}JGrF|49w)c_7 zg=ikh{JBd+5dF~LpfBxlI#rm&G*d@0x{+cvA>UG$frt`2qiM)bwKkon z1&GKPMoS-jy?|Zo5%6w6GkODV7LuAv9MQ?4i*@?xK%;MR@WXSt)*-RJ=+s%c z)O4eO0ckRMpKNTcKi=8Im6hA;FW0u#@KuHeN&@V)zmNAkaerrJ zFuKuP6Z*mU9Cz`cCD2Ukg2epI>8KA>qzLQa;e{;6GU~IiOvGYpcxp(opG`Cxd=ld7 z>|}HXyCs^0)bddZCRN*8?V*k(r4KU@%TOw`aPztAUY#?jI%U_9HwlAC;eb& z(;BZ{iB?NI9$kPn4vcios}LxyC8Rr<$Z}AtgJ6n*NLN7~(9974=H8~M63g+y;bYt@ ziuYC!%Bp`bIqq|}7RE>K^uzgJGI%7yB_YgTt48+ht?74|1}rejM+gnUc_Ia{U5W`=#3S7yXPNF6w8WK~O zvB_f7#wKOy!@L>FAzwJ6#O>gYD9ld(G-L@7rT?(Y`PL~|d?}Y!coZ+i#grh!z+8G9 znPQpueDG7a`#>+V0#lT2ROFdi|FOJGMkNEMb&Z(+BDHi1ir!pjf`rVQpoK(4sME$s zTt_$*D1Mhbs~FqNHww-KsBqlG?t-tqfTM_i9W^D1v@L_s7=gs_AYjosi|7&dViyhT z{IS5zAAr&_w;+;bro+01(Lb8N;nUBVU6*uFf0x(|K&951And;R=YH@0!`_|4;k!Ge z`;F|tiiJ79!Bx7n?Ej&Ee$+plq`His9Q(la361tD?64U3AC1Zy`IL3e}-ed?|JR;s3fveXbG^UqJE81FXBiDD|jOm|!+|2_c49 za=+59S{Y(HYwu@+yEPxTBUXuySuMFh*;5aY|D3)Ms)tsqO;JRGpdC|(v2l&!)md^3`iA) z3xlpk$im-`S2STmqd}2GTr~yp8{H)$y9-wOsm-7u>y^9v!)hLwh z6h@954THhDn_+87xkiMTpZasz+wZB5^yb98psSQ>b~A%#vQcQkHHEjiWezgWj&`cq zN^j}IaB}Bte9M}HkCx^U=r7l8`}fy@2C(t|!}>#I%K|Q|F*}kt4Zp%0F78hsP;SXS z$4)C^^iOa*{L(Gp4Py`c-E_l6Z%e;-F&x96&QBonm-@F!G((e&1s|w+x*hj+*S5Xg zrGHu$!q)z7ZfEOpi*Az6PstH7lqfuXB8jg40;; z8cn4k6mM0vx`}B)Gb{L`m<7rH|t8!x`sGXGXfVyVQxup?DR>xH@G|Ev+d^c;y-0GPPo(oYvNy()S$eWU**DYsShs<=i_wws3v-4 zBP0u|b4SA(%juk}W1+Hl6TWC(A0cAXpUG07bt{65qQYk?qjm@sDGNUH1q)Hk&vXdR#7qk?@>G$v=pJ)`qzx4lKxs0ux0=?_ zx)L^;S9($%q`BRbp_O*%Zv;y22K;C|i~ePYOa!{mdl{K_T)E&SA~mj`j2Nk39QP57 z;?PLjT8=|xT@cKZHQ6 z;qWK#Ad$`<18F!)Aat++Ba>MQQ*Kya^r^rD-Lo=TMxyKVmxQg+rXrNan`k?Wxvy7( z>br3g|3gmb<%ivcg_LFCM16T#BMSO{t0Gp7fu2iT;e|^2#?f$l4x);*kpwnNQPY=C zwx+VeOcElhu>zXv34%6AsgQ$h7(_qlZvN}F`Ckn)&PTxfrr|;&7o3t2qS?hBeK?r#I7(i zzO|7}1}!ami508QA$YK$B^Hv=kzt2ts&{+i3xpt+2nDLX;B`^r*a;DXrHDiuuJsUr zVYkNbeQuk%s`O6M3&3J(Pa}lLMEj?12upBS9wM|{a12fku1?^neo-0=V%)LGBro4w zjZO}Q9zYf`OD09}9i4QJo>e@}vJhR4feM$2m^E(24=-?8h{J|(Bu13}URgT?e72ou zhfAzw<2Vo%8>|hUOP#=et{Hi`h);G zBHO9Mo@tMz$tp^)7L$O2BO ziekJ?PtD&}Jp+-P8i(G?0mj_dNqW*a(I5QYmToEC%xC43PAI)=g%8GMG7-aET}@ zQcYZvY+Ggb_+)ZEK(skLD)&hAg=v?60t6lj-d=anfhia0LO036)F-a2oN6em>WqNHV!~OU(v~7J zwGc=`uNF1H4982(CC_Cl)hQaK7bcgCgD@1jZ!Xp!+R=YtAKG$Nmc{D~3S6dU{O6em0rWRhpBo94SzuEb4&Z8JHof}gbqO`*j zH0_-Bqf{tO*UKiMlE;YGnZ-0yJNZ=2I|XMZ8SpllN8982CQ=r+2P;vhl&u^TE||8q zbt!j@!&|$?`329iL(`%S0@n61fa*%^>P$K+D=~nQzSBekHDEBH*q<4WF9w7Cc;G?D z0z=FOeIqlN57Q((LI$K4kUd*?D$ph%p_Rr=%w!v%VhN$|UT2C&&H@M>NXFivBVL zIwbm%0I;RfQXk_?k&YM$fF`t3&@0=sDKjw*lOShMCG-&q%u>*jVOQq^nbk00uiNTE z$Eq{`lCEHm5dh~LU|U!m8fSJV5uOQxQB@bf%Ay>0Qpn5*)qti~Tk$kIzD8r;C!xQ< z5VqH+y#Os_GJ7$wnr?HovL`7fPK>;zZo=%!NKEBe8T3{bDs?|cpwRt`XK$VX8<|kS zIH?rWI|MuNO#|mFPJZf`C{d$*a%7F#=>lni21&g7rn+05$l0ChJc?y#b16*TF%so0 z*fL)xa9CYu&RpS;9nKpHa`biSP?rqi!$$SY>jCf=$-X8$f2&fS9H1~@LeZWw)E$vq zOcI;F}?tHRJrdpDrSz9V5vIiYhP-`(++D(ilCZuqgb(C>mPlxJks}(uk+UjJ; zx7B?RMssaqaCBRVqRI?2#EHS#!qN*WZ1*SUCx|&v{n!{f(^{x2(bOuQb(RauCk=q9 z2EK}=$oU6Iicq>)w}=K;2ARo|^UGA-Yl~0mfv__g&F6IvD4wfu)(MyQwVYa24*^&; zVcH-xg9`#PZIWW^>aEpNt;X(t;xaBceC^&`UM)V)*k)QAf6G6mL&M|yTyNR^P8T-39 zwuus80ewxUFtH4aN{Y4W#Eh*{-BM`vvDu~*p((HgaGQly@=->SCL6WL1!+!*A+#~u z9lbIgiOv=iD##vzw8!~Aj?)40i541s@)t{}(wIdD>!Hu?q zG9{0kwXZR1aS^?%2A}!bK(If#v_Nm*DJv8f_|Ioy0Q7LcgXkmr!)*tgOXtWa&P0qA5ote+b*yYIt1e z>bkE8ikG-mG${>Y+!a%@qmWg=4 zj~tV1zMz^e{>T8JALm!Rq1(#G0`Gn%SD4c&!IptF>Zx>X>tbvmQFba(l`&)lih0~2 zM*Ws6u$~jJ4(iDxgxJm-*&;&33gL$q+!miEh9rBxAhF!7UPoL;eM?`r3@uV2*vn!U zMjmqohj74i~B6jt>xB12pnW_1&#-*{<6HV2Xp2Odv8oF0wOJ}m3ReM>rM zk<@RwvO43oY@@RgUt|+h0+SjVVVev`;p%1w!Wt@i{I0Buf_hkcZ(tyeG_%yovY? z8K4lVtB>=r#yFJ`b~C~ktA=igS*ub_TmqO<2}9Z3S)?U~$C+8CUw@P|F$S?p9-|Qb zov_1ohMQM`hhMdKIEJU|Y>dlIug=erfk;k19*s{<#_ze)WUZ|B_Am?g`V7g7fOp=< zvB&;PFMO}TA)!Vnjizh>*6Gs9uhzW_O2RPY31(Ir!w-=-A{-c4|*MRsw zCs%)EfB*5bwe4-5`u7X(C%r>!1$Sp4{N!NRdxxNKG}*hq@>@iq9roVCaf;g@aLVcw zS)mW1FnV9C++FFt!l|Q6z_kE<+RI5g-Iza_rVW4c0I{imiVT*l7^9}rRir?32_*o*7M?GYDJ zJUyif%?3RUEsvUrWDsofY&c14Gk&``QB%M&PUr^Y8hA&)@6_bdng7mP4wuV%uV1 zVzw3z*JY#(-(i49wnUz?m^I&GwPb_g2Sd)!Z{~Khtoibl+rQm2F#Yz@KF zlM|9&8TQ-uL38a3mV*l~HMvw5=${_Q(i6?Hccod3-F@2q&EoKm<(7XKrXl$vy@YnT*hVAXT?J-7?M+? z9JVD{WdQ|=h2|J{^D)>6OIj3Qjy4X5VT1>j@bgu=8X6Kp> z<feHd^XVHK_|L@H$;68fzk-H!}qX=7Citlg z_E<%kn@6l2f{%2{pvH6WMLf7}7ouVZ{_%c}u|U~*Y{o`cib`3Jisv8Ev7&x=|B7NW zx;e!RP2H+=jcvf`xL&6lMPtpGk~cF0ZHW4Y(JMM?bmnQ6An#ekqh?$WK3jjfQ(ax3 zem>gV`4-OnIGm9*T<0r*jy+a1z21*uzh&azrR$VT?{ zIwXH-glbYdfH8{dV{Bc?nFd_uwe9MBo2c6PQG*W&J>E$xVKmDxFlJbPm*XFYXK=g4 z1K7ip;bFk8)q8Fxn^`?TE1<5P%aI12M0N?u7sUN(`hm3!DM?n7;}?=rngApS!yqjp z&+OKB>sz~hKIq$qg$F(!kB;Dpl{&!EWT19~W6T$L-e%S_7m(qii<*`+`Y>O1ge2}= zQ^=XPO-<=HpJ^??gq9*_zo_Gjk+*f7jY*#EQg2D*3zX9>w24w8 zhar1q;?ghLL;O@9+q`Um5QNrQwKdE8f`y^HMvvr(Ks%u2k2A@%9Op!_oQOJ-_6B0}g3+k37e;U&WDUM zZJQ4zJedjCVDMTBvAewe!eWYTx|&3nTW9p(gpG2}H^^|CpdDzJ2N!QUnJh2-wTnhn zkfdRV&cWA=UnG7~9*xk<#ozjHij3#gQ-oi!2OjjbqbUs#MJ1osm zl(od4P$NT~VQNYEiyMqH1+iD0pL}x&;sjI$u}!c-CbV;5i>eJ^**uAE3VgTd8`7>- zYRp9-#luuC`G21ARUI{llDd|H3cYV<|B=8K2Dhc}rQsseQ$`*0hDtz)!r39JMyz0c zjmiI6w@&-SE~+7FGib1{U)optIdJz3OkH z6id5>7lv&-gvfE?30zPwEO|SI#j+)tEcXNj4W3U{tBhA%RkEp#n#bkAo7U z$#*>3vt?bR0?fHsU^H1iHlFY@&;N@M>xeE%8han2CSV+Q>Y?x z^$>_kUmp?q<*T7$iNrxWz$S5AxD;-GRcO-l7JQ(QUm~s9DYA52C?RbgYvhddhPIV1 zq;bWcK7odu2kBJC0P*yOd<`bkE@g8NcR;kREVbT>n|0Q|G_IhxJ+mtjItQSm!y$sm|dRWYscrR(22con%@3#_a{~zGyI>>#wx<#1GP^r zcw1basn+e@d>&65j8u{QnSP;h{6NU->T2Fx!(#~)YxL&Q3#lbJfD4;nPQaA{l~2uI zCQ=o@#nkA~4^mnAhLo%E`uX%jjl81n)0CG$Aerpa;*Vz5kg`9<9u)!qGtA3+<0cG48KuD+>>=@Nv)Y(yUQ!_pd3DA_&A|xi z#eBpkZ4GAz9rxV*PAKEALT_eogRHq;&ECWO84@Sts6q*~Xaw1YQI;E*^BJz?#7vTn zv$G-Y&^lw5E69>QIkc^E3a*F6?aLWBuG3__0)CO3CZ!gafh1rR+$*)KR`O5-S$p2;}Ct5-jab_mAwtzJ)9j9hB1boG}=_T*v`G9iO2_?uq|O|*>raH zs<{SU^Bl%vRwd*8>?zo3iC5*p50^dd0uQ4lV+1g!4X2K#XIPZ!+A&^F)E|b;El{VL ziE2Q#%!RC3+bNiC&p3{)dmCMThBVf)$8ilM=l&Djv#2^{$qB@h-2O^-JEzgix*>dT z^iv_&CO5zVW%og6QMDZZDK=nP>A!_x(AK?TzgO(l#DxvHC{Zv~$EL8hT5n*@1adZG zYo!*pHYGBRskQE0EL{|BHPOAF)2uedX@jCpgyn zJh#g&B50Ao(LPtjm=uQ?E`x-Jnw2E>oLI)?ep*EnfSBn9N%IMKcQMf67YrY&R^esp zQs-gscfI)WfHwoQ_zaxLEdt43^#ode1)7+>vWF{87Cseu}br@9>ClrO;wfRiRrMZvs68c7$%{^ zvn9d99%F`qM5g}69s)Y6f$f$=V^CovjM=z?F$>AKW^JUElY zJi|+D>RS!Fi+T7HBT;#cg)SzYkycloeTAhw)Svc_4O6l6-&nlL=yT=j&1H`2ayp1b zAj>1EQ*wUYleG$c;vM&H4cvuN-^gXyW07FEC!`#|ZhioxK2dJY?U)kKjM^bkS|P++ zLisd}pmJH(9Y@HhZA1DV8(tgqT<{sVx>YdBLIXQ<=!WoLA|I$=vb9 z-VVZM($86Ym8s<3f1aMCU$g4zf$+UYS4T%fTtluuXH^QhJ0-K&yk|^G#x7LWg5^A_ z+%6cn(2maO`FRrau^v7iU!CQekp?~-8Q7uqxeak+TWDs|8QtJyL2JJ{iN{xv^7v*U52KB-_HO`m3ItrrPYNk&t%n znRH_!BL*?WImKhyq4!@hh(?ioe=XjtbawQnBB(NS&DBwir=w^gh86uKu3J2IvYu1x zs6Oma%8le=S>xrC>hDAPFI*rcww)M)gA;_V9ezOY@Mv;55mV5MW({Q_mz~2nT{oMR zfq_z$Y}gErpm~}~y09n`KDl|PfjZ*I$=GdvB#{5??^h#;_e7dNM(5DrgvTB`Q4y)B zv6P)O0Rwtug9?iFz7T61cF`esyi8OlIiat!&gRg4>ew*rIe-SgphoapGE1oPYf(MZ z2?#vatg&Co@fVm=XnPz6IXO-=#1*O4oG;PXTw%_)|$O{Sv6(gg#%lxQqrI@8oueh{PyMk#*3Z(=WG87YTG72Jr0TI zrZl@{6SJ%NdV+L}R7MIj(Ul_VpDh%B68{y#O(h`C-8p7gi`UKBO+j>%qD7m7;hVOR zY5Mdo^lunqE$<+KuVE{+luj_Iu@dPV9U4daz0{i8sv9W6!_I?E@e}Q;w$!=-7wyvQ zDm0}vzZ*dU7=PE2)Dj zCvQ}@1cCj|C*<^jBdVi3iSMIN>>FhAmtbN4ss~kP(nrbVmGb)6Fhh(`VuU!TPJ(#> z-^ByF%pNqbrxE9CRkUMel z*dZ5J)ij~P&5{>4yHVqb$vVd#N4Gc(va~5Q9b7CpyG04`+4dPF&PS=30S!%-gB+9$o@z!?6BBf$BnyD>Htwl*Hhg?^o8JR?#>35OMuFUjN#;kH` zGlS+{ukxQ(S5jP7U|xxGu>SWIIv4DR-av+?<4 z1hpcNAp&ICOI}+XdQ?(qaTuTCH_);SxX^}!OTg~ z(E_h^@PTJs?&Ra$$UhJPc&_pmn8%I(^=~hPCTcs))!*&I7{oTo0>ZT}$H@JTxRAR02MDm7v}BY0d?KpS0WK9PLuIB<77 zM)LHj3D>`vmT(=2wWUnwrieQIv3sF`e5Kc$!6=q3)ZUkl>ZS7M>MC;hJlfpe*!f}q z#pc%YwP%(Y3Q$r@%MbPY8(e0niA+H@$|O%b)xQ|L-?tQ}JSRZ624$yfQmeK6@My@R zS~^ihiM7)j4tcmTCr`$w=tPLh|7L_Qb`97kmD++fr-*BfoQ{~Dm2dvZ_&^*ns`-^N zQwI=5<{28|;~4136x9E;&7yg?D!Ssk=HD)`BWQKvFQYjDxVhPs5+VJkXnnw zEPUyw&Nj{LR)dCg%|0#dbX3HY!6pGWDubsTR1IWi=xkR-pcrwviewGC)DI4aWv7(1 zHAPmsE}U&bXyHubIkoCKps{PYs)4#Bkk&zfHq4M{L)iz5HhNyR1{rRY>!8~TyoOvw zjyk?|F(4pJYZ0b-#3%6npE5nmJq7P;7Tu#H!>rVpo$uD3y;_H+d9jX35YavQG=*TK z7$1ET@dOg-lS7Iiia+#zkJf#CQO5weZI*3EYK%%$u&J39aIuZ7c;2t}DV6VAdR&k< zNFA)PK@xuvzcSz`G9^-|JXl7q&QF%{H|qQOFMZ7vN@h5DJ_$|+s-zTM-6ffq`lZ9F zcc1|vp3^wr@G$7!S6!3%FY9@rlJ?fT1QAjXl&7FF=aJd}6En3+ZRr-SpW? zXdSO2zQl3xrM-XMTK5$2yX)`)RgER2}uGaJrqqNfYLm}0L&3WcJH^J6ho%7{AY+Di{8Ue=if0-y8g8( zbdB&b4vAHcg@d|#6=GvCJI`2c;N~OE+~2z#_l^fR(1SRlu~-R80;PV)CSbv8k$%GNNTShayGhaBIDS zevNh;X90!B6sLwipu3R`8s37`sZbgeOHN&CC{+t9gR3y~U)K>K5b8{4Ltz zxV@!dB~E#ZPOO-$tEHx4*TPyRtl3XanVhVutLtXvY1t&_RTA>1PfMj!S_@Ny3*R3j z{`rb0q%;yu#{$dMWI%8bb9Gctbk{FQR%S@~q(aYa@2nP-`q;}=>a*_2)ZjuF4Oa+m zh8~5m5ZH!0=A>b6=m8~rP)sj)tsEJ6%`9wY%7k|Dkuh)CPB;HUoIFXP%sKl9gd+0L zq)Njcx4pD1-pO}ga-@_znFq?!!%Fl9P%+6wKWJ7o$-Am}da+Pd35rxT;(1XaDU2+N zHXc?*zbg+t=M6N)SB_Rg4z^TP-WNH(9Trwe-#E-sE3P-#qwi51(5%($~HIzZU5Q%mMu6 z)g~?v%;9{qdIPX-u=4BQ5Ewoy@!-~P0C7)R>(@p0>a-hpmE$bm;vFRLKr2VT-5X zR?q#FGw*8zh(-b&lb?|v)x{a~%#P$WauZAr!i@d_C!&y09E7A#p*1o>nXqX&hAjC{ z(rDFLhUYzt_K^fAr^#8+{xe z$bQk!8ApxG~q$i#f3vR zusg!rmGFn-=Y!>3s(gtdyBjws+Z6ab%?_uUu0vvpAyZuS(&O>@2V7Hoe2LwyTfO^t z?|!*_|L(o7dQS&$Mlk1IB9+3~!Dx7~u<&wtA;+fnj;=1w zMwsG<#O!bkl1YpI7x#Fu4vVLIx1o0rcYYfUJc&hPGISajxtUL0aYQlDws5? z_G)s>^vW=Lm0)_IFdjvB&^t~_4EzWYwY>Zr{%HyGr#s)TZLRkVMw*0%Bc#_its8`yt)wbMh1t+f|BKlC=A_SRnf(EIboiznDk`%m0FjQg86 zw-z>@zkIf_j%OP$9zT2aga*kY)O)eH(|fk@d;|7HZ)dZ|1`X84I_f>`Jzw8?{4F4_ zJ=%DN4YS(|Pd9d65a!d(t=?Mi<=WQH#^YDd*0y>tUv0hI++IiXPXPAC#*3#kd)A+? zzt~wpt9aI1{|-NT+uyD|d&Z^~)?NYoE#lXEy!rBnt&Kl@yVLu2^BL})-tIkG2WD%J zo~>(B=oIdD-gthy_hjw)+MkHsRu9*@tZyx_m}1xa{#$HFu5YouHT?gWCn(vC$D1#9 zw(#>ddbza|RlncZUccR2+uGPBL7r}HKEJ&{a-s&H0|@H9SXU?{wGb#q1VuG%f+diPYwY!pAFv) zadu_;rq<@C+;ILFJUu=cDva2xN(QGo%&nC6C7IGi7sH+gPi@kU9-SSH!$w};+QLBK zsoVr^7H#;rA*NutN~`e<*N(jzPezv?gb2?E=cug)-GWnQbrp=e^{4e0k8#xYVXx{$ z%MNl@bM4tWSnRsB9&c@6Ch@fIHJh{kU$YiwIi@I9CD*J6fwA!z8yQop>Hhlq?Tjco zbhB#xu-{Vk$@-&Lvk;Xsw;2tCPYg7If1tqU9%Z#Tg`PR;F`gao^O5T)5@XcyJ{t`! zL2~6dB(k@^ck;Hs4GQM3l~yEI750%Y{3^zWH$vu<#Xum!r*kU7x{x{5TkIHx{7{=h z#WXbd;r?!e-_q#k?mcRh4@eCxYP zE)hBtaz*;eWnUTF*T8mHA=cr;T~a-n!L(F>QBM%k@Zs>er^{R9t;P2hw{MhPb}Ym# zqb#EgOec=IvTeXdSUeBT4u-JM+Qq$WYNgT5D~t1M{o-PLu_-(y5i-6ANYNlggEAQ6 zUQn0<<2&a;q)UGoe#CCta^uLWzrVoQ!;`Z_$Okv?ElwWp-n_p!dELAD#p2|_9eIKU zgkjQ7E4+4Q&`wIQ#`*XJ);Mx2JAW)1XV{X%U75;Z^^(3FM9E@wDk53GEnE}BeVs)< zIyW*D9vQDFycwG3i+LtlQ1z!zG0NoA{qY-`$dWw$7I!h!VG{YW00FDul;Rq@i!$1V z%5H=V{`2NUGJT-wTM|Z#n!0uZ=C-85THq3KkcmzPMb=#(=loNyQhP&fjWP@@j14VF zI%cZljU06bJsAwDpIS~@To)ZJLg6#cclX~&^$kHhK|A~l6SfZ`BYRe{BL_o=J?%W5h|Gr zyHG2|P;Fo0Z04yw%#s^EZnZV5A)Qnk)ZQMLq0sW+dl!H?1BMi=>@3hcudY-K;ekkIS`h3&K^974dE;P3wtHIB zkgq%mb9p$vy4*$}KKwBGwx8@amOE1j%%l%)bNkD?cg0*W&43k02Wa5%$)HE?AYxL= zOGKp?Xt3)C$HRjk(*e!}@1QH|{`v9w{uSdIaC5^qz4*1%pWuO>N5D7@&)zNdH@A0w zc)1Q2_W}>FZf@(U%7#pd!c;mFI?u!e;#b|ER4D}IZVu@j$W+Zxr1qdN^%-PA1DZFZNvGGM{LWZxD_@Kd{0tfQ(0abFsrL? zoppRU=|n|POC=DAxo}%M;yDu(h~vdH#0~EZazgAAm9{dj7?_gzrd@%C-rba8iCKsK z%BQx7>Zy(~Xe~G2oF@H0CWnq9i?%<~GMVKS3u!x#Nu$=x3&cYzS`yZ0DVbZTTGJG? ziUyaoM*NNe$xQ$bPOnoGM_mzhVSiKiSHP2iYe6aL-eibS2zRwyXlsVr|sc+h1O7tnYNSIhy?CYJ{8Lvigy(0<2t90+9@|_$;ExiZGSd8XvA- z>&fuV)!Q7csjc|3))xdgv|@22R1!)N__<%c+OZQb)5cDK#S(;|Y+V6Rg2lYR|2@+= zCdo(7YZqfC%~DQno!s+GY}X-aU6DmyANd+7HB_@r?vqO}Vk~E@O>C5^2_A&Wqz53< zOeZ^-?tSOp6?>%?QF@AVg}DEz=@Exjkr4gbp+#2#Eg7}c!yOXHu!wrg4}T3Kyl%C? zwo7(E0F~0!1W*mEtA1C<(pY=~6*>fPja#*@nu4l|Fl?fj7qo+Aa2e1ga(jz!tP5I~ zuGdM1MG%q8Q@-1F|I7fs*t4{3wtJIWR zYv0$8USdc31%(@+P(~=U2-=)buqp8iZOew8Q5fLh%_lLg{OSm#=Xzc>&`2+w6Ps1= zCh<}8weSME;P}8joCG(KYwJyFR}n&o#Nn8Lz{MQCpzmCT=n;Mui!zxZ(CnH}9}_vf zZ9nK8njqHX;Fu>GKw>^P7+@=0HCZSyWM9pVnN=JNQHQ&XiNw@qqEo+yK?4SS11xYe z+f>jP{nfb&3QrU$$WnR#a_}}%>`cKXp#vMN%Y>muRK^by|Y>Jhu#;FI6J-6Z#;|l)tAkxc$;Pmj_cjW z5xcr++fMD>|1H|Kw*>;-w5|~9q}%0#1UvZP(SNqiol9OL+dwCmmTTa zS&7{a5Xm6GmHK#mf(%XW@D@GXx)BxQfH4V3_#VnDOt+@-2BK+?bC*TY327Hx(c(Iv zqN>1P?653o#hm}+k=cp9mq1zq$uJ?XagF2dx@p?u*7nT0bbGIFKErl42RIK$u4mX% zKZPF)8ojYNN`2Ihj!v#7$G(rILzWRu=S1t)K{-a&>nFG&;xXbEf7st%N8sfez6uR+ zq$9hKd7*#r?#kVjdv|~P`>*saO?K#e1cYvWzs>lnZNx+(Ddqp(+*;}5zt*=Km}s4E zAHCXm_GAHsRZ`j{kps2+g5U;u3orBf=@rXZ0SJ$a)3VIY`qp#X zHgG55)tN*fr_Brm@BOqtnhY*4KcM3n)IVY;A|AES`{QKzU#<}TtViLeOVW9yxXMtS z`Hzpsh#_|H;br#+xfDH+qIu%-Q)JT^VNt>G%bcUde(P6|oG-q@ntN(74NdZrarbr6U_u-DDR^gH$K(_eh7jExb zrzy3f|1LaWjcCG;G2%sHiDAdt(kpHWrz&e#m*WEv=7cAKq~|cj4RkgkYyAYieXJd8 z5o3W_nBSCUO&|92G+wa1(vQqxl09Xgv!8h%;jtox6vd=jp&pPs{#%0 zWZglK=%uh+3x$*y69P>XV6<87MJ=2WMIVqJ4yV8`2ippGog2f(@JqTqXTP#Ws##GK z`&nsU$992kO`gRNI9IaY%H6?d1#;4=;T3>^x7WeQ^IK-o1U(eoE7w{p7FMNtB_nmJg!nipa);5+I7QWNom6AW64ASkLH zs0jK>e^GuGue7}u(UwEQoK z*ea;9!RedP+pF=_WThvPzK2v0S0{%&kb~s)JWO;`vie8hLJ!A{I2w+N4xZBlgC>OE zpWsXx^0+C{P~4~jN=b)4%Nae{sB-I&Le2=ysb}?ftzBl2mBD9S%i|nHgrpi3Y{d%* z`dX+PAd;EuHDD*r2UoxmT4ie+AogR9Wsk>y)^kLlJB>3@@mRS`n1zQi5om*r10`J` zle0VVaE;Z3BUS7*&h_yKZ=rszInE*${bUPK>^n2>#%EZ?L8QQTbenFfkw=gCnlSLz z@a^y?aFl&&ZQEglxd{cPFz0#&5ik08{`%q02zGZz*kLlr{65yEUDkxUSUrMvv4t3N z7|-q$cwk)RTrC=Rs`+N^s)^DVg3j@O0LRrVw-}L*VMo z8W6z%P%i2a7|r`?qjb)N3P3o|fNe~6Ft$L$h??muur|N~yfyoEJ=>iA8JlZSu6PRg zIjZXR9785t*JUUq2m> z4i9lKx4CrE7f*3g^UdJkM-(8>l_% zR>t_=Z8E!mk9n9)lfY(*E$?J)vE~!#DfORx{MB!x$+t2xEluml2$#ELY>*9039G-T z#VP5;Hc{~~XpUZ~$VzTQPPm@J>3PRJI~m#ck|%?6i0<;SF|n#K?+qsmx@#3Rcjk1Xkd2yfxK=ojX7#=inZH!{oqc75(IeL${T79ru;VQ5a=I)3~b?h-C zXtlIHi1IQhUQsM?8V<`Ei?6-91cp+j7$sgW{iup{uW65O%BQb zEkpco=#lO4!33x2$em?VX9z$LH%m4Ut!s()Q`-OseP%)PL1V-9Ba-lYb_QaBz-9tp~C)%&bC~ z0x%rm9tq1)_mQ#(*tgrlwS+wSmpuhj5cv%xTF^8sVbumMHFxLcWGc8L z;H>urwy5BAY0vks7F*V3Ofu*C*ad=POUOYz;_@SPfzvYUQ4}#!<29s(Y)XB*`5dQR zkj-et-tF^_hy*E1(ic#4cmRY^s|A~NN6lYcorx9K#8qNisfyQsLK0t?W)r6I?kM+| zp2}DhO_sPwLFwGo%?PKfQzaC!k0U*iS%kdhXjs37i-EPIOC%B`85)6k61T zhU2TGS$-({p$s>P)%mw*9=-ss_ZM+ghtz{Xq03$?Rr52^Uqq5P)H7ngY)(8`?khkm zi>&{sBhR(<8mR{l9`x5YpY|6XFqOzd2qej^Bq`zy2l&ctQr+%-7+<*;k+DE-7*BB-@Y_4>g{$%(nc+NYDAtI=~LdIDfNlSc=m%aackJY!EF!F$XPxZe*q%po!gq0@F{ zjHP%J_92xWbIcp1nezk5Si2^yunbQ-g?YS~6)m(53M^ZTbulRJxJ&%$ZDgD&Je5jl z%ZY=_Mp}94{EhRGN=_5^(nszyQJSK};`y5eEKd#(m&mEN{5$sDx3Gb}+ediDyZ-B4 zBu?{JjxBzV&R{o>F4xcAjV{J#r*J%eH@Fy4QP^xn83>=3+8Sg6$YclK*mO=$&J-=S z{E+g)=cC0#!g&Oj!@xaOI_xqiHN$H;7>gVec%I~_dVmHt6g`i5KMV?_O$aNfC>1i1 z*iiUoS{b_l%KbS0SM-7)b^Py2L=D@Y!aD9a?mv)yrHAzM8{{721x9D0YGkrvB_f5e zi!`{rLW;ASlUon&Xg&4mU#fpmRvMxd(d*ifLjPSjr8O#K1ZT^__rnvkE-B`?>Q{;J zPwQYo6M)gYt^Z|m0YU@%zqj;&=z|X)c2z@w-30P>=@x2w*;|;dYs_LPQUgvbq-$fC zaR3AC^HdxM8If0vi1PXE1^kMVC$KNFl1O?6R1tZ^=VGV78;nk5WodMtF!|UR0tV^T zh=BB?ZvU@O5=<2>X))4H#eRe*^TD$*RCtO}Exs%nuiK(f%V8rl{Ej+9S zc(hmWgu3q`$VOZaf_JK)FD6<<1QeGjduibE;zO&J$tY-A+xyJMq?1i-WJ<$NA(7#G zVGLm-nqtL#OwqeVVRKLM)n8ub1fkWKHb;%^h5g{dw0x{f;6F?hO+}1rSY!iK(=m(q zB3!+OZh09tW0t5{#elGcVIxQ+9%*ohvw$#Jx2gmf>|rL3@reO6eR6Rg#4d8KOw1;0 zui}7@0BN$cy@L#aOpST}OMvrtS?HWTVvLtYZ^>_Z(3FW*dr0TP>n9{tNks>)V89dg z!bH1JEN5C~9A;@zq!pBgl@#Tm$g7$%0hK=WD-hT>!Rl8&$vP_1uP5uGSfL+NN9EhFaM0cOoiFCq$Wrh%H|NW2Z7D!_lCz8f z6%wsKhe@H?oFlNfo#k~t4?_Ld6(l(q=51Vc|#Pv%ceD(2}6$dxJ^17v1WHo{QKx}g$_ zij@IF_sWj-XW*5UEQ6dnz>&~V25PEQ87MRzBuiVzJkVUGofL?IX!a~CW0I35n@)06 zO#1&~;+5=E_x+N*7%F71HFyJ(bYY-G{g)k51D<4AZ#dhO78DZ)TRZCifqiB7_Li0x zqpda6#`=sX=hg+ekZWBG39!X~)4CwkU>mbD19QD_c5*fg-M>CLcj@1P1fpGx(52;j zyd%qSkeBAujgPv*jy=RxvR5yTF}w)7JP^S0Doi^-W>E@Yy2+aYc@_w8ZAsWts(#WX z_cNA`MuXMj+BOds#g-dj7)^F41zN6*kXOt&7+;%4_NJh#S{3h`{aDgg%1NG@I3h1u zU$Q-M@bK^>gE)O7&vhECJ(DR~YnJUlxTOgCp-DS-Kpb#bqMF z9ikV6MB7*2w__xZWnUG`S}n2p!&_NQUau|T9+C)#`a=?=P(Ee(IJU;qs1LW6Wbovc zcw}+bWg8NM@?n@+k?w#0JCTQl=XRFqNyBF~?^PRQr~A&r z@(fg4WaOJ+ZF;RCODdTuRdd)qoU6+sL+>VEf!|%iNo+5Z7;sQ{nFROv%OrA#K?R9j z(Fl<_NoQnahB@)d-IO)b((G0C7~kwuX7@^$MOr93Ea)|k2Y+=S@GmtY)f5vmr{WF+@GON3ADkj9_77}yg96X|)*~RIV zc*n@TM=sJp1=zlPr6CmJWx(Ib6Rp@RV|Z(4A@0=Tpy^;j1`pYd%W-@u!{_-O-J1(% zU|e9(k?YJLZfT`qXZmDXbW*$|xz^=gmUE5Sf}m+Bw$3&P?_(Qsz(!LdvsC8lf2(iJ z&A)9X{uKhoQZFl1;qrI1EL(R@^ zR_LBzN7MyFee_w?()ncb*6$yJLX$yPxFexO|MVdf-Lid%HivR4s0GUiTpdlp1>U8@( zUWB_>LHgpw)ye1qs&V`(=F2y%wBzVk9x7lJGiRGlh_<@U`AqfL{2L}7e)^+n!y$r^ zl+Tx-q-Z@>h@R3pJ-c58osu0yk@33yYa*VTmTDpg8)0stzT(F>MbA6Apnye1-}YB> zLa`ZnaJW3gm!}vQ6FE0fvJa6JTfY3ucy)wqlq$Ud_JpLP`m%WMLdKM<1O}kPsC3f3 zfxM$A=>&w<&19V_o5jJ~k}d4> z8x^Jw$d=2(`+bEMk!w`LXQ$AI8c5fFBxkC`qKkIs=?;*5ne^>2UJubz9J7heg5@Q8 zBp_ZgY`S>UMOIWd{Xx(QSyJd5Q>P?ueb7^Xfg92gK%3%h){e2~;7EDGA1~=BjY~Bf zAG*ZN$b=Hpt`Ogev{1kZ8QNFJLzes94EN=#^s)KIoRex<%@#dOqEulWuFurec@r%8 z2IJXUZY3t=(O=AsxN3kn^YENy1VxZ+4qA-FFsSH~Xu-cM4ji}Xjb@+c^w(B> ziaZKJ3TQgB4ebuT5Z#!Stj2iGH4!fh%QTCdm_T5J3lUKk779V>9|9pVDm(&D5-sXp z#@Qw!Jc?v8evSP3GzDi7(}Cz=_)1YAE>Dl2gB%E@q*CZxQW;^VNnX*6->$gB`9-62 zSZ;(@p^5h&hll|~n97YTd)oy_V2^H5M=IGuiU9zZ09nCM+C*~dp~wgMx&HR| zm*Kk9J|PqxVGd%R0ND8o1qm8Log7Z0A*w?}M#v5#P&x?3k`bWq6%otQ0F{}?pcw!R z@KP+V~Y8o>{gf1Y7tpzh+I+oVvx~jKd!3A(w@_G;ny#A@) zsy`Idu8M&T4YP=!#EImdI<{j7BppygiF3-+thnn5J*4TOvq(e1KB3RLbrE(9dV950 zP$Sw_dMc*$kgL8t&!Yqq{T&$p-ty|~y;V36om^xlxRi~yAiCYBfl<+ zg4sQ(E29MIxyne}s;srX)VN!pgY1#vLiSW?ck&_XK;&EGCps4Ea>3qLSy2!rcq^bc zDG%J`x`2$6opl6KlCXLRMN;WY@rbW3()wyd?vjTF`~q& zZV;JQ8(d(fw_a%^yAUh}a$;peqiYCx$1~v17dtb7gni+@WHXnez)LK~f}HNxx|l6kZ4Dh z%Y*1yxBQ|Pu%2+%LQac#gIV)2-fxY1kTQCx0+be~lOTIxiRh6Oo{UL;W!sXIDCF6& zl^b1kVq!mPi=#s;(BYK?tz8gY*xdyw3%i;PqXFHG+qiEURHZ9C#Mx8&nnaOGT-L^m zKyN==QQ1{%>ZDpfVjOm*E~Hw-iOJRb;*%9;ud2?HPKFe%=`LzR>|+$&7lszslKvG9 z|6>nYEQOpz7batmYjNbx<2nHe5edq3bfD**TyV=Y2L+@f!Yt_0rHCf5fEcJZRu-ml zJ4HB0jdp_Vv0A$aP31Rwjt5~-&~$=i z>G@AprX$>4PF{+%m%r`F=|ljuDz8%{htNR>`p~Kh@qxVFpxqZ%1)Tj373ns@yf~LF zNDe&+ctd@7R$6^-QEn~E0-h~JV%6RVFNbb8#cAj9-z@pq5!sCRHeqfe3J@b9F3Tt3 zEWbya1H4_eCLy0XVD3fcR-{U#Ybs`}G*{h`b^_B&?O6S=NVF*hA1}_X_E~c7uF&qe z4l+1<;~h2&TRR_0^77?;H}t@eIGPAUnLn0(fci^~1@rB8_2)`s1yT|#B*xb-wbeA! zeJbx~8UO!2Z8cQK@$UOreJm#D5#2hb`N(TFL)dOm2r$RbrWTtuWC}uxj4b2O!urx| zXc0?%jocg_4ew+vkU0PpTkgK}7ulncdNZ*3@r0A7$tbz-{J4&Ut4X<)X?k>|mgoqP z*jxg?Evws%Pb2vtwJ1ju*G5&wA`Ss0aFsJ`$V)XR!|IXse>mlsln*OT)_eJt#><73 z!JTYOt&-wMM+1tYGHR)@TH`R&mCtfHNK@Py@*?yEl;wiF;{$6^g_x>>&X<9L65Bzv zjrBP&Y@*Nb&dHTFrzP!bZ*LJ%<>xh6^x3XLTHM4S3hYZA+gUBkW@t!wwP;=gMgj}P zQ%+e|+IgY1=OY%(WU(utXdshOzsoGt!g}&DCpBDzspXl}15>B}Wrsbpyn?kC@{Y{c zm!uldjU9Jj(jJfpXqDS_BQ@l0CSZ_VSf7c+ur(K={}7xzjf|@aG+z233H0UwI`u*1 zN3tO#aC2koN`wT`9$KZQa=KO@|iCY!#TxeCsxF{!$Q&R|UZ1f?j%z;TC4T8*dHg!O!UZ;a0z3bO* zM>J4f%^r1*sI@s>fFz1@$B(r`G^O-|+|CW8!m-Z03Wy}n;4MXpFu9@4N|2ZvoK8kG zxMX(BMWc|6bm=Pi1TF)fsfG824$WV&Wlc4pn=j2#PA5}B$Im@W*5RhJBy9L1 zv($O#{#p(0z?C|;+QQgZ?oX{POJ+H7s2E*@xreZyLkM6)&S3EZrs#!s8ZY34$6d?? zRcTQq{GVXq1?TMrDCOOmyNk=>Q3@;$e;xP>N7xs|R}@|&mj*5&O1?yr19vT6ymSd$ zjS#!-NWj$0OM1~ReKSgy6M2ee8c6+=;_v5}Bgrpt?=D>D5R~+ON!A#$qqAk#EAvdP zk1U`<4I)rM4oIt(5}5)0L+BVDBFgb6?Rzt}1|g z`r!|exSFHrZOv6gFXF; z#_J^#t-}5Wig`&MJv#`;PRcSzFAX3mi)pi0LSn4#B%d?o*Ou4iVhRDwSScuU@V@CZ z>_&&j=a}S90tdKG!g;6iZqyo3FK_XOt;p$%_%moK#Ul!(xfOj3JiG`r&yLwS_zy#F(D!9Ox<}t*J`fANuqU0qmo{M*Afrv^qR#)GbY>D_q#MD|EaKh^02 zx{${K`-9IlfiJzArjReA$1){n>1?DuApNom#4IiW>dGF3v%ZK>R|u?&_=iVK(K?dr zA>(wkyiC|CZwL^aS_1M@cq%2u+|ZMcfKL8i4x{5fv2-oM!}2}Tv4RJzp2gxwdir7$9|1b+kfmEK zhpgS@x=SRo%yN1b$;;V0C>L;?;og$2X4B-MUsNL7Y@C%U0J&|d2wu>1FW9{=uM?QK z#Lz3Ekoi@Fk~yc&uP(2z{Ctpz^s6O_Sbv{`MgYEqM#6+(9tfW~7Q1j%2O&_iUDa#X zzH`HGYt>6mU(!oX;X|7jcT$&CJ1cRa;TI>aeD6ipw5|VV?w+X^8S2U@0(hC}Uel#C zCRA73_z|2dvGg|+Df$S(;+uC&vo0qFea+s^{Ps^TiI-6O5f%!vYSx}m=OL3bmQAzw zbveOBf^{^tc+wiQb~1{mWSD2~V7zjVR_I~k%KDSAxbH56ko|fzZ^Gt+5a0Sa%OZ{S zo_nE&@P3(M9{7Bb9WkMTlc*Ta2>AL)!*WD9z{xprCA&= zjR{mld9z8QURPoVB-F$*cMWce@CwdIx#&`0fRK#JQbnVF#6?MQ*zk%v78wzXb-7bD z)lLE%4cU@aCJv-x998H7M_<$fzAUDit$I_cH*}EXEuRDdYTP8>;CpeGynvKdo7y|R z=1YpAS7F1Dt@^?mT@~;zb>b}qfxK3iPICmZUocKqmRBV!3>_>v*AD2$)_htp45k@+ zX>dql7%GU-c`={$$ss*Dk$&u9e%R;toBp}mYFU8E-owLmr%cN z7U^oRi9&Zx_^SX0g+*R+aVb5TZu z4x|!fosdnlUX-%;;`B!~*_Iru$=w?tLto&~x4Zyo#J#O@&r(F7s+(pAC*4|Y<>n9_ zDAkOc9lmgMXrM{)P)2nL&e?=FeXAlh!ez7~D>PqkD8V*`MZMM1Dq+-+Bjjl`1d-;k z_;$~Lh13T40C!u9eQ29iboCps?AKJ!y`J7STU6r*9k0Hsz$wGgAzV?yhy*)Y5O+f| zC3#`T)dkCH9LmX=E69e6+NKT<&zJO>&{g>8EnU2>q8i62$SJ4j8~8v_EZJGBJw3dX zSb?y^KIdb##c63vkQJ`0mBP~!k3Q7^u_t7QIRoXfYmSChBTb=7fJl1K(}ldvypPPL zFKG!U53=uYH%b+*JsyE@ucYUFPBrmPrHZl0afSG`;vn#m{K&54n<^Frn?!erVTk6A z!-#y}ZbkAnM#p@F?Gnv|f|iath!`PnQ;tDtCdI<5q?l2LX%}~02Y4|JN3qp%-#mQn zLOMxc^ej^6=xcORAKX19Nb=#S^HfIYL?+d|B&ls~VR~Lh-P}b59?rGGCC`|bZVxKXJTUEOn1&%hYr3yT4F0g6opjt2~LkRsy87dT50ohV? z3RmVxTsh1+50%eCNXQ^pfqWv}O>kZ}Qcqz!ZJyz%P;>N`xiE)DuU{X1e`@@L8_3!B z?Qw8zb2uO)?+#|-MF}W{I3eQ}1T;Q)eJG+IwNs0*D*9YSF;A=6wp_xfoaKc4!jMvg zr^T~`7xy^;6b67@lqb9rQ(6!Vt5E9bN+Ry9&_r1?s*0igV4F`e+(mGIJ z@*cR%?@XZ4S=q}ZiI>fgFsEC|E$pwvoSa7*$A;Qk0-V>BwA!xmMr=BYotD7>4>Non zrriX$(z`$~CJI8Q4cHlm`7^;rYfs6G&8-SAQ@B}Gi%SFV;1Jw8vb;k~8aY5++CmqS zwy|Q)T+@EEj*(~{TSO9*mD*2zO;p>AoPnL1URb$1t?+m;5BAyhKoSBhWr}6%4gEt1{2BpL`k+&}73TWs9ZsUV!>~Ju~ zEP3`2UV_bDZerf8BN$+H=I(v;()~g3wvF?9-_qW6SnsN7pU7(k#mzS9s9TW) zz_;^_)H`Lv#g!pp8-z@So`$X@{SD2LwbgoC)2aeSC^<}+jY*JGl_qKGY3HP@;o3^| zRC_O6!2Kl#jC1KF;&;XJ0Bc0)^)hDezWNnY(OA0F^eZPYVGzC8e8m}AocD&YBNvR~ zhuG`VGcl9HbVyu**q%Lpv~_){{{8xF*W%jLD$cox1TdE@>Y?UcywrKL&@%%CI{xHU zafBGYbOITRtW~7tRA@&BqSq`s$x5K|Pi;<&Q}cv7yRLJgTqPzA$iX6T@XMoH-gx5; z8oZb;Oe_9N~9D`8I`!Z@g2pSv%~aoG=vErWHywGUjMxqCPzm;fJf59ez=mo7iYRh)?z&!gMI z9C9Qw!r*XIstY_9=r3@o%jlf*IF7@TfrX2_Um}o3TTvRcNU;c>zCX&lsm03TI$5~~ z!Cf$x2p#58>Vwjqvp0(nb*@3Pw|SN51gS`3ki{ns2I*}-vOWur77?_dKQDP67*7Pt zW$H%rP$cz3o>1PeXF#E0NypyE?MpBQeORIf(qEB>MMm^lM?VZq`rayCGv_LoFJ64T z`|`z0Z&Ze+@4$msxrzG`mS&*lIy!C!+7gE!ZZxdH*EbKji)&sH*@%3d67MH5PxFvU z;PYu*_zHq-fZmqxtif*~WID~r>JF3?R>u8wb8E<~StBXp63gY8I`8tEU7lH&RK=P) zLy^=)!7*+%UKU}$3=*GS=)m={^36Y0txn7n<8Ab0Q({t;%%L4c9%}UQ^moa5*@mC=_ zrH+7}TbAUXGBoIdSp@IG_tA?B`|xS{4pspii((nOQt%ORx`}{9Vn|rKd}`d43r2CS zMkfrOUQ91uh2day>v!M?L*(N$ZX$)ZoAM?zOt~=d+F)gTbZ7$UPzNi+F~?^VZnS(eXhvKLD^J!y`juXa&aP$V3lX z#k%;&0CI6}nqknW{VhoSxG0L%t zQ1$)c@xk+zzOmtPnUJBe(HrMGWI9m;&;bPXMg|p%Of@GcU<5^E!fs*E-j~Y2U>_F$ z?*Tm{DfIPx`6pF^5yT&Q-sC#c$X}yTw+fl+YJ=i4I>W3Mnpk)ImtF9r4j+kphG>** z@8%R0VM*&LdY62Erx)7_4Q}g*6~Yy?TN}Zi@|wDmpA(5M%4kS58Kcjb{c8?sV9gs5 zDg+BbU?s*@_%8N93yVv*K3G<2XhDj|ZnVRrr4m5KmP&ZZewZQ`>5CBrlkSzqg~nXZ zD-HRdR1gK`6(J#4YxBuw#f977o9_O#i{0Ox?3wER@YM@-6s}4J^-i;raC-V~R~0hn z^4H%8uT}p#{&LP?X$*nw@<(J|6ip{r z#hZd94ar#&Z$ah-qp=e#xu#2sf1+D*Za&c`rI0SZ{yLL+C848dXnwu1P^+zUUAlNt z6KATStivnm2|BJefT&5NM9)k~pz2gFgaFSR@RGM6@HdnvnOaNZytOT{`KAIL-| zN4x47*Sv|%B<@2I&xZNvyRW51uY^k2u^zCELnNn*KTLn(AH)?kjG$p8VoVjm$pF}& zB1v_vfiXn@L>x*-3coF{jWqcz>wj3+O=|ZyFChnl%4*{}@zQVLSrAlN&4z|SIfz44hOA1U7~IbRnW!Q0TYkq?)Ec(pz;>?{Bk>50ge_rkAePz$Nfx z#ZsueDoYg%1`2K{p>M2rlLy@iRkf46l|Dp;5|PN^H)-aEgqqOt6ahBg;p_H6k%1bX z`vp=4bPxkg@t&atH;WeXU1~p30P&!Ntf6rv2g*+5a|7$ZnY+*<$!l)fjABj1BVfea z3}k$zdZpUyx+9VS*_yr)QF*n3yn%N>r5}B(!vMT}CJ33@Z$*`p5tlZP^oUsiar3Pq zgxZ!UzHsoWt|APS^+(7Dt{(TNNWCT$g_HCmC!G#VY(|8T2+~gb**=X?jyh;z*qFlj zES$g}X8>yQIl#5&sLzmVY?{#Rcl!;v{PqT1;ztemD`~)gx8K0X@>;eH^w?iT%|vf) zC|;=j#>Pe6_)w^Oq6S9WF|lp)fhJzIdm$n!ISyN>XrAL{jny`m}$66m{L>E0~xTJT;Sl zGa3O);9o+)op1|t{VH#p{OF;lYuLZc>o-@{8VvUQtIce$k#JmC!} zuy7Vcz-0En9p8)}nm{ao3Q~XF+dDdP{evk#p)Iaj?!B5p0gF=hsol-u+Dx{~O&~;C zh&Gy87BVJpgH2On`5P6Gj1s{jR1IvgSR_Lth5}5HK7^-dV3N%nFvQ zC=Exc18jDwIOYnnb2fh8Bh;3QACepC00w&Gu4T+;BZ^75FFk2KhvFf7qAwiB&0 zZSS8(z1w5CM)9E#v|ED;8g`m2Z+z088-uy#B_yOW%P|KBS9`4t4PVbwNHP35pHn3z zVvKf|5+J;VviC=fX$e|-g6g&_nDG|&Fyoq}w|r9|4v>hpAl$-hm7)gQsOI{$uvr>Z z`DV2RHL%hn6v@;mt3Vq`h)m9HzK57(Fo$)X!lU~ND#JD;yL44?Q6EmU3Bxui^oi_f z3vL9a7(Rdr2RCwSIhWH8Y5_&cv}|f-9c7F~!U)bLPH>J+M{Uvpcit>De5C1_6zdnx zrf4puZosz7t_+2>s1=E~fN$eVpFfg+L_#vBq;BhS=mF=It1Xvxdg+p!+qtGYDP2ze zMRpcs{X5u#T;e7wWO8E-9y?h+S3c`NP+`%BWPhU2RtPY@1rVe&@quu2mj4Oyk&4OMx=^+Y0bOPM5 z;f2}dl%W>*BwA{~j`E5osl}MfNLNu-rqckh7-r5c={KXsDc?vpYS37s!z7!wf+zBn zJmCsad0d6Q6w}5(buS_1)3j(=Y|;Sr{O8-SVUR^?H{T~ZP|eqZ9)hee;q(@Zxhiz8 zhifeUMK!e`TW5`v>?72k69$f)pqFcM=!84D-B)H7VRLm+DI{Uu1ee^-q1%x{NeIo6 zpt)pO5iCM21J$BIo-8TXp}n`Td46qf@F0Jlv`YG7Um^4Ot@{cVOmf9J?k| zgU#CuAAXIL0Eco?#E?Wq!neP&{1LA0(^b3Nb&5RuGc~@1+7uu%`6|hhCI^>htwAyD zQ|}dCG#=GiOSAex+Xv29I1ILcZVE+!CY>gXW)V?(1>1u{7R#%FD*U6)xSUm%X+GES z4pf}K>xbueT<+)MVLr}FH@nHRPu*A*p$=xJw?!QxHLJp(63lG8rA^@&H7U0Vf2fWoGw;CfW<7Au_N;=C%kND#WdfoWantbc+}3(GV28yPnEqKuHdyeRIU`^ zG8ZL`Cv`CVpE=_R2?z2pl40LT3ZgF*q1Y_4uV-L722Ol`9ea%`b9;P!{K3@tAOe;8 z5c&h5R_y_)r}^QfH1{Z13Ay;03hS2heU%WLdyI2_{`f|)ZhXU^FU&W^T$5Qn<+;Wb zl`f>9ni3_#SCJBtXVQb|S5r%g1cD|AA_(*xcA%tU>E6>@+`CDEtaeL{N_Vvf*0k4+ zcb|}FaYiIY!5&l*pjV3l$u(PrfMh$W1Wvv`MG#(UHl|V#FV?1Pq9yxTMcv1ImbR^N z7flSF%%ZwKXM`CY>H0cFM|>60kvyM;jymBVl6~+lEU3>_kV^;3y^Cpld6rqgk-D5h z&Q&f{-aw#``g$%xK@x&A3D;hFW-8r_fL`goDCFc<6;cNT>J9LVc1{bammo=W?77fc zTg0ke5n^RMaarZ+70{+v(@|!)qL385gRIe0t-yBhi2#jATWIr_J`E6r8fgK?(fV5?s#Hk%wq(5v?<0 zi$vz?g*If^Pw+);l@~4)1O>4~)_vYAg2G2%P$vq9Xi~~t0={LJEckU+3*a)yA=%&5 z*oY=AjL6ou!{=HDR96ap#GIO;f;~5@Bbb$_Bd_E5YgPyCWUB$!{;FBcaVWXalxRHR zztZsxh=0>NCeo>CX>~<}@`>Z26uz*TZQVBM#ZB25G3pirrfDZIHF0@Ni#(QBDe~22 zcTmgwR=BZKRy-9MRaPj9k9t9dZ7(|UYJ*!bzYv?J+-GZRUsFq(jBK&f=uW6fp~l#? z)uP^D*f34)ofrL~I)-{zJU%wil`#~gRVC+bceo%WvUD{HTe=v&$JRV<<+HmFd%ayfD6 z6!5_re7a7|xhjznC_Y>+M*DE{;4C~{)$T#WS#vMhozOG7U}?gfY(cbj*f)?Zr#vq- zx9CzUAGaDTJd-8`S3XU=K~{$bKv=Cffd z@HKdK@=ibTB8%UpyPlMWdZtJ5y80&;!WYbIjf^Xvb9Dw~y?frDAAE*dGTZWhFJ$7j zr!n7KT93rG2i^b7!ugxV-~0k<%*^zDAsTajX}zV!{J%jv-A}}M3(eLVH<_G+m#S z$98J=J}erN?0q40#e0F(i(hwv4sln^;y;oTMYQ6W39#~M3t*YVb82{dFa>&&iq8o- z1#`XPwi!I0Y!rXBOGSF?sfz&EWYqGZ=Q37Pey_vW}p^cNWSJ#10m`?m~{a`w9ZG3Zg! zW$JNH@sqv%HoC6=vYRksw@PXwT+){_Z4o?$4?bvE#+hltW|GzQ1eE|`6sL93c<7l< zT^ZjZJ@x_g@m(w{$sX)#`WDe=a75%<61lq~XLye0p+ z@-~0+znE0K!8WUAW;m0d&OCW=(HWA$wMhQP9d)Yh{jJQW|86!T63UJcbo^JQA^2|7 zz+^tSF6A*`_m@c}**Vv;P6Ad=!W+^B1;IR^kuE9Q#;JmDm6Xdte5(W^_p?(V;m=eA75+kPI;l^Eu)vtVS zvhlU9x8MHsrMEx5{nnKa-+t%Q={aore%e49tJ?(M zMU@L75uKR|grw-se93`&OF2;wCQe)ya!kYrPFVkt{0fy_B;%SbPSsOZ23R!9}ZM-ru^P%B@18yRmeBA-mW zKUe*zo-K0u^-Ph)YzevHFbij~08Zs=XfX$Fz7Sj<;(R&8EMQ@fW(<_@)~F}l$V_dS zETIs3F76Avfokd5A>5)<&4J%0Z!KXj2Zvy5v)`FsSg!>T&{{9thxT@F%$p;M1(I!OV&bmoLe%Zc6?;qd>-|vOi{WMmi^V~o zj;LUL5<2*t3M*hj@rxaBi>3=7!o(ViG7F%%cOpZdW4kjng+8>$GAdG#onQpPRFb?F z>>Hr`^caVmqnUM+yaxaXr@F z96OQ#Ypw&8KE0GY_OAQNuP)bd^ax_7ZE@4D;0nY|=+<+K8;qXWJ=*5=B&hADN3g)Q zl2X)Iq^@Wg1Vn>-;h%+vfYE4UgYO|{CG0$;154h%cYX9KUS3v04djKD*Lux~*W|ne z86l%xh}E_v6$~+n{86$~BH7|J_M}u<#1tAp*lJW)JM07c#$!y$2}p@(5vXCoSr%z! z>rc~_4o$kplabn}XaaS1WwqJV)Y|em@@pf!C>otX(}0@tye0k}CIiD!2 z^j7uZp4H=c&B26XG8p-n9ZJ2?pFT%e1}|5z3?h`N#yyrn3I)m_fW7npDDep}F`lCH zp@#0%G?u}%<79!H(jZe`LEAB6${;4EG6Nzt6JpF#iRa3&+j8)JU^kh)2&%GVYoK{N zqg_4p3%IgG%mU?&D-m<)fgHxKW;`|5m*?vrs40C7`xi4JgEp*mBFvgl!ZtRw=b|&B%;UELdKL%$!;qtGSX(>-iUP&z!VE6 z7lR4<(;&(SN9)}z6^|{N4g8t3o9I&u-WDz_Yd$9?6F9z$R3wJWL|!ysBJFVL5miMP zL|c+7CEfD4=m9bWc!}K0%aU}~fMkF?_|9Zca4_)>;8bs6>HPrlSqN}%T@b;iKEnk{ z%b6GHUgZ9a>&VLtT|B@P4KmAEHS3r6krHcWdUbXj$)V*&QOyAWYGlw9UL@?$+Z&)} zdYx;f7(9k2opy|fF`*Jn8~aiPjmhK}O^IFRd;v;SZfHBr1c%y_;}f{aVruAm-+P$z z>i6K-*7t)WxMb7bc80fCM{kYbJj4f5_SeJPUm5*2uAaavoG=gd$NT$k%Hxk1^S;(T3Aq3{9=s51GUie;D z&ktTZ|Jgg|x^CAO8=tKA4cz+hYv($7ACGXWc!ucK1$mRK6G5hja?`FL2r$z+S&}OzK2V%m*j3E zTfIrLcm%#+3k>sK`^1eDL0ZmCE>dggg3*$YpKR0NZdkdqhxZ@5KTZ(K7=2n;p@a+< zhnW-k4uO^2O95K$Nub4$@!RTf?1^4oZPad>(u+!%zDWA%U3Tf3T@QT0OB*#aouNBi ze`S?)Pf5AJtIcc#A9l193u)V&t6>gm6Okl>!xMCe!`dqENzi28P*_Edm5ULS?k*(1 zAT0Ybt*fJ!Tu2nRE!TtcKTFe z`TX&z{SHP=v>Y~4bhV*>c{;K_6h8FUDOn{a3FrDrTwm7qY z$rUW@rahy7!FdTOAaKp{8OxfZpz?c`#$>8$25J8!U*)G`deL3YwEvd1?k%4w1yg=-4;aA7=6zTb3DR#~x}#aC7^Saf9t(iU4; zsgyTK(0TUVa)55?th8;(g7}TLs-@4mw#YZ(ZKYF6v{@-R-_)W4b|Wp4G?#b3>5!s& zBWKI>A3XHQwryaA7M=A&9g{_;722&UA+-gkDcY_sIfP!IK8D{Ut#P}(kkdZ!ROQdR zoCQGs>`uG2OU}HsT^)xt(wSFG(%2vM;i(I>5;^fEodCii3~c`Qixnf#AkNfzH~ikn z=-A-YclyVtEC+tFfo$IfM&b3-{P;9?+;|9A!AA!jczOx;fhJ3V(hY_EBvawXTG73A zc6P!}rC&b$YL5Fe^p)zYn)yg4+9!Fg4;e1EcN38Gt z2_Im5Gd`9d$hYU2+~3z<<^qJkvsZoK3|=S=5oj1Kfv&FnG+xNI!cKB?QO z8qsa(lVGK&Fh0q2>2^ZF!UnpPoLZkF=W^TBt3E;NG${S&1Ythrz~>?uV#-XUYMu(Q zy7{>qP?@l^F;SRJF$~7iJ7V{5CA#dJ1%iB&<+sm=aH&NN)6!6&TE79jOHk6+)F`fOb60WW3m@y^3(lfKxo5FFrd2~&c zxP3fd(WJKLcASpXquXI^4~furx8q9X-8P(O*F{*`puQ~z zQ$#H%q^IQ=alkJaNCFX=oN+~lqb~N&XfV}5j#g#9izJIcX|0heVVs>>+ z_Ae|qaPkd@9`r}dDky-K{L7g*L4aSqKf*&-pgtorb2J1cJ&sbbqbHrd^*I_00o-S9 zP=cSEHkc<@9iv{xR-5JV^8DqY-vNhtIJorrVywdg|;Azi(X6z%mn zTweS9^N`B?*P;)(#hkj#n$oj*)s(f2+)JCu4l?qf#b#&p8mv;VylHNdsKmRq1PQ^r ztdIvQNNl=2N~{aiXCkptOL;c${<@l#!erQPzv$F*7M1i%LWVsbM}kYG}W z;tM}SfQfd&L2*10p6Ls}LY>B`|utLBNjHCr*;TI7DEVC^hZ zLop0*jEN(>3Nz~+Q)Mb&xTl?eUDS|1Wqwl^y(R5%|Fqy+-Tky#KSK88 z#0Sgkl|@`Ph{F@e;S0ZIWqA&}l(^#z*Lm1B+c|T|H7c4kqN30d?p#^^7=eb<7Q*b& zi_+gq%w1_=2WRbXY%Iw=PPttC2|z?WsD2Dtn?NmM4o>#*>a%1bzm?E_j6%6)OVBHp zh|gNMH_cT~z6XIKa!?(JGF3gDsw#nu50oc9RSMJCl~fnpm9%MK#2bkSryTLn^ugYE(MZ z#h6hnudYttk9!+Tv`~e@O_uzI;{*rtGBuR(m4zX^8(x}QM$9AbLB@Ank|^X9eUb~3 z0gd=G3h{}tbxvI}U7bZ9Rdolfw>QIbm3ynpU^C?EK;Dj}wTk3ebvAR#5oSoJCaV^d z1%*niym!@Of|Qq1GDj&>bc_Y82ak=|NhufC`n0_A^^ZG!&PS0fI4MkOZbv zE=5TNcqe`%<$RFoqVFII8;HSKQ3&LyhHk!0T;8rt->;k zrLgLt@aro58ZLrXHLowu1`$lzeT{r_>t0`jxKleR|>CWKYkl zT^By>Jogoxcu0pPIS~l@5^mJt`8V>UJtX9y*%=~-qTCKTzP_>o5`!I~x{Mj29OnWR z>6w{IxX+S1_+Cr|M^ZQ!s1Xt3!l;%TYS1r1h<36lG$dSz=Wyj(E9U%!_`yyp64!j< zk5S4{P*--`>g407XF?c;4BXS<$U$|B&Y%De$zC|Aj7wQb?D(6%zAevm!E@PRR6239F6e43+zfg_4{FbffQcSt(=T4>8(lkk!* z#-9RpqgIj6%s~`=Q_3w`#*{=pB;IYKiO9oKv?-3<&B)2OhV5(eL-H7}V!#v@q!-p4 zNkLF;U^s76yPc!r!i{`ehwyNx1pXWS1yCZ$l_dQYx)Z#C{Dg^(V!33kn~q(E*_|(v zj#MrzlEfv;^>f`{NB9@%q0h|ps${`_k?WmcW*7fU@=0KNl7F@`*7Z@cKn+Lk#g7PN z;PA_t&-0^NI8}=Yu6_jr!_3dY6Ns%7PAoBSwgorDqmtYdkF3bTtWx+}l~-Twtdk~@c>pC? z=XPh^5`iWilQJ}Ya-+t%j4Fchcw!hp2uyp1BY@Seciz7Jy~&;r&*|zf0f@$o+D&Ox zFCgAcDAR%DC&krEG=)}ynQGAs2f$~X+)h28%RGOYd44tX{JqR`XY!mL<;#Wb^C zg2w1_q83yp^BC7mxX67SfjxSVy`o2J_f$LMQ~E^4a~y^Ve&R@`suV3cei4$srY%ZH zJXc!cAca8})Fhe8x>XzkZ>#BO1W4Lv=H6rI0&G8C6sY>;>fk69->4OsoE2G}tcvQin4Hij( zUmxjpSM=rtfmW-F4;qlQshRav0n2&J`j)&K`6(a`k+fwZrVuc^Iwh`LpAM)kZ;CTx zlom)2bZf7ij-ThGRlq4`r`>}_>F_hBN+n78R&Xk(4XR9hY(}nNFfB0E{9jYbDfO4dA};oL;s|SSPNAL1 zu^f?C)R9mZ=Ay5LX=&du-)mO{LKU6+zOc!~jg-(H1k@KH!CYmj@RGfyrKQN_h>Ldd zj!R~2G+zl)&Ik2{sWHX3t+azLcqrunEx~%~Fj@|Wv99wuk4`K}UPg%Q2D1G`Z*7U6 z3(5#u(+hwzp{y*s9f+(ceGR+kBp^R%OzdxXe04-R-d|yD{|(YnTtz*Pzo&Ld!`QrO z)W#BCx}1`$iK2=+LfPQY_k*%7XdW&uRbV`(ZrR*IO`N^Dfa`Lg>_gk!$7aTX@2@X2 z*x9}RD2ydpY9>6P6v{HgZH zX-0AVz}y5!2LP}l@HyH#`vNQmb}^4Ytl?5;Owz;E@?b>pLrr{4UFUEs3F-t~U|Mw3 zEvFx%1|6tPgJVQe-K7D^j=HuPtQpfq3pj!IaSZ_OYByk`w=5~9kW8wylgd{C`<%3) zbADGOnsqw9tzgDVkGb*6u5*+9L3B@PU~W z{LUF`4I>sejcfu3_g8?Ms^!;CNvuMs-hIVKEo7gdDSlg6+%TN4VIPv24sCrAlDzCt z+eqJy!SS02Dw9)#+?EguYPeAP86`Q5;zSYyLG_UES-Oj!RDH594r5WTRnQ7|kQ^D9 zQfS$?*K14jYj-o>kkdojDSj&~mic1*sBd$07_Ve3m}5mI8q8u{i9av;pDc0XJ3quTuf;bE019tD#s77L{Wu3gbpqtBhb00XP6<>trD;HVa{ zSs-gxYxj_pmpySf{;CC}0`mkSXk00tQKT-MXR`I~V|EPT)fymAPAmB8bWA|l*B zz_*A;9_*hO9UC4T$CxjRi1Hk+vXy5NGq1a2nHl^aiMfrr(49b#rcSIpq6NM#6NGN8 zD+_bjS#dJmt`|wDU8BhI;{?^0eGA4RyH8^=@eb4*qTvcH#^7v?+O(t`nb!1ei*^P| z4O0`oUzEQ}RZc=&;>OJdJ_P!@fs6w66)1URR=`xiCUav1wAKn=f)P)}$OOD&k`Z>L zA(QOymzHnHHHP*@Ozq5g)p1kqJEV|{F~*scZIzcIH;>q^*e?{vX`y!pwxrI3P;3HC zOiz8!%mq3iD;f1QxEH%N(`33T9`(JVVYvT7^2EfNHW7I zdETWS8Se?OPAkE>i9cV|+{@^rEa!rlFJi{MqfpYg`e6pA8JKpwWJYDJP{5lx!`Ce! z5SGxgc+tKyI5s{!Ix;mpfB@sKUwq@@H-vYJK7IZ2Yr?siN^h~!MRJvEOm7BaU(v<6 z53U*EF+tY1I__cpC%GV952Tzjqp)s*xZxta9{bz`ir1rAneoV>amt2trRXR@aQZ-E zsF%cLn>5x@$=8hz zHJ3P1IcITyiI_avUR+|3elx^du1tbx$kB1arts({iUI=(F&|Npv^I$gIX`91i@=YsF9z*EdAta>R(BE5M)P zD~PW|!h~Z(fkA-;a>m*7b%s?GG?o5S9S>=eiEItxv0Q=*o5{bde9JDMYz=G%YVa16 zxUJDMnQTeK&-wJl;|EjYgE#xe`mm0aNu|YXkTD;r8y9GZf=uVkCR8y}ZpEd`>7e|- zt?+-u8qb(Z3!pS!`l{lC?gMr(~Xi%xj7TaCpp8AGkKJLf-9gX z_*9zQhohRj#R)SuLl4t@)m;Jox5mZ>M<%BF#;0!fO<##fb0pOQY7 zkFgfcL8!E9SV2LYr=w=(4&L2wDTgDbQ8pzD7+eJEO9*b@NhD9WeQRX+yPUOg)jq0s z3$a=NQdEUHOY>L`B8e0!cuPWoBM+erSR1vMltax5q(-h)6W6RdktypeLNo%E11$k= zWh0icNeX$9;uMKVVKfK();1==G$yOEen$iC81vg*@{`*Ww*xv!%?F;NUPQ)QRzrx7 zBi{70D?y{JIX4SaCDDH}RVWv&tb~VT(r^`ze=d%7Pq0|Tz?3Tyghb+?-dBB^!g>s} zp0wt(m$cw-Xs5WE@Ctb8XC_PUeaGEMGANE(r@E-qI_?OyiO}tfx5PACh59Ajf1OB} zLd}4?AgHHr=-uTKgl=#8Wmle$M6`2P7S+B6HG!zH2=uAjcyg;-9S5gOE$o8TzxV~< zGRS;E42*aaE{gcbd{UReH)N)qw0zYp+aDHg=$+NZMJ;59lU|J5ppsjmbW91+NPCX= z>^C+dnAJI9j5x$(ZF&&|^e)asEP?%eYZ`nY+zs3bNUX@`mSxjf%TM7evS+MKPaza+ znw~m90a_%dON~&pAYLggvA&$IsC^{bv>Mx~IU+|piS1fC9F&R{M=xfYHue4WhcmvD z`Aq7n%GEk4Ip`Kl69~r0+XGw%dm@g)i&p(+CuC_NHWGq?oj8iZ$~}TA_JPfF^cGY2 zWrsKl{iU7OqApSnYsbBs+;TcX`sv05rGw10sI%;%Hy)d;sq{IBw3qxv9L*>VkjRa1 zBBFBI^B%pZi<$T|TFD%;O9igEGb|jX1NPvN$EMf#C~iZ%`oRPMK(xPPAIELDwxgG(yYLTQ8JUB8*5MNR?oZ zePQFw5Z2iS?3zkvyH8`3k(5A24HaWAn$B~YZeOJN{%rI1qG|IPws?{DEkrvReu&vl zky+||1UZBXIz`~5d#4bPe`0e@mY^T6{5VEW2%DW!}ZyU zgl(*K*Ow|}t?7k%NgIE6Q5;&+NUvxKaBKl6hEL|wXJFZd9ivVVwu8(-;8ADxskLQK zCZt3359etkfC)X94Qqm(lbI0f!$?flAL(!{@VGQ3T#WzgUtYPtTA#nWR_U5KSGj!g z;_Ka)FJ5}1GBkasj;lX!Vh?j^re0g^=(t&1T|{^$(w|GN`@6N(+MWBAdE8u%ElwoR zS*VZBkV;=5TaNe|m3d?uoq6JwcPgiEpVh55vNp~@Ob8Git6Qb}e=B}|k zQ%8*bERvedFoO^xEm2)mV58EtCdtpnt;Wl+h|$O_P6l)U4f4%DRqg>5%j;`coP*tQ zo((Y0WBWx8FiRi&GjAT%7Nk0-q0s@Lu!_#JpXVzG9H`IT$6v{tdcHz5HsG9?MV|82 z`W@_IotHbQ7V0y#C8>pRT!4=Na(MxoXhn`ma;!=3SVp>zxxvk+Hbo72bMNl*VtOQ) zqPg|erF!FTZB}|VyNoGgi@%CpEvX|t*Yn+ULM+3UmGL%uJ31!tY5ERwo^dRSWgJjO zS2^8806U>rwNH(^l3ES7((8l)8JJ$Y3d6zZBrXVuuTL*jB-xF$mmOvg+P^jky*)JX ze&5(&Wq7=Db8PfG!vli@m6!X*@%-}n%KO8(M&Z^(1trG%MkYR}j1E=$Mn0%~dw663 zmm+-k=Gfr)cx7~~WBA6+>%)V1H$2jR{nmioUwjqyMn)$p*N1NmPXOq|Xhj+{P!a(H zU^fQGL{LujT^+tYJn_N#j-la+5rH{0I#%hcz|A=^+<)tO-&p15t+AV<3m^smxCdh>&^;rFghRIZI)AHc3_ z`o@OGWkQC=MsJ+&km*DXKnD=i8$m#jK#{5D z1O<$sh)mcm4BGor85r!l4p>0XND6&D&vQy|{4TfvqNu%y*#70kMUet(CW7#hl>l3} z6bB8^Vyz;n){hU>qqerb9s@vkmR%EY8{=oPqHE|&>*qFuRC-mgf@h$$-Bho$H3z~+fn9CfTO zt*q19HCXx{0&ihqW)ZP9`n`?L+9`@A@SvKSzzd^Beu1t|;60jnp#t4v#V=sl4LFgZ z1ziiE)|O#Y8z|BU@+LR#*5^Ws2>~poIP)v!mUTv7vZCWp-ra)8*V-qM?W2WmYl#ml zuX1&iSiH0gn)Q*hg8vi^SJxLdvr^^^V<+~2&2qR-0#c|6;6R>XTH%hw?E=Dl0$i34 zse>cw8ENU?Z$JVpt<7~+uM0%YuR6UTiE;14g#kt1;H9G4o|3j1TY^23h0c?)3qPWq z6-xI8Or1(IDj?2jKC%>5AxoS9FN7gCR~X+@-sEk|%#2YtDuVo?-~nO~qUMRz#T8ch9S8B?v>9?xGSfXYM=4y;NNi$93NT>wZzDeDniugy<2Ru<}O zxD~i-a&>a))5+COCzsC2y}(!zz#B{-v4xRBN)d*{C&>M?=V1d6zBe@vV|HR{WOQoq z#?6Tj(17}iIXP&g37pFxs#`jqN9-I30m*!cF@x!$HyTarr0EC8uTE~|o!-P|ar9=9 zs|ZPGBb*SdV6dvqurh;Zx2r>+(pT|NsR75{GUQnt1LsBs0$uT?`---PfLAI^=^%|C zj4G^cDJ#!+1T~#MxM0ErhaXeiPrQa3WG!C(TwK27 zr0i)Asv;2eoUpYLyz;W)8o@&Ms)(?~?H-nhMop0Pyop;*1#dFIq&o@%jvN7j0eJ85 zK5K+~zcIfivJ)^pUJtyX(gi6fnVU%I+~>FWNatNZM(?wiXC_aO}zCU3|IE{MuR zkC_y2;}32d!v2Y>R)+&=tS0o0t5f}b)YlQ+Nq^7-o1 z2l_lT`N=mgzRXYZ^HTB?rKEzqeIxw5nv}hol)b8D2QN*2aIMneen+NE?L6n#oCl33Xx;5U)Gj=O7Sqay1eL*m_4q2K@DP$CfCZug>Vs7QO2RT z2nKXs&CM)$wGYv=*_s?u&2%h=Aqq9PVd4+yq(XtN_KqWxI2wlP;%Jz~Rg!6tNt6Ls zuY&a7c->M0q(H)-&?#;p$$9X`>*&5LG%%g0nra(GqK0V{ZpOjH?Un0c&x zZQ{oDZtMXLPhfk|dY8Zud{m`K?u!^Wr2yjLWkJN>XeGrjFvRNna9AwgYjj__{PoLR z#IYIWPECdz*B}U)y}A%&8d*V3fEF!@x~(O6U-)z!)larlzpZIX*r$1%P+g78e3(g{tCo^CsGwmC$X2w^m=fpI{!leGrWOqc;%e z9|loC4nbxCn>Mn-X^6-s>8E*)ny~iA)2np}62XcyA&CrMpGRQxG^SseTYk$8bpCrL z`Yqzq--~ee-*fg`7CN11P*AC}4!8s;|Cy2hASC0forp*HYUiAARp;_YD68RotTAQ)y|L4Ngza}>#L}Yfs~HQsXH?4KSpD&(t3Lf1>na`K@#Qc zbMSwBCgU)~$#CStt4P?uaTtm=k;E!6rWWgqwY%8hf&T!ci0Oqs+jJ4v*#pe=gvCH&GuAoF4Q1CiCwaQ4%j3fN+RGAa|4#PeRRZBz)F0t z)nHxAi4mY0PSS2*bc8JXFggbJej&>Xmw}CnC=~E+l0p0G8;J-Moq5lXzrqDY9!} z_N0!;Bt;*;kzu`5z!h@ePIp!Lx*sDH8x#j2jrzP1LEuafcTmM!CP6!-r$YthR9x((_+kC zd|7s!AXD%#5I+p+!)yF9qz|tPaa-DaanvjU6vmGqYV;&o79^uSUMnKBU?=vE>mT9+ zT6z=k-oY*yHYB`Px9$5^221v{V4+@sJ8d0yrjMI?n@bGUHfLRIR-1;S^riCqTYnbZX>(8yp?>HY)oEA&tyLw z!EhdUQ#vXGWgqNw7=8MsI9BEVD1j2Da9JWl zaiyh^BC)3FGNS}ddjBDQIVjCUN`pn)I-#{dKMdx@ku z$DfTu1w!acYJu{uSzG=!HRdW#jLTG&bV(5I^%5(0Ns5gAmet}oSbF`fSQb#||h)q%*S+vM`1M$JLZX5meEyMc7NoD5gn?&*LH0xZP(P!^ALjZ9@nNaptNLTgefs6by;A z!wVU#les@DRjXUAm-0T7K_giZ%X*l3ydruMFw*iJM2UO^E^oplLY6fBG)+qN0?oTD zz-UG5FvFdc0wL@oF7ap&nuldOJU-g}=9^#tW;c5HO=7{-lXZ{E%-#hSXtKmHdRt!Q zVhTWFSEP_xYpO~yP72G!l#J!)lZ>K(&D6k~5K#(4pwYH)6Y!8G!6p<$EEaGlcqB8y zE|G&aEw?++U06nH75aDq(2*PfZnhxthRReZGDQ>G?8M;U{a=^s;+u>IP!>M+YRkb8lsEab@j3BG`Gv z1dFw)O~?#;m4X`a=eH^s z3B++8$PBvH7cBlw=B)ZnGpzw!E;uf6g5H`36_cb&i- z-~>dL&%IM;#1o_k_1y{>xVdc7UPVA6UbN@u0)GT+R2FgGP{al)sT=v|M5>U-eHngz z^!>rH2u2&!wzh0$;fuCSm&94xmZM4aHN>P&iIWY<6~)Ep&Q(`MK{Lu&sT@T$E-f#? zMGs72uCsAT8LC~ z3PEGRuZ*Hk5h3QJ_c>g?t^Lv94E>!0!0@cx8dv*ImJCBl_`;cs{j%@gu~0m)2;QXi z3VUYduma~$tdD76h8uMmChG`;TsrO1e4pzve`6E$LD;tt$G}>dzA2I|X=kaIaOah? zo_N6Go{ATRY7VU_J>(eI)u4VZ2juD|fN8B#(>-arfCMls8NhnU$PxvOAg!?Gh+xKa zuM#xwTj~7AvmVJ&tqTieeEp6zhYPgl`=mKXsxhC0$qT{}+gkavP_} z2x}!fz5vltwm<;3MJ1{B=2j8pLZtMAJx;|X(jxlkB$!AKkv;-|`rl0|(>h71q)54r zfi#$sbV1la*6{NxPA}=ryz&}SL!D+FRrlBi7Z^6uu9Uf^&UauRer;t+gRNPzx`Lzj z)$|9(sBj}tT5o8%?{%#q(D%Zp(<^cif=A^qd?LH>ldpcVxNuHDNSO8%&X}(*EMv=1 z`f)M)c4`5tKmjf-S3+47Tb!;h&`!g8O$(@-&_C%GZF-m<9O7l}EYIFAErA%V+WfS& z5qjs0KgDfV2~=KQ(&k6!=44RrljTd5CiKlpuoOPWE|0i~!xiTkiji0{wx~8ki&08I zOCtJ4;bl4@Qb|aVRG^M^58^j6!%pzrve2CrvyB*eg+qftq3*=QMeTh|se#y=ICw}s zJXM=eCdtxZw+%xnFmV+}`rbe#2DVQn>};jh%+>UViQJH|=j9{|>&X z1zx-O+Mv96?c(eDqVM&7*68au5Ch-ndre9VebZhH^$oGa(BLJlf*%AvH29joctcAJ zd6l6zE)vGjpp_UJe1rYCh=1(q<)NXW0qu#udX29>q_eV052zk`>jVzs(;!`ZQF-gF z$|W)LbBlmBHz`yYLvXF*s@d3}b0aB6t~;rW(puD2ab8YWO3G7r^=yB*0K!&xYwK}L ziASO9_FpEtGCAdP7DE+#FfX9P7|K%WGf^u!&~_{>61%EU!JW@;!PqR?6*O4FrIHI2 zM~8JG=QW1MEpMD10}8R6*W2c0mDVXa`_`9M7=qUSH4vGA@j|G~2!Nu9Fp;OWN9>!{ zvOCW8zD(vtY?0$65+KN1-RrQX5uQRzRzAJ@s+=*v>do)RCMGUo|Ge@Re5*-q@i}x! zhgb)j%u?nYiT+KY`pmaC?c3$@Z*Oo-90PnaxUh5tgKczT@WmREi76Obzd|kPB0?A( zMf9J3^((jre5R-REygVRN;H&Fp4V4Sa=xYO%vNgjT_;)`K(Xr;wW z>*n00b=Kz0ht*bdFajAg!y`}buHwO)_+n&`*3=Yo?~1ee!dR`byuOO#(HF4KEO{w$ zVGOJH;NqCOD=ClGYVG^$$j*$=IRs0@tQ{%wl8Go@tePaE;?BigrErpqon!N{h=#Hb ze#1!qsN#L|>hJ`NCkY1fZ;Y0`Iy}-h_Ce-LWU*KKZ@&5Ui>cVyH=C4J{T|OuXii>+ zLv$w0I%U3r4O-@vu8wM-8hF!UMPAk4cjR}!{+^NF1Ns{Qb{*A0{f%?#9n~TIO$+or z{XH-5uj%i*@_Sf+*X8%G=Z-{02XAIWbCK)zC`F39g2`Wt(x9n}&2y(GU!_4l&; zzNx=g!^N5e}62$-`C&w= z_b2jOFonAJ<@f)qzkf}B|K)G!!(aX(pMKMx{w1Ft*wY{J>4*08ulV#^_VmYm`YZPI zule-b_VjP~^jGca-}32q?CDSV^t<--@A&lB?CDSW^w;g_-}C8j*wcUD)8DkG|H!Am zWl#T!Pk-B<{)|t5$DaN(pMKAt{+v&L*Pd_$0Weh%O8$X8 z{dYe7Lwmvz27LQR_Jk7-c>2fogu@JY`X~1EIiLQiJ>gIUzWp;K{J^2&X6TWO#V=SNLQz|LCvs$>#de@AAoJ_t9VHlg;O&zsV`bT`Su|N7Je6rC#`e%Hy@jdz%eELHj?ITj% zqd&4I(%GXwwkJ~7qkm&hq@_oHVo#)=M}KNhq?bqk!JbGVkN%TAktQDfXMG|wKl(5B ziD-ZH(4L6sNB`ZP{s+6cX-`DvqtES$=zH`(?MV^#zx8PwCs{hG+s0Je5BOwkwEbIr zGRE2dZ9W;RZ2u0Q3}M?u*tQ{Tn+V%Bgl!XH+lH`hB5d0bwoQa>8^X4Uux&%wHW9XM z2-_yYwhdw1MA)_=Y?}z%HiT^xVcUkVZ6a*j5VlQ(Z5zV2iLh-$*ftTiZ3x>Y!nO@z z+eFy5A#9rn+ct!46Jgtiux+yKwqb0W7~3|CZ4+bLhOup8Yqgdu$B%XKS504GgPdL|) z|AEfL6N=r(hWE$Xf?@gz=lZb;q9+uJkN<_$#{W0^RHICh=;78<+$N$wzQd~d& zZ}vn1{rG=aJ)JY7iN~9S@)uT;Vt2=IyF+f=G2XN%!|l%RO1&Kut@dQN-61x247c`V zs%qzNv7X^}=kM^zu(`vY?HD$9NJ~4Wa&|~PJBGiVf5>{KWOn{BpG>Xn{8K&|r|ytb zcMM}Y#Mq8uY=;=zF^ugHV>^bi9dhc9aq14KXU8~ohn%`&7~3Jnb_`=Xq@Eqa(GGcY z$8cm%#;H4`r5)qc$COJuhNH*i)E&do4so=zr8wH5+T1aW?I_0nmwjWs-QUos-QSd% z*fqZ0C7taWZgRFu1h&0XSl*RZ)u%Gx!#yGyydYn-}Exw~t;xl6gbYjSs& zQe)S+ahK!UHE!G`_wO42?UMg?P44cJ!*`7vcPR^Y4V$~f=C1SKKj-)io4ds3u3>YR z*xWU2?h>23hRt1KbJwuBOKk2MHg}25UBl)svAJt0=V;t|95!pVJ_G;?kA+@QLZe$CMOL3`;*ECY~4v{)l|_#Blb6ID29^d!i)` zXHST;Cx){p#Mu+W*%RXI$2O)Pb4)+BG5wfh`mxdEkEuO=Y+C#&zwKG;do)1zto1$4 z+MY@JJsO~U)|Wlb;hy#7DaWv9eR;~B?U^)qO4+by(qNB0+cRpC^RXS(J(CT4+83j( zJxaShlN5X8t39K%J<7g4lN);+(Vo$roVEo_lOl2$7f(iod(@75CR6svb9+XUa()*j zO+)OF1NV$V_ozAdOkeDgANP!2pAxrw|5Ca0DY*hKc&9dGtKgpG_hxN{*?M+@826tQpi)EdGg~^o0q5L$EP+EPsxu@ zZR}6Uk56s1Psxu@eSDOzPmLd+k{_S?h{zsKeGKHsr`~Jw<5TY^`SGdo<5N=BQ{%^{ zq@|}OK^1>bO=dnNHlLbx^OW@R)VT90@%Pl&@yGgP?D%71^Qlq!kBQBFlb{FGPy5EH z2b6F7CQlEjt@e#?4}M>0V&C}ofVykn`1XLZZ{IlQfSPRI^ymR+e&6`$fO>7;_~?Lm z*f%~ppb*(Nt$IML>>F1dQ0MKNjy)ib_Kn95C?)p|(+9-ZzDewTS`_=nar@-BedD-& z&fvar+&(#O-#Bic9Jg;Aw@;4SH;&sU$L$-(?UUp7jk5NMqkZGJeRABs(b+yZZr?a= zpE%k#s@o@y_KoBA6-P#c`{cNNEzH!44%RNViM z%9{t2iu*?M2b7BYe`en(y$^hRYI5a#Q5)X%lheP7w(C~0bJRBMx4vB|D!^0u*aA%GN2r1B%f z-x2Y5WcWKG{*DZPN5tQe;qQp}J2Lzo5r0R9za!%B$nbYW{2dwoj)=b_!`~6{cVzfG zBL0pHe@DdMk>T%%_&YNE9T9&=hQA}?@5u0XMEo5Y{*H*hBg5Yj@pokSJ0kv$41Y(& z-;v?(i1<4){2dX0M~1&6;_t}tcSQUh8UBulzhlGSG5P5DfpXk2W!>>_*%PJP@o(D` z<=OG?*b^n#vGLzA`R~~H@0k2|Z2Wgj3OP3X9TR`YhQDLt@7VBnO#B@i{*H;iW5eGu z@po+aJ0|{)4S&bP-?8EEnD{$3{2dd2$A-US;_uk-cTD^p8~%=ozhlGSG4Xe7_&X;4 zjtzgu#NV;u@0j>IwsqZ!wrBV|`6JQ&$F}x9(bf%{Cx6Uuwh}+lz8G##xDGfr`{hJ? zW|%(t6V@|p=0y8xct815ezT>#HjTrlx`HLJea$>am6Uw^N2S$X?9>*n^ePD$8>>=AaePCwCvxjW$^nsD?vxnB6nI6v`l2=b37%@M4NNIce zz|4@V_~`>r&mPi}K7C*e^z0#J(CH72g`Pe9L*dKQ9~u)q zdq^p9`a@%*XAdbSPJd{O^z0!e#pw@?m7YDMtT_FlG1Ie$loqEyGzNP1kP_nbherI* z9+JCHH>~~B4W+jYYwvVJ>1)H_pKd5UZ5Vr=ZYce17)zdRD7|bL8=h_`eQX%(oo*;S zY#6(pZYcgYjKxkj6yF=hR;L?^-wk7>(+$PvhOy7-hT?C-g#YP=;%mdi|LKO}XTuc0 z>4xHC!&JcOhR*+n@!#o&&i97#+v$eR?}qW$>4whdhVj$shR)}P@z3c7rR?d3@yqE3 zCF|*i@yF?g&A0Kx=>{d}>4wq&=?10d>4wq!=>{d`>4wqw=?10a>4wqs=>{d@>4wqo z=?10X>4wqk=>{d=>4wqg=?10U>4wqc=>{d->89gI{r5m|C^5gO~wDF<9}1}zv=kjRQzu`{x=o>n~wiY#s8+`e^c?l z>GVzj{i-?|EA-AQ}Ms)_}^6gZ#w=r75|%#|4qgJrsIE8@xST#-&Fi> zI{r5m|C^5gO~wDF<9}1}zv=kjRQzu`{x=o>n~wiY#s8+`e^c?l>GVz zj{i-?|CZx_OYy(u_}^0eZ#n+A6#rX}|1HJ;mg9d*@xSHx-%|WzvcMfQv7c@{=c|^ldr%wiJC^ zj=n8L-;DQuKZ9==)sJ_qn6*b4B0hj=s+oeV;q}K3DX8?&$km(f7Hd?{h`p=Z?P5 z6@8yO`aW0meeUS{T+#RW|Ht0DHOF;jXM*qe6{j$e09qhOkdjJ8RY?VsU=c2oU<06J znPj1pK!VH`2*8kzVBOWom*ytprmrmgK3wLYoBxW*?Zmg+H3Fqoe*(L?z_Lz8o+w@^O;VJlNkhec29q zZ(I1d?eX#cw&~Ay$Zy-iw{6eP?QfetY==CzEqvSd4Bh^=>Bn}+ciY0ZZO_u}Z=1es zhkUjzJlgi~bbs6Ay&dw}w(w}%!_)n3lmB+eZ`;D7Z4XcPw@n|mL!R53PVH}dc)GuB z`mr7I+13u{cV%?cF1d6)13Wn4-faZP5#>%^y4gTyJe|CdEyT+g0;Lon{XE*q>Yy8;_{oghH-wplW zHT~ZW{oghH-wl558b5bK|94IQcZ0vX#^2r0|6SAn-Qf4G@q0J?-L6evc7y-B#{b>m z|E}?WH~7D6{ND}!?;8Jiga5n6|J~sKuJM02_`hrX-wpon8vl2L|GUoru#a7{kKM43 zU9*qfu#X+T9`>>0*TX(`&0d~{Ja^2Vo`yVk{Cdc9$L#58$aBZ+>1oLGsmb?g$mgla z=V{32smbSQ$Y;mw?`g^}{D?U?_6n(|Ajiv6c4zs&zX4SqcpKbn8z+q^MUiW`9QpAK5*VPABY#t2i}?H1M#-`z`N6YAl^0~IB%N| z#H;25*WKm=@v8a2b+`FIsh#En*WKm=jh)T^6jSN{B-?L(<70DkS-R5vCQ=2<(v{{n zF1zNkY`OW3%dWY+EOvk6vTH8OmYd(W?3&B6<>ogoyXLZNx%rKc13!2MH zMKr&ORKc=hqvo>5dd+2}BAUyQDp*#m)Li!1ueq#LL~}X%x2)Kyx$LoEb6Kf~=5nM8 zmK94impwLYE=$*&%aJ-*maaFK-8P%c@+Hk>x6S6Vd`WZJZL_&7U(#H5+iWhI{w=$0 zHkai~n#=BMo6GVg&1Lts&1I!8o6GKNo6CyLnrqSjHPhF%=>MAO>ss`G&GdCG`oCuS zx)%LkGksl){;!$7u0{XXOkdZc|7)hNYtjET)7Q1=|C;IRTJ(R-^mQ%zzh?Tn7X4o{ zeO-(GubIBCMgP}KU)Q4lYo@Pj9&0z(HP$uPJRjLy*I3tF^Vqw&uCcDU<~hmcx_n`C z&13QAy6O9x=Ovr#52U|q9-BAUHP$uPd=<92uCcDU=DxJKu2f-j&3$QeU2})#n)}k` zx>AMBHTR{>bmLt97%_^|Zfcf9u}A?=>}Pu6y_P|IXBB z-Mja_lWFVCn%2|SY5}0Rp0-X&|K_^4=6hr2x;N%~v#oXao!=Yl*L~Xay>WUyMwWH6 zwDm~BuA3#TyJ!1vrpW8=*uFPC-Uz$iFg@M~JKiw8-3YtgFg@J}JKZq7+z7keFg@G| zJKQk6+X%bcFg@D{JKHe5+6cSau&!@}9c`H2Y=qrxn4WBeootw1Y=m8Gm>z6|9c-A~ zH$v|>OwJpj=NsmCH$u)ECg+XN;|=qx8=Xh85qh?vIc#&oh1uLNS#N|iH%yuvK8I~?n4jE;adN}_;zo>%8|DW$VjSEszqb+N z-iB%BMvQYCrVg7S|4ozsX2^fjvW`EQ2&H%aSP73b%{iuif3;`}^V z5kC)BoSz3P;^)DN+ta~{?CD^|?df1e_H?k~_H?i!dpcNgdpcN=JsqsLJsqsbo(>)b zzaJUD9|gZ38NVL|zaJUD9|gZ38NVL|zaJUD9|gZ38NVL|zaJUD9|gZ38NVL|zaJUD z9|gZ38NVL|zaJUD9|gZ38NVL|zaJUD9|gZ38NVL~{~jCv9tZy(8~+{${~jCv9tZy( z8~+{${~jCv9tZy(8~+}=KRS3Ue{}HJ_4(kj>GNavKL?NHe-0kI|2cRp|8wxz{m;Q; z`JaQw?tcy*%l{lacK>tmSpMhWvHPEc$MQc1t0BKtlizB{Z`I_t8uD8;`K^ZhR!x4Z zA-`3V-)hKj)#SGt@>@0et%m$oO@6B(zg3gpYRGTZRp z$Zyr;w;J}cYWA`k_OfdBvKscXYWA`k@?JH0uZFx=P2Q^^?^TocYRG%lg5UNw2I zhP+oz-m4++Rg?Fs&!Y}j6*nKO`n>62RdMpcs?U@5|IXyQ8uD8;`8^5wJu&$`3Hd!S z`8^5wJu&$`3Hd!S`91MC{osk>(t{@+mw#{FeG=k%V&Zuc;(21?c@pAyV&Zrb;&@`> zcoO1xV&Zrb;&@`>coO1xV&Zrb;&@`>coO1xV&Zrb;&|fi3voO#aXbleJTY-RadCXF zS=Yf6A5Fej5PI;$h4a0?ETTXSH3v`DY%9+{DIz_1;*0bDB*wi$4ps*uUs*Ep6>_jn zYXb5LIasG9h*!wLI;{!FE979EmSA2X2kW#ZAg_>vb=u$OJ$r?$DDoSxA{qP&Sy9p6 z(^trfiuSI)LRM6?_w^OBqN2UCuaFfL?TYzoM-z}&kqmydBSU?K9I&@XQSd9|fSs0R zyh0AxX@$kFkOOvFn(_)cV5cn#iR=y~ZulsX<)Oq)A0@Iql(_MuMAnBAH-D7K{{H3Rx6z)5e=z<$ z{5IP2@DIkHhu=nf9{$1j^YGhf&%-|$e;$4t?RoeIiTo8xJTgOxJQhlPtVfA_7E0V{p~Sq_!*6~3M~OyE z+~W}(N;GPr#A5=KXcR?>M+GR+V1*J-GoXYcD=}2?8QjLwEbtrOPK18&Vb{_e;Jf-n z@CHYH@cTaO`sK$!q3G)BgqTn<2R%gBb<2LAx`~4UEecyh6#@~N! zzyFfI@kK?AY&aAJ3b+ZP_GHw1Zqj=)=sh>*JsI>GMxmoVXDEHhX_hgWJZjO60#yvMh;3$wUZiag@!ae8No(yo$%?~&VyweSBPiD5~ zMg|-OUULHjjsht+F5oDTa>Lp)Ik-^)M}gPep!Q@=IQ}i};y5_20YyO+P!&l1N2eqs zpeWciNd+hhMoA7pQ7}rJ2a1AG;x$kdj1qT&qF|Kx2^0mR#6h4a7$u$oMZqX>2`CCi zi7!A=FiLy@ih@z%1W*)=Qs051V3c|b6a}OHv-;;+2UG?2*7Xdi3Zz`KfT}>sbqS~n zq+EM|szA#11*i(7Ttk4WK+1JOhW-z(1VB~bB^NtT6-c>{1*!rm7wtbNR`~}PCQuc4 z&BX^)1yDdyunsBG0E&Vrpepd%-#8_s0*ZoNlNkX;!6+FHP!x=kz<{D)lmrG81*0S| zpePt6fdNIqCSMy0Y$+m z2@EI-MoC~mQ7}pZ1B!xC5*SbvjFP~BqF|H+1{4LOBru>T7_}x2y2OC0Kz_Q!fT}>s zB?eRlQZ6yzD3EfA0Y`z9OAI&)q}<@-gK@A|ufsuKTmp!KD1a)Ea(e@)0x1_5U=&Ds zpbV%4QXa|z0D+W?0f)#*IpYCqK}ZoW|XV-KT53uIbhd}@@d3B%F6?Cz^=)!19HG9@e_~(M#*;r za=<8gYd{VdrN9V~14hX|19HG9d1Sy>i26=u1ONiNCM5>|fl=Z-00@i{=K(-qlsFFn z0;8nl03a|*N)7-5qom{jATUZ&0RVwfQt}jfU|k$^B?mkK`RPjjk5Y1g4A^s$5kLlv z`g`5!5(DS}p9_iYk^;zp?gZ!nDc5U&4v=!a2Iv4OA4dQ>K+5F@&;e2|zyBtQ0c61H zlv@JGfKlQnKn9GGTLQ>{QF2QF88Aw22_OST$t?k7z$jS{QF2QF88Au` z1FV2ik`Z79jFOB1D`1pl1Xuy1BqP8I7$q42R=_C92(SW1Nk)JbFiMUHumVQO5dlZQ zD7hCbzKLpLH4aR};+vBi62A8#0l)&h=-dWe04e7--~vcFx4##+0S};R02jb(&TYU2 zkaBBjV)c-uGoMS1B;9(NSWG18!T@dzDK{oy!;o@g0vZe{7tMFpfN)$gNg%waIY4~j zoo-r8dXe-v^E+86GG4lsDKK6PM<($j_vaU7_sE?&DS-e1#@-@x20DyUQWdPuifUrH zmeqR9c<{tJ?ZW#`%7VpJzgMyZT#Qwu`0IPOFu=#K9=D<*lfBz@or z7$w&L90;St3E)5&B}V}q2&3fafdgTbGyymeMoIL*fiOx=1UL{zNfG|pCI8*01gEy_X5D7Amv^FI25GZVFQPPlv_P;C`h^0 z1BZf?>nCt1NV!G=hk}#`KEMhg75ZuNbNvJk1+RtW$O8Vkppn3FR=WYSdB+ch;0ncOs&)ou^Nw&}30-nhNp1TD+lcb-!1w4}lJa-FtCb>U% z3wS0Ac&ut0*(kN zA6UU!q*EfkVM-uF1fmAmzFX912pd zt-zrm<@)(tBi9Sp$QP0ya3}OW;85UB;7%ANo&k5lC~*n66Gq8yfjeQ8EETvDM#(mT zJ7JWp5x5gZ$^L*lVU#QmxD!Un#(+Cvl&tE7%i)FO@WSQrLUMTFa(E#*yl^?ZkQ`pP z99~EcFI)~UB!?F+hZmB=3zx$S$>D{|;f3Vz!sYNna(Ll#cp*8wa5=n?9A3B_UPulv zTn;ZJhZin~7m~vZm%|Im;idb6m$ICfZv8K1D=*#NU&=aOx`n@#J-l?Aekluh=~nzw zI{(t`_NBD^rOWT7B>mFm_fqnE>GFFi`Mq@cy_Ec3y8K>BelJ~qFD1X1F29$O-%FR@ zOUdu0%kQP+_tNF}Qt|`tgk%dG3g{VdCybK(fIDH7_ zMoE6aoiIxB1MY-Tk{@sr2OJ7gE%O0Tz^!H1`Y)&k92@TLCUopI25Ej(g6+yDc5=6P>}LS2RIa@+ya0@0SdSi)<0<^ za3_pXBnR9Hqokj}oiIv~9B?O$lC}bO!YD;@z@0Eky30K^BDu>3Z{%iT(cE548n6JO z2^1jOU$hUP0MTCgK7ay5yD9DiC_uCu<34}_M7ufe11LbW8{|HK0z|t>?gJ=5v>W9< zfC5CjS?&WUK(rg?K7ay5yJ_wNC_uCu=RSY}M7w$J11LbW8|XfO0z|us?gJ=5v>VMn zfC5Cjq3i=FK(rgjK7ay5yFu&&C_uCu!9IWjM7!b>C_uC;JAnd3yMpikSJ^CK0i6Hx zx`YLAT6RlV0HpzeJM2Gx<6d*d}2c!VeAwM7mhz|JyDL{0{4@d!`Lw-OC5FPRZ zQh?}?ACLk>hx~vPAUfm+qyW)jzd#BQ9rg>P0MQ{|AO(mH`vp>f=&)ZP1&9v$11Ugs z$R9`nqC@^b3J@Lg2U39OkUx+DM2Gx=6d*d}52OImA%7qRhz|J!DL{0{A4mbBL;gSt z5FPRdQh?}?Kac`Mhx~yQAUfm^qyW(&e;@^r1}=cfA4mbBLmz+?Alk!-eINyh4*dX9 zfM^dT_JI^2I`jod0ir#e*auR8=+GY^1&H=!#y*e&M29{ADL}L*H1>fMAUgB|NCBcf zsj&~F0MVf@Knf83pQC>!pV*VSkIkXF?qTl!w#h5@r0#G3A9meC-TiHoU+hWU-~K=C zx`(^_KnhTOp&!^BD%wNPeQeGY9rDKJOwk^O?gJ@6bjTk_0irz=-3L;D=+Fls1&H== zbRS3oqC-D`6hIod0487C6T6SCxK5jVfeYZY$#*B@YkOk%feYZ*O};xJU)vMA4_pAh zZt?;yfYT-)-~u>p@&GP?)5_KD0~f$)lMiqKoHqFY7r<$g4{!mTHu(S-z-f~YZ~>e) z`2ZKdX_F6d0h~7Z;M}>)_&j~IBo3*?t#>IcTPMduL_rPhhZ{Qv{ZTbS- z1E-BYz&&u<_ygPnr_H{Bd*HO`6L1flHh&J>1E)>DfP3Jy=@)PhoHqRe?t#FW??HZSn=~fzu{m;2Jn>_PrZRJH{Ts6xd|| z7f_slDRA1@377(>{r>1KfC+SebQiz`qNDi$9uOU`2XFvr9{pE+1OpK5%_kUuXm38j z07Sca5DY-H*GDh_(QY11fB}eh^B@?2Xg3dn0f=_IQnn=02l!2W#>P^07N_g2?ikA)tO)b zqFtQ{1|Ztix%rLEl}G=r{%>TiJo@jn$z$2onP32V-gEH;0}$=u55WLLdp@3E0HQq{ zA{c;Z&&d-EK(vQP1OpK5d3k~Xi1u)aU;v_BzX%2(+VzWI0HWQT2nHb9&52+DqTQSb z1|Zt?kzfF#-JF`s(sv&HH-0S3-SFtY({eXF`tP*dO>-^ub0M@@2`nqQQ z$I*X#9$)~v9{Rdw{a*`x1sH&?hrX^^|JOoa0S2J!p|1b~5FPpoFaXh^uK)uO9s0Uv z{a*`x1sH&?hrX^^|JOoa*R20I`tR+x{;#{cZ>}kv=Fxw@uA~r;{yVMknn(YgR$_=p z|D9I2&7=QLD>=lY|4u9X=FxwrwbaL>|4z$4@#w$P@=rYa@3h=KkN!I?ch95$PRrf% z=)co)_dNRVwA?+9{yQyq-&_y-Tr+>Q9`?Cr{%Sq!bItq}j{f`e=C5${-)Zw#>tUa3 z=C5${->;j$S`YhNGk=An|9;*46^{NpZT<>J|D85}g`@vYo4;BQ`&=`Bg`@v|-Tc*h z*yo!0tM#zIb?>j+6TTcm^;vgw!q-7WhV`s_Ydz=M#NmHk_dF{P|BDXmzyW^Iq5U|( zPZ|gEt#vq}FFLddNAyL9_TY%V=+G7%(H9-sfg}2&LmO~JUvx+xNAyL9v~fgVbVwIR z^hJj>aYSEqNDoK!MTfL-L|=4B2S@Zphcs|RUvzLENAyL9H^dQr(ZT%< zjqq+8rcE2+%{EMXHo|*tn6_;AvW`EQ2&H%n~8Bbv-64Kz$bN z`bN}e(H>n9^;xw0AEG{scK<`vXVLCoi24kgfDn2gAtFS(ei0%kA3lhzQXxUqVEPc6kyaLbS_|5D}tXUWAAc?eZZ+ zglLxsAtFRO{|ONx+WAe02+_`8LPUsmei9-=wDXe?5u)9n6Cy&i`*T7>h<1JxB7!sk zA&lREh!7q821JDD;5Q&5L^LsbjTYJ5u!uhfQS$s@&-hN=#V!cB1HRa>HrWCqJ8#6hzQXkFF-<&1^|S~ z50DU|LtcP{5FPRYB!uXY7a$=-`}lSMNC?rve_%j}4*mlJLUiyO7!aa^-@t$n9sC9c zgy`TmFd#$+zkvZEI`|C?2+_fBU_giteggwSbnyF$@f(N_-hc6%xD29+)PVb6MKYL3 z4WgYtL~0Q2@dc3@L_5ET)F9g93nDd$cK#8mLA1vgueSaDuKz@8&~=Y5URg4pxD4Jt z#TUe7a9a96Tn48VUl5nUY3T=X8Jt#p@oLB83nDe>eJ(#DHHh~3f=CUbU7kd05bf~= zks3t1eG#caw8s}jY7p)6CsKoGk1vSSAlmhTNDZPrzIbJe0XX9B6E^&k#^SGw5Wf@? z;IB{O@Jm{ZzivkOrMLipJrKn&X*T}4Y2lY*1N`;i6u+eH`0M6|Uy2v-*V8NbC69%_ z>&9aI`k&Yb{Ph$Ie#wjBue)XZlHK61r&;hzo(+H9RpXap5&ZSZCVt7=;jg=I{8F|9 ze?8rTU$Q{_b(fA`%6Q<54dJb*`uEF2|nVkl7t1SKBCqeNDZ5;rrHC<}rTH#C&U6QIOR4JFEipu~+0 zCGrj^adSh7vLPsOgF}ft21?xIP$HX0i5neCWc4Us0L~aVHsqiIF4`aAuL0bSbGS|5GB?g!ZJjOwTG|_QDW^O zEJKu7dmaLoAxfe>!5>03SbKs$gle#o;18i1tR(nDs0J$u{t&9cN`gOxYOs>v51|^Y zB=|$91}kv~1#ZYgfj{n|P$D0N5_eK4k(WY=yD5~&Pocye6-wl(P~xr%CGu4$ac6}R zc`KB-yF!Wl6-wM;p+p`FCGN6NBA)Pxcr)=;8x7$rV2LWv?Nl=x7G63vZJ z;*%qkXtYL&4}U1({OHF3G<3zkrA9RwzkhdTe(wH_tMjw>XKJ&vH!k05EY@ptx06aE zSpdpIZ6@ja+04@1)M9OZZnFAit+CkX>%Dtx61UA(=X#GFOTOxwuFllvs(rne&rY5j z8Xum#cJ=D;SZ{xF674KsyEOW#t_`-iHZd}BX&BF)V*lc$30^ieKleqozBpN(o0^|S z>-u^c{YlT_JpMCNpTC>@Dw$iFokdd;N2ORuJ96gC>z_aNVe)n1ebZIEr#gAJcDH(` zTA8la@xsovx4pYurJ7!<63w5wQ>g=1!+XF^)hlz2nQDD_ZYnFBoymUJ=BBH2@j&NB z9sa)Ji$KlJ;6GM%3paxMQp zpRLT@UaH(iANcFFEic~QS{qCuZD*sevm|CqH@4LbDD`AzwgwJ2`p8$QdFMLgjyBJf ztDm}4o%%d&XkX74m3pR3QO|3c(WVwt0BdOZrPI~L>Qu%aXw70hcmE}@Bx?jc&J^jH z%50Hc>0EzCo==s4%9)#+Ip@chh-IiHgzoTI#@Q!Q3QyZ0{6 z&(7bI4?X%@%Fnc~cWGhajq5Ew(^~HmM!?$Q(qeUzzPU05kJKkO{d(qfe6;;rOi7@y zmHHw$199J8yo0x#8hrQX?|yLl{da$URDSWrZENc+lv*b_q5*H94IQgFr;1}OF#0>9V$BH&9$HG)g5X&?ApW6!*?^`+ttO%+T6^1U(e$Gg(|A=t<28$b{<)Z_qTY7JBy18lk-c9 z3roOVJIWwXexRjB^yXe|dhyO1jVr|`TI-beL5#jMhi2ZX+=oM(`WzfejqE5*ZycqT zmUkO-Cht_{Frd*-&m)4ITjU@|AiAYPqW0H6S`KQ&-P)X_5%N7mxaHeh8Xs{rBC=ZL z)+{5x#ra{6{m=tWZ8Gxho{H;hfAV(Et=#Vj4p=^&E2jc-Uc~a4Ky=o{H)~DL7aSxi z_}?x3ZwmjL#{U>o%&4DV2OeO|HoN93cdLzs%2YP#JU4%LVSWzcx^cBWKUHlsZVZ1p zRbAjr6Z1d)Q)EBGhtf+UoFlNP>#MGx=q*#Tl|~~Onfn3}`1DZy_R?K6Dt%#6{SrDg z-AHb9yrXt^VYbSL8vhFIyflBiHr1werSd<1oAL>SR$01CLz2d0FT7Bx%~q#d`!EI< zf;o430U}Fvi*1#=kj`0mB}b0TY_)bW*_p!p0}wp8n+4(qgiBr<&ZZ zeNml@;^ZC@D2?<*1HDLTd<|61YP~+s`Bww|np>Rd>z%-pQ}cK4!h>VG-damx-t!Hk` z{i^iu#@t&C^7O5srpb@0I-@3Vfm-A%x_ron^Mz*67V#`0uT$;4+@hbMnCd}VlS z=n_~k_+eMBeB}J4VHBRCQMTA=T0)baUs{|%Nc4u*i{T{qFxh&DO#D*r0g5a~^5ty= z9;VnOTMTK-7ONPKs?#ub+PBw~%+J8uk_J+Q7!(GOjSaOp{!tsVGx_5JdCs~fj2ko_ zSHd5tNG*P_*7!|zu3E3mX0IsgVU8OKEDpVxojG$RFXOhlU2BXWzWPDcQbpR<*_I_= zbv5qQ7N_pOVH@Le4MynF#Vlf*MxSYKZW2h^YKXu5I2(7^vxQ#cc_gzd07X8N8!~Pb zhuyx=rrv9FpU=(Tn@iP35o7mT)7?-RsHI#>zIRfFpTa#TaI)dHY}Ki`-)On=M+q0e zGW%!E8UC_5wY11l;Q~|5_5ASOSeluseOYb5W-V9NJ5c?y3Rd+F+^Q_<@6_FC`#XP^ z!>Ro%2Ls4wjeAvnst7Xyr*r-zis&KYx3pB1mg}rcPg|XsHmR;QHC?}%)s@x6>dLiY ztz^2dhv6{vz%>fbTBPnx#_(IOV4%&|ag6WeP+Oa;O~Q8idgm9abCb7V5C{Wo9j2#I ztspgVwW2gq^~;4>j`3HACN55n4__S`8=4p$>rXmW@L^XEYRbLw!>*b6dbJ{J%+-v* zre^`KpgndaY|^i5jY&L;AdAH;S53wemVqHj6}eqp;r(nh`|l6H6JfFlI(hr;gmppi zt|z%F18>~x(@2`uT4?#?-D(|K{;p080QahMU-b2oF_^!7d?rat&{nV#ExUB|2`?nm2WsET?xUmgqFkqOZ~aqhn1h3U$|ed-M+J!^i3U0PMtjY?(tJ62j5RF zRBqJ}dS9J~T&HUAD_vKs^}Dr312ajyH@Q=-S8v@*j#yp_Wn4hX)W-^^j&rfN_ zSmDeyVK*8{A0vkDaet!wm|iknt;}}SFeKnwTuLzB-9dDOl}k)vunvMcXroiJOI+zp zFVEKQ){xQQ8~C``(C9+T5e@dMo&5=x>%5c!T#liyADscLxivg`R*#GfVZkTH{W2nk}22 z2g~%v|A1)HN8p(_)gC8HOTp(~#yza6=9zCRiMi>qV9dDp#%4z619&USlHpH4B;yx{E?wfQx`wWy^qt(Xyel z2;<-`~-@p&aJw-gx<%xuM*gF!_rRx-_7Ib|MoJ5-)EIE$dj4@Za4Y{f=|#lFV345$ zej`TV0~~L9d&wk?__nKKy07=*#ZN9zegYkW*enQfcixwdbr-Kro*lU|H1?T|wO3R6 z*nq0GXsK9jb`u^#<1(65ZEn(HL>7+^T^)g&()w!e)NG9*BK{n2RO{F?LJHp{nZ9+K zt>d#k#AP++2cfJq*EWufJ*Wgs&3DSehZs74RvO=Mf4*X^I;f{H+~Ee%ooXK*8k_Xy z7-M~a&J;+E%D;q-w2`tD%6UB)$&VVdFgj5D)_d;EjV~*A7Zz@yazr|XKG-ZKYmphl z@sFgRn*G?r_^P0Dd{Pv`p`R#tA&tMampd;mpx_8KYpCeK&usil82!WirL5+ zYLEi8^o9QDU)Afy{-!q=m;IABVWme&al?WRPv4}enU*P9>Y?zy)Jb{DDV^9k4fdt~ z%AC$Srk=(Wmi4&$JasQyI*3Wg+!yptT0w|B3JTsw=HKs_SF%1QA3311KClwFxT~!$ zmHvn#k&Z|nZfA(UV+v5vDQUak!-i1~hs)F>*~RMJ1xzve8uuHVJx!9HTD6q5FE5=4NYipVMKoBHXNY zBI8Mq>TLn-90Ftb+Z3>JRO$YE_%#G46)c@XMu*hN2q$D=QYJ-jMOx+FYf6-+U9T*n9-8 zW!>i(bL^o&{D1 z?%3Fec0nYOh1D|USg{sZW9eOeR@<@cRUMRcYIYvG z7}@-6Dr}84b}G98#4L94q40yXT%CY|ZD2oR?@dKE=0xcz z$P4Y5Xm>CC9af(3A~hj_Lqy{e8k?_CNsU_iu{0+wQIqL$f9AY!-66ZIowDlJ^A>Ha zR_;!sOOvWXszAotwqbMYnQP1G6JOQ#>D)b0NhnLE;aMQozMuE%wMEkp_0pN1(~#>Y zZ{}hy_SQ6%YMyHWyg4nehiR15Kzr_`R9=->r6gS%3+Hh6uhXv1LbLjMxQ+52{zpEs zmmL{@k6XC03u3x9$9q_Hp))!Ai7xf9^BDQ?+8N`6JL$+1zKq^AZ9p^4yyYkz~ z@sYnA_Ld-amuXE`7AwJvTX^tuNw+goct82TzqziH?9|)*E86l;l|dPf(0gf1b$%u| zzAAAO9Ur!HJFPHwuDQx8{`O0d;RN>E#;ZZ|5?wyOj+F~ z+Kcrk7+rC4A@+$RS2<4RM^IbA%+vr(8hros2k+7b`L8_uA;dV3kd2Y@d|i|1j`v+) z_Rsvb-P2MT6>?~9`cwItp74Fp7Y#O4S?z-E)E49)N0IoCSCpIT!y6U%2h2`xh*fy? z;d2xZW}}HQ9l17F`%)F8vynnj!#PPBax5<1zl;n6sz{3#T8oglWUywd_PqD7xWuaj zC%q>8a=S+!J6Dk=DW<6Y47lERYknRlNP5zSg=$)>a(ATd^g9Z5=k6<%v+-@#p51q8 z%xvx4G*iOd)sky*PQXV|RWMyX(z;t{lH4RcfsHWKJT58q^`4lnesO{qluFT3TfrN3 znM>}a_45|2K4HZqtEoi5Ln1!PwZd84;tZl*PM=t>+JT$XcldkTUBAaRyzY8SOI(!n ze6G`H&eR%L7w?Z_mpF38v3sR`_tCQKrKqZvvKO|0I?uckL)jV3;M$j3o$bApdmjkB z@Xn5p9MKn{KG*d$3dE?#SjLMjSio!e+29H%5~a9Dp-^sYNWUgrx6#AXiU@DGRK$S- zBFSY1ULOgio)n8`sVpZ(E)OHeJc-o&Ipm#@S^l$RaQJ=XGA(f8Xi3G4VD|7}T?Uiu z1iEP=Du`JekjiI4a9yz&?S*w{j3%G1$2MVAgIJiWx0pHOKKQQOo3MJs>@Js>HI>84 zN=t}iPqm3~)F6A+%>?NPk1)Q*3Jwe{jS3?&A?GpMV) zMrB>Q8DWD*2e~W8GkFDj7X_|hMru~mAhnP;Q4G*9ozV?GRPku3mh$9=?TkEk#U*7*SJa^A0bGfqc0{n(qMs?E@J(% z;|)}`v-cNs&v&_~&YT&aIM0=*UwworRH1ZuY|Klk)9K3!!zM2r7KRjV&TGRPh6{PW zRH!pth$Z>N%5X%5&UhEoUW0Di+w=zXUPp_27Vj>ch;v{zLOt*n7s2&PfZ>p-LE1uPQ5OLsx1q=DK zBtPrXZklv=aMo#iWhN1hjydu8OC!52X`yEH#tv*^X9rYWn2 z625A_jts9hI$*JWX?8lnYCIR=89s8eBsK?dcB9-Xxr#JZf-Me6t#hL?c`J3W{g0;S zcR1F>Fq|{)>lzI?@D+Ji2k-JdGbXdHLXtxs#Ou)gAtf6{3YR6N)^faB0^{X0DbSIL z7&m_6IN#kyy?Pg$BQDS*a_(p2Q`r%fC#o2O$dY!RN0yMq>?wnLuUxytfP3mEiu>uM z(iEnJOA)8jMmxp!-imf%eg4v6oN!)cRS&gUnOi_4KNM_?Yh%WT~jxzZ@2;2Xh^ zcG}udFhKcfD0gEcT^P%Ck(~K;j1=i3WKMxSh0yc|2IGh(j~ZWhI(-HeMcfofE?5ig zbf~VhRsHDCxw|Qy+Ir*Xxf8!|`sC;}l$UW|_oQYRmd#8Pzejr}O=2GH_WXZ95&Ix0wj#yoNiTvU6nWYB#L&dG@yW5_q4S@?^m^%0?x#=qRs0#_ zMnYWI`gC==e8WcNYuu$Y|wXguRKV;bgQX=0({lACy?DdBmrSJ2nB_ z(K=M1j)B4r8RpAEq7gICli6zw39kPdE3x1-~(Q z$MZg|N}t9u9q!3Jfdc4BuAn*xA3ardeWR7*CAVs`wZ;3WkLjV-o5yRnr;y{BF5I2F z&D)$Sp)+5iU$azCUKMk9Vdo%RE>6x>W{vlwDUL|{yN0u~cWrM)k~jAtQmN3klsE8h z7t*MLZFA;jcX&T!^!X=eq3?}FZ~>4)xpH|wh;w^F>d_1ZiM)BJd{^waLOL1U~uh&sDy`>@f3Dv$M!V7r7Iac^$XpC80+>D zcH(snp0?J@BXap)W!8;#p-NUghm(gG`Y|27bGJ&VV~$#v zd0HjL;ok!K3|scYM`HU8Mk;RZpS^!f?=ogz!=BRP(YQffFcyzjZ_6CCJ^zc^JQUA) z^sceI@Z>2z`L6L@%Yf`PBS3BT$7DJ|v$5-=GL3%eUK4{Ua#F9<9SzPiY9UfwOOp?pzFrX32W`Fo=;$muu@$%o}R_luiJI1 zd)mYbHYePLbXn!R7=-nGo(85HuHg&?lvy*F z$`?5Et!-oAEY5v=UX|^s1ve z*V!Xp3hqxc)u(MihBp{Kl7Gv2hr<3a_h%gF5xT!_U#SLpICZ8XI0r;yAqf<`Zks9R z%B{$R9113xhqCn0AvrCb_6^@;0b9K~t1~cmieJ_AbCm=q;BdBu?zf-__p$AbJJaPC z5h2LvWA~s>qjJnZpMXyyS8hR2+@hVgWE2M?rAylH(jY6jIFs&v{>$Mj=O-sFGE&4Q z<_p8vD~~MNq36*wE4NvpNd|Lr{IHY~SxPzBZc+qexx10X9mb(K?hdtyn71C~BL;~Q zleFx@gb5S*C;P#PxV^h&Oh2sA=~D;{vfRp$pC9>?5bn_gLN^xdV#B4&VDRk?S`4ID+lS#qU~1gYqU`wBP!nmSg9 zk?F=3Iau-ny!y0_*~gC~t$>{>$1#jaxdxKY=9dyST&o(g9tH5BJm>NeJkTQ<_#k4W zc_7%qk-+KjB<$fyGf6X^0^60<&YJEHtu$4)46tcLtdg>>$Su82&?QNh*q<5(WW;lm zWmFXu(*dL_g*bWZivs9tWmfas1fAluwg;764wEW?iO~OL9x7C?D815w{9c=)WRmm6 zG=w=OvjmYZxDN*o6d0aRq#O`(;`FCa`$7`lq;>}5m&7P`7A*3j;tUn#cWYDFCX9Rf zw5XqYw|HCjC}$1R=e!Y__S22R?qfe%c7Hkj4};5(IN6PbVMs~P!~8Fq?wvWr+iI-H zRgAaw;>3P(;*&GjcX47^|2?0aIG1$y;W$F>POukAiE`48BRPDfCUpXGU=W4159RR! zxY9GukDOdEp?J1HB&|yK$BpLBtL|Iov!|>=i|7Aq}`*LE-IX^QXsYnzStl(QN?Bp zu~axYd12(z@Z=;$SL{%etMlf&YN7A^r8p1Pm4#*)c5_@}RH~JUqDE?{POl+`N`E6n zN`Gg=cj!*;yhNeek|S?*n%TjX*$M!;@4!KEXNkAUeUvwqDUQ}WjwcOWk7Ge4^CZxR zyxtbGUe_tKUMdVAC>D<;Gw?PqKffp(f9*F0xz+0P36<_Z~+=%oCvST-MPQ2ZXOw-_I+{dYk zzdWDlLz0$251YGbJWU)~+!=hTF1WT6#EjqMSj%gK|Z9>m7>JjOe)f&F! zYR%3=6(7y96&pLfyX{(F&go2g+94m(mfvRm0+^4Oo|~~u&yTApF8RL8oT;)y1v@R* zUD&FXo|bB_B!`Hp*A@$yzdgP<%g(T%Ux~s4lns*>0R#il5#uc!|U5CUwYvPokzD0)4;M(z#k2#c(rhr z)Tx*zdp-iAcAJ!LHfioK8$N9Ooxnij=#Ua_{^!veYwN8IizhC$d=2m>nEq^IGO&j?NPC*rTJxNqYJ%VY;AEeCnvArD7eqJdJvrptlyBI;Y3=OS~xp8n)PD}cN{CZ znQFA_Svs3~ZT95{_=BHL0BJLe{4ZNbD73BK7l-O%T7XTn?O-kXd<1o{`peo-ZVi-y z`v88FG90Zj(9e8h$_>fQA>Hd0b~nXVy4-vkxf=U+M0i_|@e%31fp2c7a6Vx>yt$FI z$(4dDtJCZnXU#Hs=dAK51B}0ss3HPS@GW84?!vrEmN_pKAS?5_c=WgC zt8NMJw8|MP%NVo<`9TWvRG_k@NJ|`E=AsMAON%ebI~eTjjyP$fd}dB%IPf8DZsS6l zAQ*hlkF()tr+RMcXg!K3Brp21RsoLL z=SV%=NRd3N$mYPpm~T^|g25YP)GyFu3CcGfcB}3Xk68 zBk!M}OBRbC-X-1BsY`azH8<;0u9@j9Ci+#D5iI|lEvQ`52Pj&S9J%F|!(@$&Qof%2 zDosxAxyl&6=E#y(X0K|~;B<|lrLn1tIHbD;toW81a%s1$4edj9bU9iQzA4vLZwk9< z0@6ookRoV#reoLbwXF^nJ9)A#((oDP7x`{_iflz7nvl(}iW#fJ^NM^&nlsGBrRa7p z$7wZk+f`&8ONqrCLw_tU%BnyC;2<`kK%(=9u1$y!wz75Tj1rK+{BUaQCF5=&?TE#8 z&&2n2C)h8v$Q|Ul3@+PYVJ|lHrKeRgbPR3!BK#=xe%yrO2p)LMkAEJiRUV=@k`sjg z;5)G?0*5-I))N1DLjg6Vqq>#Z>nGn^OawLNO{4r6q{8FzJ;G_h!><0eCoInJ^Wqyc zgcVZ6r7$z!ka9EN*xGytCubtL83z`HEqX`~K;mibwj<~~4N4s@z8%+J!-kgkbMIiz zMSzkQ)P}-*P7Wm3v@;B!n2ODo z$I@D{B_C$bR=3V z^f@TQzb>2LD!iLNj7{nD-hm@^+1}_!718C+ad+m9%WH0`BcH56OLBu^>%w2jDN8^w zxvRGP?`X3TAy^AD-9%`v2g-Vqb+?V`j~e7}8&~05U9zWJO$XhH=iOPv{unUK4b@BN z!O|KFYJAuWU?9Vt4@$LZ^dTGC4tozea@c#|`Lx+H=adh55xN@Vm)}(~+^i*S1mf*L znx!=b-nqkVZ_nOird@tp*6X&9)46x(cH8^kpxaLnvSs#uJVJ52w!X;w_ySkwbTf8tQ-+)81nw-HhqZZnf0%E}_2QSh%!jvY zd_FeLg7kdpA)P4Bq5rr&;rF-HjnZI5`Q@>e%9w1Bw%>w-{SADP3kFkUgcWCkPSP9k zD&BfnMBn-tR5eQh#+YjF$h7#^^v|}NuvZ%!aYW2_SH>PofyAXdE?X(#K@rj?KR}m{ zyTi$y&o=GJ#*fk?S4ba3v>gg<&mUkubH+ifbZfeYF$M|SrJAXBsiySg^y{iAMDoDE|_%BpLW&-+{&A605l<6!lju0RHb&oN5A%C zUCs};u4=i)s{9K(wmvP)?nq_$~}`R(9eQ@xmV<}uc_Z{wW>C2=B@;3CdjlQ zJx9$~xNj_7$(j>37N8sa7)K3f=I!WOda|wKXJtwigEyI9p1%c5dG7m#+IY2n_%zaJ ze7+RL9oiSwXip_3hXhYYZE&=c+>(Q-9@M4fjE`?B_i0d^SC1YlaUw69ZDf+Ssn)}q zTzqemJsY*nfax)$4%xBtdh57v1C9oO6aMmoy^EK*p@&^-=~qlA7@nZ%g+yT_4Z+a9 z8J^50qORTNL-fgkSg*HY(@Xn}r#vZ=o`;C1lV1X|6Z)0SojSpx*c{wnnrMP==dduZ zu8_uI1IQO29>cfBu#>%t*?WR>&T1~+fA?0k9@DBA>C-NRy|i*A=Wa3=V=$VU1*E}3 z(Pn+iGN0}YJ4MCK4^&=7=FhVcC&fV1EaR@7X zv7+EV)i4c6_CQfmG7B$?W$lk`hsT1+f_lj>rfQ@qZd{0Z zsQ(H!3au`@vQgMZeiBx5Nc+-V1*|w-;*7VUkp!7IWRSVuo7RxmgW!?P1%K+%Ft15y zqMe{RN+)siaeTenv`D9{{i!ek++f}(28rm1i&2AEJBJ9HD;=QC6j1{b-A7t`r?-~g zR=&SzPq=DR3TUN2*ct?stFVg`#P7qSz#NEo5hOlv_cc5?ZWbcqcX{ zhL`E&Y|=ddzUa=V`%ZoSUV6SYhIhqDS`NVB1k~*)%^okSkPkvnl#G|O0I9ThJXOZXwd1*SBvpRxmi#@G4Jf27!Dy`CJWHSlzY8^phV ztMTu3V99wvjBxLe!f5aqQ$Q*_OS}PmKKrXwqq47Q=J46HLLDN@FY;>QUHAfB?x~oO5!okK zoGtgH0Zm$UZ4O`Vt`T>|~r58jqP zJgPaI#od9jMpU>we{$+y(8t{(mpH}U*81JW0oAM4N$q#FCu=Co_BK5ClY zk$Dq&qhi=o=8@uC@|zzp;NM*RsUWh2d%uSVHvQ@u7gIcb=-XRX-0}LM_!eyJGRT;c z1>0#^NiyL#TYB22pFhFoiq>_{Op$AVq$5<^CxE2mULBmE&n}|b)bbp23)gaY9?rjZ z41^K&3B?}cyOJWgw_xwYbzS4;h}aX+k!jSwGUK?3aSoVd<<7aTe-XVcz7%iM4Jl5N z4~%G!TIno;+P_g_pf0x5?aSMlf@mcJZ}pMuN3V~YDVCXm_fJ?ttB@OG+>=cS+#M=t zGQW~J$TrhZ*=L#z>zG|j@A#9X%Upa}N1{2039t?KMzzPFqq_Q#ab%S(zrk~+mP*y~ znK!&;;IJ{LgYuQDZ8@sksn!^d((EFV_<8?Zu9y=>3$@ai%Y@dM`Yc6z|o#tT?~ zX{?10$i9wTn9g}6l?6vxo1DBdba{CE>d-l0zYJiSn>TjMZhEnFn)~=NKed%LD*cv` zzd!T8G}O|Twm^65!M^cNP|GB?Uwtyn+^97kZj2*#y5I*oV+jbe=>?CXk$vJvvR%;G zhqBkG0uy=8d|+L8=0>n^MM-CNzg1Mv-6djg+^I6jCp zPWSKLO5Y-56tjuqLUtFQ!2_n_c&E_2a2t7?^3pteyC$feyw^TKY)`1Na(mHSG`3s^ z8md=?%*)p$>LckxsJ&FY{gfis;ym7AD!Ymk+F9U}1|2%xCZEB+u(+@gVpnpiYE`hY zey{DB&3|h)e1x9O--%{au+_Jv&Nd(EHl$ND#gLujA&z2(f*6S}s}1@yIk`ALuKl~F zNad}iSAoLDv;z{QRwuUw6RU)qT7S$gTv*p(TWs5P?g*=uX*T68d?RUY7NE`m!d_Se zmWuj_!ny-JsUpkr(`Z4%nA$7@Z*4HN9X1j?qi$uoyDYY>R58>lLieV&KD9oCV3qx826Z9Ktou-A@4JjW3Kr%!`#8 z&&Lt65wGe3cq2zWAT`e{-UAwx_EtkJ=BJ414UF^oDb4Q%*sJeYHGuvNWS#DDf1(>v z0bVj)t<2&>!a{|NOM*tia7uANL{miiMuvHAYIbRwZMX-hab6Y}w7r2>1%UPw)CXXZ;A0UB0xM=; zkwfx^>mD{8ytxZ7J!4UWCHL+SDm!;CIX$yfpQ~X&nr6#zkg+kZHxgx?&+zscphVB# zW7hx$K8_t)9 z9rSML7L*p*ek=kx0z9ms*v$dF|Ke~mK6+u|)1k59WMmwJ+UO@E=kZC5?xAte-Tld@ zBiMtFb!*%)Hgp9e-{^&8=*nlwZ%3}2hb{jFhQaaiWOS@+_yS9ZQCi zt3zWGBj>JN8X8NkUK_hQIzEiopGUPojP}EXykH#a(?LY&~Mnf zv1AmrjCJugYhCi`MI1^P9^?Cl@c%-CV>ix?UYQsJ*^ge1O{9;0Ix;@opA3!R!>M4% zg|X4g{as`yo1)!FGA ze-1OpIYMspw1nmPC4@aZN%7n2{WQf17<7ERej2bH6&$OWyPaM@1X!L^Yp`;mW&sb%f_VvshHb zH%+pFnc2#1G%mdXc0cubj{d?5uv(wqg0EHco+MXG?M5Hu#WE(u%e&q zwo8{peBd{o#R)X*7|Y-H3tXBQyEd%*a7?|c_rlPnaVH1;Iij-I4bkLJcrwb0*yQ2S z3r0kPNA)cXD`Sh<&7pd|a^H&B>aXl48~U~VjAmZ0a-Y*Bj5AiwHnIXMSJ^4H^o;#v zEBoyyn|IxQvROCnXEbVfRv(5*D?Y`R^;k@!J6S2_vC|?@E$6AJaDC}zwlN9S(Zs&b zKB%H^dDOf6yWS<^yG?u`^)ZTWlNCsPSOVmwOCSc32Eo1LJSlzEp>or+6MggoZ;(QySMa_>vIUPM*tqfwT+oLu z-bFK{Cvj!)BrchbSiK(hp>m|7gS(0l(;mQXs^|7Q_pGrzkb*hg%F1C*) z#rjlIsP7jY+h>v~bXY~j8m*{MC5k$=aZsWy*2$t$ohmBUi3CF?$>JsIW3l5>(Ndkf z%RER33wL#@lZsrdk|o6&RZ?h4C$&1&Pt`2eCuPm;@vwV}4Scs_``&A*k0r(Ssie@p zf;AMbv=IyI%bCon{x)*rJ*9e36!uoQ(kdhgq`-kz5#=RhegNJuSFd}cJZn)TOO?AB zgqJuae>3=tBx{jnprALP%993SjIC9$X~h(GIML3Ev++F+}utEi|-R+QsA zw4tEvIg3V<%DRoBg6ie&Mn&&aiwb&xqO2o%B}7H}OBPh5=G^K~2U|U=6&1VkLH>2Q zmf&?|2aKY;M=!Sf6vwinL7*t>N~yiAPGPXjIj~1X#rEd?!XZ{+ijS|-Wi9xVEB?RwvKy)tplGG71@{{`u_BcVW{(iJVK5!MZ=;SEGj5GW5>H&2av(M(H1K* zuTx+riV(9F0&^TMs^GBbkj3U{Y}sW2T-a^$zD1(Bw0mqhLsD-J2VN|(jcmXoK1qn2 zfGx2h1<=4crd`Bj9UI^l@s)=A|(%cFb~5oq#2?mN)@1pYoeE!HsIbe zZ>6pQU#zsv!`d@DKZVDNccLLE&YoBQZ95b$@d_4~l|@g-kCvSDlN;nWSPmq+y$DNuE(}}y)bDYXCTsGvp%-PM&-pW+4ffCJ+AjG z;Qc%-x{x4yB^Jd?rLo<;-N`^OE6bPgIh5n7yOT(2rWzvg&N;SDcVxhjCQm!1_txT; zSWq?R<~D~f8&6?N#`~a1zIF;U^PK_I9xBl7nPYounS~Mx~X0Z=juvd?^oRe z?|j^M1OKl7uKU)^Tz&BbiKUyzzUFdzp>;^qUR%JH7<6XDAaZbr>M3@;ZDa3LuvCI| z$fY@7M^0`bk=a0c7GLsN#3wxmtg7o;HS5sUzK_qKnK$40J=@rQ?9Y0>#`j-e+sY%f z4oZ9*ACTaZPrB7wt3M{YelA1$=U2gVt|nn)F8YJb-}taG-M&kiJM!&&nYB5sPNxc) zdaPb0o$brN#6Hv0z0lr14jCFj-WfbbZ9a2j4v+WvlVEF69*sNm_pajL15<6-tb_-2 zKea5>&U~93XA!}`Say%I+8bs(A#^ibhdr1)* zaKP0rF3BN=P{kF)f~@lX$27SMhx$AdU1YYIJ}%><)pN?;{)`{vB~BjJT91E}_eE`d za?Zo~RdCRqH&VhByDBZdH1vUY%um@38nRIkQnJ#Z5c1jZVJ<%B!r^t0WQ4?}A2IGg zClGwFI9seQM{EGLF%1H0o0OMK#X=?qtL}aHpjUD29Hdu~PXu8LsQ5`|#N1 zJM4npb69*6oyt|%F{0eL5xk#zNrR!e% zAt8yq{$>`E6x1}qm+-ohG)l?#)#oAw!V#Qr%YYl9A;8e%i<1y4!1(Dz28FJoSgyKz$yG>IeVY^}z z54%(ta?NPc`)m%<_P#=hpL>%t4Wnv71uTB24*#sAG*D#T`KLE$8CVvAVla}C<#grv zaT;R8*oFR;It31Pn9+RQ*wBSYrB zT&9H?hm{?}$c4q=If*2D9#C1>s}l=<=uPiTt=?FiY#AF&x`m2OF<5aQYbL(t;IW(6 z^EKS$Ac8UV4eJ|3E!ktN#9B2qKf83-214hPE9V=u%j-y6_NH~FZOba6*W|P?WLK>t zw7WZ`nH1wI#AI;pW>)&aLCbz9^1{#5V(>d}o+;_f#;noor>?NO0z^xM-Pf?+a|Trj z`ZTr(V$~o1ObU(naj1y)g}bNJ%$fL=oC#Ya^2@3PH9Tpioo}jnh`e65bs>I(6c0D# z=H1>1ckEVm8?{r>vE!#;425PFbii+d#iWhMbuM1|VbKmx!wzE$sclwOmdF_zC0IId zfy2tjc8J~~HK4`ZVaDjN2q$-^WM#XaV`V-~fMG{hPM;!|;VuBLI#jXl-$%c>r|ssu=u0Y93NJ40hQ)+z8ils;2bcu!)%H3r0cnP z-Ob;#Wa)b4_{`Ap3n!2N;^tTHeyypV&F3XWgzYx%8Nv2LfC1qYE@l`yDPaAhk>!<( z_7)?RdsBC&(s@)yM4^;9y;Z;+aYL>W5(%;oEq4s(?~uKe-Y2*k7<1H0+lgFDxos`A zBWl$g+}{5&%y%(g72^_u_vFi{6#1^5KGVVi8&dN(z1w<|X>R_e_gZiAL{0v#_s@hi zlzZnIbDe6WT$U*a8Yq8bwri=-w;gw-xJ{`Yd(-SrN2V5Yc}3<7w&{3FGxNP0Y{P_5 zNZEt+?$k~C;H-cL>I>C?OBm;IxW6uV?!vv?vdhE^&L@0~ZPc2)P4;pYmah?aS)RuI z*$-x1K}<+bd8>59u<*hx-@##_q~=8~7p@-vD6LfEU5+i5Ln*T6=RZat_yP2+e)xMh z0L+?N-W$w|NpX>T?RM8$(# z$w+1zuE<5_{6T9BkdDBG0qz&AH|8tX_@95^)XCNdS_jthIC^RjPvzPSi}IX9t{-h; zz~Uq6*o>)<$L$=>(g~8M=2~LxHnAu2*<5*Hyqt!_DuF9aV`7}c!!frsPU2Zb?91k) zz844dvT~kJ^Ws}s@zkAq-v@9~er2Y31$)!dOLN&JOStZ5;u)6o4ox$eAzoNtAu$hPz4{bxd3_c-jlsJEBGOj zRam6zy*6>-_y>m52_dv_I!!kA%;i?pH93RUN>3&mJbe?!t4pdHiH1`ENyCG5?D@H8 z`zI~);g8~}^dXx}w|~g4MnhfSq;I4I5*iZMv(>$oi*QXp@l$W4N~u{Q!IxePTLXRRuqW36flnI%nALytulk7U>( z3_E;riJKbG-QY>K1tKk}F99DU6r-<8+Xj12{O(5M9h~&-(uO*a$3O17&Ux(buMgtC z`uWbWz8eGn3swM1zC8I0{I7x^ zgEMqESdBdPXWdvV?b4nlHt;Lfugy55z9yxeM5L~h(uQeLH%V#NG^lR- z1i?w8wc0joqexRkFAG+10_sK9yA!|bVKug88xIYTg4{B$XGhvHMt6@~8JQRvx`cJ= zk6hSY-4aHw(pxm#F8CvTBYLxbUGQ(zvB^LQm!v#ooj z^=Yt*+phePY6XY{$8j@YMfn9t6eBky>?q~+Fl1)QO}%X(9-XaVuxzr9!yqGr}!_jS2o5cN?$j3{q zL$VZg6z$78rDv@*ZkF*FulW7!LfTDxTWdG1M?WkteIu7TK(CxTWq1$1SrJbz!AI+6 zuZunfOZ#k&xusnHbCH6(g*2m{Mp2f|G)D@yI|=j32>Mix&~~lx8oHp|TP!<_TXQZ# zO6NsT0wDFvj9Qa)X-hj5A8(6IJZ`_;)0;SCA=tSh*e^gHjc zEo4J(?~}hr_g%N!ulLk$D#xh6&sD|e9;_jIdJ>1W0XuSIZs5-_sQNZ2C3f^xQGUS0 zexQT)LkS~EOl&JK#|Ee5opcqzZjmZ^GfQqVmf?6~e&dMUR$j6z`pT?EEqT4e(~X@L z^$PW6%WN&a);kNlboT=4LF~7*?r=>5;WPfLNLf5?TR%{@qneoASm2PhTmzCeG;u5v zYyFyORohE=m+erA%FQCOH4S%p?MBZSX~Qezj45;QX=5pUugu5Fa)UUPplaA%#bu>T z7t`^kIGhGs?cw4z?q|j8%{6FdllKZNkXCh`ki!)1;mig!!|3j&%C_|{(b?RrqpKGY zK8~o*w%zAu4Tn5j0X3ZAJAZRr?!P@(`)h8pgO?k?xXU5V?l10li}R$p9b4TvikjP? zMYqI7?^YAhYY~bv80Pp>_OKW>i@pcrPqF7I(>X5`r_vHdJg*ZGR@LQr{7dL9EhuS3 z<%{_m;WZ}bfLuEXJDjZ%ETjPi`RubveTk-!9O-mFMW}QI@ni?A5vMW;@CQMUYb zD(b?5M%=~o_ssJkjTS{bvd}z-=i#U8_XCGtr$et|(-fS9dGhnV{K%(i0pTaj}K>)NaTi_1p1#q<-CskoIF1=M*PbY0|O_%0N%!Y{X}JHaUR<`rU!5*ymptqQP?|P zxevT8q#%;MFEFO!$iy+sR&lwfGS|3=ZzKIG8D|>v+-&V?eI7f$vtMV>MECvDEFc^oA zkc5#Dk|GHk9D82-?^{bRXA{CsGWWSpNDR_B-PP6A)zwwi)z$Dn@huB<#To8d;fJu4 zG6VMgSmH{uMB33;T|^6JpMk?zrLr%B_1RE#UPhzU2m%QLBCp1+#yL zJcGDTj=p9UB58PB-5(EZA~fit6Ei@z#0^rmA)ZZ;@vGv<3HM2R$3ti43A{C}&c*7g z#}Aw?6!H1EkA*6-%Sni6c4?SMOt70Sl>IAg>BuADihw7&n}0@25fyrSH$oWRvCgxTr!YNKN3|!43jx=n$QA$QAdxUF~xu= z9$96cbT9^}MB_5TWOVsj?wZb4VzdZ8x0fND=5m z^w$mII`ULeVS@a13aR~qUCFID6<4vJ|DBcczm%17%4VgclZJn1rTjZ9mi3ksYRUfM$%UZ@#`Dt0eqb*Ah)k?uIacn`zZxc2a9&*aB3TEla)%@WLXWM zy+nf)M6#*|_6Z-CkAj+|6%1>5NcFLW>bGe<#L4@3sR#71ew*AwZE;)=wTRb4^Ca9u zeLA*>H{JGcH!asm+o{kC^h>^jCCo)Gq(!+iggWj~Mqq8*R^p`qEDv1TxG+~J9i4&bpiG46wyF@$2 zjs@kWZ~A1`ku#~$4I4Y0r%20c)%oZp6Oq$Rz?cKme`I=MevWtw(>A5fYS=&Wh)rkM zOG0#(Io9onu3Nz~_mZ1*y}v^5bt1|TBmTm)Lo!7l3S6%_7C>M|F^p6?LCEk4{(2{Y zyCW~%sTmnFXqCuGJ+^}r^e)m!xSuhR<2C6ER3DYGH1PPmMZ%Rw#;=XpBPV%e{DoK( zwMuqUD(w^7b>k)~u?;Z4m$e8vnc0Z(HFo3lRg`J`xpgmxA@ZGepLLEAmwEV5gRl(v zY>RDA<^-0L$QX*vN>!|&jFj+Li9HQG`^RAzsh@&pbmc@e4KJM;%9l>lNDfuEv2IWr zUF_{$(Z_d`jGe3}b-QQ|^_G0+`Qd^TS?UE2A6a3^zH!fZF1eK_`XaOdMPBMU?=a;>~Z#KM)6B4M#d?7$$*5GFK%HM=g z@m^T@BN`ayoAdjt}yCMk00jiR#0l4ZaDwKO6Yu52k$zpmkBB3(_Xis_6%L;YEV`Ejg;g^CBx- z1Zt=iTgU-7?U1CUpJ*qsQ2JQg2q%u!Mzl>rtCEvmu)#VJs?IaP8+q1PjH4w1))=&u zQWhg~WvuqiTUlIhsd-aRTZ?rt2_=P)hE24WewV}J?2Y62fl3|?2u0Q_=;9)>eN5^g zd}7XKqwg2;DDmXMd#GZ+5NC12Jhi}TGP9;Km{`1WNvslsoXTi6B6((RA(+ZI`0~bm zm*`>93pAA%x9ck+5_v|+B4{r{@IYV{mt(5xXvpN3b1nQijpT+BLs{>UFpSj}kG}H2 z^!6-tqno?~)wEVxE1sGNyp4}qSX-*5)oc%Iq_q1x@Ppr&?g+F_#te)`njkdiDM zB9qpNVPhJ>vc=7=bgAb77{#(nn;^0RLW9lP2E~BNGfZi?3=pm->JgVfgp_IotQ@?9 zfR!bffxyV8;6a{hwzw@q8jO7^=M~$8wq3*JEx3RmTk=w!`?|+MaE&e&h?+xIk{amh zp70$KWD$}<1#hr#fEdXzGxt)i#ofkALK!3qy+IZe!1zvhugro#VOsj4csQ+t%rYaL z9osq_=3aUn5gu4?>9Zrtt;szL(KhevyWoWM0bN}?>9QVgfw6sh09nKkd?-nhF!^>e zIRzn1rOI6&r=-v;oN_Q8m-}eMbM9LRF+yVxCBq-zW#3l*Yx;d-a;yCJJ70!s+r<@z zf6<6TZPv{qe=`4h(jbk^<(8PgtlK!Fhih8?`=gx)B7a$@TWIXh?{eA*V*x@K^Iz6k zn80Z6&+jf99C6(RdKR0gP^00R9ayD>R&w43PcRfbbw8?&C)ym-AMAdKTkL$5eD0+| zLvX+vZamFiUDjtJH-$}LnzPmhWebUmXzwOxH*9?4T2#AuaA%%1UGbAL1tUeAj-f_? zRdN~PxGGjrGldy764|%q^0#uW#`tO6sq5<+j1b$(93EKddYN3il%p`+~ zl#3Nqr&m;KHthL$!yJv4SfG_%9p%8PA>Q_;rX4XJZ<X{xSFDvhO2?GNR1j-t;j{f)tF(&RmuZ!xQZ_4<0^@Q z5w0eZV=RK=hz(b>wo|O8WmP@!PP`deyL_K2SifYP)nPB1t`NqV@hHUCEZh8*oJv!Q z6AzsFPZIP96b?Z%j)*9t5Q<@dG5?T{f`Jn6Fq9QXKH0FCrsWLF3r}V0qpTi}_`BU? zlDE`Z7Xp_iRkE3C_p00b)Ww#Db?);%4>ct&2MMsVnfBA?ssUhC6^KtkjZ%!uc0pE= z=hb2o{7hDU1|+*t7Bw9uhdRX5TP70cZR09GS?>`!=N!4?1dn@mJlAQF$N`Ge`ov-{ zl!n@2K;IR#skE#ZLw`Dq{W$y^F>%s!547^u~#~#bz)v`jQsI{NnRz z8H&F^ZXkv@OP&zVWT0f#;9(TYe)(^okqWt^talNJX5_!j~r@0N9cg<=l%WL zT5YcmAJ#u=0pZ2*{#{chks)4h_-WH7p+ODJiEFo@}YouVdG7*#04)rWDL2T z#E!awte8HZ&}9}0&!2FCKanCgqsH8In~tuw8V?xv>i3R0S-R%$|MhaR7^zLD3F*xkZ zlcxR$V21@gnq*1>H1IWe+(86aeiysve8fOvZ0$GLr!vwO?!nak@80b1wx})*!&Dv-2;- zkk_S@mq)@@0rRO&jz0LeOWuRTJ-l+tT8i*PO5uaxg8SOgMUWRZW4l>17QPueUyLKe zFiB~(goZ4BtxWy5n>w{{j`Utv^5LdMe=lwtm%}#RO=aFAzg#mn9z{=Mz_Ve?vGt&!gfYkopM?PJwc>!jI!f;Yh zkc0-n1nF>&Q%YVcryX%t4a+-F{t4J3qO2`fs^z=1X+z-zj3y}7$A}^^>T{pp zJ;A3{{F{HG=(%=ggM(6j^K7$}KR81Ik9?^@9IBnx`@F)f+{+ZY*7N%9FH=~v3rh`?V`8}4n;Nf(kBsZG8;6I#q??Wb2Wh9X>(#_Qo0 zIJt81BbIj5ZTMGM+KC4lTDOhP4JDi0lOs9I+$4D-n;Uv!$G*09Y7_upLTUCFeue>V ztaSrn%qp};2ZVILK#S|XLBc^HI$i@7kG2nfQ0bu%*vA>gLhNc6E^id{$iXIRW8AX& zEeIR59)PD8k0lFc)XI5WMIbR~6eR|>LpiSlZt0?MH8R`SnB&t|v|e6gm=PecCxb7N zT!X*HFhO{X|MVgL7K*7yHp0b@K5{(EvU8*y5>WEc)7TRoEc-+OgedXS=XQlKDYxr! zF{l*SC5v&pybW=?Jo30*AB3Dp+K*Ij_xw$!%YQJ!3ics*egn5F^^&<=Ui#dwq~aB0 z47W=$j*+$U;eRK^lDWOv*32yHchU(F9v9cWrq!^qdKv*8Dvncjk_|LP;B4!$6VpU+ zeiuH<=|KbEdfyx?_zy#D>%CA1XmSVn5?SbP`xle+&o6yn_gJvYQB}IAmhL-@O-g;S ze?fB8esSINo`rhno}138bAUrFj7eanjgMZv)R75z^g1@@-&0H1r#W5!{SfCsiEPnAY%tOz5oTBCi9q%ug)9bBJNE)~87%XaMXJOUYB=_}5htFI_U zW@-h=o=M4>4SeMKju&6XY2_67xK%p=zNuj08?9K$G{9L_OgE*KK|yll(*Rkb6`A_lYq!JqIL2-N5fxIyjPdJbp6^k_i$u&6=}TPyPq{Ck3b z|G~e1a`>U6w;dh0AT+coMo+oeUK|K+yNd^|*@Ec~Tbm;O;aPwv@s24IBK0B77A-_o zXjqJRAiJ@3%fzxJ=v=F$r{cR=eRqx+L%wgrfyUuVfkwwHZG({VI7Z=vOxtSWGn?9T z+;C4&EIiy|j}x0}Dr2p{0UzGyu-1Tn=M_Uf^D2Q&V5Gf~WIK+$Wgf6ih4@2h}&6y~i z<&(ndZk3~ReazD)TJoMb5^hqt#=yX=pw&c;mlVcuoCEq8JBKL4T{3mK%Q9>swo*BP z7PTZBzKS%E<9KBg?LgUDLjD3uk&!gu1`Q-=LFfY~axsVyKR|`+QMwmMA-En!G_a>h03I(ot5S3ue8T#432NgVG+5|ta0E)1x0pK-gz}whFH!9|p-=2R*YPdb?^!Jf) z3wZpbNa`FhguzfGj4RY9&gB?#T1U%q!l(n8nAq6hg%Gi1cFx{c-snk^MFL~3HEFLO z_bxj+!eqShQ+hmj^M*2Jsks0}(_%)HGKFCRA_Iu%x zIrKP<%zhzDW|B7#J{J=S-OS%MT75b>G3JDVPDt5nibjB^x&)%jNz5}Kp2Ea+g9NI# zgpfp1#}#iPvuMN=NnPEYJd#GBERc1?ih`AKMpPw8v2+cW7wiezRSf8^)O29TRTjYu zoth-L7yPKyyC8=UC8)$cbNd2T?R$uYAs^-A)&0TzA%m@B&F5X6Ci7Q}bx3wdCn1>Y zx41*-JqdAg{0T*2tFyn(2v+3tvEFB|!aY-*+_K25i#^=1$Js*QsoX%KXyj*UAx~DP z*L}}o)8J(1GE!;SXFQQ(=p%Cmt6gCUX^XYH6ZA5iEYVb$sF$4D->$`ap>bX9&{Z=$sBKEfK(OO#FfVSRIL(kyxP`U zc(6eEh6RVJRB^vrAGo%fHF84Pb&8CJGLm#O>w{)m8FF#(kBG7G@vl@Nrn#M`DZe&o zgY`#r?x~E1F3b5QXaMFr0)1q&K;LNKCu~%%J@4CF$@8EFH z`{ggr({gUq+}3M^89ikqz<)qqJ)r#)f`}wt4jPo8r-+%uwTYXt)Eb??x!-NkP@)dI zVF5)BI@^3qBiXpt*()Mv?{U^oQ~S?UDJEo~;R6;IhcL_h)7H11d`

E=o0o6 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≶i_mnHHBp@E)K(6b6^dTuv<76~t82CC4=yuCz$& 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 StJ?eHPw$Jpy}eOy()$PKPGE2V literal 0 HcmV?d00001 diff --git a/index.php b/index.php new file mode 100644 index 0000000..7ffe271 --- /dev/null +++ b/index.php @@ -0,0 +1,49 @@ +login(); + + $plug = $_GET['plug']; + $toggleFile = PATH_DATA.'/smappee-plug-'.$plug.'.state'; + if ($_GET['state'] == '-1') { + // Toggle + if (file_exists($toggleFile)) { + $state = 0; + } else { + $state = 1; + } + } else { + // On or off depending on the request + $state = $_GET['state']; + } + + // Set $plug to $state + $smappee->setComfortPlug($plug, $state); + + if ($state == 1) { + touch($toggleFile); + } else { + if (file_exists($toggleFile)) { + unlink($toggleFile); + } + } + + print "
Set $plug to $state kept state in $toggleFile
"; diff --git a/src/SmappeeLocal.php b/src/SmappeeLocal.php index 2dd83e0..e0e8f67 100644 --- a/src/SmappeeLocal.php +++ b/src/SmappeeLocal.php @@ -71,13 +71,13 @@ protected function _postCall($uri, $body) public function login() { - $password = $this->getPassword(); + $password = $this->getPassword(); - if(empty($password)) { - throw new \Exception("You must set the Smappee password to login"); - } - - $result = $this->_postCall('/gateway/apipublic/logon', $password); + if(empty($password)) { + throw new \Exception("You must set the Smappee password to login"); + } + + $result = $this->_postCall('/gateway/apipublic/logon', $password); } public function getInstantaneous() @@ -116,18 +116,16 @@ public function listComfortPlugs() public function setComfortPlug($plug_id, $plug_status) { - if ($plug_status) { - $plug_action = 'ON'; - } else { - $plug_action = 'OFF'; - } - $body = 'control,{"controllableNodeId":"'.$plug_id.'","action":"'.$plug_action.'"}'; - $result = $this->_postCall('/gateway/apipublic/commandControlPublic', $body); + if ($plug_status) { + $plug_action = 'ON'; + } else { + $plug_action = 'OFF'; + } + $body = 'control,{"controllableNodeId":"'.$plug_id.'","action":"'.$plug_action.'"}'; + $result = $this->_postCall('/gateway/apipublic/commandControlPublic', $body); $data = json_decode($result->getBody(), true); - - var_dump($data); - + $retval = []; foreach($data as $item) { diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..690630a --- /dev/null +++ b/test.sh @@ -0,0 +1,3 @@ +#!/bin/bash +curl -H "Content-Type: application/json" -X POST -d "admin" http://192.168.0.163/gateway/apipublic/logon +curl -H "Content-Type: application/json" -X POST -d "control,controlId=0|1" http://192.168.0.163/gateway/apipublic/commandControlPublic diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..ff8b083 --- /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(); + + 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; + } + + /** + * 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) + { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 + if ('\\' == $class[0]) { + $class = substr($class, 1); + } + + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + + $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 (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])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + 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..1a28124 --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) 2016 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..7a91153 --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,9 @@ + $vendorDir . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.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..55f4d4e --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,10 @@ + array($baseDir . '/src'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..3c4508c --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,13 @@ + 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..aab2928 --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,70 @@ += 50600 && !defined('HHVM_VERSION'); + if ($useStaticLoader) { + require_once __DIR__ . '/autoload_static.php'; + + call_user_func(\Composer\Autoload\ComposerStaticInit33d9ac2f289708d132212cc50c8ed709::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\ComposerStaticInit33d9ac2f289708d132212cc50c8ed709::$files; + } else { + $includeFiles = require __DIR__ . '/autoload_files.php'; + } + foreach ($includeFiles as $fileIdentifier => $file) { + composerRequire33d9ac2f289708d132212cc50c8ed709($fileIdentifier, $file); + } + + return $loader; + } +} + +function composerRequire33d9ac2f289708d132212cc50c8ed709($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..9d85ce7 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,66 @@ + __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php', + 'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php', + '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php', + ); + + public static $prefixLengthsPsr4 = array ( + 'P' => + array ( + 'Psr\\Http\\Message\\' => 17, + ), + 'G' => + array ( + 'GuzzleHttp\\Psr7\\' => 16, + 'GuzzleHttp\\Promise\\' => 19, + 'GuzzleHttp\\' => 11, + ), + ); + + public static $prefixDirsPsr4 = array ( + '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 ( + 'C' => + array ( + 'Coogle' => + array ( + 0 => __DIR__ . '/../..' . '/src', + ), + ), + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit33d9ac2f289708d132212cc50c8ed709::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit33d9ac2f289708d132212cc50c8ed709::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit33d9ac2f289708d132212cc50c8ed709::$prefixesPsr0; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..26a0263 --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,241 @@ +[ + { + "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-20 10:07:11", + "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": "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-06 14:39:51", + "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": "guzzlehttp/psr7", + "version": "1.4.2", + "version_normalized": "1.4.2.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", + "shasum": "" + }, + "require": { + "php": ">=5.4.0", + "psr/http-message": "~1.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2017-03-20 17:10:46", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4-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", + "request", + "response", + "stream", + "uri", + "url" + ] + }, + { + "name": "guzzlehttp/guzzle", + "version": "6.3.0", + "version_normalized": "6.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "shasum": "" + }, + "require": { + "guzzlehttp/promises": "^1.0", + "guzzlehttp/psr7": "^1.4", + "php": ">=5.5" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0 || ^5.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "time": "2017-06-22 18:50:49", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "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" + ] + } +] diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md new file mode 100644 index 0000000..b265cbc --- /dev/null +++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md @@ -0,0 +1,1264 @@ +# CHANGELOG + +## 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/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE new file mode 100644 index 0000000..ea7f07c --- /dev/null +++ b/vendor/guzzlehttp/guzzle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011-2016 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..2f614d6 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/README.md @@ -0,0 +1,89 @@ +Guzzle, PHP HTTP client +======================= + +[![Build Status](https://travis-ci.org/guzzle/guzzle.svg?branch=master)](https://travis-ci.org/guzzle/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(); +$res = $client->request('GET', 'https://api.github.com/repos/guzzle/guzzle'); +echo $res->getStatusCode(); +// 200 +echo $res->getHeaderLine('content-type'); +// 'application/json; charset=utf8' +echo $res->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 +php composer.phar 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.phar 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 | Maintained | `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/en/latest/ +[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..65687a5 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/composer.json @@ -0,0 +1,44 @@ +{ + "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", + "guzzlehttp/psr7": "^1.4", + "guzzlehttp/promises": "^1.0" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "^4.0 || ^5.0", + "psr/log": "^1.0" + }, + "autoload": { + "files": ["src/functions_include.php"], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "autoload-dev": { + "psr-4": { + "GuzzleHttp\\Tests\\": "tests/" + } + }, + "suggest": { + "psr/log": "Required for using the Log middleware" + }, + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + } +} diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php new file mode 100644 index 0000000..de4df8a --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Client.php @@ -0,0 +1,414 @@ + '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. "handler" is a + * constructor only option that cannot be overridden in per/request + * options. 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); + } + + 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); + } + + 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 + ); + } + + public function send(RequestInterface $request, array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->sendAsync($request, $options)->wait(); + } + + 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); + } + + public function request($method, $uri = '', array $options = []) + { + $options[RequestOptions::SYNCHRONOUS] = true; + return $this->requestAsync($method, $uri, $options)->wait(); + } + + public function getConfig($option = null) + { + return $option === null + ? $this->config + : (isset($this->config[$option]) ? $this->config[$option] : null); + } + + 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); + } + + return $uri->getScheme() === '' && $uri->getHost() !== '' ? $uri->withScheme('http') : $uri; + } + + /** + * Configures the default options for a client. + * + * @param array $config + */ + private function configureDefaults(array $config) + { + $defaults = [ + 'allow_redirects' => RedirectMiddleware::$defaultSettings, + 'http_errors' => true, + 'decode_content' => true, + 'verify' => true, + 'cookies' => false + ]; + + // 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($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'] = null; + 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 RequestInterface $request + * @param array $options + * + * @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); + $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 = []; + + 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']); + $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']); + $options['_conditional']['Content-Type'] = 'application/json'; + } + + if (!empty($options['decode_content']) + && $options['decode_content'] !== true + ) { + $modify['set_headers']['Accept-Encoding'] = $options['decode_content']; + } + + if (isset($options['headers'])) { + if (isset($modify['set_headers'])) { + $modify['set_headers'] = $options['headers'] + $modify['set_headers']; + } else { + $modify['set_headers'] = $options['headers']; + } + unset($options['headers']); + } + + 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': + $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. + $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; + } + + 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..5a67b66 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php @@ -0,0 +1,84 @@ +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 null name + if($name === null) { + return null; + } + foreach($this->cookies as $cookie) { + if($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) { + return $cookie; + } + } + } + + 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 ($path, $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..2cf298a --- /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)) { + 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..e4bfafd --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php @@ -0,0 +1,71 @@ +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..c911e2a --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php @@ -0,0 +1,404 @@ + 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 include an equal sign. + if (empty($pieces) || !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 null|bool + */ + 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 null|bool + */ + 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() && 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) + { + $body = $response->getBody(); + + if (!$body->isSeekable()) { + return null; + } + + $size = $body->getSize(); + + if ($size === 0) { + return null; + } + + $summary = $body->read(120); + $body->rewind(); + + if ($size > 120) { + $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; + } + + /** + * Obfuscates URI if there is an username and a password present + * + * @param UriInterface $uri + * + * @return UriInterface + */ + private static function obfuscateUri($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..7cdd340 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Exception/ServerException.php @@ -0,0 +1,7 @@ +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); + $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), + ] + curl_getinfo($easy->handle); + $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 + ) + ); + } + + $message = sprintf( + 'cURL error %s: %s (%s)', + $ctx['errno'], + $ctx['error'], + 'see http://curl.haxx.se/libcurl/c/libcurl-errors.html' + ); + + // 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) { + $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; + } else if ('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'])) { + $sslKey = $options['ssl_key']; + if (is_array($sslKey)) { + $conf[CURLOPT_SSLKEYPASSWD] = $sslKey[1]; + $sslKey = $sslKey[0]; + } + 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..945d06e --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php @@ -0,0 +1,197 @@ +factory = isset($options['handle_factory']) + ? $options['handle_factory'] : new CurlFactory(50); + $this->selectTimeout = isset($options['select_timeout']) + ? $options['select_timeout'] : 1; + } + + public function __get($name) + { + if ($name === '_mh') { + return $this->_mh = curl_multi_init(); + } + + 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 = microtime(true); + 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] = microtime(true) + ($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 = microtime(true); + $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..d892061 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Handler/MockHandler.php @@ -0,0 +1,189 @@ +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'])) { + 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); + } + + private function invokeStats( + RequestInterface $request, + array $options, + ResponseInterface $response = null, + $reason = null + ) { + if (isset($options['on_stats'])) { + $stats = new TransferStats($request, $response, 0, $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 + ) { + $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, + microtime(true) - $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, $options); + + 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..a72e38a --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php @@ -0,0 +1,273 @@ +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 + */ + 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 $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 $findName + * @param $withName + * @param callable $middleware + * @param $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..6b090a9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php @@ -0,0 +1,182 @@ +>>>>>>>\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 + ); + } + + 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..9d79bd2 --- /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, $handler) { + $code = $response->getStatusCode(); + if ($code < 400) { + return $response; + } + throw RequestException::create($request, $response); + } + ); + }; + }; + } + + /** + * Middleware that pushes history data to an ArrayAccess container. + * + * @param array $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 = 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..8f1be33 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/Pool.php @@ -0,0 +1,123 @@ + $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); + } + + 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; + } + + 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..2eb95f9 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php @@ -0,0 +1,106 @@ +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); + } + + 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..131b771 --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php @@ -0,0 +1,237 @@ + 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|PromiseInterface $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; + } + + 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); + } + ); + } + + 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 && $request->getBody() && !$options['allow_redirects']['strict']) + ) { + $modify['method'] = 'GET'; + $modify['body'] = ''; + } + + $modify['uri'] = $this->redirectUri($request, $response, $protocols); + 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..c6aacfb --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/RequestOptions.php @@ -0,0 +1,255 @@ +decider = $decider; + $this->nextHandler = $nextHandler; + $this->delay = $delay ?: __CLASS__ . '::exponentialDelay'; + } + + /** + * Default exponential backoff delay function. + * + * @param $retries + * + * @return int + */ + public static function exponentialDelay($retries) + { + return (int) pow(2, $retries - 1); + } + + /** + * @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) + ); + } + + 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); + }; + } + + 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); + }; + } + + 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..15f717e --- /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 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..0b1623e --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/UriTemplate.php @@ -0,0 +1,241 @@ + ['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/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php new file mode 100644 index 0000000..59e212e --- /dev/null +++ b/vendor/guzzlehttp/guzzle/src/functions.php @@ -0,0 +1,331 @@ +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 array $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. + * + * @throws \RuntimeException if no viable Handler is available. + * @return callable Returns the best handler for the given system. + */ +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 \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 \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 \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 \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'` +* Fix compatibility of URIs with `file` scheme and empty host. +* Added common URI utility methods based on RFC 3986 (see documentation in the readme): + - `Uri::isDefaultPort` + - `Uri::isAbsolute` + - `Uri::isNetworkPathReference` + - `Uri::isAbsolutePathReference` + - `Uri::isRelativePathReference` + - `Uri::isSameDocumentReference` + - `Uri::composeComponents` + - `UriNormalizer::normalize` + - `UriNormalizer::isEquivalent` + - `UriResolver::relativize` +* Deprecated `Uri::resolve` in favor of `UriResolver::resolve` +* Deprecated `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments` + +## 1.3.1 - 2016-06-25 + +* Fix `Uri::__toString` for network path references, e.g. `//example.org`. +* Fix missing lowercase normalization for host. +* Fix handling of URI components in case they are `'0'` in a lot of places, + e.g. as a user info password. +* Fix `Uri::withAddedHeader` to correctly merge headers with different case. +* Fix 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. +* Fix `Uri::withAddedHeader` with an array of header values. +* Fix `Uri::resolve` when base path has no slash and handling of fragment. +* Fix 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. +* Fix `ServerRequest::withoutAttribute` when attribute value is null. + +## 1.3.0 - 2016-04-13 + +* Added remaining interfaces needed for full PSR7 compatibility + (ServerRequestInterface, UploadedFileInterface, etc.). +* Added support for stream_for from scalars. +* 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`. +* Fixed handling of gzipped responses with FNAME headers. + +## 1.2.2 - 2016-01-22 + +* Added support for URIs without any authority. +* Added support for HTTP 451 'Unavailable For Legal Reasons.' +* Added support for using '0' as a filename. +* Added support for including non-standard ports in Host headers. + +## 1.2.1 - 2015-11-02 + +* Now supporting negative offsets when seeking to SEEK_END. + +## 1.2.0 - 2015-08-15 + +* 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 + +* 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` 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..1649935 --- /dev/null +++ b/vendor/guzzlehttp/psr7/README.md @@ -0,0 +1,739 @@ +# 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::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..b1c5a90 --- /dev/null +++ b/vendor/guzzlehttp/psr7/composer.json @@ -0,0 +1,39 @@ +{ + "name": "guzzlehttp/psr7", + "type": "library", + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": ["request", "response", "message", "stream", "http", "uri", "url"], + "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" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "provide": { + "psr/http-message-implementation": "1.0" + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + }, + "files": ["src/functions_include.php"] + }, + "extra": { + "branch-alias": { + "dev-master": "1.4-dev" + } + } +} diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php new file mode 100644 index 0000000..23039fd --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/AppendStream.php @@ -0,0 +1,233 @@ +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; + + foreach ($this->streams as $stream) { + $stream->close(); + } + + $this->streams = []; + } + + /** + * Detaches each attached stream + * + * {@inheritdoc} + */ + public function detach() + { + $this->close(); + $this->detached = true; + } + + 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..cc9b445 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/FnStream.php @@ -0,0 +1,149 @@ +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); + } + } + + /** + * 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..0051d3f --- /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 = 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..3c13d4f --- /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 % 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..1e4da64 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/MessageTrait.php @@ -0,0 +1,183 @@ + 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) + { + if (!is_array($value)) { + $value = [$value]; + } + + $value = $this->trimHeaderValues($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) + { + if (!is_array($value)) { + $value = [$value]; + } + + $value = $this->trimHeaderValues($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_array($value)) { + $value = [$value]; + } + + $value = $this->trimHeaderValues($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; + } + } + } + + /** + * 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) { + return trim($value, " \t"); + }, $values); + } +} 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..0828548 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Request.php @@ -0,0 +1,142 @@ +method = strtoupper($method); + $this->uri = $uri; + $this->setHeaders($headers); + $this->protocol = $version; + + if (!$this->hasHeader('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) + { + $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) { + $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; + } +} diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php new file mode 100644 index 0000000..2830c6c --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Response.php @@ -0,0 +1,132 @@ + '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->statusCode = (int) $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 = '') + { + $new = clone $this; + $new->statusCode = (int) $code; + if ($reasonPhrase == '' && isset(self::$phrases[$new->statusCode])) { + $reasonPhrase = self::$phrases[$new->statusCode]; + } + $new->reasonPhrase = $reasonPhrase; + return $new; + } +} diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php new file mode 100644 index 0000000..575aab8 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php @@ -0,0 +1,358 @@ +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 = function_exists('getallheaders') ? getallheaders() : []; + $uri = self::getUriFromGlobals(); + $body = 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)); + } + + /** + * 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'])) { + $hostHeaderParts = explode(':', $_SERVER['HTTP_HOST']); + $uri = $uri->withHost($hostHeaderParts[0]); + if (isset($hostHeaderParts[1])) { + $hasPort = true; + $uri = $uri->withPort($hostHeaderParts[1]); + } + } 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']); + $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..e336628 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Stream.php @@ -0,0 +1,257 @@ + [ + 'r' => true, 'w+' => true, 'r+' => true, 'x+' => true, 'c+' => true, + 'rb' => true, 'w+b' => true, 'r+b' => true, 'x+b' => true, + 'c+b' => true, 'rt' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a+' => true + ], + 'write' => [ + 'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true, + 'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, + 'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true, + 'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true + ] + ]; + + /** + * This constructor accepts an associative array of options. + * + * - size: (int) If a read stream would otherwise have an indeterminate + * size, but the size is known due to foreknowledge, then you can + * provide that size, in bytes. + * - metadata: (array) Any additional metadata to return when the metadata + * of the stream is accessed. + * + * @param resource $stream Stream resource to wrap. + * @param array $options Associative array of options. + * + * @throws \InvalidArgumentException if the stream is not a stream resource + */ + public function __construct($stream, $options = []) + { + if (!is_resource($stream)) { + throw new \InvalidArgumentException('Stream must be a resource'); + } + + if (isset($options['size'])) { + $this->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 = isset(self::$readWriteHash['read'][$meta['mode']]); + $this->writable = isset(self::$readWriteHash['write'][$meta['mode']]); + $this->uri = $this->getMetadata('uri'); + } + + public function __get($name) + { + if ($name == 'stream') { + throw new \RuntimeException('The stream is detached'); + } + + throw new \BadMethodCallException('No value for ' . $name); + } + + /** + * 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() + { + $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() + { + return !$this->stream || feof($this->stream); + } + + public function tell() + { + $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) + { + if (!$this->seekable) { + throw new \RuntimeException('Stream is not seekable'); + } elseif (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 (!$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 (!$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..cf7b223 --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php @@ -0,0 +1,121 @@ +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, 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_stat() + { + static $modeMap = [ + 'r' => 33060, + 'r+' => 33206, + 'w' => 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 + ]; + } +} 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..f46c1db --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/Uri.php @@ -0,0 +1,702 @@ + 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) + { + $current = $uri->getQuery(); + if ($current === '') { + return $uri; + } + + $decodedKey = rawurldecode($key); + $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { + return rawurldecode(explode('=', $part)[0]) !== $decodedKey; + }); + + 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) + { + $current = $uri->getQuery(); + + if ($current === '') { + $result = []; + } else { + $decodedKey = rawurldecode($key); + $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) { + return rawurldecode(explode('=', $part)[0]) !== $decodedKey; + }); + } + + // 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(). + $key = strtr($key, self::$replaceQuery); + + if ($value !== null) { + $result[] = $key . '=' . strtr($value, self::$replaceQuery); + } else { + $result[] = $key; + } + + 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 = $user; + if ($password != '') { + $info .= ':' . $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']) ? $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 .= ':' . $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 $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 (1 > $port || 0xffff < $port) { + throw new \InvalidArgumentException( + sprintf('Invalid port: %d. Must be between 1 and 65535', $port) + ); + } + + return $port; + } + + 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..e40348d --- /dev/null +++ b/vendor/guzzlehttp/psr7/src/functions.php @@ -0,0 +1,828 @@ +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 $resource Entity body data + * @param array $options Additional options + * + * @return Stream + * @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() + ); + } + + 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|bool + */ +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'); + } + $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 bool|string $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 = [ + '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', + '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', + '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'); + } + + // Iterate over each line in the message, accounting for line endings + $lines = preg_split('/(\\r?\\n)/', $message, -1, PREG_SPLIT_DELIM_CAPTURE); + $result = ['start-line' => array_shift($lines), 'headers' => [], 'body' => '']; + array_shift($lines); + + for ($i = 0, $totalLines = count($lines); $i < $totalLines; $i += 2) { + $line = $lines[$i]; + // If two line breaks were encountered, then this is the end of body + if (empty($line)) { + if ($i < $totalLines - 1) { + $result['body'] = implode('', array_slice($lines, $i + 2)); + } + break; + } + if (strpos($line, ':')) { + $parts = explode(':', $line, 2); + $key = trim($parts[0]); + $value = isset($parts[1]) ? trim($parts[1]) : ''; + $result['headers'][$key][] = $value; + } + } + + return $result; +} + +/** + * 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, '/'); +} + +/** @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 @@ +=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(); +}